クラスメソッドかインスタンスメソッドか

AppleScriptObjC に関しては、風のウワサで「何でもできるよ!」と聞いてはいたのですが、Cocoa/Objective-C と AppleScript の両方やっている身からすると、触っていくうちにそこかしこで「え? Cocoa のあれどうやってやるの?」という場面に遭遇します。

ふと思ったのが、AppleScript のクラスでどうやってクラスメソッドを定義するのか ということです。ひとまずの結論としては、クラスメソッドとして呼びたければそのように、インスタンスメソッドとして呼びたければそのように呼べばいい ようです。

サンプルコード

ClassMethodOrInstanceMethodScreenSnapz001

“クラスメソッドかインスタンスメソッドか” の続きを読む

AppleScript で書いたクラスを ObjC から使う

XcodeScreenSnapz011

Snow Leopard では、AppleScript Studio の後を継いで AppleScriptObjC.framework が導入され、Cocoa の大半の機能を AppleScript から利用できるようになりました。

例えば、AppleScript から Cocoa/Objective-C のクラスを利用したり、AppleScript でそれらのクラスのサブクラスを作成できるようになりました(言い換えれば、作成しなければならなくなった …笑)。

少し残念なのは、前述の通り 「AppleScript から Cocoa の機能を利用する」ことに重点が置かれており、Cocoa/Objective-C の世界から AppleScript を利用する ことには(まだそんなに調べていませんが)重点が置かれていないようです。

ただ、AppleScript で書いたクラスも、アプリケーションの動作中には Objective-C のクラスとして存在するわけで、それにアクセスするのは、(ヒネた内部構造になっていなければ)さほど難しくないはず…。

というわけで作成したのが、今回のサンプルコードです。

サンプルコード

AppleScript Language Guide 改訂版、ついに公開

Leopard(つまり AppleScript 2.0)が登場して、はや四ヶ月。新機能として リストアップされていた AppleScript Language Guide の改訂版 が、ついに公開されたようです。

Applescript Language Guide for Leopardapplescript-users Mailing List

I was just about to write to the list and bug the Applescript Engineers listening about the Applescript Language Guide that we’ve been waiting on and I just checked to get the URL and post it — and holy cow it was updated today!

http://developer.apple.com/documentation/AppleScript/Conceptual/AppleScriptL angGuide/introduction/ASLR_intro.html

Yay!

新しい Language Guide は、こちら から直接、あるいは スクリプトエディタ.app の ヘルプ > AppleScript Language Guide を表示 から参照できます。

“AppleScript Language Guide 改訂版、ついに公開” の続きを読む

ちゃらんぽらん : その後の「文字列で指定したハンドラを実行する」

ちゃらんぽらん : その後の「文字列で指定したハンドラを実行する」

まずは、Excellent!! と言いたい。

「文字列で指定したハンドラを実行する」を書いたところ、ppmweb さんと Script factry さんから有益な情報とスクリプトを送って頂きました。

AppleScript に関する情報を発信されている ちゃらんぽらん さんの更新が、久しぶりに再開されたことは、以前 書き ましたが、このひとつ前の記事、文字列で指定したハンドラを実行する も、興味深く読ませていただいていました。

で、こういったことがもっと気軽に出来たら面白いよなあ、と思いつつも、どうしたらできるかまったく想像がつかないので、半ば諦めていました。

が、別件で調べていた AppleScript メーリングリストに投稿されていた、ユニークなサンプルコードを触っているうちに、たまたま「文字列で指定したハンドラを実行する」、新しい方法が見つかったのでした。

ちゃらんぽらん さんの今回の記事は、これを含めて、記事にしてくださったものです(ありがとうございます)。もはや AppleScript の最果て といった感じ(どんな感じだ)の話題ですが、興味のある方はぜひ。

どういたしましょう?

ご勘弁願います。(お互いのために 笑)

ちゃらんぽらん : AppleScript 2.0 (1)

AppleScript に関する、ためになる情報を発信されている(いた)ちゃらんぽらん さんが、およそ1年ぶりに、更新を再開されています。

ちゃらんぽらん : AppleScript 2.0 (1)

いつの間にやら Mac OS X 10.5 Leopard が発売され、Mac は Intel ベースになり、iPod touch などもでていて…隔世の感があります。一年前と状況が様変わり。どう、対処したらいいものか。いったいどれくらいの人が Mac OS X 10.5 に移行したのでしょうか?

Mac OS X 10.5 になってようやく AppleScript もバージョンが 2.0 になりました。ちらほらと不具合や仕様の変更に対する対処の話題なども見かけるようになりました。

今回のトピックは、AppleScript 2.0 の Unicode 対応について 。ひらがなとカタカナを区別できなくなった(!)という問題についても書かれています。うーん、これには、considering kana type ... みたいな構文を用意してほしいですね。

Notes:AppleScript(Studio)でキーチェーンを使う

※ これは Kaku 1.0.2・Kaku 1.1a2 リリース からのスピンオフ記事です。

パスワードなどを扱いたいときに、システム標準の「キーチェーン」にアクセスできると便利です。

AppleScript でそれを行うために、「Keychain Scripting」というスクリプティング機能追加(正確には、その処理を代行してくれるウィンドウのないアプリケーション)が用意されていますが、これが不具合てんこ盛りの代物なのです。

まず、Studio じゃない場合の不具合からいくと、

  • 認証ダイアログで「拒否」すると、Keychain Scripting がハングする。
  • 複数のスクリプトが Keychain Scripting にアクセスすると、不安定になる(これは僕自身では確認していません)。

