TinkerBell/0.2

TinkerBell/0.2 の説明。てぃんか〜べるは、現在、もっとずっと良くした v.0.3 を公開テスト中です。最新状況は、TinkerBell のページをごらんください。

2001.08.12

TinkerBell/0.21

TinkerBell

どんなもの?

TinkerBell(ティンカーベル)は、HTMLページに書き込んだセリフを、「何か。」互換エイジェントの、ふきだし表示に変換してくれる妖精さんです。

例えば、あなたのホームページのソースに、次のコードをコピーペーストしたとします。

<script type="text/javascript"
 src="http://www.faireal.net/TinkerBell/0.21"></script>
<script type="text/javascript"><!--

Wendy = "手で叩いて下さい!";
Peter = "蚊を殺さないで!";

TinkerMagic();//--></script>

すると、あなたのホームページをひらいた読者のデスクトップに「何か。」互換のエイジェントがいた場合、主人公役のほうが「手で叩いて下さい!」とふきだしでおしゃべりし、あいぼうが「蚊を殺さないで!」と答えます。

CGIの設置、プラグイン、外部ファイルなどのめんどうな作業は不要で、セリフの指定法も単純明快。でも、使いすぎるとうっとうしいの注意してください。

問題点

以下の問題は、今後、なんとかします。

使い方

ホームページのソースに、ダイレクトに書きこんだセリフを、「何か。」互換エイジェントに読み上げさせます。

次のようなコードをコピーペーストするだけでOK(緑の文字の部分は、いじる必要ありません)。

<script type="text/javascript"
 src="http://www.faireal.net/TinkerBell/0.21"></script>
<script type="text/javascript"><!--

Wendy = "ここにセリフを書く。";
Peter = "さくらスクリプトも使えるよ☆";

TinkerMagic();//--></script>

エイジェントの主人公側が「ウェンディ(Wendy)」、あいぼうが「ピーター(Peter)」です。会話をもう一往復させたいときは、Wendy2Peter2 を指定することもできます。ページをリロードするたびに同じ会話をさせたくないときは、
tink_reload_ok = 0;
と書きます。ほかにも、いろいろ細かい制御をするパブリック変数が提供されていますが、まだととのっていない点もあるので、ここでは説明をはぶきます(後述のソース参照)。

なお、TinkerBell は、まだ実験的な部分が多く、とくに、この Ver.0.21 は、UTF-8を解釈できない互換プラットフォームでは、文字化けしてしまいます。(なるべく新しいバージョンをご利用ください)

くわしい説明

初めの2行は、http://www.faireal.net/ にある「TinkerBell/0.21」というライブラリを呼び出すものです。かんたんに言えば、ティンカーベルという妖精さんに来てもらうためのおまじないです。少しむずかしいかもしれませんが、このままコピーペーストしておけばだいじょうぶです。

<script type="text/javascript"
 src="http://www.faireal.net/TinkerBell/0.21"></script>

次の1行は、ティンカーベルにお願いをきいてください、とたのむ前の「あいさつ」です。これもそのままコピーしておきましょう。この行がないと、ティンカーベルは命令を理解できません。

<script type="text/javascript"><!--

この下に、ティンカーベルへの命令(エイジェントに伝えてほしいセリフなど)を書きます。その方法は、すでに説明した通り……

Wendy = "ここに主人公役のセリフを書く。";
Peter = "ここにあいぼうのセリフを書く。";

……となります。カンタンでしょう? セリフを半角の引用符でくくって、行末に半角のセミコロン ; をつけることをお忘れなく! 最後に下記の1行でしめくくります。

TinkerMagic();//--></script>

TinkerMagic(); は、ティンカーベルに対して「以上の命令を実行せよ!」と伝えるおまじない。
//--></script> は、しめくくりのおまじないです。この最後の行も、そのままコピーペーストでOKです。

さくらスクリプトも使えるので(\\\とする)、リモートから使えるSSTPなら、すべて TinkerBell/0.21 によってHTML内にダイレクトに記述できます。

