M.Hiroi's Home Page

Memorandum

プログラミングに関する覚え書や四方山話です。
[ Home ]
2000 年 7 月 8 月 9 月 10月 11月 12月

2000 年 12 月

12月31日

今年(20世紀)も残りわずかとなりました。今年になってようやく M.Hiroi もインターネットに接続できるようになり、目標にしていたホームページも開設することができました。M.Hiroi にとって、まさにインターネット元年といえる年でした。インターネットは「あれば便利な環境」ではなく、もはや「なければ困る環境」になっています。

ホームページを開設してから半年になりますが、おかげさまでカウンタも 7000 を突破いたしました。相互リンクしていただいているホームページ管理者の皆様、そして、なによりも M.Hiroi's Home Page に来てくださる皆様に感謝いたします。また、ゲストブックにも多くの書き込みがあり、とても嬉しく思っています。書き込みされた皆様には厚くお礼申し上げます。来年(21世紀)もよろしくお願いいたします。

きたるべき年も皆様にとってよいお年でありますように。

12月28日

ゲストブックに書きました Richard Gabriel の「Worse is Better」の話です。Gabriel はこの論文の中で、UNIX やC言語の設計思想を "Worse is bettter"、Common Lisp や scheme のそれを "The right thing" と表し、その違いを指摘しています。

Worse is better というと、「悪い設計の方がよい」のかと疑問に思われるでしょうが、そのままの意味でとらないでくださいね。Gabriel は Lisp の標準的なベンチマークプログラムを作った有名な方で、"The right thing" の立場の人間です。これと対比させるために、"Worse is better" という言葉を使っているのです。

実際、どちらの設計思想でも必要とされる項目に次の4つをあげています。

最初の「単純であること」は、「インターフェースが単純であること」と「実装が単純であること」の2つに分けることができます。2つの思想の違いは、これらの項目の優先順位にあるのです。簡単に言えば、Worse is better は実装の単純さを最優先にし、The right thing は正しいことを最優先にしているのです。結果的に、Gabriel は Worse is better の方が優れていたことを認めています。

Worse is better で設計されたソフトウェアは、実装が単純であることから、処理能力の低いマシンでも実用的に動作させることができます。逆に、The rigth thing で設計されたソフトウェアは、処理能力の高いマシンを使わないと、その性能を発揮することはできません。世の中にあるマシンは、処理能力の低いマシンの方が多いわけですから、そのようなマシンでも十分に性能を発揮するソフトウェアが使われるようになるのは、しごく当然のことといえるでしょう。UNIX やC言語がここまで普及したのも、Worse is better で設計されていたからなのです。

M.Hiroi は、この論文を きだあきら 氏の記事(Cマガジン創刊5周年記念号)で知りました。いままで読む機会がなかったのですが、 Earth さんの ホームページ の 文書 のコーナーに日本語訳がありましたので、ありがたく読ませていただきました。

近年、ハードウェアは加速度的に進歩しているので、Gabriel が論文を書いた当時とは状況が変わっているでしょう。今では、低価格のパソコンでも Common Lisp を快適に動作させることができます。実際、ハードの進歩を見越して、機能満載の重いソフトウェアがたくさんありますね。ですが、基本的な機能しか使っていないユーザーの方が多いでしょう。それならば、重いソフトウェアを無理矢理使うよりも、必要最低限の機能しかないが実用的なソフトウェアを使った方が快適ではないでしょうか。今でも Gabriel の指摘は注目に値すると思っています。

12月23日

組み合わせの話です。ゲストブックでも話題になったので、組み合わせの数を求めるプログラムを作ってみましょう。ここでは組み合わせの数 nCr を (n, r) と表記します。(n, r) を求めるには、次の公式を使えば簡単です。

(n,r) = n*(n-1)*(n-2)*...*(n-r+1) / 1*2*3*...*r

皆さんお馴染みの公式ですね。ところが、この公式を使うと乗算で桁あふれを起こす恐れがあります。このような場合、多倍長演算をサポートしているプログラミング言語、xyzzy Lisp や Ruby を使うと便利です。また、Perl にも多倍長演算のモジュールが用意されています。

C言語や SWI-Prolog のように、整数値の範囲が限られているプログラミング言語では、組み合わせの数を求めるために一工夫する必要があります。いくつか方法がありますが、次の式を使うと簡単にプログラムできます。

(n,r) = (n,r-1) * (n-r+1) / r
(n,0) = (n,n) = 1

この式は (n, r) と (n, r-1) の関係を表しています。あとは階乗と同じようにプログラムできますね。C言語でプログラムするならば、繰り返しを使えばいいでしょう。

リスト:組み合わせの数を求める

unsigned int ncr( int n, int r )
{
  unsigned int value = 1;
  int i;
  if( r == 0 || r == n ) return 1;
  for( i = 1; i <= r; i++ ){
    value = (value * (n - i + 1)) / i;
  }
  return value;
}

このプログラムはエラーチェックを行っていないので、n と r には正しい値を入れるよう注意してください。Prolog ならば、再帰定義を使えば簡単です。

リスト:組み合わせの数を求める

ncr( N, R, 1 ) :- (N =:= R; R =:= 0).
ncr( N, R, V ) :-
     R > 0, R1 is R - 1, ncr( N, R1, V1 ), V is (V1 * (N - R + 1)) / R.

とても簡単ですね。興味のある方は末尾再帰に変換してみてください。

もちろん、これらのプログラムでも桁あふれする場合があります。どこまで計算できるか試してみましょう。プログラムはC言語を使いました。

(16,8)  = 12870
(18,9)  = 48620
(20,10) = 184756
(22,11) = 705432
(24,12) = 2704156
(26,13) = 10400600
(28,14) = 40116600
(30,15) = 155117520
(32,16) = 29401361 <== 桁あふれ

単純なプログラムですが、けっこう大きな値まで計算できますね。このプログラムを実際に使う場合は、桁あふれに十分注意してください。

12月18日

鎌田さんのホームページ STUDIO KAMADA にフラクタルのページが開設されました。まだトップページから繋がっていませんが、12月18日の日記 から入ることができます。近日中にトップページのほうを更新するそうです。日記で紹介されていた、マンデルブロ集合とジュリア集合の画像のギャラリーと、そのとき作ったプログラムが公開されています。特に、公開されたプログラムはとても良く書かれているので、プログラミングを勉強している方はぜひ読んでみてください。参考になるはずです。

12月15日

xyzzy が窓の杜大賞の候補にノミネートされました。窓の杜 で投票を受け付けています。大賞にノミネートされたソフトは50あり、その中から4つ選びます。Netscape 6 や RealPlayer 8 など、メジャーなソフトもノミネートされています。投票するならば他のソフトだろうと一覧表をみたのですが、使ったことがないソフトがほとんどで、どれに投票したらよいのかわかりません。これならば xyzzy に4票入れたいところです(笑)。

12月13日

Oh!X の発売日が告知されました。WebX によると、 「Oh!X2001春号」の発売に関する詳細が確定しました。発売日は2001年1月31日,定価2800円(税込み)です。いましばらくお待ちください。 とのことです。とても楽しみですね。

昨日より、満開製作所にユーザーが自分のホームページを登録できるX68000関連リンク集が設置されました。さっそく M.Hiroi's Home Page を「読み物」というカテゴリに登録しました。このリンク集は、URL のクリック回数を蓄積してランキングを表示します。今のところ、登録されているホームページは6件で、M.Hiroi's Home Page は最下位です。ほかのホームページが凄すぎるので、これは予想通りの結果といえるでしょう(笑)。

