ネットワークコマンド入力に対応したツール事例


      株式会社CRI・ミドルウェア
         花房 宏通



                   本資料に記載の情報や画像などのコンテンツに対する著作権・知的財産権
                   は、株式会社CRI・ミドルウェアに帰属します。また、当社以外の会社名や製
                   品名は、それぞれ各社の登録商標または商標です。
                   各種コンテンツの無断転載・再配布は禁止します。
アジェンダ

• パイプラインに組み込むツール開発について
• ネットワークの活用と事例
 –   ネットワークの活用
 –   デモ
 –   実装例
 –   メリットとデメリット
• おまけ
 – コード例




                         PAGE 2
パイプラインに組み込むツール開発について

• コンテンツ開発パイプラインで登場するツール
 – DCCツール
   • エクスポータ、データ作成補助など
 – コンバータ
 – ビューア
 – データ管理




                          PAGE 3
パイプラインに組み込むツール開発について

• どうせツールを作るなら、パイプラインに組み込みや
  すいように作るべき
 – システムの部品としても使うことを想定する




            ?
                          PAGE 4
パイプラインに組み込みやすいツール

• いろんな事ができるツールよりは、シンプルな機能と
  して固まってるツールの方が使いやすい
 – 画像変換、ファイル操作、テキストフィルタなど
• 簡単な機能でも、ツールとしてまとまることで、使いま
  わしやすくなる
 – 同じものを何度も作らなくて済む




                            PAGE 5
パイプラインに組み込みやすいツール

• GUIツールはパイプラインに組み込むのが大変
 – 規模が大きくなりがち
 – 操作手順(ルール)が複雑
 – 自動化しにくい
• これらの問題を解決するために、ネットワークを活用
  しようというのが本セッションの本題




                           PAGE 6
ネットワークの活用

• ネットワークというと敷居が高そうだけど…
 – とりあえずローカル限定での通信から始めてみる
 – .NET frameworkやPythonなどは、比較的簡単にネット
   ワーク機能(Socket)が使える
   • 相手にコマンド投げるくらいなら

 – 通信部分だけプログラマにまかせてもOK
• 今回のテーマで言うネットワークの使用用途
 – あくまでツールにアクセスする1手段
 – マシン同士の通信ではなく、プロセス間通信が目的



                                        PAGE 7
ネットワークの活用

• 要は、ツールを外から制御したい
 – ネットワークからのコマンドにより、機能操作を行う
 – ツールの機能をコマンドの形でまとめ、外部からコマンドを
   受信できる形にする




                             PAGE 8
デモ




     PAGE 9
GT2 SimpleViewer実装

• コマンドの種類
 –   各種アセットのロード
 –   アニメーション制御
 –   各種表示物の制御
 –   ツール制御
     • サイズ変更やシャットダウン等




                              PAGE 10
GT2 SimpleViewer実装

• コマンドの書式
 – 「命令」と「値」を文字列で渡す
   • 例:GMD=D:¥sample.gmd
    →sample.gmdファイルをロードする
 – 文字列なので、ユーザーが扱いやすい
 – 仕様追加もしやすい




                             PAGE 11
GT2 SimpleViewer実装

• ツール内部のコマンドサーバーがコマンドを解釈し、
  レンダリング等の内部処理を行う




                           PAGE12
GT2 SimpleViewer実装

• コマンドサーバーの仕組み




                           PAGE 13
メリットとデメリット
• メリット
  – UIと機能を分離できる
    • UIのカスタマイズがしやすい
    • 分離したものを、1つのツールとして見せるのも、別々のツールと
      するのも自由
  – Socketに対応してさえいれば、ツールや言語、プラット
    フォームを問わず利用できる
    • いろんなツールやスクリプトからツールにアクセスできる。
    • バッチやスクリプトで、その場的なツールを気軽に作れる
         – あるデータの組み合わせでシーンを作って、連番画像として出力す
           るツールとか




                                        PAGE 14
メリットとデメリット

• デメリット
 – なんだかんだ言って、作りこんでいくと大変
   • 同期とか
   • 通信の確立(ハンドシェイクとか)
   • 接続が切れたら?
 – デバッグも結構大変




                          PAGE 15
おまけ
• コマンドを送る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
ご清聴ありがとうございました




                 PAGE 20

ネットワークコマンド入力に対応したツール事例