Menu

Skip to content
AppleScriptの穴
  • Home
  • Products
  • Books
  • Docs
  • Events
  • Forum
  • About This Blog
  • License
  • 仕事依頼

AppleScriptの穴

Useful & Practical AppleScript archive. Click '★Click Here to Open This Script' Link to download each AppleScript

タグ: Script Debugger

Script Debuggerの開発と販売が2025年に終了

Posted on 1月 2 by Takaaki Naganoya

正月早々になかなか大きなニュースが入ってきました。AppleScriptの統合開発環境であるScript Debuggerの開発と販売の終了をLate Night Softwareが発表しました。

Script Debuggerはまだ2025年の6月まで購入可能とのことです。Appleが買収するしか継続の目がなさそうなのですが、Appleがそうするかどうかは不明です。

Script DebuggerはAppleScriptの統合開発環境ですが、上級者にはあまり役立たず、むしろ入門者が使うと役立つツールであることが問題だと思っていました。そのあたりの対処として、ライトユーザーへの訴求を行うべく価格の引き下げやLightモード動作(試用版の継続使用が可能に)が導入されたようですが、有効な手段にはなり得なかったようです。

ソフトウェア製品としてのScript Debuggerは、コア部分がC++で書かれているようで(推測)、思い切った構造の変更やインタフェースの改良を行いづらいところです。

実際に、30年続いたプロジェクトでもあり、大幅な書き換えは難しかったところでしょう。

まだ、どのように受け取るべきかが分からないため、速報ということで。

ただ、macOS 10.13あたりまでのスクリプトエディタ(10.15あたりまで?)では、バンドル内にDebugアイコンとか未使用のアイコンがたくさんあって、

「Apple純正のスクリプトエディタでデバッグ機能をつけていないのは、製品版(Script Debugger)に配慮した結果ですよ」

みたいな言い訳の痕跡(こんせき)を垣間見ることができ、それなりに担当者レベルでは敬意を払われてきた製品だと思います。

Posted in news | Tagged Script Debugger | Leave a comment

Script DebuggerがmacOS 15.x上で起動せず→起動

Posted on 9月 18, 2024 by Takaaki Naganoya

Script DebuggerがmacOS 15上で起動しない状況が続いています。

日本語ユーザー環境、英語ユーザー環境にかかわらずmacOS 15/macOS 15.1上でScript Debuggerが起動しません。

ちなみに、macOS 14.7ではユーザーディレクトリ下のFrameworkを実行できない問題も発生しており、macOS 14/15を信用せずにメイン環境をmacOS 13.7のままにとどめていますが、この判断が大正解のようです。

続報:
rm ~/Library/Preferences/.2xbG4@@Ght01%!020#u

rm ~/Library/Preferences/.2xbZ4@@Ght01%!010#u

rm ~/Library/Application\ Support/.1@xX4D@yyt02"!2&0#a

rm ~/Library/Application\ Support/.1@xX4D@yytT2"!2&1#a

とすることで、macOS 15.x上でもScript Debuggerが起動できました。実際には、Terminal上でこれをそのまま実行しても削除できなかったので、当該フォルダに移動してTerminal上でファイルを確認したうえで削除しました。

SDが起動できないと、Framework呼び出しを行なっているAppleScriptの実行や書き出しに支障が出るため、実に困ります。

ただ、SDのアップデートやメンテナンスが数少ない開発者によって支えられている以上、代替策も用意しておきたいところです。

Posted in Bug | Tagged 13.0savvy 14.0savvy 15.0savvy Script Debugger | Leave a comment

Script Debugger v8.0.8 ホームディレクトリ以下のFrameworkを実行できない障害が発生

Posted on 9月 16, 2024 by Takaaki Naganoya

# 訂正:Script Debugger自体を再起動したら動くようになりました。何をやってもmissing valueしか返らなくなってビビりました。

ユーザーディレクトリ下のCocoa FrameworkをロードしてAppleScriptから実行可能なScript DebuggerおよびそのEnhancesd Applet。最新版のv8.0.8で、ホームディレクトリ下に配置したこれらCocoa Frameworkの実行ができないことを確認しています。

ちょっと凝ったAppleScriptでバンドル内にFrameworkを入れて呼び出しているものについては、目下実行できない状況にあります。自分が確認したのはmacOS 14.7環境。呼び出したはいいものの結果にmissing valueが返ってきて、首をひねっていたところ、原因がScript Debuggerにあることを確認。

自分でビルドした野良Cocoa Frameworkや、Bridge Plusの内蔵Frameworkまで、みんな呼び出せない状況です(日本語ユーザー環境)。

画像の余白トリミングから2D Arrayの高速ソーティングなど、Framework呼び出しは日常的なAppleScriptの実行に欠かせないものです。

Posted in Bug | Tagged 14.0savvy Script Debugger | 3 Comments

ScriptDebugger v8が正式リリースに

Posted on 5月 8, 2021 by Takaaki Naganoya

Late Night SoftwareからAppleScriptの統合開発環境、ScriptDebugger v8が正式リリースされました。日本語の表示、入力について問題ありません。そして、日本語で問題が出ないということから、同様のCJK(Chinese, Japanese, Korean)言語環境環境でも問題はないことでしょう。

■v8の対応環境

macOS 10.14.6、10.15.7、11.x
Intel Mac/M1 Mac(Apple Silicon Mac)

■v8の新機能

・Apple Silicon(M1 Mac)へのネイティブ対応
・Dark Mode対応

・macOS 11.x対応。Applet書き出し時にCodeSign Localを実行、notarizingを実行
・バージョン管理
・アプリケーション書き出し時の各種設定が「環境設定」ウィンドウに「Building」タブとして新設された

■v8の変更点

・Bundle IDの変更
SD7 Bundle ID: com.latenightsw.ScriptDebugger7
SD8 Bundle ID: com.latenightsw.ScriptDebugger8

・Enhanced Appletのランタイム・プログラム名の変更(要注意)
SD7:FancyDroplet
SD8:FancyDropletFat

ただし、SD8でもmacOS 10.14.x、10.15.x上でアプレット(Enhanced)書き出しを行ったさいには、ランタイム名は「FancyDroplet」になるとのこと。あくまで、macOS 11.x+SD8でアプレット(Enhanced)書き出しを行ったさいに「FancyDropletFat」になる。

・Bundle Script編集時の表示ルートディレクトリ
SD7:/Contents/Resources/
SD8:/Contents/

■v7→v8で変更されていない仕様

・20日の試用期間ののちLiteモードで動作。一部の機能が制限される
・「as anything」は「as any」と解釈される
・AppleScriptのメインスレッド実行機能なし(Script側でメインスレッド実行の記述を追加して対処。ここだけmacOS標準装備のスクリプトエディタの併用が欠かせない)

Posted in news | Tagged 10.14savvy 10.15savvy 11.0savvy Script Debugger | Leave a comment

Script Debugger v8 日本語対応中

Posted on 1月 14, 2021 by Takaaki Naganoya

Script Debuggerのv8のPublic Betaが出たので、早速試していますが……まだ日本語環境で作ったAppleScript書類の表示に問題を抱えています。

今回のv8ではApple Silliconへの対応のほか、待望のDark Mode対応なども行われ……普通にAppleScriptを表示するうえにScript Debugger側で設定したDark Themeで表示するなど表示情報が多層化されているようです。

そのために、Roman Language以外のCJK環境のフォント表示で問題を抱えているもよう。とはいっても、LateNight SoftwareはこのジャンルではMac界最強の開発チームであるため、対応は行われることでしょう。

それが今日明日のうちに実現されるかと言われれば、まだ時間が必要といった印象を受けています。

なお、さまざまな仕様の多くはSD7に準じているもようです。

「as anything」は「as any」と解釈されます。これは、macOS 10.13までは「as list or list of string」という謎の解釈を行なっていた(any型は内部的に存在していたが予約語がなかったもよう)ものが、macOS 10.14でスクリプトエディタ側は「as anything」と解釈し、Script Debugger側では「as any」と解釈するようになりました。

自分が「as anything」を発見した顛末は、

as anything

にまとめたとおりです。欠点もありますが、自分はこの「any型cast」は言語仕様上必要だと思います。スクリプトエディタとScript Debuggerでこの解釈が統一されていないのは問題であると考えます。

あるいは、スクリプトエディタやScript Debugger以外の「何か」があったほうがよいのかもしれません。Apple側は機能については追加する考えはないようですし(削るばっかり)、Script Debuggerも生産性の向上にはさほど寄与しません(ないと困る道具ではあるものの、あったからといってものすごく効率が上がるわけでもありません。クラッシュ回数多すぎです)。

生産性を維持するために自分がやっていることは、いままでに組んだScriptを部品化して再利用すること、部品を探しやすくすること、スニペット(断片的なプログラム記述入力)を充実させることです。Script Debuggerのスニペットで高度なことができるわけではない(Script Debugger側が想定している範囲を超えられない)ので、本当に必要な時以外はインテリジェントなスニペット(Piyomaru Script Assistant)で魔改造しまくってあるスクリプトエディタを使っています。

