Archive for the 'EventScripts' Category

2014/02/11 EventScripts経由でiPhoneからKeynoteをコントロール

EventScriptを用いて、iPhoneからMac上のKeynoteをコントロールするためのAppleScriptを何本か書いてみました。

Keynoteをコントロールするさまざまな手段

昔から、プレゼンを操作するためのリモコンのたぐいは、サードパーティの赤外線リモコン、Apple純正のApple Remote、iPhone用のApple純正Keynote Remoteアプリなど、さまざまなものが存在しています(た?)。

img_0553.JPG
▲左から、Keyspan Remote(なつかしい!)、Apple Remote(赤外線I/Fは現行ノート系Macには非搭載)、iOSのRemoteアプリ

そうした他のソリューション(主にAppleのiOS用Keynote Remote)が存在している中でEventScriptsをあえて使う意義はどこに? という話になりますが、「AppleScriptによるインテリジェントな操作が可能」のひとことにつきます。

Keynoteのコントロール

Keynote……ただし、バージョン5.x(iWork 11)系は、さまざまなAppleScript命令を備えています(Keynote 6.x系はまだ出来が不十分なのでゴミ箱行き。日常的にはKeynote 5.xを使っています)。

一番「やってはいけない」操作方法は、System Events経由でキーコードを送る原始的な方法です。もう、それだとAppleScriptを使う意味がない。

Keynoteでドキュメントを開いているのか、スライドの実行中なのか……などなどの「状態」を取得して、状況に合った処理を行うことが重要です。さらに、スライド中のタイトルをAppleScript側から読み取って、スライドのページをめくるたびにタイトルをTwitterに特定タグつきで投稿するなどの「複数の動作」をいっぺんに行えるのもAppleScriptを利用するメリットです。

普通にKeynoteに用意されているAppleScript用語辞書を用いて、普通にAppleScriptを書かないと本来の機能が活かせないので意味がありません。

img_0555.jpg
▲EventScripts RemoteでMac上のKeynoteをコントロールするAppleScriptを実行

これらのAppleScriptをEventScriptsに登録して、iPhone上のEventScripts Remoteからコントロールすれば、Keynoteを自由にコントロールできるようになります。

他のアプリケーションについても、「まっとうな」コントロール方法を用いて操作すると非常に便利です。

スクリプト名:Keynoteのスライドを開始
on run eventArgs
  if application “Keynote” is running then
    tell application “Keynote”
      set aP to playing
      
      
set dCount to count every slideshow
      
      
if aP = false then
        if dCount > 0 then
          start
        else
          say “現在、キーノートでは、プレゼン資料を、オープンして、おりません。” using “Kyoko”
        end if
      else
        –say “現在、キーノートでは、プレゼン資料の、再生を、行って、おりません。”
      end if
      
    end tell
  else
    say “キーノートは、実行されて、いません。”
  end if
  
end run

▼新規書類に ▼カーソル位置に ▼ドキュメント末尾に

スクリプト名:Keynoteのスライドを次へ
on run eventArgs
  if application “Keynote” is running then
    tell application “Keynote”
      set aF to frontmost
      
set aP to playing
      
      
if {aF, aP} = {true, true} then
        show next
      else
        say “現在、キーノートでは、プレゼン資料の、再生を、行って、おりません。” using “Kyoko”
      end if
      
    end tell
  else
    say “キーノートは、実行されて、いません。”
  end if
  
end run

▼新規書類に ▼カーソル位置に ▼ドキュメント末尾に

スクリプト名:Keynoteのスライドを前へ
on run eventArgs
  if application “Keynote” is running then
    tell application “Keynote”
      set aF to frontmost
      
set aP to playing
      
      
if {aF, aP} = {true, true} then
        show previous
      else
        say “現在、キーノートでは、プレゼン資料の、再生を、行って、おりません。” using “Kyoko”
      end if
      
    end tell
  else
    say “キーノートは、実行されて、いません。”
  end if
  
end run

▼新規書類に ▼カーソル位置に ▼ドキュメント末尾に

スクリプト名:Keynoteのスライドを最初のページへ
on run eventArgs
  if application “Keynote” is running then
    tell application “Keynote”
      set aF to frontmost
      
