Archive for 5月, 2015

2015/05/30 Radikoで選局v6

SafariでRadiko.jpをオープンして現在の地域で選局可能なラジオ局の一覧を取得し、一覧から選択したあとに、指定したラジオ局をオープンするAppleScriptです。

自作のAppleScriptObjCのアプリケーション「radiRec」(あくまで個人用)に組み込んで、指定時刻に指定ラジオ局の番組を録音するために作成したものです。

Safariアプリケーション内のWebViewへの参照がいろいろ変わるので、そうした動的な変動を吸収するための機構を追加しました。

GUI Scripting経由でSafariにアクセスしているので、システム環境設定からあらかじめ「アクセシビリティ」から「補助装置にアクセスできるようにする」にチェックを入れておくか、Script実行時にパスワードを入力すると設定を変更します。

radiko41.png

OS X 10.10.3+Safari 8.0.7、場所は東京都内で動作確認してあります(他のエリアではチェックしていません)。

AppleScript名:Radikoで選局v6
–WevViewへの参照を動的に取得するように変更
–OS X 10.10.3(本当は4だけど), Safari 8.0.7, Radiko.jpがプレミアム会員サービスを開始した状態に対応

property waitSec : 10 –Safariのページローディングを待つ時間(秒)

–GUI Scriptingの確認
repeat 3 times
  tell application “System Events”
    set aRes to UI elements enabled
  end tell
  
  
if aRes = false then
    display dialog “GUI Scriptingをオンにしてください。” buttons {“OK”} default button 1
    
tell application “System Events”
      activate
      
set UI elements enabled to true
    end tell
  end if
end repeat
if aRes = false then return

set aList to getRadioStationList() of me
–> {”TBSラジオ”, “文化放送”, “ニッポン放送”, “ラジオNIKKEI第1″, “ラジオNIKKEI第2″, “InterFM”, “TOKYO FM”, “J-WAVE”, “ラジオ日本”, “bayfm78″, “NACK5″, “FMヨコハマ”, “放送大学”}

tell current application
  activate
  
set aRes to choose from list aList
end tell

set aaRes to first item of aRes

selectRadioStation(aaRes) of me –選曲

–SafariでRadikoの選局を行う
on selectRadioStation(aStation)
  activate application “Safari”
  
  
tell application “Safari”
    close every document
    
    
tell document 1
      tell current tab
        open location “http://radiko.jp”
      end tell
    end tell
  end tell
  
  
delay waitSec
  
  
tell application “System Events”
    tell process “Safari”
      
      
set webView to retSafariHTMLViewReference() of me
      
tell webView
        tell list 2
          –ログイン/プレミアム会員登録の箇所が増えたのでlist2に
          
set gList to every group
          
          
set uList to {}
          
          
repeat with i in gList
            tell i
              tell group 1 –ここ、1階層増えた
                set a to UI element 1
                
set statName to title of a
                
set the end of uList to statName
                
if statName = aStation then
                  
                  
click a
                  
                end if
              end tell
            end tell
          end repeat
          
        end tell
        
      end tell
    end tell
  end tell
  
end selectRadioStation

–SafariでRadikoのラジオ局一覧を取得する
on getRadioStationList()
  activate application “Safari”
  
  
tell application “Safari”
    close every document
    
    
tell document 1
      tell current tab
        open location “http://radiko.jp”
      end tell
    end tell
  end tell
  
  
delay waitSec
  
  
tell application “System Events”
    tell process “Safari”
      set webView to retSafariHTMLViewReference() of me
      
tell webView
        
        
tell list 2
          –ログイン/プレミアム会員登録の箇所が増えたのでlist2に
          
set gList to every group
          
          
set uList to {}
          
          
repeat with i in gList
            tell i
              tell group 1 –ここ、1階層増えた
                set a to UI element 1
                
set statName to title of a
                
set the end of uList to statName
              end tell
            end tell
          end repeat
          
          
return uList
          
        end tell
      end tell
      
    end tell
  end tell
  
end getRadioStationList

