目次・序文

0

序文
伺かアニバーサリー（大名古屋）から 1 年半過ぎ、SSP の更新ログも、普段よりは少な目ですがそこそこ溜まりました。
リアル事情でうかべんの開催がなかなかできないので、じゃあ代わりに 1
年半分の進歩と退化？の様子をまとめたものがあれば、興味深いものが出
来上がるのではないか？と思うのは、割と自然な流れではないでしょうか。

さて、基本的に更新履歴は端的で実用一点張りであるべきで、ゆえに割と素っ気なく書いている
わけですが、開発の実態はリファクタリングしてはエンバグし…の無間地獄が続いている、たいへん泥臭いやつなわけです。
また、そのバグがなぜ起きたのか、その改良はなぜ行われなければならなかったのか、という事
情を技術的詳細に至るまで毎回説明していては、更新履歴を書くだけで日が暮れてしまいます。
しかし、使う方にとっては、その素っ気ない更新履歴から内幕を読み取ることは不可能ですから、「なんだか余分なことをしてバグってる独り相撲だなあ」とか「いいからバグだけ取れよ、余分なことするなよ」と思ってしまうのは当たり前だろうと思います。このあたりに開発者とユーザーさんの溝ができてしまう一因があるのでしょう。
幸い伺かは「基盤となるソフトウェアの開発者」「ゴーストの開発者」「ユーザー」が割とあまり区切り目なくダラ～ッと続いているような文化ですから、大きな溝が出来上がった事例は個別に思い出せる程度しかありません。
とはいえ、内幕がいまいち見えないような状況が続いていると、何かしら歪みが出てくるのは当たり前ですから、誰かそのあたりをうまく橋渡ししてやる必要があります。
本書はそういった事情から出来上がった、愚痴が入り混じる開発者の殴り書きといった様子のものになります。ぜひや～いバグ野郎だ～と読みながら指さして笑ってやりましょう。

目次・序文

目次
１～ ２

目次・序文

３～１０

第１章：2018/11～2019/5

１１～２２

第２章：2019/9～2020/3

２３

第３章：2020/4～

２４

奥付

第1章
大名古屋

1

2018/11～2019/5
伺かアニバーサリー（大名古屋）が終わったあたりで、リアル会場でいろいろ要望を聞けてやる気満点！というあたりからログはスタートします。
まあ、聞けた要望のうちそこそこの割合が無理なやつでしたが…。
例えば PSD を読む仕様とか、いつ仕様変更が入るかわからない画像フォーマットを基準にするのはさすがに厳しい…

2.4.26 2018/11/29＋ getaistateex

getaistate の複数表示バージョン。

※ getaistate(ex)で小数点以下も認識できるようになった※ 本体更新時に更新中（Zip 解凍中）のウインドウを出すようにした
× 十得ナイフ(SwissArmyKnife)のバグ修正
× AI グラフの背景が表示できない問題修正
× 英語版リソースで音声認識・合成がらみが抜けていた問題修正
オリジナルの AI グラフと SSP の新実装グラフ「AI グラフ」なんて、正直なところ materia 時代の人も見たことがない機能です。おそらくゴー
スト上で扱える単語・文章数（＋学習機能で増えた単語）をグラフ化して表示する機能だとは思うのですが、当時の実装意図はわかりません。
最初は SSP には搭載されていませんでしたが、四月馬鹿で悪ノリしてつけてしまいました。あとから少し後悔したものの、汎用レーダーチャート表示機能としては使えるのでそのまま残しています。
オリジナルと違い、小数点以下の数値も認識するようになった、というのがこのバージョンでの改良点です。右側の「牽引力(tf)」が小数点表示になっているのに気づくと思います。

第1章

2.4.27 2019/1/24※ PNG 読み込みの高速化※ 「1 文字分」として扱うべき Unicode シーケンスを 1 回で表示するように変更
× don't need bind,1 の設定で着せ替えが来ると警告を出すようにした
× ゴーストの設定をシェルでオーバーライドできない場合がある問題を修正
× URL を指定してサウンド再生できない場合がある問題を修正
Shift JIS 全盛期から PC を使っている人は、マルチバイト文字という言葉になじみがあると思います。1 バイトで表せない文字のことです。漢字の文字数が 256 種類で足りるはずもないので、当然複数バイトが必要になりますから、1 文字 1 バイトを前提とするコードとの互換性を保ちながら、複数バイトで 1 文字を表現すべく様々な苦労が重ねられてきました。
時は過ぎ、今では Unicode なる世界中の文字を全部表現するのを目標とする文字コード規格が存在します。この規格、当初は 2 バイト（＝65536 種類）ですべてを表現しようと頑張っていたよ
うなのですが、当然ながら足りるわけがありません。仕方がないので、・サロゲートペア・グラフィムクラスター
・ゼロ幅接合子
なる奇怪な仕組みができ、「複数文字コードで 1 文字表現な！」ということになりました。わーい、前史のマルチバイト文字時代に退化しちゃったぞー！
このバージョンでは「ゼロ幅接合子」と「グラフィムクラスター」の扱いをすっかり忘れていたのを補完しています。1 文字ずつ表示するというできて当たり前のことの実装に地獄を見るとか冗談にもほどがありますが、この不完全な世界では事実なのです。
グラフィムクラスターの例：「家族」の絵文字
組み合わせも変えられる…

第1章

