M.Hiroi's Home Page
http://www.geocities.jp/m_hiroi/

Memorandum

プログラミングに関する覚え書や四方山話です。
[ Home ]
2001 年 1 月 2 月 3 月 4 月 5 月 6 月 7 月 8 月 9 月 10月 11月 12月

2001 年 12 月

12月31日

●大晦日

今年も残りわずかとなりました。M.Hiroi's Home Page を開設してから1年半になりますが、おかげさまでカウンタも 33,000 を突破いたしました。リンクしていただいているホームページ管理者の皆様、そして、なによりも M.Hiroi's Home Page に来てくださる皆様に感謝いたします。

さて、10 月より始めたアンケート 興味のあるコンテンツは? の途中経過ですが、Lisp 関連のコンテンツに興味を持っている方が多いようです。Lisp は M.Hiroi の一番好きな言語なので、来年もがんばって更新したいと思います。Lisp だけではなく Scheme も勉強してみたいですね。また、ほかのコンテンツも更新できるようにがんばりますので、来年もよろしくお願い申し上げます。

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


12月27日

●相互リンク

舩本昇竜さんのホームページ N@MO と相互リンクが実現しました。大感謝です。


12月16日

●訂正

12 月 13 日の Memorandum で間違いがありました。POD を Perl Old Documentation と書きましたが、正しくは Plain Old Documentation でした。訂正するとともにお詫び申し上げます。


12月13日

●パイプの使い方:Perl 編

今回は Perl でパイプを使う方法を説明します。Perl でパイプを使う場合も open を使います。

open OUT, "| prog1";
open IN,  "prog2 |";

ファイル名の最初の文字が | だったならば、その引数をファイル名ではなくコマンドとして実行します。最初の例では、ファイルハンドル OUT へ出力したデータは、パイプを経由してコマンド prog1 の標準入力へ送り込まれます。次の例で、ファイル名の最後の文字が | だった場合、ファイル名をコマンドとして実行し、そのコマンド prog2 が標準出力へ出力したデータをパイプ経由で読み込むことができます。

また、次のようにパイプで複数のコマンドをつなぐこともできます。

open OUT, "| prog1 | prog3";
open IN,  "prog2 | prog4 |";

ファイルハンドル OUT へ出力されたデータは prog1 へ渡され、prog1 から出力されたデータは prog3 へ渡されます。次の例では、prog2 から出力されたデータが prog4 へ渡され、prog4 の出力データをファイルハンドル IN から読み込むことができます。

ただし、次のようにして双方向のパイプをオープンすることはできません。

OPEN IO, "| prog |";

Perl で双方向通信を行うには、標準ライブラリモジュール IPC::Open2 を使います。実際に簡単なプログラムを作って試してみたのですが、M.Hiroi の環境 (Win95, ActivePerl v5.6.1) では動作しませんでした。自分のプログラムに間違いがあるのかもしれません。ただいま調査中ですが、興味のある方は試してみてください。

それでは、簡単な例を示しましょう。Perl には perldoc という POD (Plain Old Documentation) 形式で書かれたドキュメントを検索するためのツールが用意されています。たとえば、DOS プロンプトで perldoc -f push と入力すれば、関数 push の説明が画面に表示されます。

ここで、この説明をファイルへ保存したい場合もあるでしょう。ところが、Windows の perldoc はバッチファイルのため、出力をファイルへリダイレクトすることができません。つまり、perldoc -f push > push.txt としても、push の説明は画面に表示されるだけで、ファイル push.txt には格納されないのです。

このような場合、Perl で perldoc の出力を受け取り、それを標準出力へ書き出すことでファイルへリダイレクトすることができます。次のプログラムを見てください。

リスト:perldoc の起動 (perldoc.pl)

open IN, "perldoc @ARGV |" or die "error\n";
while( <IN> ){ print; }
close( IN );

パイプを使って perldoc の出力を受け取ります。あとは、ファイルハンドル IN からデータを受け取り、それを print で出力するだけです。これで、perl perldoc.pl -f push > push.txt とすれば、push の説明を push.txt に格納することができます。このほかにも、既存のコマンドを実行して、その出力から必要な情報を取り出すことも簡単にできるでしょう。パイプはとても便利な機能なので、いろいろ試してみてください。


2001 年 11 月

11月29日

●Common Lisp 入門

先日、xyzzy Lisp ProgrammingCommon Lisp 入門 を公開しましたが、xyzzy Lisp のカウンタがいきなり跳ね上がったのには驚きました。たくさんアクセスしていただき、本当にありがとうございます。xyzzy Lisp に興味を持っている方が多いことを改めて実感しました。

xyzzy Lisp は、エディタに搭載されている処理系とは思えないくらい機能が充実していて、Common Lisp を勉強するにはもってこいの処理系だと思います。Common Lisp を勉強する時に、拙作のドキュメントが少しでもお役に立てれば幸いです。更新は週一回程度になりますが、よろしくお願いいたします。


11月24日

●Z-MODEM

PC と X68000 との間でデータを転送する場合、M.Hiroi は RS-232C を利用しています。リバースの RS-232C ケーブルで PC と X68000 を接続すれば、あとは通信ソフトを使ってデータを簡単にやりとりすることができます。データ転送については、M.Kamada さんX68kとWindows環境でデータをやりとりする方法 で、いろいろな方法をわかりやすく紹介されています。興味のある方は一読することをおススメします。

M.Hiroi が使用した通信ソフトは、フリーで利用できる Tera Term Pro version 2.3 (Windows95/NT) と QuTERM (X68000 : SX-Window) です。この場合、両者共通で利用できるファイル転送プロトコルは X-MODEM しかないため、今までは X-MODEM でデータを転送していました。X-MODEM はとても単純なプロトコルなので、転送するファイル名を送ることができないなど、ちょっと不便なところがあります。そこで、M.Kamada さんが管理・運営されている X68000 LIBRARY に最近登録された ZM.X を使ってみました。

ZM.X は Z-MODEM / Y-MODEM / X-MODEM でのファイル転送を行うプログラムです。Tera Term Pro は Z-MODEM を利用できるので、ZM.X を使えば Z-MODEM でデータを転送することができます。Z-MODEM は高度なファイル転送プロトコルで、転送速度は高速な部類に入るそうです。また、複数ファイルを連続で送受信でき、ファイル名などの情報も転送することができます。実際に使ってみたところ、問題なくデータを転送することができました。それにしても Z-MODEM はとても便利ですね。ZM.X の原作者 T.Tamaki 氏と作者 S.Yamada 氏、そして、いつもお世話になっている M.Kamada さんに大感謝です。


11月12日

●30,000 Hit ありがとうございます

昨日、カウンタが 30,000 を突破しました。リンクしていただいているホームページ管理者の皆様、そして、なによりも M.Hiroi's Home Page に来てくださる皆様に厚くお礼申し上げます。このホームページには 5 つのメインコンテンツがあり、それぞれのトップページに すごい!!カウンター のカウンタをつけています。ここ1週間の平均アクセス数は次のようになりました。

表:1週間の平均アクセス数
TOPX68kTcl/TkxyzzyPuzzleProlog
76/day34/day18/day46/day19/day33/day

xyzzy Lisp は最近更新していないにもかかわらず、たくさんアクセスしていただき本当にありがとうございます。Lisp 関連で更新したページは Link 集だけなので、xyzzy Lisp も更新しなければいけないなあ、と思っています。今のところ、拙作 X68000 用 Lisp インタプリタ VTOL の Lisp 入門マニュアルを、xyzzy Lisp (Common Lisp) に書き直すことを考えています。

たぶん、電脳倶楽部読者以外の方で、このマニュアルを読まれた方はほとんどいないでしょう。「せっかく書いたマニュアルなのに、このまま放置しておくのはもったいない。」ということで、ここはひとつ書き直してみることにしました。もっとも、書かれている内容は基本的なことだけですし、拙作の Lisp 入門講座 と重複しているところも多いので、目新しいものはほとんどありません。あまり期待しないでくださいね。

X68k のアクセス数が増えたのは、TAU さんの「三角(菱形)リバーシ」のおかげでしょう。面白いゲームを作成された TAU さんに大感謝です。拙作の「八角リバーシ菱形バージョン」もよろしくお願いしますね。ご意見やご感想をお待ちしていますので、ゲストブックへお気軽にお書き込みください。次回作は「八辺 ( Octagon ) リバーシ」を考えています。

Puzzle のアクセス数も増えましたが、これは Java DE Puzzle の効果でしょうか。アルゴリズムの動作をグラフィックで表示してみるのは、けっこう面白いものですね。「ソート」や「迷路の探索」だけではなく、ほかのアルゴリズムもグラフィックで表示してみると面白いかもしれません。パズルの解法ですが、次回は「三目並べ」の予定です。

