Tag: SSP’

x-ukagaka-linkを使ってみる

 - by Don

SSP/2.5.12より追加されたx-ukagaka-linkを使ってみようのコーナー。

お約束

  • これを書いている人はセキュリティに関して素人です。
  • SSPの更新履歴にある通り、試験実装の段階です。
  • SSPに新しい機能が実装されたときは、何かしらバグがあると考えるべきです。

準備

今回は「Rポストと狛犬」を使って試していこうと思います。辞書のどこかに以下の記述を追加します。

*OnXUkagakaLinkOpen
>XUkagakaLinkOpen(R0)

*XUkagakaLinkOpenA1
:正解!
:常識だな。

*XUkagakaLinkOpenA2
:正解!
:(11)\__q[https://www.wdic.org/w/TECH/SSP]公式見解\__qである。

*XUkagakaLinkOpenA3
:正解!
:\__q[https://wikiwiki.jp/ukatec/The%20Making%20of%20-nomine.mp4-]世界で唯一の除霊機能付き再生ソフト\__qだ。

実践

問題です。SSPとは何の略でしょう?

  1. Sakura Script Player
  2. しましまぱんちゅ
  3. Salt Sprinkled Player

SSPを起動していない状態で上記のリンクを踏むだけでも訪問者をビビらせることができそうですが、色々と応用が可能と思います。わざわざサイトを訪問してくれたユーザさんにサプライズを仕込むこともできそうです。

セキュリティ

Reference0の内容をそのまま読み上げるような使い方はやめましょう。インターネットには無数のハイパーリンクが張り巡らされています。それら一つ一つが安全であることを確かめながら日々ブラウジングをしている人は少ないでしょう。上記の例もReference0の内容を直接読み上げることは避けています。

もっと具体的な話をすると、Reference0に\![vanish●ymyself]みたいな悪戯を仕込む人がいないとも限りません。

また、栞がYAYAの場合、標準的なテンプレートを使用しているゴーストではシステム辞書レベルで外部からのリクエストに対しては無応答になるよう設定されています(安全のために正しい処置であると思います)。

DirectSSTPでWindowsアプリとゴーストが会話できるようになった

 - by Don

SSP 2.5.03 – ばぐとらぶごる

+ "X-SSTP-Return-" ではじまるSHIORIからのレスポンスヘッダをSSTPのレスポンスにそのまま横流しする実験的仕様
例: X-SSTP-Return-Hoge: hogehogehoge

SSP 2.5.05 – ばぐとらぶごる

※ "X-SSTP-Return-" を "X-SSTP-PassThru-" に改名し、レスポンスだけではなくリクエストヘッダにも追加できるようにした。

SSTPを送信した側が、ゴーストからのメッセージを受け取ることができるようになりました。

応用例はいくつか考えられます。

  • 今までは音楽再生アプリが「再生している曲」を通知することしかできなかったが、「再生したい曲」を問い合わせることができるようになった
  • 今までは麻雀ゲームアプリが「何を切ったか」を通知することしかできなかったが、「何を切るか」を問い合わせることができるようになった
  • 今まではスケジュール管理アプリが予定を通知することしかできなかったが、ユーザとのデートの予定を勝手に入れられるようになった

ゴーストがますます主体的に「意思」を持つようになってくるかもしれません。

具体的にどうやるの

DirectSSTP送信テストツールとレスポンスを返すサンプルゴーストを作ってみました。

動いている様子

まだ実験的段階ですし

ゴーストからのレスポンスを利用したアプリがまだこの世には存在していないので焦って対応を考える必要はありません。ただ、ゴーストからのレスポンスを利用したいと考えるアプリケーション作者さんの目に止まればという願いを込めて、サンプルを公開いたしました。どうぞご活用ください。

ゴーストからTwitterに投稿する(其の参―中級編)

 - by Don

目次

準備

上級編を見てわかる通り、普通にやると準備が大変です。なので中級編では筆者が準備した環境を中継して投稿する方法を紹介します。

「概要」で説明した通り、以下のものが必要になります。

  • BOT用Twitterアカウント
  • Twitter APIの認証キー(2つ)※Twitter開発者登録は不要
    • ACCESS_TOKEN(アプリに対しアカウント毎に割り当てられる)
    • ACCESS_TOKEN_SECRET(アプリに対しアカウント毎に割り当てられる)
  • PHPが使用可能なサーバ(PHP7でなくても可)

BOT用TwitterアカウントとPHPが使用可能なサーバは例によって各自用意してください。

Twitter APIの認証キー(2つ)は以下のリンクから取得してきてください。

UKABOT

適当な名前のPHPファイルを作成してサーバにアップロードします。今回はsample.phpとしました。このファイルにコードを記述していきます。

<?php
define('ACCESS_TOKEN', 'XXXXXXXXXXXXXXXXXXXX');
define('ACCESS_TOKEN_SECRET', 'XXXXXXXXXXXXXXXXXXXX');

$url = 'http://nikolat.starfree.jp/rentalbot/sendtweet.php';
$mes = 'サーバから送信テスト';
$post_data = array('access_token' => ACCESS_TOKEN, 'access_token_secret' => ACCESS_TOKEN_SECRET, 'status' => $mes);

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url); 
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($post_data));
$res =  curl_exec($ch);
curl_close($ch); 

