Archive for the 'console' Category

2015/11/03 Syslogにログ出力

CocoaでSyslogにログ出力するAppleScriptです。

Shane StanleyによるNSLogの使用例です。出力時のパラメータのフォーマット指定が可能な点がsyslogコマンドより便利です。

syslog.png

AppleScript名:ASOCでSyslogにログ出力
– Created 2015-10-21 by Shane Stanley
use AppleScript version “2.4″
use scripting additions
use framework “Foundation”

repeat with i from 1 to 10
  current application’s NSLog(“Bah! I can log %.2d to the Console as float %.2f or hex %X, too”, i, i as real, i)
end repeat

★Click Here to Open This Script 

2015/08/20 ASOCでスレッド処理?

Cocoaの機能を用いて、NSThreadによる並列処理のテストを行うAppleScriptです。

画像ファイルにCIFilterによるフィルタ処理を行ったのちにリサイズし、仕上げに再度CIFilterによるリサイズを行う・・・そういう処理を書いて、リサイズ前に画像にフィルタをかけるのにはそれなりに時間がかかったため、複数の画像ファイルを同時に並列で処理できるといいんじゃないか、というのがテストを行った趣旨です。

テストに用いたのがsyslogにコメントを残すという処理なので、このテスト用の処理自体があまりふさわしくないのかもしれないですが、期待していたよりも重い感じです。

とりあえず、100個(ぐらい)の画像のリサイズをシーケンシャルに順次処理する場合と、並列で(実行環境に存在するCPUのコア数を鑑みつつ並列数を決定)処理する場合とで、実際に速度を計測してみるとよいと思われます。

AppleScript名:ASOCでスレッド処理?
– Created 2015-08-20 by Takaaki Naganoya
– 2015 Piyomaru Software
use AppleScript version “2.4″
use scripting additions
use framework “Foundation”

set aThread to current application’s NSThread’s alloc()’s initWithTarget:me selector:“_threadLoop:” object:(current application’s NSString’s stringWithString:“Apple”)

set bThread to current application’s NSThread’s alloc()’s initWithTarget:me selector:“_threadLoop:” object:(current application’s NSString’s stringWithString:“Orange”)

set aRes to current application’s NSThread’s isMultiThreaded()
–>  true

set bRes to current application’s NSThread’s currentThread()
–>  (NSThread) {number = 1, name = main}

set a1Res to current application’s NSThread’s currentThread()’s threadDictionary()
–>  (NSDictionary) {NSAppleEventManagerHandlingStack:{}, NSDocumentsContinuingFileAccess:(NSSet) {}, OSADefaultComponentInstanceKey:(OSAComponentInstance) , OSADefaultLanguageKey:(OSALanguage) , OSAAvailableLanguagesKey:{(OSALanguage) , (OSALanguage) , (OSALanguage) }}

set cRes to current application’s NSThread’s callStackReturnAddresses()
–>  (NSArray) {140735481653180, 140735481652754, 140735559055105, 140735559057361, 4473123264, 4473263701, 4473142396, 4473141941, 4472935365, 4472916653, 140735705914913, 140735481264735, 4400422881, 4400227287, 140735611717816, 140735611717253, 140735611714364, 140735611713043, 140735453174803, 140735453224127, 140735482160121, 140735481878159, 140735481875416, 140735475504495, 140735475503850, 140735475503403, 140735666104491, 140735666101848, 140735666060019, 140735665521220, 140735553762761, 1}

set dRes to current application’s NSThread’s callStackSymbols()
–>  (NSArray) {”0 CoreFoundation 0×00007fff886427bc __invoking___ + 140″, ” …… (omit)

aThread’s setName:“Apple”
bThread’s setName:“Orange”

aThread’s |threadPriority|()
–> 0.5 –(0.0〜1.0)

set c1Res to aThread’s |name|()
–>  (NSString) “Apple”
set c2Res to bThread’s |name|()
–>  (NSString) “Orange”

aThread’s threadDictionary()
–>  (NSDictionary) {}

aThread’s stackSize()
–>  524288 –this depends on each machine’s memory configuration?

aThread’s isExecuting()
–>  false

aThread’s isFinished()
–>  false

aThread’s isCancelled()
–>  false

set noter1 to current application’s NSNotificationCenter’s defaultCenter()
noter1’s addObserver:me selector:“_threadWillExit:” |name|:(current application’s NSThreadWillExitNotification) object:aThread
noter1’s addObserver:me selector:“_threadWillExit:” |name|:(current application’s NSThreadWillExitNotification) object:bThread

aThread’s start()
bThread’s start()

–各Threadが実行するハンドラ
on _threadLoop:aInfo
  repeat 3 times
    set aText to aInfo as text
    
do shell script “logger -s “ & quoted form of aText & ” &”
    
set aNum to random number from 1 to 3
    
delay aNum
  end repeat
end _threadLoop:

–Threadが終了する際に呼ばれるハンドラ
on _threadWillExit:aNotification
  
  
set tmpRes to aNotification’s object’s |name|()
  
say ((tmpRes as text) & ” finished.”) using “Alex”
  
end _threadWillExit:

★Click Here to Open This Script 

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

2009/12/02 Syslogにメッセージを出力する

メッセージをSyslogに出力するAppleScriptです。

実行中のAppleScriptからメッセージ出力するのに、display dialogでは実行が停止してしまうし、AppleScript StudioでUIを作るのも面倒……Growlだとメッセージをダラダラ流していく……わけにもいかず。

  「なら、Syslogにメッセージを流せばいいんじゃない?」

Syslogに出力すれば、コンソール.appに常時メッセージが表示されるようになります。

console.jpg

素朴ですが、役立つAppleScriptです。

syslog1.jpg

syslog2.jpg

AppleScript名:Syslogにメッセージを出力する
logToSyslog("ひよこさんだよ〜") of me

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

★Click Here to Open This Script