2003年10月10日
川俣晶の縁側ソフトウェアMagSite1開発日誌 total 2321 count

バグとWebアプリケーションならではのもどかしい制約

Written By: 川俣 晶連絡先

 今日、継承に関する話を1つオータムマガジンに書きましたが、その理由はこれを書きたかったからではありません。本当は忙しいので、こんなものを書いている暇はないはずでした。忙しい理由は、もちろんMagSite1のMagMLの実装です。

 では、なぜ継承の話を書いたのか。それは、かなりコンテンツへのアクセスカウントが上がっているにもかかわらず、新規コンテンツが数日無くて、読みに来る読者に申し訳ないからでした。

 しかし、MagSite1に原稿を作成して、「書き込む」ボタンをクリックしたら、なんと例外を吐いて落ちてしまいました。これはびっくり! こんな現象は初めてです。

 ともかく忙しいけれど、作業が一段落した時点で調査を始めました。

 途中の経過を略して結果だけ書くと、ある便利な機能が悪さをしていることが分かりました。

 現在のMagSite1は、コンテンツの新規作成を行うと、空のコンテンツファイルを作成します。中身を書き込んで確認ボタンを押したりすると、このファイルに中身が入って行きます。これらのファイルから管理メニューのドラフトのコンテンツリストが作成されます。

 しかし、うっかり間違って新規作成をクリックしてしまい、慌てて戻るボタンをクリックすると、空のコンテンツファイルが残ったままになります。(本来は、破棄して終了ボタンを押して戻るべき局面)

 こんなことを繰り返すと管理メニューに空のコンテンツがいくつもリストされて邪魔だろう、ということで、管理メニューを作成するときに、空のコンテンツを削除するようになっていました。

 ところが、ある順番で操作すると、この機能が重大な問題を引き起こします。

 まず、Webブラウザを2枚開きます。1枚で新規コンテンツの作成を開始し、空のコンテンツファイルが存在する状態にします。そして、2枚目のWebブラウザで管理画面を開きます。この時点で、空のコンテンツファイルは削除されてしまいます。

 そのまま新規コンテンツの作成を続けると、あるはずのファイルが無いため、エラーになって落ちるという訳です。

 以上が症状の顛末です。

 問題は、これをどう解決するか、ということですが。

 放置された空のコンテンツファイルと、今まさに編集作業中の空のコンテンツファイルを区別することはできません。編集はクライアントサイドで行われる作業ですが、それをサーバ側で確認する手だてはないのです。Webアプリケーションならではのもどかしい制約と言えます。

 というわけで、今回は、残念ながら空のコンテンツを削除する機能は取り除くことにしました。

 まあ、基本的には、「破棄して終了」ボタンを使ってくれれば問題にはならないことですし、残った空のコンテンツファイルを削除する手順も簡単なので、これで良しとしましょう。

 おそらく、リッチクライアントの技術を使えば、こういう悲しい状況に陥らない管理も実現できると思いますが、これは次バージョンの課題ということにします。