プログラマブル準AIモジュール

「"華和梨" for あれ以外の何か以外の何か」
基本マニュアル

2001/01/08
Phase 7.3.1

華和梨開発チーム

NAKAUE.T (Meister)
夢乃 (偽Meister)
酔狂
さとー

Index

1. インストール
2. ファイルについて
3. kawari.ini
 3.1. kawari.iniファイルの書き方
 3.2. 外部ファイルの取り込み
 3.3. 辞書への単語追加
 3.4. テキストファイルの読み込み
 3.5. デバッグ用の動作モード指定
 3.6. セキュリティレベルの指定
4. 辞書
 4.1. 辞書ファイルの書き方
 4.2. ダブルクォート
 4.3. エントリ呼び出し
 4.4. 履歴参照
 4.5. システムエントリ
 4.6. イベントエントリ
 4.7. マッチエントリとCOMMUNICATE
 4.8. リソースエントリ
5. インラインスクリプト
6. 暗号化辞書

1. インストール

ゴーストのディレクトリに、以下のファイルを置いて下さい。

shiori.dll"華和梨"そのもの(必須)
kawari.ini設定ファイル(必須)
dict-*.txt辞書ファイル
ghost-*.txt"華和梨"辞書形式のゴースト会話データファイル

2. ファイルについて

"華和梨"のデータファイルには、設定ファイルと辞書ファイルの二種類があります。
設定ファイルkawari.iniは、"華和梨"が読み込むべき辞書ファイルを指定します。
辞書ファイルは、会話文データと会話文で用いる単語データを収めるファイルです。 辞書ファイルの数やファイル名には、特に制限はありません。kawari.ini中で指定 しただけ、全てのファイルが読み込まれます。
ただし、他のファイルとの衝突を防ぐため、単語データが主の辞書ファイルの名前を 「dict-*.txt」、会話データが主の辞書ファイルの名前を「ghost-*.txt」とすること を"推奨" ("華和梨"はプログラム自体は汎用的に作っておき、ユーザー側の使用方法を "推奨" することによって規格を作っている部分が多々あります。)します。

3. kawari.ini

kawari.iniファイルは"華和梨"が読み込むべき辞書や、"華和梨"の動作モードを 指定するファイルで、必ず用意する必要があります。

3.1. kawari.iniファイルの書き方

一行に「dict : ファイル名」の形で読み込むべき辞書ファイル名を指定します。 「#」から始まる行はコメントとして無視します。
これ以外の文字で始まる行も、"華和梨"が解釈できない場合は無視します。しかし、 将来の機能拡張の際、問題が起こる可能性があります。

    # 「華和梨ゴースト」設定ファイル
    
    # 辞書基本フレームワーク
    dict : dict-base.txt
    
    # 台本 (ゴースト依存)
    dict : ghost-kawari.txt
    
    # 標準辞書
    dict : dict-standard.txt
    dict : dict-dms.txt

3.2. 外部ファイルの取り込み

kawari.iniファイルの途中で、他のファイルの内容を取り込むことが出来ます。 「include : ファイル名」で指定します。

    # 外部iniファイル「keeps.ini」を取り込む
    include : keeps.ini

3.3. 辞書への単語追加

本来、辞書への単語追加は辞書ファイルの役割ですが、簡単なものならkawari.iniファイルの 中でも追加することが出来ます。 「adddict : エントリ名 単語」で指定します。

    # エントリ「author」に「まいすたー」を追加する
    addict : author まいすたー
    # エントリ「author」に「偽Meister」を追加する
    addict : author 偽Meister

「set : エントリ名 単語」と記述した場合には、エントリの内容が一度消去されてから 単語がセットしなおされます。

    # エントリ「myname」に「二葉亭四迷」を
    # エントリ「keroname」に「江戸川乱歩」をセットする
    set : myname 二葉亭四迷
    set : keroname 江戸川乱歩

3.4. テキストファイルの読み込み

Phase 7.1.2から、辞書ファイルと同じようにテキストファイルを読めます。 テキストファイルをエントリに格納する方式は、textloadコマンドと同じです。 「text : エントリ名 ファイル名」と指定します。

    # エントリ「spell」にテキストファイル「necronomicon.txt」を読み込む
    text : spell necronomicon.txt

3.5. デバッグ用の動作モード指定

以下の記述は特別な意味を持ちます。どれもデバッグ目的ですので、普通は kawari.iniに記述する必要はありません。