2.4.28 2019/3/15＋ ゴーストキャプターさくら登録機能を SSP 内蔵
プラグインなしで登録作業ができます。多数のゴーストをインストールしている方に最適。
まだβ版レベルの完成度ですがとりあえず登録はできます。
※ 旧仕様互換機能に切り替わりにくくした※ 明らかに新仕様と判定できるゴーストは旧仕様互換機能を強制無効とした※ SHIORI などから有効な返り値が戻らない状態のときにエラーログを出すようにした
だいたい AYA 対策※ HTTP に Accept-Language を入れるようにした：国際化対応※ SSP で作成できるショートカットに AppID プロパティを入れるようにした
× UTF-16 サロゲートペア領域の文字が自動改行で化ける問題を修正
× 終了時にフリーズし ssp.exe が残ったままになる場合があった問題を一部修正「旧仕様」は SHIORI/1.0 のことです。バージョン 1.0 なんていつの時代だよ。もう「化石仕様」って書いても確実に許されるんじゃないでしょうか。「何か。の略歴」によると、2001 年 4 月より前、この資料を作った時点で 19 年前の規格らしいです。あまりに昔すぎて気が遠くなりそうですね。
このはるか昔の規格では、好感度に応じたマウス反応という割とありふれたものでさえも、まともに書くのは至難の業だったのですが、2001/5 版の SHIORI/2.0 以降、すべて SHIORI に任せる
よう方針変更されており、今のように自由に条件分岐を入れたりできるようになりました。
さて、ここで難題なのは、SHIORI のプロトコルバージョンが 2.x というだけでは、マウス等汎用イベントに対応しているかどうかを判別できない、という厄介な問題にどう対処するかです。
当初はダミーのマウスイベントを送って判別していましたが、このバージョン以降は、ファイル群の配置状況等も見ながら総合的に「新仕様」かどうかを判別するようになっており、SHIORI のエラーで「旧仕様」と誤認することが少なくなっています。
参考：昔のゴーストのファイル構成 piro.dll とか script.txt とか見覚えのないものが…

第1章

2.4.29 2019/3/15※ ゴーストキャプターさくら登録機能の調整
× 2.4.28 の各種エンバグを修正
2.4.28 のブラッシュアップだけといった感じです。
「各種エンバグ」はいつものことなのでお察しください。この時はそこまで影響範囲が大きいバグはなかったと思います。…問題は次です。

2.4.30 2019/3/16
× 安全のためのエラー処理用コードが原因で起動直後に落ちるという本末転倒にも程がある
大エンバグを修正
プログラミング手法の中に、データ境界部分に必ず無効や終端と認識されるデータを余分に置いておくことで、確実に終了条件を満たすようプログラミングする「番兵」というものがあります。
…ただし、番兵を置くためのコード自体が腐っていては大惨事まっしぐらですね。

第1章

2.4.31 2019/3/29＋ エクスプローラで起動していないゴーストのシェルリストを確認できるようになった＋ 起動時ゴーストを選択して起動するダイアログが、普段のエクスプローラとほぼ同じことができるようになった※ ネットワークログに TLS の Issuer/Subject/Validity Date を追加※ 内部安定性改善（主に COM を扱う際）※ ハッシュ計算の高速化
× 起動時ゴースト選択をキャンセルした時にエラー終了する場合がある問題を修正起動していないゴーストのシェルの列挙のために、「実際に起動しているゴースト」と「ゴースト1 体を示す情報」を切り分けました。このためだけに 1000 行ぐらいのコードを追加しているのはどうなんだって話なんですけれど。
おかげで内部の管理がスマートになり、ゴーストエクスプローラが実際に起動しているゴーストの情報を参照する必要がなくなったため、ちょっとしたバグと起動直後のゴースト選択機能がリッチになるという良い副作用がありました。
他は 2.5 系の開発本線からの反映です。

2.4.32 2019/3/31
× OnBoot の Ref6 が毎回 halt になっているバグを修正
内部で「起動時に ON にして、終了時に OFF にするフラグ」を管理しているのですが、これをチェックしたり操作するタイミングを間違えた結果、毎回起動するゴーストが「前回落ちた！」とか喋ってしまう大惨事になりました。ある意味 SSP らしいやつ。
バグが出たコードの見直しと起動時の初期化処理の書き直しも行っています。
そのせいで、半年後の 2.4.41 のバグの原因がここで生まれていたりします（フラグ）第1章

2.4.33 2019/4/6＋ ヘッドライン機能で JSON Feed に対応
内部で JSON パーサを実装、他サービス対応等の布石※ ゴーストキャプターさくら対応の改善※ 関連付け機能の改善：「既定のアプリ」設定に出てくるようになった※ 標準の外部アプリ設定判定を改善、空欄でも適切なアプリを起動するようになった※ Windows 10 19H1 展開準備
× スクリーンセーバ判定処理で時々リソースリークする問題の修正
割と機能追加しているように見えますが、2.5 系の開発からのフィードバックがほとんどです。
Windows 10 の新機能「Timeline」への対応にいろんなものが必要だったので、それを 2.4 系にもおすそわけしたというわけ。2001 年開発開始のアプリがなぜか JSON を理解するというあたりがプログラマさんにはウケますかね。
Windows Timeline への対応が終わると、Windows の履
歴機能に→こんな感じに表示されます。
これに対応すると、設定にもよりますが、同じ Microsoft
アカウントを使っている端末間で履歴が共有されますか
ら、デスクトップ機で起動していたゴーストをタブレッ
ト機でも起動したい時などにちょっと便利になります。

2.4.34 2019/4/10※ Windows 10 19H1(Ver.1903)対応
さらっと書いていますが、この時点でも 2.5 系からのおすそわけが内部では続いています。
見た目にはいまいちわからないので、書けるのがこの 1 行しかなかったのですが。
さて、次はおまちかね、バグ地獄です。

第1章

2.4.35 2019/4/14
× alternativestart などのカッコで囲まれた複数パラメータの処理がバグっていた問題を修正

2.4.36 2019/4/14
× alternativestart などのカッコで囲まれた複数パラメータの処理が…
バグっていた問題を修正…
した結果バグっていた問題を修正

2.4.37 2019/4/14
× alternativestart などのカッコで囲まれた複数パラメータの処理が…
バグっていた問題を修正…
した結果バグっていた問題を修正…
した結果バグっていた問題を修正

2.4.38 2019/4/19
× alternativestart などのカッコで囲まれた複数パラメータの処理が…
バグっていた問題を修正…
した結果バグっていた問題を修正…
した結果バグっていた問題を修正…
した結果バグっていた問題を修正