これからも頑張りますので、よろしくお願いいたします。


2001 年 10 月

10月15日

●Lisp, Scheme 関連のリンク

Link に Lisp, Scheme 関連のページを4つ追加しました。Japan Lisp User Group は Lisp 関連情報や Lisp 処理系へのリンク集がとても充実しているページですが、この中で拙作の X680x0 用 Lisp インタプリタ VTOL が Lisp 処理系一覧 に、月刊・電脳倶楽部に掲載された拙作の Lisp 入門講座が 定期刊行物・雑誌・雑誌記事・ディスクマガジン に登録されています。大感謝です。

Shiro Kawai さんの Practical Scheme には、Lisp, Scheme 関連の興味深いドキュメントが公開されています。翻訳の「普通のやつらの上を行け」や、Shiro Kawai さんが書かれた「なんでもλ」と「なんでも再帰」はとても面白いです。また、他サイトのリソースとして拙作の Lisp 入門講座がリンクされております。大感謝です。これからもよろしくお願いいたします。


10月4日

●Java によるコームソートのデモ

Java Development Kit ( JDK ) にある SortDemo が面白かったので、コームソートの実行経過を表すプログラムを作ってみました。画面をクリックするとソートを開始します。比較しているデータは、下に赤線と青線を引いて表しています。櫛ですいていくことにより、大まかにソートされていく様子がよくわかると思います。

コームソートデモ


10月2日

●アンケート

本日より、第 2 回のアンケートを始めました。お題は「興味のあるコンテンツは?」です。M.Hiroi's Home Page には 5 つのメインコンテンツがありますが、今回のアンケートはサブコンテンツを項目にしてみました。興味深いコンテンツがありましたら、どうぞお気軽に投票してくださいませ。


2001 年 9 月

9月20日

簡単な Java アプレット ワーム を作ったので公開します。これは4匹のワーム(ミミズ)が動き回るという単純なプログラムです。習作ということで、ミミズは円を 25 個連結しただけの簡単なグラフィックで表しています。すぐに飽きるとは思いますが、Java 初心者の M.Hiroi にはちょうどよい例題でした。興味のある方は、ミミズの数を増やすとか色や形を変えるなど、プログラムを改造して遊んでみてください。

ところで、Java の class ファイルの先頭4バイトには、いわゆる「マジックナンバー」と呼ばれるデータが書き込まれていますが、それが「カフェ (Cafe) ベイビー (Babe) 」とはびっくりしました。Java だからやっぱり Cafe なんでしょうね。舩本さん、面白い話をありがとうございました。

9月11日

4 月に再開してから週一回のペースで更新していた お気楽 Prolog プログラミング入門 ですが、昨日の更新を最後に、しばらくの間お休みとさせていただきます。

当初、思考ゲーム「カラー ( Kalah ) 」を取り上げる予定でしたが、思考ゲームの基本から説明すると長くなりそうなので、ひとまず区切りをつけることにしました。カラーについては、拙作のC言語講座 Zしーモンキー第 20 回 を参考にしてください。思考ゲームの基本である「ミニマックス」と「αβ枝刈り」を使ってカラーを作成しています。また、Puzzle DE Programming の思考ゲーム「MiniMax」 (1) (2) も参考になると思います。

9月7日

本日、カウンタが 25,000 を突破しました。リンクしていただいているホームページ管理者の皆様、そして、なによりも M.Hiroi's Home Page に来てくださる皆様に厚くお礼申し上げます。このホームページには5つのメインコンテンツがあり、それぞれのトップページに すごい!!カウンター のカウンタをつけています。ここ1週間の平均アクセス数は次のようになりました。

表:1週間の平均アクセス数
TOPX68kTcl/TkxyzzyPuzzleProlog
69/day27/day16/day37/day13/day32/day

お盆のころはアクセス数がガクッと落ち込みましたが、最近は元に戻りつつあるようです。ここ数ヶ月の間、Prolog Programming しか更新していないにもかかわらず、ほかのコンテンツにたくさんアクセスしていただき、本当にありがとうございます。Prolog Programming に区切りをつけたら、Java でパズルゲームを作るだけではなく、ほかのコンテンツも更新できるように頑張りたいと思います。これからも、よろしくお願いいたします。

9月5日

アンケート「興味のあるプログラミング言語は?」は 9 月 4 日で終了いたしました。おかげさまで総数は 556 票とたくさん投票していただき、投票された皆様には厚くお礼申し上げます。

トップ3は Java, Ruby, C++ と、オブジェクト指向プログラミングができる言語が上位を独占しました。Java と C++ は上位にくるだろうと思っていましたが、Ruby がこんなにも興味を持たれているとは予想外の結果でした。オブジェクト指向言語では、海外で定評のある Python がありますが、日本での知名度が低いせいか投票数が少なかったのも意外な結果でした。やっぱり、日本生まれの Ruby に期待されている方が多いのでしょう。

M.Hiroi's Home Page でのアンケートですから、Lisp や Scheme などの関数型言語に興味を持たれている方も多いですね。Lisp は M.Hiroi が一番好きな言語ですし、Scheme にも大変興味を持っています。これからも、Lisp Programming 関連のコンテンツを充実させていきたいと思っています。

逆に、論理型言語の Prolog は投票数が少なかったです。カウンターをみると、Prolog Programming のアクセス数は多いのですが、興味を持っている方は少ないようです。それに、ときどき来る質問メールは Prolog に関することが多いので、学校で Prolog を勉強している学生さんのアクセスが多いのかもしれません。

Tcl/Tk も投票数が少なかったです。M.Hiroi のように、Windows で Tcl/Tk を使うユーザーは少数派なのでしょうね。また、Tcl ではなく Tk に興味を持っている方もいると思います。ほかの言語、たとえば Ruby, Perl, Scheme, Python などと Tk を組み合わせた処理系もあるので、Tk に興味のある方はぜひ試してみてください。M.Hiroi は Perl/Tk を使っていますが、便利でとても面白いですよ。

今後の予定ですが、皆さんと同じく M.Hiroi も Java には興味を持っているので、Prolog Programming が一段落したら、とりあえず簡単なパズルゲームを Java で作ってみるつもりです。これからもがんばりますので、よろしくお願いいたします。ご意見やご感想、ご要望などありましたら、お気軽にメールやゲストブックでお知らせください。

9月1日

M.Kamada さん の日記で、4色問題の塗り分けパズル の Java アプレットが公開されています。中毒性の高いパズルなので、取り扱いには十分に注意しましょう(笑)。ソースも公開されているので、Java を勉強している方には良いお手本になると思います。

アンケートを開始してから2ヶ月になりますが、おかげさまで投票総数も 500 を越えました。投票された皆様にお礼申し上げます。今のところ、Java, Ruby, C++ が先頭グループで、Lisp, Perl, Scheme, C が第 2 グループ、といったところです。最初は Scheme の投票も多かったのですが、Ruby や C++ に追い抜かれてしまいました。やっぱり、今は「オブジェクト指向」の時代なのかなあ、と思っています。

さて、今のアンケートは近日中に終了する予定です。次のアンケートは考慮中なので、何か面白いお題がありましたら、ぜひ教えてくださいませ。


2001 年 8 月

8月4日

圧縮のお話です。ファイルの圧縮といえば、日本では lha が有名ですね。拡張子が lzh のファイルは lha で圧縮されています。M.Hiroi も lha のお世話になっていて、メールの添付ファイルやダウンロードしてもらうファイルは lha で圧縮しています。このほかには、zip (拡張子 : zip) と gzip (拡張子 : gz) が有名です。gzip を使う場合、複数のファイルをアーカイバ tar でまとめてから圧縮することになるので、その場合は拡張子が tar.gz や tgz になります。

最近、拡張子が bz2 というファイルも見かけるようになりました。このファイルは bzip2 で圧縮されています。lha や zip のように有名ではないので、bzip2 をご存じない方もいるでしょう。実際に bzip2 を使ってみると、lha や zip よりも圧縮率が高いので、M.Hiroi はたいへん驚きました。bzip2 は The bzip2 and libbzip2 home page からダウンロードできます。作者は Julian Seward です。

bzip2 は「ブロックソート(BlockSorting)」という方法を使っています。ブロックソートは 1994 年に M.Burrows と D.J.Wheeler が提案した方法で、Burrows-Wheeler Transform とも呼ばれています。ブロックソートはデータを圧縮するのではなく、データを圧縮しやすい形に変換するだけです。そして、他の方法でいっきに圧縮するわけです。ブロックソートは、データを変換するときにソートを使うのですが、とても面白いアルゴリズムです。

