このページは福井県立大学の田中求之が2006年1月まで運用していた Mac のサーバ運用に関する会議室 「Web Scripter's Meeting」の記録です。情報が古くなっている可能性がありますのでご注意ください。

Face Span ソースが読めなくなった

発言者:Tetsuya Kuramochi
( Date Saturday, February 06, 1999 21:09:30 )


こんにちは
Face Span3.0.1で大変困ったことになりました(涙)

あるコントロールにスクリプトを記述したのですが、
(記述量は、一時期、32kを越えてしまったので、
 コメントなどを削除して凌ぎました)

コンパイルしてプロジェクトを閉じて、再度開こうとすると、

Unable to decompile script because too many characters.

と出てしまいます。
AppleScriptの32kのカベってやつでしょうか...

ど〜〜〜〜〜にかして、スクリプトだけでも抽出したいのですが
何か方法はないでしょうか。

ResEditの扱い方もよくわからないので途方に暮れています。


AppleScriptの32kのカベさえ越えれば………と強く願う今日この頃です。



田中求之 さんからのコメント
( Saturday, February 06, 1999 22:29:00 )

まず最初に、誤解があるようなので、その点から。

>AppleScriptの32kのカベさえ越えれば

AppleScript 自体には、32K の壁など存在しません。あくまでも、スクリプトエディタ
側の制限(TextEdit ルーティンを使用していることによる)です。スクリプトのサイズの
制限は、スクリプトエディタの方の制限であって、AppleScript 自体の持っている制限
ではありません。


で、本題ですが、ResEdit で FaceSpan のプロジェクトを開くと、scpt というリソース
があります。これが実行用コードにコンパイルされたスクリプトです。ですから、このリソース
を逆コンパイルすることで、スクリプトを取り出すことが可能です(ただし、すべての
オブジェクトのスクリプトが一つになってしまっているはずです)。

ResEdit 用のテンプレート(Apple の developer 用のサイトにあったはずです)
を使うと取り出すことが可能です。

なお、コンパイルできたのであれば、普通は FaceSpan でもう一度問題なく開ける
はずなんですが、おかしいですね? EasyBBS EX 2 で、何度となく 32K の壁に
ぶつかって、ぎりぎりまで削ってはコンパイルし直し、ってのをやってますが、
3.0 で問題が起きたことはないです。

田中求之 さんからのコメント
( Saturday, February 06, 1999 23:18:46 )

訂正です。scpt リソースに収められているのは、Project Script だけです。
各オブジェクトのリソースは LENS リソースの中に埋め込まれています。
LENS リソースは、オブジェクトの情報を羅列したもののようなのですが、
フォーマットの解析はできていません。ただ、リソースから、スクリプト部分
だけを抜き出すのは可能だと思われます(明らかにコンパイル済みのコードが
ベタに埋め込まれているので)。

なお、scpt リソースの救済方法ですが、もし ScriptDebugger をおもちなら、
以下の方法が使えます。

まず最初に、簡単なスクリプト(たとえば beep )を書いたものをコンパイル済みの
スクリプトとして保存します。

つぎに、今保存したスクリプトと、FaceSpan のプロジェクトを一緒に ReaEdit で
開きます。

FaceSpan のプロジェクトから scpt リソースをコピーし、先程のスクリプトに
ペーストします。すると、同じ ID のものがすでに存在するがどうするか?と
聞いてきますので、上書きします。

そして、スクリプトを保存して、ScriptDebugger で開きます。すると、
scpt をデコンパイルしたものが取り出せます。

スクリプト編集プログラムで試してもうまくいくかもしれません。


また、開けなくなった Project Script のものを、beep のような単純なものと
取り換えておき、FaceSpan で開いて、ScriptDebugger の画面からコピー&ペースト
でもとに戻して、編集するという荒技も使えます。

