macOS 12 beta9が出てきています。もう、リリース間近というより大した問題がなければbeta 8でリリースしていたのでしょう。
AppleScript系では、Cocoa Scriptingの処理速度の低下は観測されていません。Beta 5以降はほぼ誤差の範囲内の変化しかありません。これはいいことです。
あいかわらず、日本語環境でNSDataDetectorで自然言語テキストからの電話番号の抽出に失敗します。これは、少し不幸なことですが、修正されることを期待したいところです。
macOS 12 beta9が出てきています。もう、リリース間近というより大した問題がなければbeta 8でリリースしていたのでしょう。
AppleScript系では、Cocoa Scriptingの処理速度の低下は観測されていません。Beta 5以降はほぼ誤差の範囲内の変化しかありません。これはいいことです。
あいかわらず、日本語環境でNSDataDetectorで自然言語テキストからの電話番号の抽出に失敗します。これは、少し不幸なことですが、修正されることを期待したいところです。
macOS 12 beta 7が出てきました。macOSのリリースはiOS/iPadOSの後にリリースされるのが通例(というか、技術的にそうしないと無理)で、β番号から見て割とβ版の末期にあるものと推測されます。
例年だと、8月の終わりのmacOSの出来でRelease時の品質が推し図れています(農作物みたいだ)。
macOS 10.13:Beta中はとても好感触 → Release版で大事故(前代未聞の大惨事。macOS Vistaと呼ばれる) macOS 10.14:Beta中、バグが多くて使う気になれず → 最終版(macOS 10.14.6)まで様子見 macOS 10.15:Beta中、8月末に大事故。開発者がそろって「こいつは新たなmacOS 10.13だ」として見放す。8月中にmacOS Vista 2のあだ名が確定 macOS 11:Beta中の印象は好感触(Intel Mac)。だが、Release後にM1 Macハードウェアがらみの未知の問題点が多数報告される
というのが、ここ最近のmacOSのリリースの流れです。
macOS 10.13、10.15と「奇数番号は地雷」という状態で、この命名法則でいえば「10.17」にあたるmacOS 12は、不吉な予感を抱かせるものでした。
自分はmacOS 10.15を全力で見送り、macOS 10.14.6をメイン環境にすえました。通例、新たなmacOSがリリースされるとScript環境まわりの評価記事を書きますが、10.15ははじめて評価記事をボイコットしたほどひどいものでした。
「10.15がひどい」という中には、「①本当にバグや不具合のもの」「②勝手に仕様変更して周知しなかったもの」「③OS全体のセキュリティ強化にともない、結果として機能不全になったもの」など多々あります。
その後、M1 Mac mini導入にともないmacOS 11に環境を移しました。M1 Mac mini+macOS 11は、世間の評判もよく、安住の地となるはずでした。
ところが! M1 Mac miniを開封して1時間もたたずに血の気がひきます。Cocoa Scriptingを多用している現代のAppleScriptを走らせると、2012年のMacBook Pro Retina 2012よりも10倍ぐらい遅かったからです。
調べてみると、macOS 10.15の時代からCocoa呼び出しで大幅なスピード低下が発生しており、その延長線にあるmacOS 11も同様の現象が発生。
さらに、M1に搭載されたCPUコアのうち、高性能コアではなく省エネコア(Ice Storm)を使用してAppleScriptが実行されているようで、2011年のMacBook Airよりも数倍M1 Mac miniが遅い処理が出てくる状況でした。
そこで、Shane Stanleyと相談してAppleに詳細なレポートを提出し、「おまえんとこの最新鋭機種は10年前のへっぽこマシンよりはるかに遅いぞ、どうしてくれる?」という報告をしたわけです。もちろん、M1 Mac mini購入後のアンケートでは「10年前のIntel Macの10倍も遅い。不満」と答えています。
運よく、レポートが功を奏してM1がらみの速度低下問題はmacOS 12beta 5で解決。同時にmacOS 10.15から発生していたCocoa呼び出しの速度低下問題も解決(たぶん)。このことで、Intel Macでも、速度低下発生前のmacOS 10.14より高速な処理が行えるようになったほどでした(もちろん、macOS 10.15や11よりも高速です)。
この問題の検証のため、手元のアップデート可能なMacは2台ともmacOS 12に上げてしまい、先日リリースされたmacOS 11.6においてパフォーマンス低下問題がフィードバックされたのかどうかは検証できません。
さて、macOS 12beta7ですが、ベンチマークを実施したところBeta 5、6と同様にCocoa Scriptingの速度は維持されています。Beta5よりも速くなった処理がある一方で、若干速度低下した項目も見られますが、誤差の範囲内でしょう。
▲同一ハードウェアでOSのアップデートにともない、速度低下が解消され、高速化
▲約700箇所の位置情報と8,000箇所の駅の位置情報との間での最短距離計算。macOS 11+M1 Macでは1時間かかって気を失いかけたが、いまではiMac Proより2.5倍高速の異次元の速さを実現。これなら、ScripterにもApple Silicon Macをおすすめできます
一方で、日本語環境でのみ発生しているNSStringからのData Detectorによる電話番号ピックアップができないバグは直っていません。GUI部品のお守りよりもデータ処理を行うことが多いAppleScript界隈としては「無視できない問題」です。
Release版では直ってほしいですよね>誰となく
また、macOS 11で確認された特定ハードウェア(Mac Pro 2019)で関数計算を間違えるバグについては、当該機種を所有していないため、自分には追跡調査は行えていません。
macOS 12 beta6が出てきました。beta 5でM1 Mac上でのAppleScript実行速度低下が大幅に改善され、そのアップデート版であるbeta 6で「先祖返り」していないかを確認。beta 5と同程度か、少し高速になっている処理もあるようです(気持ち速いぐらい)。
でも油断はできません。macOS史上最悪最低のmacOS 10.13のときには、Release前には何も問題がなく順調にバグがつぶされてきたのに、Release版はBeta以下という出来でした。
あのmacOS 10.13の開発プロジェクトを思えば、Release版を見るまで結論は出せません。
追記1:
Beta 6に、NSDataDetector経由で電話番号を取得できないというバグを見つけました(レポート済み)。プログラミング言語ではなく、ユーザー環境の設定言語に依存して発生するようです。いまのところ、日本語環境で問題が発生し、英語環境では発生していません。
以前から本Blogでは、M1 Mac+macOS 11上でAppleScriptの実行、とくにCocoaの機能呼び出しが10〜77倍遅くなるという件についてレポートしてきました。
–> macOS 11, AppleScriptをFirestormではなくIcestormで実行か?!
CPUの乗り換え直後ということもあり、淡々とAppleにバグレポートしつつ、周囲には「まだM1に手を出すべきではない」と話していたものが、最新のmacOS 12 beta 5においてどの程度変わったのでしょうか?
AppleScriptのコミュニティ的には「macOS 10.15をインストールするとCocoa Scriptingが遅くなる問題」(Intel Mac)があり、そのうえに「M1でAppleScriptの実行+Cocoa Scriptingが遅くなる問題」の2つの問題を抱えていました。
macOS 10.15以降の速度低下問題は、自分がmacOS 10.15を「ダメ環境」としてパスし、M1 Macの導入にともないOSバージョンを1つ飛ばしてmacOS 11に移行したときにはじめて認識しました。
Mac App Storeに出している、AppleScriptで組んだアプリケーションの数々が、さぞやM1 Mac上で処理速度が向上して、より快適に使えるに違いない……と、ルンルンで箱を開けてテストをしだして、「遅い!! MacBook Pro Retina 2012より遅いとはどういうこと?!」と、落胆の表情に変わるまで1日も必要ありませんでした。
とくに期待していた時間のかかる大規模データ処理が、MacBook Pro Retina 2012の10倍以上遅いという結果に言葉を失い、Appleにこれを「バグレポート」としてレポートすることになったのです。
メール.appの起動やSafariの操作など、日常的な操作の範囲では噂どおりの処理性能を発揮していたのに、AppleScriptの処理だけ遅いというのは、これはもう明らかに「異常事態」です。
身の回りにあるMacをかき集めて調べてみました。現用機でこのベンチマークに参加していないのは奥方様のMacBook Air 2015ぐらいです。
今回、青い色で指し示しているmacOS 12 beta 5環境が注目点です。M1 Mac miniおよびIntel Mac mini 2014にmacOS 12 beta 5をインストールし、速度の変化を検証しました。
結論から言うと、macOS 12 beta 5ではM1 MacでmacOS 11.xの30倍、Intel Macで10倍ぐらいCocoa Scriptingの実行が高速になっています。
これは、冒頭で説明した(1)macOS 10.15で発生した何らかの内部的なミス (2)M1 Mac上でAppleScriptの処理系が明らかにIcestorm(電力効率のよいローパワーCPUコア)で処理されてしまっていたこと の2つの問題が解消されたため、と推測しています。
これらの組み合わせによって、Intel MacでもM1 Macでも処理速度が大幅に向上した、という「現象」のみが確認できているだけです。
DNAの塩基配列「T」「C」「G」「A」のすべての順列組み合わせパターンを計算する計算(Permutation)です。桁数が多くなるとデータ量と計算量が膨大に増えるのと、Cocoa Scripting導入の有用性を示す演算内容(Vanilla AppleScriptより桁違いに高速)でもあるため、4〜8桁のPermutationを採用しました。以下、グラフ内の横軸の単位はすべて「秒」です。
Machine 4が前の開発環境(MacBook Pro Retina 2012)で、これを基準に「速い」「遅い」という比較を行っています。
アップデート前のM1 Mac mini+macOS 11の環境はMachine 4よりもはるかに遅くて「使っていられない」状態でしたが、アップデート後の環境(Machine 1’)ではMachine 4の2倍強、アップデート前からは平均で27倍の速度向上を実現。
Intel MacでもmacOS 11から12への移行で11〜21倍程度、高速化しています。
M1+macOS 11の環境では「要素数の多い配列の操作」と「乱数の生成」(AppleScriptのrandom number)がとくに遅いという傾向が出ていたので、10万要素、20万要素、30万要素の配列でベンチマークを行いました。ただし、本ベンチマークでは乱数の生成を最速の方法で計算しているため、M1 Macで1.3倍速、Intel Macでも同程度の速度向上になっています。とくに、要素数が少ないほど速度向上の割合が増えており、これは歓迎できる傾向です。
AppleScriptのrandom number関数を用いて1〜99999999の範囲の乱数を1万回生成して配列に追加するベンチマークです。初回実施時にはこれでM1 Mac mini+macOS 11の環境が、MacBook Air 2011+macOS 10.13の5倍の処理時間がかかるという衝撃の数値が出た内容です。
macOS 11から12 beta 5へのアップデートに伴い、M1 Macで30倍、Intel Macでも12倍速度が向上していることを確認しています。
どこまでも「次世代Apple Silicon Mac用OSのβ版」という印象が強かったmacOS 11から、AppleScript+Cocoa呼び出しについては機能の改善が行われ、macOS 10.15で失った処理速度をIntel Macでも回復できているように見えます。
自分が大規模データ処理+演算速度の目安に用いている、「約700箇所の日本全国のゲームセンターについて、全国の鉄道駅(約8,000箇所)との距離を求め最短のものを最寄駅とし、それぞれ最寄駅までの距離が短い順にソートする」計算の結果を見てみると、
MacBook Pro Retina 2012:7分13秒 iMac Pro:4分17秒 M1 Mac mini:1分42秒
と、iMac Proを大きく上回る結果を叩き出しています。あまりに速いので、計算内容が間違っているのではないか? とか、計算結果が出力されないのではないか?? などと疑問に思って何度も調べてみましたが、きちんと計算されています。間違いなく、これまでに遭遇したMacの中で最も高速にAppleScriptを実行する環境といえます。この速さは、異次元のレベルです(力説)。
正直なところ、Cocoa Scripting Course本掲載のサンプルAppleScriptをM1 Mac mini+macOS 11で動かしたときには「イヤな汗」が出まくりました。高速なCocoa Scriptingだぜキャッホー(奇声)! などとノリノリで書いていたものが、
「残念なお知らせです。いま、Vanilla ScriptingのソートルーチンにCocoa Scriptingのソートルーチンが抜かされました」
などと書けるでしょうか? いや、書けるわけがない(反語)。本件は、Cocoa Scripting本の続刊を書く手が止まってしまうぐらいの(よくない方向への)インパクトがありました。
かくして、そこから詳細な調査や問題傾向の炙り出しなど、表沙汰にできない調査と資料作成がはじまったわけで、一応こういう形で(いい方向に)問題が解決されて本当によかったデス。これで解決されなかったら、海外のYouTuberにチクリまくってセンセーショナルな方向で炎上させるしかない、と割と本気で思っていたほどでした。だいたい、自分にしかレポートできないのに、時間と何かを失って何も得られない膨大な作業。Appleが自分でチェックする能力がない一方で、この無償奉仕労働を強いられるのが納得できません。
macOS 12については期待が持てる内容ですが、これがいまだ現用環境であるmacOS 10.15やmacOS 11へのフィードバックが可能な内容なのか、あるいはmacOS 12の登場を待たなくてはならないのかは現時点ではわかりません。
ただ、ここ数年というもの(2020年は珍しい例外)、このぐらいの時期(8月後半)になると「またAppleの現場が無茶な仕様追加を行って開発プロジェクトが崩壊した」「Release版のひどさがいまから感じられるので、アップデート禁止」といった話題しか出ていませんでした。それが、「macOS 12には期待できる」という話ができるのは、喜ばしいことでしょう。
# Beta版では素晴らしかったのに、Release版で別物が壊滅的な出来でリリースされた「macOS 10.13」という悪しき前例があるので、Betaがよくても安心できない今日このごろです。「どうして10.13がああなったのか」という説明は一切ないままなので、いまひとつ信頼できません
Mac App Storeに出している各種アプリケーション(すべてAppleScriptで記述)の動作が、macOS 12 beta5上であればひじょうに高速です。
UNI detector+macOS 12 beta5 DEMO
Watch kamenoko_M1+macOS 11 DEMO
Watch Kamenoko_M1_macOS 12 beta5 DEMO
FileMaker Proに組み込んで大規模なCocoaの機能を呼び出しているAppleScriptの動作も快適になっています。
Watch M1+macOS11 MkMapView Demo
Watch M1+macOS12 beta5 MkMapView Demo
CotEditorと組み合わせて動かしている「CotEditor PowerPack v3」のAppleScriptも、macOS 12beta 5上できわめて高速に動く様子がわかります。
Watch CotEditor_M1+macOS11 DEMO
Watch CotEditor_M1+macOS12 beta5 DEMO
Numbers.appで選択中の範囲のセルをシャッフルするAppleScriptをmacOS 12beta5で動かしたもので、左がIntel Mac mini 2014、右がM1 Mac mini 2020です。
numbers_selection_shuffle_intel_M1_12beta5
これはAppleScriptに関する処理だけにとどまるものではないようです。Terminal.app上で動作させる各種CLI系のプログラムの動作時のCPU Coreの割り当ても変化しており、よりパフォーマンスを発揮する方向に「味付け」が変化しているように見えます。
ただ、CLIベースのプログラムについてまとまったベンチマークを行なっているわけではないため、実際に動作させている数少ない膨大な処理時間のかかるプログラム(PDF内の画像サイズ圧縮のために併用しているGhostScript)を見ている範囲で、アクティビティモニタ上のCPU各コアの動きが変わっているように見える、ということです。
KeynoteをGUI Scripting経由で操作したときに、Stream Deck制御ソフトウェアに「Keynote」プラグインが入った状態だと、異常が発生する件の続報です。
Stream Deckソフトウェアに「Keynote」操作プラグインをインストールすると、GUI Scriptingからの本物のKeynote.appにメニュー操作を要求しても「そんなものはない」と言われてしまうというのが、この問題の概要です。
elgatoに問い合わせ、Appleにバグレポートし、elgatoからは一向に返事も何も返ってこない(elgatoから返事をもらったことがない)のですが、Appleの担当者とやりとりしてこの奇怪現象の発生メカニズムが見えてきました。
Stream DeckのKeynote操作プラグインをインストールした状況でアクティビティモニタを調べると…
なんと、不可視のStream Deckプラグインのプロセスの名称が「Keynote」という名前になっていたのが原因だったようです。そこ、「Keynote_control」とか少しはひねった名前にしようよ、、、、>elgato
どれだけ複雑で悪辣な仕組みになっているのかと思っていたら、これだけ。
Appleの担当者から提案された対策コードはこんな感じで、実際に自分で動作確認しつつ、少しだけ手直ししてみました。これで、Stream DeckのKeynote操作用プラグインの不可視プロセスが「Keynote」なんて名前で実行されていても問題ありません。いやはや。
AppleScript名:Keynoteの各メニュータイトルをGUI Scriptingで取得する.scpt |
tell application "System Events" set tProcList to every process whose name is "Keynote" and its background only is false if tProcList = {} then return tell (first process whose name is "Keynote" and background only is false) –ここ、変数に代入するとダメ!! tell menu bar 1 set mList to title of every menu bar item –> {"Apple", "Keynote", "ファイル", "編集", "挿入", "スライド", "フォーマット", "配置", "表示", "再生", "共有", "ウインドウ", "ヘルプ"} end tell end tell end tell |
GUI Scriptingを(メニューやキーボードショートカットについては)ラッピングして、ファイル名に「アプリケーション名@メニュー項目名>メニュー項目」などと書くだけで該当するメニュー項目の実行を行える「Piyo Menu Clicker v1.0 for Stream Deck」のリリース候補版を試していたら、macOS 11.5+Keynote 11.1でエラーが出まくりました。
# その後の調査により、よりによってStream Deckの制御ソフトウェア「Stream Deck.app」が起動しているとこの問題が発生することがわかりました。Stream Deck用の制御Scriptを使おうとしたらStream Deckのソフトウェア自体が実行を邪魔していたとは….
メニューバーのメニュー項目を指し示そうとして、
AppleScript名:Keynoteで新規書類を実行.scpt |
activate application "Keynote" tell application "System Events" tell process "Keynote" click menu item 1 of menu 1 of menu bar item 3 of menu bar 1 end tell end tell |
のようなお気軽な内容を試してみたところ、エラーに。メニューが存在していて、GUI側からマウスで普通に操作できるのですが……
他のPagesであるとかSafariなどで同様の記述を行なってもエラーになりません。Keynoteだけ問題が発生しているようです。
AppleScript名:Pagesで新規書類を作成.scpt |
activate application "Pages" tell application "System Events" tell process "Pages" click menu item 1 of menu 1 of menu bar item 3 of menu bar 1 end tell end tell |
AppleScript名:Safariで新規ウィンドウを表示.scpt |
activate application "Safari" tell application "System Events" tell process "Safari" click menu item 1 of menu 1 of menu bar item 3 of menu bar 1 end tell end tell |
Keynoteのmenu bar 1に対してmenu bar itemのtitle(メニュー項目のテキスト)を求めると、「Apple」しか返ってきません。
tell application "System Events"
tell process "Keynote"
tell menu bar 1
set mList to title of every menu bar item
–> {"Apple"}
end tell
end tell
end tell
★Click Here to Open This Script
iOSアプリをM1 Mac上で起動した場合にこのような挙動になるのか調べてみても、ちゃんとiOSアプリもメニュー項目を取得できます。iOSアプリについては(苦労はするものの)AppleScriptから強引に操作することは可能なので、Keynoteよりは出来がいいといえます。
追記:
手元にあるバージョンの異なるmacOS環境でこの処理を試してみました。
macOS 12.0beta+Keynote v11.1→異常
macOS 11.5+Keynote v11.1→異常
macOS 10.15.7+Keynote v11.1→正常
macOS 10.14.6+Keynote v10.1→異常
macOS 10.13.6+Keynote v9.1→正常
追記2:
異常が出ていた環境では、すべてStream Deckの制御ソフトウェアをインストールして起動していました。Stream Deck.appを終了させると問題が発生しないことを確認しました。Stream Deck Softwareのせいでした。
Stream Deckから各種ソフトウェアを操作するために作ったソフトウェアが、Stream Deckソフトウェアによって実行を阻害されているという事実の前に言葉もありません。
elgatoのWebフォームからレポートを送っていますが、elgatoにはいろいろ送っても、一度も返事をもらったことがないのでなんとも(日本代理店のソフトバンクC&Sとは確認のためにやりとりしていますが…)。
厳密に言うと、Stream Deckのオンラインストアから入手可能な「Keynote」プラグイン(Keynoteのプレゼン再生コントロールを行うelgato製のプラグイン)をインストールするとGUI ScriptingのKeynoteに対する実行が阻害されます。
–> Elgato Keynote plugin checking demo
▲まさか、elgato純正のプラグインがKeynoteへのGUI Scriptingの実行(メニューへのアクセス)を妨害しているとは思いませんでした。このプラグインはインストールしてはいけないものだと思います。機能もたいしたことはないし、害悪でしかありません。即刻Storeから撤去してほしいものです
macOS 11で発生していた「NSString’s stringWithFormat:」をAppleScriptから呼び出すとクラッシュするというバグが、最新のmacOS 11.5BetaおよびmacOS 12.0Betaで修正されていることを確認しました。
→ macOS 11.5正式版がリリースされ、修正されていることを確認。逆にいえば、AppleScriptでCocoa Scriptingを用いて作ったプログラムは、macOS 11.0〜11.4の環境を動作条件から外す(動作要求条件を11.5以上にする)必要があるということです。
クラッシュしなくなりましたね。問題点について、気がついたらレポートして念押しして、修正内容を確認するという地道な作業の繰り返し、積み重ねで世界の平和が維持されているのでありました。
▲Uni Detector v1.2.1もNSString’s stringWithFormat:メソッドがクラッシュしなくなったおかげで、ちゃんとCPUアーキテクチャごとの構成比率グラフを実行してもアプリケーションごとクラッシュしなくなりました
すでにAppleにフィードバックしている内容ではあるのですが(修正されることを祈るばかりです)、NSStringのstringWithFormat:メソッドがmacOS 11ではエラーになります。エラーというよりも、実行処理系そのものがクラッシュします(確定した事実)。
これと似た記法を行う「NSPredicate predicateWithFormat:」も同様にエラーになることが判明しました。こちらはクラッシュを発生させるほどではありませんが、これまでのOSバージョンで動作していた記法がエラーになっています(勘違い)。
どうもこれらの発生原因は同じような処理の箇所のように見えるため、macOS 11では「withFormat:」のAPIが、AppleScriptからScripting Bridge経由で呼び出すと一律にエラーになるものと想像しています。
→ テストに使用したScriptに間違いがあって、macOS 10.15以前では「たまたま動いていた」ということがわかりました。「NSPredicate predicateWithFormat:」自体でエラーが出ていたのではなく、その中に書いていたPredicate文に間違いがあったことがわかりました(確認・確定した事実)
macOS 11.4betaとMusicで動作確認を行っていたところ、怪奇現象に直面しました。
アプリケーションの名称を取得するという、たいへんにおかわいらしいレベルのAppleScriptを書いて実行したところ、propertiesでまとめて属性値を取得したときと、個別にnameを取得したときで、処理結果が異なります。
propertiesでまとめて取得するとローカライズされたアプリケーション名「ミュージック」が返ってきて、nameで個別に取得すると「Music」が返ってきます。
下手クソなのか? おもいっきり下手くそが開発してるのか??? なんか、学生レベルの人間が担当しているように見えます。
printコマンドでプリンタを指定して出力をする機能がmacOS 10.14から10.15、11.xまですべて利かなかったのが、11.3だか11.4Betaで直っていますね。
# 11.3がリリースされた直後に11.4Betaが降ってきて、どちらで修正されたのか自分には判断できません。少なくとも11.4Beta上ではプリンタ指定ができています
黒歴史入り確実なこのバグ、とっとと「なかったこと」にしたかったのか、さすがにド派手な機能だったからなのか、直っていますね。もしかしたらこれまでにも、細かくバグを出していたのかもしれませんが、ソフトウェア的にプリンタ名を取得する手段が提供されてこなかったので、そのバグが「見えていない」だけだったのかもしれません。
AppleScript Engineering Teamも、AppleScript Studioのお守りから解放されたので、前向きな機能の実装にもパワーを割いてほしいところです。個人的には、Blocks構文が必要なCocoa APIを呼べるようにしてほしいですわ。
iWork Apps(Keynote、Numbers、Pages)がバージョン11.0にアップデートされました。
3アプリ共通でAppleScriptから書類のパスワード設定確認、パスワード設定の機能が追加されています。
また、Keynote v10.3.5、v10.3.8とmovie書き出し時のCodec指定オプションに「h.264」とAppleScriptの処理系ではエラーになる記号を含む予約語が入っていたのですが、これがv11.0で「h264」と修正されました。
# 記号を含む予約語は禁止されています。「C++」とか(Fine Reader OCR Proに入っていますわー)
実際に動作確認してみないとまともに動くかどうかは不明ですが、用語辞書上では修正されています。報告して半年以内で修正されたので、修正も何もされないよりはマシでしょう。正直なところ、こんな程度の低いバグは事前にチェックして解消してほしいところではあります(Mac App Storeに一般開発者が出したらリジェクトされるレベル?)。
ちょいちょいAppleScriptの瑣末な機能を追加していただけるのはありがたいのですが、ページ内の選択中のオブジェクトへのアクセス(selected itemsとか)を用意してほしいところです。現状ではselectionで取れるのはページ(slide)単位だけです。
また、text itemの縦書き(Vertical)属性にもアクセス(Read/Write)できてほしい気がします。Keynote書類上にWord Cloudを作成するときにScriptから素直にオブジェクト回転ができずに困ります(GUI Scriptingで強引にやってるんですけれども)。
▲Keynote v11:documentに「password protected」属性(Read Only)と、「set password」コマンドが追加
Keynote v11.0上で動作確認ずみ。ただし、いったんパスワードを設定した書類は、GUI側からしかパスワード解除できない点に注意。また、AppleScriptからのKeynote書類オープン時にパスワードを指定してオープンすることもできないので、当該書類のパスワードをKeychainに保存しないと書類オープン時のパスワード入力をパスできない。こちらはちゃんと(h.264と違って)動作確認したらしい。でも、油断はできない。それがAppleクオリティ。
▲Numbers v11:documentに「password protected」属性(Read Only)と、「set password」コマンドが追加
▲Pages v11:documentに「password protected」属性(Read Only)と、「set password」コマンドが追加
▲Pages v11:exportコマンドのexport optionsに「include comments」属性と、「include annotations」属性が追加
ケアレスミスで、「Scroll BarをWindowの枠外に配置してしまった」Uni Detector v1.2のリテイク版、v1.2.1をリリースしました。
▲MacBook Air 11インチを基準に、このマシンで最低限の操作が行えることを想定したUser Interface
バージョン1.2以降のUni DetectorのAppleScript用語辞書には、「check arch」のコマンドしか用意していませんが、Sandboxのセキュリティを乗り越えつつ必要な機能(ユーザーによる任意の指定フォルダ以下のアプリケーションのチェック)を実現することが目的です。
本来のScriptableなアプリケーションの意義を考えると、アプリケーションのチェック結果をリストで取得するべきですが、さすがに無償配布アプリケーションでそれはやりすぎなので、実装を控えています。
AppleScript名:アプリケーションのプロパティを取得.scpt |
tell application "Uni Detector" properties end tell –> {frontmost:false, class:application, name:"Uni Detector", version:"1.2.1"} |
AppleScript名:指定アプリケーションをUni Detectorでチェック.scpt |
use AppleScript version "2.7" –macOS 10.13 or later use scripting additions use framework "Foundation" set anApp to choose file of type {"com.apple.application-bundle"} with prompt "Select target one App" with timeout of 3600 seconds tell application "Uni Detector" set aRes to check arch anApp end tell end timeout |
AppleScript名:指定フォルダ以下にあるアプリケーションすべてをUni Detectorでチェック.scpt |
use AppleScript version "2.7" –macOS 10.13 or later use scripting additions use framework "Foundation" set anApp to choose folder with prompt "Select target Folder" set appList to getFileListWithSpotLight("kMDItemContentTypeTree", "*com.apple.application*", anApp) of me with timeout of 3600 seconds tell application "Uni Detector" set aRes to check arch appList end tell end timeout on getFileListWithSpotLight(aMetaDataItem, aParam, startDir) set sDirText to quoted form of POSIX path of startDir set shellText to "mdfind ’" & aMetaDataItem & " == " & aParam & "’ -onlyin " & sDirText try set aRes to do shell script shellText on error return {} end try set pList to paragraphs of aRes set aList to {} repeat with i in pList set aPath to POSIX file i set aPath to aPath as alias set the end of aList to aPath end repeat return aList end getFileListWithSpotLight |
ついにmacOS 11.0, Big Surが正式リリースされました。これほどリリースが待ち遠しく、リリースを恐れていたOSバージョンもありません。機能的にはいいのに、見た目がアレな、ある意味「次世代のmacOSのPublic Beta」みたいな位置付けです。バージョン0.xから始まるのも初めてですし。1.0未満だと受け取っておきましょう。
→ その後、マイナーアップデート版が「11.1」であることが判明し、今後は「12.x」「13.x」とiOSライクなナンバリングが施されることがうかがわれます。
ハードウェア面では「M1搭載のファンレスのMacBook AirがCore i9のCPUを蹂躙する図」が展開されているなど絶好調ですが、ソフトウェア面ではいろいろ(見た目に)問題があります。
macOS 11.0.1について、AppleScript的には大きな違いはありません。大きな違いというのは、macOS 10.15からの大きな違いということです。10.15のあまりの不具合の多さに、β段階で「毒の沼」認定してメイン環境で利用することを放棄したため、個人的には11.0にすぐ移行したいところです(検証用のMac mini 2014しか対応ハードウェアがない問題)。
macOS 11.0搭載のAppleScriptはあいかわらずバージョン2.7。スクリプトエディタもビルドが少し変わったぐらいでバージョンは同じです。
スクリプトエディタのヘルプが、macOS 10.13、10.14、10.15と毎回更新されていましたが、今回はその余裕がなかったのか10.15, Catalinaのままです(あとでオンライン更新されるのかも???)。
毎回、OSのアップデートがあるたびに書き換えの必要があるScriptが出てきます。すべてのScriptが必要というわけではないはずですが、理由は大きく分けると以下のとおりです。
(1)Script専用補助アプリケーションやOS標準装備のアプリケーションの機能に変化が生じたり、名前が変わったり、統廃合されたりした
(2)AppleScriptの言語処理系、標準装備のScripting Additionsや標準命令に新たなバグが発生した
(3)OS自体の仕様変更、未知のバグが発生した
(4)GUI ScriptingでメニューなどのGUI部品を指定している箇所が、GUI修正などの理由によりそのままでは動かなくなった
(5)Cocoaの仕様変更により動かなくなったり修正が必要になった
スクリプトエディタのsdefの差分をチェックしてみたところ、macOS 10.14/10.15から変化はありません。つまり、今回は(1)(2)由来の発生の可能性は低いことが期待されます。(4)は当然そうなるものなので(些細な変更で発生するものなので)、必要最低限の箇所に使うべきものです。(5)は、Cocoa自体の仕様変更は割とひんぱんに発生しているので、なんともいえませんが、Cocoa自体に仕様変更やバグがなくてもScripting Bridge定義ファイルのバグや理不尽な変更(主にmacOS 10.13で発生した件。一切説明なし)によって影響を受ける可能性はあります。
カレンダー.appのバンドル内に同梱された大量のAppleScriptもβ時からそのままです。
(何か発見があったら追記)
LateNight Software Blogに掲載された「BIG SUR: LOST PROPERTIES」をGoogle翻訳で読んでみました(ちょっと時間がないので)。
macOS 11.0, Big SurではスクリプトエディタでAppleScriptアプレット書き出しを行うと、
Arm 64/Intel 64のUniversal Binaryで書き出されます。
そして、アプレット書き出し時にCode Signが自動的に行われ(Run Localy)、Apple Developer IDを持っていなくても実行バイナリにCode Signされることになります(Notalizationはまた別)Code Signされるということは、アプレットの情報書き換えが保持されなくなるということであり、property文で設定値を維持しようとしても、実行ごとに内容がフラッシュされる(保持されない)ことになります。
このことはmacOS 10.10ごろから「そういう風になるんだろう」とわかっていたので、property文で設定値を保持するような書き方は一切してきませんでした。設定保存の必要があればUser Defaultsへ書き込み。
サードパーティのOSAX(Scripting Additions)が廃止されることはOS X 10.6の頃からわかっていましたし、OS X 10.10の頃からpropertyで値を保持してはいけないことはわかっていました。
最新の「兆し」は、PowerPC→Intel→Apple Siliconと3世代にわたってメンテナンスされてきた「AppleScript Studioランタイム」(Automatorアクションでこれを使っているものがある)が、いよいよdeprecated扱いになったことです。
もともと、OS X 10.6のときにXcode上から開発用のテンプレートが削除されたためにAutomator Action作成時に積極的にAppleScript Studioの機能を使おうとも思わないのですが、これまで維持され続けてきたというわけです。あれだけの規模のものを、OSのGUI部品が変更され続けていく中メンテナンスしてARM対応まで行なって破棄するとは……自分がその仕事に携わっているならやり切れないものがありますが、既定路線ではあります。
今後、macOS上で実行できるAutomator ActionはAppleScriptObjCベースのものに一本化される、ということです。
この話が出てきたのが何回目だか覚えていませんが、ファイル共有のプロトコル「afp」が使えないようになりました。「smb」のみです。
LAN上の他のマシンやファイルサーバー、NASのボリウムをマウントする処理は割とありふれたものですが、そのためのサーバーの指定方式がsmbに一本化されたという「変化」があったということです。
ファイルサーバーのマウント処理を記述してあるScriptについては、macOS 11.x以降では書き換えの必要があります。
なんなんでしょうね? これは、、、ミスなのか、意図があるのか。
これだけ機能が変わっていたらバージョン番号を変更してほしいところです。
→ 同じバージョン番号のまま大幅に機能が変更されたSystem Events
OSが起動して他のGUIアプリケーションを操作可能な状態になって久しい状態だというのに、System Eventsに対する操作を行おうとしたら、プロセスが起動していないといったエラーが表示されました(macOS 11.3 beta3)。
launchコマンドでSystem Eventsの起動を明示的に行うことで、問題なく操作できましたが、System Eventsに明示的にlaunch操作を行わなくてはならなくなったようです。リリースノートに記載すべきレベルの変更が加わっているように感じます。
こんな基礎的な箇所でバグを作られるとウンザリします。また、使っている箇所が多過ぎてウンザリします。このバグのせいで、Mac App Storeで配布しているUni DetectorのCPUアーキテクチャ別のグラフ表示機能を実行すると(macOS 11.x台、11.5より前では)クラッシュしていました。
–> macOS 11.5で修正されました。macOS 11.0〜11.4の間、この機能がまともに動いていなかったわけです。AppleScriptのプログラムは、macOS 11に対しては最新のバージョン以外はサポートしないということになるでしょう。
AppleScript名:stringWithFormatのじっけん.scptd |
— – Created by: Takaaki Naganoya – Created on: 2021/06/19 — – Copyright © 2021 Piyomaru Software, All Rights Reserved – 本Scriptを実行すると、Intel Mac/Apple Silicon Macの両方でクラッシュします use AppleScript version "2.4" — Yosemite (10.10) or later use framework "Foundation" use scripting additions set dTemp to "chart.data = [{ \"label\": \"Apple Silicon\", \"value\": %@, \"color\": chart.colors.next() }, { \"label\": \"Intel 64 bit\", \"value\": %@, \"color\": chart.colors.next() }, { \"label\": \"Intel 32 bit\", \"value\": %@, \"color\": chart.colors.next() }, { \"label\": \"PowerPC 64 bit\", \"value\": %@, \"color\": chart.colors.next() }, { \"label\": \"PowerPC 32 bit\", \"value\": %@, \"color\": chart.colors.next() }];" set ppc32Count to 1 set ppc64Count to 2 set intel32Count to 3 set intel64Count to 4 set arm64Count to 5 set aDataStr to current application’s NSString’s stringWithFormat_(dTemp, arm64Count, intel64Count, intel32Count, ppc64Count, ppc32Count) as string |
AppleのiWork Appsがv10.3.5にアップデートしました。対象OSはmacOS 10.15以降です。
Keynote v10.3.5のAppleScript用語辞書のexport optionのmovie codecに「H.264」を指定するための定数が前バージョンから引き続き「h.264」になっています。バグ未修正状態です。
これでは、AppleScriptの構文確認をパスできません。AppleScriptの予約語としてこのような記号を途中に入れられないのですが、まるっきり動作確認もバグの所在も認識していない様子です。
みんながUIのお手本にしてきたKeynoteも、今回の10.3.5でこの体たらく。とくにツールバーアイコン。いきなり無色アイコンに変えられて(しかも小さい)、とても使いにくいというか、見えません。
まるでAppleから嫌がらせをされているかのようです。KeynoteのUIをまともにした互換アプリケーションでも誰か出さないだろうかと考えてしまいます。
Macのアプリケーションの中には、Info.plistに「NSAppleScriptEnabled = true」の表記があっても、実際にsdefファイルが入っていなかったり、sdefが入っていても、まったくアプリケーションの機能と関係ないダミー辞書が入っているものがたまにあります。
これを、個人的に「えせScriptable」と呼んでいます。英語に翻訳しづらいですが、Fake Scriptable AppとかDummy Scriptable Appなどと呼ぶところでしょうか。
最悪の「えせScriptable」なアプリケーションはAppleのiBooks Authorでしょうか。電子書籍市場を立ち上げるためには、既存のInDesignなどの他のアプリケーションのデータをiBooks形式にScriptで変換できる必要があると思っていたところに「カス」なAppleScript用語辞書しか入っておらず、「プログラムで変換できないのかー」という落胆をもたらしました。
辞書内容がアプリケーションの機能とぜんぜん合っていない「えせScritable」。実際に、これらの用語を使っても、起動や終了ぐらいはできるものの、アプリケーション本来の機能は1つも呼び出せません。
GUI Scripting経由で無理やりメニュー操作やボタンのクリックは行えますが、これをもって「AppleScriptに対応している」とは言ってはいけないレベルです。
Chipmunk Basicの現行バージョンがScriptableで、本来はAppleScript用語辞書がバンドル中に入っているはずなのですが、確認してみたら入っていないことに気づきました。早速、作者のRon Nicholsonにレポート。さて、どうなりますやら。
現行のUni Detectorでは、これらの「えせScriptable」なアプリケーションも一律「Scriptable」として表示してしまうため、これらをScriptableではないものとして表示を抑止するために専用のデータをバンドル内に格納してチェックするかというところでしょうか。
Microsoft officeの補助アプリケーション類がScriptableな表示になっていますが、単独で起動ができないためにScriptableなアプリケーションの範疇に入れてはいけないところでしょう。ちょっと古めのアプリケーションで、AppleScript Studioで作られているものが存在しており、AppleScript用語辞書が入っているものも見られます。これも、外部からコントロールするための辞書ではないので、正確な意味では「Scriptable」ではありませんが、意外と多いのと古いものが中心なので放置しておいています。
com.nicholson.chipmunkbasic3co 1.368.21 com.kapeli.dashdoc 4.6.7 com.apple.Maps * com.apple.iBooksAuthor * com.peterborgapapps.Lingon3 * com.peterborgapapps.LingonX7 * com.adobe.devicecentral.application * com.readpixel.wakeonlan * com.bombich.ccc * com.microsoft.OrgChart * com.microsoft.myday * com.microsoft.office_pg * com.microsoft.Graph * com.microsoft.entourage.database_utility * com.microsoft.entourage.database_daemon * com.microsoft.outlook.databaseutility * com.microsoft.entourage.databasedaemon * com.microsoft.entourage.ClipGallery * com.microsoft.openxml.chart.app * com.microsoft.openxml.excel.app * com.microsoft.office.uploadcenter * com.microsoft.office.uploadcenter * com.tinyspeck.slackmacgap * org.mozilla.firefox * com.twitter.teitter-mac * com.nchsoftware.wavepod * com.nchsoftware.expressjp * com.digitalspokes.AppKiDo * com.parallels.mobile * com.epson.East-Photo-Scan *
メイン環境にmacOS 10.14.6, Mojaveを入れて使っていますが、自分の環境では先日公開されたアップデート「セキュリティアップデート2020-05」を入れた直後からuniversalaccessd(/usr/sbin/universalaccessd)が頻繁にクラッシュして、クラッシュダイアログがひんぱんに表示されるようになりました。
このおかげで、画面の拡大・縮小の機能が呼び出せなくなってしまいました。普通に作業はできるので、特定のプロセスのクラッシュダイアログが表示されて邪魔なぐらいですが、実に邪魔です。
# 文章を打っている最中に何度もクラッシュダイアログが表示されるので、文章のクオリティが下がりがちです。
→ macOS 10.14.6 Mojave向け「セキュリティアップデート 2020-005」のリテイク版が公開され、すでに同アップデータを適用した環境向けのアップデータにより、本現象は解消されました。目下、universalaccessdがクラッシュダイアログを頻繁に表示される状況は解消されました。
Appleが提供する各種セキュリティアップデートについては、こういう「ハズレ」がたまに入ってくることがあり、信頼度は60%ぐらいでしょうか。自社ハードウェアのみのサポートのくせに100%と言い切れなくなってきたことは由々しき事態です。クレイグ・フェデリギに呪いあれ。
AppleがKeynote/Pages/Numbersのv10.2アッップデートを公開しました。このv10.2から対象OSがmacOS 10.15以降になり、macOS 10.14では最新のKeynote v10.2を使えなくなったことになります。
Keynote v10.2のAppleScript系の機能の差分チェックを(sdefファイルベースで)行ってみたところ、iWorkアプリケーション中でKeynoteのみ機能追加されたことがわかりました。
exportコマンドのexport optionsで「movie codecs」と「movie framerates」の指定ができるように機能追加されています。
movie codecs enum h.264 : H.264 AppleProRes422 : Apple ProRes 422 AppleProRes4444 : Apple ProRes 4444 AppleProRes422LT : Apple ProRes 422LT AppleProRes422HQ : Apple ProRes 422HQ AppleProRes422Proxy : Apple ProRes 422Proxy HEVC : HEVC movie framerates enum FPS12 : 12 FPS FPS2398 : 23.98 FPS FPS24 : 24 FPS FPS25 : 25 FPS FPS2997 : 29.97 FPS FPS30 : 30 FPS FPS50 : 50 FPS FPS5994 : 59.94 FPS FPS60 : 60 FPS
風の噂によるとどうもARM Macはムービー書き出しが高速なようなので、そのあたりをアピールするためにもムービー書き出し系の機能の拡充は必要ということなのでしょう。
同時に、「こんなんAppleScriptの処理系でコンパイル(構文確認)通るわけないやん、メーカーが何やってますのん?」という予約語がsdef内に書かれていることが一目でわかりました。
「h.264?」
この「h.264」の予約語はexportコマンドのexport optionsのmovie codecsのEnum内に書かれています。
<enumeration name="movie codecs" code="Knmc"> <enumerator name="h.264" code="Kmc1" description="H.264"> <cocoa string-value="AVVideoCodecTypeH264" /> </enumerator>
macOS 10.15.6上で確認したところ、見事に構文確認時にエラーになります。
Apple製のアプリケーションのAppleによるスクリプティング定義内容がまともに動きません。こうした事態は理解に苦しむものがあります。100%動作確認していないとしか思えません。
ここは、記号入りの予約語では言語処理系的に構文確認すらパスできないので、「h.264」ではなく記号を含まない「h264」ないし「H264」という予約語にすべきです。AppleScript系の機能を追加していただくのは前向きでよいと思いますが、メーカーとして一度も動作確認しないで機能をリリースするというのはいかがなものでしょう?
そんなところに凝っていないで、選択中のオブジェクトを取れる属性「selected objects」とか、テキストオブジェクトの縦書き制御属性「vertical」などをつけたほうが実用性があって助かります。機能追加自体はたいした作業ではありませんが、ぜひ動作確認した上でリリースしていただきたいところです。
AppleScript名:keynote movie export test |
–Works with Keynote v10.2 or later set aTagFile to ((path to desktop) as string) & "testOut.m4v" tell application "Keynote" set exOpt to {compression factor:1.0, movie format:native size, class:export options} –set exOpt to {compression factor:1.0, movie format:native size, movie codec:h.264, class:export options}–this cause error export document 1 to file aTagFile as QuickTime movie with properties exOpt end tell |
日頃からMac App Storeのレビューアーの血も涙もない(でも、ツッコミどころ満載の)リジェクトに遭っている身からすれば、こんなのリジェクト案件です。
個人的には信頼度の問題からmacOS 10.15は「パス」なので、macOS 11.0 Big SurがRelease時にコケないことを祈るのみです(メールが消えるとかいう話が一番OSの信頼度を下げる)。macOS 10.13, “Vista”という史上最悪・最低の大失敗をやらかして以来、「Release版のOSがBetaよりも低品質」という昨今のmacOS。10.13もBetaの時にはよかったのに、Release版で大崩壊を起こして見るも無残な姿に成り果てました。10.14もBetaの段階でGUI Scriptingの認証系でひどいバグがあって、「とても使えない」と判断。10.14.6まで待ってようやく手を出す気になったほど。
macOS 11.0, Big SurはBeta段階でも珍しく好印象で(GUIまわりの仕様はコロコロ変わるけど)、macOS 10.15みたいにBeta段階で「もう、これはダメ!」という話も聞きません(Relase時に紹介記事を書かなかったOSは10.15がはじめてです。10.15の崩壊度はひどかった)。macOS 11.0, Big Surには、macOS 10.13のような「Release版の大崩壊」を起こしてほしくないものです。
現在Mac App Storeで販売中のKamenoko v1.1には、Mac Pro 2019上でだけ症状が確認されているバグへの対策機能が盛り込まれています。
Mac Pro 2019は三角関数の簡単な計算を間違える「問題マシン」として認識しています(実機ないんで、細かい挙動はわかりません)。
「おそらくこう対策すれば回避できるはず」と想像された方法で機能を実装し、v1.1を動かしたMac Pro 2019ユーザーの知り合いから「大丈夫」との実機確認報告をいただきました。
▲Mac Pro 2019上でのみ報告されているHex Grid座標計算バグ(Kamenoko v1.0+macOS 10.15.5?)
Mac Pro 2019上でのみ、この6角形セルの座標計算でミスが生じることが報告されています。この座標計算はJavaScript Coreの機能をAppleScriptから呼び出して行なっているもので、このJavaScript Coreの関数演算で計算結果に誤差(ないし、想定外の高い計算精度)が発生。
このため、Kamenoko v1.1ではMac Pro 2019対策として各六角形の座標値をあらかじめ計算し、固定データとして保持して使用しています。内部的には、起動時に座標値をすべて計算してNSBezierPathを作ってキャッシュして(作成後の変更なしに)使っていたので、とくに処理フローが大幅に変わったわけではありません。
▲Mac Pro 2019上で動作しているKamenoko v1.1の想像図(実機ないんで)
この関数演算バグがMac Pro 2019上でのみ発生するものなのか、それともXeon搭載機で同様に発生するものなのかは未確認です。
iWorkアプリケーション(Keynote、Numbers、Pages)がアップデートされてv10.1になりました。対象はmacOS 10.14/10.15。
AppleScript系ではバグ修正1点と、機能追加が1点あります。
Keynote v10.0の際のアホなバグ(native size指定時にエラー)が修正されました。
AppleScript名:native sizeでムービー書き出し |
set outFile to (path to desktop as string) & (do shell script "uuidgen") & ".m4v"
tell application "Keynote" tell front document export to file outFile as QuickTime movie with properties {class:export options, movie format:native size} end tell end tell |
また、3アプリケーション共通でPDF書き出し時に「include comments」オプションが指定できるようになりました。
▲KeynoteのGUI上で指定する「コメントを含める」チェックボックス
▲上がinclude comments:falseで書き出したPDF、下がinclude comments:trueで書き出したPDF
AppleScript名:Keynote書類からPDF書き出し v3(10.10対応) |
— Created 2017-01-21 by Takaaki Naganoya — Modified 2020-07-10 by Takaaki Naganoya — 2017-2020 Piyomaru Software use AppleScript version "2.4" use scripting additions use framework "Foundation" set tmpPath to (path to desktop) as string set aRes to exportKeynoteDocToPDF(tmpPath) –Keynote書類からPDF書き出し on exportKeynoteDocToPDF(targFolderPath as string) tell application "Keynote" set dCount to count every document if dCount = 0 then return false end if set aPath to file of document 1 end tell set curPath to (current application’s NSString’s stringWithString:(POSIX path of aPath))’s lastPathComponent()’s stringByDeletingPathExtension()’s stringByAppendingString:".pdf" set outPath to (targFolderPath & curPath) tell application "Keynote" –v10.10で追加されたinclude comments属性の指定を追加してみた set anOpt to {class:export options, export style:IndividualSlides, all stages:false, skipped slides:true, PDF image quality:Best, include comments:false} export document 1 to file outPath as PDF with properties anOpt end tell return (outPath as alias) end exportKeynoteDocToPDF |
・slide上の選択中のオブジェクトを扱えるようにしてほしい(selected itemといった予約語で)
・縦書きテキストの制御機能がほしい(強引に作ったけど)
・TOCつきPDFが直接書き出せるように(自分で作ったけど)
・Pagesをなんとかして。レイアウトをScriptから再現できない