set aP to playing
      
      
if {aF, aP} = {true, true} then
        show first slide of slideshow 1
      else
        say “現在、キーノートでは、プレゼン、資料の、再生を、行って、おりません。” using “Kyoko”
      end if
      
    end tell
  else
    say “キーノートは、実行されて、いません。”
  end if
  
end run

▼新規書類に ▼カーソル位置に ▼ドキュメント末尾に

スクリプト名:Keynoteのスライドを最後のページへ
on run eventArgs
  if application “Keynote” is running then
    tell application “Keynote”
      set aF to frontmost
      
set aP to playing
      
      
if {aF, aP} = {true, true} then
        tell slideshow 1
          set pCount to count every slide
        end tell
        
        
show slide pCount of slideshow 1
      else
        say “現在、キーノートでは、プレゼン資料の、再生を、行って、おりません。” using “Kyoko”
      end if
      
    end tell
  else
    say “キーノートは、実行されて、いません。”
  end if
  
end run

▼新規書類に ▼カーソル位置に ▼ドキュメント末尾に

スクリプト名:Keynoteのスライドを中断
on run eventArgs
  if application “Keynote” is running then
    tell application “Keynote”
      set aF to frontmost
      
set aP to playing
      
      
if {aF, aP} = {true, true} then
        stop slideshow
      else
        say “現在、キーノートでは、プレゼン資料の、再生を、行って、おりません。” using “Kyoko”
      end if
      
    end tell
  else
    say “キーノートは、実行されて、いません。”
  end if
  
end run

▼新規書類に ▼カーソル位置に ▼ドキュメント末尾に

2014/02/07 iPhoneからMacにAppleScriptを実行させるEventScripts+EventScripts Mobile

iOSデバイス+Mac上のAppleScript実行シリーズのしめくくりとして、Mousedown Softwareの「EventScripts」をご紹介します(現時点で、これとOtto’s Antennaの2つ以外には存在していません)。

es1.png

Mac用に「EventScripts」(原稿作成時のバージョンはv1.10 MacApp Storeで300円)というアプリがあって、マシンがシャットダウンするとかスリープするとか、Webブラウザが起動するとかいった(Mac上の)「イベント」を拾って、イベントごとに割り当てたAppleScriptを自動実行する機能を提供しています。

このEventScriptsに同じくMousedown SoftwareのiOS用(iPhone/iPad両用)リモートコントロールアプリ「EventScripts Mobile」(無料)を併用すると、iOSデバイスからWiFiネットワーク経由で、Mac上のAppleScriptをMacに実行させることができます。

es4.png

es2.png

ぱっと見、Bluetooth経由でiOSデバイス→MacにAppleScriptの実行要求をかけられそうに見えるのですが、それはできません。Bluetooth経由で3台までのデバイス(iOSでなくてもいいんでしょうね。マウスとかでも)を登録+監視することができ、Bluetoothデバイスの存在検出などのイベントをトリガーにしてAppleScriptの実行が行えるようになっています。

Otto’s Remoteと違うのは、WiFiネットワーク経由でiOSデバイス→MacへのAppleScript実行要求を出すことでしょうか。要求すると即座に実行されます。また、実行できたかどうかをiOSデバイス上で確認できます(緑で正常実行。赤だとエラー)。

img_2309.PNG

img_2310.PNG

ただし、実行結果をMacからiOSデバイスに返せないので、例によって別途さまざまなアプリケーションを経由して、実行結果を返してあげる必要がありそうです。

Otto’s RemoteがAutomator寄りだったのに対して、EventScriptsはAppleScript寄りです。というか、Automator Actionは実行できません。

EventScriptsに登録するAppleScriptは、

on run eventArgs
–なんか処理をする〜
end run

という書き方をします。このeventArgsの中にイベント発生情報が入っているようですが、どうなっているかドキュメントが存在していないので、実際に調べてみましょう。

Recordをまるごと文字化して、Console.appにsyslogとして出力することにします。

所要時間3分。あっという間にコピペで完成。

AppleScript名:イベントロガーだよ〜ん
on run eventArgs
  beep
  
–recordをstringsに変換
  
set aStr to recToString(eventArgs) of recToStrKit
  
  
logToSyslog(aStr) of me
  
end run

–Syslogにメッセージを出力する
on logToSyslog(theMes)
  do shell script “logger -s “ & quoted form of theMes