–SafariのWebViewへのGUI Scripting的な参照を取得する
on retSafariHTMLViewReference()
  tell application “System Events”
    tell process “Safari”
      
      
set wList to every window
      
set wLen to length of wList
      
if wLen = 0 then return false
      
      
tell window 1
        repeat with i from 1 to 10 –Usually from 1 to 5
          try
            tell group i
              tell UI element 1 of scroll area 1 of group 1 of group 1
                set aProp to role
                
if aProp = “AXWebArea” then
                  return (UI element 1 of scroll area 1 of group 1 of group 1 of group i of window 1 of process “Safari” of application “System Events”)
                end if
              end tell
            end tell
          end try
          
        end repeat
      end tell
      
    end tell
  end tell
end retSafariHTMLViewReference

★Click Here to Open This Script 

2015/05/29 BridgePlus v1.1.0 Readme日本語翻訳版

(Written By Shane Stanley、Translated By Takaaki Naganoya〜翻訳・掲載はShaneの許諾済み)

BridgePlusはAppleScriptで記述した「Script Library」で、バージョン10.9以降のOS Xで動作します。

典型的なScripterにとって、BridgePlusは「ASObjC Runner.app」の機能をもとにしたハンドラ群を含んだライブラリです。

AppleScriptObjCユーザーにとって、AppleScriptとCocoaオブジェクトの相互変換機能を向上させたコマンド群で、(AppleScript用語辞書によるラッピングを介さず)拡張機能に直接アクセスが可能なものです。

bridge.png

BridgePlusは、いずれかのScript Librariesフォルダ(~/Library/Script Libraries/ など)にインストールしておく必要があります。また、Scriptアプリケーションのバンドル内に直接埋め込むことも可能です(後述)。

基本的な利用方法

もし、あなたがAppleScriptObjCを使うつもりがない場合、BridgePlusは1つの適切なコマンドをAppleScript用語辞書の中に持っています。それが、「open lib description」コマンドです。本コマンドを実行すると、このReadme書類(英文)を自動でオープンします。

AppleScript名:sample1
use BridgePlus : script “BridgePlus”
open lib description

★Click Here to Open This Script 

BridgePlusライブラリ内のハンドラ(サブルーチン)を呼び出すためには、ライブラリ経由で呼び出すことになります。

たとえば、ソーティング(データ並べ替え)のハンドラ(サブルーチン)、

on sortListOfNumbers:listOfNumbers

を呼び出すためには、

AppleScript名:sample2
use AppleScript version “2.4″
use scripting additions
use BridgePlus : script “BridgePlus”
set sortedList to BridgePlus’s sortListOfNumbers:{9, 2, 7, 3, 6, 4}
–> {2, 3, 4, 6, 7, 9}

★Click Here to Open This Script 

のように書くことになります。もし、OS X 10.6.x上でのAppleScriptObjCハンドラ風に、

AppleScript名:sample3
use AppleScript version “2.4″
use scripting additions
use BridgePlus : script “BridgePlus”
set sortedList to BridgePlus’s sortListOfNumbers_({9, 2, 7, 3, 6, 4})

★Click Here to Open This Script 

と書いたとしても、コンパイル(構文確認)すると、

AppleScript名:sample4
use AppleScript version “2.4″
use scripting additions
use BridgePlus : script “BridgePlus”
set sortedList to BridgePlus’s sortListOfNumbers:{9, 2, 7, 3, 6, 4}

★Click Here to Open This Script 

のように書き換えられます。

(注記:オリジナルではここで各種ハンドラの実例紹介。サンプル部分をすべて日本語訳していると時間がかかりすぎるので、Shaneと協議の結果、まずは日本語訳も実例以外の部分を掲載ということで話がまとまった)

基本的な利用方法

BridgePlusは2つのメインコマンドを持っており、これらはAppleScriptObjC記述時に、CocoaとAppleScriptのオブジェクトの変換をシンプルにし、機能向上させるものです。

 Cocoaify:AppleScript側の値をCocoa側の等しい型の値(例:integer→NSInteger)に変換します
 ASify from:Cocoa側の値をAppleScript側の等しい型の値(例:NSInteger→integer)に変換します

