3 / index / 5

## 4. 外部インターフェース

> 華和梨は単独では何もできず、 外部からエントリ呼び出しを受けて初めて機能する。 以下に、華和梨の外部インターフェースについて述べる。

### 4.1. SHIORI-Serverインターフェース

> SHIORI はゴーストの中核的要素であり、この部分の挙動が人格のほぼ全てとなる。

> 「何か - SHIORI」 本家仕様書

> 「何か。」、及びその互換系のためのSHIORIサブシステムとしての動作が、 現在の華和梨の最大かつほぼ唯一の存在目的である。

> SHIORIとはゴーストの挙動を決定するブラックボックスである。 「何か。」本体は、環境の情報(マウスクリックや時間経過など) を吸い上げてSHIORIへと送り(リクエスト)、 それに対するSHIORIの反応(レスポンス)を得て、描画や通信を行う。 逆に、SHIORIは、本体からの情報を元にゴーストの挙動を決定し、 必要があれば会話文などの反応を返す。 このようにSHIORIと本体は役割を分担しており、 その間を「SHIORIプロトコル(通信規約)」と呼ばれる通信方式が結んでいる。 SHIORIにとってはSHIORIプロトコルを守ることが唯一かつ最大の制約である。 （もっとも、この図式はSAORIによってさらに変革されつつある）

> SHIORIプロトコルはHTTPを強く意識したアーキテクチャを持つ。 リクエスト/レスポンス型プロトコルであり、 そのメッセージはほぼテキストベースであり、行指向であり、 先行するスタートライン(SHIORIプロトコルでは明確な名称はない)と、 それに続くヘッダ行という形式であり、 ヘッダ行は最左の':'(コロン)によって、 ヘッダ名と値に分割される。

> SHIORIプロトコルのメッセージはこのようにフラットなフォーマットであるため、 その内容によらず、一定のルールによって華和梨の辞書構造に変換することができる。 ただし、そのままでは余りにもミドルウェアの負担が大きくなるため、 最小限の処理は華和梨システムが事前に行う。

> 以下に、Phase 8.0.0時点で、華和梨が内部的に行っている、 SHIORIプロトコルから華和梨辞書への変換手続きを示す。

> なお、SHIORIプロトコルについてのある程度の知識を前提とする。 具体的なプロトコルの定義については「何か。」 配布サイト「さくらみかげ」 の仕様書を参考にされたい。

> 「エントリにセット」とは、 そのエントリに属する唯一の文とすることを指す。 これは華和梨においてエントリを変数的に使用する場合の常套句である。 また、「リクエストライン」はリクエストメッセージのスタートライン、 「ステータスライン(「何か。」正式にはステータスコード)」 はレスポンスメッセージのスタートラインを指す。

> 1. セキュリティチェック(後述)を行い、 許可されないリクエストについては、"400 Bad Request"を返す。
> 2. リクエストライン(リクエストメッセージのスタートライン)から、 プロトコルバージョン表記とそれ以降(あれば)を取り除き、 "System.Request"エントリにセット。
> 3. 全てのヘッダ行について、ヘッダ名と値を分離し、 "System.Request.<ヘッダ名>"エントリに値をセット。
> 4. SHIORI規格は、現在2.x系と3.0に明示的に対応している。
>    3.x系GETイベント

>      version, craftman, nameの三種のリソース問い合わせには自動応答する。

>      その他の問い合わせについては、 "System.Callback.OnGET"エントリに属する 全ての文を評価し、 その結果を連結し、レスポンスのValueヘッダの内容とする。

>      "System.Response."で始まる全てのエントリを、 "System.Response.<ヘッダ名>"として扱い、 そのエントリの最初の文を評価して、レスポンスヘッダの値とする。

>    3.x系NOTIFYイベント
>      "System.Callback.OnNOTIFY"エントリに属する 全ての文を評価する。
>    2.x系通常イベント

>      "System.Callback.OnEvent"エントリに属する 全ての文を評価し、 その結果を連結し、レスポンスのSentenceヘッダの内容とする。

>      "System.Response."で始まる全てのエントリを、 "System.Response.<ヘッダ名>"として扱い、 そのエントリの最初の文を評価して、レスポンスヘッダの値とする。 ただし、SentenceとAgeヘッダは自動作成される。

>    2.x系コミュニケートイベント

>      "System.Callback.OnGetSentence"エントリに属する 全ての文を評価し、 その結果を連結し、レスポンスのSentenceヘッダの内容とする。

>      "System.Response."で始まる全てのエントリを、 "System.Response.<ヘッダ名>"として扱い、 そのエントリの最初の文を評価して、レスポンスヘッダの値とする。 ただし、Sentenceヘッダは自動作成される。

>      Toヘッダの値が"User"、あるいは"stop"であった場合、 To、Ageヘッダは削除される(コミュニケート終了)。 Toが、リクエストのSenderと同値であった場合、 Ageヘッダの値は、リクエストのAgeの値に+1したものとなる。 それ以外の場合、Ageヘッダは"0"となる。

>    2.x系、GET Status(GET Status SHIORI/2.0)
>      "System.Callback.OnGetStatus"エントリに文があれば、 最初の文を評価して出力。 なければ、「単語数,エントリ数,100,華和梨バージョン,100,100」 をStatusヘッダの内容とする。
>    2.x系 リソースイベント(GET String SHIORI/2.5)

>      "System.Callback.OnResource"エントリに属する 全ての文を評価し、 その結果を連結し、レスポンスのStringヘッダ内容とする。

>      "System.Request.ID"に、要求するリソースIDが登録されるため、 これに対応するリソースを返せばよい。

>    その他のイベント全て

>      "System.Callback.OnRequest"エントリに属する 全ての文を評価する。

>      "System.Response."で始まる全てのエントリを、 "System.Response.<ヘッダ名>"として扱い、 そのエントリの最初の文を評価して、レスポンスヘッダの値とする。 "System.Response"エントリの最初の文を、 レスポンスステータスコード(200など)とする。

#### セキュリティチェック(TODO)

### 4.2. SAORI-Serverインターフェース

> 華和梨はSAORIとしても動作する。 内部動作は、ほぼSHIORIサーバ動作と同様である。

> クエリに対しては、以下のように動作する。

> EXECUTEコマンド

>   "System.Callback.OnSaoriExecute" エントリに属する 全ての文を評価する。

>   "System.Response."で始まる全てのエントリを、 "System.Response.<ヘッダ名>"として扱い、 そのエントリの最初の文を評価して、レスポンスヘッダの値とする。 "System.Response"エントリの最初の文を、 レスポンスステータスコード(200など)とする。

> その他のイベント全て

>   "System.Callback.OnRequest"エントリに属する 全ての文を評価する。

>   "System.Response."で始まる全てのエントリを、 "System.Response.<ヘッダ名>"として扱い、 そのエントリの最初の文を評価して、レスポンスヘッダの値とする。 "System.Response"エントリの最初の文を、 レスポンスステータスコード(200など)とする。