M.Hiroi's Home Page も開設してから5ヶ月が過ぎ、おかげさまでカウンタも 6000 を突破しました。相互リンクしていただいているホームページ管理者の皆様、そして、なによりもM.Hiroi's Home Page に来てくださる皆様に感謝いたします。これからもがんばりますので、よろしくお願いいたします。

12月08日

本日 M.Hiroi's Home Page が、ライコスジャパン のディレクトリサービスに登録されました。カテゴリは 「コンピュータ・インターネット > プログラミング > C・C++」 です。ディレクトリ型の検索サイトに登録されたのは、これが初めてです。ライコスのロボット型検索サービスには、URL登録をしたことがあります。ところが、ディレクトリサービスへの登録は申請していなかったので、登録のメールが届いた時は本当に驚きました。ライコスジャパンに大感謝です。

実は以前に、ディレクトリ型サービスの老舗であるヤフーに、X68000 Programming と Tcl/Tk GUI Programming の登録を申請したことがあります。結果はおわかりのように、どちらも登録されませんでした。捨てる神あれば拾う神あり、といったところでしょうか(笑)。

12月06日

『自転車創業』から発売予定の Windows 用新作ゲーム『空の浮動産』ですが、発売日が 2001 年 1 月に延期されました。楽しみに待ちましょう。

検索サイトの話です。最近、Vivisimo Search という検索サイトがあることを知りました。Vivisimo Search の面白いところは、検索結果を関連キーワードごとにフォルダ分けしてくれることです。たとえば、M.Hiroi's Home Page を検索すると、つぎのようなフォルダに分類されました。

contains characters
world
geocities, programming
japanese
anime, sakura
・・・省略・・・

contains characters には M.Hiroi's Home Page を含んでいるページ、たとえば、相互リンクしていただいているホームページがまとめられています。M.Hiroi's Home Page 自身は geocities, programming に入っています。world, japanese, anime, sakura には何の関連性があるのか、よくわかりません(笑)。

Vivisimo Search はまだベータバージョンで、日本語も文字化します。今後のバージョンアップに期待したいと思います。また、トップページでキーワードを入力しても検索できないので、ご注意くださいませ。click here からベータバージョンに移って検索してください。

日本の検索サイトでは、kensaku.org がなかなか頑張っていると思います。

「世界最強の日本語検索エンジン kensaku.org は、無責任、無保証、無料で提供されています。」

ホームページには上記のように書かれていますが、WWW ロボットを用いた日本語ホームページの情報収集は、目をみはるものがあります。たとえば、M.Hiroi's Home Page の検索結果を 100 件表示すると、トップページだけではなく、個々のページまでもが表示されるのには驚きました。検索速度はそれほど遅くありません。日本語サイトに限定しているところが、ユニークなサービスだと思いました。


2000 年 11 月

11月15日

本日、おかげさまでカウンタが 5000 を突破しました。相互リンクしていただいているホームページ管理者の皆様、そして、なによりも M.Hiroi's Home Page に来てくださる皆様にお礼申し上げます。

このホームページには5つのメインコンテンツがあります。それぞれのトップページにフリーのカウンタをつけていますが、ここ2週間の平均アクセス数は次のようになりました。

X68kTcl/TkxyzzyPuzzleProlog
12 / day10 / day22 / day5 / day10 / day

xyzzy Lisp のアクセス数が多いですね。xyzzy はとても使いやすいエディタです。そして、そこに搭載されている xyzzy Lisp は優秀な処理系なので、興味を持っている方が多いのでしょう。Lisp は M.Hiroi が一番好きなプログラミング言語です。実際に xyzzy Lisp を使ってみると、エディタに搭載されている処理系とは思えないくらい機能が充実しています。Lisp 処理系を独立させて、Tk などの GUI ツールと組み合わせると面白いのではないか、と思ったりもします。拙作の読み物が xyzzy Lisp でプログラミングする時に少しでもお役に立てば嬉しいです。

Puzzle のアクセスは、思っていたよりも少なかったです。パズルはコンピュータに解かせるよりも、やっぱり自分で解く方が面白いのでしょうね。M.Hiroi はコンピュータに解かせるのも面白いと思っているので、これからも続けていくつもりです。まあ、パズルの種類はまだまだ少ないですし、もっと複雑なパズルにも挑戦しようと思っています。

逆に、予想よりもアクセスが多かったのが Prolog です。始める時は、いまさら Prolog なんて見向きもされないのではないか、と思っていただけに嬉しい誤算となりました。これも、フリーで利用できる SWI-Prolog のおかげですね。プログラムの動作を確認をする時に、Windows 上で手軽に実行できる SWI-Prolog はとても重宝しています。

Tcl/Tk は最近更新していないので申し訳なく思っています。それでも平均 10 件のアクセスがあり、ご来訪の皆様には大感謝です。GUI ツールである Tk を使った処理系は、Perl/Tk, Python/Tk, Ruby/Tk, STk などいろいろありますが、お手軽さからいえば Tcl/Tk が一番でしょう。Perl/Tk も面白いのですが、リファレンスとオブジェクト指向を理解していないと、使いこなすのはちょっと難しいようです。Tcl に限らず Tk 関連で何かアップできればいいな、と思っています。

X68000 のアクセスが多いのは TAU さんの「三角リバーシ」のおかげでしょう。M.Hiroi も思考ルーチンを作らなねば(笑)。X68000 内のC言語、Lisp、Perl のプログラミング講座は、このホームページの柱のようなもので、ほかのコンテンツからもリンクを張ったりしています。各講座は X68000 に依存している部分がありますが、アルゴリズムは機種に依存しないので、参考になることも多いと思います。プログラミングに興味のある方は、ぜひ読んでみてください。

これからもがんばりますので、よろしくお願いいたします。ご意見やご感想、ご要望などありましたら、お気軽にゲストブックへ書き込んでください。もちろんメールも大歓迎ですよ(笑)。

11月13日

白黒n個ずつの蛙跳びゲームの話です。蛙飛びゲームを検索したところ、西山寿延氏のホームページ the Mathematical Graffiti(ラクガキ数学) の カエル跳び(石の入れかえ)ゲームの考え方 に、白黒n個ずつの具体的な移動手順が示されていました。そして、その手順から移動回数を求めています。もちろん答えは 2+2n になりますが、「こういった手順でやれば、これだけの回数かかる」ことが具体的に示されていて、とてもわかりやすいと思いました。M.Hiroi のように、すぐにギブアップしてはダメですね(反省)。

このほかに、蛙跳びゲームの検索で面白いホームページを見つけたので紹介します。

未菜実の数理パズル入門
未菜実氏のホームページです。たくさんの数理パズルがあります。蛙跳びゲームは、「碁石の引越し」という名前で掲載されています。白石黒石が同数ではなく、m個n個の場合を扱っているのが面白いです。この場合の移動回数はm * n + m + n 回となることが証明されているそうです。
数学の部屋
青木芳文氏のホームページです。数学の問題やパズルがたくさんあります。とにかく、数学に関する話題が満載で面白いホームページです。西山氏のホームページは、ここの「カエル跳びゲーム」で見つけました。

西山氏、青木氏は中学校の先生(数学)です。お二人とも LOGO (ロゴ)に関するページがあり、選択数学の授業で活用されているようです。LOGO はタートルグラフィックで有名なプログラミング言語です。なるほど LOGO ならば親しみやすいし、「再帰」という概念も理解しやすいだろうなあ、と思いました。