ブロックソートを採用した圧縮アーカイバは、bzip2 以外にもいくつかありますが、日本では 鶴田真一さん が作成された GCA が素晴らしい性能を発揮しているようです。ためしに、エディタ xyzzy の実行ファイルを圧縮したところ、次のような結果になりました。

xyzzy.exe  1,370,112 byte
----------------------------------
lha          685,736 byte (50.1 %)
bzip2        646,065 byte (47.2 %)
GCA          629,164 byte (45.9 %)

いやー、GCA の性能は本当に凄いですね。脱帽です。

それから、データ圧縮については奥村晴彦教授の Haruhiko Okumura's Home Page が参考になります。特に、Data Compression Pointers という圧縮関連のリンク集が充実していて、とても役に立ちます。奥村教授に感謝いたします。


2001 年 7 月

7月31日

アンケートを開始してから1ヶ月になりますが、おかげさまで投票総数も 300 を越えました。投票された皆様にお礼申し上げます。途中経過ですが、Java と Ruby が1位の座を激しく争っています。Ruby に興味を持っている方がこんなにも多いとは予想していませんでした。さすが純国産のオブジェクト指向スクリプト言語です。Python もオブジェクト指向スクリプト言語ですが、日本では知名度が低いのか、興味を持っている方は少ないようです。

ところで、Ruby は X68000 でも動作します。岩月博之さんが Ruby を X68000 に移植されました。岩月さんのホームページ MoonRock@MoonRock で Human68k 用 Ruby が公開されています。X68000 でも Ruby が使えるのはとても嬉しいことです。岩月さんに感謝です。

アンケートはもう少し続けますので、お気軽に投票してください。

7月24日

M.Kamada さんの 日記 で「X68000でのプログラミングに役立つ、現在でも入手可能な書籍」が紹介されています。『68000プログラマーズ・ハンドブック』、『プログラマーのためのX68000環境(エンバイロンメント)ハンドブック』、『X68000ベスト・プログラミング入門』の三冊です。

X68000 でプログラムを作る場合、これらの書籍はとても参考になります。特に、アセンブラでプログラムを作るのであれば、『68000プログラマーズ・ハンドブック』と『プログラマーのためのX68000環境ハンドブック』はとても役に立ちます。また、『X68000ベスト・プログラミング入門』は、Human68k やエディタ ED の使い方から X-BASIC, C, アセンブラのプログラミングまで幅広く解説しているので、X68000 初心者にも参考になると思います。

M.Hiroi は三冊全て持っていますが、現在でも入手可能だとは思ってもいませんでした。重要な情報を提供された M.Kamada さんに感謝です。

7月14日

7 月 6 日に出題した「変形版8パズル」の解答です。最長手数は(A)が 31 手で、(B)が 29 手でした。最長手数となる局面を下図に示します。最長手数の局面は、どちらのパズルも 1 通りしかありません。

          1                     0           
        /  \                 /  \         
      2───3             7───8       
    /  \  /  \         /  \  /  \     
  4───5───6     4───5───6   
    \  /  \  /         \  /  \  /     
      7───8             2───3       
        \  /                 \  /         
          0                     1           
                             (31手)

      図:変形版8パズル(A)の解答
          1───2                    8───1          
        /  \  /  \                /  \  /  \        
      3───4───5            5───4───3      
    /  \  /  \  /  \        /  \  /  \  /  \    
  6───7───8───0    0───2───7───6  
                                        (29手)

            図:変形版8パズル(B)の答え

興味のある方は、移動手順を求めるプログラムを作ってみてください。幅優先探索を使わなくても、「反復深化+下限値枝刈り法」で簡単に求めることができると思います。

7月10日

祝! M.Hiroi's Home Page 開設一周年

本日、M.Hiroi's Home Page を開設してからちょうど1年になりました。開設当初は1日平均 20 Hit 程度だったので、1年で 10,000 Hit すれば上出来だろうと思ってました。その後、アクセス数は少しずつ増えていき、今年の2月に 10,000 Hit を突破し、1年で 20,000 Hit を達成することができました。これもリンクしていただいているホームページ管理者の皆様、そして、なによりも M.Hiroi's Home Page に来てくださる皆様のおかげです。厚くお礼申し上げます。

さて、アンケートの方も投票総数がもうすぐ 100 に達します。投票された皆様に感謝いたします。途中経過ですが、1位が Java で2位が Ruby と Scheme です。やっぱり Java に興味を持っている方が多いようですね。M.Hiroi も Java でパズルゲームを作って Web 上で公開してみたいと思っています。まあ、思っているだけで、なかなか実行できませんが(苦笑)。アンケートは当分続けますので、お気軽に投票してください。

これからもがんばりますので、よろしくお願いいたします。ご意見やご感想、ご要望などありましたら、お気軽にメールやゲストブックでお知らせください。

7月6日

M.Kamda さんが lumps Ver.0.11b で 12228190点 を達成されました。1000 万点突破おめでとうこざいます! さすが M.Kamada さんです。M.Hiroi は今のところ 139 万点、ようやく目標である 100 万点を突破することができました。次は 500 万点を目指してがんばります。

パズルのお話です。Prolog Programming では、15パズルの盤面を六角形に変形して、1から6までの数字を並べる 6パズル を取り上げました。今度は下図のように、8パズルを六角形に変形したパズルを考えてみます。

          1 
        /  \
      2───3              1───2
    /  \  /  \          /  \  /  \
  4───5───6      3───4───5
    \  /  \  /      /  \  /  \  /  \ 
      7───8      6───7───8───0 
        \  /
          0
        (A)                  (B)

              図:変形版8パズル

通常の8パズルの場合、駒の配置は偶奇性により 9! / 2 = 181440 通りになります。ところが、盤面を六角形に変形すると、駒の配置は 9! (362880) 通りになるので、プログラムを作る時は注意してください。このパズルでは偶奇性が成立しないのですね。したがって、駒をランダムに配置しても必ず解くことができます。

それでは、ここで問題です。上図の局面から始めて最長手数となる配置を求めてください。(A)と(B)の最長手数はそれぞれ何手になるでしょうか。

7月3日

TAU さんの X68k 用パズルゲーム『lumps』 Ver.0.11b はとても面白いのですが、なかなか手強くて M.Hiroi は高得点がだせません。M.Kamada さんは順調にスコアをのばしていて、8758170 点という高得点をマークしています。もうすぐ 1000 万点ですから凄いですね! 高得点を出す秘訣をぜひお聞きしたいと思っていたら、M.Kamada さんの日記で 「lumps Ver.0.11b」(作者:TAUさん)攻略メモ(by M.Kamada) が公開されました。うーん、なるほど納得です。やっぱり 7 色連鎖させないとダメなのね。それにしても、1手で 90 個前後の lump を消すというのは至難の技だと思います。せめて 100 万点はクリアできるようにがんばるぞー。


2001 年 6 月

6月28日

本日、カウンタが 20,000 を突破しました。リンクしていただいているホームページ管理者の皆様、そして、なによりも M.Hiroi's Home Page に来てくださる皆様に厚くお礼申し上げます。このホームページには5つのメインコンテンツがあり、それぞれのトップページに すごい!!カウンター のカウンタをつけています。ここ1週間の平均アクセス数は次のようになりました。

表:1週間の平均アクセス数
TOPX68kTcl/TkxyzzyPuzzleProlog
80/day37/day16/day45/day12/day60/day

M.Hiroi's Home Page の場合、土日のアクセス数はガクッと落ち込むのですが、今週はそれほど落ち込まなかったので、通常よりも平均アクセス数は多くなっています。最近は Prolog Programming しか更新していませんが、ほかのコンテンツにもたくさんアクセスしていただき、とても嬉しく思っています。M.Hiroi's Home Page が少しでも皆様のお役に立てれば幸いです。

これからもがんばりますので、よろしくお願いいたします。ご意見やご感想、ご要望などありましたら、お気軽にメールやゲストブックでお知らせください。

6月10日

またまたパズルの話です。Y.H. さんから出題された数字のパズル(ゲストブック No.191)を解いてみました。問題は、数字 1, 2, 7, 8 を使って答えが 1 から 80 になる式を作る、というものです。Four Four's と同様に +,-,×,÷,( ,) を使って式を作りますが、5 月 29 日で出題したパズルとは異なり、数字の順番は入れ替えてもかまいません。

この規則だと、数字を合体させなくても、ほとんどの式を作ることができるように思えます。そこで、数字を合体させずにどこまで解けるか、プログラムを作って確かめてみました。その結果、次に示す数は 1, 2, 7, 8 を使うだけでは解くことができません。

19, 26, 37, 38, 44, 67, 68, 74, 75, 76, 78, 79

これら 12 個の数は、12 とか 81 のように数字を合体させないと、その数になる式を作ることはできません。うーん、見込みがちょっと甘かったようです。そう簡単には解けませんね。まだ答えは書きませんので、皆さんも考えてみてください。