header('Content-Type: text/plain; charset=UTF-8');
print 'おしまい';

文字コードはUTF-8にしておきましょう。XXXの部分は自身が取得した2つのAPIの認証キーに書き換えてください。これを保存してWebブラウザからこのphpファイルがあるURLにアクセスしてみましょう。ブラウザには「おしまい」と表示され、BOTのアカウントに「サーバから送信テスト」と投稿されるはずです。

今はWebブラウザからアクセスしましたが、最終的にはSSPからアクセスし、メッセージを転送することを目標としています。

送信するテキストの部分を以下のように書き換えましょう。

<?php
define('ACCESS_TOKEN', 'XXXXXXXXXXXXXXXXXXXX');
define('ACCESS_TOKEN_SECRET', 'XXXXXXXXXXXXXXXXXXXX');

$url = 'http://nikolat.starfree.jp/rentalbot/sendtweet.php';
$mes = $_POST['message'];
$post_data = array('access_token' => ACCESS_TOKEN, 'access_token_secret' => ACCESS_TOKEN_SECRET, 'status' => $mes);

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url); 
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($post_data));
$res =  curl_exec($ch);
curl_close($ch); 

header('Content-Type: text/plain; charset=UTF-8');
print 'おしまい';

そしてSSPから以下のSakuraScriptを入力します。

\![execute,http-post,【URL】,--param=message=SSPから送信テスト]

【URL】は先ほどWebブラウザからアクセスしたphpファイルがあるURLに置き換えてください。BOTのアカウントに「SSPから送信テスト」と投稿されるはずです。

これでゴーストからTwitterに投稿することができました。

エラー処理

上記のコードは最小限の構成になっています。エラー処理くらいは加えたほうが良いでしょう。

<?php
header('Content-Type: text/plain; charset=UTF-8');

define('ACCESS_TOKEN', 'XXXXXXXXXXXXXXXXXXXX');
define('ACCESS_TOKEN_SECRET', 'XXXXXXXXXXXXXXXXXXXX');

$url = 'http://nikolat.starfree.jp/rentalbot/sendtweet.php';
$key = 'message';
if (!isset($_POST[$key])) {
  print 'メッセージのパラメータ名が違います。';
  exit();
}
$mes = $_POST[$key];
$post_data = array('access_token' => ACCESS_TOKEN, 'access_token_secret' => ACCESS_TOKEN_SECRET, 'status' => $mes);

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url); 
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($post_data));
$res =  curl_exec($ch);
if(curl_error($ch)) {
  print curl_error($ch);
} else {
  print $res;
}
curl_close($ch); 

ここで表示されるはずのメッセージはSakuraScriptを実行したゴーストのフォルダ内 ghost\master\var\sample.php に格納されています。

注意事項

ここで解説した方法は筆者のサーバを経由して投稿する方法になります。筆者がサーバの利用継続手続きを失念したり、筆者のTwitterアカウントが凍結されたりすれば動かなくなりますが、泣かないでください。

ゴーストからTwitterに投稿する(其の弐―上級編)

 - by Don

目次

準備