11月9日

ここ数日の間、どうも GeoCities のカウンタやゲストブックの調子がよくありません。ゲストブックにアクセスすると、テレホタイムでもないのに File Not Found と表示される場合が何回もありました。この表示を見て驚かれた方もいると思いますが、削除したわけではないのでご安心を(苦笑)。CGI を処理するサーバーの調子が悪いのでしょうか。今日は大丈夫のようですが、ちょっと不安です。

11月2日

Oh!X 発売予定日が変更されました。WebX によると、 諸々の都合により「Oh!X 2000冬号」は「Oh!X2001春号」として発売されることになりました。発売日は2001年1月末日です。 とのことです。発売が遅れるのは残念ですが、楽しみに待ちたいと思います。

蛙跳びゲームの話です。皆さん、自力で解くことができましたか。黒白3個ずつの場合、自力で解こうとすると、けっこう難しいと思います。そこで、ヒントとして黒白2個ずつの手順を示しましょう。

8回で解くことができます。黒白3個ずつの場合は、当然これよりも回数は多くなります。

Let's Try, Enjoy Puzzle !!


2000 年 10 月

10月30日

卓さんのホームページ Taku's "X" Page "PENGUIN'S BAR" と相互リンクが実現しました。大感謝です。

10月24日

Prolog Programming をスタートしました。実をいうと、「いまさら Prolog なんて」と思われる方がほとんどではないか、と予想していました。ところが、ゲストブックで deepgreen さんと M.Kamada さんから感想をいただき、さい先の良いスタートとなりました。がんばりますので、よろしくです。

deepgreen さんが気にしていた Prolog の実行速度ですが、Lisp のベンチマークで用いられるたらいまわし関数を使って、Perl, xyzzy Lisp, SWI-Prolog で速度を比較してみました。たらいまわし関数をC言語でプログラムすると、次のようになります。

リスト:たらいまわし関数(C)

int tak( int x, int y, int z )
{
  if( x <= y ) return z;
  return tak( tak( x - 1, y, z ),
              tak( y - 1, z, x ),
              tak( z - 1, x, y ) );
}

関数 tak が計算する値に意味はありません。この関数は再帰的に定義されているので、引数の与え方によっては実行時間がかかるため、Lisp などのベンチマークに利用されています。

次は Perl のプログラムです。

リスト:たらいまわし関数(Perl)

sub tak {
  my ($x, $y, $z) = @_;
  return $z if $x <= $y;
  &tak( &tak( $x - 1, $y, $z ),
        &tak( $y - 1, $z, $x ),
        &tak( $z - 1, $x, $y ) );
}

C言語とほとんど同じですね。次は xyzzy Lisp のプログラムです。

リスト:たらいまわし関数(Lisp)

(defun tak (x y z)
  (if (<= x y)
      z
    (tak (tak (1- x) y z)
	 (tak (1- y) z x)
	 (tak (1- z) x y))))

これも特に難しいところはないでしょう。最後に Prolog のプログラムです。

リスト:たらいまわし関数(Prolog)

tak( X, Y, Z, A ) :-  X =< Y, A = Z, !.
tak( X, Y, Z, A ) :-  X1 is X - 1, tak( X1, Y, Z, A1),
                      Y1 is Y - 1, tak( Y1, Z, X, A2),
                      Z1 is Z - 1, tak( Z1, X, Y, A3),
                      tak( A1, A2, A3, A ).

3つのプログラムと比べると、かなり雰囲気が違いますね。このプログラムは、M.Hiroi がリハビリを兼ねてプログラミングしましたが、もっときれいにプログラムできるかもしれません。お気づきの点がありましたらご指摘ください。

ところで、X, Y, Z のほかに A があるのはなぜか? と疑問に思われた方もいるでしょう。ここで説明すると大変なので、今後の Prolog プログラミング入門の中で説明する予定です。

それでは実行結果を示しましょう。tak( 20, 10, 5 ) を計算しました。Perl のバージョンは 5.6 です。xyzzy Lisp のプログラムは、当然ですがバイトコンパイルしました。

PerlLispProlog
2.6[s]2.1[s]1.3[s]0.015[s]

いやー、SWI-Prolog が Perl の2倍の速度とは驚きました。SWI-Prolog はプログラムを中間コード (WAM と呼ばれる Prolog に適したコード) にコンパイルしてから実行します。このため、実行速度はそれほど遅くないだろうと思っていたのですが、ここまで速いとは予想していませんでした。といっても、C言語とは桁が違うので、ペグ・ソリテアのようなパズルを解くには、M.Hiroi のオンボロマシン(Pentium 166MHz)では苦しいでしょうね。

10月22日

Prolog(プロログ:Programming in Logic)というプログラミング言語をご存知でしょうか。1971 年にマルセイユ大学(フランス)の Alain Colmeraur によって開発された、論理学をベースにした論理型のプログラミング言語です。日本で行われた第五世代コンピュータプロジェクトで、中核となるプログラミング言語として採用されたため Prolog は一躍有名になりましたが、最近では鎮静化してしまったようです。

もう5年ほど前の話になりますが、M.Hiroi も Lisp の次は Prolog だろう、と興味を持っていました。この時、拙作の Lisp インタプリタ VTOL で、Prolog インタプリタもどきを作成したことがあります。まあ、このプログラムはお蔵入りになってしまいましたが、その基本的な処理は拙作の Lisp 入門講座番外編「エキスパートシステムの作成」として、激光・電脳倶楽部やこのホームページで公開することができました。番外編では「これを土台に Prolog インタプリタも作ることができるでしょう」と書いてありますが、実際は「Prolog インタプリタもどき」が先にあったわけです。

この Prolog もどきを作成した時に、勉強をかねて簡単な Prolog 入門講座を書きました。VTOL 上で動作する Prolog もどきは、いまさら公開しようとは思いませんが、入門講座の方はせっかく書いたのですから、このままハードディスクの肥やしにするのは、ちょっともったいないなと思うようになりました。

ドキュメントを公開するならば、実際にプログラムを実行して動作を確認できる処理系が必要になります。そこで、Windows 上で動作しフリーで利用できる Prolog 処理系がないか検索してみたところ、Windows 用のバイナリを配布しているサイトがいくつかありました。

その中で、GNU GPL ライセンスで配布されている SWI-Prolog を使ってみることにしました。Windows 用のバイナリ (約 1 M byte) をダウンロードし、ダブルクリックすればインストーラーが起動して、簡単にセットアップすることができます。簡単なプログラムを実行してみましたが、なかなか良さそうな処理系だと思いました。

ドキュメントのプログラムは、拙作の Prolog もどきで記述されているので、それを SWI-Prolog に書き換え、ドキュメントも HTML にして、少しずつアップしていきたいと思っています。まあ、いまさら Prolog なんて、と思われる方も多いでしょう。ですが、Prolog は面白い特徴を持ったプログラミング言語です。事実と規則を定義していく、つまり、物事の関係を記述していくプログラミングスタイルは、他の言語にはない独自なものです。Windows でも気軽に Prolog を使うことができるのですから、ぜひ Prolog でプログラミングを楽しんでみてください。

10月19日

