犬ぶよツールズ制作記録

Javaによる研究生活のためのパッケージ、犬ぶよツールズ。
その開発と保守のための備忘録

犬ぶよ数独そるばー

2011-10-12 17:07:50 | Weblog
● 概要
与えられた数独を解くプログラムです。

● 要件
+ Java実行環境1.4以上

● ライセンス
フリーです。

● インストール
次のファイルをダウンロードして適当なディレクトリに置きます。
+ sdk1.0.0.jar
+ jp.inubuyo.bone.ddsv-0.2.1.jar (問題をファイルから読む場合に必要。)

● インストールの確認
ターミナル(Windows OSならコマンドプロンプト、Mac OS Xならターミナル、Linuxなら端末、など)で、
ダウンロードしたファイルに行き、次のコマンドを打ちます。

java -cp sdk1.0.0.jar sdk.Sudoku

次のようなメッセージが出れば成功です。

USAGE :
1 arg : line3
2 args: [option] filename
Options are: -3, -d


● 使い方・1
コマンドに問題を指定します。
例えば、


java -cp sdk1.0.0.jar sdk.Sudoku 000000010400000000020000000000050407008000300001090000300400200050100000000806000


とすると、

のように、問題と解いた結果が表示されます。


● 使い方・2
ファイルに問題を書いておきます。
例えば、中身が1行で、


000000010400000000020000000000050407008000300001090000300400200050100000000806000


となっているファイル「test.txt」があるとします。


java -cp jp.inubuyo.bone.ddsv-0.2.1.jar:sdk1.0.0.jar sdk.Sudoku -3 test.txt

とすると、
コマンドに問題を指定したのと同様の結果が表示されます。


TCPクライアント用のクラス(ClientPort)

2011-10-12 14:41:16 | Weblog
● 概要
TCPクライアントは、ポートを開くソケットを使って教科書通りに作れます。
ソケットの使い方や通信状態の変化の仕方は、普通のTCPクライアントでは共通です。
そこで、TCPクライアントを作るときに簡便に使えるクラスを作りました。
ClientPortクラス(jp.inubuyo.bone.tcp.ClientPort)です。

● 背景
TCPクライアントはソケットを使ってTCPサーバーと通信します。
TCPクライアントは一般に、サーバーに接続している状態と接続していない状態の間を遷移します。

次の図はこのことを表しています。

「No Connection」が接続していない状態、
「Connected」が接続している状態です。
図には他の状態も記されています。
上の円は初期状態、右の円は終状態です。
一番下の「Disconnected*」は、接続が切れた後の処理をしている状態です。
この状態は処理が終わり次第「No Connection」に遷移するので「*」を付けてあります。

ソケットは、この状態遷移の仕方に従います。
ソケットをオブジェクトとして捉えれば、そのオブジェクトの一生がこの状態遷移に当てはめられます。
ただひとつのソケットを扱うTCPクライアントの状態も、この状態遷移に当てはまります。
TCPクライアントに依って異なるのは、
接続している間にどんなデータをサーバーとやりとりするかという点だけで、
この状態遷移は同じです。


● 汎用可能な状態遷移
ソケットの状態遷移に基づいて、TCPクライアントのための実用的なオブジェクトの状態遷移を考えます。
それは次のようになります。

「Connected」の中がさらに分かれます。
サーバーとクライアントの間で対話が成り立つよう準備をする「Negotiation」、
通常の対話を続ける「Talking」、
対話を終了する「Talking End*」です。

始めと終わりの「Negotiation」と「Talking End*」は、
対話の内容に依ってはTCP接続を切断することがあるプロトコルに対応するためのものです。
それが無い単純なプロトコルでは、この2つは不要です。

● エラー処理を含めた状態遷移
TCP通信では、ハードウェアで、OSで、あるいはソフトウェア内で例外が発生することがあります。
TCPクライアントはこれら発生源のレベルが異なるエラーに対応しなければなりません。
実際のTCPクライアントのエラー処理は様々なものが可能ですが、
状態遷移の観点からは特定の状態遷移に対応づけられます。
エラー処理は、このオブジェクトの顧客が行ないますが、
それに伴う状態遷移を顧客の求めに応じて実現しなければなりません。

実用性があると思われるエラー処理を含めた状態遷移が次の図です。

エラー処理の遷移は赤矢印で示しています。

個別に見てみましょう。
+ 「No Connection」
何が起きても「No Connection」のままです。
+ 「Negotiation」
ソフトウェアでの例外(例えば、サーバーからの返事が想定と異なっていた、など)の場合は、
交渉をやりなおすことが考えられます。
ハードウェアやOSレベルの例外は大抵、接続が切れてしまいます。
この場合には整合性を保つために「Disconnect*」に遷移します。
+ 「Talking」
「Negotiation」と同様です。
+ 「Talk end*」
例外が起きたら、「Disconnected*」に遷移して接続を切ります。
他に、例外処理後も「Talk end*」に居続ける可能性も考えられますが、実用性は低いでしょう。
+ 「Disconnected*」
何が起きようとも、正常な「Not connected」に戻ります。

● 実用的なポートを表すクラス
汎用的で、幅広いタイプのクライアントに対応できる、TCPクライアントのためのクラスを考えましょう。
+ このようなクラスは、当然、内部にソケットを持ちます。
+ このようなクラスは、上で見た状態遷移に対応します。
そのために、状態を遷移させるメソッドを持ちます。
各メソッドでは、必要なソケットの処理を行ないます。
+ このようなクラスは、一般的な処理を行ないますが、
対話、つまりソフトウェア毎のプロトコルに基づいたサーバーとのやり取りは、
別のクラスに移譲します。

● ClientPortクラス
犬ぶよツールズでは、このようなクラスとして、ClientPortを提供します。
+ 内部にjava.net.Socketを持っています。
サーバーのアドレスとポートを指定するコンストラクタpublic ClientPort(String hostname, int port)
によって初期化されます。
+ 状態遷移を引き起こすメソッドを図のように備えています。

+ 対話の移譲先としてTalkerインターフェースのインスタンスを持ちます。
プログラムはこのTalkerインスタンスを通してサーバーから送られてきたデータにアクセスできます。
Talkerは「Talking」の状態を続けるか否かを判断できます。
従って、Talkerが否の判断すれば、ClientPortは自発的に「Talk end*」に遷移します。

ClientPortクラスとTalkerインターフェースは、jp.inubuyo.bone.tcpパッケージに含まれています。