end logToSyslog

script recToStrKit
  
  
–エラートラップを使って、わざとエラーを発生させ、エラーメッセージからレコードをstringに変換する
  
on recToString(aRec)
    
    
–レコードを無理矢理stringにcastして、エラーメッセージを取得する
    
try
      set a to aRec as string –ここでエラー発生
    on error aMes
      set a to aMes
    end try
    
    
–エラーメッセージ文字列から、元のレコードの情報を組み立てる
    
set b to trimStrFromTo(a, “{”, “}”)
    
set b to “{” & b & “}”
    
    
return b
    
  end recToString
  
  
  
on trimStrFromTo(aStr, fromStr, toStr)
    –fromStrは前から探す
    
if fromStr is not equal to “” then
      set sPos to (offset of fromStr in aStr) + 1
    else
      set sPos to 1
    end if
    
    
–toStrは後ろから探す
    
if toStr is not equal to “” then
      set b to (reverse of characters of aStr) as string
      
set ePos to (offset of toStr in b)
      
set ePos to ((length of aStr) - ePos)
    else
      set ePos to length of aStr
    end if
    
set aRes to text sPos thru ePos of aStr
    
    
return aRes
    
  end trimStrFromTo
  
end script

★Click Here to Open This Script 

実際に、~/Library/Application Scripts/net.mousedown.EventScripts/フォルダに書いたAppleScriptを入れ、EventScriptsの画面上で「Add Script」で実行対象にします。その際に、応答するイベントを「EventScripts Mobile」にしておくとiOSデバイス上のEventScripts Mobileにスクリプト名が表示されます。

実行すると、ほぼ瞬間的に実行され、エラーが発生したかどうかがiOSデバイスの画面上で分ります。WiFiのネットワーク内にMacもiOSデバイスも共存できている環境であれば、Otto’s Antennaよりも使い勝手がよいと思われます。

iOS側からAppleScriptの実行をリクエストすると、Console.appの画面上に実行時のパラメータがそのまま文字で表示されます。

es5.png

Mobileからの実行イベントでは、scriptPathとtriggerの2つのパラメータが受け渡されるようです。scriptPathには実行したAppleScriptのPOSIX pathが、triggerには”EventScripts Mobile”が入っていました。

案外あっさりしている印象ですが、Mousedown SoftwareがWeb上で配布しているサンプルAppleScriptを見ると、イベントごとにAppleScriptに渡されるパラメータ(レコード)の内容が異なるようで、サンプル「Location Sample Script.scpt」では位置情報がAppleScript側に渡されることがうかがえます。

スクリプト名:Location Sample Script.scpt
on run eventArgs
  
  
– eventArgs is a record of with details of the action passed by the EventScripts application
  
– the properties passed depend on the action, however there will always be a trigger property
  
– which describes the event that triggered the script
  
  
set triggerAction to {trigger of eventArgs}
  
  
set latitude to {latitude of eventArgs} as string
  
set longitude to {longitude of eventArgs} as string
  
set previousLatitude to {previousLatitude of eventArgs}
  
set previousLongitude to {previousLongitude of eventArgs}
  
  
tell application “Finder”
    activate
    
display dialog “Your new location: “ & latitude & “, “ & longitude & return & ¬
      “Your old location: “ & previousLatitude & “, “ & previousLongitude with title triggerAction giving up after 2
  end tell
  
end run

▼新規書類に ▼カーソル位置に ▼ドキュメント末尾に

どっちがいいの?

一長一短あり、EventScriptsとOtto’s Antennaのどちらをおすすめするかは、用途によると思われます。

es9.png

EventScriptは、自宅などWiFiネットワーク内にiOSデバイスもMacも共存できる場合がおすすめです。会社では、iOSデバイスのWiFiへのアクセスを禁止しているところが多いようなので、なかなか利用できないでしょう。

Otto’s Antennaは場所を選ばずに利用できるため、けっこう無茶な使い方ができそうです。ただ、リクエストしてから実行されるまでに時間がかかるのがデメリット。

こうした「iOSからAppleScript実行」系のソフトウェアが充実してくることで、さらに便利かつ強力なソリューションを構築できるようになると思われます。それぞれのソフトウェアの作者が開発を継続できるように、ぜひ購入して試してみてください。