« greasemonkey+websocket+node.js+prowlでブラウザからiPhoneに通知してみる | メイン | Steve Jobs氏ご逝去 »

JavaScript+Smalltalk(ObjectiveC)=JSTalkをいじってみる

JavaScriptにObjective C/Smalltalk的な拡張を追加してMacOSXのスクリプティングに使用できるOSSのJSTalk。面白そうなのですが日本語の情報が殆ど無いので少しメモ。

似たようなコンセプトのモノにJSCocoaやCapputinoのObjective Jがありますが、JSTalkが最もスクリプト言語的(といっていいのか)でお手軽です。マイナーで完成度はこれからという感じで軽微な問題はありますが、今のところ大きな不具合はなく使えています。私のようにAppleScriptになかなか馴染めない人には面白い選択肢ではないかと思います。

インストール等

まずは本家のパッケージにも含まれますがApp Storeから落とせるJSTalk Editorを入れてみます。AppleScript Editorライクに試せるエディタで動作確認をすぐに行なえます。

コマンドラインからスクリプトとして使うためには本家パッケージ内のjstalkコマンドを手動で/usr/local/binあたりにコピー。

簡単な説明と例

基本的な文法はJavaScriptですが、Objective C的に'[]'で括ってメッセージ式が記述できます。以下は最初にeditorを開いたときに出てくるHello Worldです。[]の中はほとんどObjective Cと同じような感じということがわかると思います。

var message = "Hello World!";
[[JSTalk application:"JSTalk Editor"] displayDialog:message];

iTunesのプレイリストをダンプしてみる

Hello WorldだけではなんなのでiTunesをスクリプティングしてみます。

var iTunes = [SBApplication application:"iTunes"];
var sources = [iTunes sources]; // iTunes.sources();とも書ける
var numSources = [sources count];

var src = sources[0];
var playlists = [src playlists];
var numPlayList = [playlists count];

for (var i = 0; i < numPlayList; i++) {
     var playlist = playlists[i];
     print("   " + i + ":" + [playlist name]+" "+[playlist specialKind]);
}

コマンドラインから使ってみる(iTunesの曲リストを表示)

コマンドラインから引数をとったりする方法です。#!記法が使えますが、JSTalk Editorではエラーになるのでテスト時は先頭行は//してください。またEditor内のスクリプトで[NSApp terminate ]等とするとEditor自身が終了してしまうのでご注意。

#!/usr/local/bin/jstalk
// 引数を文字列に変換しておく(例)
var av   = NSProcessInfo.processInfo().arguments();
var argc = av.count(); // 0:jstalk, 1:scriptの情報, 2〜:引数
var argv = new Array();
for (var i = 0; i < argc; i++) {
    argv[i] = av[i].UTF8String();
    print("arg["+i+"] = " + argv[i]);
}
// ... 引数の処理をしたりする
// がここでは使わないので無視して
// iTunesのMusicをリストしてみる
var iTunes = [SBApplication application:"iTunes"];
var sources = iTunes.sources();
var numSources = [sources count];

var src = sources[0];
var playlists = [src playlists];
var numPlayList = [playlists count];

for (var i = 0; i < numPlayList; i++) {
     var playlist = playlists[i];
     var kind = [playlist specialKind];
     if (kind == 1800630362) { // 直値で適当過ぎだが...
         print(i + ":" + [playlist name]);
         var tracks = [playlist tracks];
         var n = [tracks count];
         for (j = 0; j < n; j++) {
             t = tracks[j];
             print( ([t enabled] ? " v " : "   ") + j + " [" + [t name] + "]");
             // [t setEnabled: false]などとするとチェックを外すことが出来る
         }
         break;
     }
}

保存したスクリプトは"jstalk hoge.jstalk"などとして実行可能です。ちゃんと弄ればmp4のタグを設定したりも出来ると思います(多分)

最後に

JavaScriptにもAppleScriptにも不慣れなのでコードが稚拙なのはご勘弁下さい。
AppleScript EditorでライブラリのsdefとAppleのScripting Bridgeのドキュメントを見つつ書けばさほど難しくはないと思います。メッセージはAppleScriptと少し異なるので注意。値をセットするにはsetHoge。また文字列等の扱いが微妙なのでJavaScriptの型への変換は適宜考慮した方が良さそうです。

 JS実行環境といえばやはりnode.js(v8)。あちらはリソースも大量にあるので、JSTalk言語 to Pure JavaScriptのトランスレータを作るか、node.jsベースになればもっと面白い事も簡単に出来そうですし、普及するかもしれないと思いつつ。

トラックバック

このエントリーのトラックバックURL:
http://blog.browncat.org/cgi-bin/mt/mt-tb-abc.cgi/940


コメントを投稿

(お書きになったコメントはすぐには表示されません。ご了承ください。)


About

2011年09月30日 12:43に投稿されたエントリーのページです。

ひとつ前の投稿は「greasemonkey+websocket+node.js+prowlでブラウザからiPhoneに通知してみる」です。

次の投稿は「Steve Jobs氏ご逝去」です。

他にも多くのエントリーがあります。メインページアーカイブページも見てください。

           

カテゴリー

Powered by
Movable Type 3.36

Twitter


最近のエントリー

デル株式会社ads

注目エントリー