6月5日

5 月 29 日に出題した数字のパズルの解答例を発表します。

 1 = 1 * 2 + 3 - 4
 2 = 1 + 2 + 3 - 4
 3 = 1 + 2 * 3 - 4
 4 = 1 + 2 - 3 + 4
 5 = (1 + 2) * 3 - 4
 6 = 1 - 2 + 3 + 4
 7 = (-1 + 2) * (3 + 4)
 8 = (1 - 2 + 3) * 4
 9 = 1 * 2 + 3 + 4
10 = 1 + 2 + 3 + 4
11 = 1 + 2 * 3 + 4
12 = (-1 + 2) * (3 * 4)
13 = (1 + 2) * 3 + 4
14 = 1 * 2 + 3 * 4
15 = 1 + 2 + 3 * 4
16 = 12 / 3 * 4
17 = 1 / 2 * 34
18 = -1 + 23 - 4
19 = 1 * 23 - 4
20 = (1 * 2 + 3) * 4
21 = (1 + 2) * (3 + 4)
22 = -12 + 34
23 = -1 + 2 * 3 * 4
24 = (1 + 2 + 3) * 4
25 = 1 + 2 * 3 * 4
26 = -1 + 23 + 4
27 = 1 * 23 + 4
28 = (1 + 2 * 3) * 4
29 : NONE    [別ルール] 29 = 1 - 2 + 3! + 4!
30 : NONE    [別ルール] 30 = (1 + 2) * (3! + 4)
31 = -1 - 2 + 34
32 = 12 * 3 - 4
33 = 1 - 2 + 34
34 = (-1 + 2) * 34
35 = -1 + 2 + 34
36 = (1 + 2) * 3 * 4
37 = 1 + 2 + 34
38 : NONE    [別ルール] 38 = 12 * 3 + √4
39 : NONE    [別ルール] 39 = -1 + (2 ^ 3) / .(√4)
40 = 12 * 3 + 4

このルールでは 29, 30, 38, 39 になる式はありませんが、ルールを拡張して、階乗 ( ! )、累乗 ( ^ )、平方根 ( √ )、小数点 ( . ) などを使うと、式を作ることができます。まあ、39 になる式を作る時に .(√4) を 0.2 としたのは、ちょっと反則かもしれません。もっとスマートな式を見つけた方は、ぜひ教えてくださいね。


2001 年 5 月

5月29日 2nd

パズルの続きです。M.Kamada さん、全問正解おめでとうございます。さすが M.Kamda さんです。あっという間に解かれたようなので、おまけのパズルを出題しましょう。同じルールですが、今度は答えが 21 から 28 になる式を作ってください。29 と 30 はプログラムで確認したところ、同じルールでは不可能でした。

ちなみにルールを拡張すると、29 と 30 になる式を作ることができます。たとえば階乗 ( ! ) を導入すると、29 と 30 になる式は次のようになります。

1 - 2 + 3! + 4! = 29
(1 + 2) * (3! + 4) = 30

これだけでは物足りないという方は、31 から 37 になる式に挑戦してみてください。同じルールだと 38 と 39 は不可能ですが、40 になる式は作ることができます。興味のある方は、ルールを拡張して 38 と 39 になる式を探してみてください。

5月29日

ひさしぶりに数字を使ったパズルを出題しましょう。Four Four's の変形バージョンです。

[問題]

数字 1, 2, 3, 4 と+,-,×,÷,( ,) を使って、答えが 1 から 20 になる式を作りなさい。数字はひとつだけではなく、12 や 123 のように合体させてもよい。また、-1 や -12 のように、数字 1 の先頭に符号 - を付けてもよいことにする。ただし、数字の順番を入れ替えることは禁止する。

(例) 1 + 2 + 3 + 4 = 10

それではパズルをお楽しみくださいませ。

5月27日

メールのお話です。時々、見ず知らずの学生さんから課題や演習に関する質問メールが来るのですが、基本的にはお答えしておりません。というのも、課題や演習は自分で解かないと身につかないからです。回答する場合は、ヒントや参考になるホームページを提示するだけです。そのためか、お礼のメールが返ってくるのは 3, 4 回に 1 回程度にしかすぎません。

M.Hiroi にしても、間違いがないようにメールをよく読んで考えてから回答するのですが、質問者にとってヒントだけではメールを返す気になれないのかもしれません。メールだから簡単に質問するのでしょう。だったら、回答へのお礼も簡単にメールできると思うのですが、どうやら違うようです。これからは、課題や演習に関する質問メールには回答しないことにします。

ちょっと嫌気がさしたので愚痴をこぼしてしまいました。ご容赦くださいませ。

5月24日

ZooMark さん の物置に「X-BASIC外部関数ダウンロード」のコーナーができました。XB ユーザーは ZooMark さんのホームページへ GO!です。

M.Kamada さんの STUDIO KAMADA で「X68000ソフトウェアライブラリ」が暫定公開されていますが、ただいまライブラリに収録するソフトウェアのアンケートが実施されています。「要望の多いソフトウェアを優先して収録してゆきたいと思いますので、ご協力をお願いいたします。無記名ですので、お気軽にどうぞ。」とのことです。

5月20日

Puzzle DE Programming と xyzzy Lisp Programming は、しばらくの間お休みとさせていただきます。そろそろ「ネタ切れ」になるところだったので、しっかり充電してから再開しようと思います。その間、M.Hiroi's Home Page の更新ペースは落ちると思いますが、Prolog Programming と Memorandum は今までのように更新いたしますので、これからもよろしくお願いいたします。

5月17日

2000 年 11 月 10 日に公開した xyzzy Lisp: 構造体(2) に、とんでもない間違いが見つかりました。訂正するとともにお詫び申し上げます。いやはやなんとも、こんな間違いをするとは本当に情けないです。今後は、このような間違いがないように注意いたしますので、これからもよろしくお願い申し上げます。

5月8日

満開製作所の Web ページにありました「X68000関連リンク」は、諸事情により 5 月 6 日に閉鎖されましたが、本日より M.Kamada さんの Web ページ STUDIO KAMADA 内の X68000関連リンク へ移管されました。M.Kamada さん、ありがとうござます。管理は大変だと思いますが、よろしくお願いいたします。

5月3日

『自転車創業』さんのホームページで、満開製作所で『空の浮動産』を注文した人に重要なお知らせが掲載されています。「重要なので必ずご覧ください。」とのことです。

またまたカウンターの話です。すごい!!カウンター のアクセス解析には「リファラー」という項目があります。たとえば、M.Kamada さんのリンク集から M.Hiroi's Home Page へ来た場合、リファラーには M.Kamada さんのリンク集の URL が記録されます。ようするに、リンク元のページがわかるわけです。ただし、この手のアクセス解析は JavaScript が ON になっていないと情報収集できません。また、画像をロードしないテキストブラウザでは、アクセス解析どころかカウンターそのものが動作しません。したがって、アクセス解析の結果は正確な値ではなく、おおよその傾向がつかめる程度だと思われます。

「すごい!!カウンター」を使い始めてから、まだ1週間もたっていませんが、リファラーを見ていて気がついたことがあります。リファラーの約半分が bookmark だったのですが、それ以外では検索サイト、特に Google から来られる方が多いのには驚きました。その中で google.yahoo.co.jp という URL を見つけました。ヤフーはディレクトリ型の検索サイトですが、キーワードがヒットしない場合は、ほかの検索サイトを呼び出して結果を表示します。今までは goo を呼び出していたのですが、4 月 16 日から Google に変更されました。goole.yahoo.co.jp は、ヤフーから Google を呼び出して結果を表示した場合の URL なのです。4月中旬ごろ M.Hiroi's Home Page のアクセスが急に増えたことがありました。不思議に思っていたのですが、どうやらこれが原因だったようです。

M.Hiroi はもっぱら Google を使って検索していますが、一般的によく利用される検索サイトといえば、やっぱりヤフーなのでしょうね。ヤフーの影響力が大きいことを改めて実感しました。ほかの検索サイトでは、 M.Hiroi's Home Page がウェブガイド(ディレクトリ)に登録されているライコスが多く、あとはインフォシークが数件といったところです。もっとも日数がまだまだ少ないので、今後ほかの検索サイトもリファラーに記録されるだろうと思います。

それから、当然ですがリンクしていただいているホームページから来られる方も多いです。リファラーを見ていると、リンクのありがたさを本当に実感します。改めまして、ホームページ管理者の皆様に感謝いたします。また、Prolog のアクセス数が増えて不思議に思っていたのですが、神戸大学 Prolog ホームページ にある Prolog 入門 のページで M.Hiroi's Home Page がリンクされていました。リンクしていただけるとは思ってもいなかったので、とても嬉しいです。田村直之助教授に厚くお礼申し上げます。