BridgePlus Script LibraryのAppleScript用語辞書を見るには、

 スクリプトエディタ:BridgePlusを~/Library/Script Libraries.フォルダにコピーしたのちに、「ファイル」>「用語説明を開く…」を実行
 Script Debugger:Optionキーを押しながらScript Debuggerアイコンにドラッグ

と操作してください。

多くのケースにおいて、AppleScriptObjCによる処理は以下の3ステップから構成されます。

 AppleScript側の値をCocoa側の等しい型に変換
 Cocoaオブジェクトのinstance methodを呼び出す
 7覯漫Cocoaの値)をAppleScript側の値に変換して返す

たとえば、以下のようなAppleScriptObjCのコードがあったとして、

AppleScript名:sample5
use framework “Foundation”

set someList to {1, 3, 2} –I added :-)
set anArray to current application’s NSArray’s arrayWithArray:someList
set anArray to anArray’s sortedArrayUsingSelector:“compare:”
set aList to anArray as list

★Click Here to Open This Script 

これはBridgePlusを使ってこのように書き換えられます。

AppleScript名:sample6
use framework “Foundation”
use script “BridgePlus”

set someList to {1, 3, 2} I added :-)
set anArray to Cocoaify someList
set anArray to anArray’s sortedArrayUsingSelector:“compare:”
set aList to ASify from anArray

★Click Here to Open This Script 

ほんのちょっとシンプルになりましたが、劇的なほどではありませんね。しかしながら、「Cocoaify」「ASify from」コマンドを使うことによる利点は、AppleScriptとCocoaの間の型変換をより完全に行えることにあります。

・Cocoaifyコマンド:AppleScript側の値がdateオブジェクト、もしくはlist型やRecord型でdateオブジェクトを含む場合に、dateはNSDateに変換されます。alias型やfileはNSURLに変換されます

・ASify fromコマンド:Cocoa側の値がNSDateの場合、およびNSDateを含むNSArrayやNSDictionaryの場合、AppleScript側のdateに変換されます。同様に、NSURLはfile («class furl»)に変換されます。

Cocoa側の値がFloating Pointの数値を含む場合、それらはAppleScript側のrealに変換されますし、listやrecord内に含まれるrealとして変換されます。実際に、OS X 10.10.3上でCocoaのFloating Pointの数値1.2をAppleScript側のrealに変換すると1.200000047684になるなど、AppleScriptの標準機能を使うと精度が失われてしまいます。でも、BridgePlusの「ASify from」コマンドを使えば、こんな問題は起きません。Cocoaの1.2を変換しても、AppleScript側でも1.2が得られます。

なので、たとえば上記のサンプルScriptにAppleScriptのdate型のデータをlist型データに入れても、きちんとソートされます。

AppleScript名:sample7
use framework “Foundation”
use scripting additions
use script “BridgePlus”

set someList to {current date, (current date) - (2 * days), (current date) - (1 * days)} Today, The Day before Yesterday, Yesterday
set anArray to Cocoaify someList
set anArray to anArray’s sortedArrayUsingSelector:“compare:”
set aList to ASify from anArray
–> {date “2015年5月28日木曜日 0:22:39″, date “2015年5月29日金曜日 0:22:39″, date “2015年5月30日土曜日 0:22:39″}

★Click Here to Open This Script 

BridgePlusなしでAppleScriptの標準機能を使った場合には、サブルーチンを用いてひとつひとつのdateの値をNSDateに変換してから並べ替える必要があります。さらに、並べ替えたあとに元の型に変換し直す必要も出てきます。そのさいのAppleScriptObjCのコードはより長く複雑なものになってしまいます。

高度なAppleScriptObjCでの利用方法

「BridgePlus.scptd」のバンドルは、多くのScripterにとって有用なフレームワーク(BridgePlus.framework)を含んでいます。本ライブラリBridgePlusはこの内部フレームワークが持つすべての機能をサポートする用語は持っていませんが、あなたのScriptに「use script “BridgePlus”」の1行を加えるだけで、フレームワークのmethodに直接アクセスできるようになります。