C MAGAZINE 今月号 (11月号:10月18日発売) の特集「悩めるプログラムに効くアルゴリズム」は、コンピュータ&パズル の高橋謙一郎さんが執筆さています。パズルを題材に、深さ優先探索、幅優先探索、反復深化、ハッシュ法といった基本的なアルゴリズムや、枝刈りやテーブルの利用によるプログラムの高速化、連立方程式によるライツアウトの解法、15パズルを反復深化で解く実験など、アルゴリズムの基本から高度な応用まで、わかりやすく解説されています。特に、反復深化と下限値枝刈り法の組み合わせは驚くほどの効果があり、とても勉強になりました。パズルだけでなく、アルゴリズムに興味をお持ちの方は一読することをおススメします。

10月17日

ゲストブックにも書きましたが、メールソフトを Outlook Express から 電信八号 + xyzzy den8-viewer へ切り替えました。そこで、今まで受信したメールを電信八号形式へ変換するツールはないか検索したところ、野元真一氏が開発された メール分割移動 MailExp というツールを見つけました。MailExp は複数のメールソフトに対応していますが、Outlook Express 5 のメールには対応していません。そのかわり、Outlook Express 5 のメールデータを UNIX 標準 mbox 形式に変換するツールが紹介されています。井上俊博氏が開発された Outlook Express 5 Mail Converter OE5Conv がそうです。OE5Conv を使って Outlook Express 5 のメールデータを mbox 形式に変換すれば、あとは MailExp を使ってメールデータを目的のメールソフトへ移行することができます。M.Hiroi のメールデータも無事に電信八号へ移すことができました。有用なツールを開発された野元氏と井上氏に感謝いたします。

10月14日

Oh!X 発売予定日が WebX で次のように告知されました。 次のOh!Xは「Oh!X 2000冬号」で11月17日近辺の発売を予定しています(発売日は変更される可能性もあります)。

とても楽しみです。また、WebX は Vwalker.com のトップページからリンクされました。つまり、正式な Oh!X Web ページとして公開されたことになります。おめでとうございます!(U)さん、これからもがんばってください。

10月11日

ホームページ開設から3ヶ月すぎました。開設した当初は、1日あたり 数 hit 程度のアクセスしかなかったのですが、相互リンクしていただいたホームページ管理者の皆様、そして、このホームページに来てくださる皆様のおかげで、最近では1日あたりのアクセス数が平均すると 40 前後、1月あたりのアクセスが 1000 hit を超えるようになりました。お世話になった皆様にお礼申し上げます。これからもよろしくお願いします。

10月8日

再度、五芒星の問題です。deepgreen さんがゲストブック (No.61) で、次の関係が成立することを示されました。

m = 2(2n+1)
m:直線の和    n:直線の本数(n芒星)

この関係から、直線の和が全て等しくなる場合、その値は一通りしかないことがわかります。deepgreen さん、ありがとうございました。

10月6日

五芒星の問題です。直線上に並んだ4つの数字の和が、4本の直線で等しくなる配置を求めたところ、168 通りの解を見つけました。M.Kamada さんに検証していただいたところ、168 通りで正しいことが確認されました。また、六芒星では6本の直線全部が 26 になる配置が存在しますが、26 以外では解が存在しないことを M.Kamada さんが確認されました。M.Kamada さん、ありがとうございました。

10月1日

GeoCities がようやく復旧しました。9月30日の午後から止まっていたので、復旧に丸1日以上かかったことになります。最近、GeoCities は週末によくトラブルが発生し、たいていの場合、復旧は週明けになります。今回もそうだろうと思っていましたが、週明け前ぎりぎりで復旧しました。無料サービスとはいえ、トラブルが発生したらもっと迅速に対応してほしいものです。今回の件で、ミラーサイトを作ろうか、と真剣に考えました。

パズルの話です。M.Kamada さんが STUDIO KAMADA の日記(9 月 26 日) で出題された「五芒星のパズル」に、思いっきりハマってしまいました(笑)。けっきょく、M.Hiroi は解けずにギブアップしましたが、とても面白いパズルでした。正解はすでに STUDIO KAMADA で発表されていますが、興味のある方は答えを見ないで考えてみましょう。

五芒星には、数字を配置するパズルがあります。五芒星には頂点と交点が10ヵ所ありますが、ここに 1 から 10 までの数字を配置します。すると、直線上に4つの数字が並びますが、その和が n 本の直線で等しくなるような配置を求める、というものです。3本の直線で等しくなる配置は、ある本で見かけたことがあります。5本の直線全部が等しくなる配置は、M.Kamada さんが調べたところ解はないようです。

ところが、六芒星になると解が存在します。

六芒星の場合は、「マジックスター」という名前でパズル雑誌に登場することがあります。図に示したように、12個ある○に 1 から 12 までの数字を一つずつ入れていき、直線上に並んだ4個の数字の合計が、どの直線も 26 になるような配置を求めるのが目的です。パズル雑誌で出題される場合、ヒントとなる数字がいくつか表示されていて、空いている場所の数字を考えます。

M.Hiroi はパソコンで全ての配置を求めたことがあるのですが、回転解や鏡像解を除いて80通りの解を見つけました。もっと少ないと思っていたので、意外な結果でした。


2000 年 9 月

9月29日

Oh!X 関連の正式ページ Web X が公開されました。『次のOh!Xは「Oh!X 2000秋号」で価格,発売日未定』 とのことです。また、GeoCities にある 謎のページ出張版 のゲストブックは、Web X の掲示板へ移動するそうです。

Link に Oh!X 関連のページを追加しました。

9月25日

検索エンジンの話です。ゲストブックでみかぜさんが指摘されましたように、ロボット型の検索エンジンを使っているサイトでは、URL の登録申請を行わなくても、基本的にHPは登録されるはずです。この原則からいえば、昨日「自分でホームページの URL を申請して、それから登録されるのがふつうです。」と書いたことは、ロボット型の検索サイトには当てはまりません。Google の検索エンジンはロボット型なので、URL を申請をしなくても M.Hiroi's Home Page が登録されたことは、基本的には当然なことなのです。M.Hiroi も、ロボット型検索エンジンはそういうものだと思っていました。

ところが M.Hiroi's Home Page を開設した当初、ロボット型の検索サイトになかなか登録されなかったのです。最初は、開設したばかりのHPだから登録されるまで時間がかかるのだろう、と思っていました。ところが、開設してから一ヶ月近くたっても登録されないので、しびれを切らしていくつかの検索サイトに URL の登録申請を行いました。その結果、いくつかの検索サイトで M.Hiroi's Home Page がヒットするようになりましたが、いまだに登録されないサイトもあります(苦笑)。

もともと URL の登録申請は、ロボットの収集忘れを回避するために用意されているようです。申請された URL の扱い方はサイトによって異なりますが、その URL へ優先的にロボットを巡回させるところが多いようです。ですが M.Hiroi の経験上、URL の登録申請をしないとロボットは巡回してこない、としか思えないのです。実際、登録申請していないロボット型の検索サイトで、M.Hiroi's Home Page がヒットするのは Google しか知りません。

このような経験から、「ふつう、ホームページを開設しただけでは、これらの検索サイトに登録されることは、ほとんどありません。」と書いたのです。しかし、これはあくまで自分の経験上のことですから、そのことを明確に書いておくべきでした。不適切な表現をお詫びするとともに、「ロボット型の検索サイトでは、基本的に URL を申請しなくてもHPは登録される。」と訂正いたします。ただし、M.Hiroi の経験では、URL の登録は申請しておいた方がよいでしょう。

現在のように、インターネットの普及率が高くなり、多数のHPが次々と開設されていく状態では、ロボットを巡回させるだけでも大変なことだと思われます。その結果、URL を申請しないと検索サイトには確実に登録されない、という事態が起きているのかもしれません。また、膨大なデータを収集するわけですから、その中から必要な情報を検索する技術もきわめて重要です。このよう状況にもかかわらず、適切な情報を表示する Google の検索エンジンは、とても優秀だと改めて思いました。