「概要」で説明した通り、以下のものが必要になります。

  • BOT用Twitterアカウント
  • Twitter APIの認証キー(4つ)※Twitter開発者登録が必要
    • CONSUMER_KEY(アプリ毎に割り当てられる)
    • CONSUMER_SECRET(アプリ毎に割り当てられる)
    • ACCESS_TOKEN(アプリに対しアカウント毎に割り当てられる)
    • ACCESS_TOKEN_SECRET(アプリに対しアカウント毎に割り当てられる)
  • PHP7が使用可能なサーバ
  • OAuthライブラリ(TwitterOAuth)

BOT用Twitterアカウントは各自用意してください。

Twitter APIの認証キー取得についても、Web上に解説記事がたくさんあるのでここで解説することはしません。筆者がざっと探してみた限りでは以下の記事がわかりやすいと思いました。BOTに投稿させるため、BOT自身のアカウントで登録した方が良いです。※Twitterアプリ開発経験者や複数BOT作成予定の人はこの限りではありません

PHP7が使用可能なサーバも各自用意してください。筆者は駄でべWikiを参考にスターサーバー(フリープラン)を利用しています。(PHPのバージョンをしっかり確認してください。PHP5ではダメです。)

最後にTwitterOAuthの入手ですが、ここでは最新版ではなくversion 1.1.0をこちらから入手します。

twitteroauth

理由は、最新版では依存モジュールがあって色々めんどくさいからです。動けばいい、の精神で古いバージョンを使用します。

展開したフォルダはtwitteroauthとリネームしてサーバにアップロードします。同一ディレクトリ内に適当な名前のPHPファイルを作成します。

directory-sample

今回はsample.phpとしました。このファイルにコードを記述していきます。

<?php
require 'twitteroauth/autoload.php';
use Abraham\TwitterOAuth\TwitterOAuth;

define('CONSUMER_KEY', 'XXXXXXXXXXXXXXXXXXXX');
define('CONSUMER_SECRET', 'XXXXXXXXXXXXXXXXXXXX');
define('ACCESS_TOKEN', 'XXXXXXXXXXXXXXXXXXXX');
define('ACCESS_TOKEN_SECRET', 'XXXXXXXXXXXXXXXXXXXX');

$mes = 'サーバから送信テスト';

$twitter = new TwitterOAuth(CONSUMER_KEY, CONSUMER_SECRET, ACCESS_TOKEN, ACCESS_TOKEN_SECRET);

$res = $twitter->post('statuses/update', array('status' => $mes));
print 'おしまい';

文字コードはUTF-8にしておきましょう。XXXの部分は自身が取得した4つのAPIの認証キーに書き換えてください。これを保存してWebブラウザからこのphpファイルがあるURLにアクセスしてみましょう。ブラウザには「おしまい」と表示され、BOTのアカウントに「サーバから送信テスト」と投稿されるはずです。

今はWebブラウザからアクセスしましたが、最終的にはSSPからアクセスし、メッセージを転送することを目標としています。

送信するテキストの部分を以下のように書き換えましょう。

<?php
require 'twitteroauth/autoload.php';
use Abraham\TwitterOAuth\TwitterOAuth;

define('CONSUMER_KEY', 'XXXXXXXXXXXXXXXXXXXX');
define('CONSUMER_SECRET', 'XXXXXXXXXXXXXXXXXXXX');
define('ACCESS_TOKEN', 'XXXXXXXXXXXXXXXXXXXX');
define('ACCESS_TOKEN_SECRET', 'XXXXXXXXXXXXXXXXXXXX');

$mes = $_POST['message'];

$twitter = new TwitterOAuth(CONSUMER_KEY, CONSUMER_SECRET, ACCESS_TOKEN, ACCESS_TOKEN_SECRET);
 
$res = $twitter->post('statuses/update', array('status' => $mes));
print 'おしまい';

そしてSSPから以下のSakuraScriptを入力します。

\![execute,http-post,【URL】,--param=message=SSPから送信テスト]

【URL】は先ほどWebブラウザからアクセスしたphpファイルがあるURLに置き換えてください。BOTのアカウントに「SSPから送信テスト」と投稿されるはずです。

これでゴーストからTwitterに投稿することができました。

エラー処理

上記のコードは最小限の構成になっています。エラー処理くらいは加えたほうが良いでしょう。

<?php
require 'twitteroauth/autoload.php';
use Abraham\TwitterOAuth\TwitterOAuth;