そして、なによりも M.Hiroi's Home Page へ来てくださる皆様に大感謝です。これからもがんばりますので、よろしくお願いいたします。


2001 年 4 月

4月28日

カウンターの話です。M.Hiroi's Home Page には 5 つのメインコンテンツがあり、それぞれのトップページにフリーのカウンターをつけています。今までは、会津大学にあるホスト上でサービスが行なわれている フリーアクセスカウンター を使用していましたが、本日から すごい!!カウンター に切り替えました。

カウンターの種類(画像)は「フリーカウンター」の方が多いのですが、M.Hiroi の関心が「アクセス解析」の方に向いていたことと、「すごい!!カウンター」は無料&アクセス解析付きでありながら、広告バナーが付かないというジオシティーズにはぴったりの仕様だったので、乗り換えることにしました。ただし、将来テキスト広告が付く予定があるそうなので、ジオシティーズの規約に違反することになれば取り外すことになるでしょう。

フリーカウンターには大変お世話になりました。ここは学生のボランティアで運営されていて、非営利目的であれば誰でも無料で利用することができます。今まで本当にありがとうございました。

4月24日

深井康行さんのホームページ 人生、気合いと具合 ver 2.0 と相互リンクが実現しました。大感謝です。

本日、カウンタが 15,000 を突破しました。リンクしていただいているホームページ管理者の皆様、そして、なによりも M.Hiroi's Home Page に来てくださる皆様に厚くお礼申し上げます。このホームページには5つのメインコンテンツがあり、それぞれのトップページにフリーのカウンタをつけています。ここ 10 日間の平均アクセス数は次のようになりました。

表:最近 10 日間の平均アクセス数
TOPX68kTcl/TkxyzzyPuzzleProlog
73/day27/day15/day37/day13/day31/day

先週はアクセス数がとても多くて、1 日で 90 Hit (トップページ) 以上したことが 4 日もありました。特に、Prolog Programming のアクセス数が跳ね上がったのには驚きました。ちなみに、3 月の平均アクセス数はトップページで 63 Hit なので、平均アクセス数はいつもより多い結果となりました。たくさんアクセスしていただき、とても嬉しく思います。M.Hiroi's Home Page が少しでも皆様のお役に立てれば幸いです。

これからもがんばりますので、よろしくお願いいたします。ご意見やご感想、ご要望などありましたら、お気軽にメールやゲストブックでお知らせください。

4月19日

『自転車創業』から発売予定の Windows 用新作ゲーム『空の浮動産』ですが、マスターアップが完了したとのことです。発売日は 2001 年 5 月 4 日です。とても楽しみですね。みかぜさん、お疲れ様でした。

4月17日

M.Kamada さん の掲示板で、パズルを出題させてもらいました。パズルの詳しい内容は、M.Kamada さんが 日記 で丁寧に説明されています。M.Kamada さん、どうもありがとうございます。興味のある方は、ぜひチャレンジしてみてください。

4月14日

ビットの数え方の話です。ようするに、整数値を 2 進数で表した場合、1 になるビットの数を求める方法のことです。C言語の場合、実行速度を気にしないでよければ、次のように簡単にプログラムできます。

リスト:ビットオンをカウント(1)

int bit_count( unsigned int num )
{
  int i, c = 0;
  for( i = 0; i < 32; i++, num >>= 1 ){
    if( num & 0x01 ) c++;
  }
  return c;
}

unsigned int は 32 bit と仮定しています。まあ、いくら速度を気にしないといっても、これでは 32 回もループするので、この関数を頻繁に呼び出すのはちょっと考えものですね。1 ビットの数を高速に求める場合は、次のようにテーブルを使うといいでしょう。

リスト:ビットオンをカウント(2)

int bit_count( unsigned int num )
{
  static char count_table[256] = {
    0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4,
    1,2,2,3,2,3,3,4,2,3,3,4,3,4,4,5,
    1,2,2,3,2,3,3,4,2,3,3,4,3,4,4,5,
    2,3,3,4,3,4,4,5,3,4,4,5,4,5,5,6,
    1,2,2,3,2,3,3,4,2,3,3,4,3,4,4,5,
    2,3,3,4,3,4,4,5,3,4,4,5,4,5,5,6,
    2,3,3,4,3,4,4,5,3,4,4,5,4,5,5,6,
    3,4,4,5,4,5,5,6,4,5,5,6,5,6,6,7,
    1,2,2,3,2,3,3,4,2,3,3,4,3,4,4,5,
    2,3,3,4,3,4,4,5,3,4,4,5,4,5,5,6,
    2,3,3,4,3,4,4,5,3,4,4,5,4,5,5,6,
    3,4,4,5,4,5,5,6,4,5,5,6,5,6,6,7,
    2,3,3,4,3,4,4,5,3,4,4,5,4,5,5,6,
    3,4,4,5,4,5,5,6,4,5,5,6,5,6,6,7,
    3,4,4,5,4,5,5,6,4,5,5,6,5,6,6,7,
    4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8,
  };
  return  count_table[(num >> 24) & 0xff] + count_table[(num >> 16) & 0xff]
        + count_table[(num >> 8) & 0xff] + count_table[num & 0xff];
}

配列 count_table は、1 バイト整数に含まれる 1 ビットの数を表しています。このテーブルは xyzzy Lisp で作成しました。Common Lisp には、ビットの数をカウントする関数 logcount が用意されているので、簡単に作成することができます。あとは、1 バイトずつビット数を求めて足し算すればいいわけです。

実は、もっと凝ったアルゴリズムがあって、フィンローダ氏初級C言語Q&A(15) で紹介されています。なんとまあ、凄い方法を考える方がいるものですね。

4月7日

Puzzle DE Programming で出題した「スライディングブロックパズル」ですが、すでに解かれた方がいらっしゃいます。M.Kamada さん日記 で書かれているように、このパズルは最小 48 手で解くことができます。また、Y.H さんからは、結果と感想のメールをいただきました。どうもありがとうございます。

4月3日

昨日から「Prolog Programming」を再開しました。とりあえず、基本的な探索アルゴリズムである「深さ優先探索」と「幅優先探索」を説明して、いろいろなパズルを解いてみたいと思います。その間に、「キュー (queue) 」や「二分木」など基本的なデータ構造を説明する予定です。Prolog の場合、深さ優先探索(=バックトラック)はとても簡単にプログラムできますが、幅優先探索はちょっとした工夫が必要になります。また、キューにしても、実装や使い方が他のプログラミング言語と少し異なっています。Prolog 独特の機能やプログラムを紹介できるようにがんばりますので、これからもよろしくお願いします。


2001 年 3 月

3月31日

とうとう、私のところにもウィルスメールがやってきました。題名無し、本文無し、EXE ファイル添付だったので、たぶん HYBRIS でしょう。メールヘッダを見ると送信元の情報が無かったので、さすがウィルスだと妙なところで感心してしまいました。

3月26日

「Tcl/Tk GUI Programming 応用編」は、当初予定していた内容を全部公開したので、ここで区切りをつけたいと思います。このほかにも Tcl/Tk にはいろいろな機能があり、双方向パイプやソケット、Windows であれば DDE など、通信関連には面白そうな機能が標準で用意されています。また、Tcl/Tk の機能を拡張するライブラリも多数公開されているので、それらを使ってみるのも面白いと思います。これらの話題は、浦野さんの Tcl/Tkなもなもラボ で詳しく説明されていて、とても参考になります。

Tcl/Tk 関連はひとまずお休みして、しばらく更新していなかった Prolog Programming を再開する予定です。準備にちょっと時間がかかるかもしれませんが、M.Hiroi の大好きなパズルを題材に、いろいろなプログラムを作ってみようと考えています。また、SWI-Prolog はデバッグ関連の機能も充実しているので、その使い方を説明できたらいいな、と思っています。

間違い算の続きです。M.Kamada さんが出題された「間違い算」ですが、25 日の日記 で正解が発表されました。コンピュータを使わずに手で解く方法も紹介されていて、「あっ!(ここでポンと手を打つ)、なるほど納得」と感心しました。

3月24日

間違い算のはなしです。未菜実氏の 数理パズル入門 では、「計算が間違えても答えが同じになる、変な数」を 間違い算 と呼んでいます。たとえば、16×4 = 1×64 や 19×5 = 1×95 などがあるそうです。

M.Kamada さんの 日記 で面白い「間違い算」が出題されています。問題は、「A * BCDE = AB * CDE が成立する 1 から 9 の数字の組み合わせを探す」というもので、異なる文字に同じ数字をあてはめても構わないそうです。面白いパズルを考えられた M.Kamada さんに大感謝です。

