F-Script で Mac OS X のフレームワーク群にアクセスする

2010年 5月 改訂

記事一覧

      基 礎
  1. F-Script で Cocoa 探検 [原文]
  2. F-Script を20分で学び、Core Image で遊んでみよう [原文]
  3. F-Script で Cocoa スクリプティング [原文]
  4. F-Script で Cocoa クラスを創る [原文]
  5. F-Script で Mac の様々なアプリケーションを操作する [原文]
  6. Cocoa アプリケーションに F-Script を埋め込む [原文]
  7. F-Script で Mac OS X のフレームワーク群にアクセスする [原文]
      その他
  1. Cocoa と F-Script で Google Chart API をいじってみよう [原文]
  2. F-Script 版 Reverse ゲーム [原文]

はじめに

スタンドアロンの F-Script 環境 F-Script.app には、起動した時点で既に、数多くの Mac OS X フレームワークが自動的にリンクされている。 そのため、F-Script さえあれば、それ以上何ら特別な設定をすることなく、Mac OS X の能力を素早く調べたり、これらのフレームワークを直接使ったりすることができるのだ。 これはとても便利で役に立つ。

実用的な例: Image Kit フレームワークにアクセスする

その使い方を示す具体的な例として、最近 Mac OS X の標準フレームワークに追加された Image Kit にアクセスしてみよう。 F-Script.app を起動して、以下のコードを、コンソールに直接入力して欲しい:

IKPictureTaker pictureTaker orderFront:nil

Image Kit のコンポーネントの一つ IKPictureTaker の パネルが最前面に現れる。これを使うと様々なことができるが、とりわけ、ファイルシステム上の画像ファイルをブラウズしたり、(iSight 内蔵の)デジタルカメラで、スナップショットを撮ったりすることができるのだ。

こうして一度欲しい画像を入手してしまえば、F-Script コンソールに以下の命令を入力すれば、pictureTaker からその画像オブジェクト (NSImage のインスタンス)を 受け取ることができる:

myImage := IKPictureTaker pictureTaker outputImage

この F-Script コードは、「myImage」という名前の変数を定義して、pictureTaker に保持されている NSImage オブジェクトを、その変数に代入している。

リンク済みのフレームワーク

以下の表は、F-Script.app に自動的にリンクされるフレームワークの一覧だ:

          フレームワーク           特徴
Address Book 連絡先データベースへのアクセス
Application Kit ユーザーインタフェース
Automator オートメータプラグインシステム
Calendar Store カレンダデータベースへのアクセス
Collaboration アイデンティティ情報の管理
Core Animation グラフィカルアニメーション
Core Audio Kit オーディオユニットカスタムビュー
Core Data データモデルの管理(オブジェクトの永続化、等々)
Core Image 画像処理
Core Location コンピュータの地理的位置の決定
Core Video ビデオ画像処理
Core WLAN ワイアレスネットワーク接続の管理
Disc Recording CD や DVD に書き込み記録する
Disc Recording UI CD や DVD に書き込み記録する為の UI 部品
Disk Arbitration ハードディスクイベントのモニター及び管理
Exception Handling 例外処理の構成管理
Foundation Kit コアサービス(ルートクラス、文字列処理、コレクション、ネットワーク、ファイル管理、スレッド処理 等々)
Image Capture Core スキャナ、カメラ等のディジタル機器接続
Image Kit イメージのブラウズや操作の為の UI 部品
Input Method Kit 文章入力方式の管理
Instant Message インスタントメッセージユーザーのオンライン状態管理
IOBluetooth ブルートゥース機器への接続
IOBluetooth UI ブルートゥース機器接続の為の UI 部品
JavaVM Java 環境へのアクセス
Open Directory オープンディレクトリ情報の管理
OSA Kit OSA 準拠スクリプトの管理及び実行
Preference Panes システムリファレンスアプリケーション用プラグインの実装
PDF Kit PDF 関連の処理
PubSub RSS や ATOM 関連の処理
QT Kit QuickTime コンテンツの表示や加工
Quartz Composer Quartz Composer 部品へのアクセス
Quartz Filters グラフィクスコンテクストに対するフィルター効果の適用や管理
Screen Saver スクリーンセーバの実装
Scripting Bridge スクリプタブルアプリケーションの制御
Security Foundation ユーザー権限の管理
Security Interface ユーザー権限管理の為の UI 部品
Server Notification サーバーを使ったノーティフィケーションの送受信
Sync Services 複数のコンピュータや機器間でのデータの同期処理
WebKit Web コンテンツの描画処理
Xgrid Foundation クラスター管理

その他のフレームワークやバンドルをロードする