ところで、検索サイトに関しては hakuzou 氏のホームページ 「ホームページ作成をワープロ感覚で」 に面白い解説記事がいくつかあります。その中の「ロボット型検索エンジンを個別評価した衝撃」で、氏は使い勝手の良さ第1位に Google をあげています。ちなみに、M.Hiroi は Google でこのページを見つけました(笑)。ほかのロボット型検索サイト、特に老舗といわれているサイトには、もっとがんばってもらいたいと思います。

9月24日

インターネットには多数の検索サイトがあります。ふつう、ホームページを開設しただけでは、これらの検索サイトに登録されることは、ほとんどありません。自分でホームページの URL を申請して、それから登録されるのがふつうです。実際に登録される時期は、検索サイトによってまちまちで、2,3日で登録されるサイトもあれば、一ヶ月以上たっても登録されないサイトもあります(苦笑)。

M.Hiroi's Home Page の場合、いくつかの検索サイトでヒットしますが、URL を申請していない検索サイトでヒットするところがありました。Google というサイトがそうです。Google は、米国カリフォルニア州マウンテンビューにあるウェブ上サーチエンジン開発会社です。今月になって日本語版のサービスが開始されました。ここのサーチエンジンはとても優秀で、話題になっているようです。

ちなみに、X68000 Programming や xyzzy Lisp で検索すると、M.Hiroi's Home Page もヒットします。また、M.Hiroi がいつもお世話になっている STUDIO KAMADA も当然ヒットします。M.Kamada さん、ここの検索サイトはクールですよ!

9月18日

パズル「ライツアウト」には、3カラーライツアウトというカラー版があります。ボタンを押すと、赤、緑、消灯、と変化します。ライツアウトの解法は、2 の 5 乗 = 32 通り調べるだけでしたが、3カラーライツアウトでも 3 の 5 乗 = 243 通り調べるだけなので、簡単に解くことができます。また、高橋さんの コンピュータ&パズル では、連立方程式での解法が説明されています。

それでは、最長手数を求めることはできるでしょうか。3カラーライツアウトの場合、ボタンを押すパターンは全部で 3 の 25 乗通りもあります。高橋さんの解析結果によると、解が存在するパターンは 3 の 22 乗通りになるそうですが、それでも 31,381,059,609 という大きな数字になってしまいます。これでは単純な幅優先探索で最長手数を求めることはできません。

この難問に答えを出した方が deepgreen さんです。解法は、コンピュータ&パズル の掲示板で公開されています。この解法にはまいりました。deepgreen さんの頭の中がどうなっているか、見てみたいものです(笑)。

9月17日

xyzzy Lisp で某メジャーモードを作れないか、という話がありまして、キーワードに色をつける程度ならできるだろう、とプログラミングしているのですが、悪戦苦闘しています。まだ未完成ですが、なんとかキーワードに色をつけることができるようになったので、某メジャーモードとは切り離して、xyzzy Lisp Programming の 「キーワードファイルとシンタックステーブル」 にまとめました。

xyzzy や Eamcs/Mule では、編集するテキストファイルの種類によって、エディタの操作をカスタマイズすることができます。これをメジャーモードといいます。たとえば、C言語のソースファイルを編集する時は、c-mode というメジャーモードを使い、Perl の時には perl-mode を使います。そして、これらのメジャーモードは、xyzzy でも Emacs でも Lisp でプログラミングされています。

xyzzy の場合、有名なメジャーモードはほとんど実装されています。ふつう、新しくメジャーモードを作成することは、ほとんどありませんが、無ければ自分で作るしかありません。実は、今回作成しようとしているのは、Z-MUSIC のソースファイルを記述するための Zmusic モードなのです。

Z-MUSIC は X68000 用の音源ドライバです。X68000 に内蔵されている FM 音源、ADPCM 音源の制御のほかに、外部の MIDI 音源も制御することができる優れものです。Z-MUSIC の特徴は、MML (Music Macro Language) 言語を使って音楽を記述することです。このファイルを ZMS ファイルといいます。Z-MUSIC では、ZMS ファイルをコンパイルして ZMD ファイルを作成し、それを音源ドライバに渡すことで、音楽が演奏される仕組みになっています。

もし、MML を Windows で演奏できる形式に変換できれば、Windows 上でも MML を使って音楽データを作成することができるわけです。実際、Windows で動作する Z-MUSIC 互換のコンパイラと、ZMD ファイルからスタンダード MIDI ファイルへのコンバータが開発されています。そこで、xyzzy で Zmusic モードを作ってみようか、ということになったのです。

まあ、キーワードに色をつけるだけではなく、データの変換作業も xyzzy で実行できた方がいいでしょう。というよりも、こちらが本来の目的ですね。とりあえず、キーワードに色をつける処理だけでも、完成させようと思っています。

9月11日

我人(GAJIN) さんのホームページ Welcome to HEXCITE.COM と相互リンクが実現しました。大感謝です。

9月6日

みかぜさんのホームページ 『自転車創業』 と相互リンクが実現しました。大感謝です。

9月5日

高橋謙一郎さんのホームページ コンピュータ&パズル と、deepgreen さんのホームページ Computer Puzzle Solution と相互リンクが実現しました。大感謝です。

昨日、ライツアウトの最長手数を求めるプログラムを公開しましたが、deepgreen さんが論理的に最長手数とその総数を求める方法を発表されました。コンピュータ&パズル の掲示板で公開されています。M.Hiroi は、最長手数は力任せで探索するしか方法はないだろう、と思い込んでいたので、deepgreen さんの方法には目からウロコが落ちました。deepgreen さん、凄すぎます!!

9月1日

Memorandum のファイルサイズが大きくなったので分離しました。また、Guest Book も分離しました。 Geocities には掲示板、ゲストブック、ゲストブック2など、いろいろなサービスが提供されていますが、M.Hiroi が利用しているゲストブックの場合、書き込みは最大50件までしか保存されません。それ以上の書き込みがあると、古い書き込みから順番に削除されます。今までの書き込みを保存するという意味でも、早めに分離することにしました。

ただいま、パズル「ライツアウト」解法プログラムのアップロードを準備しています。月刊・電脳倶楽部 Vol.95(1996年4月号)では、あっと驚く解法プログラムが発表されました。ところが世の中は広いもので、高橋謙一郎さんのホームページ コンピュータ&パズル では、ライツアウトを連立方程式で解く方法が紹介されています。この方法は細江万太郎さんという方が考えられたそうです。いやー、これには本当に驚きました。このほかにも、ライツアウトに関する詳細な考察があり、とても参考になりました。


2000 年 8 月

8月31日

休刊したはずの月刊・電脳倶楽部ですが、このたび 148 号が緊急発売されました。X680x0 だけではなく、WonderWitch、Java、CGI など幅広い内容で楽しむことができました。もちろん、X680x0 関連のコンテンツも充実しています。Disk 3枚分の大容量には驚きました(笑)。

特に WonderWitch は、携帯ゲーム機「ワンダースワン」で動作するプログラムをパソコン上で開発できるキット、として最近注目を集めています。開発環境を低価格で一般ユーザーに提供することは、とても素晴らしいことです。ホビープログラマにとって、まさに夢のような開発環境なのですが、ひとつだけ弱点があります。それはワンダースワンの CPU が 80186 とバイナリ互換である、という点です。