自分の頭で考えてもさっぱりだったので、Perl でプログラムしちゃいました(笑)。

リスト:単純な総当たりによる検索

sub machigai {
  my $count = 0;
  foreach $a (1..9) {
    foreach $b (1..9) {
      foreach $c (1..9) {
        foreach $d (1..9) {
          foreach $e (1..9) {
            my $r1 = eval "$a * $b$c$d$e";
            my $r2 = eval "$a$b * $c$d$e";
            if( $r1 == $r2 ){
              $count++;
              print "$count : $a * $b$c$d$e = $a$b * $c$d$e\n";
            }
          }
        }
      }
    }
  }
}

力任せの、めっちゃ簡単なプログラムです。「美しくない」と感じられる方は、枝刈りを工夫してみてください。ここで答は書きません。興味のある方は考えてみてくださいね。

3月20日

リバーシの続きです。今度は有段者クラスの実力と評価されているリバーシと対戦させてみました。

どちらのリバーシもフリーウェアです。このクラスのリバーシになると序盤の定石は当たり前で、中盤では十数手以上の先読みを行う場合もあるそうです。プログラムの動作については、コンピュータリバーシ研究会 の 強いオセロプログラムの内部動作 が参考になります。

それでは対戦結果を示します。前回の結果と比較するために、Bear と M.Hiroi を加えて総当たり2回戦を行いました。Bear と M.Hiroi の思考ルーチンは前回と同じレベルです。

表:リバーシ対戦結果(2)
M.Hiroi Bear RunothBooby石差
M.Hiroi
------負:-6
負:-12
負:-12
負:-36
負:-28
負:-18
-112
Bear
勝:+12
勝:+6
------負:-12
負:-16
負:-8
負:-30
-48
Runoth
勝:+36
勝:+12
勝:+16
勝:+12
------負:-6
負:-8
+62
Booby
勝:+18
勝:+28
勝:+30
勝:+8
勝:+8
勝:+6
------+98

いやー、さすがに Booby と Runoth はメチャクチャ強いです。Bear が大敗するくらいですから、M.Hiroi's Reversi はもうボロボロです(苦笑)。レベルというか、次元の違う強さといえるでしょう。それから、Booby と Runoth は思考時間が長いのではないかと思っていたのですが、予想以上に高速なのには驚きました。Pentium 166 MHz というオンボロマシンでも、思考時間は平均すると1試合で 15 分くらいでした。うーん、凄すぎます。レベルの違いに唖然としてしまいました。興味のある方は、ぜひ対戦してみてください。

3月16日

またまたリバーシの話です。ゲストブックで紹介した Nabe's Reversi (作者:T.Watanabe 氏) ですが、普通のリバーシ (8 * 8 盤) はどの程度の強さなのでしょうか。そこで、次に示すフリーウェアのリバーシと対戦させてみました。

Nabe's Reversi は最高レベルの Level 9 を使いますが、先読みや読み切りなどの詳細は不明です。結果は次のようになりました。

表:リバーシ対戦結果
Hiroi LL NabeBear石差
Hiroi
------勝:+48
勝:+4
負:-6
負:-10
負:-6
負:-12
+18
LL
負:-4
負:-48
------勝:+20
勝:+24
負:-26
負:-2
-36
Nabe
勝:+10
勝:+6
負:-24
負:-20
------負:-22
負:-44
-94
Bear
勝:+12
勝:+6
勝:+2
勝:+26
勝:+44
勝:+22
------+112

ベアの完勝です。あとは三すくみのような状態ですが、負けた時に大敗しなかった M.Hiroi's Reversi が、石差でほかのリバーシを上回りました。まあ、ベア以外のリバーシはどんぐりの背比べというか、実力的にはほぼ互角ではないでしょうか。リバーシに興味のある方は、実際に対戦して強さを確かめてみてください。

3月12日

xyzzy が version 0.2.1.186 にバージョンアップしました。xyzzy ML で亀井さんから以下のお知らせがありました。

従来のバージョンはかなり致命的な問題があるので、なるべく新しいのを使ってください。

xyzzy ユーザーはバージョンアップしましょう。M.Hiroi はけっこう古いバージョン (0.2.1.174) のまま使っていましたが、今回はバージョンアップしないといけませんね。

3月6日

リバーシの話です。SUCESS から発売されたPS2向けリバーシソフト「超高速リバーシ」が、日本リバーシ協会 で紹介されています。それによると、このソフトには 8×8 マスのスタンダードリバーシのほかに、パーフェクトリバーシ (Perfect Reversi) とオクトリバーシ (Octo Reversi) という二種類の変形版リバーシが含まれています。日本リバーシ協会は「派生リバーシ (Derivative Reversi) 」と呼んでいます。パーフェクトリバーシは盤を 10×10 に拡張したもので、オクトリバーシは 10×10 盤の 4 つのコーナーから 3 マスを削った八角形盤を使います。

変形版リバーシならば M.Hiroi もいくつか作ったことがあります。マスの形が六角形の「六角リバーシ」や 8×8 盤の 4 つのコーナーから 1 マスを削った「八角リバーシ」、そして、TAU さんが作成されたマス(石)の形が三角形の「三角リバーシ」が M.Hiroi's Home Page で公開されています。実は、X68000 用ですが 10×10 盤のリバーシも作ったことがあり、月刊・電脳倶楽部に掲載されました。M.Hiroi は「ビッグリバーシ」と呼んでいます。そういえば、ビッグリバーシはずっと準備中のままで、アップするのをすっかり忘れていました(苦笑)。思考ルーチンをちょっと見直してからアップしようと思います。

パーフェクトリバーシはどの程度の強さなのか、興味があります。また、オクトリバーシは八角リバーシより一回り大きくて面白そうですね。ところが、M.Hiroi はPS2を持っていません。しょうがないので、オクトリバーシは自分で作ってみようかな。おっと、その前に三角リバーシのバージョンアップをしないといけませんね(笑)。

3月2日

[KaMemo]
search-twoのeval-exprの引数は? とか。

およよ、またやってしまいました。xyzzy Lisp:パズル「Four Four's」のプログラムリストのところです。

eval-expr の引数 expr がねーじゃん(怒)! [(C) Toy]

ソースとドキュメントの不一致とは情けないにょー(反省)。さっそく修正しました。亀井さんに感謝だにょ。


2001 年 2 月

2月28日

『自転車創業』から発売予定の Windows 用新作ゲーム『空の浮動産』ですが、発売日が延期されました。マスターアップした時点で改めて発売日を告知するそうです。これが最後の延期とのことなので、楽しみに待っていましょう。

M.Kamada さんの 日記 によると、元・満開製作所スタッフの中村(兄)さんが結婚されたそうです。ご結婚おめでとうございます! 拙作の「続・サルでも書けるCプログラム講座」は、中村さんが月刊・電脳倶楽部で執筆された「サルでも書けるCプログラム講座」がなければ、書かれることはなかったでしょう。また、X68030 と CD-ROM を接続する時に、SCSI 関連のトラブルで大変お世話になりました。末永くお幸せに。

それから、元・満開製作所スタッフの舩本昇竜さんのページ(仮)が紹介されています。本物はおあずけということなので、正式公開がとても待ち遠しいですね。

2月26日

例外処理の話です。Tcl では return でも例外が発生することを説明しました。ずいぶん変わった使い方だと思っていましたが、ほかのプログラミング言語にもありました。きだあきら氏のコラム「千言万語」(Cマガジン3月号)によると、Modula-3 という言語でも return を例外として扱っているそうです。

Modula-3 は、Modula-2 の思想を受け継いで新規に設計された言語だそうです。Modula-2 は Pascal で有名な Niklaus Wirth 氏が設計した言語ですが、Modula-3 という言語は初耳でした。そこで、Google で検索してみると、Modula-3 は DEC と Olivetti が開発したシステム記述言語のようです。ちなみに、Wirth 氏は Modula-2 の後継として、Oberon という言語を開発しています。それにしても、return を例外として扱う言語が Tcl 以外にもあるとは、ちょっと驚きました。

2月22日

Tcl の話です。Tcl の例外処理にはちょっと変わったところがあります。エラー処理の場合、Tcl ではコマンド catch と error を使います。error でエラーを発生させて、catch でそれを捕まえます。

catch command [var]

catch は command を実行し、エラーがなければ 0 を返します。エラーが発生した場合は 1 を返し、変数 var が指定されている場合は、その変数にエラーメッセージを格納します。簡単な例を示しましょう。

% catch {error "error test"} msg
1
% puts $msg
error test

ここまでは普通ですね。Tcl の例外処理がユニークなところは、error 以外のコマンド return, break, continue でも例外が発生することです。

% catch {return "exception!"} msg
2
% puts $msg
exception!

