AppleScriptからCocoaを使う

前回までに、Rubyから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)


"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フレームワークにアクセスすると言うのも、既知の事実なのである。知れば知るほどに、新たな課題と発見がある。