なぜかというと、8086 系の CPU には悪名高いセグメントがあるからです。8086 系 CPU の場合、1 M byte のメモリにアクセスすることができますが、CPU 内部のレジスタは 16 bit です。これでは 64 k byte のメモリしかアクセスできないため、8086 系の CPU ではセグメントレジスタを用いて 1 M byte のメモリにアクセスします。

セグメントレジスタは、他のレジスタと組み合わせてアドレスを指定します。セグメントレジスタも 16 bit です。では、どうやって物理アドレスを求めるかというと、セグメントレジスタを 4 bit 左シフトして他のレジスタと足し算するわけです。図に示すと次のようになります。

 セグメント    1000    <- 4 bit シフト
 他のレジスタ    8ABC
--------------------------
 物理アドレス  18ABC

このような場合、セグメントレジスタの値を固定すると、64 k byte のメモリしかアクセスすることができません。ようするに、64 k byte より大きなメモリ空間をアクセスする時は、セグメントレジスタの値を書き換える必要があるのです。

このおかげで、8086 系 CPU で大きなデータを操作するプログラムを組む時は、めちゃくちゃ苦労します。また、セグメントレジスタの操作を間違えると、いとも簡単に暴走してくれます。アセンブラでは大変だ、ということでC言語が使われるようになりましたが、この 64 k byte の制約により、far などのような余分なキーワードを指定しないといけません。C言語を使うにしても面倒なことがあるのです。

プログラムやデータのサイズを 64 k byte に収めることができれば、快適にプログラミングできます。これをスモールモデルといいます。WonderWitch では、このスモールモデルが標準になっているようです。ですが、64 k byte で収まるゲームで満足できなくなると、セグメントの壁を越えなければいけません。すると、プログラミングは急激に難しくなるのです。これが WonderWitch の弱点です。

M.Hiroi は 8086 アセンブリプログラムで苦労した経験があるので、セグメントの辛さはよくわかります。このため、話がマイナスの方向にいってしまいましたが、それでも WonderWitch は注目に値する開発環境であることは間違いありません。やっぱり、携帯ゲーム機用のゲームを自分で作る、というのは面白いことですからね。また、ワンダースワンのカラー版が発表されたことで、ますます WonderWitch に注目が集まると思います。ユーザーからどんなゲームが発表されるか、とても楽しみですね。

8月27日

最近、Java 版のパズルゲーム PushBon! をちょこちょこっと遊んでいます。PushBon! は S-OS 用(8 bit マシン用のOS)に発表されたのが最初で、旧 Oh!X 1994 年 5 月号で X68000 への移植版が発表されました。Java 版 PushBon! は forGamer.net でプレイすることができます。

PushBon! はキャラクターを操作してスターブロックを縦か横に3つ揃えるとステージクリアとなります。スターブロックのほかに、ノーマル、固定、Lマーク、Rマークのブロックがあります。キャラクターがブロックをプッシュすると、障害物にぶつかるまでブロックが移動します。この時、LマークとRマークにぶつかると、ぶつけた方向に対してLマークならば左へ、Rマークならば右へ、ブロックの進む方向が変わります。このLマークとRマークのブロックの存在が、PushBon! を面白いパズルゲームにしています。特に、L、Rマークブロックが複数あると、LマークにぶつけたブロックがRマークにぶつかって方向が変わる、といった連鎖を起こすことができます。これがとても面白いのです。

Oh!X で発表された時は、全部で 50 面のステージがあったのですが、この中で 36 面がめちゃくちゃ難しいのです。Oh!X 1994 年 7 月号の「ごめんなさいのコーナー」に「36 面が解くことができませんでした。」と掲載されたほどです。ところが、8 月号では数人の読者の方から解けたという報告がありました。この中の1人が鎌田さんです。

鎌田さんは 36 面で詰まってしまったので、解法プログラムを作ったそうです。解法プログラムは Oh!X 1994 年 9 月号に掲載されています。ただし、鎌田さんの話では『マシンが速くても、あのプログラムでは36面は解けないと思います。』とのこと、実際に 36 面を解いたのは別のプログラムだそうです。解法プログラムは STUDIO KAMADA で近日公開予定とのことです。楽しみですね。

8月23日

Web ページの更新をチェックする WWWC の話です。ブラウザと Web サーバーは、HTTP というプロトコルでデータの転送を行っています。ブラウザは取得したいホームページを Web サーバへリクエストし、Web サーバーはリクエストを解釈して、ホームページのデータをブラウザへ返します。この時、Web サーバーはホームページのデータ以外にも、データを送った日時、サーバー名、データの種類など、いろいろな情報を送ってきます。この中に、ファイルの最終更新日時やサイズが含まれている場合があります。WWWC は、基本的にはこの情報を使って Web ページの更新をチェックしています。

HTTP プロトコルでは、ホームページのデータを受け取るコマンド (GET) のほかに、Web サーバーからの情報だけを受け取るコマンド (HEAD) が用意されています。コマンド HEAD を使えば、ホームページのデータを送らずに済む分だけ、Web サーバーの負担は軽くなります。また、WWWC でも受け取るデータが少ないので、更新のチェックを高速に行うことができます。これが WWWC の仕組みです。

ところが、Web サーバーから送られてくるデータに必要な情報が含まれているとは限りません。ジオシティーズのサーバーは、ファイルの最終更新日時やサイズを送ってこないのです。このため、ファイルの更新日時とサイズでチェックを行うように WWWC を設定したままだと、同じファイルでもチェックするたびに「更新」と判断してしまいます。ゲストブックに相性が悪いと書いたのは、この現象を見つけたからです。実は、ファイルの最終更新日時やサイズは、必ず送らなければならないデータではないのです。したがって、この場合ジオシティーズが悪いとはいえません。

WWWC でも他のチェック方法が用意されているので、更新チェックができないわけではありません。HTML タグを除いたサイズでチェックしたり、META タグを使ってチェックすることもできますが、どちらの方法にしても GET でホームページのデータを取得することになります。まあ、ブラウザでアクセスする場合と違って、画像データをリクエストしない分だけ高速ですが、大きなファイルになると、データの転送や更新のチェックに時間がかかることになります。

また、HTML タグを除いたサイズでのチェックも完全ではないようで、同じファイルでも「更新」と判断することがたまにあります。もっとも、MEAT タグに更新情報を記述しておけば、その内容でユーザーが確認することは可能です。結局、最終更新日時をチェックすることが一番確実なように思いますが、ジオシティーズではこの情報を送らないので、WWWC のメリットを生かすことはできないようです。このため、M.Hiroi's Home Page の WWWC 対応は見送ることにしました。

WWWC はとても便利なソフトであることは間違いありません。フリーウェアでありソースも公開されていることは、とても素晴らしいと思います。ただ、ジオシティーズとはちょっと相性が悪い、ということなのです。また、技術の進歩と共に規格も変わっていくものです。WWWC のようなソフトウェアを開発するためにも、HTTP などの規格がよりいっそう整備されることを期待しています。

8月20日

8月19日にカウンタが 1000 を突破しました。ホームページを開設した時は、1000 は遠い数字に感じていましたが、このホームページに来てくださる皆様のおかげで 1000 HIT を達成することができました。どうもありがとうございます。

お気づきの方もいるでしょうが、このホームページには、トップページの他にもカウンタを2つ使っています。カウンタは、Tcl/Tk GUI Programming と xyzzy Lisp Programming のページの一番下に配置されています。利用しているカウンタサービスは、会津大学にあるホスト上でサービスが行なわれている フリーアクセスカウンター です。学生のボランティアで運営されていて、非営利目的であれば誰でも無料で利用することができます。感謝です。

