AppleScriptからCocoaを使う
前回までに、RubyからCocoaフレームワークにアクセスできることがわかった。たいへん手軽に、便利な環境を活用できるのだ。あれあれ、ということは...
- AppleScriptからは、シェルスクリプトを実行できる。(do shell script)
- シェルスクリプトは、Rubyコードを実行できる。(Ruby -e "スクリプトコード")
- Rubyは、Cocoaフレームワークにアクセスできる。(require 'osx/cocoa')
ゆえに、AppleScriptからCocoaを利用できる!
作業環境
- MacBook OSX 10.6.2
- AppleScriptの環境設定 >> 編集 >> 詳細:"文字列中のタブや改行をエスケープ" チェック無し
実験
require 'osx/cocoa' OSX::NSSound.alloc.initWithContentsOfFile_byReference('/System/Library/Sounds/Blow.aiff', true).play sleep(1)
- AppleScriptから実行してみる。
"require 'osx/cocoa';
OSX::NSSound.alloc.initWithContentsOfFile_byReference('/System/Library/Sounds/Blow.aiff', true).play;
sleep(1);"
do shell script "/usr/bin/ruby -e " & quoted form of result
- 実行してみると...「ブォーゥ」
- あっけなく鳴ったのであった!
なんと、AppleScriptは、Cocoaフレームワークにアクセスし放題だったのである。
ハンドラにする
- あとは警告音のパスのところを変数にしておけば、立派なハンドラになる。
on play(thePath) "require 'osx/cocoa';
OSX::NSSound. alloc.initWithContentsOfFile_byReference('" & thePath & "', true).play;
sleep(1);"
do shell script "/usr/bin/ruby -e " & quoted form of result
end play
tell application "Finder"
set soundDir to ":System:Library:Sounds:" as alias
set soundPaths to soundDir's files
repeat with aPath in soundPaths
set unixPath to (aPath as text)'s POSIX path
my play(unixPath) end repeat
end tell
- 上記のスクリプトを実行すると、システムフォルダの警告音すべてを順に再生する。
既にあるものは有効活用する
- ちなみに、上記のNSSoundを利用するスクリプトは、あくまでCocoa環境にアクセスするサンプルコードで、実はafplayコマンドが、すでに存在する。
- afplayコマンドを利用すれば、playハンドラは不要になる。(あるいは、playハンドラの中身をdo shell script "/usr/bin/afplay " & unixPathにしても良さそう)
tell application "Finder"
set soundDir to ":System:Library:Sounds:" as alias
set soundPaths to soundDir's files
repeat with aPath in soundPaths
set unixPath to (aPath as text)'s POSIX path
do shell script "/usr/bin/afplay " & unixPath
end repeat
end tell
- 自分の場合、今回は音を鳴らすコマンドがないと思って、いろいろな環境で作りまくってしまったが、
- 実はafplayコマンドという需要にぴったりなコマンドが、OSX標準ですでにインストールされていた...。
- 自分が欲しいと思った機能は、世界のどこかで、きっと誰かが欲しいと感じている。大抵、既に何らかの仕組や工夫があったりする。
そして...
AppleScriptからCocoaフレームワークにアクセスすると言うのも、既知の事実なのである。知れば知るほどに、新たな課題と発見がある。