define('CONSUMER_KEY', 'XXXXXXXXXXXXXXXXXXXX');
define('CONSUMER_SECRET', 'XXXXXXXXXXXXXXXXXXXX');
define('ACCESS_TOKEN', 'XXXXXXXXXXXXXXXXXXXX');
define('ACCESS_TOKEN_SECRET', 'XXXXXXXXXXXXXXXXXXXX');

$key = 'message';
if (!isset($_POST[$key])) {
  print 'メッセージのパラメータ名が違います。';
  exit();
}
$mes = $_POST[$key];

$twitter = new TwitterOAuth(CONSUMER_KEY, CONSUMER_SECRET, ACCESS_TOKEN, ACCESS_TOKEN_SECRET);
 
$res = $twitter->post('statuses/update', array('status' => $mes));

if($twitter->getLastHttpCode() == 200) {
  print '投稿が完了しました。';
} else {
  print '投稿に失敗しました。';
}

ここで表示されるはずのメッセージはSakuraScriptを実行したゴーストのフォルダ内 ghost\master\var\sample.php に格納されています。

ゴーストからTwitterに投稿する(其の壱―概要)

 - by Don

本稿では伺かのゴーストからTwitterに投稿する方法について記述します。

ゴーストからのweb拍手送信を応用した内容となっています。
こちらを実践したことがある、または仕組みが理解できることを前提としています。

本稿は以下のように3部に分けて解説していきます。

「概要」では、大まかな仕組みと流れについて説明していきます。

「上級編」では、具体的に必要な準備や記述すべきコードを説明していきます。これが基本であり理想とされる対応となります。

「中級編」では、「上級編」で必要とされた準備のうちの一部を筆者が肩代わりすることで少しだけ敷居を下げた方法を説明していきます。本格的に対応する前に試用したい場合などにご利用ください。

ゴーストから自分の用意したサーバにメッセージを送信する

ゴーストからのweb拍手送信の動作原理を解説すると、SSPのSakuraScriptである\![execute,http-post]を使用してサーバにメッセージを送信し、サーバ側でメッセージを保存することでゴースト作者が閲覧できるようになっています。

send-webclap

ゴーストからTwitterへの投稿は、これの応用で、このサーバからTwitterにメッセージを転送することで実現します。

send-to-twitter

上級編

「上級編」では、PHP7を使用してTwitterにメッセージを転送するプログラムの記述を解説します。そのため以下のものを準備する必要があります。

  • BOT用Twitterアカウント
  • Twitter APIの認証キー(4つ)※Twitter開発者登録が必要
    • CONSUMER_KEY(アプリ毎に割り当てられる)
    • CONSUMER_SECRET(アプリ毎に割り当てられる)
    • ACCESS_TOKEN(アプリに対しアカウント毎に割り当てられる)
    • ACCESS_TOKEN_SECRET(アプリに対しアカウント毎に割り当てられる)
  • PHP7が使用可能なサーバ
  • OAuthライブラリ(TwitterOAuth)

※PHPとはWebプログラミングに使われるプログラミング言語の一つで、伺かで言えば「里々」みたいなものです。コピペで動くように解説するつもりなので必ずしもPHPに習熟する必要はありませんが、自分流にカスタマイズする場合はある程度習得することが望ましいです。なお、筆者はあまりPHPに詳しくありません。

中級編

「中級編」では、筆者のBOT用登録済みアプリを使って筆者サーバを経由して投稿する形式を取ります。そのため必要な準備は以下のものだけになります。

  • BOT用Twitterアカウント
  • Twitter APIの認証キー(2つ)※Twitter開発者登録は不要
    • ACCESS_TOKEN(アプリに対しアカウント毎に割り当てられる)
    • ACCESS_TOKEN_SECRET(アプリに対しアカウント毎に割り当てられる)
  • PHPが使用可能なサーバ(PHP7でなくても可)

forward-to-twitter

そもそも\![embed,…]以外のことがあんまりわかってなかった

 - by Don

前回の記事で検証した仮説「呼び出されたイベントでScriptを返さなければ現在再生中のScriptは中断されない」、よくよく考えたら当たり前なことだと気がついた。

これ、ただのイベント割り込みだ。

