睡眠時間毎日5時間で1週間ぶっ通しコードを書いてみた。
久しぶりの更新
先月留学資金としてまとまった金額のカナダドルを購入したが日々レートが気になり日々ズーとモニターを見つめるのも面倒なので、通貨のリアルタイムレートを取引業者のところから引っ張ってきて自由に加工できるクオートデータがほしいと思った。
で以前大量に購入したコンピュータ関連の本を読みながら為替レートをハンドルするソフトを作成。
開発環境は、NetBean6.5とGlassFish Ver2
ソフトの動作は以下の通り
1:レートを取得または受信する
※いろんなプロトコルがあるからストラテジーのデザインパターンを組み込んで、データソース元のプロトコル形式に併せて振る舞いを変更出来るようにした。
2:想定しているデータ形式になっているかチェックを入れる
※想定していないデータ形式が流れてきたら困るので・・・
区切り文字や、データの長さなどなど、チェックしなければいけないことがいろいろあり+今後も増える可能性があるのでデコレーターパターンを組み込んで今後もチェックの項目が増えても柔軟に対応出来るようにした。
3:データを商品・銘柄ごとに分割する
※取得データまとめて一つの文字列になっていて利用しにくいので分割しておく。
4:個々の銘柄・商品のクオートデータをJMSで送信
商品によってはデータ項目が異なる可能性もあるので、可変的に対応出来るようにMapでデータを送っておくと後々変更の時に、仕様変更が起きても影響範囲を限定的にするためカプセル化をおこなった。
5:スケジューラー
マーケットがオープンしている時間帯のみデータを取得する必要あり。海外ではサマータイムがあるし日本時間と海外時差とかをコントロールすることはかかなり重要
で約1週間ほどでアプリを完了させることが出来た。
動きを確かめるためにSunのOpen ESBを利用してBPELのアプリをサクッと20分ほどで作成
JMS受信>データのMapping>Fileへ書き出し
で確認。1秒に10数個もデータが飛び交っているのでフォルダーにはすぐにファイルが書き出されていた。
今回JMSを選択した理由は、データを投げっぱなしにしておいて、データを利用したいアプリはセレクターなどを活用して任意のデータをピックアップできたり、EAIなどでほかのシステムと連携させたりしたいので利用。
改善の余地がまだ残っている部分としては、
・JMXでソフトの動きを管理。
※フィードサーバーとして長時間稼働させるためにはしっかりした監視が必要なので・・
・データの分割方法をSmooksのライブラリを使ってもっと柔軟にデータの変換・分割を行う
※今後他のデータソースも取り込もうと考えているので柔軟に対応出来るように
・マルチスレッドでデータソースを取得とデータの分割とデータの送信を別のスレッドで処理
※現在はシングルスレッド 今後複数のデータソースを処理しなければならない場合にはマルチスレッドでパフォーマンスをあげることが必要だと思う。
・多数の為替のデータソースを取得し、合成レートを作成する。
各業者によっていろいろカバー先が配信するレートが異なると思うので、その影響を見比べたり、跳ねたレートをはじくために
今回開発に当たり参考にした本は以下の通り
・Head Firstオブジェクト指向分析設計とHead Firstデザインパターン
今回設計を行うに当たって非常に参考になったのは、Open Closed Principle=解放閉鎖原則、Sigle Responsiblity Principle=単一責任原則、Liskov Substitution Principle=リスコフ置換原則、カプセル化
そして今回のアプリいくつかのデザインパターンを適応させることが出来たのはHead Firstデザインパターンのおかげ
実はJava言語で学ぶデータパターン入門も持っているのだが、どうも僕には難しすぎた・・・
・Javaプログラマのためのアルゴリズムとデータ構造
データのフォーマットチェックを行う際に、計算コストを効率的に下げるために各種のアルゴリズム活用。
・Enterprise Jms Programming (Professional Mindware)
JMSの仕様について網羅している本としては現状この本ぐらいしかない。リファレンスとして活用。またケーススタディとして金融取引システムのサンプルがあるのでこちらも参考になる。英語バージョンだけど難しい単語はないから苦にならない
・Spring入門 とSpring2.0入門
便利な機能をくまなく網羅しているので非常に重宝したが、肝心なところで内容は端折られていたので結局SpringのPDFドキュメントも必要となった。
今回クオートデータの配信をおこなうプラットフォームが出来たので、次はポジションの管理を行うアプリの作成を考え中・・・
必要な機能として
・Intelligent Event Processor (任意の条件:アルゴリズムで何らかのアクションを起こす i.e メールとかSMSとかで何かのお知らせをしてくれるととってもうれしい)
以前購入したアルゴリズムデザインをようやく活用する理由が出来た。
・管理画面
GWTで実装することを考えている。
・レートをコンパクトに表示するなにか・・
Commetで実装することを考えている。
実装するかは未定だけど
・Traianaのコンファメーションシステムと連携するシステム
・Swift、FIX、FPMLなんかと連携するシステム
・取引処理システム
とかを作ろうかとも考えている。
後記:
ソフトを作っているときにはまったのが、JMSでのJNDI設定方法。
GlassFishのJMS設定が結構手こずった。
http://mcomproject.blogspot.com/ のサイトを参考に何とかJMSをJNDIを通して接続する事が出来た。大変助かりました。