フレームワーク内のmethodのほとんどは、「SMSForder」クラスから呼び出せるmethodとして実装されており、これらは「ASObjC Runner.app」(現在では廃止)をもとに機能拡張されたものです。「SMSForder」クラスのヘッダーファイルを確認するには、「open framework header」コマンドを実行します。

AppleScript名:sample8
use script “BridgePlus”
open framework header

★Click Here to Open This Script 

BridgePlusのフレームワークは、実際のところ「ASObjCExtras.framework」のアップデート版であり、ASObjCExtras.frameworkがすでにインストールされている環境でのコンフリクトやクラッシュを避けるために名称変更されたものです。

SMSForder内のmethodを直接呼び出す前に、最低でも1つのBridgePlus.scptdライブラリ内のコマンドを実行する必要があります。それが「load framework」コマンドです(もしくは何かBridgePlusの持つコマンド・・・たとえば、Cocoaify “” を実行することでもOKです)。

かんたんなサンプル:

AppleScript名:sample9
use framework “Foundation”
use scripting additions
use script “BridgePlus”

load framework
set newList to ASify from (current application’s SMSForder’s colsToRowsIn:{{1, 2, 3}, {4, 5, 6}, {7, 8, 9}, {10, 11, 12}} |error|:(missing value))
>  {{1, 4, 7, 10}, {2, 5, 8, 11}, {3, 6, 9, 12}}

★Click Here to Open This Script 

やってはいけないことがあります。たとえあなたがBridgePlusライブラリをインストールしてあって使っていても、Script中に「use framework “BridgePlus”」とは書いてはいけません。その書き方ではBridgePlusバンドル内部のフレームワークは見つかりません。「use script “BridgePlus” 」の行とBridgePlusの持つコマンドを1つ実行するとフレームワークが(自動で)読み込まれるようになっています。

SMSForderはCocoa的に0からはじまるインデックスを用います、一方でBridgePlusライブラリの「AppleScriptObjC」で直接内部機能を呼び出さないハンドラを呼び出した場合にはAppleScriptの世界で標準的な1からはじまるインデックスで値を返します。

実行環境へのインストール(Deployment)

「~/Library/Script Libraries」フォルダに「BridgePlus.scptd」ファイルを入れることで、あなたのすべてのAppleScript中でBridgePlusの機能を利用できるようになります。

BridgePlusライブラリをあなたの書いたScriptと一緒に配布する際には、BridgePlus.scptdファイルをあなたのScriptのBundle内の「/Contents/Resources/Script Libraries」フォルダに入れておけば大丈夫です(アプレットの場合でも、.scptdファイルの場合でも)。

もし、あなたがScript Bundle(AppleScriptアプレット/.scptd)をCodesignすることを検討している場合、まず最初にライブラリ中に入っているBridgePlus.frameworkをcodesignする必要があります。

BridgePlusをXcodeプロジェクト内でお使いの場合、「BridgePlus.framework」をBridgePlusライブラリのバンドル内から取り出して、他のframeworkと同様にXcodeプロジェクトに登録し、「BridgePlus.scptd」バンドル内から削除する必要があります。このようにすれば、BridgePlus.frameworkのcodesignはXcodeがめんどうを見てくれます。

BridgePlusのダウンロードはこちら!
http://www.macosxautomation.com/applescript/apps/BridgePlus.html

著名なScripterでありBlogerであるTakaaki Naganoyaによる(表現原文ママ)ASObjCExtras.frameworkの総合マニュアル(英文)はこちらです。
同マニュアルは、もしあなたがBridgePlusの上級者向けの(AppleScriptObjCの)機能を利用したい場合には有用なものです。

http://piyocast.com/as/asinyaye/free-asobjcextras-scripting-guide/

本ライブラリの利用にあたって、ライブラリ全体、内部フレームワークのみの場合の両方で自由に再配布できます(再配布時の料金は発生しません)。
利用料金は発生しませんが、動作保証もいたしません。「At your own risk」でご利用ください。

2015/05/26 FileMaker Proがv14で(ようやく)64ビット化

fm14.png

fm_history.png