トリプルエンバグ決まったー！
この 4 バージョンは散々な目に遭っています。
基本的に SERIKO 仕様はカンマ区切りなので、SSP は内部で「カンマと行区切りを認識して 1 要
素ずつ順番に読む」処理が組まれていますが、それゆえに
animation0.pattern0,alternativestart,(1,2,3)
なんて書かれると、カッコの中のカンマも認識してしまい最悪なわけです。
それなら「カッコに囲まれてれば読み飛ばす」実装にすればよかろうとテキトーに処理した結果、今度は文字コードの問題が発生しました。昔から PC を使っている方ならご存じの「SJIS ダメ文字」問題です。当たり判定識別子には ASCII 文字以外も受け入れる仕様？なせいで、当たり判定
を日本語で書いているゴーストさんの一部がバグりました。
これはマズいけどちゃんと調査するのダルいな～と、昔の実装に中途半端に戻そうとしたせいで、途端にコードが散らかり迷宮入りしてしまいます。
なお、このバグは 11 カ月後の 2.4.62 で再燃します…
教訓：本当にヤバそうなときはちゃんと書き直しましょう。

第1章

2.4.39 2019/5/11
× interval = talk で複数のアニメーション設定があった場合、interval が大きいほうに強制的にすべて合わせられてしまい、それぞれが独立した実行タイミングで動かなかった問題を修正
口に出すのも憚られるようなトンデモ手抜き実装だったので吊ってきます
口に出すのもはばかられるやつも活字なら大丈夫だよね！
昔の私、「interval = talk」なんて 1 つしか書かんやろ、と、内部の実行管理変数を 1 つしか作ってませんでした。万が一複数書かれた場合に備えて、最悪落ちないようにしていたのは賢い…よ
うな気がしますが、とっととバグとして明るみに出ていたほうがよかったかもしれません。反省。

2.4.40 2019/5/13
× Windows 2000 より古い OS で起動できない問題を修正
コードはほとんどいじってませんでした。ssp.exe を作る時のパラメータの変更のみ。
ここで、ログはいったん途絶えます…

第2章
大往生

2

2019/9～2020/4/5
2019/5～9 あたりは、開発者のリアル事情が火を噴いたせいでほとんどコードに手をつけていませんでした。とてもつらい。
再開は夏が過ぎ、メンタル的に微妙に回復しつつあるころからです。
リアル事情が改善したわけではなく継続中なのがつらいところですが…

2.4.41 2019/9/5
× 最大化したウインドウを元に戻した時に、最小化が勝手に戻る場合がある問題を修正
× 音声認識を一度閉じると再度開いても認識しない問題を修正 (BTS:18)
× Ctrl-Shift-Enter などのグローバルホットキーが効かない問題を修正 (BTS:24)
× インストール先フォルダの選択肢ダイアログのスクロール時の問題を修正 (BTS:22)
久しぶりの更新では、2.4.32 からの半年間気づかれなかったエンバグの修正が入っています。
私も気づいていそうなはずなのに何でここまで気づかなかったのやら…
ダイアログ構築コードの見直しも行っていました。
「フォルダ選択肢ダイアログ」はこれ→のことです。
「インストール時に格納するフォルダを選択する」機能を使っていないとまず見ないかと…

2.4.42 2019/9/7
× \f タグでフォントファイルを使用すると削除・更新で不具合が起きる問題を修正 (BTS : 19)※ Windows 10 19H2(1909)で動作確認
フォントをファイルから一時的に読み込んで文字列表示する、なんてことができるって知ってました？あまりでかいのは嫌がられるかもしれませんが、好きなフォントの適用が可能です。
\f[name,Nishiki-teki.ttf]
このバージョンでは、フォントファイル使用中はファイル操作ができなくて、ネットワーク更新
でバグる問題の対策が入っています。前に組んだつもりだった「一時的にフォントファイルを開放する」機能がうまく動いていなかったようです。

第2章

2.4.43 2019/9/30
× Unicode 文字正規化処理の問題を修正 (BTS:28)
さらっと書いてますが、確保するメモリ領域の不足で実は内部はたいへんなことになってました。
バッファオーバーランしてたと言ったら一部のセキュリティがらみの人はたぶん渋い顔をすると思います。本当に申し訳ない…

2.4.44 2019/10/6
× シェル倍率変更時（拡大縮小処理あり時）に不安定になる可能性がある問題の一部を改善
バッファオーバーラン第二弾。連発でやらかしてました。
拡大処理の時の「拡大先」の画像サイズの指定ミスで酷いことに…申し訳ない…

2.4.45 2019/10/25
× 複数ゴーストの起動・終了を短時間のうちに繰り返す時に異常終了する問題を修正
× 複数ゴーストの起動・終了を短時間のうちに繰り返す時にフリーズする問題を修正
× 拡大縮小処理時に落ちる場合がある問題を修正
× 拡大縮小処理の品質設定が効かない問題を修正
× \![raise]のランダム指定で落ちる場合がある問題を修正
前半は詳しく書いていませんが、ゴースト起動履歴を記録する機能ですごく微妙なバグがあり、起動・終了操作のタイミングが重なった場合に限り異常な挙動をしていました。
後半は 2.4.44 での修正漏れと原因調査の横展開。
あとランダム指定が自分自身を指す場合もあるという酷いやつ…

2.4.46 2019/10/26
× 拡大縮小処理時に落ちる場合がある問題を修正(2)× 反転処理がおかしい問題を修正
× region モードで拡大縮小時にバルーンの外枠が更新されない問題を修正
2.4.44 から引き続き似たようなバグが燃えています。SSP がゴミのようだ。
調べているとコレも疑わしいぞというのが散々出てきますね。

第2章

2.4.47 2019/10/29
× Wine 上で実行すると表示がおかしくなる問題を修正
Wine(UNIX 系 Windows 互換ソフト)と本来の Windows で、ウインドウ管理で微妙な差異があり、シェルの表示が欠落したりする謎現象が発生していました。
Wine 用の特殊コードはできるだけ書かないでくれ、という Wine 開発チームからの要請が以前か
ら公式サイトに書かれていたはずなので、双方できれいに動くよう見直し。