catch は return の例外を捕捉すると 2 を返し、変数には return の返す値がセットされます。break の例外は 3 で、continue の例外は 4 を返します。この場合、変数には空文字列がセットされます。

Tcl の場合、return の例外はプロシージャ(関数)で捕捉されるため、プロシージャの中で return を実行すれば、その値がプロシージャの返り値となります。break と continue の例外は、繰り返しのコマンド (while, foreach, for) で捕捉されます。また、Tcl の return は値を返すだけではなく、すべての例外を発生させることができます。

return -code code 値

オプション -code を指定することで、任意の例外を発生させることができます。-code には、ok, error, return, break, continue のほかに、任意の整数値を指定することができます。簡単な例を示しましょう。

% proc my_error {code} {return -code $code}
% catch {my_error error}
1
% catch {my_error break}
3
% catch {my_error 10}
10

例外の発生に return を使うとは M.Hiroi もびっくりです(笑)。また、break と continue が例外として実装されているところもユニークですね。まあ、Tcl/Tk でふつうにプログラミングするならば、例外の発生に return を使うことはほとんどないでしょう。

Tcl はアプリケーションに組み込むためのコマンド言語ですから、簡単に拡張できるように設計されています。たとえば、新しい制御構造を Tcl だけで簡単に作成することができます。このような場合、catch と return がとても役に立ちます。コマンドの拡張性を考えた結果、このような例外処理になったのでしょう。Perl の例外処理では、eval の使い方がちょっと変わっていましたが、Tcl の return はそれ以上ですね(笑)。

2月18日

検索サイトの話です。今まで、いくつかの検索サイトに URL 登録を行いましたが、それでも M.Hiroi's Home Page がヒットしないサイトに Excite がありました。先日、ひさしぶりに検索してみたところ、驚いたことに M.Hiroi's Home Page で多数のページがヒットしました。Excite では 2 月 15 日から検索システムを更新し、新たに「リンクネット方式とアンカーテキスト解析」を導入したため、M.Hiroi's Home Page がヒットするようになったようです。リンクネット方式の説明を読むと、Google の検索システムと似ているように思いました。

このほかに、「翻訳検索」といって日本語のキーワードを英語に翻訳して海外のページを検索し、その結果を日本語で表示する機能があります。また、ホームページの内容を翻訳する「ウェブページ翻訳」や、入力した文章を翻訳する「テキスト翻訳」などの Excite 翻訳 もバージョンアップされています。翻訳には時間がかかる場合もありますが、なかなか面白いサービスだと思います。

2月8日

本日、カウンタが 10,000 を突破しました。ホームページを開設した時、10,000 Hit は夢のような数字だったのですが、皆様のおかげで開設してから7ヶ月で 10,000 Hit を達成することができました。相互リンクしていただいているホームページ管理者の皆様、そして、なによりも M.Hiroi's Home Page に来てくださる皆様に厚くお礼申し上げます。これからもがんばりますので、よろしくお願いいたします。ご意見やご感想、ご要望などありましたら、お気軽にゲストブックへ書き込んでください。もちろんメールも大歓迎です。

2月4日

例外処理の話です。例外はエラー処理で使われることがほとんどなので、「例外=エラー処理」と考えてもらってもかまいません。xyzzy Lisp Programming で書きましたが、Common Lisp には コンディション という例外処理があります。最近ではC++, Java, Perl, Tcl, Ruby など、例外処理を持っているプログラミング言語が多くなりました。この中で Perl の例外処理はちょっと変わっています。

Perl の例外処理は eval を使います。eval は文字列が与えられると、それを Perl のプログラムとして評価します。ところが、文字列のかわりにブロック ( { } で囲まれたプログラム ) を与えると、eval は例外処理の働きをするのです。具体的には、ブロックで発生したエラーを捕まえることができます。次のプログラムを見てください。

eval {
  $a = 100;
  $b = 0;
  $c = $a / $b;
};
print $@;
print "end\n";
----- 実行結果 -----
Illegal division by zero at test.pl line 4.
end

通常、エラーが発生するとその時点でプログラムは終了しますが、eval でエラーを捕捉したため、プログラムは最後まで実行されていることがわかります。エラーが発生した場合、その内容を表す文字列が変数 $@ にセットされます。ノーエラーの場合、$@ の値は未定義となります。

eval によるエラーの捕捉は、システム内部で発生するエラーだけではなく、die を使ってユーザーが生成したエラーも捕まえることができます。

eval {
  die "user error !!\n";
};
print $@;
print "end\n";
----- 実行結果 -----
user error !!
end

このように、die で発生したエラーも捕まえることができます。この時、$@ には die のメッセージがセットされます。

ここで、Perl の eval は全てのエラーを捕捉することに注意してください。捕捉したエラーの種類は、$@ にセットされたエラーメッセージを調べてみないとわからないのです。たとえば、0で除算した計算は無視して次の計算へ進みたい場合、$@ の文字列が "Illegal division by zero" であることをチェックしないといけません。ほかの言語、たとえば Common Lisp やC++などでは、捕捉するエラーの種別を指定することができます。

まあ、ほかの言語に比べるとあまりスマートではありませんが、eval と die を使えば Perl でも例外処理をプログラムすることができます。

2月3日

立花えり子さんのホームページ 桑島技研Online と相互リンクが実現しました。大感謝です。


2001 年 1 月

1月31日

本日、Oh!X 2001 春号 が発売されました。拙作の記事も2つ掲載されています。ひとつは「Tcl/Tk によるミニミニゲーム集 Part 3」で、もうひとつが「パズルでプログラミング第1回~第3回」です。

ミニミニゲーム集は、ならべてポン、SEVEN、ブロックアップ、オクトリバーシの4本です。ならべてポンはカードを並べるパズルゲームで、SEVENとブロックアップはブロックを消していくパズルゲームです。オクトリバーシは8*8盤の角を取り除いた変形版リバーシです。よろしければ Tcl/Tk をインストールして遊んでみてください。

パズルでプログラミングは、マジックスター(六芒星)、おしどりの遊び、8パズルを題材にして、バックトラックの基本から幅優先探索、二分探索木とハッシュ法のアルゴリズムを説明しています。パズルだけではなく、プログラミングに興味のある方は読んでみてください。

1月30日

あいかわらず HYBRIS ウィルスが猛威をふるっているようです。JCSA-Japan Computer Security Associationアンチウィルス業界情報 には、ウィルス付きメールがメーリングリストに配信される、という被害が報告されています。

HYBRIS ウィルスのやっかいなところは、メールをやりとりしたことのない、まったく関係のない相手方から届く場合があることです。この特徴は、JCSA の あなたをスパマーにするワーム(W32/Hybris.B-m) に詳しく解説されているので参考にしてください。たとえば、HYBRIS ウィルスに感染しているパソコンで M.Hiroi's Home Page を閲覧した場合、メールアドレスを記載しているページがあるので、M.Hiroi のところに HYBRIS ウィルス付きのメールがくる可能性があるわけです。今のところ、幸いにして HYBRIS ウィルス付きメールを受け取ったことはありません。

1月13日にも書きましたが、HYBRIS ウィルスは添付ファイルを実行しなければ、感染することはありません。内容が不明の添付ファイルは不用意に実行しない、添付ファイルを実行する時にはウィルスチェックを必ず行う、といった注意が必要です。お互いウィルスには十分気をつけましょう。

1月27日

パズルの話です。M.Kamada さんのホームページ STUDIO KAMADA今日の日記 で、新しい切符番号の問題の出題されました。今回は10になる式だけではなく、1~30になる式を作ります。面白い問題なので、パズル好きの方は要チェックです。

Puzzle DE Programming で紹介した Four Four's や切符番号の問題は、古典的な数字のパズルですが実際に解いてみると面白いものです。ちょっとした息抜きや気分転換になるので、皆さんも挑戦してみてください。

X68000 用パズルゲーム『lumps』で、TAU さんが6連鎖20万点を達成しました。「無理やねん!」といいながらも実際にやってしまうとは、TAU さん凄いです! TAU LAND 2001謎の参考資料(?) に画像が掲載されています。それに、M.Hiroi 版三角リバーシ Lv 5 が、ケチョンケチョンにやられている画像もあります。思考ルーチン、そろそろバージョンアップしないといけませんね。

1月23日

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

卓さんのホームページ Taku's "X" Page "PENGUIN'S BAR" で、FREE素材集が新設されました。現在はFDのアイコンが8種類掲載されていますが、これから増やしていくそうです。とてもかっこいいので、興味のある方は PENGUIN'S BAR へゴーです。

ZooMark さんが作成中の X68000 用 X-BASIC リファレンスですが、コマンドと関数の入力が終了したそうです。ZooMark さんのホームページ ZooMark'z 極楽遊戯X-BASIC リファレンス にアップされています。リファレンスの作成、本当にご苦労様でした。