debug : log
shiori.dllと同じフォルダに、「kawari.log」というファイルを作ります。この ファイルには発生したイベントと、それに対する"華和梨"の応答が記録されます。 辞書のデバッグの際に記述します。
debug : debugger
デバッガを使用可能にします。"華和梨"と同時に配布している、コンソール版 "華和梨"インタプリタ「幸水」をデバッガとして使用する際に記述します。 詳細は「幸水」のマニュアルを参照下さい。
randomseed : <数字>
"華和梨"の乱数の種を指定し、特定パターンの乱数列を発生させます。 スクリプトのデバッグに使用することができます。

3.6. セキュリティレベルの指定

以下の記述は「何か。」からのイベント通知に対する、セキュリティレベルを 指定するために使用します。省略した場合、自動的にredo period 20以降で安全な設定に なるので、普通はkawari.iniに記述する必要はありません。

security : 0
"External"も含めすべて許可する。
security : 1
予約済み、とりあえず2と同じ。
security : 2
セキュリティレベルを指定しない場合の標準設定。
"External"以外のイベントを許可する。
security : 3
ローカルマシン発行のイベントのみ許可する。

セキュリティレベルが3未満の場合、クラッキング対策としてsystem.OnLoad エントリを評価後は、resource.homeurlエントリが書き換えられないように なっています。普通はこれが問題になることはありません。

4. 辞書

"華和梨"は単語を分類して集めた「辞書」を持っています。 文字列だけではなく、会話文やインラインスクリプトも全て単語として扱います。

辞書は起動時に「辞書ファイル」から読み込みます。 実行中にインラインスクリプトを使って辞書を書き換えることもできます。

4.1. 辞書ファイルの書き方

注意!! Phase 6.0から、エントリ名に使用可能な文字種類を変更します。
「-」が使用不可になりますので、「.」に置き換えてください。

一行に「エントリ名 : 単語 , 単語 , ...」の形で単語を登録します。 「#」から始まる行はコメントとして無視します。

    # 会話データ
    sentence : \h昨日${npw}を${npp}で偶然見かけたよ。\e
    sentence : \h${npp}良いとこ一度はおいで、はぁーじょいなじょいな。\e
    # 名詞-固有名詞-人名 ( npw )
    npw : 鈴木一郎 , 山本太郎
    # 名詞-固有名詞-地名 ( npp )
    npp : 首相官邸 , ホワイトハウス
    npp : ${npw}の家

エントリ名は単語の分類を示す物で、"華和梨"に単語の置き換えを指示する時に使います。 エントリ名に使える文字は英数字(A〜Za〜z0〜9)、ピリオド(.)、アンダーバー(_)、 漢字です。 エントリ名の長さや、エントリの個数、辞書ファイルの長さに制限はありません。

エントリ名をカンマ「,」で区切って並べ、単語を複数エントリへ一度に 登録することもできます。 以下の例は「npp」エントリと「観光名所」エントリの両方に「首相官邸」を登録します。

    npp,観光名所 : 首相官邸

4.2. ダブルクォート