ゴーストがランダムトーク中に0分になると、トークが中断して時報トークをする。これはトーク中に割り込まれたイベントOnMinuteChangeに対してScriptを返したため、現在再生中のScriptが中断して時報トークが再生されたからだ。

しかし、時報トークの無いゴーストでも等しくOnMinuteChangeイベントは通知されているのにトークは中断されない。OnMinuteChangeイベントに対して何もScriptを返していないため、現在再生中のトークを中断する必要が無いからだ。

\![raise,...]など自分でイベントをコールする系のScriptを使用した場合でも状況は一緒だ。自分でわざわざイベント割り込みを起こしたのだ。\![raise,...]を実行してその結果何かScriptが返されたなら、現在再生中のScriptは中断して当たり前だし、Scriptが返されなければ再生中のScript(トーク)は継続して当たり前だ。時報トークの割り込みと同じ。

\![embed,...]の使い方がわかった

 - by Don

今更ながら\![embed,…]の使い方を把握したので覚書です。

基本

単純な例

里々でやろうとするときは\![embed,…]の呼び出し先イベントは\eで閉じないよう留意しないといけない。

*
:あいうえお\![embed,OnHoge]さしすせそ

*OnHoge
:かきくけこ

#これを実行すると以下のようになって「あいうえおかきくけこ」と表示された時点で再生が終わる
#\0\s[0]\1\s[10]\0あいうえお\0\s[0]\1\s[10]\0かきくけこ\eさしすせそ\e

単語群なら前後に余計なスクリプトは付かない。

*
:あいうえお\![embed,OnHoge]さしすせそ

@OnHoge
かきくけこ

#これを実行すると以下のようになる
#\0\s[0]\1\s[10]\0あいうえおかきくけこさしすせそ\e

里々であれば以下のように書いても同じ結果が得られる。

*
:あいうえお(OnHoge)さしすせそ

@OnHoge
かきくけこ

#これを実行すると以下のようになる
#\0\s[0]\1\s[10]\0あいうえおかきくけこさしすせそ\e

これでは面白くないので、同じ結果が得られない例を挙げる。

SakuraScriptの再生と同期して呼び出しが実行される例

*
:時計の秒針を一秒おきに数えてみよう!
(現在秒)、\_w[1000](現在秒)、\_w[1000](現在秒)…。

これは期待した動作にならない。「13、14、15…。」みたいになってほしいが、「13、13、13…。」となってしまう。里々が全ての括弧を展開した結果のSakuraScriptをSSPに渡しているだけなので、SSPに届く頃にはすべて13になっている。

しかし、\![embed,…]を使えば期待した動作が可能となる。

*
:時計の秒針を一秒おきに数えてみよう!
\![embed,OnGetSecond]、\_w[1000]\![embed,OnGetSecond]、\_w[1000]\![embed,OnGetSecond]…。

@OnGetSecond
(現在秒)

この例だと「13、14、15…。」みたいに再生される。SakuraScriptの再生と同期してイベント呼び出しが実行され、返されたScriptをその場で埋め込みながら再生を続ける。すごい。

応用

複雑な例

\![embed,…]とはどんなものか、ということについては上述の例さえわかれば十分である。それ以上でもそれ以下でもない。\![embed,…]はそんなに難しいものではない。

\![embed,…]ワカラナイ、というのは往々にして\![embed,…]以外のところに原因がある。例えば、UKADOCの説明には以下のように書いてある。

プロパティシステムの内容によって分岐など、イベントを実行して情報を取得する仕様を、1回のスクリプト実行で有効に使用するための仕様。

何言ってるかワカラナイ。

プロパティシステムというのは、SSPが知っている情報を教えてもらうための仕様だ。例えば現在時を教えてもらうには以下のように書く。

*
\![get,property,OnGetHour,system.hour]

*OnGetHour
:現在(R0)時です。

里々なら里々自身の力で(現在時)と書けば取得できるけど、簡単な例として。

ここで重要なのが、情報を取得するためには別イベントをコールする必要があるということだ。(R0)に入っている情報を(またはそれを使用/加工した文字列を)\![get,property]を実行した直後に埋め込んで再生したい場合もあるのかもしれない。そういうことができますよ、と\![embed,…]の説明には書いてある。

例えば以下のように書いてもkero側のScriptは再生されない。