TAU さんの X68000 用新作パズルゲーム『lumps』が TAU LAND 2001 で公開されています。ブロックを消していくパズルですが、連鎖の仕組みがとてもユニークで面白いゲームだと思います。TAU さん恒例の「座談会(開発後記)」で、6連続で消すと20万点ぐらいいくことがある とありますが、実は机上の計算で TAU さんも出したことがないそうです。TAU さんによると、「6連続で毎回、13、4個消せば、20万点前後になるはずですが…、無理やねん! とのことでした。

1月19日

[KaMemo] values-list、とか

ほえー、またやってしまいました(苦笑)。今日アップした「xyzzy Lisp:複数の値を返す方法(多値)」の中で、value-list は values-list の間違いです。さっそく修正しました。亀井さんに大感謝です。

1月17日

ジオシティーズからのお知らせです。

2001年1月18日(木)、13:00から15:00まで、ネットワーク設備の増強作業を行います。このため、この時間帯Yahoo!ジオシティーズへアクセスできない状態になります。大変ご迷惑をおかけしますが、皆様のご理解ご協力をお願い申し上げます。

午後11時から午前1時ごろのテレホタイムになると、どこでも重くなるものですが、ジオシティーズでは接続できないことがたびたびありました。この増強作業によりアクセスが改善されることを期待しています。

ひさしぶりの大雪で、積雪がついに1mを突破しました。このため、我が家も十数年ぶりに屋根の雪降しを行いました。もうクタクタだにょ。

1月13日

コンピュータウィルスの話です。最近、メールを悪用したウィルスが広まっています。IPAセキュリティセンター の12月分報告によると、12月の届出件数は2778件と過去最多: メール悪用ウイルス蔓延!! 3ヶ月連続で過去最多を更新。メール悪用ウイルスが82%を占める。 とのことです。GeoCities の「助け合い広場」でもウィルスが話題になるくらいですから、猛威をふるっているのは間違いありません。

話題になったのは HYBRIS というウィルスで、差出人、件名、本文のない添付ファイルだけのメールを送信します。添付ファイルは実行形式(EXEファイル)でランダムな名前になっているため、うっかり実行すると感染してしまいます。逆に、添付ファイルを実行しなければ、感染することはありません。内容が不明の添付ファイルは不用意に実行しない、添付ファイルを実行する時にはウィルスチェックを必ず行う、といった注意が必要です。「自分のところは大丈夫だろう」とは思わずに、お互いに気をつけましょう。

1月9日

Perl の話です。Perl はとても便利なスクリプト言語です。特に、CGI スクリプトは Perl で書くことが常識になっているようで、書店にはその手の本が山と積まれています。Perl 5 になると、C言語のポインタに相当する リファレンスオブジェクト指向機能 が導入され、何でもありの汎用的なプログラミング言語になりました。Perl/Tk を使いこなすには、このリファレンスとオブジェクト指向の知識が必要になります。

リファレンスはC言語のポインタよりも安全で、Ver. 4 までは難しかった2次元配列や二分木などのデータ構造も簡単に実現できます。また、Perl のオブジェクト指向はリファレンスを土台に機能しています。とても便利な機能なのですが、初心者には使いこなすのがちょっと難しいかもしれません。Perl の参考書はたくさん出版されていますが、リファレンスやオブジェクト指向まで説明している入門書は少ないように思います。まあ、これらの機能を使わなくても CGI などのプログラミングはできるので、必須項目ではないのでしょう。

リファレンスを難しくしているのは、表記法に問題があるからだと思います。Perl はC言語以上に記号的なプログラミング言語といわれています。これも Perl の特徴で、慣れれば手間をかけずにプログラムを作ることができるのですが、このことで Perl を好まない人達もいます。リファレンスが導入されたことで、この記号的なプログラミングに拍車がかかりました。

たとえば、次のような「配列の配列」を考えてみましょう。

@foo = (
    [10, 20, 30],
    [40, 50, 60],
    [70, 80, 90],
);

Perl の場合、配列の0番目を取り出すには $foo[0] となります。この要素は無名の配列 [10, 20, 30] のリファレンスになっています。この配列の0番目の要素を取り出すのに、$$foo[0][0] と書いてはいけません。この場合、変数 $foo に格納されている値がリファレンスとして扱われるからです。ここは $ { $foo[0] } [0] と中カッコを使って、$foo[0] を評価するように書かないと駄目なのです。

これでは面倒だということで、矢印表記法 -> が用意されています。この場合、 $foo[0]->[0] と書くことできます。また、添え字が続く場合に限り、矢印を省略することができるので、 $foo[0][0] と書くことができます。矢印を使うことである程度は簡単になりますが、矢印はメソッドの呼び出しにも使われますね。このように、いろいろな書き方や省略方法があるため、これらをすべて理解するのは初心者にとって大変なことです。けっきょく、わけがわからないまま書き方だけを覚える、ということになりかねません。

もう少しわかりやすい表記法であれば、リファレンスはもっと使いやすくなったと思います。まあ、リファレンスやオブジェクト指向はあとから追加された機能ですから、どうしても整合性の取れない部分が残ってしまうのは、しかたがないことでしょう。C++ はあらゆる機能を詰め込んだため、とても複雑な言語になってしまいました。Perl にもその傾向があるようで、Ver 5.6 では多くの機能が導入されています。Perl がとても便利な言語であることは間違いありませんが、これ以上複雑な言語にはならないでほしいと思います。

1月5日

「お気楽 Prolog プログラミング入門」は、当初予定していた内容を全部公開したので、ここで区切りをつけたいと思います。もっとも、この入門講座で説明した機能は基本的なものばかりで、Prolog にはまだまだ面白い機能があります。

たとえば、限定節文法(definite clause grammar : DCG)という機能を使った構文解析は Prolog の重要な応用分野です。M.Hiroi は DCG に興味を持っていますが、DCG を説明するにはまだまだ力不足です。まあ、コツコツと勉強しながら、その成果をホームページで公開できればいいな、と思っています。また、Prolog によるパズルの解法や思考ゲームなど、Prolog でプログラミングしてみたい題材はいろいろあるので、面白いプログラムができたら公開する予定です。

今までのように、ほぼ定期的に Prolog Programming を更新することはできないでしょうが、M.Hiroi が Prolog に興味を無くしたわけではありません。これからも見に来ていただけると嬉しいです。もしかすると、面白いプログラムがあるかもしれませんよ(笑)。

Prolog Programming へのご意見やご要望などありましたら、お気軽にゲストブックやメールでお知らせくださいませ。

1月1日

あけましておめでとうございます。

旧年中は大変お世話になりました。
本年も M.Hiroi's Home Page をよろしくお願い申し上げます。

新世紀ということで、新しいプログラミング言語に挑戦するのも面白いかな、と思っています。M.Hiroi が興味を持っているプログラミング言語をいくつか紹介しましょう。

オブジェクト指向言語では Ruby が面白そうです。Ruby は、まつもとひろゆき氏によって開発されたスクリプト言語で、すべてのデータをオブジェクトとして扱うことができます。このあたりは Smalltalk のようで、非常にすっきりとした設計になっています。クラスは単一継承ですが、そのかわりに Mix-in という機能があり、複雑な多重継承よりも使いやすく便利だと思います。このほかにも Python というオブジェクトスクリプト言語が有名です。

関数型言語では、scheme やそれをベースにした Guile があります。どちらも Lisp の方言ですが、それ以外では ML という言語が面白そうです。ML は Meta Language という意味です。Lisp の場合、データに型はありますが、変数に型はありません。これに対して、ML は強く型づけされた言語で、コンパイル時に多くのエラーを検出することができます。

面白いのは ML が型を推論することです。つまり、プログラムから各変数が持つ型を見つけてくれるのです。できない場合は、変数の型宣言を要求します。このほかにも多相型といって、ひとつの関数で異なるデータ型の引数に対応することができます。M.Hiroi は、まだ ML を使ったことがないので、そのうちに試してみたいと思っています。

Web 関連となると、やっぱり Java や JavaScript になるでしょうか。パズルゲームなどの場合、多くの方に遊んでもらうことを考えると、Java で作って Web 上で実行できるようにした方がいいのでしょうね。高橋さんの「コンピュータ&パズル」をお手本にして、Tcl/Tk で作成したゲームを Java に移植できたらいいな、と考えています。まあ、考えているだけなので、あまり期待はしないでくださいね(笑)。

いろいろ書きましたが、この中で新しい言語をひとつ覚えることができたらいいな、と思っています。


Copyright (C) 2001 Makoto Hiroi
All rights reserved.

[ Home ]