また、AppleScript Studio から Keychain Scripting を使おうとする人がどれだけいるか分かりませんが、上記に加えて、

  • なぜかフィルタ参照が使えなくなる。それも全部ではなく、項目によって。試してみないと分からない。例えば、 first key of current keychain whose account is "ppm" など。
  • (上の問題と関連していたかもしれませんが)リテラルなら大丈夫なのだが、変数を与えるととたんに動かなくなる。例えば、 first key of current keychain whose account is accountVar などが、ときに動かなくなる。
  • 一度登録したキーの内容を変更できない(普通の AppleScript ならできる)

…と、意味の分からない不具合が多々あるのですが、AppleScript からシームレスに呼び出せるという利便性もあり、以前のバージョンの Kaku では、フィルタ参照で済むはずのところを repeat 文にしたり、内容の変更ができないので 削除 → 新規登録 で対応したりと、なんとか手なずけて使っていたのですが、やはり Hiro さんのところでハングしてしまう、ということで、代替案を探しました。以下では、僕の選択肢に入ったものを紹介しています。キーチェーンを使いたい動機が違えば、選択肢が変わってきますので、全て載せます。

security コマンド

do shell script で使えます。ただし、一度登録したキーの内容の変更・削除ができません。しかし、既存のキーの情報を使えればいいとき、あるいはユーザー自身に「キーチェーンアクセス」アプリケーションでキーを登録してもらうことができるなら、とても有効な手段となります。使い方は、ちゃらんぽらん さんの記事「スクリプト内のパスワード」と アップルのマニュアル をどうぞ。

Usable Keychain Scripting

これ、ご存知ですか…? 言わずと知れた素敵ブログクライアントソフト「 MarsEdit 」の現作者、Daniel Jalkut 氏が開発した、Keychain Scripting の代替アプリケーションです。「これを Kaku に内蔵できたらちょっと面白いな」と思った(笑)のですが、残念ながらこれもまだ、変更・削除に対応していないようです。また、自分のソフトにバンドルするには、ちょっとライセンスが曖昧です(直接 Jalkut 氏に聞いてみる必要がありそうです)。でも、これも security コマンドと同様、既存の情報を使うだけなら、かなり便利そうです。AppleScript から直接使えますし、Keychain Scripting と比べると、スピードもかなり速いようです。AppleScripter の方にもおススメします。ダウンロードは、Jalkut 氏のブログ記事 から。

Keychain.framework

ここからは、AppleScript Studio 限定になります。Objective-C で書かれたフレームワークであれば、call method コマンドで操作することができますが、残念ながら、キーチェーンの扱いに関しては、「Security.framework」と呼ばれる C 言語で書かれた API しかありません。しかしそこはちゃんと、Objective-C ベースでオープンソースの「 Keychain.framework 」というものが公開されていて、これを使う、という手があります。しかし、これはとてもいいのですが、いかんせんフルフィーチャーなので、サイズが大きすぎます。例えば Kaku はだいたい 600KB 前後なのですが、試しに Keychain.framework を入れてビルドすると、2MB 強になってしまいます。「この時代たかが 1.5MB ぐらい…」と思われるかもしれませんが、やっぱりバランスが悪いというか…。Kaku 本体が 3MB ぐらいになったら使うかもしれません(笑)

Security.framework

いわゆる「直」、Kaku で最終的にとった方法です。Objective-C のクラスを作り、その中で Security.framework にアクセスします。AppleScript からは call method です(どこが直)。その際、Adam Gerson 氏のウェブサイト で公開されている「 Simple Keychain Example 」がそのまま使えそうだと思い、(サンプルとしての使い方ではなくなってしまうので、一応)Gerson 氏に連絡し、許可ももらったのですが、実際にやってみると手直ししなければならない部分が多く、最終的には、本当に「参考にした程度」になっています。

AppleScript Studio から Cocoa API を利用する

久々に AppleScript Studio の話題を。先日、applescript-studio ML に、

  • call method コマンドで Cocoa API を呼び出せるのはいいが、膨大な API の中には、AppleScript がネイティブに対応しているものもある。本当に必要な API がどれかを判断するには、どうしたらいいのか

  • また、その必要な API を AppleScript でラップして、AppleScript の知識だけあれば使えるような、ライブラリのようなものを作ったらどうか

という趣旨(たぶん)の 投稿 がありました。

で、僕はそれに返答を試みたのですが、まず英語に関して、読解力は、なんとかキープできていると思いますが、記述力は、もともと無いうえに、さらに悪化、高校レベルの基本的な文法を忘れている気がします。来年の目標が一つ確定(涙) 結局、自分が思ったことを、自分の記述力で漉してみたら、ちょっとしか汁が出なかった(?)という状態だったので、(日本語なら大丈夫かは別として)ここでリベンジしてみようかと。

“AppleScript Studio から Cocoa API を利用する” の続きを読む

Notes:(調査中)Leopard AppleScript 日本語を使った XML-RPC が不安定に

Leopard には、もちろん素晴らしいところが多々あるのですが、またイヤな情報をひとつ。Leopard 上で Kaku の動作をほとんど殺してくれている不具合について、少なくともどの辺にありそうかは分かってきました。

「不安定に」と少し曖昧に書いていますが、僕が知る限り、2つの問題が組合わさっています。

“Notes:(調査中)Leopard AppleScript 日本語を使った XML-RPC が不安定に” の続きを読む