Archive for 10月, 2009

2009/10/31 System Eventsでネットワーク環境情報を取得、変更

System Eventsでネットワーク環境情報を取得、変更するAppleScriptサンプルです。Mac OS X 10.6.1上で試してみたところ、取得はできるものの、設定しても実際のOSの処理に反映されません。

「システム環境設定」の「ネットワーク」にある「ネットワーク環境」。

sys10.jpg

AppleScriptから別の設定を指定すると、System Eventsは変更後の内容を返してくるが、システム側ではその変更を反映していない。

sys11.jpg

OSの出荷前にこういうチェックはしておいてほしいものです。それも、英語以外のすべての言語環境で(ーー;;

スクリプト名:System Eventsでネットワーク環境情報を取得、変更
tell application “System Events”
  tell network preferences
    get properties
    
–> {class:network preferences object, current location:location id “2CFD0ED5-26EE-4D0C-ACCB-3AB73B03E3BC” of network preferences}
    
get the name of every location
    
–> {”会社”, “自動”, “実家–NTTフレッツスクウェア”}
    
set current location to location “自動”
    
name of current location
    
–> “自動”
  end tell
end tell

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

2009/10/31 System EventsでDockの設定を取得、変更する

System Eventsで各種システム環境設定の内容を確認したり変更したりするサンプルの一環として作ってみました。System EventsでDockの設定を取得、変更するというものです。

AppleScript用語辞書に「r/o」(read only)と書かれているからといって、本当にリードオンリーかどうかはやってみないと分かりませんし、設定できると書かれていてもread onlyだった……という話は珍しくありません。

とりあえず、実際に動作を確認しておくことが重要です。それを自分一人でやっているほどの時間はないので、海外のScripterとの日常的な情報交換というのが、ものすごく重要になってくるわけです。

スクリプト名:System EventsでDockの設定を取得、変更する
tell application "System Events"
  tell dock preferences
    properties
    
–> {minimize effect:scale, magnification size:1.0, dock size:0.0, autohide:false, animate:true, magnification:true, screen edge:right, class:dock preferences object}
    
    
set a1 to animate
    
–> true
    
set animate to false
    
    
set a2 to autohide
    
–> false
    
set autohide to false
    
    
set a3 to dock size
    
–> 0.0
    
set dock size to 0.0
    
    
set a4 to magnification
    
–> true
    
set magnification to true
    
    
set a5 to minimize effect
    
–> scale
    
set minimize effect to scale
    
    
set a6 to screen edge
    
–> right
    
set screen edge to right
    
  end tell
end tell

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

2009/10/30 System Eventsでハイライト色の情報にアクセス

System Eventsでシステム環境設定の内容にアクセスするサンプル。テキストを選択したときの強調表示色を指定するものです。

sys2.jpg

カラーピッカーで色を指定すると……

sys3.jpg

テキスト選択時のハイライト色が変更されます。

sys4.jpg

システム環境設定の内容も同様に変更されていることが確認できます。

スクリプト名:System Eventsでハイライト色の情報にアクセス
set aCol to choose color

tell application "System Events"
  set ap1 to a reference to appearance preferences
  
tell ap1
    set highlight color to aCol
  end tell
end tell

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

2009/10/30 System Eventsでfont smoothing関連の情報にアクセスする

System Events経由でシステム環境設定>アピアランスのフォントスムージング関連の情報にアクセスするAppleScriptサンプルです。

sys1.jpg

ただ、font smoothing関連は、設定はできるものの内容を取得しようとすると、ちゃんとした結果が返ってこないようで……font smoothing styleの情報を取得すると、ごらんのとおりです。

スクリプト名:System Eventsでfont smoothing関連の情報にアクセスする
tell application "System Events"
  set ap1 to a reference to appearance preferences
  
tell ap1
    set fRes to font smoothing
    
–> true or false
    
    
set font smoothing to true –falseにしてもスムージング処理がオフになるわけではない?
    
    
set fRes1 to font smoothing limit
    
–> 6
    
    
–情報を取得すると結果がおかしい
    
set fRes2 to (font smoothing style)
    
–> «constant ****ˇˇˇˇ»
    
    
–set font smoothing style to automatic–automaticだけエラーになる
    
set font smoothing style to light
    
set font smoothing style to medium
    
set font smoothing style to standard
    
set font smoothing style to strong
  end tell
end tell

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

2009/10/30 System Eventsでappearance情報を取得、変更する

Mac OS X 10.5になって、システム環境設定の設定内容をSystem Events経由で取得したり変更したりできるようになりました。それを実際に行うサンプルです。

ただ、探し回ってみてなかなか実例が見当たらず、首をひねっていたところ……取得はできるものの、設定変更については一筋縄では行かないことが分かりました。

しかも、階層化されたオブジェクトの中のプロパティの情報を書き換えるなんて、まっとうな方法でアプローチしているだけでは到達できようはずがありません。

そこで、「a reference to」でオブジェクト階層の奥にあるプロパティまで一気に参照して、値を書き換えるという大技を繰り出すことに。

これは、本当にAppleの開発者も動作確認を行っているのでしょうか? appearanceの変更などを行うと、えらく待たされたり切り替わらなかったりするのですが……

スクリプト名:System Eventsでappearance情報を取得、変更する
tell application “System Events”
  set aP to properties
  
set appP to appearance preferences of aP
  
set aPprop to properties of appP
  
  
–appearance preferencesのプロパティすべてを取得
  
  
–> {font smoothing style:«constant ****ˇˇˇˇ», font smoothing limit:6, recent servers limit:50, class:appearance preferences object, recent documents limit:50, recent applications limit:50, smooth scrolling:true, scroll arrow placement:together, highlight color:{46516, 54741, 65535}, font smoothing:true, scroll bar action:jump to next page, double click minimizes:true, appearance:blue}
  
  
–どうやっても情報にアクセスできなかったので、a reference toでアクセスしてみた
  
set ap2 to a reference to appearance preferences
  
tell ap2
    –情報の取得
    
set aRes to appearance
    
–> graphite もしくは blueが返る
    
    
–情報の変更
    
set appearance to blue –ブルー
    
set appearance to graphite –グラファイト
    
  end tell
end tell

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

2009/10/30 全角文字から半角文字への置換

いろんなやり方でみなさんが作って使っている全角英数字&記号の半角文字化サブルーチン。たまたま、手元にサブルーチンのストックがなかったので、スクラッチから作ってしまいました。こういうのは決定打的なものが1つあれば、それでいいような気がするのですが……。

CPUパワーにものを言わせて、ループでゴリゴリ処理しています。PerlやRubyを併用すると、もっと短い処理になると思われます。または、何かのテキストエディタの機能を借りてくるとか……。

追記:以前はこのような処理に飯森さんの「Transliterate OSAX」を使っていたのですが、Universal Binary版は存在していないようなので、Mac OS X 10.6用に慌てて本ルーチンを作ったような……今後はOSAXに依存しないで処理できるように、このようなやっつけサブルーチンではなく、ちゃんとしたものを用意しておくべきでしょう。

スクリプト名:全角文字から半角文字への置換
set a to zen2han(”piyomaru_ software+001”) of me
–> “piyomaru_ software+001″

set b to “piyomaru_software”
set bb to zen2han(b) of me
–> “piyomaru_software”

–全角文字から半角文字への置換
on zen2han(aText)
  –全角文字のリスト
  
set zList to {”A”, “B”, “C”, “D”, “E”, “F”, “G”, “H”, “I”, “J”, “K”, “L”, “M”, “N”, “O”, “P”, “Q”, “R”, “S”, “T”, “U”, “V”, “W”, “X”, “Y”, “Z”, “a”, “b”, “c”, “d”, “e”, “f”, “g”, “h”, “i”, “j”, “k”, “l”, “m”, “n”, “o”, “p”, “q”, “r”, “s”, “t”, “u”, “v”, “w”, “x”, “y”, “z”, “.”, “_”, “−”, “+”, “0”, “1”, “2”, “3”, “4”, “5”, “6”, “7”, “8”, “9”, “ ”}
  
set zStr to zList as string
  
–半角文字のリスト
  
set hList to {”A”, “B”, “C”, “D”, “E”, “F”, “G”, “H”, “I”, “J”, “K”, “L”, “M”, “N”, “O”, “P”, “Q”, “R”, “S”, “T”, “U”, “V”, “W”, “X”, “Y”, “Z”, “a”, “b”, “c”, “d”, “e”, “f”, “g”, “h”, “i”, “j”, “k”, “l”, “m”, “n”, “o”, “p”, “q”, “r”, “s”, “t”, “u”, “v”, “w”, “x”, “y”, “z”, “.”, “_”, “-”, “+”, “0″, “1″, “2″, “3″, “4″, “5″, “6″, “7″, “8″, “9″, ” “}
  
set hStr to hList as string
  
  
–1文字ごとに分解したリストにする
  
set cList to characters of aText
  
  
set newList to {}
  
  
–文字列比較で大文字小文字を考慮して処理  
  
considering case
    repeat with i in cList
      set j to contents of i
      
if j is not in hList then
        if j is in zList then
          –全角文字への対処
          
set zP1 to offset of j in zStr
          
set zRes to contents of item zP1 of hList
        else
          –上記のどちらでもない場合(全角漢字、ひらがな、かたかな、記号文字、半角カタカナなど
          
return false
        end if
      else
        –半角文字の場合
        
set zRes to j
      end if
      
      
set the end of newList to zRes
      
    end repeat
  end considering
  
  
return newList as string
end zen2han

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

2009/10/28 最前面のアプリケーションのAppleScript用語辞書をオープンする

最前面のアプリケーションのAppleScript用語辞書をオープンするAppleScriptです。

日常的に、「起動中のアプリケーションのAppleScript用語辞書をオープンする」という作業が多いので、これを手っ取り早く行うためのScriptを作成しました。

Script Menuに本Scriptを登録しておいて、呼び出すと……

as1.jpg

このように、最前面のアプリケーションのAppleScript用語辞書がオープンします(個別のアプリケーション用のScriptフォルダではなく、共通でMenuに表示されるフォルダ=「コンピュータ・スクリプト・フォルダ」(/Library/Scripts/)に入れておく必要があります)。Script Menuに入れる際に先頭にハイフン(「–」)を入れているのは、メニューの上の方に表示させるための小細工です。

as2.jpg

AppleScriptエディタ/スクリプトエディタへのtellブロックをアプリケーション名称ではなくIDで指定しているのは、OSのバージョンが10.5→10.6と変わったときに書き換えなくてもすむようにするためです。

実際には、10.5→10.6に移行したときに書き換える必要はなく、「スクリプトエディタはどこにあるか?」とOS側が聞いてくるので、AppleScript Editorを選択すればOS内でひもづけが行われます。ただ、本Blogに掲載しているようなリンクであるとか、テキストの状態になっているAppleScriptをコンパイル(構文確認)する場合には、アプリケーション名の書き換えが必要になってしまいます。そういうケースに備えてIDで指定した次第です。

スクリプト名:最前面のアプリケーションのAppleScript用語辞書をオープンする
tell application “System Events”
  set pList to name of every process whose visible is true and frontmost is true
end tell

set aRes to first item of pList

tell application “System Events”
  set aP to file of process aRes
end tell

try
  tell application id “com.apple.ScriptEditor2″
    open aP
  end tell
on error aMes
  display dialogアプリケーション「” & aRes & “」のAppleScript用語辞書のオープンを試みましたが、以下の理由により失敗しました:” & return & aMes
end try

tell application id “com.apple.ScriptEditor2″
  activate
end tell

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

2009/10/28 Keynoteに画像を一括で登録する

Keynote 5.0.3で、指定フォルダ内の画像を取得してKeynoteのスライド上に1ページあたり1点の画像を中央に配置。すべての画像をKeynote上に連続配置するAppleScriptです。

key1.jpg

key2.jpg

フォルダ内の画像については、リストで指定した順序がそのまま反映されるので、Keynoteに渡す前にソートするとか、元のファイル名に細工をするといったことは必要になるかもしれません(Mac OS X 10.5上でスクリーンキャプチャしたファイルは、「ピクチャ 1」といった名前になるため、1桁の数字のファイルは「ピクチャ 01」などにリネームしておくとか)。

Keynoteに画像ファイルのパスを渡す際に、POSIX path以外では通らないようです。また、quoted form ofでクオート処理を行うと配置してくれませんでした。

さらに、この処理自体が不安定なようなので……もし一度AppleScriptから実行してうまくいかなかったときには、Keynoteを一度終了させてから再度起動して、リトライしてみてください。

なんにせよ、画像点数が多い場合にはひじょーーに便利です。

スクリプト名:Keynoteに画像を一括で登録する
–画像が入っているフォルダを選択
set a to choose folder

–指定フォルダ中のファイル(たぶん画像)を一括でaliasとして取得
tell application “Finder”
  tell folder a
    set fList to every file as alias list
  end tell
end tell

–Keynoteが各ファイルのパスをtextで要求しているので、aliasからtextにcastする
set fnList to {}
repeat with i in fList
  set the end of fnList to (POSIX path of (contents of i))
end repeat

–Keynoteに1ページに1枚の画像を配置したスライドを一括作成する
tell application “Keynote”
  tell slideshow 1
    make image slides paths fnList
  end tell
end tell

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

2009/10/27 画面共有で指定マシンに指定アカウントの画面をオープン

Mac OS X 10.5移行で導入されたリモート操作アプリケーション「画面共有」は、複数台のMacを使っている環境では必須の機能です。

ユーザー名、パスワード、IPアドレスもしくはRendezvous名でマシンを指定して「画面共有」をオープンするAppleScriptです。

vnc2.jpg

スクリプト名:画面共有で指定マシンに指定アカウントの画面をオープン
set aUserName to “maro” –ユーザー名
set aPassword to “password” –パスワード
set aMachineIP to “Macmini1-2.local” –マシンのIPアドレスもしくはRendezvous名称–”10.0.1.13″

set aLoc to “vnc://” & aUserName & “:” & aPassword & “@” & aMachineIP
open location aLoc

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

2009/10/26 Cyberduck 3.3b4がAppleScriptに非対応

Mac OS X用のFTP/SFTPクライアント「Cyberduck」はAppleScriptに対応しており、あらかじめブックマークに登録しておいた接続先をオープンしたり、任意の接続先をオープンしたりして、ファイルのアップロード/ダウンロードができます。

リリース版をダウンロードすると、一緒にサンプルのAppleScriptが添付されているため、すぐにScriptingを開始できるという親切設計。

ただし、Snow Lepard対応の3.3b4はScriptableにするための機能実装が間に合っていないためか、AppleScriptから制御できません。

Snow Leopard上でSFTPのサーバーに対してファイルのアップロード/ダウンロードを行うソリューションを実現するためには、もう少し時間が必要なようです。もちろん、それ以前のOSであれば(10.4/10.5)とくに問題はありません。バージョン3.2.1をインストールすることで、すぐにSFTPへの自動アップロード/ダウンロードをAppleScriptから実行できます。

2009/10/26 Google Chrome BetaがAppleScriptに対応〜指定URLをオープン

放っておくと勝手に機能がバージョンアップするらしい(?)Google Chrome。

chrome1.jpg

気付いたら、バージョンが上がっていました。そして、このv4.0.223.11では基礎的なAppleScriptの用語辞書が実装され、本Blogで各記事に仕込んでいるようなカスタムURLのクリックも認識するようになりました(初回のみ「ローカルのアプリケーションにリンクを転送するがよいか?」といった確認を求められます。記憶しているかぎりでは、FireFoxと同じ動作です。ちなみに、Mac OS X上のSafariではこのように聞かれることはありません)。

WebブラウザのAppleScript対応機能として期待するものは、

(1)指定URLをオープンする
(2)オープン中のWindow/タブの状態、とくにTitleやURLなどを取得。あるいは個別にクローズしたり生成する。
(3)Webブラウザ上で選択中のテキストを取得する
(4)指定Windowの内容を印刷、もしくはPDFに書き出す
(5)DOM経由で表示中のコンテンツ内容にアクセスする。フォームへの入力を行ったり、Submitボタンを押す
(6)ウィンドウの内容を指定のプリンタに印刷する

といったところ(Safariがこのレベル)。ただし、これから先のことを考えると……

(7)FlashやAJAXのコンテンツへのアクセス(操作)

といった機能も必要になってくることでしょう(このあたりは、Appleの開発チームに方針を質したいところ)。

とりあえず、Google Chromeが「Mac OS X用のWebブラウザとして備えるべき、必要にして最低限のAppleScript用語辞書」を装備したことを確認した次第です。

一応、指定URLをオープンしていますが……Google Chromeの辞書にはOpen URLといった命令が存在していなかったので、open locationの実行アプリケーションをGoogle Chromeに指定して擬似的にURLのオープンを行わせてみたのが下記サンプルです。

ただし、オープン中のWindowのURLやTitleを直接調べるためのオブジェクトはAppleScript用語辞書中で定義されていません(GUI Scripting経由で強引にアクセスすれば取得できます)。

これから先、機能アップにともない命令数が増える可能性があるため、この先もこの記法が正しいという保証はありません。

スクリプト名:Google Chromeで指定URLをオープン
tell application “Google Chrome”
  open location “http://piyo.piyocast.com”
end tell

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

2009/10/19 Dockに登録されている情報を取得する Snow Leopard

Dockに登録されている項目をGUI Scripting経由で取得するAppleScriptのSnow Leopard対応版です。

どういうことをやって確認したかといえば、PreFab SoftwarePreFab UI Browserを起動し、監視対象のアプリケーションとして「Dock」を選択して、値を確認し直しただけです。

しかし、属性値がどんどんローカライズされていくのは、方針として正しいのか間違っているのか……書きやすさという意味ではローカライズされていた方がいいでしょうけれど、結局PreFab UI Browserがないと手も足も出ません。

最終的には、AppleはPreFab UI Browserなしで記述できるレベルに記述環境を整備したいのかもしれませんが、OSのメジャーアップデート時にしかアップデートされないので、いまひとつピンと来ません。

uib1.jpg

uib2.jpg

スクリプト名:Dockに登録されている情報を取得する Snow Leopard
set dockRes to retDockPrefs() of me
–> {apps:{”Finder”, “ML Ranking”, “アクティビティモニタ“, “辞書“, “DragThing”, “グラブ“, “Okaeri”, “Mail”, “Safari”, “Diary++X”, “MacJournal”, “AppleScript エディタ“, “UI Browser”}, docs:{}, wins:{”[mixi]”, “Diary++X - 20091019日月曜日“, “Podcasting”}}

–Dockに登録されている情報を取得する
on retDockPrefs()
  tell application “System Events”
    tell application process “Dock”
      tell list 1
        アプリケーション
        
set apList to title of every UI element whose description is equal toアプリケーション Dock 項目
        
登録された書類
        
set docList to title of every UI element whose description is equal to書類 Dock 項目
        
最小化されたウィンドウ
        
set winList to title of every UI element whose description is equal toしまわれたウインドウ Dock 項目
      end tell
    end tell
  end tell
  
return {apps:apList, docs:docList, wins:winList}
end retDockPrefs

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

2009/10/19 whoseによるフィルタ参照

どのOSのバージョンでも有効な話(Classic Mac OSでも有効)です。AppleScriptにはアプリケーションとの通信量を減らすための仕組みとして、条件に合致するオブジェクトだけ返すように記述できます。

一番身近な例をあげると、Finderに対して指定フォルダ内の指定文字列でファイル名が終わるファイルの一覧を返して欲しい場合にこんな風に書いたりします。これがフィルタ参照です。

たとえば、DragThingに対して「起動回数が500回以上のslotを返せ」とか、InDesignに対して「指定のScript Labelがついているテキストボックスを返せ」といった指定を行ったりします。

AppleScriptで処理速度を大幅に向上させたり、とにかく楽をしたい場合に必須の記述方法です。アプリケーションから取得するオブジェクトの数が減れば、アプリケーションとの間の通信量が減るわけで……ひいてはAppleScriptプログラムの処理速度の大幅な向上が見込めることになります。

ただし、どのケースでも使えるというわけではなく、フィルタ参照に対応していないアプリケーションに対しては使えません(このへん、実際に試してみないと対応しているかどうか分らない)。また、フィルタ参照でどの属性値を条件に使えるか、これまた実際にやってみないと分りません。アプリ側の対応が一様ではない、というあたりにAppleScriptの習得の難しさの一因がありそうですが、それはあくまでも言語処理系の問題ではなくアプリケーション側の問題です(このへん、肝心のAppleのアプリケーションの対応度がまちまちなので混乱に拍車がかかっている)。

また、リスト変数に対して絞り込みをふつーにできたら楽かとは思いますが、あくまでアプリケーションとの通信時に指定するものです。もし、リスト型変数に対してフィルタ参照で絞り込みを行いたい、といった場合にはDatabase Eventsをコントロールしてデータベースを作成し、そこで絞り込みを行ったりするとそれらしい処理ができます。ただ、Database Eventsをコントロールしてデータベースを作成して、フィールドのスキーマを定義して、データをインポートするといった……ものすごく地道な処理が必要になります。

リスト型変数にいつでもフィルタ参照でアクセスできたり、正規表現でいっせいにデータ加工をする機能が標準でついていたら、かなり便利だろうとは考えます。

スクリプト名:Finderで使うフィルタ参照
set aFol to choose folder

tell application “Finder”
  tell folder aFol
    set fList to every file whose name ends with “.jpg”
  end tell
end tell

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

2009/10/08 iPhotoで選択中の写真の撮影日付を変更する

iPhoto上で選択中の写真の撮影日時を任意の日付に変更するAppleScriptです。

iphoto1.jpg

選択中の写真に対して日付を変更するだけのものですが、割と実用的です。他人からもらったデジカメの写真の日付が狂っていて、もらったはいいが並びがたいへん気になるとか、そういう方はこのAppleScriptに手を加えて、正しい日付に直してみるとスッキリするのではないでしょうか。

スクリプト名:iPhotoで選択中の写真の撮影日付を変更する
set aDate to “2008/1/5″
set aDate to date aDate

tell application “iPhoto”
  set aList to selection
  
repeat with i in aList
    set aa to contents of i
    
set date of aa to aDate
  end repeat
end tell

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

2009/10/04 LateNight SoftwareのMark Alldrittが自社製OSAXの64ビット非対応について言及

AppleScriptなどscriptに特化したソフトウェア・デベロッパーであるカナダのLateNight SoftwareのMark Alldrittが、自身のBlog上で彼のOSAX(Scripting Additions)について、いまのところ32ビットにのみ対応しており、Snow Leopard上で使用するための対処方法についてBlogで表明しています

該当するOSAXはXML ToolsXSLT ToolsProperty List ToolsList & record Toolsの4つ。

これらを使用する際にはAppleScriptエディタを32ビットで起動し、これらのOSAXを利用するアプレットに関しても32ビットで動作させるよう、Finder上で指定してほしいとのこと。

これらは32ビットでしか動作しないCarbonを使用して作られており、64ビット対応はそのままでは難しく、

「64ビット対応バージョンを作らないとは言いたくないが、現段階ではどのように作業を進めるかについては明言できない」

と、64ビット対応への見通しが立っていないことを明らかにしています。

これまでにも、「Classic Mac OS→Mac OS X」、「Universal Binary対応」などの端境期に脱落するOSAXが出てきており、OSAXの64ビットネイティブ対応度が進むかどうかは、CocoaベースのOSAXのサンプルコードの提供などApple側のデベロッパーへのサポート次第、といったところでしょうか。

なお、本Blog上では極力OASXに依存しないAppleScriptコードを掲載しており、本件に関する影響はまったくありません。

2009/10/04 Photoshop Elements v8の発表にともない、既存コンテンツをv6用として区別

AdobeのPhotoshop Elements v8の発表にともない、本ライブラリ上のPhotoshop Elements用のコンテンツをPhotoshop Elements v6用としてカテゴリ分けを変更しました。ただし、ディレクトリ名に変更はないので、リンクが切れることはありません。

従来のPhotoshop Elements v6がPhotoshop CS3相当のAppleScript用語辞書を搭載していたので、このPhotoshop Elements v8はPhotoshop CS4相当のAppleScript用語辞書を搭載しているものと推測されます。

2009/10/04 テキストによるプログレスインジケータ作成 v2

指定の数値(最大値、現在の値)および、文字列(非アクティブ、アクティブ)を指定して、テキストによる疑似プログレスインジケータ文字列を返すAppleScriptのちょっとだけ改良したバージョンです。

Growlに進捗状況を表示するため、テキストで擬似的にプログレスバーを表示するというのはなかなかいいアイデアだったのですが、Growlが文字表示を行う際に、テキストを折り返してくれないので、プログレスバーがはみ出してしまいました(汗)。

そこで、プログレスバーの長さを10文字に限定するよう、ちょっとだけ改良してみました。本来なら、文字数は可変にしておくべきですが……そこまでこのルーチンが重要でもなかったので、割といいかげんです。

prog3.jpg

スクリプト名:テキストによるプログレスインジケータ作成 v2
set aList to {50, 24} –max-num, cur-num
set
cList to {”.”, “o”}
set
aRes to retProgressChar(aList, cList) of me
–> “ooooo…..”

on retProgressChar(aList, cList)
  set barCharLen to 10
  
  set
allNum to item 1 of aList
  set
doneNum to item 2 of aList
  if
doneNum > allNum then return “”
  
  set
oneStep to 100 / allNum
  set
curStep to doneNum * oneStep
  
  set
stringBar to (curStep / barCharLen)
  set
stringBar2 to round stringBar rounding as taught in school
  
  
–未処理アイテム数
  set
notYet to barCharLen - stringBar2
  
  set
notYetChar to contents of item 1 of cList
  set
doneChar to contents of item 2 of cList
  
  set
notYetText to makeCharRep(notYet, notYetChar) of me
  set
doneText to makeCharRep(stringBar2, doneChar) of me
  
  set
aText to doneText & notYetText
  return
aText
  
end retProgressChar

–指定文字を指定回数連結したテキストを返す
on
makeCharRep(aNum, aChar)
  set aText to “”
  repeat
aNum times
    set aText to aText & aChar
  end repeat
  return
aText
end makeCharRep

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

2009/10/02 テキストによるプログレスインジケータ作成

指定の数値(最大値、現在の値)および、文字列(非アクティブ、アクティブ)を指定して、テキストによる疑似プログレスインジケータ文字列を返すAppleScriptです。

progre1.jpg

Mail.appで全MLに対して同一内容のメールフォルダを作成するAppleScriptを作ったときに、進捗状況をGrowlで表示するようにしていたのですが、その時に「どのぐらい終わっているのか分るとよさそうだ」と考え、テキストで疑似プログレス・インジケータを表示することにしました。

そのために作成したのが本ルーチンです。

現在の仕様では、最大値が100であれば100個文字を並べることになっていますが、計算して10個とか20個の文字列で表現したほうが実用性が高いかもしれません。

スクリプト名:テキストによるプログレスインジケータ作成
set aList to {50, 12} –all-num, done-num
set
cList to {"-", "#"}
set
aRes to retProgressChar(aList, cList) of me
–> "############————————————–"

on retProgressChar(aList, cList)
  set allNum to item 1 of aList
  set
doneNum to item 2 of aList
  if
doneNum > allNum then return ""
  
  
–未処理アイテム数
  set
notYet to allNum - doneNum
  
  set
notYetChar to contents of item 1 of cList
  set
doneChar to contents of item 2 of cList
  
  set
notYetText to makeCharRep(notYet, notYetChar) of me
  set
doneText to makeCharRep(doneNum, doneChar) of me
  
  set
aText to doneText & notYetText
  return
aText
  
end retProgressChar

–指定文字を指定回数連結したテキストを返す
on
makeCharRep(aNum, aChar)
  set aText to ""
  repeat
aNum times
    set aText to aText & aChar
  end repeat
  return
aText
end makeCharRep

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

2009/10/01 PCalcで計算

作者のJames Thomsonにメールを書いたら、すぐに返事が来て(汗) AppleScriptからPCalcをコントロールして計算させるやり方を教えてもらいました。

逆ポーランド記法っぽい(そのものではありませんが)指定の仕方で、計算できるようです。

cal3.jpg

計算コマンドについては、PCalcのヘルプに書いてあります(James談)。

calc2.jpg

レジスタ(x, y)や計算メモリ(m)とr1、r2……rF(無限?)までのストア用レジスタが使えるようで……なにやら、8bit CPUの頃のアセンブラを思い出させます。

ただ、Jamesもメールに書いていましたが「AppleScript自体で計算した方が早いよね」とのことで……PCalcをAppleScriptからコントロールするというのは、もはや「技術力の無駄遣い」とか「趣味」の世界なのでしょう。

スクリプト名:PCalcで計算
tell application “PCalc”
  activate
  tell
calculator 1
    set value of register “x” to 4.0
    set
value of register “y” to 5.0
    
execute code “mul x y”
    get
value of register “x”
  end tell
end tell

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

2009/10/01 Mail.appの指定メールボックス内に任意のメールボックスを新規作成 v2

Mail.appの指定メールボックス内に任意のメールボックスを新規作成するAppleScriptです。

Mail.appのメールボックス・フォルダは階層構造にすることができ、かなり自由にAppleScriptから制御できます。目下、各メーリングリストのメールはMail.appのルールで各フォルダに仕分けるようにしており……そのルール設定をAppleScriptから読み出して、US Appleの主催しているメーリングリストの各仕分けフォルダに、一括で「10.6,Snow Leopard」というフォルダを作成指示するAppleScriptを作りたいと思っていました(このScriptはすでに完成し、一括で全MLに同一名称のメールボックスを作成できるようになりました。いや、便利便利)。

まずはMail.appのメールボックス・オブジェクトからメールボックスのフルパスを取得するAppleScriptを作成し、その次の段階として本AppleScriptを作成した次第です。

スクリプト名:Mail.appの指定メールボックス内に任意のメールボックスを新規作成 v2
global aFullPath

set aFullPath to “”

set aNewFolName to “10.6,Snow Leopard”
tell
application “Mail”
  –mailboxオブジェクトを渡すのは、全メール振り分けルールからML用のもの(名称に「_ML」が入っている)
  
–を抽出して、それに対してすべて処理を行うことを考えているため。その際に入手できるのは
  
–該当するメールボックスのオブジェクト(のリスト)
  set
aMB to mailbox “ML/Apple US/ASに関係のあるもの/SyncService” –mailboxオブジェクトを作ってみた
end tell
makeAFolderIfNotExist(aNewFolName, aMB) of me


on
makeAFolderIfNotExist(aNewFolName, aFolder)
  –パラメータとして渡されたメールボックスオブジェクトからフルパスの階層を取得する
  
–make mailbox full-path text from Mail.app’s mailbox object
  set
aFullPath to “”
  
extraxctTextFullPathOfMBObject(aFolder) of me
  set
aNewFolFullPath to aFullPath & “/” & aNewFolName
  set
aFullPath to “”
  
  tell
application “Mail”
    –指定名称を「含む」フォルダが存在するかどうかチェック
    tell
aFolder
      set tmpFolList to name of every mailbox whose name contains aNewFolName
    end tell
    
    if
tmpFolList is equal to {} then
      try
        make new mailbox at beginning with properties {name:aNewFolFullPath}
      on error erM
        display dialog erM & return & “Error in making new mail folder by name: ” & aNewFolName
      end try
    end if
  end tell
end makeAFolderIfNotExist

–Mail.appのメールボックスオブジェクトを渡すと、テキストのフルパスに変換
on
extraxctTextFullPathOfMBObject(aPath)
  tell application “Mail”
    try
      set parentPath to container of aPath
    on error
      return
    end try
    
    set
meName to name of aPath
    if
aFullPath = “” then –1回目のみスラッシュを入れないで処理
      set aFullPath to meName
    else
      –通常処理はこちら
      set
aFullPath to meName & “/” & aFullPath
    end if
    
    
extraxctTextFullPathOfMBObject(parentPath) of me –再帰呼び出し
  end tell
end extraxctTextFullPathOfMBObject

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

2009/10/01 PCalcで計算機を10個追加する

アプリケーションランチャー「DragThing」であまりに有名なJames Thomsonの電卓アプリケーション「PCalc」はAppleScriptに対応しています。知る限り、AppleScript対応の電卓はこれだけです(Classic Mac OS時代にはいくつかありましたが……)。

真面目にPCalc用のAppleScriptを書いたことはなかったのですが、いざ書き始めてみてビックリ! 計算させることができません(ーー;;;;

計算ログ(Tape)表示ドロワーのオープン/クローズといったことはできたし、さまざまなプロパティにアクセスすることはできたのですが、肝心の計算ができないとは……(Jamesにメールを書いて、「本当にこういう仕様なのか?」と聞いてしまいました)。

→ Jamesから直接やり方を教えてもらいました

cal1.jpg

できないできない、だけでは話にならないので、とりあえずインパクトがありそうな「新規電卓ウィンドウを10個作る」AppleScriptを書いてみました。インパクトはありますが……意味はありません。

昔は、DragThingがAppleScriptに対応していることに意義を見いだせませんでしたが、Mac OS Xの時代になって「起動ランキング表示」とか「登録アイテムのキーワード検索」といったAppleScriptが書けて、かつ実用性があることが分りました。

PCalcのAppleScript対応機能の可能性を追求していくと、思いも寄らなかったような新たな利用方法が見つかったりするのかもしれません。

……そんなアクロバティックなことをしなくても、シェルのbcコマンドで計算すればいいんじゃないか、という指摘はあるわけですが(汗) まあ、それはそれ。

スクリプト名:PCalcで計算機を10個追加する
tell application “PCalc”
  repeat 10 times
    make new calculator
  end repeat
end tell

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