ダブルクォート(")で囲まれた文字列は、常にそのまま出力されます。 エントリ呼び出し等がダブルクォート内にあっても置き換えを行いません。 「,」や「${}」「$()」といった"華和梨"で特別の意味を持つ文字列を単語中に 書き込みたい場合にはダブルクォートを使ってください。
Phase 7.2現在、そのままでは単語に含むことが出来ない文字は 「:;,(!&|)」の8種類です。
なお、ダブルクォートの内部でダブルクォートを表記したい場合、 「\」でエスケープします。具体的には「"\"ABC\""」と記述します。

    sentence : Good morning, U.S.A.

上記の例では、「Good morning」と「U.S.A.」という二つの単語として登録されます。 一つに繋がった「Good morning, U.S.A.」として登録したい場合には、以下のように してください。

    sentence : Good morning"," U.S.A.
    又は
    sentence : "Good morning, U.S.A."

4.3. エントリ呼び出し

「${エントリ名}」という記述を「エントリ呼び出し」と呼びます。

単語の中で「${エントリ名}」と記述すると、同じエントリに登録されている単語の中から 任意の一単語を選び出し、置き換えます。 該当する単語が見つからなかったときは、空白文字列に置き換えます。 また、置き換えた単語にもエントリ呼び出しが含まれている場合には、再度置き換えを行います。

    npw : 鈴木一郎 , 山本太郎
    sentence : ${npw}さん

上記の例では、sentenceの内容は「鈴木一郎さん」又は「山本太郎さん」になります。

「${エントリ1&エントリ2}」と記述すると、エントリ1とエントリ2の両方に登録されている 単語の中から任意の一単語を選び出し、置き換えます。

    JRの駅   : 目黒 , 恵比寿 , 渋谷 , 原宿 , 代々木 , 新宿
    東急の駅 : 目黒 , 大岡山 , 緑ヶ丘 , 自由が丘 , 渋谷
    sentence : ${JRの駅&東急の駅}で待ち合わせ

上記の例では、「${JRの駅&東急の駅}」が「目黒」又は「渋谷」に置き換えられ、 sentenceは「目黒で待ち合わせ」又は「渋谷で待ち合わせ」になります。

4.4. 履歴参照

「${数字}」という特殊なエントリ呼び出しを「履歴参照」と呼びます。

履歴参照は、同じ文脈で置き換えた単語を再度参照する時に使います。

    n : 石
    food : 梨
    sentence : ${n}のような${food}、${1}のような${0}。

上記の例では、${0}は${n}を置き換えた結果に、${1}は${food}を置き換えた結果に なり、sentenceは「石のような梨、梨のような石。」になります。

4.5. システムエントリ

注意!! Phase 6.0から、エントリ名に使用可能な文字種類を変更します。
「-」が使用不可になりますので、「.」に置き換えてください。

"華和梨"は、本体から通知された情報を以下のエントリに書き込みます。
詳細は「何か。」公式ページのSHIORI仕様書を参照して下さい。

system.Ghost本体から通知された自分のゴースト名
system.OtherGhost稼動中の他のゴーストの名前
system.OtherGhostEx稼動中の他のゴーストの名前(サーフィス番号付)
system.Reference0〜7イベント引数Referense0〜7
system.Sender話し掛けてきたゴースト名、又はシステム名
system.Sender.Path話し掛けてきた経路(local/unknown/external)
system.AgeCOMMUNICATEの回数
system.Sentence話し掛けられた内容
system.ID要求されたリソースID
system.Surface話し掛けてきたゴーストのサーフィス番号

以下のエントリは、インラインスクリプトで情報を書き込みます。 これらは本体への応答に一回使用すると、"華和梨"が自動的に消去します。

system.communicate ゴースト名を書き込むと、そのゴーストにCOMMUNICATEで話し掛ける
"stop"を書き込むと、COMMUNICATEを打ち切る
system.Response0〜7 書き込んだ内容をReference0〜7としてCOMMUNICATEで送信
system.BalloonOffset バルーンのオフセット位置

以下のエントリは「何か。」が指定した単語分類に一致する単語を要求してきたときに 呼び出されます。

compatible.ms名詞-人
compatible.mz名詞-無機物
compatible.mc名詞-社名
compatible.mh名詞-店名
compatible.mt名詞-技
compatible.me名詞-食物
compatible.mp名詞-地名みたいなもの
compatible.m名詞-非限定
compatible.dms「〜に〜する〜」的な、品詞が複数連結された長めの名詞

4.6. イベントエントリ

注意!! Phase 6.0から、エントリ名に使用可能な文字種類を変更します。
「-」が使用不可になりますので、「.」に置き換えてください。

「event.イベント名」形式のエントリは、OnClose等のイベントが発生した際に呼ばれ ます。仮にOnGhostChangingイベントが発生したとすると、対応するエントリである event.OnGhostChangingエントリが呼ばれます。sentenceエントリと同じように記述 して下さい。
今後追加されるイベントも"華和梨"側の変更なしで対応できます。
イベントの補助情報が記述されているReference0〜Reference7は、それぞれシステム エントリのsystem.Reference0〜system.Reference7に書き込まれます。また、発生 したイベント名はsystem.EventNameエントリに書き込まれます。

いくつかのイベントはshioriで処理することが必須になっていますので、必ず対応する スクリプトを記述してください。

イベントの詳細は、「何か。」公式ページのSHIORI仕様書を参照して下さい。

以下のイベントは"華和梨"が内部的に呼び出します。

system.OnLoad読み込み完了イベント
system.OnUnload切り離しイベント
system.OnTeachSHIORI/2.4 TEACH開始イベント
ユーザーの教えた単語はsystem.Sentenceに入っている
system.OnResponse応答イベント
system.OnResponseUnknown応答不明イベント
system.OnNotifyGhostゴースト名通知イベント
system.OnNotifyOther他ゴースト名通知イベント
system.OnGetStatusステータス取得イベント
system.OnEventUnknownスクリプトで未定義のSHIORI/2.2 イベント
イベント名はsystem.EventNameに入っている

4.7. マッチエントリとCOMMUNICATE

「["単語" , "単語" , ...]」の形をした特殊なエントリを「マッチエントリ」と呼びます。 マッチエントリは、コミュニケートボックスからの入力や、他のゴーストからの呼びかけに 返事をする「COMMUNICATE」処理で用います。

コミュニケートの際に「単語」を含む文が送られてきた場合呼ばれます。 複数の単語を書いた場合、書いた単語全てが含まれる文が送られてきた場合呼ばれます。

    ["徹夜" , "眠い"] : 徹夜明けは眠いね。

上記の例では、「徹夜」と「眠い」の2単語を含む文がCOMMUNICATEで送られてきた時、 「徹夜明けは眠いね。」を返します。

マッチエントリの検索を開始する前に、「system.OnResponse」イベントが発生します。 「system.OnResponse」イベントでなんらかの文字列を返した場合には、マッチエントリの 検索を中止します。 マッチエントリに該当するものが無い時には、「system.OnResponseUnknown」イベントが発生します。

COMMUNICATEで返事を返す際にsystem.Response0〜system.Response7エントリに 何か書き込むと、内容をそれぞれReference0〜Reference7にセットして相手ゴーストに 渡します。詳細はSHIORI/2.3b規格の仕様書を参照して下さい。

4.8. リソースエントリ

「resource.リソース名」形式のエントリは、本体からネットワーク更新先URL、 おすすめメニュー等を要求された際に呼ばれます。 リソースの詳細は、「何か。」公式ページのSHIORI仕様書を参照して下さい。

5. インラインスクリプト

「華和梨インラインスクリプト(Kawari Inline Script)」を用いることにより、 イベント処理、辞書の内容の動的な変更、エントリ内容による条件分岐等を実現できます。 基本的なスクリプトの書式は、「$(コマンド名 引数1 引数2…)」の形式です。 (簡単に言えば「Bash(Bourne Again SHell)のサブセット」です。) 言語仕様の詳細は、添付の「華和梨インラインスクリプト リファレンスマニュアル」 を参照して下さい。

"華和梨ゴースト"会話データファイル(ghost-kawari.txt)の中に、インラインスクリ プトの用例があります。コミュニケートボックスから簡単に呼べるようになっています ので、いろいろ遊んでみて、動作を確かめると良いでしょう。

6. 暗号化辞書

ネタをよりばれにくくするために、辞書ファイルに簡単な暗号化を施すことができます。
暗号化には付属のkawari_encode.exeを用います。
使用方法は、DOSプロンプトで以下のように入力します。復号ツールは作らないので、 辞書ファイルを後で編集する場合、必ず暗号化前のファイルを残しておいて下さい。

  kawari_encode.exe 辞書ファイル名1 辞書ファイル名2 ...

辞書ファイルのファイル名の拡張子を「.kaw」に変えたファイルが、暗号化された 辞書ファイルです。
辞書ファイル中、「:crypt」と書かれた行から、「:endcrypt」と書かれた行までが 暗号化の対象となります。それ以外の行は元のまま残されます。

  例 dict-sample.txt
    #############################
    # 著作件表示など
    #############################
    
    # ここから暗号化
    :crypt
    # 会話データ
    sentence : \h昨日${npw}を${npp}で偶然見かけたよ。\e
    sentence : \h${npp}良いとこ一度はおいで、はぁーじょいなじょいな。\e
    # 名詞-固有名詞-人名 ( npw )
    npw : 鈴木一郎 , 山本太郎
    # 名詞-固有名詞-地名 ( npp )
    npp : 首相官邸 , ホワイトハウス
    npp : ${npw}の家
    :endcrypt
    # ここまで暗号化

このファイルを暗号化すると、次のようなファイルが生成されます。

  例 dict-sample.kaw
    #############################
    # 著作件表示など
    #############################
    
    # ここから暗号化
    !KAWA00007+x+PQMPaQttcGlz
    !KAWA0000v6miuKmir6ns9uyQpHY+CjDot6K8u7FoPui3ory8sWgLejoNf3R(後略)
    !KAWA0000v6miuKmir6ns9uyQpOi3ory8sQIFaGhoBGh/fCAJFWgDaGZoaGg(後略)
    !KAWA00007+wAcncg4XQLAWEAcncg4XMBAHLs5OyivLvs5Q==
    !KAWA0000ory77PbsAicAFnwgA3bs4Ox3fwcQDgwDdg==
    !KAWA00007+wAcncg4XQLAWEAcncg4Q8DAHLs5OyivLzs5Q==
    !KAWA0000ory87PbscD8NJnh9CW3s4OxpF2kjaWhpBGkDaWppdQ==
    !KAWA0000ory87Pbs6LeivLuxaAJ+BA==
    # ここまで暗号化

生成された暗号化辞書ファイル「dict-*.kaw」を、kawari.iniで指定して下さい。 暗号化ファイルの拡張子は、.kaw以外に変更しても大丈夫です。