*
:\![get,property,OnGetHour,system.hour]
:もうそんな時間か。#←これは再生されない

*OnGetHour
:現在(R0)時です。

イベントを呼び出す系のSakuraScriptは、それが実行された時点でそのイベントにおける再生は強制終了されるのが特徴である。

…と思っていた。昨日までは。例外があったのだ。知らなかった。

\![get,property]した後もScriptの再生が続く例

答えを言ってしまうと、以下のように書けばUKADOCの説明にあるようなことが可能となる。

*
:現在\![get,property,OnGetHour,system.hour]\![embed,OnShowHour]時です。
:もうそんな時間か。#←これが再生される!

*OnGetHour
$現在の時間【タブ】(R0)

@OnShowHour
(現在の時間)

\![get,property]した後もScriptの再生が続く条件は、呼び出したイベントで「何も返さない」ことである。

上記の例では(R0)の情報を変数に保存してはいるものの、再生するScriptは何もない。この場合、例外的に呼び出し元のScriptは再生を続けるのだ。知らなかった。

変数に保存したは良いが、再びSSPに処理が戻ってScriptの再生中である。保存した情報を再びSHIORI側で処理し、Scriptを生成し、呼び出し元に埋め込みたい。そこで\![embed,…]の登場だ。

\![embed,…]は極めて単純な仕様であり難しいことはない。\![get,property]の仕様が謎すぎるんだ。「何も返さない」場合のみScriptの再生を続けるとか誰が知ってるんだ。

そもそも\![embed,…]以外のことがあんまりわかってなかった

補足

イベントを呼び出す系のSakuraScriptの代表と言えば\![raise,...]だ。きっと\![get,property]と同様な仕様となっているに違いない。

*
:艦隊のアイドル、\![raise,OnNakachan1]那珂ちゃんだよー!\![raise,OnNakachan2]よっろしくー!

*OnNakachan1
#何も返さない

*OnNakachan2
カーン...カーン...カーン...

予想通りOnNakachan2でScript再生が中断され、カーンカーンとなる。

ちなみに\![raise,...]はMateriaでもサポートされており、Materiaで実行しても同じ結果となった。なので、SSPは本家の仕様を忠実に再現しているものといえる。

複数のゴーストとコミュニケートする

 - by Don

うかべん 横浜#8の発表資料とヒノハルさんのテキスト実況を拝読しているところです。今回もためになる発表が多数行われたようで、こうした資料が公開されることはとてもありがたいことであると感じます。関係者の皆様、大変お疲れ様でした。

コミュニケートとraiseother

もっしょくしさんの発表資料「ゴースト間の交流について ~暦にしき宣伝添え~」は、ゴースト間での情報送受信を含む「絡み」について、利用できそうな現状の仕様をまとめた素敵な資料になっています。複数ゴーストの連携に関して興味のあるゴーストマスタさんは是非ご一読を。

その中で触れられていたコミュニケートとraiseotherの相違点の項目で、以下のように触れられていました。

コミュニケート
送信対象は一度に一人まで
raiseother
その場にいる全員に同時に発信できる(__SYSTEM_ALL_GHOST__)

実は現在(2013-11-03)、最新のSSP(2.3.12)では送信対象に関してコミュニケートもraiseotherと同等の仕様となっています。

via Satori/里々の小技 – PukiWiki

複数のゴーストに同時に話しかける

*AとBとCに話しかける
$Value0【タブ】A(sprintf,%c,1)B(sprintf,%c,1)C
:4人でマージャンしよー!

同時起動中のゴースト全員に話しかける

*全員に話しかける
$Value0【タブ】__SYSTEM_ALL_GHOST__
:みんなでじゃんけんしよー!

「複数の送信相手」を指定する場合はバイト値1区切り、「その場にいる全員」に送信する場合は「__SYSTEM_ALL_GHOST__」を使います。これはコミュニケートの場合はValue0ヘッダに、raiseotherの場合は第一引数に指定することができ、両者の送信対象に関する仕様の差はなくなっています(私がぽなさんの背中を優しくツンツンしてそうして頂きました)。

もしかしたら発表会場でぽなさんが指摘されたかもしれないですが念のため、現状の仕様はこのようになっていますので複数相手のコミュニケートも利用可能です。

SSPのMD5ハッシュ値比較

 - by Don

