Amazonでボードゲームを探す

構築4

フロントエンド部分と接続するために、 分析においてRubyで作ったプログラムを修正します。

合わせて、プログラムの不備がないか、あらためてプログラムのテストをします。

CGIによるプログラムは、クライアントとGETまたはPOSTメソッドによるHTTPプロトコルでメッセージをやりとりします。ここでは、POSTを使って、通信しますが、サーバー側プログラムは、RubyのCGIライブラリが、どちらのプロトコルもよろしく扱ってくれるので、 細かいことを気にする必要はありません。

fileindex.cgi
CGIの中心となるクラスです。今までは使っていなかった、Rubyのライブラリを使って、HTTP通信やCGI特有のデータ受け渡しをしています。

CGIにアクセスしてきたプログラムと、サービス提供が適切におこなわれているかを知るために、logを吐き出すようにプログラムを組んでおきます。プログラムに不備があった場合の痕跡と、望まないアクセスに見舞われた時にも証拠が残ります。

index.cgiは、二つのコマンドリクエストを処理します。

  1. init 山の数を引数として、nimボードの山を初期化します
  2. next ルール, AI, 山 を引数として、次の手と山の状態、勝敗を返します RubyのCGIライブラリを使って開発すると、クライアントからいちいち接続しなくても、 コマンドラインベースで、プログラムを実行してGETやPOSTのパラメーターを渡しながら 動作の確認ができます。ここで、開発したプログラムの場合、
./index.cgi

を実行し、後の

(offline mode: enter name=value pairs on standard input)

メッセージに続いて、プログラム中で

cmd=init
nm=4
Control-D    <-- Unix系のOSの場合

とすれば、山4個の初期化を確認できます。

説明が前後しましたが、クライアントへの返り値は、簡便なXML形式で送信することにします。

filenim_ui.rb
CGIとnimエンジンを仲介するクラスです。ネットワークアプリケーションは、インターフェース部分に、問題が集中しやすいので、他の部分の動作をきちんと確認してから、インターフェースを作るのがコツです。
filenim_ai1.rb, filenim_ai2.rb, filenim_ai3.rb, filenim_ai4.rb
最後に、できるだけ厳密なデバッグをしておきます。いままでにテストしていなかった、山の配置や手順を評価します。
filenim_board.rb
前回までに作成したものを、ほとんどそのまま用います。
filenim.rb, filenim_ui_testmain.rb
これら二つのプログラムは、デバッグ用に使います。cgiプログラムの、httpアクセス機能や、RubyのCGIパッケージを使ったインターラクティブデバッグ機能を使わずに、迅速なテストをするのが目的です。nim.rbは、これまで同様、全体的な動作の確認に使います。nim_ui_testmain.rbは、新しく作ったnim_ui.rb (NimUIクラス)の確認用に使います。
filenim_human.rb
今回は、デバッグ用にのみ使います。このクラスを作っておかないと、テストのために多くの労力を割く必要がありました。分析フェーズで作っておいた成果です。

プログラムの動作を確認してみると、正型nimのAIに問題が見つかりました。 山が、残り一つになったときに、AIは必勝手順を指さない作りになっていましたので、 プログラムを修正します。

ほとんど、分析のときに作成したプログラムをそのまま使っていますが、CGI としての動作部分や、エラーや異常値に対しての処理を加えることで、安定的な 動作を確保するようにしています。内部の動作や、プログラム上の技術について、 細かい部分の解説はしませんので、 興味のある人はプログラムのソースを確認してみてください。

swfからサーバーへのアクセスについて

Flashアプリケーションから、サーバーへのアクセスは、 セキュリティ上の観点から標準状態では無差別なアクセスができなくなっています。 開発中は、CGIを配置するサーバーと、開発マシンとの間でネットワーク通信が 必要になります。そのため、swfファイルからCGIへのアクセスを認めるように、 以下のような、crossdomain.xmlをDocmentRootに配置する必要があります。

<!DOCTYPE cross-domain-policy SYSTEM "https://www.macromedia.com/xml/dtds/cross-domain-policy.dtd">
<cross-domain-policy>
   <site-control permitted-cross-domain-policies="all" />
    <allow-access-from domain="*" />
</cross-domain-policy>

ここに設定したcrossdomain.xmlは、 どこからもアクセスできる状態になっていますので、 悪意のあるFlashプログラムによって、予期しない情報漏洩が おきるかもしれませんので、適切なサイトからのアクセスだけに 絞って設定をするように、適宜書き換えて使ってください。


...つづく (2009/6/1)

SEE ALSO

Last-modified: 2014-08-23 (土) 17:58:48