
|
|
|
NOTIFY リクエストが来た際、美坂はまず Reference 引数から適切なシステム変数を作成する等、カーネルとしての最低限の処理を行い、その後、$OnNotify_id というシンボルを持つユーザコードを実行する。Reference 引数は NOTIFY を受けた状態のまま維持される。なお NOTIFY リクエストの性質上ここでスクリプトを返してもそのまま破棄される。 #0
{
#1
{$z=""}{$if (2==1) { {$z=1}{$z++}b }}{$z}
#2
{
#3
あいうえお
#0 は #1 に整形するが #2 は #3 のようにするという人間にとってだけ都合のよい処理 |
|
#0
{
#1
{$z=""}{$if (2==1) { {$z=1}{$z++}b}}{$z}
だが、決して間違っているわけではない |
|
それぞれの HWnd |
|
SHIORI/3.0 に変更した際高レベル処理部の移植をミス。重大なところでは例えば $_OnRandomTalk も含むので致命的 |
|
テンプレートに filedrop2 受け取りの例を追加 |
|
文字列 s の長さ(バイト数)を返す。 配列 a の要素数を返す。添え字はこの関数で得られる値 -1 まで有効。a が単純変数だった場合は常に 1 が返る。a が配列変数でも単純変数でもなかった場合(NULL だった場合)は -1 が返る。 |
|
|
|
今後はロードの際のファイル名と完全同一なものだけが正しい識別子となる。 |
|
事実がややこしいのでその説明文もややこしい |
|
|
|
|
|
一応エラーメッセージが出るのが正しい |
|
これくらいはやってもバチは当たらない。 |
|
expression で示された四則演算式を計算し結果を返す。式は複数項記述/括弧による演算優先順位制御可。例示
{$calc(1+1)}
使用できる演算子 + 加算 - 減算 * 乗算 / 除算 % 剰余 ^ べき乗 小数点数の概念はない。除算の結果小数点数が出た場合それは切り捨てられる。 説明が面倒なので仕様書の「単純変数」の項を参照 |
|
旧美坂テンプレートの代表的な問題点 ランダムトークの間隔が分単位の精度しか持っておらず、質が低い 起動した後最初の OnMinuteChange で必ず「時」変化イベント(n時になった)が起きる 起動した後最初の OnMinuteChange で必ず「起動時間」変化イベント(n時経過)が起きる \q の書式が一部古い \![*] 等の MATERIA B 以降の要素がない 美坂テンプレートを元に作ったゴーストはほぼ全て上記の傾向があります。 全てユーザコードの問題なので、OnMinuteChange 付近を見て、必要な部分をコピペして直してください… |
|
システムシンボル $_OnRandomTalk がコールされる間隔。単位秒。 システム変数 $_talkinterval で指定された間隔の 0.5 倍から 1.5 倍程度でコールされる。いわゆる「ランダムトーク」を記述する。 ランダムトークカプセリング構造。 システム変数 $_talkinterval に値をセットすると、その値の 0.5 倍から 1.5 倍程度の間隔でシステムシンボル $_OnRandomTalk がコールされる。$_talkinterval に 0 をセットすると $_OnRandomTalk はコールされない。 同じ事はユーザコードでも実現できる。 従来のユーザコードを用いた分間隔のランダムトークスクリプトとは干渉しない(そのまま動く)。 |
|
まともな SAORI filename で示された SAORI DLL をロード、ロックする。 filename で示された SAORI DLL をアンロード、アンロックする。 arg を argument ヘッダとしてセットして filename で示された SAORI を実行する。当該 SAORI が response を返すまでブロッキングする。指定された DLL がまだロードされていなかった場合は落ちる。SAORI 内部でエラーが起きた場合も落ちる。例示
{$loadsaori("substr.dll")}
{$temp={$saori("substr.dll","あいうえお",2,3)}}{$temp}
{$unloadsaori("substr.dll")}
substr.dll が現在里々に同梱されている substr.dll である場合、$temp には「いうえ」がセットされる。上記の例ではロードと同時に実行し実行終了と同時にアンロードしているが、別にこのように使わなくてはならない、という決まりはない。美坂起動と同時に(例えば $_Constant 等で)ロードし、そのままずっとメモリに置いて何度もコールしても何ら問題はない。SAORI の寿命管理はユーザに任されている。 一般的な SAORI を使う限り、美坂起動と同時に使用する全 SAORI をロードし、あとは使いっぱなし、という手法で特に問題はないと思われる。つまり細かく寿命管理したいと思わない限り $unloadsaori は使わなくてよい。細かく寿命管理するメリットについてはここでは省略する。 なお、SAORI をロードしたまま(明示的にアンロードせずに)美坂が終了する際の動作については何ら考慮しなくてよい。美坂は終了と同時にロードされている全 SAORI を自動的にアンロードする。 |
|
79 での修正の副作用 misaka.ini で propertyhandler,0 とすると動かなくなる。 プロパティハンドラは制御経路を非常に複雑にする。これが開発環境でのデバッグや misaka_debug.txt によるトレースにとってかなりマイナス。また、プロパティハンドラは変数が変化するたびにコールされるので(別に目に見えて重いというわけではないが)冗談で ON にしておくには少々もったいない。 |
|
|
|
|
|
|
|
filename で示された saori DLL をロードし、arg を argument ヘッダとしてセットして request をかける。saori が response を返すまでブロッキングする。filename は美坂が位置するディレクトリからの相対パスで指定する。指定された DLL が存在しない、もしくはリクエスト中に SAORI 内部でエラーが起きた場合、落ちる。例示
{$temp={$saori("substr.dll","あいうえお",2,3)}}{$temp}
substr.dll が現在里々に同梱されている substr.dll である場合、$temp には「いうえ」がセットされる。 |
|
ワイド文字 substring。バイト数ではなく見かけ上の文字数でカウントする。それ以外は substring と同じ。例示
{$temp="あaいbうcえdお"}{$substringl({$temp},3)}
{$temp="あaいbうcえdお"}{$substringlw({$temp},3)}
上の結果は「あa」、下の結果は「あaい」 |
|
従来はユーザ変数優先だった。 |
|
書式の追加 辞書変数もしくは配列変数 da の z 番目の文字列を返す。 |
|
sa が単純変数だった場合、文字列 sa の長さ(バイト数)を返す。sa が配列だった場合、配列の要素数を返す。 |
|
__0 破棄、__1 へ。アルゴリズムはさらに退化。 |
|
misakac.exe を実行すると同一ディレクトリの *.txt が全て暗号化され、*.__0 として出力される。__0 ファイルはプレーンテキストファイルではなくなっているが、misaka.ini でこれらのファイルをインクルードすると正常なデータファイルとして読み込まれる。 このファンクションは、主にゴースト作者が「読むな」という意思を外部に向かって表明するために用いられることを想定している。そのため内容が絶対に誰にも読まれない、とは断言できないし、保証もしない。 misakac.exe はとにかく拡張子が .txt であれば変換してしまうので、例えば readme.txt 等美坂とは関係ないファイルが同一ディレクトリにある場合それをどかしておく等の配慮が必要となる。 暗号化アルゴリズムは非常にぬるいです。 |
|
|
|
|
|
|
|
文字列 s 中から文字列 substr を探し、その先頭位置を返す。単位バイト。 文字列 s 中から文字列 substr を探し、全てが存在するかどうかを bool 値で返す。引数の最大数は無限。
{$insentence("human","hum")} == true
{$insentence("human","hux")} == false
{$insentence("human","hum","uma","u")} == true
{$insentence("human","hum","hua")} == false
index が最下位関数、次が insentence、カプセリングしすぎなのが inlastsentence |
|
|
|
|
|
配列。現在同一デスクトップ上に存在する他のゴーストのリスト。自分しかいない場合は null。 |
|
以上の配列制御関数追加。 以上の文字列制御関数を追加。 テンプレートに「しりとり」サンプル追加。 仕様書 |
|
|
|
以上の配列制御関数追加。 仕様書 仕様書 |
|
カタカナ交じりの文字列 s を全てひらがなにして返す。漢字等変換不能なものはそのまま残される。 s0 の終端1文字と s1 の先頭1文字が同一かどうかを判定し bool 値を返す。この関数は MBCS を考慮する(バイトではなく文字単位で比較する)。 |
|
|
|
初歩的 |
|
主に misaka_vars.txt の肥大化対策。例えば {$temp=""} として終了すれば $temp が misaka_vars.txt に保存されることはない。 |
|
|
|
recommendsite 等ではこれらがセパレータであるため勝手に除去すると問題が出る |
|
サイド n の部位名 m で示される部位の OnMouseMove カウントを返す。このカウント数を判定することでいわゆる「撫で反応」の敏感さを制御できる。例示
$OnMouseMove,{$if (64<={$getmousemovecount(0,"Bust")})}
{$resetmovecount(0,"Bust")}\0\s0胸撫で反応。\e
$OnMouseMove,{$if (32<={$getmousemovecount(0,"Bust")})}
\0\s0胸撫でられ疑惑反応。\e
サイト n の部位名 m で示される部位の OnMouseMove カウントを 0 にリセットする。 これも低レベルにやろうと思えばできる‥‥というより、今までずっとそうだった。 |
|
引数なし。美坂がオンメモリで持っている情報全てをディスクに書き込みバックアップする。処理内容的には終了時に自動で行われる変数保存処理と同じ。 |
|
初回起動した日からの経過日数。単位 day。 一見して隠蔽アプローチに見えるが、違う。どうしても低レベル処理でやりたければ書き方次第でやれる。 |
|
従来は longint の範囲でオーバーフロー(約50日程度) |
|
従来、経過時間が例えば 4000 秒だった場合、 $elapsedsecond 4000 $elapsedminute 66 $elapsedhour 1 であった。これはこれで正しいが、システムの性質上おそらくこのような値が真っ先に期待されるケースは非常に少ない。よって今後は $elapsedsecond 40 $elapsedminute 6 $elapsedhour 1 とする。合計秒なり合計分が欲しい場合だけ再計算が必要になる。 この変更は、プリフィクスに elapsed が付いている時間系変数全てに適用される。 |
|
例えば
{$esecond={$elapsedsecond}}
{$if ({$esecond}>=3600) { {$ehour={$esecond}}{$ehour/=3600}{$etemp={$ehour}}{$etemp*=3600}
{$esecond-={$etemp}} }}
{$if ({$esecond}>=60) { {$eminute={$esecond}}{$eminute/=60}{$etemp={$eminute}}{$etemp*=60}
{$esecond-={$etemp}} }}
|
|
|
|
|
|
#_Common シンボルで宣言された論理式は、当該ファイル内の全てのシンボルに関係演算子 && で付与される。この構造は主に多モードを持つゴーストで有効である。つまり、#_Common でモード判定式を記述すれば、以降そのファイル内で一切モード判定式を書く必要がなくなり、単にファイルを分けるだけで多モードを実現できるようになる。例示
#_Common
{$if ({$mode}==0)}
当該ファイルのシンボル全てに論理式 {$if ({$mode}==0)} が付与される。 |
|
phase 24 で一度修正されていたが、phase 36 で可変シンボル名による疑似 if を実現した時から別の問題を抱えていた。 |
|
sequential パラメータが指定された辞書変数は、必ず要素 0 から順に読まれ、全要素が一巡すると再び 0 に戻る動作を繰り返す。この性質は主にある程度の間隔を置きつつ連続して話させたい一連のセンテンスを制御するために用いる。例示 $_alphabet; sequential; A B C D E F$_alphabet はコールされるたび ABCDEFABCDEF... の順で文字列を返す。 |
|
最終ネットワーク更新日からの経過日数を返す。単位 day。例示
$_OnBoot; {$if (7<={$daysfromlastupdate})};
\0\s0そろそろネットワーク更新して欲しい。\e
上記の例では、ネットワーク更新せずに7日経過すると更新を催促する。これをローレベルにやるためには、OnUpdateComplete で日付を何らかの変数に保持し、チェックする際に読み出して現在日付との差を計算すればよい。例は省略。 |
|
nonoverlap パラメータが指定された辞書変数は、全要素が一巡するまで絶対に取得要素が重複しない。ただし全要素からランダム取得されることに変わりはない。この性質は主にランダムトークの重複をブロックするために用いる。例示 $_OnTalkCore; nonoverlap; A B C D E F$_OnTalkCore は通常の辞書変数同様コールされるたびリストからランダムに文字列を返すが、連続で呼び出しても例えば「ADBFEC」「CFADEB」のように全要素出現まで絶対に重複した要素が出ない。 |
|
旧美坂 $_OnTalk,{$if ({$random({$talkinterval})}==0)} 新美坂 $_OnTalk; {$if ({$random({$talkinterval})}==0)}; nonoverlap; セミコロン前後には自由な個数ホワイトスペースを入れてよい。入れなくてもよい。 現在は旧互換コードがあり両形式を同じように読む |
|
同じにならないようにデザインしたはずがそうなっていなかった。例示
$_OnTest
{$msvo} - {$msvo} - {$msvo}
旧美坂では3つが必ず同じものになってしまう。それはデザインに反する。 |
|
以上のシステム変数を追加。詳しくは仕様書参照。 |
|
x2misaka 他の SHIORI サブシステムのデータファイルを美坂にとって意味のある形に変換/再編集する。 里々のゴーストデータが存在するディレクトリに x2misaka.exe を配置し、実行。 misaka_from_satori.txt が出力される。 偽栞のゴーストデータが存在するディレクトリに x2misaka.exe を配置し、実行。 misaka_from_niseshiori.txt が出力される。 出力されたファイルは美坂形式に変換されたデータファイルで、そのまま美坂で使用できる。ただし現状全くの手作業なしでそのまま実行できるようなレベルまでは変換してくれない。感覚的には、全くの手作業で作業を行った場合の作業量を 100 とした場合、大体これを 30 程度まで軽減してくれる。 |
|
シンボル名に引数で渡された文字列全てが含まれているシンボルの中からランダムに一つのシンボルを選択し式を評価して戻り値を返す。引数の数に制限はない。例示
$_OnTest
{$search("human","japan")}
$_OnTest2
{$search("male")}
$human-male-japan
A
$human-female-japan
B
$human-male-korea
C
$human-female-korea
D
$_OnTest には A ないし B が、$_OnTest2 には A ないし C が返る。※対偽栞 x2misaka として独立 |
|
擬似 if を再現する。式を第一引数から順に評価し、値が返ったところでそれを戻り値にして抜ける。 ※対里々 |
|
例示 {$temp=1}{$OnBoot{$temp}} これは {$OnBoot0} と同じ意味を持つ。 ※対里々 |
|
引数で渡された式のうちランダムに一つを返す。引数の最大数に制限はない。例示 $b this is test. $_OnTest {$choice("あいうえお",{$b},256)} |
|
割り算は小数点以下切り捨て。例示 {$temp=3}{$temp*=2}{$temp} {$temp=3}{$temp/=2}{$temp} 結果はそれぞれ、6、1。 |
|
ゴーストの連続起動時間。それぞれ、時、分、秒。 OSの連続起動時間。それぞれ、時、分、秒。 ゴーストの累計起動時間。それぞれ、時、分、秒。 |
|
プロパティハンドラと appendheader を用いて自力で構築すること。 |
|
直後のレスポンスに s で示されるヘッダを挿入。例示 {$appendheader("Extra: 芋")} 見たままのヘッダが追加される。連続で呼べば読んだ数だけヘッダが増える。ただしそのヘッダが付くのは直後のレスポンス1回のみ。 これによりコミュニケートの相手を指定する手法は {$to} への代入と {$appendheader("To: ....")} の呼び出しによる高/低レベルの 2方向に分化。例示 {$appendheader("To: 陽子")} {$to} |
|
こんな特例は認められない。 もっともこの特例が消滅しても依然として関数を複数行で書くことはできる。例示
$isxmaseve
{
{$
if (({$month}==12)
&& ({$day}==24))
}
}
$OnBoot,{$isxmaseve}
\0\s0\1\s0\0クリスマスイブ。\e
$OnBoot
\0\s0\1\s0\0それ以外。\e
|
|
現在の曜日を整数値で返す。0 が日曜で 6 が土曜。 |
|
敬称を制御する。下記の低レベルな文字列制御関数を使っても全く同じ事ができる。adjustprefix のアプローチはいわば偽栞的な隠蔽アプローチ、下記の低レベルな文字列制御関数のみを作って後は面倒を見ないのが華和梨的なアプローチと言える。美坂はその両方を提示してその差自体を認識させる。例示 {$adjustprefix("がおちゃん","さん")} |
|
旧栞は例えば以下の関数の処理を誤る。 {$adjustprefix("がおちゃん","さん")} |
|
substring は文字列 s の offset バイト目から count バイトを返す。 substringl は 文字列 s の左端から count バイトを返す。 substringr は文字列 s の右端から count バイトを返す。 length 関数は文字列 s の長さ(バイト数)を返す。 全てバイト指定であり文字数指定ではないことに注意。 |
|
常に false が返っていた。数値の比較は正常だった。 |
|
{$temp="not ready"}{$if (true) { {$temp="istrue"} } else { {$temp="isfalse"} }}{$temp} 致命的なバグ。例えば上の式で、旧美坂は処理順を誤り、$if の分岐結果に関わらず $temp が常に isfalse になる。 |
|
ユーザ変数全てをプロパティと見なし、変数が変化した際に同時に行う処理を記述できる。プロパティハンドラはシステムシンボル $_OnPropertyChanged で定義され、変化した変数名はシステム変数 $name にセットされる。 もちろんプロパティハンドラは無くてもよい(その場合は旧来通り名実ともに単純変数となる)。そもそもプロパティハンドラを要する変数の方が特殊である。プロパティハンドラは例えばモードが変化した際に特定の値を初期化する等の用途に使う。例示 $OnChoiceSelect,{$if ({$reference(0)}=="changemode")} {$mode=0} $_OnPropertyChanged,{$if (({$name}=="$mode") && ({$mode}==0))} {$modestring="モード0"} $_OnPropertyChanged,{$if (({$name}=="$mode") && ({$mode}==1))} {$modestring="モード1"} $_OnPropertyChanged,{$if (({$name}=="$mode") && ({$mode}==2))} {$modestring="モード2"} プロパティハンドラは完全な構文イベントであり、例えスクリプトを返しても捨てられる。 |
|
なぜか無かった。例示 {$z++} {$z--} それぞれ $z に 1 を加算、もしくは $z から 1 を減算。 |
|
|
|
以下の記述は等価。 $_OnTest,{$if (({$test2}=="2") && ({$test3}=="3") && ({$test0}=="0") && ({$test1}=="1"))} \0\s0テスト0\e \0\s0テスト1\e $_OnTest,{$_(0)} { $if (({$test2}=="2") && ({$test3}=="3") && ({$test0}=="0") && ({$test1}=="1")) } \0\s0テスト0\e \0\s0テスト1\e 開き忘れや閉じ忘れの責任は記述者が負う。 |
|
以下の記述は等価。 $_OnTest \0\s0\1\s0\0ねえ。\w8\w8\1\s0ん?\w8\w8\0\n\nどうしてあんなに寒いの?\w8\w8\1\n\n‥‥\w8\w8いや、意味がよく。\e \0\s0\1\s0\0ねえ。\w8\w8\1\s0ん?\w8\w8\0\n\n‥‥\w8\w8いや、いい。\w8\w8\1\n\n‥‥\w8\w8何だよ。\e \0\s0\1\s0\0テスト。\e $_OnTest { \0\s0\1\s0 \0ねえ。\w8\w8 \1\s0ん?\w8\w8 \0\n\nどうしてあんなに寒いの?\w8\w8 \1\n\n‥‥\w8\w8いや、意味がよく。 \e } { \0\s0\1\s0 \0ねえ。\w8\w8 \1\s0ん?\w8\w8 \0\n\n‥‥\w8\w8いや、いい。\w8\w8 \1\n\n‥‥\w8\w8何だよ。 \e } \0\s0\1\s0\0テスト。\e 開き忘れや閉じ忘れの責任は記述者が負う。 注意 パーサがぬるいので現在のところブロック開始と終了を示すブレスは必ず独立した行で置かなくてはならない。例示 { \0\s0\1\s0 \0ねえ。\w8\w8 \1\s0ん?\w8\w8 \0\n\n‥‥\w8\w8いや、いい。\w8\w8 \1\n\n‥‥\w8\w8何だよ。 \e } 上記は誤り。 |
|
今後文字列リテラルのクォートは必須とする。なくても動きますが。 以下の式は全て等価。 {$if (({$test2}==2) && ({$test3}==3) && ({$test0}==0) && ({$test1}==1))} {$if (({$test2}=="2") && ({$test3}=="3") && ({$test0}=="0") && ({$test1}=="1"))} |
|
無駄なスペースを入れてもパースに失敗しない。 以下の式は全て等価。 {$if (({$test2}==2) && ({$test3}==3))} {$if ( ({$test2}==2) && ({$test3}==3) )} {$if (({$test2}== 2) && ({$test3}==3)) } |
|
システムシンボル $_BalloonOffset 追加 バルーンオフセットを SHIORI から制御。 |
|
if の論理式内に バイト値 } を持つ文字列(「日本赤十字狂会」等)が存在すると誤評価 |
|
引数なしで isghostexists() をコールすると他ゴーストが一人でも存在していれば true 無差別爆撃用。 |
|
GET String 系に対する返答が仕様通りでない |
|
inlastsentence 拡張。inlastsentence 関数はその性質上一つの if エレメント中に複数連続する可能性が高く、それによって可読性が低下することが懸念される。そのため、ヒットチェックする単語を引数で連続して与えることを可能とした。例示 「話し掛けてきた相手が「花ちゃん」で、かつ「さかな」と「川」がヒット」の表現 旧美坂 {$if (({$sender}==花ちゃん) && ({$inlastsentence(さかな)}) && ({$inlastsentence(川)}))} 新美坂 {$if (({$sender}==花ちゃん) && ({$inlastsentence(さかな,川)}))} |
|
3項以上無限数の連続論理式関係演算 従来、3項以上の比較は関係一つ一つを適切に括弧でくくる必要があった。しかし、本 phase より 3項以上の比較を同一の括弧の中に複数記述できる。例示 C if (a==0 && b==0 && c==0) 旧美坂 {$if ({$a==0} && ({$b==0} && {$c==0}))} 新美坂 {$if ({$a==0} && {$b==0} && {$c==0})} |
|
×{$if (0<{$facemovecount}) { {$facemovecount-=1} }} のような構文を用いると処理部省略と見なされて true or false が返る |
|
テンプレートゴーストに撫で判定追加 $_OnInitialize 廃止。起動時に読まれるシンボルは $_Variable と $_Constant に変化。両者の違いは読まれるタイミング。$_Variable は起動と同時に呼ばれ、変数の自動復帰が行われ、その後 $_Constant が呼ばれる。過去互換維持のため $_OnInitialize もコール中。 ×テンプレートゴーストにおいて、OnMouseDoubleClick のデフォルトハンドラ(メニュー表示部)が突き判定部より前にあるため論理的に絶対に突き判定が発生しない |
|
自分で変えた仕様にテンプレートゴーストが付いていってなかった |
|
シンボル内データ定義中に空行とコメントが使用可能。例示 $_OnTalk,{$if (({$mode}==0) && ({$random({$talkinterval})}==0))} // 貧乏ネタ \0\s0{$ms}の家計、2ヶ月前から火の車らしいよ。\w8\w8\1\s0むう。 // 火事ネタ \0\s0{$ms}の家が燃えたらしいよ。\w8\w8\1\s0むう。 人にとって見やすい上記の記述は機械にとって無駄がない下記の記述と等価。 $_OnTalk,{$if (({$mode}==0) && ({$random({$talkinterval})}==0))} \0\s0{$ms}の家計、2ヶ月前から火の車らしいよ。\w8\w8\1\s0むう。 \0\s0{$ms}の家が燃えたらしいよ。\w8\w8\1\s0むう。 |
|
ロード時に構文をチェックし、誤りがあれば misaka_error.txt に誤っている行を書き出し、異常を伝えるダイアログを出し、起動取りやめ |
|
$to に宛名を設定しても Communicate Send にならない Communicate を受けても $_OnGhostCommunicateReceive がコールされない 要するに Communicate 周り全死でした。切腹。 |
|
全ユーザ変数の自動保存/自動復帰 |
|
辞書の任意ファイル分割 |
|
$getvalue および時計合わせ機能時の時刻読みサンプル ×コミュニケートが実は全く動作していなかった |
|
付いていたが書き忘れていた構文や仕様を仕様書に追記 ×テンプレートゴーストの見切れ判定と重なり判定が全く動いてないわけではないがどうしようもなく異常 |
|
メールチェック 時計合わせ ヘッドラインセンス その他、現在まで残留した全てのイベントハンドリング beta release トーク間隔設定 突き判定 見切れ判定 重なり判定 Get String 対ゴーストコミュニケート 適宜変数追加 ダブルクリックメニュー ランダムトークテンプレート シェル変化 ゴースト変化 論理式評価パーサ 基礎構造策定 |
|
戻る |