使い方を間違えると、望んだとおりに動いてくれません。以下、実際にあった例について説明してますので、参考にしてくださいね。

技術的説明

TinkerBell/0.21 は、JavaScript によって img 要素を document.write し、src属性で cgi を呼び出し、引数として、UTF-8にてURIエンコードした Sakura Script を渡します。CGIは、このスクリプトにもとづき、SSTPによって「何か。」互換エイジェントとのコネクトを試みます。なんらかの理由で多バイト文字のUTF-8によるエンコードができないとき、TinkerBell/0.21 は文字化けをふせぐため、スクリプトで指定された台本の送信をあきらめます。

TinkerBell/0.2x は、内部的にUTF-8を使っています。「何か。」は、基本的にUTF-8を解釈できます(ただし Script: 行の行末に微妙な点があります。)互換プラットフォームでは、UTF-8を解釈できず、文字化けするかもしれません。

TinkerBell/0.1x は、SJIS のURLエンコードを利用するため、ほとんどのプラットフォームで動作可能です。

いろいろ実験してみた結果、最近の主なブラウザは、UTF-8を通せますが、しかし、「何か。」互換エイジェントの側でUTF-8を理解できる保証がないため、TinkerBell/0.1x のやり方のほうが現時点では、ぶなんだろうという結論に達しました。けれど、UTF-8を使う方法のほうが好ましいので、とりあえず、そちらを先に公開しました。

なお、img要素のsrc属性として多バイト文字を書く方法(SSMLはっか〜)は、Mozilla では文字化けするので、もはや、おすすめできません。

資料

すべて版権フリー。ご自由にご利用ください(改変も自由)


2001.08.15

TinkerBell/0.21 追記

使い方を間違えると、望んだとおりに動いてくれません。以下、実際にあった例について説明してますので、参考にしてくださいね。

2001.08.15 朝:2往復以上の会話の書き方

「ティンカーベル」については、初めに「どんなもの?」……と「TinkerBell/0.21(妖精現実アーカイブ)」をみてくださいね。

WendyPeter は、一回しか書けません。2回以上、書いた場合、最後のヤツだけが有効です。セリフを2往復以上させたい場合は、
――2往復までなら、Wendy2Peter2 を使ってください。

Wendy = "ボンオドリってなんの儀式なんだろ?";
Peter = "夏の風物詩だな。";
Wendy2 = "フィンランド人からみるとオウム体操と同じなんだけど‥‥変てこで";
Peter2 = "フィンランドのコッコだって、あぶなくないか?";


それ以上は、すべて Wendy として1行で、タグを入れて書いてください。(「Wendy3」とかは、いまのところないです。「〜2」までです。4往復ぶんくらいは配列じゃなしにいちおう変数名を定義しといたほうがいいかも……しかし、それよりランダムトーク、クッキーとくみあわせた続き番組なんかを考えてる)

Wendy = "ボンオドリってなんの儀式なんだろ?\\n\\n\\1夏の(以下略)";

スクリプトは、いくらでも書けますが、URLとして送れる長さに制限があるのと、そもそも、TinkerBell は、起動後8秒たっても仕事が終わらないと、自分で自分を強制終了させてしまいます。さらにそもそも、「何か。」の側であまりに長いSSTPは、受け付けないはずです。

「何か。」履歴によると、最新版の "redo" period 6 で「UTF8 to UCS2 の変換時、最終バイトを取りこぼして文字列末端に変なバイトが入る問題を修正」、最終バイトの脱落が修正されたのは手元でも確認できました(末端に変なバイトが入る問題は、依然、発生するが、\eの後ろなので無視してもらえる=事実上、影響ないもよう)。

新しいビルドが行き渡るまで、当分のあいだ、ひきつづき、\eのうしろにダミーの半角スペースを入れます(これは副作用がないようなので)。

