STREAM DECK制御ソフトウェアがv5.0にアップデートしました。
プラグインのストアが大幅にアップデートしました。
STREAM DECK本の作成のために行なっていた、画面のキャプチャをやり直す必要が出てきてしまいました(泣)。著作権フリーなBGM集とSFX集をStoreからダウンロードできるようになるなど、製品の性格自体が大きく変わるアップデートだと思います。
macOS 12で搭載される「ショートカット」は、iOS上の自動化ツール「DeskConnect」をAppleが買収して発展させ、Apple純正ソフトウェアとして提供されているものです。簡単な自動化を行うためのツールです。
このショートカットがmacOS 12に搭載されることがKeynoteで発表されました。さらに、ショートカットからAppleScriptが実行できることが明らかにされ、AppleScriptからもショートカットを実行できるとのこと。
タイトルにも挙げている「Shortcuts Events」が、AppleScript専用のGUIなし補助アプリケーションであり、AppleScript側からショートカットのアクションを呼び出すことができるようです。
ただし、最初のmacOS 12β版ではまだAppleScriptからショートカットのアクションを実行できないことが、Release NotesのKnown Issuesに明記されています。
10.4 | 10.5 | 10.6 | 10.7 | 10.8 | 10.9 | 10.10 | 10.11 | 10.12 | 10.13 | 10.14 | 10.15 | 11.0 | 12.0 | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
Shortcuts Events | ⬛︎ | |||||||||||||
ColorSyncScripting | ⬛︎ | ⬛︎ | ||||||||||||
Database Events | ⬛︎ | ⬛︎ | ⬛︎ | ⬛︎ | ⬛︎ | ⬛︎ | ⬛︎ | ⬛︎ | ⬛︎ | ⬛︎ | ⬛︎ | ⬛︎ | ⬛︎ | ⬛︎ |
Digital Hub Scripting | ⬛︎ | ⬛︎ | ||||||||||||
FontSync Scripting | ⬛︎ | ⬛︎ | ||||||||||||
Image Events | ⬛︎ | ⬛︎ | ⬛︎ | ⬛︎ | ⬛︎ | ⬛︎ | ⬛︎ | ⬛︎ | ⬛︎ | ⬛︎ | ⬛︎ | ★ | ★ | ★ |
Keychain Scripting | ⬛︎ | ⬛︎ | ⬛︎ | |||||||||||
System Events | ⬛︎ | ⬛︎ | ⬛︎ | ⬛︎ | ⬛︎ | ⬛︎ | ⬛︎ | ⬛︎ | ⬛︎ | ⬛︎ | ⬛︎ | ⬛︎ | ⬛︎ | ⬛︎ |
URL Access Scripting | ⬛︎ | ⬛︎ | ⬛︎ |
macOS 11上のMusic.appの環境設定に突如として、「オーディオの品質」項目が出現。時間が経過するにつれ、kindが「Apple Music AACファイル」だった曲が次第に「HLSメディア」に更新されていきました。
このApple Musicのロスレス配信トラックを再生できるのは、macOS 11.4以降であり、それ以前のmacOSではAAC配信のままです。
段階的に入れ替えられていたり、対応曲と非対応曲があるようで、すべての曲が「HLSメディア」として見えるわけではないようです。自分が試した中でも、「HLSメディア」は1曲だけでした。→ 時間の経過にともない、どんどん増えてきています
これをダウンロードすると、拡張子が「.movpkg」のファイルがローカルにダウンロードされてきました。
バンドルパッケージだったので、Finder上でバンドル内容を表示。
複数のフォーマットのムービーを1つのバンドル(HLSメディア)内に格納できるようです。
覚悟はしていましたが、ハイレゾロスレス(最大24ビット/192kHzのALAC)の1トラックで87.7MBもあり、いちいちダウンロードしているとローカルのディスクの空き容量がヤバいことになります。
WWDC21にて、macOS 12にShortcuts for Macが搭載されることが発表されました。同ツールはAutomatorを置き換え、iPhoneやiPad上のShortcutsとは異なるクリエイティブ系に寄せたアクションが実行できるとのこと。
Shortcuts内からもAppleScriptやShell Scriptを呼び出せるようになっており、Mac上でSiriからShortcutsの呼び出しが行える=「Siriから(ShortcutsのAction上に記載した)AppleScriptが実行できるようになった」ことを意味しています。
Automatorの今後については、すでにAppleScript Studioランタイムがdeprecated扱いで、機能の追加は行われません。Xcode上に添付されているAutomator Acrtionのテンプレートも、すでにAppleScript Studioではなく「Cocoa AppleScript」(AppleScriptObjC)です。
今日は真夜中じゅう起きているわけにはいかないので、事前の予想をまとめたものを貼っておきます。あとでゆっくり、答え合わせを。
Apple SiliconのCore数増加、メモリ拡張バージョンが出てくるかもしれませんが、それをどのように実現するのかがキーポイントになると思います。cc:NUMAなどの技術を用いて複数コアをつなぐのか? そこと、macOS 12.0がもっと安定したバージョンとして位置づけられるのか。そんなあたりが自分の関心事。あと、Mac miniの上位版が本当に出るのかどうか…
前年(2020)が数年がかりで仕込んだネタを一斉に披露したことと比べると小ぶりな発表内容。
ハードウェア系の発表はありませんでした
Apple Musicのロスレス配信の開始にはまだ時間がかかるようです(秋?)
macOS 12, Montereyを発表。AirPlay to MacやShortcutが搭載される
Xcode 13発表。ちゃんとAppleScriptObjCでの開発をサポート。
機械学習モデルを手軽に作れるCreate MLは、v3.0にアップデートしてHand Post ClassificationとHand Gesture Classificationを追加
Safariで表示中のダウンロード残り時間の文字列を数値に変換するために作成したAppleScriptです。
Safariで実行中のダウンロード残り時間の一覧情報を表インタフェースで表示する、ごくごく私的な用途のAppleScriptを書いていたときに必要になったものです。
Safariのダウンロード情報表示は、最近のバージョンではポップオーバーで行われるようになっています。そのポップオーバーの上に表インタフェースが配置されていて、その中の各行の中にあるUI Elementを追いかけるとダウンロード残り時間情報などが取得できます。
▲GUI Scriptingに欠かせない。PFiddlesoftのUI Browser。使わないのと使うのとでは、生産性が1億倍ぐらい違うツール
ただし、得られた「残り時間」の文字列をいったんdateオブジェクトに変換して、経過秒数を計算するのに少々骨が折れました。Safariのダウンロード一覧に表示される文字列はあくまでも「結果表示」で、0分とか0時間とか0秒といった桁は表示が省略されます。
当初、「HH時間mm分ss秒」という固定フォーマットだと勝手に思い込んで処理していました。ところが、各桁が省略されるパターンに遭遇。固定文字列でフォーマット指定をして評価しようとしても、いろいろと無理がありました。自然言語っぽい表記で経過時間の情報を与えられたときに、それを評価してdateオブジェクトに変換するのはけっこうな手間がかかります。
「時」「分」「秒」の各情報が存在するかどうかチェックし、各パターンに合わせた日付フォーマッター文字列を場合分けで書いてみたものの、前述のとおり途中の桁が省略されるパターンに遭遇。3つの桁情報の有無に対応するだけでも、3x2x1=6パターンに対応するif文が必要。さらに、「年」「月」「日」まで表示される可能性を考慮すると、桁要素が6個になるため、6x5x4x3x2x1=720パターンに対処するif文が必要に。この、if文で固定フォーマット文字列を場合分けで選択するというアプローチでは処理が破綻することがあきらかです(if文をそんなに書いたら見通しが悪くなって、矛盾した表記が混入してもわからないでしょう。そこはかとなく、頭が悪い感じもします)。
そこで、与えられた経過時間文字列を直接チェックして、「経過時間文字列に合うように」NSDateFormatter用の文字列を「動的に」組み立てるように方針を転換。これで、大幅に簡潔な記述で済むようになりました。
一番の誤算は、AppleScript上でNSDateのtimeIntervalSinceReferenceDate()の結果が正しく取得できなかったこと。このメソッドで2000年1月1日からの相対秒を取得するつもりだったのですが、期待したような結果は得られませんでした。そのため、2000年1月1日のdateオブジェクトを用意して引き算で経過秒数を求めました。このあたり、AFS(Apple File System)導入時にタイムスタンプの分解能が増やされたことに影響を受けているのだろうかと疑っています。
用途が果てしなく下らない割にてこずらされました。
AppleScript名:時分秒の文字列を数値に変換 v5 |
— Created 2021-06-06 by Takaaki Naganoya — 2021 Piyomaru Software use AppleScript version "2.4" use scripting additions use framework "Foundation" set relSecNum to relativeSecondsFromStringWithDateFormat("22時間 21分 15秒") of me –> 80475 set relSecNum to relativeSecondsFromStringWithDateFormat("22時間 15秒") of me –> 79215 set relSecNum to relativeSecondsFromStringWithDateFormat("22時間") of me –> 79200 on relativeSecondsFromStringWithDateFormat(postDateStr as string) set sepList to {"年", "月", "日", "時間", "分", "秒"} set formList to {"yyyy", "MM", "dd", "HH", "mm", "ss"} set formatStr to "" repeat with i from 1 to 6 set aSepStr to contents of item i of sepList set aFormStr to contents of item i of formList if postDateStr contains aSepStr then set formatStr to formatStr & (aFormStr) & (aSepStr) end if end repeat set postDate to dateFromStringWithDateFormat(postDateStr, formatStr) of me set origDate to dateFromStringWithDateFormat("0時間 0分 0秒", "HH時間mm分ss秒") of me set aSeconds to postDate – origDate return aSeconds end relativeSecondsFromStringWithDateFormat on dateFromStringWithDateFormat(dateString as string, dateFormat as string) set dStr to current application’s NSString’s stringWithString:dateString set dateFormatStr to current application’s NSString’s stringWithString:dateFormat set aDateFormatter to current application’s NSDateFormatter’s alloc()’s init() aDateFormatter’s setDateFormat:dateFormatStr aDateFormatter’s setLocale:(current application’s NSLocale’s alloc()’s initWithLocaleIdentifier:"en_US_POSIX") set aDestDate to (aDateFormatter’s dateFromString:dStr) return aDestDate as date end dateFromStringWithDateFormat |
JavaScriptで書かれた68k Macエミュレータの新規軸「macitosh.js」が登場してきたので、SheepShaverと対決させてみました。
macintosh.js–Classic Mac OS 8 on Mac mini 2014 2.6GHz Intel Core i5 macOS 11.5
SheepShaver–Classic Mac OS 9.2 on MacBook Air mid 2011 1.6GHz Intel Core i5 macOS 10.13.6
それぞれ、Mactracker上に記載のあるGeekbenchのベンチマーク値は以下のとおりです。
ベンチマーク対決内容はAppleScriptで1,000万回単純ループを行うものです。
古いSheepShaverのほうが新しく作られたmacintosh.jsよりも20倍ぐらい高速、という結果が出ました。だからダメということはなく、JavaScriptなどという処理系でここまでネイティブコードに肉薄したということに驚きます。
シングルコア性能でMac mini 2014のほうが倍ぐらい速いのですが、さすがにネイティブコードでエミュレータを動かしているだけあって、MacBook Airのほうが10倍ぐらい高速です。同一マシンでベンチマークしたらsheepshaverのほうが20倍ぐらい高速でしょう。
macintosh.jsにはM1対応版(っていうのか?)もあり、M1 Mac miniで動作させればMac mini 2014の3倍ぐらい高速ですが、それでもMacBook Air上で動かしたsheepshaverのほうが3倍高速ということになります(多分)。
ちなみに、現代のIntel Mac(およびARM Mac)で1,000万回程度の単純ループを普通にAppleScriptで実行させると、速すぎて1秒以下になってしまい計測不能。1億回ぐらい回さないと1秒以下です(10億回ぐらい回さないとダメかも)。PowerPCの時代には1,000万回単純ループが計測の(個人的な)指標になっていました。
▲M1 Mac mini+Macintosh.jsで実行したら68秒。だいたい予想どおり
▲M1 Mac mini+SheepShaver(Universal Binary)で実行したら10秒。MacBook Air 2011+SheepShaverと同じ結果に
……と言われてはや数日。Twitter上では「おお、これが空間オーディオ対応か?!」「音がよくなった!」といった一部の方々の熱狂がありつつも、実際に、Apple MusicからMacのMusic.appに曲を追加し、AppleScriptでファイルフォーマットやCodecなどを確認すると、それが「錯覚」であることがすぐにわかります。
まだ、AACで配信されており、ロスレスコーデックで配信されてはいません。
Apple Musicの配信フォーマット変更はWWDC21(のキーノートスピーチ)後と見られており、実際にどう変わったかについては、電子書籍「Music.app Scripting Book With AppleScript」をアップデートして詳細にまとめます。
# この配信のためにMusic.appをアップデートするんでしょう。OS側の準備も(macOS 11.4)整っているようです
AppleScript名:選択中のトラックの情報を取得 |
tell application "Music" set a to selection set aa to first item of a properties of aa end tell |
Keynote, Pages, Numbersがv11.10にアップデートしました。Keynoteのみ、AppleScript用語辞書に変更点があります。
Keynoteの変更点はマスタースライドのオブジェクト。従来は「master slide」というオブジェクトだったのが、「slide layout」に変更になっています。理由……についてはよくわかりません。いまさらこんな箇所をいじくる意味がわかりません。
Keynoteの画面を調べてみたら、画面上のマスタースライドの呼称が「スライドレイアウト」に変更になったため、これを反映させたようです。
別にGUI画面上の呼称をオブジェクト名に反映させて変更しなくてもいいんじゃないかと考えますが、やはり意味がよくわかりません。前バージョンまでのくだらないミス(実際に動かしたら分かるレベルのお寒いミス)を連発していた担当者から、別の担当者に変わったような雰囲気がします(知らんけど)。
そんな細かいところは個人的にはドーでもいいので、selection objectとかselected object(スライド上の選択中のオブジェクト)を取得できるようになってほしいです。これができないためにKeynoteで無駄な処理を書かされることが非常に多いので。
こっそり変更したかったのか、一応、macOS 11.5上で「master slide」と入力して構文確認すると、同義語(synonym)として処理され、「slide layout」に自動で書き換えられます。
▲構文確認後。「master slide」と入力した箇所が「slide layout」に自動で書き換えられる
▲Keynote v11.01時のAppleScript用語辞書に掲載されていたサンプルAppleScript
▲Keynote v11.10時のAppleScript用語辞書に掲載されていたサンプルAppleScript。こういう部分でミスしてこないあたり、本当に担当者が変わったようにしか見えない
AS Holeの姉妹サイトとして、FileMaker Proのソリューション情報を掲載する「FM Hole」を新設しました。
ぼちぼち増やしていきます。
CotEditorの強化用AppleScript集、PowerPackを近日中にv3.0にアップデートします。また、同時にこのPowerPackの使い方を詳細に説明したドキュメントをBooth上で電子ブックとして販売します。
今回の目玉は、グラフ表示。
AppleScriptによって、CotEditorで編集中の最前面のドキュメントの文字種別を分析して、アニメーションしつつグラフ表示します。文章書きがとっても気にする、漢字、ひらがな、カタカナなどの文字種別の使用比率をグラフ化。
AppleScriptでワードクラウド表示。AppleScriptで記述した世界最小(自称)の簡易日本語形態素解析プログラム「easyJParse」を組み込んで、簡易的にワードクラウドを組み立てて表示します。文章内容の傾向を客観的に把握するための表示です。
AppleScriptだけでMarkdownのプレビュー表示を行います。
さらに、AppleScriptでCSVのプレビュー表示も。小規模なデータならその場でダイアログ上でプレビュー表示を、大きなデータはNumbersに渡してそちらで表示させるという寸法です。
BasukeさんのClubhouseの番組「Basuke’s Tech Talk」の話の内容をまとめたPodcastで、「AppleScriptの話 with @Piyomaru」と題して配信されています。興味のある方はお聴きください。
Basuke's Tech Talk #11 「AppleScriptの話 with @Piyomaru」を公開しました。AppleScriptを愛してやまない「AppleScriptの穴」運営の @Piyomaru さんに話を伺いました。 ⚓ https://t.co/uyMS0BftaZ #basuke
— Basuke (@basuke) May 27, 2021
iTunesの後継ソフトウェア「ミュージック」をmacOS標準搭載のスクリプティング言語「AppleScript」からコントロールするときの記述について、基礎を重視しつつ網羅的に説明する電子ブック「ミュージック.app scripting book with AppleScript」の販売を開始しました。
→ 販売ページ
252ページ+特別付録 AppleScript予約語リファレンス(124ページ)という構成で、もともとは376ページ。大きくなりすぎたので分冊化しました。
ミュージック.appのAppleScript用語辞書をくまなく解説し、印刷の指定からCDにプレイリストを焼くためにCD再生時間ごとにプレイリストを分割したり、iTunes REST APIを利用して指定の曲がApple Musicで配信されているかを調べたり、購入年ごとの集計結果をKeynote上にグラフ作成したりと、おおよそ考えつく内容をすべてまとめています。
さらに、執筆中に見つかった「多階層のフォルダプレイリストを階層指定してアクセス」「曲名が検索で探せない場合の手当て」などさまざまな奥義のかずかずを披露しています。
目次
■スクリプトエディタを起動しよう
スクリプトエディタを起動しよう!
スクリプトエディタのヘルプ
色設定を変えてみよう!
スクリプトを入力してみよう
スクリプトを保存しよう
スクリプトを実行しよう
セキュリティとプライバシー
セキュリティとプライバシー>プライバシー
■ミュージックを起動しよう
ミュージック(Music.app)を指定
Music.appを起動
Music.appを終了
Music.appのAppleScript用語辞書の調べ方
メニュー項目や画面強制操作の調べ方
Music.appの詳細仕様について
Music.appの機能の方向性
Music.appの情報を取得しよう
Musicの名前を取得
mute(消音状態)を取得
mute(消音状態)を設定
volume(音量)を取得
volume(音量)を設定
シャッフルモードを取得
シャッフルモードを設定
リピートモードを取得
リピートモードを設定
current trackを取得
Music.appの情報を一括取得
Music.appのプロパティ項目と内容
■再生コントロールを行おう
Musicの再生コントロール機能
対応するAppleScriptのコマンド
再生/停止(トグル切り替え)
次へ
前へ
■再生ウィンドウの切り替え
Musicのウィンドウ表示状態
Musicのウィンドウ表示切り替え
ウィンドウ表示操作
ミニプレーヤー・ウィンドウ表示操作
その他のウィンドウ表示操作
■選択中のトラックを取得しよう
selection=選択中のもの
current playlist=再生中のプレイリスト
■表示の切り替え
アルバムを表示
ミュージックビデオを表示
カラムブラウザを表示
■エンコーダ情報の取得/設定変更
GUIでエンコーダ情報にアクセス
AppleScriptでエンコーダ情報にアクセス
■AirPlay情報の取得/設定変更
GUIでAirPlay出力先情報にアクセス
AppleScriptでAirPlay情報にアクセス
AppleScriptでAirPlay出力先デバイスを指定
AppleScriptでAirPlay出力先設定
■イコライザ設定
GUIでイコライザにアクセス
AppleScriptでイコライザにアクセス
AppleScriptでイコライザを切り替え
■ビジュアライザ設定
GUIでビジュアライザにアクセス
AppleScriptでビジュアライザにアクセス
■URL上のファイルをオープン
指定URLの音声ファイルをオープン
■Music.appの2つのスクリプトメニュー環境
2つのScript Menu環境
Music.app内蔵スクリプトメニュー
■ソース、ライブラリ情報の取得
ソースの情報を取得
■プレイリストから情報を取得
プレイリスト、フォルダプレイリスト自体の情報
プレイリスト、フォルダプレイリスト内の曲にアクセス
共有プレイリスト
■トラックから情報を取得
トラック(曲)の名前を取得
トラック(曲)の詳細情報を取得
曲プロパティの項目と内容(1/3)
曲プロパティの項目と内容(2/3)
曲プロパティの項目と内容(3/3)
■Apple Musicからダウンロードした曲(トラック)の情報を取得
ダウンロードしたApple Musicの曲の情報
サブスク曲と通常購入曲の属性情報の違い
サブスク曲はMusic/TV.appでしか開けない
■手元にファイルが存在していないトラックをダウンロード
選択中のトラックをダウンロード
■属性情報を書き換えよう
name(曲名)を書き換え
name(曲名)を書き換え(グループ置換)
played count(再生回数)を書き換え
bpm(beat per minute)の情報を書き換え
曲プロパティの項目と内容(1/3)
曲プロパティの項目と内容(2/3)
曲プロパティの項目と内容(3/3)
■曲のアートワークを書き換えよう
トラック(曲)のアートワークを指定
参考資料:Image Eventsの設定変更
トラック(曲)のアートワークを削除
■曲を検索しよう
Music.appで曲を検索する方法
■指定の曲を再生しよう
最もよく聴く曲を再生
指定の曲を再生
■プレイリストの新規作成、名称変更、削除
プレイリストの新規作成
プレイリストの名称変更
プレイリストの削除
プレイリストをCD書き出しのために分割(1/2)
プレイリストをCD書き出しのために分割(2/2)
■フォルダプレイリストの新規作成、名称変更、削除
フォルダプレイリストの制約
多階層フォルダを指定してフォルダプレイリストを特定
フォルダプレイリストの操作
フォルダプレイリスト+プレイリスト作成(1/2)
フォルダプレイリスト+プレイリスト作成(2/2)
■音声ファイルの追加、削除、プレイリストへの登録
音声ファイルのMusicライブラリへの追加
トラック(曲)の指定プレイリストへの登録
選択中のトラックの削除
選択中のトラックの完全削除
■CDにアクセス
CDドライブの存在確認
音楽CD(メディア)の存在確認
CDの情報を取得
CDトラックにアクセス
CDトラックを読み込み
プレイリストからオーディオCD作成
オーディオCDのイジェクト
■プリントアウト
ミュージックから印刷出力
「CDジャケット」形式のプリントアウト内容一覧
「曲」「アルバム」のリスト形式のプリントアウト内容一覧
AppleScriptによるプリントアウト形式指定
AppleScriptによるプリントアウトフロー
AppleScriptによるプリントアウト
■iTunes向けのScriptをMusic.app用に書き換えよう
iTunes向けScriptの書き換え
iTunes向けScriptの書き換え
コラム「Music.appが使用するパス表現」
■曲名の文字コード(Normalize方式)が異なる問題
track(曲)の名称について
track(曲)の名称の文字コードについて
track(曲)の名称をhexdumpするScript
対処方法:インポートした曲名をつけかえる
■音声ファイルの変換
Music.appの機能を用いてオーディオファイル形式変換
音声ファイルのMusicライブラリへの追加
■shared trackとtrackのちがい
shared trackとtrackの違い
shared trackとtrackの違い
ファイルの所在によるclassの違い
■各種playlistのちがい
各種playlistの定義の違い
トラック(曲)にアクセスするための経路
■LAN上の共有Musicライブラリを検出
ミュージックの共有ライブラリ
LAN上の共有Musicライブラリをリストアップ
LAN上の共有Musicライブラリに手動アクセス
LAN上の共有Musicライブラリを指定
■iTunes StoreにREST API経由でアクセス
iTunes REST APIにアクセス
選択中の曲がApple Musicで配信されているか確認
自分のライブラリ中の作曲者のサブスク配信率
(参考)サブスク配信率計算結果
■高度なサンプル集
AppleScriptで操作可能な範囲
ライブラリ中の全トラックのアーティスト名をリストアップ
ライブラリ中のファイルをファイル種別ごとに集計
ライブラリ中の各trackをメディア種別ごとに集計
ライブラリ中の各trackのジャンル集計
ジャンル名簡易名寄せ
ライブラリ中のアートワークをすべてJPGで書き出し
ライブラリ中のアートワークの画像種別集計
ライブラリ中の曲タイトルをアルバムごとにまとめて出力
再生曲が変わったら通知
ライブラリへの追加年(購入年)で集計してグラフ表示
最終再生時を集計してKeynoteで縦棒グラフ表示
■便利な他のプログラムや周辺機器
さまざまなAppleScript呼び出しプログラムから操作①
さまざまなAppleScript呼び出しプログラムから操作②
さまざまなAppleScript呼び出しプログラムから操作③
さまざまなAppleScript呼び出しプログラムから操作④
Mac用AirPlay Serverソフトウェア
■Music.appのAppleScript用語辞書解説
Music.app用語辞書
■iTunes/MusicのAppleScript用語の変遷
iTunes.app/Music.app用語辞書の変遷
■サードパーティ製FrameworkやAppleScript Librariesを呼ぶ
Script BundleにFramework / AppleScript Librariesを入れる
Shane StanleyのScript Toolの変遷
Shane StanleyのScript Libraries
Piyomaru SoftwareのScript Libraries
■AppleScript mini Reference
macOS搭載 AppleScript関連ドキュメント
AppleScript関連の情報源
macOSバージョンとAppleScriptの動向
macOSとAppleScriptの要素技術史
各macOSごとのAppleScript解説(1/4)
各macOSごとのAppleScript解説(2/4)
各macOSごとのAppleScript解説(3/4)
各macOSごとのAppleScript解説(4/4)
macOS内AppleScript補助ツールの歴史
System EventsのAppleScript用語辞書変更点
AppleScript 各ランタイム環境情報
AppleScript 関連ツール
Cocoa Scripting 関連ツール
■ミュージック&AppleScript Q&A
AppleScriptに関するQ&A❶
AppleScriptに関するQ&A❷
AppleScriptに関するQ&A❸
あとがき
奥付
文字列データのhexdumpを表示させようとして、予期しない結果が返ってきたので原因を追求してみました。
問題の発生源はNSDataのdescriptionを取得した箇所。
--> "<e38182e3 8184e381 86e38188 e3818a>"--macOS 10.14.6 --> "{length = 15, bytes = 0xe38182e38184e38186e38188e3818a}"--macOS 10.15.7 --> "{length = 15, bytes = 0xe38182e38184e38186e38188e3818a}"--macOS 11.4
macOS 10.15で、この結果を返すさいの記述が変更になったようです。descriptionからhex値を取得するのは、たしかに「裏技」っぽい解決策。
データが長くなると、
{length = 60, bytes = 0xe38182e3 8184e381 86e38188 e3818ae3 ... 81a4e381 a6e381a8 }
のように途中が省略されるので、データを小分けにして処理する必要があります。
AppleScript名:dataのdescription.scptd |
— – Created by: Takaaki Naganoya – Created on: 2021/05/20 — – Copyright © 2021 Piyomaru Software, All Rights Reserved — – Don’t remove this header!!! use AppleScript version "2.4" — Yosemite (10.10) or later use framework "Foundation" use scripting additions set aStr to current application’s NSString’s stringWithString:"あいうえお" set aDat to aStr’s dataUsingEncoding:(current application’s NSUTF8StringEncoding) set bStr to aDat’s |description|() as string –> "<e38182e3 8184e381 86e38188 e3818a>"–macOS 10.14.6 –> "{length = 15, bytes = 0xe38182e38184e38186e38188e3818a}"–macOS 10.15.7 –> "{length = 15, bytes = 0xe38182e38184e38186e38188e3818a}"–macOS 11.x |
Shane Stanleyからメールで「debugDescriptionだと従来のdescriptionと同じ結果が得られるよ」と教えてもらいました(Thanks Shane!)。
AppleScript名:hexdumpTest.scptd |
–By Shane Stanley 2021/05/21 use AppleScript version "2.7" use framework "Foundation" use scripting additions set a to "あいうえおかきくけこさしすせそたちつてと" set aStr to current application’s NSString’s stringWithString:a set aDat to aStr’s dataUsingEncoding:(current application’s NSUTF8StringEncoding) set bStr to aDat’s |debugDescription|() as string –> <e38182e3 8184e381 86e38188 e3818ae3 818be381 8de3818f e38191e3 8193e381 95e38197 e38199e3 819be381 9de3819f e381a1e3 81a4e381 a6e381a8> |
Clubhouse上でBasukeさんが主催されているBasuke’s Tech Talkに出演します。日本時間で5/21 14:00からです。
明日金曜日の午後2時 JSTから、ぴよまるソフトウェアの長野谷さんと「AppleScriptの話 with @Piyomaru 」をお届けします。歴史は実はかなり長い歴史を持つコアテクノロジー。様々な変化を乗り越えたAppleScriptの深部に挑みます Basuke’s Tech Talk #11 https://t.co/6k1lltJPZ2 #basuke
— Basuke (@basuke) May 20, 2021
Basukeさんといえば、古くは「NoMeMo Busters」の作者として有名。Newton系で活躍されたり、さまざまなMac系のプログラムやWebサービス「関心空間」のプログラムを担当されたあと渡米、KinomaでIoT機器の開発をされたあと現在はPlayStationでプログラマーとして勤務されています。
そのBasukeさんがClubhouse上で開催されているBasuke’s Tech Talkにゲスト出演。「AppleScriptの話 with @Piyomaru」と題して、なんやかんや、あることないこと話すことになることでしょう。
自分は「無限に文章を書く」のはOKというタイプの人間で、その場でリアルタイムにお話をするのはそれほど得意ではないため、ちょっとビビっていますが…
なお、当日の話の内容は、Podcastとして再配信されるとのことなので、リアルタイムに聞けなくても大丈夫(?)です。
サブスクリプション(月額固定費用)サービスのApple Musicの全曲が、「6月からロスレスオーディオのApple Lossless Audio Codec(ALAC)に対応し、一部ではDolby Atmos空間オーディオに対応した楽曲が利用可能になる」とのこと。噂では聞いていましたが、話半分ぐらいで聞いていました。
目下作成中で完成間近の「ミュージック.app Scripting Book With AppleScript」、「書いていないことはない」と自分が胸を張って送り出そうとしている本ですが、当然のようにこの発表に影響を受けます。
こちらで、iTunes Storeで購入した楽曲の詳細情報と、Apple Musicからダウンロードしてきた曲の詳細情報を比較しているのですが……
6/1になったら、再度確認してアップデートする必要がありそうです。この表自体はAppleScriptで、「AppleScriptの実行結果をNumbersの表にまとめる」という処理を行なっているため、作り直してもそれほど作業は発生しないのですが(自動化しておいてよかった!)、まー、反映しておかないとマズイ情報であることに代わりはありません。
Codecが変わるだけだと思われるので、拡張子やらファイル呼称が変わったりすることはなさそうですが、ファイルのサイズが巨大化しそうでそのあたりどーなるのか? 目下、.m4p形式のファイルをローカルにダウンロードできるようになっていますが、そこが変わるのか変わらないのか。
高音質化しても違いがわからない人向けに、従来どおりのCodecでダウンロード/ストリーミングさせるオプションがあるような気もします。6月にMusic.app自体のアップデートもあると見るべきでしょうか。
LAN上のdaap(Music/iTunesライブラリ共有)サービス名を検出するAppleScriptです。
LAN上の他のマシンで動作中のサービス名を収集します。AppleScriptを実行している自機のサービスは除外しています。
他のフォーラムへの無断転載、および転載時にもヘッダー部分を削除することを厳禁します。
AppleScript名:LAN上のdaapクライアントの共有名をリストアップ v2.scptd |
— – Created by: Takaaki Naganoya – Created on: 2021/05/11 — – Copyright © 2021 Piyomaru Software, All Rights Reserved — http://piyocast.com/as/ — – ** You are allowed to use this AppleScript with holding this header comment ** – ** Don’t re-post this script to other forums without this header comment ** – ** I’m very angry with removing header comment ** use AppleScript version "2.4" use scripting additions use framework "Foundation" use framework "AppKit" property foundList : {} property myHostNames : {} property services : {} property comingF : false property resolveF : false set mList to findHostsViaBonjour("_daap._tcp", "") of me –> {"Takaaki Naganoya のライブラリ", "ぴよぴよ ライブラリ"} on findHostsViaBonjour(aType as string, aDomain as string) set my foundList to {} set my comingF to true set my resolveF to false set my myHostNames to (current application’s NSHost’s currentHost()’s names()) as list –> {"MacMini2014.local", "macmini2014.local", "localhost"} set aBrowser to current application’s NSNetServiceBrowser’s alloc()’s init() aBrowser’s setDelegate:me aBrowser’s searchForServicesOfType:aType inDomain:aDomain repeat 100 times if my comingF = false then if my foundList is not equal to {} then exit repeat end if delay 0.01 end repeat repeat 100 times if my resolveF = false then if my foundList is not equal to {} then exit repeat end if delay 0.01 end repeat aBrowser’s setDelegate:(missing value) return (my foundList) end findHostsViaBonjour –searchForServicesOfTypeのdelegate on netServiceBrowser:aNetServiceBrowser didFindService:aNetService moreComing:aMoreComing copy (aMoreComing as boolean) to my comingF set my resolveF to true aNetService’s setDelegate:me set cInfo to aNetService’s resolveWithTimeout:3 end netServiceBrowser:didFindService:moreComing: –NetService’s resolveWithTimeoutのdelegate on netServiceDidResolveAddress:aSender set cDesc to (aSender’s |name|()) as string set dDesc to (aSender’s |hostName|()) as string aSender’s |stop|() –すげー大事 set dDesc to repChar(dDesc, ".local.", ".local") of me if dDesc is not in (my myHostNames) then set the end of (my foundList) to cDesc end if end netServiceDidResolveAddress: –文字置換 on repChar(origText as string, targChar as string, repChar as string) set curDelim to AppleScript’s text item delimiters set AppleScript’s text item delimiters to targChar set tmpList to text items of origText set AppleScript’s text item delimiters to repChar set retText to tmpList as string set AppleScript’s text item delimiters to curDelim return retText end repChar |
Late Night SoftwareからAppleScriptの統合開発環境、ScriptDebugger v8が正式リリースされました。日本語の表示、入力について問題ありません。そして、日本語で問題が出ないということから、同様のCJK(Chinese, Japanese, Korean)言語環境環境でも問題はないことでしょう。
macOS 10.14.6、10.15.7、11.x
Intel Mac/M1 Mac(Apple Silicon Mac)
・Apple Silicon(M1 Mac)へのネイティブ対応
・Dark Mode対応
・macOS 11.x対応。Applet書き出し時にCodeSign Localを実行、notarizingを実行
・バージョン管理
・アプリケーション書き出し時の各種設定が「環境設定」ウィンドウに「Building」タブとして新設された
・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/
・20日の試用期間ののちLiteモードで動作。一部の機能が制限される
・「as anything」は「as any」と解釈される
・AppleScriptのメインスレッド実行機能なし(Script側でメインスレッド実行の記述を追加して対処。ここだけmacOS標準装備のスクリプトエディタの併用が欠かせない)
Keynoteの最前面の書類の現在表示中のスライド(ページ)のタイトルを、指定の文字ではじまるテキストアイテムにコピーするAppleScriptです。
Music.app本にプログラムリストを2x Retina表示のスクリーンキャプチャで掲載してみたところ、書き出したPDFのファイルサイズが巨大になりすぎたり、後処理で圧縮したら一律に画像が荒くなったりで、画像で掲載することをあきらめてKeynoteのオブジェクトでそれっぽく組み立てて掲載することにしました。
その際に、Keynoteオブジェクトで作ったプログラムリストっぽい何かのタイトル部分を一律にダミー文字を入れておいたので、各ページのタイトルを入れてみることにしました。
AppleScript名:現在のスライドのタイトルを指定の文字ではじまるテキストアイテムにコピーする.scptd |
— – Created by: Takaaki Naganoya – Created on: 2021/05/03 — – Copyright © 2021 Piyomaru Software, All Rights Reserved — use AppleScript version "2.4" — Yosemite (10.10) or later use framework "Foundation" use scripting additions tell application "Keynote" tell front document tell current slide set tList to every text item whose object text starts with "あああああ" –抽出条件 set titleStr to (object text of default title item) as string repeat with i in tList set j to contents of i set object text of j to titleStr end repeat (* –サイズを自動で調整してみる??? repeat with i in tList set {xPos, yPos} to position of i set aHeight to height of i set aWidth to width of i set oList to every shape set pList to position of every shape end repeat *) end tell end tell end tell |
AppleScript implementors MLの過去ログを漁っていたら、2006年に作られた資料へのリンクを見つけました。
–> AppleScript Terminology and Apple Event Codes
誰が作った資料かはわかりませんが、AppleEventの4文字コードのコンフリクトが起こらないように、AppleEventコードを調べること、すでにこのような予約語があるのでScriptableなアプリケーションで同様に使えということが目的だったようです。
読んでみると、すでに廃止になったAppleScript Studioの予約語はともかくとして、AppleScript Languageレベルの予約語でも、けっこう知らない予約語があります。
一時期騒ぎになった「linked list」とか「vector」といった予約語は記憶に新しいところですが、構文確認をパスする用語の多いこと多いこと。
無意味語として分類すべきなのか悩ましいものがけっこうあって、驚かされます。C StringsとかPascal Stringsといった予約語もそうですが、見たことのないものばかりです。一部、度量衡の予約語が紛れ込んでいますが、それをのぞいてもけっこう知らないものばかりです。
知っていたからといって自慢できるという種類のものでもなさそうですが、先を見越しすぎたものの実現しなかった「RGB16 color」とか「RGB96 color」あたりが黒歴史案件でしょう。「extended real」あたりで桁数の制限の多い数値型を拡張してもらえたらよさそうなんですが……。
AppleScript系で黒歴史的な予約語といえば、CPU Typeの「Intel 80486」でしょうか。つまり、その頃はMotorola系のCPUを使っていたはずの時期ですが、その時期にi80486で動いていたハードウェアの上でClassic MacOSが動き、その上でAppleScriptの処理系が動いていたことを示唆するもの(?)なわけで……Intel CPU上にCLassic MacOSを移植する「Startrek」プロジェクトの残骸だと(勝手に)考えるとなかなか楽しいものがあります。
AppleScript名:未知の予約語.scpt |
text flow text flows writing code info writing code infos color table color condensed RGB color RGB colors C string C strings reals data size type element info encoded string encoded strings constant constants PostScript picture type event info event events extended real feet fixed font fixed point fixed rectangle file specification file specifications full gallons type class info event info suite info handler handlers hyphens location reference floating zoomable international text caps lock down reference form reference forms key kind modifiers dates left long fixed rectangle long fixed linked lists integers list or record long point long rectangle machines unsigned integer machine location number or date negate no references off styles on styles outline ounces plain language code type parameter info prepositions print length script code writing code Pascal string Pascal strings bounding rectangle class info quarts records subscript scripts shadow small integer small real superscript strikethrough styled text type suite info styled Unicode text dash style pixel map record RGB16 color RGB96 color text style info text style infos underline uniform styles vector vectors application dictionary system dictionary booleans |