2.4.48 2019/11/12※ 動画・サウンド再生処理を改善※ Wine 上＋一部 OS＋Chrome か Firefox で URL D&D が効くようになった※ ウインドウ制御を一部改善✕ PNG 読み込みで問題が発生する可能性があった問題を修正
一見別のバグに見えますが、これは実は 2.4.47 の続きです。ほかに Wine 上固有の不具合はないかと探したら出るわ出るわ…。
ただ「特殊な環境ですいません」とかバグ報告者の方が書いていた気がしますが、Wine という別のプラットフォーム上でのバグって、むしろ本来の Windows 上での互換性問題や安定性を見直すキーになってるんです。なので遠慮なく出してもらって構いません。

2.4.49 2019/11/13※ オンライン判定と IP アドレス取得処理を小改善✕ 余分なウインドウがタスクバーに表示される問題を修正
これもまだ 2.4.47 からの延長戦ですが、ここらでどうにかなったようです。
何かを根本的な見直しを兼ねて修正しはじめると、やはりこれぐらいの作業量は必要になります。

第2章

2.4.50 2019/12/4✕ 着せ替え実行時に落ちる場合がある問題を改善✕ TLS(暗号化通信)の処理をする度にメモリリークを起こす問題を改善✕ SSP を起動したまま OS をシャットダウンした時の挙動を改善
さて、たった 3 行のマイナーなバグ修正に見えますが、内部でまたごっそり全体の構造見直しを行っており、結果として 2.4.50 での変更は数千行を超えます。
これを書くために diff を取ったら 3 万行のテキストファイルが出来上がって、PC もぽなの顔面もしばらく凍りつきました。なんだこりゃ…
アプリの起動時には、複雑に関連しあったプログラムの部品を、厳密に決まった順番で構築していき、終了時にはそれを巻き戻す形でやはり細心の注意を払って解体していく必要があります。
これをミスるとシャットダウン時にセーブデータを書き損なったりというマイナーな問題から、
最悪 OS ごとフリーズという惨事までありうるので、とても重要な話です。
以前からこのあたりの予想しない不具合がたくさん積みあがっていたので、とにかく今後起きないようにとここでたくさん見直しを行いました。
当然「たくさん見直し」なんてことをしたら、どうなるかわかりますよね…？

2.4.51 2019/12/15✕ メニューのない着せ替えが動かない問題を修正※ SSLInfo 系イベントの Ref9 に証明書チェーン(CN でカンマ区切り)を追加
着せ替え操作コマンドは、内部でメニューID を投げ合って ON/OFF を制御していましたが、これだと「メニューにないけど実際はある隠し着せ替え」の実装がうまく動きません。
このバージョンで、メニューID とは独立した別の管理 ID を割り振ることで解消しています。

第2章

2.4.52 2020/1/25※ SHIORI の呼び出し方を大改造し、内部で COM を利用していた場合の不具合を回避するようにした※ 似たような内容のエラーログを大量に出力した場合に省略表記するようにした※ ゴーストエクスプローラの検索精度を向上(Unicode ノーマライズ後検索するようにした)✕ SERIKO insert の記述ミスで警告が出なかった問題を修正✕ フルスクリーンウインドウ検出がうまくいっていなかった問題を修正 [ BTS : 40 ]✕ タスクバー位置移動に追従できていなかった問題を修正✕ ghost.dat の shell エントリが存在しない状態が互換性問題を招いていた問題を修正✕ 古い SAORI で落ちる問題のカバー処理がうまく動かない問題を修正 [ BTS : 47 ]✕ ゴーストエクスプローラからの一括更新でデッドロックしていた問題を修正 [ BTS : 45 ]この開発者しょっちゅう大改造してんな…と思われそうですが正解です。また巨大な diff が出来上がって顔がひきつりました。
ただ今回は大変専門的な話になりますので、なんだかわからない方は読み飛ばしてください。
長年にわたる開発の結果、SHIORI/SAORI は特定のスレッド（メイン GUI スレッド）上で呼び出されないと互換性問題が発生しダメという、地獄のような問題を抱えています。従来これはめんどくさいので SendMessage API を使い、別スレッドからの呼び出しと返答待機処理を行っていたのですが、SendMessage 処理中に COM を活用した API を叩けないという厄介な問題を含んでいました。
該当する中でゴースト開発者さんに一番身近なのは dsaudio SAORI とかでしょうか。
ずいぶん長い間この問題を抱えたまま開発を続けていましたが、ここで一念発起して User APC(Asynchronous Procedure Call) なる別の仕組みを用いて、スレッド間をまたぐ処理を行うようにごっそり書き換え、さらにそういった処理が散在していたのを一か所にまとめる書き直しを行いました。当時書き直し後各ゴーストさんがうまく動いてドヤ顔をしていた記憶が残っています。
…しかし、現実はそうは問屋が卸さなかったのです…

2.4.53 2020/1/26✕ シェル設定の存在判定ミスでマスターシェルに戻る場合があった問題を修正✕ 自動切り替えがうまく動かない問題を修正 [ BTS : 43 ]※ STACKTRC.TXT の解析精度を上げた
ゴースト起動初回には、master と名前がついたフォルダからゴーストを読み込みますが、このフォルダ名は descript.txt で変更可能です。なので、手動で変更した記録のないゴーストは descriptの指定に追従するよう組んでありました。問題はその、「手動で変更していない」判定を厳密にするには実装が足りなかったことで…

第2章

2.4.54 2020/1/30
× STACKTRC.TXT を出力する処理内部でさらに落ちる酷い問題を修正
ミイラ取りがミイラ案件
× エラー通知が常に出る問題を修正※ Windows 10 20H1 対応（暫定）× シェル切り替えがうまく保存されない問題を修正（2 回目）
案の定 2.4.53 のシェルの話が再燃してますが、本当に酷い問題が別にありました。
STACKTRC.TXT の出力の時には、「例外ハンドラ」という異常状態をキャッチするための専用
コードが活躍しますが、このハンドラの組み方がいまいちで、ハンドラ内部で落ちてました。
結果、STACKTRC.TXT に記録されるのはすべて例外ハンドラで落ちたという情報に書き換わるという大惨事に…

