Macintosh Developer Online (MDOnline)


2000年9月21日発行号 - 新iBook説明会



記事にも書きましたが、iBookの説明会があり、自由に写真を撮影することができるました。とまあ、そうなるとみんな同じように写真を撮影するでしょうから、マニアックな(笑)ショットの1つだけをお届けしましょう。以下のアドレスには、iBookの向かって左サイドを横から撮影したものです。コネクタ類はこちらに集中しており、右側は電源とCD/DVD-ROMドライブとなっています。
figs/review/ibookside.jpg
左からモデム、Ethernet、USB、FireWire、そしてAVポートとなっています。AVポート用のケーブルは、一方が標準的なピンジャック3つ(オーディオ×2、コンポジットビデオ)となっているのですが、もう一方、つまりマックに突っ込む方は、4端子のミニプラグになっています。よくあるサウンド出力は3端子ですから、やっぱり特殊なプラグです。だけど、実測はしていないので分からないですけど、以前は専用マイクがちょっと長いこれまた特殊なプラグでしたが、AVケーブルのプラグは通常の長さだと思います。説明会では先週の発表内容についての話もいくつかりましたが、ATI RadeonカードのパフォーマンスはRAGE 128 Proの2倍出るという話もありました。また、iBookの処理能力のデモでは、Quake IIIを使って単位時間当たりの画面生成数を示していましたけど、Windowsのノートパソコンの多くがOpenGL対応でないために、比較でもができなかったという話もありました。iBook/PowerBookは、OpenGLに対応する数少ないノートパソコンなのかもしれません。
さて、Key Limeの言葉の謎も明らかにされたのですが、なかなかユニークなカラーです。テーブルの上に乗せた状態で見たわけですが、これが散らかった机の上とかならどうなんでしょうね。やっぱりキツい色かなとも思ってしまいました。
(新居雅行 msyk@mdonline.jp


iBookについてのプレス向け説明会が開催、より手軽になったDVD再生をデモ

2000年9月21日にアップルは報道機関向けに新製品発表会を行った。一抹の期待のあったMac OS X Public Betaについては、先週のMac Expo 2000での発表の報告があり、日本語版は10月に予定されているという話だけがあった。日本語版が遅れた理由として「エンジニアリング・チャレンジ」という表現を行い、技術的な面での問題点をクリアするための時間が必要なためであることを示唆した。
説明会の主役は、モデルチェンジされたiBookである。新iBookの特徴を、「新色」「処理能力」「ビデオ」「デジタルビデオ」にまとめて説明された。Key LimeのiBookを始めて見たが、一見するとまぶしいくらいの蛍光色っぽい雰囲気だ。印象としては、写真で見るよりもっと明るい感じがした。派手な色の割にはすぐに見なれたという印象もある。iBookはカラーだけでなく、白い部分も光沢が増すなどより白いようになったという。なお、Key Limeの言葉の意味であるが、フロリダで販売しているパイ(お菓子)で、食べるとやみつきになるおいしいものがあるそうだ。それにちなんで名付けられた。処理能力については2次キャッシュをCPUと同クロックで動作させるようになっことや、ビデオチップがPowerBookと同じRAGE Mobility 128になったこと、バッテリがより強化されたことが説明された。ビデオについてはAVポートとというビデオとサウンドのポートについての説明がされたが、DVD搭載機では、今まで以上に手軽に再生処理ができる点がデモされた。iBookと付属のAVケーブルで、大画面テレビに接続する。そしてDVD再生を行うと自動的に大画面テレビにだけ映像が出てきて液晶側には表示されないようになる。自動再生にもなっているため、ディスクを入れてケーブルを接続するだけでテレビに映像を写し出すというわけだ。再生などのコントローラは両方の画面に出る。AVポートの接続を行わないと、もちろん、液晶ディスプレイでDVDを再生できる。「デジタルビデオ」はもちろんFireWire搭載ということで、ターゲットディスクモードとなる点についても説明された。iMovie2もちょうど日本語版が発売されたが、iMovie2の売りとして「人に見せたくなるようなムービーを作れる」という点を強調したいという話も行われた。また、AirMacについては内容的には今までと変わることはないものの、1つの大きな利点として説明された。
なお、質問ではKey Limeカラーを店頭で販売しない理由が聞かれた。eコマースを積極的に推進するという意味での戦略的な意味で、あえてAppleStoreのみに限定したということだ。ただ、一部の店頭での展示についての可能性については否定をしなかった。説明会の会場では、ADSL経由でインターネットに接続されたAirMacベースステーションが利用できる状態であったため、さっそく“PowerBook軍団”がネットサーフィンを始めていた。説明会後に何台かのAirMacカードを搭載したKey LimeからのiBookを会場内のあちらこちらで使えるようにし、インターネット接続をしながらの写真撮影があちらこちらで行われた。

関連リンク:iBook
カテゴリ:iBook


MOSAのソフトウエアミーティングの日程が確定、Mac OS Xの話題も

MOSA(Macintosh OS Software Association)主催の毎年恒例となっているMac OS開発者のイベント「Macintosh Software Meeting 2000 in Opera City/湘南国際村センター」の今年の日程が固まった。2000年11月11〜12日の土曜日と日曜日で、土曜日に東京初台のアップルコンピュータに集合し、アップルよりのMac OS X関連のセッションがあり、その後、湘南国際村へ移動していくつかのセミナーが開催される。プログラムの内容は現時点では確定ではないが、日程については確定してた。参加費は会員がシングルルームは15,000円、ツインルームが12,000円、非会員はそれぞれ18,000円と15,000円となっている。基本的には2日間の連続参加だが、1日だけの参加の可否についても検討されている模様だ。11日に開催予定のアップルによるセッションは「Mac OS X オーバープレビュー」「Mac OS X ユーザーインターフェイスガイド」「Mac OS X プログラミング入門 AppleScript」「Mac OS X プログラミング入門 Projectbullder」といったものをMOSAより要望を出している。しかしながら、この時点では守秘義務の発生する内容もあるため、内容については流動的と考えられる。その後、アップルで懇親交流パーティが行われる。そして、国際湘南村へ貸し切りバスを利用して移動し、オールナイトセッションへと移行する。12日はMOSAが企画のセッションで、「ベーシックトラック」として中野洋一、高橋真人、やまガメの各氏、「プログラミングトラック」としてK仲川、小池邦人、佐藤徹の各氏、「WebObjects、JavaScript関連トラック」として、倉橋浩一、渡邊大介の各氏および新居雅行といった講演者名が挙げられている。ほかにはモバイルコンテンツ関連のトラックも計画されている。現在、MOSAのWebサイトにはこの件についての情報はないが、日程については確定されたということなので、参加予定者はさっそくPIMに書き込みをしておこう。プログラムの詳細が発表されたときに、再度MDOnlineからも詳細をお届けしよう。

関連リンク:MOSAホームページ
カテゴリ:イベント


Javaカンファレンスの製品セミナーでWebObjectsを紹介

日本インターネット協会Java部会(通称: Java カンファレンス)は、第一回製品紹介セミナーを開催し、そこでWebObjectsの紹介も行われる。日時は2000年9月28日(木)13:30〜17:10で、場所は東京新宿御苑前の日本インターネット協会会議室だ。WebObjectsに関しては、アップルコンピュータの鷲滝薫氏、石山正太郎氏といったおなじみのメンバーで、製品説明や製品アドバンテージなどが説明される。2000年8月にアップルで行われたセミナーと内容的にはほぼ同じものとなる予定である。他には株式会社エヌ・ケー・エクサの遠藤明彦氏より、Java2ベースの2次元パーススケッチから3次元形状を生成するシステム「Perspective Ver3.0」、そして未定ながらさらに1社の講演が行われる。講演順序は未定である。参加費は無料であるが、以下のページでの登録制となっている。8月のセミナーを聞き逃した方は参加してはどうだろうか。

関連リンク:IAJ JavaTM 部会 第1回 製品紹介セミナー開催のお知らせ
カテゴリ:WebObjects, Java, イベント


PC MACLANをWindows Meで使う場合には修正プログラムの適用が必要

ディアイティは、WindowsパソコンがAppleShareのサーバあるいはクライアントになるソフト「PC MACLAN for Windows 98/95」のWindows Me対応状況を公開した。PC MACLAN for Windows 98/95をWindowsにインストールすることで、WindowsパソコンをAppleShareサーバに接続したり、あるいは逆にサーバになることができる。また、プリンタの共有にも対応している。Windows Meは、2000年9月22日の16時に発売開始されるWindows 98(あるいはSecond Edition)の後継OSである。Meは「Millennium Edition」の意味である。
Windows Meに新規インストールする場合、インストーラのウインドウで一部のコントロールなどが見えない場合がある。また、インストール後修正プログラムを適用する必要がある。既存のPC MACLAN for Windows 98/95を使っているを使っている場合、サーバに対するドライブ割り当てを解除した後にWindows Meのインストールを行い、そしてただちに修正プログラムを適用する必要がある。修正プログラムは9月22日からディアイティのサイトで公開される。
なお、旧バージョン利用者向けに、「PC MACLAN for Windows 98/95 バージョンアップキット」の販売を、同社の販売サイトであるditshop.comで開始した。価格は\22,000となっている。

関連リンク:PC MACLANシリーズ製品情報
カテゴリ:サーバー関連, ネットワーク


JavaアプリケーションからAppleScriptのプログラムを実行する

Javaでのプログラミングで苦しむのは、Javaにない機能をどうするかということだ。もちろん、JNI(Java Native Interface)という仕組みでC/C++などで作ったライブラリを呼び出すことができるので、ライブラリを作って…と言えばそれまでだが、それはそれで大変な作業である。せっかくのJavaの心地よさも苦痛と変わってくるかもしれない。しかしながら、苦痛は少ない方がいい。また、できないこともやっぱりできた方がいい。そこで、Mac OSで稼動させるアプリケーションに限定されるが、Mac OS的な解決方法を紹介しよう。一言で言えば、JavaのアプリケーションからAppleScriptのプログラムを動かすのである。そのプログラムは、Javaのプログラムの中で文字列で作成したものを実行できるようにする。だから、固定したスクリプトではなく、プログラムで動的に組み立てたスクリプトが使えるのである。もともと、これは、筆者がJavaのプログラムで、ファイルのラベルやコメントを設定するということをしたいために作ったクラスである。JConfigなどのネイティブライブラリを含むものもあるのだが、コメントの書き込みができないなど、必要とした機能は揃っていなかった。しかしながら、やりたいことは、AppleScriptでおおむねできることは実証済みであったので、汎用的なスクリプト作成プログラムを組んでみたのである。

AppleScriptのプログラムを単に実行するのは、ポイントは簡単なのである。ToolboxにOSADoScriptという関数があって、これを呼び出せば済む。本来はコンパイルと実行を別々に行え、何度も実行するのであれば1度のコンパイルで実行をくり返すことを行えば効率的かも知れない。こちらの手法については、JShell-2000のソースを御覧になればいいだろう。今回紹介するのは、OSADoScriptを用いて、1つのToolbox関数呼び出しでスクリプトを実行するやり方である。1つ呼び出すだけだから簡単かと言えばそうでもない。まず、こうしたToolboxの呼び出しを行うために、MRJに用意されたJDirect2という仕組みを使うようにする。JDirect2を使って最終的にOSADoScriptを呼び出すようなお膳立てがまずある。次に、OSADoScriptに設定する引数や、戻り値についての処理をしなければならない。ここは、実際にはCの構造体に相当する部分の処理をJavaで書くことになり、これがまたややこしい。Cの構造体は、int型配列でつまりは自分で構築しないといけないのである。さすがに複雑であったが、実はJShell-2000のソースコードを参考にさせてもらったため、その意味ではなんとかこなせた。
なお、蛇足とは思うがPure Javaに反することは事実だ。JDirect2というMac OS荷しか存在しない機能を使うからだ。しかしながら、WindowsではAppleScript自体存在しないから、たとえJNIを使ってもクロスプラットフォーム対応にはならない。だから、Mac OSネイティブなJava機能を使って何か問題があるとは思えない。なお、MRJ環境下でも、アプレットの場合はスクリプトの実行はできない。JDirect2はアプレットからは利用できないのである。
◇JShell-2000
 http://www.vmeng.com/beard/JShell/

作成したプログラムは、別掲の記事に掲載した。AppleScriptUtilsというクラスがそれだ。汎用的に使うことを考えてスタティックで利用をすることにした。もちろん、この内容を持ったAppleScriptUtils.javaというファイルを作って保存しておけばよい。たとえば、CodeWarriorでJavaのアプリケーションをひな形から作り、そのプロジェクトにAppleScriptUtils.javaファイルを追加すればいい。参考のために、このAppleScriptUtilsを利用した例のプログラムApplication1.javaも掲載した。
AppleScriptUtilsの使い方は極めて簡単だ。Application1.javaを見ていただきたいが、AppleScriptUtils.doScriptメソッドの引数に、AppleScriptのスクリプトプログラムをString型で指定するだけである。doScriptの戻り値は実行が成功した場合には、最後にgetした値が戻される。また、失敗したらエラーメッセージが戻される。このままだとエラーかどうかを見分けられないのであるが、そうした必要がある場合には、doScript側に手を入れてもらいたい。なお、doScript側では実行するスクリプトプログラムをコンソールに出力しているのであるが、実用面ではこれもコメントするなどしてもらいたい。

ではここで、AppleScriptUtilsクラスの説明をしよう。MRJ関連のクラスについては利用パッケージを明確にするために、importはしていない。さて、Toolboxを利用するためには、システムに存在するライブラリを呼び出すというのがPowerPC環境での基本的な手法だ。多くの関数のエントリはInterfaceLibにある。CodeWarriorでのCやC++のプログラム作成ではそのあたりは有名だろうけど、こうしたファイルが機能拡張フォルダにあるわけではないので、結局は知っていないと分からない事実だ。このInterfaceLibをロードするために、IFLibraryというインタフェースの定義を行う。これはJDirect2での決まり文句と思った方がいいだろう。さらに、OSADoScriptなど、AppleScript関連の関数のエントリは、AppleScriptLibというライブラリにある。これは機能拡張フォルダにファイルとしても存在するが、CodeWarriorのCのプログラムでこの関数を使う場合には、やはりAppleScriptLibをプロジェクトに登録しておかないといけない。このライブラリをロードするために、やはりお決まりのインタフェース定義をASLibraryという名前で行う。そして、実際にToolbox関数呼び出しを行うプログラムが含まれるクラスAppleScriptUtilsを定義する。ここでは、IFLibrary、ASLibraryのインタフェースをインプリメントする。こうすれば、JDirect2の機能を使ってAppleScriptUtilsの中で、それぞれのライブラリにある関数を利用できるのである。
AppleScriptUtilsの最初には、native宣言がある。ここでは実際に使うToolbox関数のスケルトン定義を行うわけだ。実は、OSADoScriptを使うために他にもいろいろなToolbox関数が結局必要になる。これらの関数の引数はもちろん、本来はC言語で定義されている。たとえば、CでのlongはJavaでのint、ハンドルはintの配列にするなど、読み替えて定義が必要になる。詳細は、MRJのJDirect2のドキュメントを見てもらいたい。ここでnative宣言を行えば、Javaのプログラム内でこれらの関数をメソッドとして利用できるようになるというわけだ。
OSADoScriptの使い方は、Inside Macintosh: Interapplication CommunicationのChapter 10に記載がある。久々に黒背表紙の分厚い紙の固まりのIMを引っ張り出した。ポイントは、OpenDefaultComponentによってスクリプトコンポーネントを取り出すこと、そして実行するスクリプトプログラムのテキストをディスクリプタとして記述しておき、OSADoScriptに臨むというところだろう。このあたりは、テキストとして与えるプログラムの場合はお決まりの手法だと思ってもらえるといいだろう。引数には16進数を指定したが、Cでプログラムする場合は定義定数が使える。だが、Javaだとそれは使えない。もちろん、真面目に変数定義をしてもいいのだが、ここでは読みやすさを考えて定数を直接定義した。16真数の意味(たとえば、0x54455854は実は‘TEXT’である)ということは、プログラムのコメントに記載しておいた。なおディスクリプタ化するときには、テキストへのポインタを渡す必要がある。ポインタはbyte型の配列としてJavaでは扱われるので、スクリプトのテキストをgetBytesでバイト列に変換しておく。こうして、AECreateDescでディスクリプタ化する。ここで、ディスクリプタに相当する変数であるsourceData、resultDataについては、実態はJavaのint型の配列であるが、その配列領域があたかもCの構造体のように見えないといけない。ディスクリプタは、Cのlongが2つ並んだものであるから、Javaではintが2つ並んだものとなる。これの初期化を最初にやっておくというか、「int[] sourceData = {0,0};」によって、intが2つ分のメモリ領域を確保するのである。単に「int[] sourceData;」だけなら、ポインタが用意されるだけで、構造体のデータを置く場所は確保されない。こうした初期化によって構造体のメモリ確保を行っておかないと、Toolbox関数を呼び出したときに完全にフリーズしてしまうことになる。Toolboxで使う構造体を利用する時のポイントとなるだろう。
(続く)

カテゴリ:Java, AppleScript


JavaアプリケーションからAppleScriptのプログラムを実行する(2)

ここで失敗談を1つ。御存じのように、Javaの世界では、文字列はUNICODEで表現される。だから、getBytesメソッドで得られるバイト列は、やはりUNICODEである。それをそのままToolbox関数に渡したらまずいのではないかと考えてしまった。つまり、Toolbox関数をC言語などで呼び出す場合には、Shift-JISのコードでないとだめなのではないかと思い、Shift-JIS変換をしてからOSADoScriptを呼び出してしまっていた。それでも、おおむね動くが、一部におかしな文字が出てきてしまった。「プ」が「フ?」のようになってしまうのである。さんざん悩んだ挙げ句、結論は「Shift-JISに変換する必要なし」ということのようだ。つまり、余計なことはしなくてもよろしいということのようである。だが、後で説明するが、逆にいろいろなことがそれで分かった。

OSADoScriptで実際にスクリプトを実行する。エラーがあると、OSAScriptError関数を使って、エラーの内容を取り出す。ここで、どちらも、取得結果をresultDataというディスクリプタに収めているが、状況に応じてここは修正したほうがいいだろう。いずれにしても、resultDataにあるテキストデータを取り出し、String型として得ないといけない。ディスクリプタなので1つ目はデータの型、2つ目にデータの存在するハンドルとなっている。つまり、2つ目の要素のハンドルからデータを取り出して、文字列にしたいわけだ。そこで、JDirect2に用意されているGenericHandleというクラスを使って、まずToolboxのハンドルをJavaで使えるようにする。そのクラスにあるgetBytesAtによってbyte型配列が得られ、さらにそれをStringのコンストラクタに指定してString型を得た。ちょっとややこしいところだ。なお、ここでも特に文字列のコード変換は必要無く、ちゃんと日本語の文字列が得られるようだ。
さて、ディスクリプタであるsourceData、resultDataは単にint配列というだけでなく、そこからポインタで別途メモリ領域を確保している。これを解放する作業をDisposeDescとして入れておかないといけない。プログラムはJavaだが背景はCで作ったライブラリであるので、メモリ解放は自動ではないのである。

実際に動かすプログラムは、もちろん、JavaのプログラムでString型のデータとして用意する。スクリプト編集プログラムで作ったものをコピー&ペーストで取り込んでもいいが、文法的な間違いがないのであれば、形式はなんでもかまわないようだ。たとえば、tell〜end tellのブロックで次下げがないとか、大文字小文字を適当ということでも文法的に合っていればいいようだ。ここでの一番の問題は、AppleScriptのプログラムをJavaのプログラム中で書くというチョ〜ややこしいことをしないといけないことだ。たとえば、「open folder "HDD:書類"」というプログラムを文字列として得るには、「String aLine = "open folder \"HDD:書類\"";」となる。ダブルクォーテーションの応酬だ。これがけっこう単純ではなく、試行錯誤することになるとは思うので、頭をやわかくして取りかかると良いだろう。
ところがあるレアケースを見つけた。ファイル名の中にダブルクォーテーションがあり、なおかつ日本語の文字がそれよりも前にあるような文字列に問題があった。たとえばMac OS式のフルパスで言えば、「data:フォルダ:this "is" file」というようなファイルだ。これをAppleScriptの文字列にしてたとえばファイルへの参照を変数に代入するには、AppleScriptだと「set target to file "data:フォルダ:this \"is\" file"」となる。ならば、Javaの文字列として指定するには「String aLine = "set target to file \"data:フォルダ:this \\\"is\\\" file\"";」となる。つまり、Javaの文字列では、\は\\、ダブルクォーテーションは、\"で記載しないいけないのである。
ただ、多くはこれでOKのようなのだが、どうやら\をまじめにバックスラッシュにコンバートする場合があるようで、そこでAppleScriptのエラーが出ることがあるのだ。どうやら、その規則をいろいろ考えていると、\より前に日本語の文字列がある場合ではないかという結論が得られた(もし、違っていれば知らせて下さい)。
文字列中でダブルクォーテーションが登場する場合、AppleScript的には\"だが、ここでは「ASCII Character 34」を使って逃れる方法を取った。つまり、「String aLine = "set target to file (\"data:フォルダ:this " & ASCII Character 34 & \"is\" & ASCII Character 34 & \" file\")";」というわけだ。カッコが増えるなどしているが、いずれにしても、こうすると、生成されたJavaの文字列中に\記号が登場しなくなる。同様に、文字列中の\の文字はASCII Character 72に置き換えるということをおこなうといいだろう。
AppleScriptUtilsには参考のために、java.io.Fileオブジェクトから、Mac OSでのフルパス文字列を取り出すメソッドgetMacOSPathも紹介した。ダブルクォーテーションについては上記の処置をしたが、\記号についてはしていない。このメソッドはあくまで1つの参考として、実際には御利用する方が独自のものに合わせて作成してもらいたい。ちなみに、java.io.Fileのパスにした場合、スラッシュのように%2Fで表示されるようなものあり、その処置も含まれている。

こうしてAppleScriptのプログラムをJavaから実行できるようにした。実行のためのパラメータもJavaの文字列として組み立てればよいし、AppleScriptの実行結果もとりあえず得られる。また、AppleScriptを動かすのだから、OSAXの機能をJavaから利用できることにもつながる。もっとも、OSAXがシステムフォルダに入っていないといけないのではあるが、Tanaka’s OSAXをJavaから使えると思うとより利用範囲も広がると言えるだろう。しかしながら、AppleScriptをJava内で書く難しさはすでに説明した通りだ。また、AppleScriptのプログラミングについてもそれなりの知識は要求されることも言えるだろう。さらに、AppleScriptの処理部分は処理速度がかなり落ちる。残念ながらプログラムのオーバーヘッドはかなり高いということになるだろう。しかしながら、Javaのライブラリに用意されていない機能を稼動させる有力な手法であると言える。

カテゴリ:


JavaアプリケーションからAppleScriptのプログラムを実行する-ソースプログラム(1)

◇Application1.java


public class Application1
{
static public void main(String[] args)
{
String script, result;

script = "tell application \"Finder\"\r";
script += "open system folder\r";
script += "end tell\r";
result = AppleScriptUtils.doScript(script);

System.out.println("Result: " + result);
}
}

◇AppleScriptUtils.java

import java.io.*;
import java.util.*;

//共有ライブラリを利用できるようにする
interface ASLibrary extends com.apple.jdirect.SharedLibrary {
public static Object libraryInstance = com.apple.mrj.jdirect.JDirectLinker.loadLibrary("AppleScriptLib");
}
interface IFLibrary extends com.apple.jdirect.SharedLibrary {
public static Object libraryInstance = com.apple.mrj.jdirect.JDirectLinker.loadLibrary("InterfaceLib");
}

public class AppleScriptUtils implements ASLibrary,IFLibrary {

//ライブラリにある関数をnative宣言する
private native static short OSADoScript(int scriptingComponent, int[] sourceData,int contextID,
int desiredType, int modeFlags, int[] scriptID);
private native static short OSAScriptError(int scriptingComponent, int selector, int desiredType,
int[] resultingErrorDescription);
private native static short AECreateDesc(int typeCode, byte[] dataPtr, int dataSize, int[] desc);
private native static short AEDisposeDesc(int[] desc);
private native static int OpenDefaultComponent(int componentType, int componentSubType);
private native static short CloseComponent(int componentInstance);
private native static int GetHandleSize(int handle);

//スクリプトを実行するメソッド
public static synchronized String doScript(String script) {
int comp = OpenDefaultComponent(0x6f736120, 0x73637074); //’osa ’, ’scpt’
//スクリプト処理を行うコンポーネントの取得
int[] sourceData = {0,0}; //これらはAEDesc構造体なのでCのlongが2つ分、その分のメモリを確保しないとフリーズする
int[] resultData = {0,0};
byte[] scriptBytes = {0};
String rValue = "";
try {
scriptBytes = script.getBytes(); //スクリプトの文字列のbyte列を得る
short err = AECreateDesc(0x54455854, scriptBytes, scriptBytes.length, sourceData); //’TEXT’
//スクリプトのテキストをディスクリプタ化する
if (err == 0) {
err = OSADoScript(comp, sourceData, 0, 0x54455854, 0x00000010, resultData);
//スクリプトの実行を行う
if (err !=0)
OSAScriptError(comp, 0x65727273, 0x54455854, resultData); //’errs’, ’TEXT’
//実行エラーがある場合、エラーを取得する
AEDisposeDesc(sourceData); //スクリプトのディスクリプタはいらないので破棄
com.apple.mrj.jdirect.GenericHandle dHandle = new com.apple.mrj.jdirect.GenericHandle(resultData[1]);
//スクリプトの結果データをハンドルとして取得する
byte[] strs = dHandle.getBytesAt(0, GetHandleSize(resultData[1]));
rValue = new String(strs); //結果データから文字列を取り出す
AEDisposeDesc(resultData); //結果データのディスクリプタは不要になる
}
CloseComponent(comp); //コンポーネントを閉じる
System.out.println("%%DoScript:\r"+script); //実行したプログラムをコンソールに表示
}
catch(Exception e)
{ System.out.println(e.getMessage()); } //例外処理(かなり手抜きだけど)
return rValue;
}
//Javaのファイルへのフルパスから、AppleScriptで使えるフルパスの文字列に変換する(参考)
public static String getMacOSPath(File f) {
//中身は別掲の記事を参照
}
}

カテゴリ:


JavaアプリケーションからAppleScriptのプログラムを実行する-ソースプログラム(2)

以下のメソッドは、AppleScriptUtilsクラスの中の1つのメソッドとして利用するためのもの。データベースのメッセージサイズの上限があるため、分割した。不便をおかけしたことをおわびする。


//Javaのファイルへのフルパスから、AppleScriptで使えるフルパスの文字列に変換する(参考)
public static String getMacOSPath(File f) {
try {
String s = new String(f.getCanonicalPath());
StringBuffer b = new StringBuffer("");
for( int i=1 ; i<s.length() ; i++) {
if(s.charAt(i) == ’/’)
b.append(’:’);
else if(s.charAt(i) == ’"’)
if (i == 1)
b.append("ASCII character 34 & \"");
else if (i == s.length())
b.append("\"& ASCII character 34");
else
b.append("\"& ASCII character 34 & \"");
else if(s.charAt(i) == ’\\’)
b.append("\\\\");
else if(s.charAt(i) == ’%’) {
b.append((char)(Integer.parseInt(s.substring(i+1, i+3),16)));
i += 2;
}
else
b.append(s.charAt(i));
}
return b.toString();
}
catch(Exception e)
{ return "error"; }
}

カテゴリ: