本資料に記載の情報や画像などのコンテンツに対する著作権・知的財産権 は、株式会社CRI・ミドルウェアに帰属します。また、当社以外の会社名や製 品名は、それぞれ各社の登録商標または商標です。 各種コンテンツの無断転載・再配布は禁止します。 株式会社CRI・ミドルウェア 花房 宏通 ネットワークコマンド入力に対応したツール事例
本資料に記載の情報や画像などのコンテンツに対する著作権・知的財産権は、株式会社CRI・ミドルウェアに帰属します。また、当社以外の会社名や製品名は、それぞれ各社の登録商標または商標です。 各種コンテンツの無断転載・再配布は禁止します。
株式会社CRI・ミドルウェア
花房 宏通
ネットワークコマンド入力に対応したツール事例
パイプラインに組み込むツール開発について
• コンテンツ開発パイプラインで登場するツール
– DCCツール
• エクスポータ、データ作成補助など
– コンバータ
– ビューア
– データ管理
PAGE 3
パイプラインに組み込みやすいツール
• いろんな事ができるツールよりは、シンプルな機能として固まってるツールの方が使いやすい
– 画像変換、ファイル操作、テキストフィルタなど
• 簡単な機能でも、ツールとしてまとまることで、使いまわしやすくなる
– 同じものを何度も作らなくて済む
PAGE 5
パイプラインに組み込みやすいツール
• GUIツールはパイプラインに組み込むのが大変
– 規模が大きくなりがち
– 操作手順(ルール)が複雑
– 自動化しにくい
• これらの問題を解決するために、ネットワークを活用しようというのが本セッションの本題
PAGE 6
ネットワークの活用
• ネットワークというと敷居が高そうだけど…
– とりあえずローカル限定での通信から始めてみる
– .NET frameworkやPythonなどは、比較的簡単にネットワーク機能(Socket)が使える • 相手にコマンド投げるくらいなら
– 通信部分だけプログラマにまかせてもOK
• 今回のテーマで言うネットワークの使用用途
– あくまでツールにアクセスする1手段
– マシン同士の通信ではなく、プロセス間通信が目的
PAGE 7
ネットワークの活用
• 要は、ツールを外から制御したい
– ネットワークからのコマンドにより、機能操作を行う
– ツールの機能をコマンドの形でまとめ、外部からコマンドを受信できる形にする
PAGE 8
GT2 SimpleViewer実装
• コマンドの書式
– 「命令」と「値」を文字列で渡す
• 例:GMD=D:¥sample.gmd
→sample.gmdファイルをロードする
– 文字列なので、ユーザーが扱いやすい
– 仕様追加もしやすい
PAGE 11
メリットとデメリット
• メリット – UIと機能を分離できる
• UIのカスタマイズがしやすい
• 分離したものを、1つのツールとして見せるのも、別々のツールとするのも自由
– Socketに対応してさえいれば、ツールや言語、プラットフォームを問わず利用できる • いろんなツールやスクリプトからツールにアクセスできる。
• バッチやスクリプトで、その場的なツールを気軽に作れる
– あるデータの組み合わせでシーンを作って、連番画像として出力するツールとか
PAGE 14
おまけ
• コマンドを送るPythonコード例 # ソケット作成(TCP)
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.settimeout(1)
for i in range(10):
try:
# 接続(HOST=IPアドレス or ホスト名, CONNECT_PORT=ポート番号)
sock.connect((HOST, CONNECT_PORT))
return sock
except socket.error, e:
time.sleep(1)
~~~~~~~~~~~~~~~~
# 送信(message=文字列)
sock.send(message)
PAGE 16
おまけ
• C#(.NET framework)の受信コード例 // 接続待ち準備
IPAddress addr = IPAddress.Parse("127.0.0.1");
var listener = new TcpListener(addr, CONNECT_PORT);
listener.Start(1);
listener.BeginAcceptTcpClient(new AsyncCallback(Accept), listener);
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// 接続許可
void Accept(IAsyncResult ar)
{
var listener = ar.AsyncState as TcpListener;
if (listener != null)
{
this.networkClient = listener.EndAcceptTcpClient(ar);
this.commandStream = networkClient.GetStream();
}
}
PAGE 17
おまけ
• C#(.NET framework)の受信コード例 if (this.commandStream.DataAvailable == true)
{
byte[] receive_data = new byte[4096];
// 受信
Int32 size = this.commandStream.Read(receive_data, 0, 4096);
// 受信したデータ処理
~~~~~~~~~~~~~~~~~~~~~~~
}
PAGE 18
まとめ
• パイプラインに組み込む事を前提にしたツール開発を行いましょう
– シンプルでコンパクトなものは組み込みやすい
• ツールにネットワーク経由で制御できる機能を持たせると、いろいろ便利
– UIの幅が広がる
• 言語や環境の枠を超えたツールの制御が可能になる
– 自動化しやすくなる
PAGE 19