実際に私が EasyBBS EX 2 の製作中にトラブったときに行ったことのある復旧方法
なのですが、この方法でうまくいかなくても(プロジェクトが壊れてしまっても)
責任は負えません。参考意見として聞いてください (^_^;;

Tetsuya Kuramochi さんからのコメント
( Saturday, February 06, 1999 23:21:09 )

Resありがとうございます。
(そうですね、エディタ側の問題です。ご指摘ありがとうございます。お恥ずかしい(^^;))


>>なお、コンパイルできたのであれば、普通は FaceSpan でもう一度問題なく開ける
>>はずなんですが、おかしいですね?

そうなんです。おかしいんですよね………初めてです。

>>で、本題ですが、ResEdit で FaceSpan のプロジェクトを開くと、scpt というリソース
>>ResEdit 用のテンプレート(Apple の developer 用のサイトにあったはずです)
>>を使うと取り出すことが可能です。

も、申し訳ありません、やり方がよくわからないので教えていただけませんか


よろしくお願いします。



Tetsuya Kuramochi さんからのコメント
( Saturday, February 06, 1999 23:23:16 )

↑の発言を書いている間に再レスが(^^;)

ありがとうございます。早速試してみます。


めろん さんからのコメント
( Saturday, February 06, 1999 23:26:47 )

田中さんとは別の見解:

ファイルを参照するようになっている場合,参照先のファイルの場所が
変更したりすると文字列が長くなる場合があるかもしれません。
自分で遭遇したことはありませんが...。
参照している可能性のあるファイルをすべて捨てるか,スクリプトそのものを
他のMacで開いてみて下さい。
「...はどこですか?」と聞かれるので,ファイルパスができるだけ
短くなるようなファイルを適当に選んでみて下さい。
もしかしたら開けるかもしれません。

※もしかしたら違うかもしれないので,ResEditの方もお試し下さい。

田中求之 さんからのコメント
( Saturday, February 06, 1999 23:38:08 )

>ファイルを参照するようになっている場合,参照先のファイルの場所が
>変更したりすると文字列が長くなる場合があるかもしれません。

確かに 32K ぎりぎりの場合には、こうしたことが起こる可能性がありますね。

ところで、Lens リソースですが、やはり、ベタでコンパイル済みのコードが
埋め込まれていました。Lens リソースからスクリプト部分だけを抜き出して
それを AppleScript のコンパイル済みスクリプトファイルに移植して、
スクリプトエディタで開くのに成功しました。

scptscpt + 2バイト(不明?) + スクリプトの長さ(2バイト)+コンパイル済みのコード

という並びで埋め込まれています。

XCMD か osax を書けば、バッチ処理的にスクリプトを抜きだせるな…

Tetsuya Kuramochi さんからのコメント
( Saturday, February 06, 1999 23:44:00 )

たびたびすいません、

scptの復旧はできましたが、おっしゃるとおり、Project Scriptのみ復旧しています。

実は、ウィンドウ上にTextBoxを作成し、そこに記述したスクリプトを開こうとすると、例のエラーが出るのです。

やはり、LENSリソースを復旧することになるのでしょうね(^^;

もし、方法がありましたらご教授ください。よろしくお願いします。


田中求之 さんからのコメント
( Sunday, February 07, 1999 00:40:30 )

>もし、方法がありましたらご教授ください

方法はありますが、hex のたし算なんかをしなくてはなりませんよ。

もし急ぐようでしたら、問題のウィンドウの Lens リソースを私宛にメールしてくだされば、
そこに含まれるスクリプトを抜きだしますが…??

ご自分で挑戦したい場合は、以下のような手順を踏みます。この説明で分からないときには
手を出さないほうが無難かもしれません。


ResEdit で Lens リソースを開く

右側に表示される ASCII ダンプの画面を見ていって、"scptscpt" の文字列を探す。

その文字列の4文字後に "FasdUAS 1.101.1" という文字列があることを確認する
(これがコンパイルされた実行コードの先頭を表します)

"FasdUAS 1.101.1" の直前の2文字分(2バイト)の Hex ダンプを見る。この2バイト
がコンパイルされたスクリプトのデータの長さを示す(Short Integer だと思われる)

"FasdUAS 1.101.1" の先頭の Hex 番地に、上記で得られた長さ(2 byte 分のHex)
を足して1を引いて(Hex でのたし算になります)、スクリプトの最後の番地を得る。

スクリプトの最後の番地に飛んで、最後の部分が Hex で AD、ASCII だと半角の≠で
あることを確認(この文字がスクリプトの最後を意味するようです)。

"FasdUAS 1.101.1" から、先程の≠までの Hex 部分を選択し、コピーする。

適当に作ったコンパイル済みスクリプトを ResEdit で開き、scpt リソースを
Hex Dump モードで開く(テンプレートを持っているときには、option を押しながら
開くことになる)

Hex 部分を Select Allしたのち、先程 Lens リソースからコピーしたものを
張り込み、保存し、閉じる

こうして、中身を Lens から移植したものをスクリプト・エディタで開けば、
スクリプトが取り出せる。


なお、Lens には、そのウィンドウのすべてのオブジェクトの情報がつまっている
ため、当然のことながら、スクリプトの情報も複数含まれることになる。この場合は、
ASCII Dump の画面で、自分がとりだしたいスクリプトかどうか(文字列データなどは
生のデータで埋め込まれていてもわかる)を探る必要がある。

田中求之 さんからのコメント
( Sunday, February 07, 1999 00:42:38 )

なお、Lens リソースを修正する(エラーが出ないようにいったんスクリプトを消す)
のも不可能ではありませんが、上記以上に面倒な操作になります。

田中求之 さんからのコメント
( Sunday, February 07, 1999 00:45:52 )

FaceSpan で、ウィンドウを一つ作ってそこに適当なオブジェクトを置いてスクリプトを
埋め込んだプロジェクトを作って、ResEdit で開いて、Lens を覗いてみてください。
だいたいの感じがわかると思います。

… WindowScript と同じ人が開発しただけあって、オブジェクト用のリソースの名前は
同じなんだけど、フォーマットはさすがに違っているなぁ…

Tetsuya Kuramochi さんからのコメント
( Sunday, February 07, 1999 10:05:59 )

田中先生、ありがとうございます"_m(_'_)m_"

>>もし急ぐようでしたら、問題のウィンドウの Lens リソースを私宛にメールしてくだされば、
>>そこに含まれるスクリプトを抜きだしますが…??

ありがとうございます。お言葉に甘えて、ProjectFileを
遅らせていただきます。本当に助かります。


田中求之 さんからのコメント
( Sunday, February 07, 1999 13:08:47 )

さきほど、テキストに変換したものをお送りしておきました。やっぱ 32K を越えてました。

で、この作業をやっていて分かったことが一つ。Lens の中の "scptscpt" と実行コード
の間に入っている4バイトは、4バイトでコードの長さを示していました(long int)。
Kuramochi さんのやつって、コードは 140K ほどになっていて、それで分かりました。

しかし、33K のスクリプトが、コードで 140K になってしまうとは…

Tetsuya Kuramochi さんからのコメント
( Sunday, February 07, 1999 15:48:16 )

Mail ただいま受け取りました。

本当に助かりました〜〜(地獄に仏とはこのことか(^^;))

すいません、非常に汚いソースコードをお見せすることに
なってしまいました………確かにコメントを書く量が多いですね(^^;)

仕事ではチャンと仕様を別紙に起こしているんですがプライベート
になるとアタマに思い描いた処理内容をドバーーッと入力していく
ので自然にコメントが多くなるのです......


Face Spanもスクリプト編集プログラムも32k以上記述できるように
してほしい………
(MacOS X のAppleScriptに期待してます)


TOK さんからのコメント
( Wednesday, February 10, 1999 14:30:58 )

はじめまして。
AppleScriptに興味があり、たまにのぞかせてもらっていました。

スクリプト編集プログラムの32kの壁についてですが、
ミミカキエディットというフリーのエディタを使用なさってはどうでしょうか。
もちろんAppleScriptのコンパイルができます。
これはAppleScriptに使われる基本的な予約語が色付けされ、
コンパイル時のエラーもApple純正のエディタ同様に表示されます。
当然、32kの壁はありません。
僕自身32k以上のスクリプトなんて書いたこともありませんが(^^;)

他にも便利な機能が満載されているので
かなりお世話になっているエディタです。

Tetsuya Kuramochi さんからのコメント
( Friday, February 12, 1999 17:01:15 )

TOKさん

情報ありがとうございます。
早速試してみます。

(しかし、私はFace Spanをメインに使用しているので、Face Spanに32kの壁を越えて欲しいです(^^;))

スクリプト編集プログラムも頻繁に利用するのでダウンします