Script Debuggerが提供しているデバッグ機能は、ブレークポイントの設定やステップ実行、トレースなどのまっとうで高度な機能ですが、正直なところそれって「入門者レベルに有用」なものばかり(初心者にScript Debuggerは有用)。普通に書いているScripterがそれを必要としているかといえば、ちょっとニーズがズレてしまっていると感じます。数千行クラスの大規模なScriptのデバッグでステップ実行みたいな悠長なことはしませんよね? モジュール単位で再テストしやすくするための仕組みのほうが大事ですよね?

正直なところ、自分はスクリプトエディタにもScript Debuggerにも満足できていないので、第3の選択肢はあるべきだと考えます。

Posted in news | Tagged 10.14savvy 10.15savvy 11.0savvy Script Debugger | Leave a comment

AppleScriptを実行中のランタイムプログラム名を取得する

Posted on 1月 18, 2020 by Takaaki Naganoya

AppleScriptのランタイムプログラム名(ランタイム名)を取得するAppleScriptです。AppleScript自身が「何によって」実行されているか、その実行プログラム名を取得するものです。

AppleScriptには何種類かランタイム環境が存在し、ランタイム環境ごとに若干の動作が変わってくることが知られています。

ランタイム環境ごとにどこが違うといえば、Finderからのselectionを取得できるとかできないとか(AppleScript Studioがこれに該当。もうありませんけれども)、GUI Scriptingの権限の認証を得られるとか得られないとか。ウィンドウを動的に生成して表示したときに最前面に表示できるとかできないとか(Script Menuがこれに該当)。明示的にメインスレッドで実行する機能がないとか(Script Debuggerがこれに該当)。そういうところです(ほかにもあるかもしれない)。

過去に作ったAppleScriptを確認していたところ、プロセス名を取得するだけの使えないプログラムだと思っていたものが、実は「ランタイムプログラムのプログラム名」を取得できるというスゲーものであることを再発見しました。

ながらく、ランタイムプログラム名をAppleScript側から取得する必要性を感じていたため、この機会に調べてみることに。プログラム自体は些細な(↓)ものです。

AppleScript名:ランタイム環境名の表示
— Created 2015-09-08 by Takaaki Naganoya
— 2015 Piyomaru Software
use AppleScript version "2.4"
use scripting additions
use framework "Foundation"

set procInfo to current application’s NSProcessInfo’s processInfo()
set aName to procInfo’s processName() as string
display dialog aName

★Click Here to Open This Script 

Script Editor上で実行


–> “Script Editor”

Script Debugger上で実行


–> “Script Debugger”

ASObjC Explorer 4上で実行


–> “ASObjC Explorer 4”

Automator上で実行


–> “Automator”
これには驚きました。特別のランタイムプログラムが使われているのか、それとも単に親プロセスとしてのAutomatorが返ってきているのかは不明ですが、識別できるということには意義がありそうです。

Script Menu上で実行


–> “osascript”
これは、よく知られていることなのでとくに驚きはありません。テストを実施したのはmacOS 10.14.6上で、Script Menuは「スクリプトメニュー」という別アプリケーション(/System/Library/CoreServices/ にある)に変更になったOSバージョンですが、ランタイムにosascriptを使い続けていることを確認することになりました(それ以前のOSと挙動が同じなのでそうだと思っていましたけれども)。

Folder Action上で実行




–> “osascript”
Folder Actionは、macOS標準搭載のフォルダ監視機能です。監視対象のフォルダにファイルが追加されたり、移動されたり、フォルダそのものがオープンしたりするとその対象ファイル/フォルダで指定のAppleScriptを実行します。よく、ドラッグ&ドロップで処理を受け付けたり、ネットワーク経由でファイルを受信した場合にAppleScriptを実行するような使われ方をします。
Folder Action Disptcherが実行しているとばかり思っていたのですが、実際に確認したらosascriptでした。ちなみに、Folder ActionはmacOS 10.11でフルに書き換えられてそれ以前とは別物になっています。以前は数秒に一度対象フォルダをチェックする方式でしたが、10.11以降はFSEventsを利用して随時監視対象フォルダへの変更を受け付けます。

Switch Control上で実行



–> “osascript”
障害者向けの機能としてmacOSに標準装備されている、フローティングパレットからAppleScriptを呼び出せる機能である「Switch Control」。手を使わずに操作したり、他のコントローラで操作するような標準的ではない使い方をサポートするための機構ですが、普通に普通の人が使っても役立ちます。 
Switch ControlでAppleScriptを実行する場合のランタイムプログラムはosascriptです。

CotEditor上で実行


–> “osascript”
これは、CotEditorのソースを読んで確認してありました。ここだけ割と手抜き実装ですが、それでも複数のOSA言語に対応できたりと機能的には悪くはありません。むしろ、osascript側のランタイム環境が他の環境よりも一段落ちることに問題が、、、、GUI Scriptingの権限を取得できないこととか、このCotEditorのメニューから実行するとREST APIが呼び出せないとか。同じosascript系でもScript Menuのほうが制約が少ないのは、おそらくアプリケーション自体に許可されている条件の違いによるものでしょう。

FileMaker Pro上でスクリプトステップ「AppleScriptを実行」を実行


–> “FileMaker Pro”
FileMaker Proはランタイムアプリケーションが廃止され、FileMaker Pro AdvancedもFileMaker Proに一本化されたので、v19以降はFileMaker Proは「FileMaker Pro」というランタイムのみでしょう。v19でもFileMaker Pro自体はSandbox化されていないため、微妙にセキュリティ上の制約が少ない=自由度の高いランタイム環境として残っていくことでしょう。

Script EditorからApplet書き出しして実行


–> “applet”
取得できたらいいなぐらいの気持ちで試してみたものの、これが識別できるのはうれしい誤算です。書き出したAppleScript Applet名は「Appletでランタイム名を取得」であったため、この「applet」というものとは異なります(ねんのため)。

AutomatorからApplet書き出しして実行


–> “Application Stub”
見たことのない名前が、、、、やっぱり、これも別ランタイムなんですね、、、、

Script DebuggerからApplet(Enhanced)で書き出しして実行


–> “FancyDroplet”
Appleの標準ランタイムとはあきらかに別物(Enhanced)なので、たぶん別の名前がついているだろうとは思っていましたが、そういう名前でしたか。名前が予想外だったので驚かされましたが、識別できることに意義があります。

Cocoa-AppleScript Appletを実行


–> “CocoaApplet”
Script Editor上で作成できる、通常のAppleScriptとXcode上で作成するCocoa-Applicationの中間的な性格を持つ「Cocoa-AppleScript Applet」でランタイムプログラム名を取得したらこうなりました。

もちろん、実行プログラム名はまったく別の「ランタイム名を表示するだけのCocoa-AppleScript Applet」というものです。

ショートカットで「AppleScriptを実行」アクションを実行


–> “MacHelper”

macOS 12で搭載されたショートカット.app(Shortcuts.app)および不可視プロセスのAppleScriptの補助専用アプリケーション「Shortcuts Events.app」上で、アクション「AppleScriptを実行」でAppleScriptを実行するときのランタイム名は、「MacHelper」です。意外なところで、ユーザーディレクトリ以下にインストールされたAppleScriptライブラリをこのMacHelper環境は認識します。

→ macOS 13上では、ショートカット.app(Shortcuts.app)およびShortcuts Events.app上のランタイム名が「ShortcutsMacHelper」に変更されました。

RedSweater Software「FastScripts」からAppleScriptを実行

red sweater softwareによるメニュー常駐型Script Menuソフトウェア「FastScripts」から実行したときのランタイム名は「FascScripts Script Runner」です。

Knurling Group「Service Station」からAppleScriptを実行

Knurling Groupによるコンテクストメニューのカスタマイズ・ソフトウェア「Service Station」から実行したときのランタイム名は「osascript」です。

ランタイム名が得られることで実現できること

これらのほか、各アプリケーション内でAppleScript呼び出し機能を有するもの(ファイルメーカー、Mail.appなど)でランタイムプログラム名を取得すると有益な情報が得られることでしょう。

これは、地球上にいる人類が観測衛星を打ち上げて「ここは銀河系だ」と観測できるぐらいすごいことなので、割と意義深いものです。実行中のAppleScriptが、「いま、何のプログラムによって自分自身が実行されている」かという情報を取得できます。

ランタイムプログラムの名称取得については、いくつかのAppleScript実行方法を試してみましたが、得られる名前に違いがないことを確認しています。

直接AppleScriptを動かす方法に加え、間接的にAppleScriptを動かす方法も試してみましたが、同じ結果が得られました。

つまり、動的にOSAScriptViewを生成して実行しようが、NSAppleScriptで実行しようが、AppleScriptの「run script」コマンドで実行しようが、取得されるランタイム名には差がありません。

これで、ランタイム環境のプロセスの親プロセスの情報が取得できると、Terminal.app上から起動したosascriptコマンドで呼び出したのか、Script Menu上から呼び出したのかという状況をAppleScript側で認識できることになることでしょう。

ランタイム環境を識別した上で、各環境で実行できない処理を行わないとか、ランタイム環境ごとに処理を分岐できるようになることでしょう。