FileMaker Pro v14が発表され、お試し版がダウンロード可能になっています。そして、お試し版で実際に確認してみたところ・・・同バージョンがFileMaker Proとしてはじめて64ビットアプリケーションになったことがわかりました。

file_result.png
▲fileコマンドのfilemaker proバイナリ本体への実行結果

FileMaker Proは(海外では)プラグインの開発者も多くついているので、プラグインの移行を促すための期間が必要であったり、Windows版ではまだ32bit環境を維持する必要がある関係上、簡単には64ビットへの移行ができない様子でしたが、ついに64ビット化。

→ 参考:FM13をASから骨までしゃぶる

FileMaker ProではScriptステップ中にAppleScriptを記述でき、これが独特のランタイム環境で動作し・・・とくにFileMaker Proを操作するAppleScriptを超高速に実行できる「謎のAppleScriptランタイム」が搭載されていることで有名(別名:卑怯な手段で高速化しているずるい環境)。

FileMaker Pro v14が64ビット化されたことで、ASObjCExtras.frameworkを呼び出すASOCのAppleScriptをFileMaker ProのScriptステップ中に記述できるようになりました。もちろん、後継のBridgePlusも同様です。

FileMaker ProのScriptステップ中から、Cocoaの機能をダイレクトに呼び出すAppleScript(ASOC)を本格的に記述できるようになったため、さまざまな機能拡張をプラグイン開発なしで行うことができるようになりました。

Scripterにとっては実に有意義なバージョンアップです。ただ、AppleScript用語辞書の内容は代わり映えしません。

2015/05/22 BridgePlusがv1.0からv1.1にバージョンアップ

Shane StanleyによるOSのScripting Bridgeのバグを回避しさまざまな高度な型変換機能や計算機能をAppleScriptにもたらす「ASObjCExtras.framework」の後継ソフトウェア、「BridgePlus」の登場から間もないですが、早くもバージョンアップ!

バージョン1.0から1.1になりました。

基本的な機能については、さほど変更はなく・・・AppleScriptObjCをさわっていないAppleScriptユーザーに便利で簡単に感じられるように、AppleScript用語辞書が補われているという方向で機能強化されています。FrameworkではAppleScript用語辞書がついていないので、そこを補うために「見た目のファイル形状」(Framework単体からFramework入りScript Librariesへ)を変更したということです。

BridgePlusのAppleScript用語辞書を用いて記述するかぎりは、結果などすべてAppleScriptのオブジェクトに変換して返してくれるので、いきなりNSArrayなどが返ってきて面食らうようなことはないはずです。Arrayのindexも0ベースではなくAppleScriptの1ベースのindexが返ってくるため、違和感をおぼえないようになっています。

ただ、これはつまり・・・値を返すときにかならず毎回CocoaオブジェクトからAppleScriptオブジェクトへの再変換を行っているわけで、高速なScriptを組むときにはこのオーバーヘッドを回避できるよう、内部機能を直接呼び出す方向でScriptを組んだほうがメリットがあります。

上級スクリプター向けの機能を維持しつつ、一般スクリプター向けにわかりやすさと単純さを高めた・・・という感じでしょうか。

AppleScript名:BridgePlus v1.0の記述サンプル
use AppleScript version “2.4″
use scripting additions
use framework “Foundation”
use script “BridgePlus” version “1.0″

set someList to {1, 3, 2}
set anArray to Cocoaify someList
set anArray to anArray’s sortedArrayUsingSelector:“compare:”
set aList to ASify from anArray
–> {1, 2, 3}

★Click Here to Open This Script 

AppleScript名:BridgePlus v1.1の記述サンプル
use AppleScript version “2.4″
use scripting additions
use framework “Foundation”
use BridgePlus : script “BridgePlus” version “1.1″

set aList to BridgePlus’s sortListOfNumbers:{1, 3, 2}
–> {1, 2, 3}

★Click Here to Open This Script 

AppleScript名:BridgePlus v1.1の記述サンプル(上級者向け記述)
use AppleScript version “2.4″
use scripting additions
use framework “Foundation”
use BridgePlus : script “BridgePlus” version “1.1″