2.4.55 2020/1/31※ SSP を複数起動した際の挙動を改善
関連付けファイルを開いたり、起動用ショートカットなどで一時的に複数 ssp.exe が立ち上がる時の挙動を改善※ STACKTRC.TXT 出力の精度向上
2.4.50 で、アプリの起動・終了の時の処理は重要だという話がありましたが、本件はそのさらなる延長戦です。ショートカットを開いたり、nar を ssp.exe にドロップしたりすると、一瞬だけ
ssp.exe が 2 つになり、後から起動したほうが先に起動していたほうに「nar が来たよ」「ゴーストの起動指示が来たよ」というプロセス間通信を投げる仕組みになっていますが、その周辺の起動/終了処理の詰めが甘く、操作内容によっては後から起動したほうが異常終了する事態になっていました。

2.4.56 2020/2/8
× ツールチップが挙動不審な問題を改善
× シェル切り替え状態が保存されないエンバグを修正※ Internet 接続状態をより正確に判定できるようにした
2.4.53 のシェルの話がまた出てきています。もう飽きたよ…
インターネット接続状態の件は、IPv6 のみの環境を想定した接続状態のチェック処理を追加しました。今のところ IPv6 だけなんて環境のほうがまだレアですが、IPv4 がすでに枯渇済みの現状ですから、いずれは必要になりますね。

第2章

2.4.57 2020/2/13
× デフォルトゴーストの設定が反映されない問題を修正 [ BTS : 55 ]× 日本語ファイル名の画像が読めない問題を修正 [ BTS : 52 ]※ 2.4.52 の SHIORI 呼び出し改善項目の OS の違いによる互換性問題の調整「デフォルトゴーストの設定」の件は、実は 2.4.50 のエンバグでした。
「日本語ファイル名～」の件は、2.4.35 のエンバグです。
そう！トリプルエンバグがクアドラプルエンバグになりました！
なお、2.4.52 での問題の修正は、この時点では効果なしでした。つらい。

2.4.58 2020/2/27＋ バルーンオフセットにバルーン左右別設定を追加
例：sakura.balloon.offsetxr sakura.balloon.offsetxl
右表示(r)の時の X 座標オフセットは通常と逆の挙動になり、左が＋になる。
＋ メニュー項目の shiori resource 追加
dictationbutton.caption 音声認識
texttospeechbutton.caption 音声合成
aistatebutton.caption AI グラフ（実装したつもりがミスあり）※ プラグインまわりの挙動小改善※ 手動でのゴースト起動時に意図的にフォーカスを奪うようにした※ 問題のある SAORI の自動置き換え処理の改善※ SHIORI ロード/アンロード時の処理の改善
× マルチモニタ上で長大なメニューを表示する時のスクロールの挙動がまともになった
× ウインドウ Z オーダーを手前に持ってくる処理が妙な場所に入っており、時々ウインドウの前後関係がおかしくなる問題を修正
× 着せ替え実行時メモリリークする場合がある問題を修正
バルーンが右に出た時だけをシェル側に寄せたい、とかいう需要が頻繁に出てきていたので、対応するための実装を加えました。
大阪うかもく会 2 回分を延々と唸りながら考え続けた成果になります。
ただし、ちょっとだけ直感的でない仕様になってしまいました。バルーンオフセットは左に出たら右向きが＋、右に出たら左向きが＋となってしまう点です。もともとがこういう仕様（右向き表示の時の X 座標が反転する）なので妙に変えたらそれはそれでバグの元なので…

第2章

その他、長いこと懸案になっていた「ウインドウが突然手前に出てくる」症状がこのバージョン
から多少改善しています。昔のコードの残骸をクリーニングしていると、なぜかウインドウを手前に出すコードが予想外の部分に残っていたというオチでした。
「SAORI 互換」云々は後で。

2.4.59 2020/3/1＋ プラグインのログ機能追加※ フォルダ設定の再読み込みボタンでフォルダの存在を再度確認するようにした※ SHIORI ログに時刻（仮想的変更時は変更後の時刻も）を書き込むようにした
× SAORI 互換機能が仕事を放棄するエンバグを修正
× プロパティシステムで取れる時刻情報が「仮想的変更」できていなかった問題を修正
× 仮想デスクトップ状態検知時に他のプログラムに影響を及ぼす場合がある問題を修正
今更プラグインログかよ！というツッコミはお許しください。実は「SwissArmyKnife」プラグイ
ンのデバッグで自分が困ってしまったのです。プラグイン処理を追いかけるのにいちいちデバッ
ガで変数の内容を追いかけるのに疲れましたし…
また、Windows 10 の仮想デスクトップ機能に対応していますが、デスクトップの状態変更を検知した際に SSP 側に変更を通知する機能に問題があり、制約条件漏れで SSP に限らずあらゆるプログラムにウインドウメッセージを爆撃していたというろくでもない問題でした。
特定のソフトと相性が悪いなんて、ふつうは「おまえの環境が～」って話になりがちですが、こういうトンチキな不具合の結果自分が悪かったパターンもあるわけです。反省。

第2章

2.4.60 2020/3/5＋ バルーンオフセットに追加済の "L" "R" に加え、align=top なバルーンに対するオフセットを示す "C" を追加※ 互換性確保のため、SHIORI 等の呼び出し方法をまた小変更※ 旧 SAORI 等の互換性確保機能をまた小変更
× バルーンオフセットが効かないバグを修正
× \_b タグの centerx,centery が効かない問題を修正
2.4.52 で導入した SHIORI 呼び出しの変更は、Wine 上での挙動がおかしいという問題を抱えていました。User APC なんて仕組みはいまどき使われてないでしょうから、Windows 上でもいつ腐るかわからない代物だといえます（偏見）
紆余曲折の結果、User APC と同等の仕組みを自分で実装しちゃいました。
動作が軽い。こんなマトモな挙動で動くの初めて。

もう何も怖くない…！
SAORI 互換云々は 2.4.65 でお話しましょう。