ちょうど、Edama2さんと「ランタイム環境ごとに若干の挙動の違いが見られるし、利用できるCocoaの機能にも違いがあるから、ランタイム環境ごとに認識コードでも振ってみようか」などと相談していたので、渡りに船でした。

Posted in OSA | Tagged 10.13savvy 10.14savvy 10.15savvy Automator CotEditor Script Debugger Script Editor | Leave a comment

Script Editor, Script Debuggerから選択範囲の情報を取得

Posted on 8月 19, 2019 by Takaaki Naganoya

スクリプトエディタ(Script Editor)およびScript Debuggerの最前面の書類から選択範囲の情報を取得するAppleScriptです。

スクリプトエディタとScript Debuggerで動く共通のツールをAppleScriptで作ってみたら、結果が異なりました。両エディタで同じ範囲を選択してみても、


▲Script Editor上で選択(左)、Script Debugger上で選択(右)

Script Editorでは、character range of selectionを実行すると、{文字開始位置, 文字終了位置}を返してきます。

一方、Script Debuggerでは、character range of selectionを実行すると、{文字開始位置, 選択文字長}を返してきます。

この違いにより、両エディタで異なる結果が得られたのでした。

選択中のテキスト(contents of selection)をそのまま取得して処理するのはよくあるパターンです。選択範囲を数値で取得するケースは(個人的に)あまりありませんでした。

これらのエディタ上で選択中のAppleScriptソースを取得して、そのままコンパイル(構文確認)して変数のみ抽出して変数名の一覧リストが欲しかったのですが、部分的にコンパイル(構文確認)しただけではエラーになる例が多い(ライブラリを呼び出している場合とか)ので、ファイル全体をコンパイル(構文確認)したのちに、エディタ上の選択範囲に該当するデータを抽出するように変更してみました。


▲選択範囲からAppleScript構文色分け情報をもとに変数のみ列挙して返すAppleScriptを実行。このために両エディタ対応を調べていた

AppleScript名:Ecript Editorの選択範囲情報を取得.scptd
—
–  Created by: Takaaki Naganoya
–  Created on: 2019/08/19
—
–  Copyright © 2019 Piyomaru Software, All Rights Reserved
—
tell application "Script Editor"
  tell front document
    set {cStart, cEnd} to character range of selection –{start pos, end pos}
    
return {cStart, cEnd}
    
–> {516, 1334}
  end tell
end tell

★Click Here to Open This Script 

AppleScript名:Script Debuggerの選択範囲情報を取得
—
–  Created by: Takaaki Naganoya
–  Created on: 2019/08/19
—
–  Copyright © 2019 Piyomaru Software, All Rights Reserved
—
tell application "Script Debugger"
  tell front document
    set {cStart, cNums} to character range of selection –{start pos, length}
    
return {cStart, cStart + cNums – 1}
    
–> {516, 1335}
  end tell
end tell

★Click Here to Open This Script 

Posted in list Text | Tagged 10.12savvy 10.13savvy 10.14savvy Script Debugger Script Editor | Leave a comment

Handle diff v2

Posted on 7月 3, 2019 by Takaaki Naganoya

Script Debugger上でオープン中の2つのAppleScript書類のうち、名称が同じハンドラ(サブルーチン)の内容同士を比較して、お互いに合っているかどうかをチェックするAppleScriptです。

アプリケーション書き出しして、Script Debuggerのスクリプトメニューに入れて実行します(AppleScript書類のままだと、Myriad Tables Lib内のフレームワークが呼べないため)。


▲本Scriptはスクリプトエディタの環境設定で行うAppleScriptの構文色分け設定色が「RGBカラー」でないとエラーになります。CMYKとかグレースケールカラーで指定して、そのままRGBに変換されずに保持される(CMYK色はアクセスしているうちにRGBに変換されるが、グレースケールは保持される)ため、色空間の判定を行ってRGB色に変換してから処理する必要があります(自分用メモ)

スクリプトエディタ上で設定する構文色分け設定をもとに、AppleScriptの構文要素を考慮したハンドラ一覧を作成し、2つのAppleScript書類の間に共通して存在するハンドラ名のハンドラ(サブルーチン)のAppleScriptソースを取得。インデント(tab)を削除したのちに比較を実行。

共通名称のハンドラすべてをチェックして、結果を表インタフェースで表示します。初版(v1)では実行するたびに1つのハンドラをチェックしていたのですが、あまりにかったるいので即座にループですべて調べてまとめて結果を表示するようにしました(v2)。

–> download executable archive (mainly for macOS 10.14 or later)

ただし、1つのAppleScript書類内にScript Object(JavaScriptでいうところのClosureみたいなもの)で論理分割された同名のハンドラが複数回登場するパターンは想定していません。複数検出するとエラーになります。

とくにScript Debuggerを対象にせずスクリプトエディタを対象にしてもよいのですが、些細な変更で実現できるため、興味のある方はやってみてください。あと、本Scriptは必要に迫られまくって作ったものなので、動作でおかしい箇所があったらぜひぜひご指摘を。