load framework –一応、念のため実行。初回呼び出し時のオーバーヘッド軽減のため
set someList to {1, 3, 2}
set anArray to Cocoaify someList
set anArray to anArray’s sortedArrayUsingSelector:“compare:”
set aList to ASify from anArray
–> {1, 2, 3}

★Click Here to Open This Script 

2015/05/21 ASObjC Extras.frameworkからBridgePlus Script Libraryへ

Scripting Bridgeのバグを回避し、より手軽にCocoaオブジェクトとAppleScriptオブジェクトの相互変換が行えるようにしたのが、Shane StanleyのASObjCExtras.frameworkです。

日々、便利に使っていますし・・・いくつかのアプリケーションやシステムはすでにASObjCExtras.frameworkを用いて記述し、稼働しています。

ただ、ここまで気合いの入ったASObjCExtras.frameworkですが、まだ大々的に利用されるにはいたっていません。

理由は・・・

(1)ASObjC自体が、Scripterにそれほど理解・利用されていない(Appleがドキュメントを一切出していないので、事実上Shaneの電子ブック「AppleScriptObjC Explored」と「Everyday AppleScriptObjC」を読まずに使うのは無理!)

(2)ASObjCExtras.frameworkにかぎらず、Cocoaの機能を使おうとしてもAppleScript用語辞書が存在していないので、「用語辞書を見ながらScriptを書く」というやり方ができない

といったあたりだとShaneは分析しており、加えて自分は、

(3)CocoaのオンラインドキュメントがObjective-CとかSwift用であって、AppleScriptObjCの書き方が書かれていない

さらに、

(4)Apple純正のScript Editorの機能不足

といった点も問題だと思っています。CocoaのAPIを調べて記述するだけの機能はScript Editorには備わっていません。

そこでShaneはASObjCExstras.frameworkの後継Framework「BridgePlus.framework」を含んだAppleScript Libraries「BridgePlus Library」を発表。配布を開始しました

AppleScript Librariesなので、AppleScript用語辞書が見られるし、useコマンドでバージョン番号も指定できる(割と頻繁にバージョンアップするので)など、さまざまな問題が解決できる見込みです。

bridgep.png