SSPの開発者さんと話してわかったことですが、とある理由によりSSP/2.02.26 からMD5不一致エラーとなるべきファイルも特定の条件で一致とみなす変更が加わったそうです。

これにより、SSP/2.02.25 以前もしくはmateria、CROW、ninix-ayaなどSSP以外のベースウェアではMD5不一致エラーを検出してもSSP/2.02.26以降では検出されないゴーストがいくつか存在することになりました。

チェックリスト

「ウチのゴーストは最新のSSPでさえ更新できればいいのよ。古いSSPや他の処理系なんて知らないよ。」
→ Ctrl + W を押す
「mjd!?ウチのゴーストは大丈夫なの!?」
→ 次へ進む

検証方法

  1. SSP 2.2.00 Fullsetを用意
  2. ネットワーク更新エラーの検証法に従って全ファイル更新できるか確認
「よかった、MD5不一致エラーになるゴーストはいなかったんだ。」
→ おめでとうございます
「MD5不一致エラー出てるんだけど!?どうすればいいの!?」
→ 次へ進む

解決方法

とりあえず全ファイルFTPで(バイナリモードで)アップロードし直してください。

「あれ?MD5不一致エラー出なくなったぞ?」
→ おめでとうございます or 念のため次へ進む
「MD5不一致直らないんだけど…。」
→ 手作業での更新はやめて「そだて」の使い方を覚えましょう

予防方法

全ファイルFTPアップロードで解決した場合。残念ながら、あなたが利用しているサーバは腐っています。

  • サーバを引っ越す
  • あきらめる

余談

SSPはMD5不一致エラーとみなすべき?

サーバが腐っていた場合でもSSPが気をきかせて一致と判定するようSSP/2.02.26から変更が加えられました。これについては(更新履歴で触れられてすらいないことも含めて)様々思うところがあります。ただ、仕様が絡む問題はかなりセンシティブなものなので、今回はあまり触れないことにします。SSPは元々、伺かの仕様に準拠していない不完全なNARすらも無理矢理動かしてしまうことに執念を燃やしているベースウェアですし、製作者が実現したい機能を実現するという当たり前のことを尊重したいと考えます。

悪者を一つ祭り上げるとすれば、「腐ったサーバ」です。大切なゴーストの更新ファイルを置いておくものですから、サーバ選びは慎重にしましょう。

ネットワーク更新エラーの検証法

 - by Don

ここのところずっとupdates2.dauとにらめっこしている生活をしていますが、このファイルに記載されている更新ファイルが存在しなかったりして、ネットワーク更新エラーとなるであろうゴーストがいくつか見受けられました。

MD5不一致エラーの報告をユーザさんから受けた際に、手元の環境で再現せず困惑するゴーストマスタさんもいらっしゃると思います。SSPは差分しか更新対象としないため、すべてのファイルが更新可能であることを検証するためには、ローカルのすべてのファイルを削除する必要があります。

検証の手順

開発用のSSPとは別に、ネットワーク更新検証用のSSPを用意します。そこに自作ゴーストをインストールするわけですが、SSPを終了した後、 ghost/master/descript.txt だけを残して、それ以外のファイルを全て削除します。ゴーストとして起動できなくなりますが、構いません。

descript.txtに次のようにhomeurlを記述します。

homeurl,http://www.example.com/

別のゴーストでSSPを起動し、Ctrl+Eでゴーストエクスプローラを立ち上げ、自作ゴーストを選択してネットワーク更新を開始します。するとなんと、すべての更新ファイルが降ってきます。髪の毛一本から人体を復元する黒魔術みたいですが、差分更新である伺かのネットワーク更新とは元々そういうものであり、そうあるべきものです。この時に必要なファイルの取得に失敗したら、そのファイルを更新ファイルに含めてあらためてアップロードすることで、エラーを解消することができます。

更新エラーを防ぐために

運良く更新エラーの報告を頂けた場合は上記の方法で検証できますが、そもそも更新エラーを起こさないようにするための工夫があったほうが望ましいでしょう。

エラーを未然に防ぐ最良の方法は、ツールに任せることです。人間が手作業で更新していれば当然間違いが起こります。現在入手可能でメジャーなツールと言えば「そだて」でしょうか。他にご紹介できるものが無いので歯痒いですが。

追記