2.4.61 2020/3/6
× バルーンオフセットを x と y の片方だけ指定したゴーストのバルーン位置がとてつもなくデタラメになるエンバグを修正
× サーフィス変更がない時にもバルーン位置調整するせいでバルーンにちらつきが生じていた問題を修正× Teach/2.4 仕様の実装がとてつもなくデタラメだった太古のエンバグを修正 (BTS)
18 年前の仕様で伺か考古学状態
少なくとも 13 年半以上前の修正のエンバグだったことが判明
伺か考古学のコーナーです。18 年前の仕様が 13 年前からエンバグしていた問題を修正とかいうイカれた CHANGELOG を書くアプリがこの世にいくつ存在するでしょうか。まあ無い。
このバグは以下の複数のバグによって構成されています。
・311 Not Enough と 312 Advice を「正常な返答」として解釈していなかった
・311/312 が返ってきた時に入力ボックスを再表示し忘れていた・Teach 中をきちんと認識するフラグの実装が壊れていた

第2章

2.4.62 2020/3/7
× alternativestart の (0,1,2) ←この書き方を正しく解釈しないエンバグを修正
2.4.35～38 の「バグのデスマーチ」でろくでもない目に遭ったカッコバグがまた再燃しました。
正直もう二度と見たくないわ！とばかりに、この時点で奥まで調査して決定版の解釈コードを一から書き直しています。
いくらなんでもこれで直るはずでしょう。うん大丈夫（フラグ）2.4.63 2020/3/8※ SERIKO の random 系(sometimes とか含む)が必ず\s 直後に実行判定されていたのを変更し、
0.5 秒後に初回判定するようにした
× sakura.name / kero.name がオーバーライドされない問題を修正
× Wine 上で放置判定がガバガバだった問題を仮対策
random なのに毎回\s 直後に実行判定が入るせいで、\s タグを頻繁に使うゴーストのまばたき等の動きがとてつもなく不自然になっていました。
具体的には表情が変わった直後にいきなりまばたきというパターンが割と多く出現するという…

2.4.64 2020/3/14
× alternativestart のカッコ処理にまだ問題があったのを修正 (.62 のエンバグ)
バグのデスマーチ問題…まだ直りませんでした。一級フラグ建築士とはこのことです。
ここまでで alternativestart のせいで、なんと 11 カ月と 7 バージョンも費やしたことになります。
この時点でさすがにこれ以上の不具合は考えづらい程度まで叩き潰しましたので、次はないでしょう。ご安心ください。（←明らかな死亡フラグ）

第2章

2.4.65 2020/3/20※ SAORI 互換処理機能の挙動改善※ エラーログの中カッコ閉じ忘れ検出を改善
× シェルリロード直後にバルーンオフセットがおかしくなる問題を修正
× シェルリロード処理で常に OnShellChanged イベントが起きる問題を修正
× ゴーストリロード処理で常に OnGhostChanged イベントが起きる問題を修正
× 着せ替え数がゼロ＋dressuprootbutton.visible = 1 でメニュー有効になる問題を修正（他、お気に入り等も）「SAORI 互換機能」の説明が延び延びになっていましたので、ここで説明します。
きっかけは Windows 8.1 のリリースのあたりだったと思いますが、メモリ管理の異常判定が厳し
くなり、細かい不具合も含めてすべてエラー終了するようになったことです。
SAORI や SHIORI は複数の作者さんが居るせいで、中にはメモリ管理がガバガバだったり、
SAORI-SHIORI 間通信の規約を守っていなかったりする困ったヤツが紛れ込んでいます。
たとえそれでも落ちるのは SSP ですから、バグ報告はうちに来てしまいます。さてどうしよう…
幸い SAORI の類いは実装が簡単だったり、ソースコードが公開されていたりしましたので、修正版を自分で作ることは容易でしたが、既存のゴーストさんで更新が停まってしまったものはど
うしようもありません。
なので、SSP では SAORI の読み込み処理を検出して、SAORI が作られた日時を確認し、指定より古いものは強制的に対策版に差し替える仕組みを実装しています。
また、単純に差し替えるだけではなく、SSP 内部機能で対応可能なものは無効化する場合もあります。このあたりの処理を互換性を保ちながら行うのは地道な作業ですから、頻繁にこの互換処
理機能はアップデートされています。
今後も同じようなものが出てきたら「ああまたメンドクサイことやってるんだな」と生暖かく見守ってやってください。

第2章

2.4.66 2020/3/25＋ \![set,wallpaper]のオプションに stretch-x・stretch-y・span を追加
× \![set,wallpaper]で壁紙が設定できない問題を修正
OnWallpaperChange に応答するか、\![set,wallpaper]タグを実行すると、ゴーストから壁紙を変更できるという機能ですが、正直わざわざ本体機能として実装は要らずプラグインに切り離すべ
き…だと普通は考えると思います。
実は壁紙設定機能は「偽●×」と言われていた太古の昔からの機能で、互換性を保つためには必ず本体側での実装が必要になります。\![set,wallpaper]タグはそのおすそわけといった次第。
このバージョンでは、壁紙設定をレジストリに書き込む部分にミスがあり、設定でエラーが発生したと誤認して最後の壁紙設定処理まで到達していなかったのを修正しています。

第3章
大復活

3

2020/4/6～2020/9/6「大名古屋」が１章、「大往生」が２章ときまして、本来伺かアニバーサ
リー（大往生）が開催されていれば、この章はあるはずのない何かでした。
そう、新型コロナウイルスが世界を震撼させるあの日までは…
しかし、主催は挫けませんでした。開催すべくぎりぎりまで粘った上で、苦渋の思いで延期判断を下し、大復活へと希望をつないだのです。

2.4.69 2020/4/22※ saori_ip.dll SAORI 互換機能追加、読み込んだ際の異常挙動を回避※ 放置判定を旧来の方式（マウス・キーボード状態読み取り）に戻した※ メッセージ処理を旧来の方式(2.4.5x あたり)に戻した
× 音声認識を起動時に自動的に立ち上がる際にデッドロック状態に陥る問題を修正
× 上記以外の場合でもデッドロックに陥る可能性があった問題を改善
起動中のゴーストの管理のロック処理のミスで、処理が止まったままいつまでも進まない問題をどうにかしました。他も細かい不具合修正ですね。
saori_ip は WinSock の初期化を DLL 内部でもう一度やってしまっていた問題の対処です。内部
ではまるごと SAORI を乗っ取る処理が動いています。