個人的には、ハンドラ名称を構文要素を考慮しつつ取得している一方で、ハンドラの内容は単なる文字列検索で取り出しているというあたりにアンバランスさを感じます。ただ、趣味のScriptではないので若干の手抜きを(^ー^;;

macOS 10.14.5上のスクリプトエディタで、構文色分け情報を何回設定しても「黒」になるという現象に遭遇したのですが、他のユーザー環境上での再現性については未知数であるため、まだレポートできない状況です。

→ その後、本ツールは強化されて、構文色分け設定にRGB以外の色が設定してあってもRGBに変換して処理する機能や、構文色分け設定を参照したコメント除去機能や、各種書式情報の取得を3倍高速化するカラーキャッシュなどの機能を実装したプログラムに(必要に迫られて)成長しました。

AppleScript名:Handle diff v2.scptd
—
–  Created by: Takaaki Naganoya
–  Created on: 2019/07/02
—
–  Copyright © 2019 Piyomaru Software, All Rights Reserved
—
use AppleScript version "2.5" — Sierra (10.12) or later (maybe 10.11 is OK but not confirmed)
use framework "Foundation"
use scripting additions
use framework "OSAKit"
use script "Myriad Tables Lib" version "1.0.9" –https://www.macosxautomation.com/applescript/apps/Script_Libs.html

property NSArray : a reference to current application’s NSArray
property NSString : a reference to current application’s NSString
property OSAScript : a reference to current application’s OSAScript
property NSPredicate : a reference to current application’s NSPredicate
property NSDictionary : a reference to current application’s NSDictionary
property NSUnarchiver : a reference to current application’s NSUnarchiver
property NSCountedSet : a reference to current application’s NSCountedSet

–構文色分け設定に重複色がないかチェック
set cList to getAppleScriptSourceColors() of me
set cRes to chkASLexicalFormatColorConfliction(cList) of me –構文色分けの重複色チェック
if cRes = false then error "There is some duplicate(s) color among AppleScript’s lexical color settings"

–Script Debugger上でオープン中の2つのAppleScript書類のパスを取得
set dList to retTwoPathList() of me
if dList = false then return

copy dList to {d1Path, d2Path}

–各AppleScript書類のハンドラ名称一覧を取得する
set hList1 to retHandlerNamesFromAppleScriptSource(d1Path as alias) of me
set hList2 to retHandlerNamesFromAppleScriptSource(d2Path as alias) of me

–2つのAppleScript書類のハンドラの共通項目(名称のみ)を抽出する
set resList to returnDuplicatesOnly(hList1 & hList2) of me
if resList = {} then
  –共通のハンドラ(サブルーチン)が指定の2つのScriptに存在していなかった
  
display dialog "There is no common handler between the scripts." buttons {"OK"} default button 1
  
return
end if

–各AppleScript書類のソースを取得して、指定のハンドラのテキストを取得する
set s1Source to getASsourceFor(d1Path as alias) of me
set s2Source to getASsourceFor(d2Path as alias) of me

if (s1Source = false) or (s2Source = false) then
  display dialog "Error occured in getteing AS source" buttons {"OK"} default button 1
  
return
end if

set outList to {}
repeat with i in resList
  set resHandler to contents of i
  
set s1Source to extractHandlerSourceOnly(s1Source, resHandler) of me
  
set s2Source to extractHandlerSourceOnly(s2Source, resHandler) of me
  
set compareF to (s1Source is equal to s2Source) as boolean
  
set the end of outList to {resHandler, compareF}
end repeat

–結果表示
tell me to activate
display table with data outList with prompt "Handler contents compare results" column headings {"Handler name", "Match?"} with title "Handler Diff Results"

–指定のハンドラの内容を抽出する(コメントぐらいは結果から削除してもいいような気もする)
–Script Objectの使用は考慮していない。1つのAppleScript書類からScript Objectで論理分割された同名のハンドラが複数検出されるケースは想定していない
on extractHandlerSourceOnly(wholeScript as string, handlerName as string)
  –インデント文字(Tab)をすべて削除
  
set targScript to repChar(wholeScript, tab, "") of me
  
  
–"on"ではじまるハンドラと仮定して抽出
  
set handlerStr to extractStrFromTo(targScript, "on " & handlerName, "end " & handlerName) of me
  
if handlerStr = false then
    –"to"ではじまるハンドラと仮定して抽出
    
set handlerStr to extractStrFromTo(targScript, "to " & handlerName, "end " & handlerName) of me
    
if handlerStr = false then return false
  else
    return handlerStr
  end if
end extractHandlerSourceOnly

on retHandlerNamesFromAppleScriptSource(aFile)
  set aRec to getAttrRecFromASPath(aFile) of me
  
set cList to getAppleScriptSourceColors() of me
  
  
set targAttr to contents of item 7 of cList –ハンドラあるいは変数
  
set tmpCoStr to ((redValue of targAttr) as string) & " " & ((greenValue of targAttr) as string) & " " & ((blueValue of targAttr) as string)
  
  
set ontoColItem to contents of item 3 of cList –スクリプティング予約語(on/to)
  
set ontoCoStr to ((redValue of ontoColItem) as string) & " " & ((greenValue of ontoColItem) as string) & " " & ((blueValue of ontoColItem) as string)
  
  
  
–変数あるいはハンドラ名称をリストアップ(variables & handler)
  
set tmp1Array to NSArray’s arrayWithArray:aRec
  
set thePred0 to NSPredicate’s predicateWithFormat_("colorStr == %@", tmpCoStr)
  
set dArray to (tmp1Array’s filteredArrayUsingPredicate:thePred0) as list
  
  
–改行を含むデータをリストアップ(text data contains return)
  
set thePred1 to NSPredicate’s predicateWithFormat_("stringVal CONTAINS %@", return)
  
set eArray to ((tmp1Array’s filteredArrayUsingPredicate:thePred1)’s valueForKeyPath:"itemIndex") as list
  
  
set the beginning of eArray to 0 –ハンドラ宣言部がTopに来る場合に備える
  
  
–"on"(ハンドラ宣言)の項目をリストアップ 文字と色で抽出
  
set thePred2 to NSPredicate’s predicateWithFormat_("stringVal == %@ && colorStr == %@ ", "on", ontoCoStr)
  
set fArray to ((tmp1Array’s filteredArrayUsingPredicate:thePred2)’s valueForKeyPath:"itemIndex") as list
  
  
–"to"(ハンドラ宣言ないしは代入対象指定) の項目をリストアップ文字と色で抽出
  
set thePred3 to NSPredicate’s predicateWithFormat_("stringVal == %@ && colorStr == %@ ", "to", ontoCoStr)
  
set gArray to ((tmp1Array’s filteredArrayUsingPredicate:thePred3)’s valueForKeyPath:"itemIndex") as list
  
  
  
set handlerList to {}
  
  
–on ではじまるハンドラの抽出
  
repeat with i in eArray –改行を含むテキストのアイテム番号リスト
    set j to (contents of i) as integer
    
repeat with ii in fArray –"on"の項目リスト
      set jj to (contents of ii) as integer
      
      
set handlerStr to missing value
      
      
if (j + 1) = jj then
        set handlerStr to stringVal of (item (jj + 2) of (aRec as list))
      else if (j + 2) = jj then
        set handlerStr to stringVal of (item (jj + 2) of (aRec as list))
      end if
      
      
if handlerStr is not in {"error", missing value} and handlerStr is not in handlerList then
        set the end of handlerList to handlerStr
      end if
      
    end repeat
  end repeat
  
  
  
–to ではじまるハンドラの抽出
  
repeat with i in eArray –改行を含むテキストのアイテム番号リスト
    set j to (contents of i) as integer
    
repeat with ii in gArray –"to"の項目リスト
      set jj to (contents of ii) as integer
      
      
set handlerStr to missing value
      
      
if (j + 1) = jj then
        set handlerStr to stringVal of (item (jj + 2) of (aRec as list))
      else if (j + 2) = jj then
        set handlerStr to stringVal of (item (jj + 2) of (aRec as list))
      end if
      
      
if handlerStr is not in {"error", missing value} and handlerStr is not in handlerList then
        set the end of handlerList to handlerStr
      end if
      
    end repeat
  end repeat
  
  
return handlerList
end retHandlerNamesFromAppleScriptSource

–ソースを取得してコンパイル(構文確認)する方式から、URL(fileURL)を指定してコンパイル(構文確認)する方式に変更した
on getAttrRecFromASPath(aFile)
  set aURL to current application’s |NSURL|’s fileURLWithPath:(POSIX path of aFile)
  
set theScript to OSAScript’s alloc()’s initWithContentsOfURL:aURL |error|:(missing value)
  
  
if theScript is equal to missing value then
    — handle error
    
error "Compile Error"
  else
    –set sourceText to theScript’s source() –No Use
    
set styledSourceText to theScript’s richTextSource()
  end if
  
  
set attrRes to getAttributeRunsFromAttrString(styledSourceText) of me
  
return attrRes
end getAttrRecFromASPath

–指定AppleScriptファイルのソースコードを取得する(実行専用Scriptからは取得できない)
— Original Created 2014-02-23 Shane Stanley
on getASsourceFor(anAlias as {alias, string})
  set aURL to current application’s |NSURL|’s fileURLWithPath:(POSIX path of anAlias)
  
set theScript to OSAScript’s alloc()’s initWithContentsOfURL:aURL |error|:(missing value)
  
  
if theScript is equal to missing value then
    — handle error
    
error "Compile Error"
  else
    set sourceText to theScript’s source()
  end if
  
  
return sourceText as string
end getASsourceFor

–Attributed StringをDictionary化
on getAttributeRunsFromAttrString(theStyledText)
  script aSpd
    property styleList : {}
  end script
  
  
set (styleList of aSpd) to {} —for output
  
  
set thePureString to theStyledText’s |string|() –pure string from theStyledText
  
  
set theLength to theStyledText’s |length|()
  
set startIndex to 0
  
set itemCount to 1
  
  
repeat until (startIndex = theLength)
    set {theAtts, theRange} to theStyledText’s attributesAtIndex:startIndex longestEffectiveRange:(specifier) inRange:{startIndex, theLength – startIndex}
    
    
–String  
    
set aText to (thePureString’s substringWithRange:theRange) as string
    
    
–Color
    
set aColor to (theAtts’s valueForKeyPath:"NSColor")
    
if aColor is not equal to missing value then
      set aSpace to aColor’s colorSpace()
      
      
set aRed to (aColor’s redComponent()) * 255
      
set aGreen to (aColor’s greenComponent()) * 255
      
set aBlue to (aColor’s blueComponent()) * 255
      
      
set colList to {aRed as integer, aGreen as integer, aBlue as integer} –for comparison
      
set colStrForFind to (aRed as integer as string) & " " & (aGreen as integer as string) & " " & (aBlue as integer as string) –for filtering
    else
      set colList to {0, 0, 0}
      
set colStrForFind to "0 0 0"
    end if
    
    
–Font
    
set aFont to (theAtts’s valueForKeyPath:"NSFont")
    
if aFont is not equal to missing value then
      set aDFontName to aFont’s displayName()
      
set aDFontSize to aFont’s pointSize()
    end if
    
    
set the end of (styleList of aSpd) to {stringVal:aText, colorStr:colStrForFind, colorVal:colList, fontName:aDFontName as string, fontSize:aDFontSize, itemIndex:itemCount}
    
set startIndex to current application’s NSMaxRange(theRange)
    
    
set itemCount to itemCount + 1
  end repeat
  
  
return (styleList of aSpd)
  
end getAttributeRunsFromAttrString

–AppleScriptの構文色分けのカラー値をRGBで取得する
on getAppleScriptSourceColors()
  
  
— get the plist info as a dictionary
  
set thePath to NSString’s stringWithString:"~/Library/Preferences/com.apple.applescript.plist"
  
set thePath to thePath’s stringByExpandingTildeInPath()
  
set theInfo to NSDictionary’s dictionaryWithContentsOfFile:thePath
  
  
— extract relevant part and loop through
  
set theArray to (theInfo’s valueForKey:"AppleScriptSourceAttributes") as list
  
  
set colList to {}
  
  
repeat with i from 1 to count of theArray
    set anEntry to item i of theArray
    
    
set colorData to NSColor of anEntry
    
set theColor to (NSUnarchiver’s unarchiveObjectWithData:colorData)
    
    
set {rVal, gVal, bVal} to retColListFromNSColor(theColor, 255) of me
    
    
set fontData to NSFont of anEntry
    
set theFont to (NSUnarchiver’s unarchiveObjectWithData:fontData)
    
    
set aFontName to theFont’s displayName() as text
    
set aFontSize to theFont’s pointSize()
    
    
set aColRec to {redValue:rVal, greenValue:gVal, blueValue:bVal, fontName:aFontName, fontSize:aFontSize}
    
    
set the end of colList to aColRec
  end repeat
  
  
return colList
end getAppleScriptSourceColors

–NSColorからRGBの値を取り出す
on retColListFromNSColor(aCol, aMAX as integer)
  set aRed to round ((aCol’s redComponent()) * aMAX) rounding as taught in school
  
set aGreen to round ((aCol’s greenComponent()) * aMAX) rounding as taught in school
  
set aBlue to round ((aCol’s blueComponent()) * aMAX) rounding as taught in school
  
  
if aRed > aMAX then set aRed to aMAX
  
if aGreen > aMAX then set aGreen to aMAX
  
if aBlue > aMAX then set aBlue to aMAX
  
  
return {aRed, aGreen, aBlue}
end retColListFromNSColor

–AS書式で配色に重複がないかどうかチェック
on chkASLexicalFormatColorConfliction(aList)
  set anArray to current application’s NSArray’s arrayWithArray:aList
  
set bList to (anArray’s valueForKeyPath:"redValue.stringValue") as list
  
set cList to (anArray’s valueForKeyPath:"greenValue.stringValue") as list
  
set dList to (anArray’s valueForKeyPath:"blueValue.stringValue") as list
  
  
set colStrList to {}
  
repeat with i from 1 to (length of bList)
    set bItem to contents of item i of bList
    
set cItem to contents of item i of cList
    
set dItem to contents of item i of dList
    
set the end of colStrList to bItem & " " & cItem & " " & dItem
  end repeat
  
  
set aRes to returnDuplicatesOnly(colStrList) of me
  
log aRes
  
if aRes is equal to {} then
    return true –重複が存在しなかった場合
  else
    return false –重複があった場合
  end if
end chkASLexicalFormatColorConfliction

on returnDuplicatesOnly(aList as list)
  set aSet to current application’s NSCountedSet’s alloc()’s initWithArray:aList
  
set bList to (aSet’s allObjects()) as list
  
  
set dupList to {}
  
repeat with i in bList
    set aRes to (aSet’s countForObject:i)
    
if aRes > 1 then
      set the end of dupList to (contents of i)
    end if
  end repeat
  
  
return dupList
end returnDuplicatesOnly

on retTwoPathList()
  tell application "Script Debugger"
    set dList to name of every document
    
set dResList to choose from list dList with prompt "Select two documents" with multiple selections allowed
    
if dResList = false then return false
    
if length of dResList is not equal to 2 then
      display dialog "Please Select two documents to compare handler contents" buttons {"OK"} default button 1 with icon 1 with title "Selection Error"
      
return false
    end if
    
    
set dPathList to {}
    
repeat with i in dResList
      set j to contents of i
      
tell document j
        set tmpPath to (file spec) as string –HFS path string
      end tell
      
      
set the end of dPathList to tmpPath
    end repeat
  end tell
  
  
return dPathList
end retTwoPathList

–Written By Philip Aker
–文字置換ルーチン
on repChar(origText as string, targStr as string, repStr as string)
  set {txdl, AppleScript’s text item delimiters} to {AppleScript’s text item delimiters, targStr}
  
set temp to text items of origText
  
set AppleScript’s text item delimiters to repStr
  
set res to temp as text
  
set AppleScript’s text item delimiters to txdl
  
return res
end repChar

–指定文字と終了文字に囲まれた内容を抽出
on extractStrFromTo(aParamStr, fromStr, toStr)
  set theScanner to current application’s NSScanner’s scannerWithString:aParamStr
  
set anArray to current application’s NSMutableArray’s array()
  
  
repeat until (theScanner’s isAtEnd as boolean)
    set {theResult, theKey} to theScanner’s scanUpToString:fromStr intoString:(specifier)
    
theScanner’s scanString:fromStr intoString:(missing value)
    
set {theResult, theValue} to theScanner’s scanUpToString:toStr intoString:(specifier)
    
if theValue is missing value then set theValue to "" –>追加
    
theScanner’s scanString:toStr intoString:(missing value)
    
anArray’s addObject:theValue
  end repeat
  
  
if anArray’s |count|() is not equal to 1 then return false
  
  
return first item of (anArray as list)
end extractStrFromTo

★Click Here to Open This Script 

Posted in Color OSA Record Text | Tagged 10.12savvy 10.13savvy 10.14savvy NSArray NSCountedSet NSDictionary NSPredicate NSString NSUnarchiver OSAScript Script Debugger | Leave a comment

sd checker

Posted on 6月 30, 2019 by Takaaki Naganoya

Script Debuggerを操作して、オープン中のScriptのうちのいずれかから、選択してScriptからリンクしているFrameworkやライブラリが指定のScriptバンドル内に存在しているかどうかチェックするAppleScriptです。

AppleScript appletの納品時にライブラリやFrameworkをすべてバンドル内に入れておいたはずなのに、納品先の環境でFrameworkやライブラリが入っていないエラーに直面したことは、実はけっこうあります。とくにFrameworkです。

つまり、バンドルに収めたFrameworkやライブラリがリンクされていれば問題ないものの、~/Library/Frameworksや~/Library/Script Librariesフォルダ内のファイルが指し示されている場合には、他の環境に持って行ったときに実行できません。

その割に、どのFrameworkがバンドル外ファイルにリンクされているのかといったチェックを(Apple純正のスクリプトエディタでは)明示的に行う手段がなく、一時的に開発環境内の当該Frameworkを削除してアプリケーション書き出しして様子を見るといったチェック作業を行っていました。

AppleScriptのバンドル内にFrameworkを突っ込む機能がScript Debugger上に用意されていないため手作業で行っており、たまーに突っ込むフォルダの階層を間違えてしまうんですね(涙)。

自分のことながら、この作業自体がひたすら間抜けだったので、プログラムでチェックだけでも行えるようにしてみたものがこのAppleScriptです。

本Scriptは1つのScriptをそのままチェックするだけのものです。本来は、当該Scriptに含まれるScript Libraryを再帰でオープンしてチェックすべきなんでしょう。

Script Debuggerにこの機能が用意されているということは、メーカーのLate Night Softwareでもいろいろハマったんだと思いますが、メニューなどのGUI要素がついていない理由がよくわかりません。Shaneにはアプリ書き出し時にFrameworkのバンドル内組み込みを行う方向で要望は出しています。現場的には必須の機能です。

AppleScript名:sd checker.scptd
—
–  Created by: Takaaki Naganoya
–  Created on: 2019/06/30
—
–  Copyright © 2019 Piyomaru Software, All Rights Reserved
—

use AppleScript version "2.4" — Yosemite (10.10) or later
use framework "Foundation"
use scripting additions

tell application "Script Debugger"
  set dList to name of every document
  
set dRes to choose from list dList with prompt "Choose Script to check linked files (framework/script libraries)"
  
if dRes = false then return
  
set dName to contents of item 1 of dRes
  
  
tell document dName
    set myFile to path
    
    
–Framework Check
    
set uList to used framework files
    
set fList to {}
    
repeat with i in uList
      set j to POSIX path of i
      
if (j does not start with myFile) and (j does not start with "/System/Library/Frameworks/") then
        set the end of fList to j
      end if
    end repeat
    
    
–Script Library Check
    
set libList to used script library files
    
set sList to {}
    
repeat with i in sList
      set j to POSIX path of i
      
if j does not start with myFile then
        set the end of sList to POSIX path of i
      end if
    end repeat
    
    
(*
    –Scripting Additions Check (Omitted)
    set sdList to used scripting addition files
    set dList to {}
    repeat with i in dList
      set j to POSIX path of i
      if j does not start with myFile then
        set the end of dList to POSIX path of i
      end if
    end repeat
    *)

  end tell
end tell

set resList to {fList, sList}
set res2List to FlattenList(resList) of me
set res3List to cleanUp1DList(res2List, {""}) of me
if res3List = {} then
  display dialog "Lib/Framework link check OK"
else
  set aLen to length of res3List
  
set tmpStr to retDelimedText(res3List, return) of me
  
display dialog (aLen as string) & " Lib/Framework exists out of the bundle." & return & tmpStr
end if

–次元数上限なしの多次元配列を1次元配列にフラット化 By Paul Berkowitz
on FlattenList(aList)
  set oldDelims to AppleScript’s text item delimiters
  
set AppleScript’s text item delimiters to {"????"}
  
set aString to aList as text
  
set aList to text items of aString
  
set AppleScript’s text item delimiters to oldDelims
  
return aList
end FlattenList

on cleanUp1DList(aList as list, cleanUpItems as list)
  set bList to {}
  
repeat with i in aList
    set j to contents of i
    
if j is not in cleanUpItems then
      set the end of bList to j
    end if
  end repeat
  
return bList
end cleanUp1DList

on retDelimedText(aList, aDelim)
  set aText to ""
  
set curDelim to AppleScript’s text item delimiters
  
set AppleScript’s text item delimiters to aDelim
  
set aText to aList as text
  
set AppleScript’s text item delimiters to curDelim
  
return aText
end retDelimedText

★Click Here to Open This Script 

Posted in File path list | Tagged 10.12savvy 10.13savvy 10.14savvy Script Debugger | 3 Comments

as anything

Posted on 4月 3, 2019 by Takaaki Naganoya

as anythingについてまとまった情報がなかったので、まとめておきました。結論めいたものはとくになく、ただ、手持ちの情報を並べてみただけの内容なのでご容赦ください。「これはこうあるべき!」とかいう提言とかは一切ありません。

割と最近なas anythingとの遭遇

つい最近まで、ながらく存在自体を知らなかったのが、このanythingという予約語です。

AppleScriptの用語辞書をASObjC Explorer 4で書いて試していたとき、パラメータの型に「any」というものが存在していることには気づいていましたが、それでも「anything」という予約語があることには気づきませんでした。

本格的に知ったのは、applescript-stdlibを漁っていたときです。

同ライブラリはトリッキーなScriptの記述方法の見本市みたいになっていて、内容自体の完全理解についてはサジを投げた状態でしたが、見たことのない記述にいろいろ行き当たりました(もっと読みやすく書いてほしかった ^ー^;;)。

delegateの呼び出し先にscriptオブジェクト内部のハンドラを指定したりと、「そんな書き方できるんだ。やらんけど」と、まるで古文書をひもとくような感覚(これを見ていると、こーゆー風にblocks構文をAppleScriptでも記述できればいいのに、と思います)。

そこで見つけた「as anything」表記。これは一体なんなんでしょう?

いい加減に使えてとても便利なas anything

実際に動かしてみたところ、「あーー、この機能昔から欲しかったわー」という内容でした。anonymous classとでもいうのでしょうか。castするときにclass名を指定しないワイルドカードなclassと理解しました。

「as anything」でAppleScriptのデータ型はそのまま、AppleScriptのデータ型にcast可能なCocoaのデータはAppleScriptのデータ型に変換。変換不能なCocoaのデータ型についてはそのまま、という処理をしてくれます。

# ただし要素数が1つのNSArrayをas anythingでAppleScript Objetに変換すると、listではなく中身のデータが取り出されてしまう(型が合わなくなる)ので、注意が必要とのこと(Thanks Shane!)
# なので、あらかじめNSArrayが返ってくることがわかっている場合には、as list。NSArrayか他のデータ(missing valueとか)が返ってくる場合には、as {missing value, list} などとするとよいでしょう

BridgePlus的にいえば、「ASify without BridgePlus」といったところでしょうか。CocoaとAppleScriptの間でデータをやりとりするのにえっらく都合がよかったのです。かくして、「as anything」を愛用しまくるスタイルが確立。

ただ、anythingは言語仕様のはざまで埋もれかけていた「枝葉末節」の中の一番の「枝葉」ともいうべき、言語仕様の極北。AppleScript Language Guideにも記載されていないほどの枝葉仕様。

AppleScriptObjCのプログラム中に書くと、予約語が用意されていないためか「as anything」が「as list of string or string」などと解釈されてしまいます(動作自体はanythingと同じ)。

anythingについては、Apple側がわりとぞんざいに仕様を放置していたきらいがあります。問題が起こらないかぎり放っておこう、と。as «class isot»のようにある日突然(Mac OS X 10.5で)消えてなくなったりしないかちょっと不安に感じたこともありましたが、一応まがりなりにも予約語が割り振られているので(生Apple Eventを記述させられないので)、そんなに簡単に消えないとは思います。

主要開発環境で足並みそろわず

雑に放置していたAppleに対して、この問題に正面から向き合っていた集団が存在します。それが、Script DebuggerのメーカーであるLate Night Softwareです。

macOS 10.12や10.13上ではあいかわらずASOCのプログラムでは「as anything」が「as list of string or string」と解釈されますが、macOS 10.14で対応に差が出ました。

Script Debugger上では「anything」が「any」と解釈され、スクリプトエディタ上では「anything」と解釈されます。

macOS 10.14上でのスクリプトエディタで「as anything」が「as list of string or string」のように化けないのはいいと思います。ただ、Script DebuggerのメーカーであるLate Night Software側ではこれに「any」という別の予約語を割り振ったようで、、、、足並みがそろっていません。

一応、macOS 10.14上のスクリプトエディタv2.11上で「as anything」と記述したScriptを、同じくmacOS 10.14上のScript Debuggerに持っていくと「as any」と表示されます。いったん中間コードにコンパイルされたものは問題がないようです。

問題になるのは、Blogなどに掲載されている文字の状態のAppleScriptで、anythingについてはコンパイル(構文確認)時に気をつける必要がありそうです(メイン環境が10.14に移行していないのでちょっとまだ他人事)。

困ったときの古文書だより

一応、現代AppleScriptのルーツの資料とされている「AppleScriptLanguageGuide 1.3.7」(1999/5/5)のPDFを確認してみると、けっこう悩ましい内容が記述されています。

自分はanythingをclassか何かだと思っていたのですが、そこには定数(constants)だと書かれています。AppleScript version 1.3.7のころには、missing value(不定値)みたいな運用が行われていたようです。

AppleのEngineering Teamの見解は?

匿名希望の方がApple Engineering Teamに問い合わせしたところ「そんなマイナーな予約語は使うな」という返答であったとか。その一方でmacOS 10.14で「anything」の「list or list of string」への解釈化けが抑止されたりしているわけで、いまひとつわかりにくいというのが現状です。

Posted in OSA | Tagged 10.12savvy 10.13savvy 10.14savvy Script Debugger Script Editor | Leave a comment

Script Debuggerに必要な機能を追加する

Posted on 2月 8, 2019 by Takaaki Naganoya

毎日仕事で使っているAppleScript統合開発環境(IDE)、Late Night SoftwareのScript Debugger。大変リッチな機能を持っているものの、仕事で使えば使ったで不満が出てくるもので、機能を追加したくなってきました。

Script Debugger自体もScriptableなアプリケーションなので、AppleScriptを記述して機能を追加できます。ScriptからはApple純正のスクリプトエディタとまったく同じことができるわけではありませんが、ある程度まではコントロールが可能です。

Script DebuggerのAppleScript用語辞書はスクリプトの分析機能がスクリプトエディタよりも大幅に高機能であり、比較にもなりません。ただし、スクリプト書類の書式(style runs)を取得できないため、構文色分けを利用した構文要素への分解ができませんでした。変数名のみ置換するとかハンドラ名のリストアップするといった、スクリプトエディタで10年以上前から利用している機能が使えないわけです(このあたりの処理をスクリプトエディタに依存せずに実行できるようになったのは、ほんのつい最近のことです)。マインドマップ上に各ハンドラの呼び出し関係を図示するような処理も10年ぐらい前からやっていますが、それもScript Debugger上では行えませんでした。一長一短です。

Script Debuggerは独自のScript Menuを持っており、~/Library/Application Support/Script Debugger 7/Scripts/フォルダ内に(Script Debuggerをコントロールする)各種AppleScriptを入れておくとScript Debugger内のScript Menuから呼び出して実行できるようになっています。

ここで紹介するのは「includeしているライブラリをすべてオープンする」Scriptと、「includeしているライブラリのScriptをすべてクローズする」Scriptです。

open all Script Library

スクリプトバンドルのAppleScriptで、バンドル内にAppleScriptライブラリを含んでいる場合に、それらをScript Debuggerでオープンします。機能を細分化して記述している場合に、全Scriptをチェックする必要が生じるとこのようにすべてオープンして確認する必要があります。本来、共通部分をライブラリ化しておく必要があるわけですが、突発的にこういう作業が発生したもので。

Close Script Libraries

「open all Script Library」スクリプトでオープンしたライブラリをクローズするAppleScriptです。Script Debugger上でメインのAppleScriptを選んでおくと、そのScript中でincludeしている(use)AppleScript Librariesをクローズします。

Script Debuggerで一番不満なのは動的に生成したWindowやMenuなどのイベントを拾ってくれないことですが、ほかにも、useコマンドで利用しているAppleScript Librariesでバンドル内に含めていないものをチェックしてバンドル内に入れる機能がないことでしょうか(動作確認して客先に送ったあとで焦ることがたびたび)。そのあたりもぼちぼち、、、、メーカーにリクエストを出して実装を待つよりも、自分でScriptを組んだほうが早いので、、、

AppleScript名:open all Script Library
tell application "Script Debugger"
  tell document 1
    set libList to (used script library files)
    
set aWin to script window of it
    
–> {script window id 13269 of application "Script Debugger"}
  end tell
  
  
set targWin to contents of first item of aWin
  
  
repeat with i in libList
    set j to contents of i
    
set jj to j as alias
    
    
try
      open jj in window targWin
    end try
  end repeat
end tell

★Click Here to Open This Script 

AppleScript名:Close Script Libraries
tell application "Script Debugger"
  tell front document
    set libList to (used script library files)
    
if libList = {} then return –No AppleScript Libraries
  end tell
  
  
set dList to every document
  
repeat with i in dList
    tell i
      set fSpec to file spec
      
if fSpec is in libList then
        ignoring application responses
          close with saving
        end ignoring
      end if
    end tell
  end repeat
end tell

★Click Here to Open This Script 

Posted in file OSA | Tagged 10.11savvy 10.12savvy 10.13savvy Script Debugger | Leave a comment

本気で使うといろいろ粗が見えてくるScript Debugger

Posted on 8月 13, 2018 by Takaaki Naganoya

込み入った案件で必要になって、Script Debugger 7を購入しました。Adobeの大型アプリケーションのオブジェクト階層を調査したい場合にはScript Debuggerを使わないのは自殺行為です。

その反面、Xcodeの外部エディタとして使うなら、まだASObjC Explorer 4のほうが使い勝手がいいし(Xcode上で外部エディタを指定してscriptを再編集するとxibファイルのトラブルなど諸問題が解決するのに、Script Debuggerだと解決しない)、クラッシュの頻度もややScript Debuggerのほうが高い気がします。

本気で組んだ仕事用のAppleScript相手だと、Script Debugger上で作って、Script Debugger上で動作させるだけなら問題はないのですが、アプレットを書き出して実行させるあたりで疑問符が出てきます。

AppleScript上で何かの予約語が存在していた場合に、「どのアプリケーション、どのScript Libraries」の用語辞書から使用したものなのかをusing terms from句で囲ってこまめに宣言しておかないと、書き出したAppleScriptアプレットを起動しようとしてもクラッシュします。

# しかも、Scriptのサイズが小さい場合にはクラッシュせず、大きくなるとクラッシュするという、、、

また、using terms from句で囲むさいにはuse宣言で代入したプロパティが使えず(using terms from bPlus とか)、using terms from script “BridgePlus”のように書かないとScript Debugger上で構文確認が通りません(こちらはAppleScript処理系そのものの動作の癖?)。

さらに、「anything」(≒”any”)という(Appleに)いい加減に実装されてきた予約語を、さまざまなライブラリで別々に(ちゃんと)実装していたりすると、Script Debugger上での構文確認時に「どのアプリケーションの予約語なのか分からないぞ」というワーニングメッセージが出ます。これ、ダイアログで表示するなら、リストから選択させるとかいった動作の方がいいと思います。

このあたり、Apple純正のスクリプトエディタやASOBjC Explorer 4(現在はScript Debuggerと合流)では確認していない現象ですが、Script Debuggerを使っているかぎりはこまめにusing terms fromで囲う必要があるようです。

Posted in 未分類 | Tagged 10.12savvy Script Debugger | Leave a comment

ScriptDebugger 7で最前面のドキュメントから特殊な属性値を取得

Posted on 4月 20, 2018 by Takaaki Naganoya

AppleScriptの統合開発環境「Script Debugger 7」をAppleScriptからコントロールしたときに、編集中のAppleScript書類から特殊な属性値を取り出せることを確認しました。

# 寝て起きたらShane Stanleyからコメントが送られてきていたので、追記しています(Thanks Shane!)

AppleScriptを編集するプログラム「スクリプトエディタ」「Script Debugger」自体もAppleScriptからのコントロールが可能になっています。対応度でいうとスクリプトエディタのほうが「できることが多い」状態(Attribute Runsを取得できるので、スクリプトの解析を行うにはスクリプトエディタの方が有利)ですが、Script Debuggerにもいろいろと独自に拡張した機能が見られます。

よくよく確認してみたところ「なんでこんなもんが取れるんだ?」という不思議なものがいくつかありました。

Copyright表記(copyright)

なぜ、このようなものが取得できるのか不思議ですが、調べてみたところ編集中のAppleScriptを解析して取り出しているのではなく、バンドル形式のAppleScript書類中のInfo.plistのエントリを取り出しているようです。

–> Shane Stanleyから「そのとおり」とコメント

使用Framework(used framework files)

これは、編集中のAppleScriptを文字列サーチして見つけているものと思われます。ファイルパスのリストで返ってきます。

–> ファイルパスではなく名称リストでした(訂正) また、文字列としてサーチしているのではなく(コメントにuse frameworkを書いておいても無視)実際に解釈して処理しているとのこと
use AppleScript version "2.4"
use framework "Foundation"
use framework "OSAKit"
use scripting additions

–本ScriptをScript Debuggerでオープンしておき、他のエディタ(Script Editor)でAppleScript書類のプロパティを取得すると、used frameworksを取得できる

–> used frameworks:{"Foundation", "OSAKit"}

★Click Here to Open This Script 

使用Script Libraries(used script library files)

ファイルパスのリストで返ってきます。同一ライブラリのうちどのバージョンのものが検知されるのか、といったところは確認しておきたいところです。

レガシーScript Libraries(legacy script libraries)

macOS 10.9で搭載されたAppleScript Librariesですが、10.9からどこまでがScript Debuggerが想定している「レガシー形式」(legacy script libraries)なのかが不明です。

 (a) macOS 10.9だけLegacy Libraries
 (b) macOS 10.9〜10.10がLegacy Libraries

の2つの可能性が存在しています。

–> Shane Stanleyのコメントによれば、本プロパティはScript Debugger 6までのみで有効な値であるとのこと。Script Debugger 7はmacOS 10.11以降でのみ動作するので、(b)の可能性が高そうです(憶測)。

OSAX(used scripting addition files)

これは、あまり真剣に調べていませんが、、、、正確にAppleScript中で使用しているOSAXをリストアップしているのかどうか、半信半疑なところです。

–> Shane Stanleyによれば、これはちゃんとAppleScriptを解釈して抽出しているとのこと

アプリケーション(used applications)

本当に検知できるのか半信半疑なところです。バンドルIDで指定したらどうなるのか、とか疑問がけっこうあります。

–> ShaneからBundle IDで評価しているとのコメントアリ。実際にさまざまな形式でアプリケーションを指定してみたら、取得できました。
use AppleScript version "2.4" — Yosemite (10.10) or later
use framework "Foundation"
use scripting additions

tell application "Finder"
  –アプリケーション名
end tell

tell application id "com.apple.Safari"
  –Bundle ID
end tell

tell application "/Applications/Mac Down"
  –Path
end tell

set aScriptStr to "tell application \"Terminal\" to activate"
run script aScriptStr –String

—————–
–> used applications:{"Finder", "Mac Down", "Safari"}

★Click Here to Open This Script 

組み込みScript Libraries(embedded script libraries)

編集中のバンドル形式のAppleScript書類のバンドル中にAppleScript Librariesを入れている場合にこれを検出するようです。バンドル内を走査してバンドル内に入っているAppleScript Librariesのリストアップはできますが、バンドル内に入れてあるのにuse宣言していない場合にはどーなるのか、といった「穴」はいろいろと見つかりそうな気配がしています。

–> Shane Stanleyによれば、いったん利用中のScript Libraryの情報を取得して、バンドル中に存在するもののみを抽出しているとのこと。「利用していないが入っている」ライブラリは無視するとのこと。また、入れ子でライブラリ中に入っている状態のライブラリは検出しないとのこと。AppleScriptバンドル書類を「親」とすると、AppleScript Libraries in bundleを「子」、さらにその中に入っているAppleScript Librariesを「孫」としたときに、「子」の階層までが検出範囲であるとしています

AppleScript名:ScriptDebugger 7で最前面のドキュメントから特殊な属性値を取得
tell application "Script Debugger"
  tell front document
    –set reqImportFiles to required import items of front document
    
    
set aCopyright to (copyright)
    
–> "Copyright © 2018 Piyomaru Software, All Rights Reserved"
    
    
set frameworkList to (used framework files)
    
–> {file "Cherry:System:Library:Frameworks:Foundation.framework:"}
    
    
set libList to (used script library files)
    
–> {file "Cherry:Users:me:Library:Script Libraries:asHTMLexportLib.scpt", file "Cherry:Users:me:Library:Script Libraries:BridgePlus.scptd:"}
    
    
set legacyLibs to (legacy script libraries) –What?
    
–> {}
    
    
set osaxList to (used scripting addition files)
    
–> {file "Cherry:System:Library:ScriptingAdditions:StandardAdditions.osax:"}
    
    
set appList to (used applications)
    
–> {"Finder"}
    
    
set embLib to (embedded script libraries)
    
–> {}
    
    
properties
  end tell
end tell

★Click Here to Open This Script 

Posted in 未分類 | Tagged 10.12savvy 10.13savvy Script Debugger | Leave a comment

Script Debugger 7が登場。試用期間が切れても機能制限つきLiteモードで動作

Posted on 3月 5, 2018 by Takaaki Naganoya

Late Night SoftwareからScript Debuggerの最新バージョン、Script Debugger 7がリリースされました。macOS 10.11以降のOSが対象です。価格は99ドルで、ボリュームディスカウントも用意されています。

Script DebuggerはClassic Mac OSの時代からサードパーティのAppleScript統合開発環境として続いてきたソフトウェアです。AppleScriptのプログラムの開発、実行およびデバッグのための強力な機能を提供します。

v6:AppleScriptObjCに対応
v5:エディタ部分をフル書き換え


▲Script Debugger 7


▲Script Debugger 3 + Classic Mac OS 8.6(SheepShaver)

AppleScript統合開発環境の決定版

「デバッガ」の名のとおり、AppleScriptに対して変数内容のリアルタイムモニタリング、ブレークポイントの設定、ステップ実行などの機能を提供します。

さらに、対象アプリケーションの各オブジェクトの属性値情報をリアルタイムでモニタリングする機能を提供しており、初見のGUIアプリケーションであっても、Script Debuggerのこの機能を用いれば、とくに迷うことなく目的の属性値情報にたどり着くことが可能です。

初心者にこそ使ってほしいソフトウェア

こうした機能は、(上級者はもちろんのこと)初心者にこそ有用なもので、自分もたまたまAppleScript入門時にScript Debuggerに出会い(バージョン2か3の頃に)、たいへんに助けられました。FileMaker Proのデータベースからカテゴリごとにデータを抽出してHTMLコンテンツを生成するAppleScriptを、AppleScriptを使い始めて1週間ぐらいで作れるようになったのは、(海外のMailing Listで教えてもらいつつ)Script Debuggerがあったからです。

名前が仰々しいので「むずかしいソフトウェア」と思われがちで、それがScript入門者にとってもメーカーにとってもたいへんに不幸なことだと思っていました。初心者が使うと便利でわかりやすいのに、初心者が「むずかしそう」と敬遠してしまうのは、残念なことです。

一般的なレベルの「AppleScript入門者」にScript Debuggerの機能を2〜3週間で理解しろといっても無理なようなので、もう少し「何か」があれば入門者もより理解が深まり、Script Debuggerの恩恵を授かることができるのに、と思っておりました。

macOS 10.14以降で、サードパーティFramework呼び出しScriptに必須

Apple純正のCocoa Frameworkにくわえ、サードパーティのFrameworkをAppleScriptから呼び出して利用することが、macOS 10.10以降で一般的になってきました、ところが、macOS 10.14以降ではmacOSのセキュリティ機能が強化され、ユーザーフォルダに存在するFrameworkを呼び出して実行することができなくなりました(SIPを解除するとこの制限はなくなります)。

Script Debuggerは、このmacOS 10.14以降の環境で、github上で公開されているオープンソースのFrameworkをビルドして呼び出したいような場合に、SIPを解除せずともFramework呼び出しが行える環境です。

また、macOS 10.15でAppleScriptアプレットにFrameworkを同梱して呼び出すようなやり方がSIPによって禁止されましたが、これもScript Debuggerのアプレット書き出し(Enhanced)を利用することで、Frameworkを同梱して実行できるAppleScriptアプレットを作成できます。

3週間の試用期間を過ぎてもLiteモードで機能制限版として使用可能

そこに、今回のScript Debugger 7で「Liteモード」が用意されました。使用期限が切れても、機能制限版のScript Debuggerとして動作するモードです。このLiteモードの状態でもApple純正のスクリプトエディタよりも高機能です(AppleScript書類の書式にアクセスできない以外は)。

ちなみに、Xcode上でGUIベースのアプリケーションをAppleScriptで組もうとしたときに、Script Debuggerなどのまともな外部AppleScriptエディタは必須のものです。

Posted in How To Tools | Tagged Script Debugger | Leave a comment

電子書籍(PDF)をオンラインストアで販売中!

Google Search

Popular posts

  • 開発機としてM2 Mac miniが来たのでガチレビュー
  • macOS 13.6.5 AS系のバグ、一切直らず
  • CotEditorで2つの書類の行単位での差分検出
  • Apple純正マウス、キーボードのバッテリー残量取得
  • macOS 15, Sequoia
  • 初心者がつまづきやすい「log」コマンド
  • 指定のWordファイルをPDFに書き出す
  • Adobe AcrobatをAppleScriptから操作してPDF圧縮
  • Pages本執筆中に、2つの書類モード切り替えに気がついた
  • メキシカンハットの描画
  • 与えられた文字列の1D Listのすべての順列組み合わせパターン文字列を返す v3(ベンチマーク用)
  • 2023年に書いた価値あるAppleScript
  • Pixelmator Pro v3.6.4でAppleScriptからの操作時の挙動に違和感が
  • AdobeがInDesign v19.4からPOSIX pathを採用
  • Safariで「プロファイル」機能を使うとAppleScriptの処理に影響
  • Numbersで選択範囲のセルの前後の空白を削除
  • Cocoa Scripting Course 続刊計画
  • macOS 14.xでScript Menuの実行速度が大幅に下がるバグ
  • AppleScriptによる並列処理
  • NaturalLanguage.frameworkでNLEmbeddingの処理が可能な言語をチェック

Tags

10.11savvy (1102) 10.12savvy (1243) 10.13savvy (1392) 10.14savvy (587) 10.15savvy (438) 11.0savvy (283) 12.0savvy (209) 13.0savvy (182) 14.0savvy (132) 15.0savvy (109) CotEditor (64) Finder (51) iTunes (19) Keynote (115) NSAlert (61) NSArray (51) NSBitmapImageRep (20) NSBundle (20) NSButton (34) NSColor (53) NSDictionary (28) NSFileManager (23) NSFont (21) NSImage (41) NSJSONSerialization (21) NSMutableArray (63) NSMutableDictionary (22) NSPredicate (36) NSRunningApplication (56) NSScreen (30) NSScrollView (22) NSString (119) NSURL (98) NSURLRequest (23) NSUTF8StringEncoding (30) NSView (33) NSWorkspace (20) Numbers (75) Pages (54) Safari (44) Script Editor (27) WKUserContentController (21) WKUserScript (20) WKWebView (23) WKWebViewConfiguration (22)

カテゴリー

  • 2D Bin Packing
  • 3D
  • AirDrop
  • AirPlay
  • Animation
  • AppleScript Application on Xcode
  • Beginner
  • Benchmark
  • beta
  • Bluetooth
  • Books
  • boolean
  • bounds
  • Bug
  • Calendar
  • call by reference
  • check sum
  • Clipboard
  • Cocoa-AppleScript Applet
  • Code Sign
  • Color
  • Custom Class
  • dialog
  • diff
  • drive
  • Droplet
  • exif
  • file
  • File path
  • filter
  • folder
  • Font
  • Font
  • GAME
  • geolocation
  • GUI
  • GUI Scripting
  • Hex
  • History
  • How To
  • iCloud
  • Icon
  • Image
  • Input Method
  • Internet
  • iOS App
  • JavaScript
  • JSON
  • JXA
  • Keychain
  • Keychain
  • Language
  • Library
  • list
  • Locale
  • Localize
  • Machine Learning
  • Map
  • Markdown
  • Menu
  • Metadata
  • MIDI
  • MIME
  • Natural Language Processing
  • Network
  • news
  • Noification
  • Notarization
  • Number
  • Object control
  • OCR
  • OSA
  • parallel processing
  • PDF
  • Peripheral
  • PRODUCTS
  • QR Code
  • Raw AppleEvent Code
  • Record
  • rectangle
  • recursive call
  • regexp
  • Release
  • Remote Control
  • Require Control-Command-R to run
  • REST API
  • Review
  • RTF
  • Sandbox
  • Screen Saver
  • Script Libraries
  • sdef
  • search
  • Security
  • selection
  • shell script
  • Shortcuts Workflow
  • Sort
  • Sound
  • Spellchecker
  • Spotlight
  • SVG
  • System
  • Tag
  • Telephony
  • Text
  • Text to Speech
  • timezone
  • Tools
  • Update
  • URL
  • UTI
  • Web Contents Control
  • WiFi
  • XML
  • XML-RPC
  • イベント(Event)
  • 未分類

アーカイブ

  • 2025年2月
  • 2025年1月
  • 2024年12月
  • 2024年11月
  • 2024年10月
  • 2024年9月
  • 2024年8月
  • 2024年7月
  • 2024年6月
  • 2024年5月
  • 2024年4月
  • 2024年3月
  • 2024年2月
  • 2024年1月
  • 2023年12月
  • 2023年11月
  • 2023年10月
  • 2023年9月
  • 2023年8月
  • 2023年7月
  • 2023年6月
  • 2023年5月
  • 2023年4月
  • 2023年3月
  • 2023年2月
  • 2023年1月
  • 2022年12月
  • 2022年11月
  • 2022年10月
  • 2022年9月
  • 2022年8月
  • 2022年7月
  • 2022年6月
  • 2022年5月
  • 2022年4月
  • 2022年3月
  • 2022年2月
  • 2022年1月
  • 2021年12月
  • 2021年11月
  • 2021年10月
  • 2021年9月
  • 2021年8月
  • 2021年7月
  • 2021年6月
  • 2021年5月
  • 2021年4月
  • 2021年3月
  • 2021年2月
  • 2021年1月
  • 2020年12月
  • 2020年11月
  • 2020年10月
  • 2020年9月
  • 2020年8月
  • 2020年7月
  • 2020年6月
  • 2020年5月
  • 2020年4月
  • 2020年3月
  • 2020年2月
  • 2020年1月
  • 2019年12月
  • 2019年11月
  • 2019年10月
  • 2019年9月
  • 2019年8月
  • 2019年7月
  • 2019年6月
  • 2019年5月
  • 2019年4月
  • 2019年3月
  • 2019年2月
  • 2019年1月
  • 2018年12月
  • 2018年11月
  • 2018年10月
  • 2018年9月
  • 2018年8月
  • 2018年7月
  • 2018年6月
  • 2018年5月
  • 2018年4月
  • 2018年3月
  • 2018年2月

https://piyomarusoft.booth.pm/items/301502

メタ情報

  • ログイン
  • 投稿フィード
  • コメントフィード
  • WordPress.org

Forum Posts

  • 人気のトピック
  • 返信がないトピック

メタ情報

  • ログイン
  • 投稿フィード
  • コメントフィード
  • WordPress.org
Proudly powered by WordPress
Theme: Flint by Star Verte LLC