えー、一応事前に「こういうのやりたいんだけど(ドキュメントが作り直しになっちゃうかもしれないけど)、どうかな?」という打診はもらっていまして(^ー^;; そりゃー、Shaneがやりたいと思うんなら「一番いいと思う方向でやっちゃってくださいよ。ドキュメントのことは気にしないで」とお答えしておきました。

AppleScript名:ASObjCExtrasの記述サンプル
use AppleScript version “2.4″
use scripting additions
use framework “Foundation”
use framework “ASObjCExtras”

set aList to {1, 3, 2}
set aArray to current application’s SMSFord’s Cocoaify:aList
set aRes to aArray’s sortedArrayUsingSelector:“compare:”
set bList to aRes’s ASify() as list
–> {1, 2, 3}

★Click Here to Open This Script 

AppleScript名:BridgePlusの記述サンプル
use AppleScript version “2.4″
use scripting additions
use framework “Foundation”
use script “BridgePlus” version “1.0″

set someList to {1, 3, 2}
set anArray to Cocoaify someList
set anArray to anArray’s sortedArrayUsingSelector:“compare:”
set aList to ASify from anArray
–> {1, 2, 3}

★Click Here to Open This Script 

2015/05/17 メモリー解放?

使っていないメモリーの解放を促す(?)AppleScriptです。

OS X, Yosemiteのメモリー管理がうまくないのか、以前よりもメモリー不足に陥るケースが増えてきました。OS X 10.10.x搭載のMac miniなどでAppleScriptによる常時稼働の自動処理ロボットを運用している際に、最低環境のメモリー4GBで運用しているときついケースもあります。

memoryusage.png
▲搭載メモリー8GBのMacBook Pro Retinaでもメモリー解放ユーティリティが欠かせない。ただし、この手のソフトはTerminalやAppleScriptから呼び出せない

長期間連続運転しているとメモリー上のゴミも増えるわけで、各種メモリー解放ソリューションを自動処理システムにも導入したくなります。

世間的に、「これを実行するとメモリーが解放される」とされているものは、メモリー解放専用のコマンドではなく、別の働きをするものを実行するとなぜかメモリーが解放されるといった「民間療法」レベルの話が多く、本当にメモリーを解放できるかどうかは眉ツバものです。

メモリー解放効果があるとされているコマンドは、du(ディスク使用量報告)コマンド、purge(ディスクキャッシュのdiskへの書き戻し)コマンド、あとはkillallコマンドでdockやFinderのプロセスをkillするとか(FinderのKillはけっこういい気がする)。

とりあえず、自動処理システムに組み込めるようにハンドラで呼べるようにして、メモリー解放度合いを計測できるようにしてみました。

実際に呼び出してメモリー解放度合いを計測していますが、効果のある場合もあればない場合もあったりで、こんなもんに頼るよりも「メモリー搭載量の多いマシン」で自動処理するほうが正解だったり、定期的に自動でシステムの再起動を行ったほうが効果的だったりで、なかなか頭が痛いところです。

そういう意味で、現行モデルのMac miniのメモリーが増設できなくなったのは残念です、、、、あるいは、最低構成を8GBに変更すべき(新MacBookのように)。

AppleScript名:メモリー解放?
set aRec to getMemStatus()
–> {usedMem:”7068M”, usedMemFixed:”1205M”, freeMem:”1115M”}

freeMem1(20) of me

set bRec to getMemStatus()
–>{usedMem:”6343M”, usedMemFixed:”1236M”, freeMem:”1840M”}

–メモリー解放?
on freeMem1(sleepSec as integer)
  set sText to “du -sx / &> /dev/null & sleep “ & (sleepSec as string) & ” && kill $!”
  
try
    do shell script sText
  end try
end freeMem1

–メモリー状況の確認
on getMemStatus()
  set memoryStatus to do shell script “top -l 1 | head -10 | grep PhysMem”
  
set usedMem to word 2 of memoryStatus
  
set wiredMem to word 4 of memoryStatus
  
set unusedMem to word 6 of memoryStatus
  
return {usedMem:usedMem, usedMemFixed:wiredMem, freeMem:unusedMem}
end getMemStatus

★Click Here to Open This Script 

2015/05/13 Mailで有効なmailアカウントの新規メール取得を強制的に有効にする

Mail.appに設定しているmailアカウントのうち、有効なもの(使用停止にしていないもの)の新規メール取得状況を強制的に「取得する」状態に設定するAppleScriptです。

何も、初期状態に戻さなくてもいいケースもあるのでは?(Mac miniの最低ランクのマシンにAppleScriptを稼働させて専用機化するような場合)と考えて、少し機能の異なるものも作っておいた次第です。

AppleScript名:Mailで有効なmailアカウントの新規メール取得を強制的に有効にする
forceRecoverEveryMailReadSchedule() of me

on forceRecoverEveryMailReadSchedule()
  tell application id "com.apple.mail"
    set acList to every account whose enabled is true –有効なMailアカウントだけを取得
    
repeat with i in acList
      set j to contents of i
      
set include when getting new mail of j to true
    end repeat
  end tell
end forceRecoverEveryMailReadSchedule

★Click Here to Open This Script 

2015/05/13 Mailで有効なmailアカウントの新規メール取得を元に戻す

Mail.appに設定しているmailアカウントのうち、有効なもの(使用停止にしていないもの)の新規メール取得状況を(あらかじめバックアップしておいた)元の状態に戻すAppleScriptです。指定した状態にできたかどうかをbooleanで(true/false)返します。

「Mailで有効なmailアカウントの新規メール取得を停止して元の設定状態を返す」AppleScriptを実行してなにがしかのまとまった処理をしたあとで、後処理に実行する種類のものです。

AppleScript名:Mailで有効なmailアカウントの新規メール取得を元に戻す
set origList to {true, true, true, true}
set aRes to recoverEveryMailReadSchedule(origList) of me
–> true

on recoverEveryMailReadSchedule(origList)
  set aList to {}
  
  
tell application id "com.apple.mail"
    set acList to every account whose enabled is true –有効なMailアカウントだけを取得
    
set aCount to 1
    
    
repeat with i in acList
      set j to contents of i
      
set jj to contents of item aCount of origList
      
      
set include when getting new mail of j to jj
      
set the end of aList to include when getting new mail of j
      
set aCount to aCount + 1
    end repeat
  end tell
  
  
return (aList = origList) –設定が成功したかどうかをBooleanで返す
  
end recoverEveryMailReadSchedule

★Click Here to Open This Script 

2015/05/13 Mailで有効なmailアカウントの新規メール取得を停止して元の設定状態を返す

Mail.appに設定しているmailアカウントのうち、有効なもの(使用停止にしていないもの)の新規メール取得を停止し、各mailアカウントのメール取得状態をリストで返すAppleScriptです。

Mail.appで受信したメール(Inboxに入っているメール)に対してなにがしかの処理を行いたいときに、まず最初に「後続の新着メールが発生しないように、メール受信を一時的に止める」ことが必要になってきます。

ただし、最近のMail.appではメールチェックのスケジュール自体はいじくれないので、各mailアカウントのプロパティで「include when getting new mail」というものがあるので、これをfalseに設定してあげると新着メールの確認時にチェック対象から外れます(GUI側とも連動している)。

mail10.png

そして、元の状態がどうであったかを取得して、返り値として返します。

AppleScript名:Mailで有効なmailアカウントの新規メール取得を停止して元の設定状態を返す
set origList to stopEveryMailReadSchedule()
–> {true, true, true, true}

on stopEveryMailReadSchedule()
  set aList to {}
  
  
tell application id “com.apple.mail”
    set acList to every account whose enabled is true –有効な(enabled=trueな)Mailアカウントだけを取得
    
    
repeat with i in acList
      set j to contents of i
      
set the end of aList to include when getting new mail of j
      
set include when getting new mail of j to false
    end repeat
    
    
return aList –元の設定状態を取得して返す
    
  end tell
end stopEveryMailReadSchedule

★Click Here to Open This Script 

2015/05/11 Mailで選択中のMessageの添付ファイルをデスクトップに保存

Mail.appで選択中のMessageの添付ファイルをデスクトップに保存するAppleScriptです。

添付ファイルの単独保存については、いろいろBad Know-Howなやり方が(Mail.appのplistを読んで保存場所を求めて、そこから探すとか)存在していましたが、昔使ったものを使おうとしたらOS X 10.10では動きませんでした。

そこで、Mail.appのAppleScript用語辞書を眺めていたところ、添付ファイル(mail attachment)がsaveコマンドに応答すると書いてあったので、半信半疑で書いてみたらあっけなく動きました、、、

mail_attachment.png

AppleScript用語辞書を読まずには(対象アプリケーションをコントロールする)AppleScriptは書けない、基礎的な話なので・・・用語辞書のチェックは必須です。

本Scirptは、定期的にメールボックスをチェックして、PDF添付の特定の送信元のメールの添付書類を別途保存し、PDFをファイル変換してファイルサーバーにアップロードするような、放置状態で動作するAppleScriptのアプリケーションロボットを作成するために書いたものです。

AppleScript名:Mailで選択中のMessageの添付ファイルをデスクトップに保存
–Desktop FolderへのPathを求める
set aDtPath to (path to desktop folder) as string

–選択中のメッセージを求める
tell application “Mail”
  set aSel to selection
end tell

–選択中メールでループ、各メールに添付ファイルがあればDesktopに保存
tell application “Mail”
  repeat with i in aSel
    set j to contents of i
    
set attS to mail attachment of j
    
    
–messageに対する添付書類(mail attachment)でループ(1通のメールに複数添付の場合に対応)
    
repeat with ii in attS
      set jj to contents of ii
      
      
set aName to name of jj
      
set savePath to aDtPath & aName
      
      
–指定パスに添付ファイルを保存
      
save jj in file savePath
      
    end repeat
    
  end repeat
end tell

★Click Here to Open This Script