かわいい妖精さんの絵が出るとデザイン上ちょっと、というかたもおられると思います。見えない画像に変える予定なので、お待ちください。

MSIE5.0(5.01でなく5.0きっかり)に TinkerBell/0.21 を解釈させると、CGI側で、スクリプトのパースに成功するときと失敗するときがあるようです。この問題は、もう少し調べてみます。

src属性に入っている「TinkerBell/0.21」というファイル名は間違いじゃありません。拡張子の.js は一般には不可欠ですが、このシステムでは不要です。公開している TinkerBell/0.21 は、こじんまりとした個人サイトなら(一日にそうやたらと何百回も起動しないなら)コピペして(セリフの台本を好きにかえて)ご自由にお使いいただいて、さしつかえありません(もしヒット数の大きいページとかでお使いになりたいかたがおられましたら、お手数ですが、ご自分のスペースにアップロードしてください……本当は「公開してるCGIをどなたでも好きなだけ使ってください」と言えたらいいんですが、こちらが共有サーバでリソースあまりないので……)

それと、「SSMLはっか〜」で紹介したような、img要素のsrc属性に日本語の文字を直接、書く方法は、モジラでは、うまく行きません。(なぜうまく行かないのかの理由と、それでも強引にうまく行かせてしまうゲリラなわざは「ssFusion」をごらんください。)今後やはり UTF-8 をデフォルトにしたいと思いますが、SJIS も選べるようにする予定です。互換プラットフォームの対応状況が未調査です。ごめんなさい。(UTF-8を解釈できない場合 TinkerBell/0.21 は文字化けしますが、TinkerBell/0.11 なら通ると思います。なお古いブラウザでブラウザ側が UTF-8 を作れない場合は、文字化けしないようスクリプト側で回避しています。)

2001.08.15 昼\\\とタイプすべし

TinkerBell/0.21 に対して、ユーザが「さくらスクリプト」のタグを含める場合、\nなどの\(半角)は\\(半角2文字)と二重打ちしなければなりません(義務)。

× 間違い
Wendy = "『図解、よく分かる\w4初めてのC』‥‥\w8\n\s[1]何の本かしら、これ";
○ 正解
Wendy = "『図解、よく分かる\\w4初めてのC』‥‥\\w8\\n\\s[1]何の本かしら、これ";

上の例の右辺は、正しい「さくらスクリプト」ですが、TinkerBell の呼び出しは、JavaScript ですから、下の例のように「さくらスクリプト」の\\\としてください。(%のタグは%のままでだいじょうぶです)

現在、SSMLのときのような\\の二重打ちをしないですむ機構は準備しておりません。例えば、\\nの意味で\nとしている場合、JavaScript側で適切に補正、補完することは原理的に可能と思いますが、とりあえず、JavaScript自身のエスケープシークエンスなので、TinkerBell が処理をする前に「壊れて」しまいます。この場合、ティンカーベルのCGI部分がパースに失敗することもあります。今朝の追記でメモしたパース失敗例の原因は、これでした。

CGI部がパースに失敗した場合、「(TinkerBell はスクリプトを認識できません):t_d=997785390680;...」のような「コアダンプ」がSSTPに乗りますが、おおぼけにも、ティンク側のミスでこの文字コードがSJISで書いてあって、そのくせ文字コードはUTF-8だとハードコーディングしちゃってるため、この場合、「何か。」はティンクの送ったエラーメッセージを文字化けさせてしまう可能性大です。現状、万一「(文字化け)t_d=9978なんたらかんたら」と出たら、それは tink.cgi からの「コアダンプ」(解析に失敗したクエリー文字列をそのまま吐き出す)で、\\の意味で\を使ってる可能性があります。めったにないエラーとは思いますが(だからこれまで気づかなかった)このエラーメッセージが文字化けするのは TinkerBell 側の不具合です。あわててなおしてエンバグするとイヤなので、あとでゆっくりなおします、すいません。


faireal.net <webmaster@faireal.net>