ページごとのアクセス回数を知りたい、というのが本来の目的なのですが、個人でたくさんのカウンタを取得するわけにもいかないので、2つだけ使わせてもらってます。おかげさまで、Tcl/Tk や xyzzy Lisp のアクセス回数を知ることができました。最近、これらのコンテンツの更新が止まっているので、近いうちに再開しようと思っています。派手なことはできませんが、地道に一歩ずつ内容を充実させていくよう努めてまいりますので、これからもよろしくお願いします。

ところで、電脳倶楽部・紳士と淑女の社交場 Web 版で、ホームページの更新をチェックする便利なソフト WWWC があることを知りました。WWWC は nakka (Tomoaki Nakashima) 氏が開発されたフリーソフトウェアです。nakka 氏のホームページ nakka.com 内の WWWC からダウンロードできます。WWWC は Web ページの META タグに記述された更新情報を利用することができます。M.Hiroi's Home Page でも対応してみようか、と考えています。

8月17日

ホームページを開設してから約1ヶ月たちました。おかげさまで、アクセスカウントも 900 を超えて、もうすぐ 1000 の大台に達しようとしています。M.Hiroi's Home Page にアクセスされた皆様に大感謝です。メールやゲストブックへの書き込みは大歓迎です。お気軽にどうぞ。

このところ CGI プログラミングの勉強をしているのですが、AN HTTPD を導入したことにより、ローカルな環境で CGI プログラムを実行することができ、とても助かっています。AN HTTPD は、中田昭雄氏が開発・配布されている Windows95/98/NT用 の HTTP サーバ(Webサーバ)です。フリーで利用することができ、インストールも簡単です。M.Hiroi はテスト用に使っていますが、Web サーバーやプロキシサーバーとして、実務に使用できる優れものです。AN HTTPD Home Page からダウンロードできます。

CGI プログラムは Web サーバーで実行されます。不具合のあるプログラムを実行すると、最悪の場合、Web サーバーをダウンさせる可能性もあるため、お行儀の良いプログラムを作らなければいけません。このため、自作 CGI は実行できないプロバイダも多いようです。ここジオシティーズも自作 CGI は不許可です。

まあ、CGI プログラムの勉強だけでは満足できないのは当然のことで、実際に試してみようと思っています。そのうちに CGI を許可しているプロバイダへ、M.Hiroi's Home Page の別館を作るかもしれません。

8月12日

ZooMark さんの ZooMark'z 極楽遊戯、あいはらてつやさんの 電脳倶楽部非公式サイト と相互リンクが実現しました。大感謝です。

電脳倶楽部 148 号の正式発表が満開製作所からありました。Web版紳士と淑女の社交場(掲示板)も開設されています。投稿募集中とのことなので、CGI 関連の入門記事を書こうかな、と思っています。社交場でも宣言してしまったので、もう逃げることはできません(笑)。時間的にちょっと苦しいのですが、ローカル環境で簡単な CGI プログラムを実行するところまでは書くつもりです。お気楽にゴーゴー!で、がんばります。

8月9日

^Z が気になって X-MODEM の通信手順を調べました。X-MODEM 1k ではデータを 1024 byte づつ転送します。最後のデータを転送する時に、データが 128 byte または 1024 byte に満たない場合は、^Z を充填してデータ転送が行われます。X-MODEM ではファイルに関する情報、たとえば、ファイル名とかファイルサイズなどは送っていません。受信側では、送られてきたデータをそのまま受け取るだけです。つまり、X-MODEM でファイルを転送すると、ファイルの最後に ^Z がついてしまうのです。

なんとまあ単純な仕様ですが、そのぶん簡単に実装することができます。これが X-MODEM のメリットで、パソコン通信の黎明期ではよく使われたプロトコルだそうです。X-MODEM の改良型として Y-MODEM や Z-MODEM がありますが、QuTERM は標準で X-MODEM と Y-MODEM しか使うことができません。そして、Tera Term Pro では Z-MODEM やほかのプロトコルは使用できるのですが、Y-MODEM だけはサポートしていないのです。それで X-MODEM を使ったわけです。

そういえば、旧 Oh!X で PC と X68000 間のデータ転送を扱った連載記事がありました。ひさしぶりに旧 Oh!X を読み返してみようか、と思っています。

8月7日

最近になって、ようやく PC と X68030 との間でデータを転送できるようになりました。電脳倶楽部や X68k 関連の掲示板を読むと、データの転送にMOを使っているユーザーが多いようです。M.Hiroi も最初はMOの導入を考えたのですが、PC 用と X68k 用の2台を買うだけの余裕がありません。1台で済ますとなると、つなぎかえるのが面倒ですし、なによりも M.Hiroi のオンボロ PC には SCSI ポートがありません(笑)。そこで、一番安上がりの方法である RS-232C でデータを転送することにしました。これだと、RS-232C のリバースケーブル(約 1400 円)を購入するだけで済みます。

M.Hiroi が使用した通信ソフトは、フリーで利用できる Tera Term Pro version 2.3 (Windows95/NT) と QuTERM(X68000:SX-Window) です。Tera Term Pro の作者 T. Teranishi 氏と QuTerm の作者 廃人王 氏に感謝いたします。どちらも使いやすいアプリケーションなので、RS-232C の設定が間違っていなければ簡単にデータを転送できます。とりあえず、Baud rate は X68000 の switch.x で設定できる上限 19200 としました。

ところで、M.Hiroi はプロトコル X-MODEM 1k を使って Lzh ファイルを転送しましたが、ファイルの最後に余分なデータ ( ^Z ) がつくことがあります。まあ、lzh ファイルは正常に解凍できるので実害はないのですが、気になりました。実は、M.Hiroi はパソコン通信の経験がなく (つまり、いきなりインターネット)、通信ソフトを使うのは初めてです。どこか設定に間違いがあるのかもしれません。

8月4日

『Cプログラミング診断室』という本をご存知でしょうか。汚いプログラムや下手なプログラムを集めた本として雑誌で紹介されたことがあり、名前は知っていたのですが読んだことはありませんでした。この本が著者である藤原博文氏のホームページ 「藤原博文の館」 で全ページ公開されています。

さすがに掲載されているプログラムは想像を絶するものが多く、中には気絶しそうなほどメチャクチャなプログラムもあります。よくぞここまで集めたものだと感心してしまいました。自分のスタイルを再点検する意味でも、プログラマにはおススメの一冊です。

この中で Pascal 風に BEGIN と END を使うプログラムがあります。これはマクロで BEGIN を } に、END を ;} に置換すれば実現できます。実は、私がC言語の勉強を始めたころ、OS-9 関連の本でこのようなマクロを見かけたことがあります。その本にはプログラムがわかりやすくなると書かれていて、初心だった私は、そういうものなのか、と感心したことを覚えています。

幸いなことに、そのようなマクロを使った本や雑誌がほかにはなかったので、これはあやしいぞと気がつきました(笑)。そのまま続けていたらと思うと恐ろしいですね。

8月3日

再度 xyzzy Lisp でパズル「8クイーン」を解いてみました。配列を使えばインタプリタでも速くなるだろう、と思っていたのですが、結果は無残にも遅くなってしまいました。やっぱり、Lisp はリストを使った方がよいようです。詳しい内容は xyzzy Lisp Prigramming にまとめておきました。

8月1日