2.4.70 2020/5/9※ AI グラフが画面の大きさをはみ出しそうな時にスクロールするようにした
× NAR/更新ファイル作成で不要ファイル/フォルダも含まれてしまう問題を修正
× 終了時に STACKTRC.TXT を吐いて落ちる場合がある問題を修正
× RSS の解析エラーを起こした時に OnExecuteRSSFailure にならない問題を修正
× \![execute,rss-get]の解析エラー条件が厳しすぎる問題を修正
× saori_ip.dll 互換機能の実装が甘い問題を修正
2.4.26 で確かに複数出せるようにしたけど、AI グラフを 5 つも表示するなんて聞いてないぞ！！
…といっても、実装しちゃったものは仕方がないので、スクロールできるようにしました。

第2章

2.4.71 2020/5/12※ PNG と PNA のサイズが違ったり、PNA がグレイスケールでない時エラーを出すようにした※ PNG より PNA のほうが小さい時に、足りない分は透明領域で補うようにした※ お気に入り/ポータルのサムネイルに URL 指定されている時に、自動で取得するようにした
× banner フォルダに画像があるにもかかわらず、サムネイルが表示されなかった問題を修正
太古の昔の機能シリーズその…いくつだっけ？
おすすめ/ポータルサイトメニュー内でバナーを表示できるということ自体を知らなかった人も多いと思います。ましてや banner フォルダに入れておくとか、URL 指定したら自動取得してくれるとか考えもしませんよね。報告来るまでは私も忘れてました。

2.4.72 2020/5/14
× updates2.dau / updates.txt が所定の形式以外(サービス終了や 404 を示す HTML など)で取得できた場合に「更新なし」となっていた問題に対処
サービス終了したフリーWeb サイト公開サービスなどで「サービス終了しました」とか「ファイルが見つかりません」という内容のファイルが見つかってしまうことがあります。HTTP 仕様上
は単なる転送処理で実装するというとても駄目なやつです。
正直サーバ側が悪いのですが、SSP 側でも updates2.dau 等の読み込み処理がとても雑で、本来おかしい書式のファイルが取得できてしまった場合はエラーにすべきところなのですが、そうではなく、有効な定義がないだけの「更新無し」判定になってしまっていました。

2.4.73 2020/6/7※ TLS:ALPN 対応(HTTP/1.1 実装のまま、プロトコル明示したのみ)※ master シェルのないゴーストで警告が出るようにした
× nar 作成時に updates2.dau が入らない問題を修正
× SSP 終了時に落ちる場合がある問題を修正
× \![set,z-order]しているゴーストが終了時に落ちる場合がある問題を修正
割と「何々したら落ちる」とか散々なバグだらけでした。このあたりは実は書いたコードの量的にはたかが知れているのです。調査にとてつもなく時間がかかるだけで。
1 週間悩みぬいた上で書いたコードが実質 1 行だけとか割とあるある。

第3章

2.4.74 2020/6/9＋ \![change,ghost] \![change,shell] \![call,ghost] に --option=raise-event を追加
イベント通知あり（バルーンブレーク中断もあり）の切り替え操作オプション※ 再三発生する互換性問題のため、SHIORI キャッシュをデフォルト無効にした※ 関連付け等で開く操作を高速化した
× エクスプローラから更新した時に間違った更新 URL を拾い出す場合がある問題を修正
外部のゴーストエクスプローラから SSTP を送って切り替えしたい、という需要が出てきたので、
本来メニューからやるのと同じ挙動になるゴースト切り替えタグを追加しました。
で、せっかくやるのだから change/call 系全部に追加実装しました。

2.4.75 2020/6/9
× updates2.dau / updates.txt を無限に更新してしまう問題が再発したエンバグを修正
なぜか更新定義ファイル(updates ナントカ)を無視するための処理が度重なる修正作業で消えてしまっていました。updates2.dau が含まれた updates2.dau が存在した場合、鳥が先か卵が先か的問題で永遠に更新が続いてしまいます。

2.4.76 2020/6/14
× 最小化した状態で終了操作すると落ちる問題を修正
× 2.4.75 やさらにその前から、更新 URL 取得処理が微妙にエンバグしていた問題を修正
ウインドウメッセージ処理の微妙な問題があり、SSP 内部で処理を完結すべきところで OS 側に制御を渡してしまった結果、最小化状態では本来来るはずのないタイミングで別のウインドウメ
ッセージが来てしまい落ちた、という問題だったと思います。
これもたった 1 行の修正の調査に数日という類いの厄介な問題でした。

第2章

2.4.77 2020/6/16※ 上書きインストール時の処理を改善

見ての通りです。
上書き警告ダイアログのほうは「名前を変えてインストールしますか？

はい/いいえ」だったので、上書きしようと思って間違って「はい」を選んでしまう問題が多発していたようです。すいません。正直なところ「ゴーストマスカレード 2」企画でインストールしたゴーストを、正式公
開用ネットワーク更新可能版に差し替える作業中に私もやらかしたのです。
自分がやらかすぐらいの最悪な UI なんぞ絶対にダメなので、まるごとやり直しました。

2.4.78 2020/6/24＋ バルーンの￥1 用マーカー＆スクロール矢印を実装※ 拡張子のない zip ファイルを自動認識してインストールできるようになった※ Windows 10 2004 以降のセグメントヒープを有効化
× 「全て終了」実行中の切り替え操作を無効化（フリーズの原因になるので）バルーンのマーカー（\![*]で表示されたり SSTP 表示の頭に出たりするやつ）や、スクロールの矢印って、今まで全部共通デザインでしたが、\0 と\1 のデザインがまるで違うバルーンを自作していて「こりゃダメだ」と気づいて実装しました。
やっぱりこういうのは自分で作ってみないと気づきませんよね。

2.4.79 2020/6/24
× スクロールバーが表示されないサイズの AI グラフが完全に表示されなくなるエンバグを修正
2.4.70 のエンバグです！ごめんなさい。
スクロールバーが表示されていない時に無理やりスクロール状態を取ろうとして、でたらめなス
クロール位置を拾ってしまい、AI グラフの描画がウインドウ外に吹っ飛んでいました…

第3章

