コンテンツにスキップ

デバッグ支援スクリプト

ゴーストを作る際、試行錯誤によるデバッグ作業は避けられません。しかし、その為にいちいち本体を立ち上げるのは、あまり効率が良くありません。その点、幸水を使ったデバッグは効率が良いですが、イベント処理やNOTIFY処理のデバッグを行おうとすると、少し工夫が必要です。

そこで、コールバックエントリの処理動作と、本体との入出力ヘッダをエミュレートするスクリプトを作りました。自由に望みのイベント、NOTIFYをエミュレートし、結果をログに出力できます。全てKISで記述していますので、幸水だけでゴーストのデバッグが出来ます。

=kis
# debugOnGET…GETのデバッグ
#
# 第1引数: イベント名、リソース名
# 第2引数以降: Reference[x]
function debugOnGET $(
    # IDがなければ終了
    if $[ $(size @arg) < 2 ] $(return);

    # ヘッダのお掃除
    cleartree System.Request;

    # ヘッダセット
    setstr System.Request GET;
    setstr System.Request.ID $@arg[1];

    clear @arg[0];
    setstr @arg[0] OnGET;
    xargs @arg debugCallback;
);

# debugOnNOTIFY…NOTIFYのデバッグ
#
# 第1引数: notifyされた情報名
# 第2引数以降: Reference[x]
function debugOnNOTIFY $(
    # IDがなければ終了
    if $[ $(size @arg) < 2 ] $(return);

    # ヘッダのお掃除
    cleartree System.Request;

    # ヘッダセット
    setstr System.Request NOTIFY;
    setstr System.Request.ID $@arg[1];

    clear @arg[0];
    setstr @arg[0] OnNOTIFY;
    xargs @arg debugCallback;
);

# debugCallback…コールバックエントリデバッグ用共通関数
#
# 第1引数: コールバックエントリ(OnGET、OnNOTIFY)
# 第2引数以降: Reference[x]
# 備考: リクエストヘッダはこの関数を呼ぶ前にセットすること
function debugCallback $(
    # IDがなければ終了
    if $[ $(size @arg) < 2 ] $(return);

    # ヘッダのお掃除
    cleartree System.Response;

    # 共通ヘッダセッド
    setstr System.Request.Sender Kosui;
    setstr System.Request.SecurityLevel local;
    setstr System.Request.Charset Shift_JIS;
    setstr @pos 2;
    loop $[ $(size @arg)-2 ] $(
        setstr System.Request.Reference$[${@pos}-2] $@arg[${@pos}];
        inc @pos;
    );

    # クエリー開始宣言
    logprint "[SHIORI/SAORI Emulator] Query sequence begin.";

    # リクエストの表示
    printRequestHeaders;

    # コールバック
    if $(size System.Callback.$@arg[1]) $(
        setstr @Value $(get System.Callback.$@arg[1]);
        if $(length ${@Value}) $(setstr System.Response.Value ${@Value});
    );

    # 応答の表示
    printResponseHeaders;

    # クエリー終了宣言
    logprint "[SHIORI/SAORI Emulator] Query sequence end.";

    #ヘッダの後片付け
    cleartree System.Request;
    cleartree System.Response;
);

# リクエストヘッダの表示
function printRequestHeaders $(
    logprint "---------------------- REQUEST";
    logprint ${System.Request} "SHIORI/3.0";

    listtree @Headers System.Request;
    if $(size @Headers) $(
        foreach @h @Headers $(
            if $[ ${@h} != "System.Request" ] $(
                logprint $(substr ${@h} 15)":" ${${@h}};
            );
        );
    );
    logprint;
);

# 応答ヘッダの表示
function printResponseHeaders $(
    logprint "---------------------- RESPONSE";
    if $(size System.Response.Value) $(
        logprint "SHIORI/3.0 200 OK";
    ) else $(
        logprint "SHIORI/3.0 204 No Content";
    );

    listtree @Headers System.Response;
    if $(size @Headers) $(
        foreach @h @Headers $(
            if $[ ${@h} != "System.Response" ] $(
                logprint $(substr ${@h} 16)":" ${${@h}};
            );
        );
    );
    logprint;
);
=end

このスクリプトを幸水からロードし、次のようにコマンドモードで入力すると、「OnSecondChangeイベント、連続起動15時間目、見切れ・重なり無し、トークは出力される状態」がエミュレートできます。

debugOnGET OnSecondChange 15 0 0 1

また、次のように入力すると、「インストールされているゴーストはさくら、まゆら、双葉、毒子」のNOTIFYをエミュレートします。

debugOnNOTIFY installedghostname さくら まゆら 双葉 毒子

実際は、さらにこのコマンドを使ってスクリプトを組み、長時間起動時の加速試験等を行うと便利でしょう。次の例は、1時間分のOnSecondChangeとOnMinuteChangeを送り、加速耐久試験を行うスクリプトです。トーク途中で選択肢を出した場合、サーフィス復帰を考慮していませんが、普通はこれで十分だと思います。

=kis
# Hourエントリに起動何時間目か記憶させる
loop 60 $(
    debugOnGET OnMinuteChange ${Hour} 0 0 1;
    loop 60 $(
        debugOnGET OnSecondChange ${Hour} 0 0 1;
    );
);
=end