Tcl/Tk を 8.2 から 8.3.1 へようやくバージョンアップしました。さっそく、C言語で作成した DLL を再コンパイルしました(笑)。Tcl/Tk+C言語で作成したゲームは ver 8.3.1 用のファイルも用意したので、よろしければご利用くださいませ。

Tcl/Tk は頻繁にバージョンアップが行われるため、その度に DLL を再コンパイルするようでは面倒ですね。まあ、複数のバージョンを使い分けてもいいのですが、なるべくならひとつのバージョンで済ませたいものです。思考ルーチンは DLL ではなく、コンソールアプリケーションとして作成し、パイプを使ってデータのやり取りを行った方がよいかもしれません。

xyzzy Lisp でパズル「8クイーン」を解いてみましたが、インタプリタとバイトコンパイルでは実行時間に約 70 倍もの差が出ました。この点について亀井さんからメールをいただきました。感謝です。

「マクロ展開自体のオーバーヘッドもありますが、それによってセルが大量に消費されるために gc がガンガン呼ばれることも、遅さの要因ではないかと思います。」

実は、プログラムでも Lisp らしくリストを使っているため、セルを大量消費しています。配列を使うとインタプリタでも速くなるかもしれませんね。そのうちに試してみたいと思います。


2000 年 7 月

7月31日

STk の話を少しだけ。STk とは scheme (スキーム) と Tk を組み合わせた処理系です。scheme は Lisp の方言のひとつです。言語仕様は Lisp よりシンプルで美しいといわれ、熱烈なファンが多いプログラミング言語です。

GNU はアプリケーションのカスタマイズ用言語として、scheme をベースにした guile という処理系を発表しています。また、GNU の画像処理ツールGIMPに搭載されているスクリプト言語 script-fu も scheme をベースにしています。scheme に関する情報は木村巌氏のページ プログラミング言語Scheme が参考になります。

私は scheme でのプログラミング経験がありません。Tcl/Tk と同じ Widget Tour が STk に移植されていたので試してみたところ、ひととおり動作はするようです。また、STk にはオブジェクト指向プログラミングのための拡張機能 STklos も含まれています。なかなか興味深い処理系だと思っています。入手先ですが、STk Home Page から Windows 版のバイナリをダウンロードできます。

7月29日

xyzzy の作者である亀井哲弥氏のホームページからリンクしていただきました。大感謝です。

7月27日

少しだけ Lisp の話をしましょう。Lisp の標準である Common Lisp は巨大な仕様を持つシステムです。Lisp そのものは単純なのですが、Common Lisp で定義されている関数やマクロの数が膨大なのです。その定義書である「Common Lisp the Language (CLtL)」は、日本語訳で約 1000 ページもあります。CLtL を読み通すだけでも大変なことなのです。xyzzy Lisp の準拠度がたとえ6割だとしても、私は凄いことだと思います。

Common Lisp はコンパイラを前提とした処理系です。インタプリタでの動作は多少遅くても、コンパイルすることで実行速度を上げようというわけです。インタプリタの動作が遅いのは、マクロが多く使われているからです。実行時にマクロを展開する分だけ確実に遅くなります。そのかわり、プリミティブな関数の数を減らすことができるので、コンパイラの作成には都合がいいのです。そして、マクロはコンパイル時に展開されるため、コンパイル済みのプログラムはインタプリタよりも高速に実行することができます。

xyzzy Lisp にはバイトコンパイルの機能があります。そう、xyzzy Lisp でもプログラムをコンパイルした方が高速に実行できるのです。実際にパズル「8クイーン」で試してみました。その結果は xyzzy Lisp Programming で報告する予定です。お楽しみに。

7月26日

私はブラウザに IE 5 を使っていますが、このホームページは NN 4.7 でもチェックしています。ブラウザによって HTML の動作が異なるのは、ホームページの制作者にとって頭の痛い問題です。たとえば、私は文章の適当なところで改行を入れるのですが、NN 4.7 で見ると文章の途中で空白が挿入されてしまいます。まあ、作り方が悪いと言われればそれまでなのですが、ブラウザの側でうまく整形してくれれば、それが一番いいわけです。IE 5 ではきれいに表示されるので、NN の新しいバージョンには期待したいですね。

xyzzy Lisp Programming はお休みです。

7月25日

Tcl/Tk の大家である須栗歩人氏のホームページと相互リンクが実現しました。大感謝です。私が使っている Tcl/Tk は Windows 版 8.2 ですが、最新版は 8.4a1、安定版は 8.3.1 とバージョンアップしています。そろそろ 8.3.1 を試してみようか、と思っています。思考ゲームは DLL を使っているので、再コンパイルが必要になるかもしれません。

後先かまわず xyzzy Lisp プログラミングを始めてしまいました。xyzzy Lisp は、基本的な Lisp 関数は Common Lisp に準拠していて、エディタ部分の操作関数は Emacs Lisp を参考にしているようです。このエディタ関連のプログラミングが難しいところなので、勉強しながらプログラムを作りたいと思います。

7月24日

ホームページの作成に専用のツールを使う人も多いでしょうが、私はエディタでガリガリと HTML タグを書いています。X68000 でμEmacs の洗礼をうけてからというもの、他のエディタに馴染むことができなくなりました。Windows では Mule を使っていたのですが、最近 xyzzy というエディタに乗り換えました。

xyzzy は亀井氏が作成された Emacs 系のエディタで、2画面型のファイラーも搭載している優れものです。X68000 でμEmacs と mint を利用していたユーザーにはおススメです。また、Lisp 好きなユーザーにとって、xyzzy Lisp が Common Lisp に準拠していることも見逃せません。そのうちに xyzzy Lisp でプログラムを作ってみようか、と思っています。

HTML に関するドジをひとつ。ファイル内の特定の場所へジャンプする時は、<A href="#jump"> として、ジャンプ先は <A NAME="jump"> で設定しますね。この設定でなにを考えていたのか、#jump のように # をつけてしまったのです。そして恐ろしいことに、それでも IE は動いてくれたのです。今まで IE でしかチェックしていなかったので、間違いに気づきませんでした。NN では動作しません。やっぱり、NN でもチェックしないとだめですね。NN ユーザーの皆さん、ごめんなさい。

やっさやる気のない謎のぺぇじ 亀井氏のホームページ。タイトルはランダムで変わるようです。

7月23日

電脳倶楽部に掲載された「Zしーモンキー」をまとめてアップしました。CD-ROM 版電脳倶楽部では、X68000 以外の機種でも読めるように HTML 形式のファイルが収録されています。いちいち手動で変換していては大変なので、変換作業を Perl で半自動化しているそうです。この Perl スクリプトを含むツール一式を、相原さんからいただきました。

電脳倶楽部は DSHELL という独自のブラウザを使っていて、リンクをはったり文字の色やサイズを変更することができます。マウスひとつで楽々操作できるのも(笑)、この DSHELL のおかげなのです。当然ながら、ドキュメントはプレーンテキストではありません。このため、変換用スクリプトはかなり複雑で、他のプログラムとも連携して動作するようになっています。X68030 で動かしても、けっこう時間がかかるようです。

ところが、私のドキュメントはプレーンテキストなので、もっと簡単に変換することができます。そこで、いただいた Perl スクリプトを参考にして、専用のスクリプトをサクサクと作ってしまいました。相原さん、おかげさまで楽に変換することができました。ありがとうございます。このような処理には Perl のようなスクリプト言語が向いていますね。


Copyright (C) 2000 Makoto Hiroi
All rights reserved.

[ Home ]