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

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 のクラスとして存在するわけで、それにアクセスするのは、(ヒネた内部構造になっていなければ)さほど難しくないはず…。

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

サンプルコード

Notes:iPhone SDK をインストールしようとしている AppleScript Studio ユーザーの方へ

iPhone の登場は、モバイルコンピューティングの世界に大きな衝撃をもたらしました。

そして、その登場から一年。ネイティブアプリの開発を可能にする iPhone SDK の投入によって、新たな革命が起ころうとしています。

世界中の優秀な開発者たちは、いま最も注目されている携帯デバイス上で、自分の実力を試すことができる時を、今か今かと待ち構えているところでしょう。

その iPhone と並び称される Apple のプロダクトに、AppleScript Studio があ…… るわけは全くありませんが、久しぶりに AppleScript Studio のお話を。

iPhone SDK をインストールする前(Xcode のバージョン=3.0)に:

  • /Developer/Library/Xcode/Plug-ins/ASK*.pbplugin をバックアップ しておきましょう。(※ 実際は ASKPlugin.pbplugin だけでいいのですが、念のため)

理由は言えません。

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 を利用する” の続きを読む

Leopard:AppleScript Studio のデバッガが動いた

先日 AppleScript Studio ML を眺めていたら、Leopard で AppleScript Studio のデバッグ機能がちゃんと動いた!という投稿がありました。

AStudio Debugging!AppleScript Studio ML

I installed Leopard last night on a secondary HD. A quick test appears to confirm that honest-to-goodness, working debugging is present in 10.5. I was able to step through a few lines of code with success.

Can anyone else share their experiences with debugging in Leopard?

そんなわけねーだろ! と思って(どんな状況だ)試してみたら、やっぱりブレークポイントを素通りしてしまう。「ほらね!」…と思ったら、デバッガを起動するのが久しぶりすぎて、ビルド構成を「Debug」に変更するのを忘れてた。そして、ビルド構成を変更したら、本当にちゃんと動きました。

“Leopard:AppleScript Studio のデバッガが動いた” の続きを読む

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

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

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

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

Core Data で画像を扱う

前回の記事 で、「 Core Data によって、プログラムの骨格を作るのはかなり楽になるけれど、それだけでちゃんとしたプログラムができるわけではないし、もしそれができなければ、いま作っている Kaku の画像挿入機能は搭載しない」 ということを書いたと思います。

昨日はまさに、そういう「これじゃあ公開できない」という事態に直面していました。前回の記事を書く前に、うすうす気付いてはいたのですが、やはり大量の画像を登録したとき、画像挿入機能のパフォーマンスがかなり悪くなる のです。

結局原因は、Core Data に頼りすぎた、とかではなく、設計そのものがおかしかったというか、単純に、もっと勉強してから臨むべきだった、ということでしたが…(汗)

…というわけで今日は、その問題を解決していった過程を書いていきたいと思います。タイトルは「Core Data で画像を扱う」となっていますが、それについての 正しい答えが書いてあるわけではありません ので、悪しからず(僕が今のところどういった方法でやることにしたかは、書いてあります)。

何しろ、プログラム開発の専門教育を受けたこともないし、もろ文系なので、あまり笑わずに(?)読んでください。何かもっといいアドバイスがありましたら、ありがたく頂戴いたします。

“Core Data で画像を扱う” の続きを読む

Core Data は素敵 / AppleScript Studio プロジェクトと Core Data

最近、MarsEdit 2 を使って、それについての 記事 を書いてみたり、ecto 3 Alpha を使って 記事 を書いてみたりしていたわけですが、自分は?というと、Kaku の画像挿入機能を試しに作ってみていました。

なぜいま画像挿入機能を作っているのかというと、他に作ってみたい機能や、他に作ってみたいソフトもあるのですが、現実問題、いまとりあえず足りないのは、Kaku の画像・リンク挿入機能あたりだろう、と。また、すでに書いたように、Mac 向けの二大ブログエディタを実戦で使ってみた結果、「やっぱり画像やリンクの扱いをなんとかしないと、記事を書くのがなかなかスムースにならない」ということを痛感したからでもあります。

こういった機能を作るには、画像の扱いやら、外部ファイルの扱いやら、ドラッグ&ドロップの扱いやら、自分がこれまで学んできたことがほとんど役に立たなそうな領域(=避けてきた領域)に挑むことになるので、かなりビビっていますが(下にも弱気発言)、今日からしばらくは、その中で気付いたことを記事にしていきます(たぶん)。

“Core Data は素敵 / AppleScript Studio プロジェクトと Core Data” の続きを読む