リモート操作アプリの開発日誌(其の三)

うーむ。
とりあえずShakeHandのシーケンスを作った時点でプロトタイプは満足してしまった。
当初の予定には届いていないが、これ以上プロトタイプで作っているとやる気が失せてしまう。趣味プログラミングは動機が大事。火が消えないうちに薪をくべるのだ。

ということでいろいろとプロトタイプの不満を直すことに。

言語は、C言語で。一番応用が利くかな?的な理由。でもC++も捨てがたい。どうしよう。いまだに悩みつつC言語に決定。

とりあえず直そうと思っているポイント。

  1. モジュールの分割
    • Engine
      • シーケンスを握るモジュール。テストはモックを作る必要があるのでちょっと大変。
    • Message
      • Serverに出力するためのデータを作る場所。基本的にMessage一つにつきAPI一つとして作る。入力は構造体だったりプリミティブなデータだったり。出力はbyte列とその長さ。
      • Serverから受け取ったデータの解析、ダンプ用のAPIを用意する。
    • Debug
      • ログ出力の整形、出力そのものの機能。他にEnumの文字列化関数も入れる。
      • もしかしたら、ログからデバッグ用に入出力を組み立てる機能を入れるかも。ネットワークにつながっていない状態でのデバッグが容易になるから
    • Event
      • イベントのQueueとイベントの構造体を提供する。
      • イベントは内部的なもの。例えばネットワークのRead要求やWrite要求。
      • Queueはメモリの都合上、有限長がよい。長さが限界になるようならデータを取得しないか、落とす必要がある。
      • Framebufferの場合、差分データが落ちる可能性があるため、適宜(数秒に1回、とか)の割合で、全画面(keyframe?)要求した方がよいかもね。
    • Network
      • ネットワーク機能。別スレッドにする。
      • pushタイプ。Network利用者がコールバックを作成。データが到着したらコールバック呼び出しする。専用オブジェクトは必要か。
    • Util
      • buffer列からプリミティブな型へ。または其の逆の変換をするためのAPIを用意する。
      • Listみたいな汎用性のあるものもここに入れる。あとはなんだろ。iteratorとか?
    • Graph
      • Rectとか、描画に利用しそうな機能を入れる。
      • スクロールや拡縮、重ね合わせなどの機能も入れる。
      • ベジエ曲線とかアフィン変換とかもいる?行列計算も?
        • Mathみたいなファイルに分割するかも
    • Timer
      • タイマ管理機能。TimeoutまでのカウントダウンとPeriodicなもの。。。くらいか。凝る予定はない。
  2. スレッドの使用
    • EngineスレッドとNetworkスレッドを作る
    • データの受け渡しは共有メモリ&キューで行う。共有メモリはキューのエントリにひもづく。enqueueやdequeueのときはmutexを使用。ひもづいているメモリ領域を使用する際はmutex不要。enqueueやdequeueをした段階で、共有メモリ領域の所有権が移動するため。移動したことにするのです。

うーむ。思いつきで書いていて、全然推敲してない文章だがいいのだろうか。いやよくない。
ロードマップとかもちゃんと引いた方がいいかな。マイルストーンってやる気に影響するし。

でも眠いので続きはまた明日。


あ。共有メモリ領域ってどうやって確保したらいいんだろ。write要求って何を渡すんだ?mallocした領域でいいのか?削除はどういうタイミングでやれば?うーん。どうしよ。もっと設計詰めなきゃなー。楽しいなぁ。