Home>Monologue> Part of Script factory. scriptfactory@mac.com .

The Problem of programmer's tool

Contents

Introduction

programmer's toolは強力で、もし使いこなせるのなら誰もが手元においておきたいと考える代物であると思います。

しかし、programmer's toolには作者の方も四苦八苦しているなかなか取り除けない問題があります。その問題を説明するとともに、programmer's toolのテストを広くお願いしたい所存です。僕は、今MacOS 8.6しかもっていなくて、他のversionをもっておきません。MacOS 9や、また特に英語版のMacOSを持っている方にご協力していただきたいと思っています。これからご説明することは日本語版のOSで顕著に起こるんじゃないかと思っているからです。できれば、英語版と日本語版の各versionの比較などやっていただけたら幸いです。

まずは、programmer's toolを知らない人に向けてprogrammer's toolの解説から始めたいと思います。

What's programmer's tool ?

programmer's toolの役割は、いろんなclassの値を別のclassの値に強制的に変換することです。「cast」というeventを使います。そして特筆すべき機能は、Akua SweetsやResource Utilitiesなどで読み取ったresourceのdataをAppleScriptで扱えるrecordに変換してくれることです。その逆の変換、すなわちRecordからresouce dataへの変換もできます。

すなわち、programmer's toolを使えば、なんと!!AppleScriptからResEditできちゃうんです。読み込んだresourceをprogrammer's toolでreocedに変換し、そのrecordをいじってから逆変換をし、そのdataをresouceとしてfileに書き出せば、まさにResEdit。

まあ、ResEditがscriptableになってもそんなにうれしくないでしょうが、しかしprogrammer's toolを使えば、resourceがAppleScriptで扱えるdataの射程範囲に入るんです。AppleScriptの可能性を大きく広げる逸品だと思います。

How to Use

とにかく、resouce dataの扱い方に焦点を当てます。そしてresouceの読み書きのためのOSAXとしてAkua Sweetsをここでは仮定します。

まずは、resourceを読み込んでそれをAppleScriptで扱えるrecordに変換するsampleです。

set theFile to file "Macintosh HD:システムフォルダ:スクリプティング機能追加:programmer's tool" 
set versRes to the resource in theFile of type "vers" numbered 1 
 
cast versRes using template "vers" 
--Result:{|Version_Number|:"01", |Revision_Number|:"00", |Revision_Stage|:"40", |Build_Number|:"09", |Language_Integer|:0, |Abbreviated_string|:"1.0a9", |Get_Info_string|:"1.0a9, ゥ Apple Computer, Inc. 1992-2000"}
example1

このsampleでは、programmer's tool自身の"vers" resouceを扱っています。event 「cast」のoptionのusing templateというparameterによって、castの対象となるdataがどんな構造を持っているか明示します。すなわちresouce dataのtypeをここに指定します。この場合は当然"vers"です。

ところで、多くの場合using templateのparameterは省略できます。using templateのparameterを指定しない場合、元の値のclassと同じ名前のtemplateが使用されます。すなわち、cast xcast x using template (class of x) と同じことです。resouce dataは、そのresource typeと同じ名前のclassを持っているようなので、example 1の場合では、

cast versRes 

とやってもOKということです。

そして、resouceのdataをrecodeに変換してしまえばAppleScriptで扱えます。下の例ではvers resourceの構造を持つrecordを用意して、それをvers resourceに変換してfileに書き出しています。

set versRecord to ¬ 
{|Version_Number|:"01", |Revision_Number|:"00", |Revision_Stage|:"40", |Build_Number|:"09", |Language_Integer|:0, |Abbreviated_string|:"1.0a9", |Get_Info_string|:"1.0a9, ゥ Apple Computer, Inc. 1992-2000"} 
set |Language_Integer| of versRecord to 14 
set versRes to cast versRecord using template "vers" 
set theFile to file "IGAGURI HD:システムフォルダ:スクリプティング機能追加:programmer's tool" 
save resource versRes in theFile of type "vers" numbered 1
example2

このように、MacOS9で問題になっているらしい、vers resourceのlanguage codeの書き換えもprogrammer's toolを使えば楽勝です。

The problem of programmer's tool

さて、これからが本題です。

castによってかえってくる、recordのlabelにはすべて「|」によって囲まれています。しかし、documentには、以下のような記述があります。

The label is automatically converted to lower case and space is converted to underline to avoid the | being used in the label.

programmer's toolのdocumentではrecordのlabelには「|」が含まないようにspaceは「_」に、大文字は小文字へと変換がされるはずなのですが、日本語のOS(のせいかわかりませんが、少なくとも自分が知るかぎりでは)では、この仕組みがうまく働いていないようです。spaceは、ちゃんと「_」に置き換えられていますが、大文字から小文字への変換がうまくいっておりません。つまり、castによって得られるprorgammer's toolの作者の方が期待している結果は、

{|Version_Number|:"01", |Revision_Number|:"00", |Revision_Stage|:"40", |Build_Number|:"09", |Language_Integer|:0, |Abbreviated_string|:"1.0a9", |Get_Info_string|:"1.0a9, ゥ Apple Computer, Inc. 1992-2000"}

ではなく、

{version_number:"01", revision_number:"00", revision_stage:"40", build_Number:"09", language_Integer:0, abbreviated_string:"1.0a9", get_info_string:"1.0a9, ゥ Apple Computer, Inc. 1992-2000"}

なんです。すなわちprogrammer's toolは環境によっては、同じことをしても同じ結果を返さないということです。自分で作ったスクリプトを自分だけで使っているかぎりでは、大きな問題ではないのですが、他の国の人が作ったスクリプトをもってきた場合、それは動かない可能性があります。例えば、Dialog Directorに含まれるDialog Dumperはこの問題(だけじゃないですが)のため、日本語のOSでは手を加えないと動きません。

さらに複雑なのが、例え日本語のOSでもスクリプトを実行するアプリケーションによっては、labelに「|」が含まれない場合があるということです。1.0a10以外のversionでは、OSA Menuのcompatible modeを使ってbackground applicationのOSA Menu内でスクリプトを実行したときや、Smileで実行したときなどは、「|」が含まれません。一方、スクリプト編集プログラムや、Script Debuggerでスクリプトを実行したときは、常にlabelに「|」が含まれます。

と言うようなことを作者の方に連絡して、いくつかの修正versionを送っていただきましたが一向に改善されません。これ以上、僕だけでは有効な情報を提供できそうにありません。

というわけで、どんな環境でprogrammer's toolが返すlabelに「|」が付き、またどんな環境で「|」が付かないのか、情報をお寄せくださいませ。僕はMacOS 8.6しか持っておりません。MacOS9を持っている方や、とくに英語版のOSを持っている方からの情報が欲しいものです。

各種のprogrammer's toolを取りそろえております。

programmer's toolの作者


This page was last built on Wed, Feb 17, 2016 ; 11:10:16 AM . Thanks for checking it out!