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

AppleEventでPICTを扱う方法

発言者:マシットコム
( Date Monday, December 10, 2001 15:15:23 )


先日ここで、QuidProQuo + cumulus のチューニングに関して質問させて
いただいた者です。

その後、処理のどこに時間がかかっているのかをきっちりと調べたところ、
予想以上にAppleScriptそのものにかなりの時間がかかっているというこ
とが判明し、システム全体のチューニングをいくらやっても求めるレス
ポンスが得られないということがわかりました。
そこでAppleScriptでの実装をあきらめて、RealBasicで開発することに
しました。

RealBasicでのCGIは初めてで、おまけにAppleEventのプログラミングも
初めてだったのですが、このサイトの情報のおかげで何とか最初の一つ
の移植は完了しました。AppleScriptの時に較べると数倍は速くなって、
非常に満足しています。

今、次のCGIの移植をやっているのですが、一つわからないことが出て
きましたので質問させて下さい。

Cumulusではサムネイル画像をPICTオブジェクトで得ることができるの
ですが、AppleEventのリプライでこのPICTオブジェクトの扱い方がわか
りません。
文字列や数値のリプライはReplayStringやReplayIntegerで得られてい
るので、たぶんPICTオブジェクトそのものは返ってきていると思うの
ですが、コーディングをどのようにすれば良いのかわかりません。

以上、よろしくお願いいたします。

田中求之 さんからのコメント
( Monday, December 10, 2001 15:39:18 )

残念ながら、REALbasic では、AppleEvent で PICT データを扱うことはできません。
ですから、AppleEvent で得た PICT データを REAlbasic 内で変換するといった処理は
組めないのです(テンポラリ・ファイルを経由させるなどの手はありますが、速度の低下
は免れないでしょう)。

REALbasic の AppleEvent の実装は、かなり制約が多いものになっており、ちょっと
凝ったことをしようとすると、すぐに不可能になります。

サムネイルの画像を PICT ではなく GIF で得ることができるのでしたら、文字列として
処理して CGI から画像データとして送りだすことができそうには思いますが…

マシットコム さんからのコメント
( Monday, December 10, 2001 16:03:51 )

さっそくのリプライどうもありがとうございます。

その部分だけAppleScriptで処理させるような方法しかなさそうですね。
少なくとも全部AppleScriptで実装していた時より遅くなることはないと
思いますので、それでやってみます。

Junnama さんからのコメント
( Tuesday, December 11, 2001 01:52:27 )

> テンポラリ・ファイルを経由させるなどの手はありますが、速度の低下
> は免れないでしょう

直接的な解決方法ではありませんが、テンポラリ・ファイルをRAM DISKで
利用するという手はあります。
サーバーのスペックが高いことが前提ですが。

単に“そこだけ”がネックになっているのならば、私ならそんなことも考え
ます。

マシットコム さんからのコメント
( Tuesday, December 11, 2001 10:22:47 )

Junnamaさん、コメントありがとうございます。

>> テンポラリ・ファイルを経由させるなどの手はありますが、速度の低下
>> は免れないでしょう
>
>直接的な解決方法ではありませんが、テンポラリ・ファイルをRAM DISKで
>利用するという手はあります。

ちなみに『テンポラリ・ファイルを経由』させるのはどういうコーディング
になるのでしょうか?

重松修 さんからのコメント
( Tuesday, December 11, 2001 13:38:55 )

状況が読み込めてないのですが、何ができていないのか、具体的に教えていただけませんか?

cumulus なるソフトウェアが何者かは知りませんけど、cumulus が AppleEvent で
PICT のデータを送信してくるが、REALbasic 側では、受け取った AppleEvent のうちの
PICT データを取り出せないということですか?

取りだしたデータが String 型であり、Picture 型でないのが困る、という問題ですか?

そうしたら、あなたは次に、Picture 型では困るから、GIF だとか、PNG だとか、
JPEG にメモリ上で変換したいんだけど、どうすればいいですか、と質問しそうな気がします。

いずれにしても、現状のコードを示すこと (最低限)、REALbasic のバージョンを示すことなどは
必要だと思います。

// 試してないので動かなかったら、ゴメンなさい。

Function String2Picture(inPict As String) As Picture
   Dim f As FolderItem
   Dim i As Integer
   Dim bs As BinaryStream
   
   Do
      f = TemporaryFolder.Child(Str(i))
   Loop Until Not f.Exists
   
   bs = f.CreateBinaryFile
   For i=1 To 512
      bs.WriteByte 0
   Next
   bs.Write inPict
   bs.Close
   
   p = f.OpenAsPicture
   
   f.Delete
   
   Return p
   
Exception
   Return nil
End Function

マシットコム さんからのコメント
( Tuesday, December 11, 2001 14:25:46 )

>cumulus なるソフトウェアが何者かは知りませんけど、cumulus が AppleEvent で
>PICT のデータを送信してくるが、REALbasic 側では、受け取った AppleEvent のうちの
>PICT データを取り出せないということですか?

cumulus は画像データ主体のデータベースです。登録した画像ファイルの
サムネイルを自動的に生成し、AppleScriptでこのサムネイル画像を取り
出すことができます。

RealBasic 3.5.2 で、現在のコードは、

 ev = NewAppleEvent("core","getd","CuAp")
 objdb = GetNamedObjectDescriptor("cDB ",NIL,"sample.ccf")
 objA = GetIndexedObjectDescriptor("crow",objdb,i)
 ev.ObjectSpecifierParam("----") = GetPropertyObjectDescriptor(objA, "pTmb")
 result = ev.send

という感じで、"pTmb"でサムネイルを指定しています。
AppleScriptならpictureで扱えているのですが、RealBasicの場合、この
あとどのようにしてこのpictureを扱えば良いのかわからなかったという
ことです。ReplyStringには何も返ってきません。
ちなみにファイル名は"pnam"で、この場合はReplyStringにファイル名が
返ってきますし、整数値のプロパティはReplyIntegerで得られています。

>そうしたら、あなたは次に、Picture 型では困るから、GIF だとか、PNG だとか、
>JPEG にメモリ上で変換したいんだけど、どうすればいいですか、と質問しそうな気がします。

おっしゃる通りです(^_^)。JPEGに変換したいのです。

どのプロパティでpictureが扱えるのか知りたかったのですが、田中さんの
コメントによると『RealBasicでは扱えない』とのことでした。

これができれば提示していただいたコードが有効に利用できるのですが・・・。

Junnama さんからのコメント
( Wednesday, December 12, 2001 00:59:03 )

> ReplyStringには何も返ってきません。

コードの中に ReplyStringがないんですが、
> result = ev.send

result には何か返ってきますか?
又、result の型はStringですか?

全然外してるかもしれませんが、Cripboadを経由させるって手はどうでしょう?

マシットコム さんからのコメント
( Wednesday, December 12, 2001 01:13:59 )

>> ReplyStringには何も返ってきません。
>
>コードの中に ReplyStringがないんですが、

この後で ev.ReplyString を調べても何も返っていないという意味です。

>result には何か返ってきますか?
>又、result の型はStringですか?

result は boolean で、true が返っています。