2.4.80 2020/7/8※ 疑似乱数生成器を TinyMT に戻した
※ 疑似乱数生成器に食わせる seed を高品質（よくばらける）なものに改善した※ UNIX socket SSTP の実験
× 一部非同期処理の終了待ちにミスがあったのを修正
× きわめてごく一部の HTTP サーバと通信できなかった問題を修正
何かゴーストのランダム切り替えが微妙に偏るんだけれど、という話を聞いて、どうせ「本当の乱数は乱数っぽくなく感じる」問題の類いだろうとたかをくくっていたのですが、内部の実装がとてもゲロゲロな状態でした。ごめんなさい。
結局昔使っていた TinyMT に戻した上で、食わせる seed も「マイクロ秒単位の OS 起動時間」という雑な実装から、暗号学的に安全な乱数を食わせる方式に変更しました。

2.4.81 2020/7/15※ PNA のグレー判定条件が厳しすぎたので緩めた※ HTTP:なるべく TLS 通信を使うために Upgrade-Insecure-Requests を追加した※ HTTP:TE ヘッダを追加し対応圧縮方法を明示した※ HTTP:Transfer-Encoding / Content-Encoding 仕様の対応状況を改善した
× DirectSSTP をローカル判定しないエンバグを修正
HTTP 仕様のこまごまとした部分を修正しています。
圧縮云々は gzip だと大丈夫だけど deflate だとダメだった、というすごくマイナーなやつでした、
そもそも deflate 圧縮(zlib ヘッダ)なんてまあ使わないので、かなりマイナーな条件といえます。
TLS 通信云々は割となんとなくですが、ネットワーク更新中に通信路の途中で改ざんされる可能性が激減するので、DLL とか割とヤバめなファイルをやりとりする時に安心できる…かもしれま
せん。

2.4.82 2020/7/18
× SHIORI 等の文字コード強制設定がうまくいかない問題を修正※ エクスプローラから更新する際の更新 URL 読み取り処理を改善
ゴーストエクスプローラ上で更新をした場合の、できるだけ SHIORI 等を起動せずに更新 URLを取得するため、無理やり辞書を読んで更新 URL らしきものを探す処理が微妙にバグっていました。辞書を「解釈」してはいないので仕方ない部分もありますが…

第2章

2.4.83 2020/8/16
× Charset 指定のない SHIORI で文字化けする問題を修正
× STACKTRC を出力するエラーが起きた時にきちんと終了しない可能性がある問題を修正
× 着せ替えエクスプローラに表示されない着せ替えがある問題を修正
× HTTP 接続が長時間タイムアウトせず、更新等でゴーストを操作できなくなる問題を修正
だいぶ前から「ネットワーク更新でフリーズする」という謎の報告を受けており、当方で再現せず頭を抱えていました。再現しなかった理由は簡単で、定期的に自分が管理するネットワークのメンテナンスを行っていたせいで、ネットワーク系のトラブルが皆無すぎたという…
具体的な修正は、connect を同期処理から非同期処理に変更し、タイムアウト処理を仕掛けました。WinSock に限らず connect ってトラブった時のタイムアウトを制御できないようなので。

2.4.84 2020/8/16
× SoSiReMi 上のゴーストが更新できない場合がある問題を修正
× 新たにディレクトリを作成する必要があるような更新が失敗する問題を修正
SoSiReMi 側で updates2.dau を生成すると「ディレクトリの名前と同じ 0 バイトのファイル」が存在するかのような更新定義が出力される場合があるようです。あからさまにこれはアウトなので、0 バイトっぽいものを見かけたら無視するようにしました。
そもそもディレクトリを生成できない問題は、昔ディレクトリを自動生成する処理を確かに仕込んでいたはずなんですけど、いつのまにか消えていたという凡ミスです。ごめんなさい。
たぶん何度も書き直しているうちに消しちゃったんだと思います。

2.4.85 2020/9/2※ OnInstallReroute・OnInstallRefuse の Reference1 に識別子(type)、
Reference2 に名称(name) を入れるようにした
× OnInstallReroute の Reference0 が来ない問題を修正
× 一部の古いゴーストが起動しない問題を修正
OnInstallReroute 云々は純粋なバグと強化なので置いておいて、「一部の古いゴーストが起動しない」とは、SHIORI や SAORI の中に、GlobalAlloc して返せと仕様書に書いてあるにもかかわらず、単にバイナリ内の文字列定数を返す不具合のあるものが存在するせいで、OS のセキュリテ
ィ機能に引っかかり強制終了されるという話です。

第3章
最大往生

4

2020/4/6～
SSP はまだ開発が続いていますので、未来のお話もまだ続きます。
簡単に先のバージョンで書かれそうな CHANGELOG を挙げてみましょう。まあ、確実にこの通りには実装は進まないとは思いますが！
ところで、大往生

2.5.xx 2020/4/6～＋ Windows Timeline への正式対応＋ Windows 8 以降への新機能群への追従＋ WinRT アプリとの連携（できそうなら）

2.6.xx 2021？
＋ 自動セーブファイル共有機能＋ カレンダー機能の大幅見直し＋ OAuth 対応

3.x.xx＋ 3D シェルの本格実装＋ 仮想空間への殴り込み

99.x.xx＋ 強い AI によるトーク完全自動生成機能＋ 雷雨の日に実体化する機能（1.21 ジゴワットの電力供給が必要）奥付

詳説 SSP 苦闘の歴史
2020 年 4 月 5 日

初版第 0 刷発行→頒布中止

2020 年 9 月 6 日

初版第 1 刷発行

著者

Chameleon Ponapalt（ぽな@ばぐとら）

訳者

La Est Lacherir（ラーシェ）

挿絵

FA-X（かぱ）

発行・編集人Chameleon Ponapalt

編集・制作

独立伺か研究施設

ばぐとら研究所

印刷・製本

独立伺か研究施設

ばぐとら研究所（自家印刷）

発

行 所

ウカガイリー・ジャポン

発

売 元蟲取高速鉄道連

絡 先ponapalt@shillest.net
http://ssp.shillest.net/railway.html

乱丁・落丁などありましたら良品に交換いたしますのでお知らせください。
©Chameleon Ponapalt Printed in Japan