以前、U16プログラミングコンテストの「大人版」(子供たちに向けたデモンストレーションでした(笑))をやることになり、JavaでのSocket通信の実装を行いました。
プログラミングコンテスト
PythonとかC#などのプログラムでChaserServerにアクセス、対戦相手とプログラムを動かして競うゲームです。
このクライアント側の実装と対戦を行うまでにやったことを下に一覧化します。
Socket通信使用を調べる
ChaserServerというのは下のようなものです。こんな感じで動くプログラムを作成します。ちなみに「H」(Hot)「C」(Cold)がプレイヤーになります。
既存のPythonとか C#のプログラムを眺めて、Javaに落とそうと思ったのですが、肝心の通信しているデータが見つからず。。。
結局中身を見てみようというとこになり。。。
Chaserver(Github)をPULL
とにかくプログラミングコンテスト(デモンストレーション)に参加するために、プログラムを(Javaで)作る必要がありました。もちろん布教のためです。下心満載で着手したもののクライアントサイドのプログラムだけでは、通信の内容がわからないので、サーバーサイドのコードも見てみることにしました。
Git リポジトリをフォークする〜U16-プログラミングコンテスト〜
C#のソースと合わせて解析
ある程度CHaserServerのソースを読んだのですが、わからない部分があったので、C#のソースも引っ張り出して(ダウンロードして)コードを追いかけて、ようやくJavaのクライアントを動かすことができました。
CHaserServer コード解析 ~U16-プログラミングコンテスト〜
クライアントアプリ作成
ここから、戦略をどのようにやるか?がキモになるのですが、戦略を実現するために「ND4(PythonのNumpyをJavaで実装したもの)Jを使用してやることにしました。
行列計算や作成に使えるので、Mappingを行うときに便利です。
JavaFX + ND4J〜数学への挑戦1:ND4Jのインストール〜
Socket通信を実装
ネットワーク通信の最小レベルでの通信を実装したクラスが「Socket」です。これを使用してSocketのサーバーとクライアントの実装を行います。
Java Network Socket〜極小サーバー〜
この技術を使用してCHaserServerのクライアントアプリを作成しました。詳細はリンク先に記載しています。
まとめ
作成したアプリはなんとか動いたものの、あまり自分の想い通りにはいきませんでした。
反省点としては以下のようなものがあります。
- 設計をちゃんとやらないと、クラス構成がぐちゃぐちゃになり、修正不可能になる。 -> あたりまえだ!(心の声)
- 行列処理など数学的な手法を用いるとプログラムの処理が簡素なものになる
細かい部分は多々ありますが、大まかにこんな感じです。
ND4Jも使えるライブラリなのでオススメします。
ND4J
JavaFX + ND4J〜数学への挑戦1:ND4Jのインストール〜
Mavenを使用してND4Jをインストールしました。POMファイルを編集して「Maven install」を実行するだけです。
JavaFX + ND4J〜数学への挑戦2: 行列の計算〜
行列計算をND4Jで行って見ました。なかなかどうして、ちょっと行列というものが理解できたような気がしました。
Java + ND4J 〜数学への挑戦3: ベクトル(配列)の作成方法〜
「ベクトル」について学習しました。今まではベクトル=矢印だと思っていたけれどそうではありませんでした。
補足としては「矢印で表現することができる」ということは変わらないけど、結局は「配列」なのだということがわかりました。
ND4J ベクトル生成〜ワンポイントレッスン的な〜
ワンポイントでベクトル(配列)生成処理の方法を記載しています。
JavaFX + ND4J 〜数学への挑戦:5グラフを描く〜
JavaFXでグラフを作成します。
JavaFX + ND4J 〜グラフ作成の準備〜
そして値を用意しないといけないのですが、そこらへんの計算をND4Jで実装しました。
JavaFX + ND4J 〜グラフ作成:とりあえず表示〜
とりあえず表示しました。毎度、自動生成した値をグラフにして表示します。ソースコードもあります。
JavaFX + ND4J〜数学への挑戦6:グラフの土台を作る〜
上のグラフをカスタムしようと考え、その土台を作成した時の記事です。
ND4J 行列の作成、編集 〜JUNITでのAPIテスト(学習)〜
みんな大好きJUNITでのテストを実装しました。
でわでわ。。。