標準的な Cocoa のテクニックを使えば、読者の作ったものも含めて、その他のフレームワークやバンドルを動的にロードすることができる。 NSBundle クラスを使うと便利である。 例えば、次のコードは、Mac OS X デベロッパーツールと一緒にインストールされるフレームワークの一つ SenTesting Kit をロードする:

(NSBundle bundleWithPath:'/Developer/Library/Frameworks/SenTestingKit.framework') load

64 ビットで実行する必要のあるフレームワークやバンドルは、64 ビットモード(デフォルト)で動作中の F-Script の中からロードする必要がある。 そして、32 ビット対応のバンドルをロードする為には、F-Script も 32 ビットで起動しなければならない。 (これをやるには、他のアプリケーションの場合と同じ様にすれば良い:F-Script.app に関するファインダインスペクタを開き、「32 ビットモードで開く」にチェックを入れる)

[訳注]ファインダインスペクタ: ファインダで、F-Script.app の上で右クリック >「情報を見る」を選択すると開く「F-Script.app の情報」というパネル

ロードしたいバンドルは、自動ガベージコレクションモードでしか動作しないかもしれないし、参照カウンタモードでしか動作しないかもしれない。 F-Script がそれに応じた正しいモードで動いていることを確認する必要がある。さもなければ、そのバンドルはロードされないだろう。 F-Script のリファレンスパネルを使えば、そのメモリ管理モードを設定することができる。

バンドルのロード中に問題が起きたら、load の換わりに、loadAndReturnError: を使うと良い。エラーに関する情報を得ることができる。 下のコードで、F-Script ではどうすればこのメソッドを使うことができるのかを示す。 この例では、TextEdit アプリケーションをロードしようとするが、それがロード可能なバンドルではない為、エラーが返ってくる:

errorPointer := FSObjectPointer objectPointer.
(NSBundle bundleWithPath:'/Applications/TextEdit.app') loadAndReturnError:errorPointer.
errorPointer at:0.

この上の例の最後の命令は NSError オブジェクトを返し、F-Script シェルで実行すると、そのエラーに関する情報を表示する:

Error Domain=NSCocoaErrorDomain Code=3584 UserInfo=0x2004990e0
"The bundle "TextEdit" couldn't be loaded because its executable isn't loadable."

追加したいフレームワークやバンドルを F-Script リポジトリの中に置けば、F-Script の起動時に、それらを自動的にロードすることができる。 このリポジトリは、F-Script が初めて起動された時に F-Script.app によって創られる。 このリポジトリは、デフォルトでは ~/Library/Application Support/F-Script~ はホームディレクトリ)にあるだろう。 バンドルやフレームワークを ~/Library/Application Support/F-Script/classes ディレクトリに置けば、F-Script.app に、それらを自動的にロードさせることができる。

こうする代わりに、それらのフレームワークやバンドルを指すシンボリックリンクを、ファイルシステムの中に創るだけでも良い。例えば、F-Script リポジトリから SenTesting Kit へのリンクを創るには、 次の F-Script コードを実行すれば良い。

NSFileManager defaultManager createSymbolicLinkAtPath:
                  '~/Library/Application Support/F-Script/classes/SenTestingKit.framework' stringByExpandingTildeInPath
                                  withDestinationPath:'/Developer/Library/Frameworks/SenTestingKit.framework'
                                                error:nil

もう一つ別の方法として、隠しスクリプトに、明示的なローディングコードを書き加えても良い。 F-Script は、起動時に、F-Script リポジトリのトップレベルで「fs_latent」という名前のテキストファイルを探す。 もしこのファイルが存在するなら、このファイルには、ブロックリテラルのテキスト表現が記されていなければならない。 このブロックが、隠しスクリプトなのだが、この時インスタンス化されて、評価される。 このスクリプトを使えば、F-Script 対話セッションが開始される前に、やりたいことを何でも実行することができる。 例えば、SenTesting Kit をロードする為には、もし隠しスクリプトで他には何もしないのであれば、「fs_latent」ファイルには、ブロックで囲まれたローディングコードだけを書けば良い:

[(NSBundle bundleWithPath:'/Developer/Library/Frameworks/SenTestingKit.framework') load]

定数について

Mac OS X の Objective-C ベースのフレームワークで定義されたほとんどの定数や列挙子は、F-Script でも、それらのシンボリック形式のまま直接利用できるが、 現時点では、F-Script は動的に新しい定数を見つけ出すことはしないので、もし(たぶん、動的にロードしたフレームワークで定義されている)使いたい定数が、F-Script 内で、 シンボリック形式では提供されていなければ、直接その本来の値に立ち返るべきである。 通常、対象のフレームワークの、公開されたヘッダーファイルを見れば、定数の定義が見つかるはずだ。


Copyright © 2009-2010 Philippe Mougin
Translation-ja © 2012 Hideo Haga[日本語版]