2024年11月1日付けでPixelmator Teamから発表された発表において、同社がAppleに買収されたとのこと。
Conguratulations!
Pixelmator ProなどのソフトウェアがそのままAppleの製品ラインナップに組み込まれるのか(Apertureの後釜)、あるいは既存のApple製品(Photos.appとか?)との融合が行われるのかはいまのところ不明です。
名前は、変わるかもしれないですね>Pixelmator Pro
2024年11月1日付けでPixelmator Teamから発表された発表において、同社がAppleに買収されたとのこと。
Conguratulations!
Pixelmator ProなどのソフトウェアがそのままAppleの製品ラインナップに組み込まれるのか(Apertureの後釜)、あるいは既存のApple製品(Photos.appとか?)との融合が行われるのかはいまのところ不明です。
名前は、変わるかもしれないですね>Pixelmator Pro
電子書籍新刊「Pages+AppleScriptで本をつくろう!」を刊行しました。全370ページ、サンプルAppleScriptアーカイブつき。
→ 販売ページ
本書は、Appleのかんたんワープロ「Pages」の使い方を「本づくり」という観点からわかりやすくまとめたものです。
本という「お約束の塊」について、それぞれの部品をどのように作っているか、実例にもとづいてご紹介しています。本書を作ったときのPages書類を含め、用例をオマケとして添付しています。
Pagesはシンプルで強力な機能を備えていますが、シンプルであるがゆえに手間が増えてしまうケースがままあります。
これに対して、macOSのスクリプト言語である「AppleScript」を利用することで、手間のかかる作業を省ける構造になっています。
本書では、筆者がPagesを使って本を作るなかで、「どうしてもこれが必要」と感じた内容をまとめたAppleScriptを付録としてご提供しています。
本書をお買い求めいただくことで、どなたも同じ道具を使って手軽に電子書籍コンテンツを作る環境とノウハウを得られる、と自負するものです。
電子書籍の筆者になろう!
本を作るために、Pagesになれよう!
Pagesで作る「本」とは?
Pagesのツールバー設定
Pagesの参考書
AppleScriptでパワーアップ
Pagesの基本操作
テキスト
表
写真
図形
欄外の表記
「本」を作る作業に慣れよう!
本を作る「作業」の流れ
Pages、4つのオキテ
PDF書き出し
Skim PDF Viewerの使い方
本の部品を作る作業に慣れよう!
表紙
記事一覧でもある「目次」
読者へのあいさつ「まえがき」
仁義のための登録商標表記
記事本文ページ
記事を区切る「章トビラ」
本の名刺「奥付」
本の余韻を生む「裏表紙」
ページの左右を調整する「空白」
Pagesのレイアウトに翻訳
本は「顔」(表紙)が命
応用編
頒布/配布方法を選ぼう
作成した電子書籍を各種Book Storeへ
電子書籍をクリエーター天国のBOOTHで販売
電子書籍をAmazon Kindleで販売!
各電子書籍ストアの「検閲」
Mac App Storeから取得
ユーザー辞書の作り方
表情豊かな、フォントをそろえよう!
フリーで利用できるイラスト/画像素材を活用しよう!
本の構造を知ろう!
プリンタで両面印刷してホチキス製本
コンビニのコピー機で出力してホチキス製本
付録AppleScriptについて
①PDF書き出し+結合
②ツメ操作
③パーソナル面付け
④PDFへのTOC追加
⑤テキストボックス操作
⑥表の列幅、行高さ調整
⑦フォント情報収集
⑧ファイル名(章)修正
⑨ファイル名(仮想ノンブル)修正
⑩PDF操作
筆者が刊行した電子書籍の仕様
Pagesのバージョン履歴
Spacesは、macOS標準搭載の仮想デスクトップ機能であり、最大16個の仮想デスクトップを作れるようになっているほか、F3キーを押すと縮小表示を行うようになっているなど、ハード/ソフトともによく統合された機能です。
ただし、AppleScriptユーザー側からすると
「他の仮想デスクトップにアプリのウィンドウを置くとAppleScriptからアクセスできないカス機能」
「開発チームが他の機能のことを考慮していないクズ機能」
といった感想になります。
このため、さまざまな書籍で「AppleScriptとの互換性のない機能」のひとつとしてリストアップされ、AppleScript系の開発/運用現場では「安全のためにSpacesを使わないように」と注意するのが真っ先に行う恒例行事になっていました。
内蔵HDD/SSDの暗号化機能なみに、登場時にAppleScriptとの互換性検証が不十分なものについては「信用できない」として、以来、安全のために暗号化機能は極力使わないようにしてきました。
# HDDの暗号化機能が登場したときに、暗号化したHDDにAppleScriptからアクセスできないというバカみたいな不具合が発生。その後も、有効にするとeGPUが使えなくなるなど、この機能を作っている担当者だかチームのことが信じられません。
そして話はSpacesに戻ります。執筆中の電子書籍「Pages+AppleScriptで本をつくろう!」の注意点でSpacesについて言及し、確認のために「やっぱり今でも動かないのか?」と、試してみたら……他の仮想デスクトップ上に配置したPagesの書類の情報を取得できます。
「…………。」
何度試してみても、他の仮想デスクトップに配置したPages書類の情報を取得できます。
macOS 13.7.1と、macOS 10.13.7で試してみたところ、両方で動作しました。
このぐらいの範囲のmacOSで動くのであれば、さまざまな本でSpacesに関する「危険なので使用を推奨しない」という評価は取り下げる必要があることでしょう。
ただ、Pagesについては表示中のページから+6ページぐらいを超えるとオブジェクトのposition属性を取得できないといった不具合があり、これはmacOS 15で再テストしても発生が確認されています。
新たにリリースされたSafari v18(macOS 13/14/15用)で、各Tabに「pid」属性が新設されました。
各Webコンテンツのブラウズを行う処理プロセスを、独立したプロセスで行うことで、メモリの食いすぎでプロセスが止まったような場合にでも他のWebブラウジングに影響を与えない、というあたりにメリットがあったとか。
▲Safari v17とv18のAppleScript用語辞書(sdef)を比較したところ
▲SafariでYouTube上のムービーを再生しているところ
pidがわかると、どういう「いいこと」があるのかが問題です。メモリの使用状況などを確認することはできますし、個別にプロセスをkillすることもできるわけですが、そこまでやるんだろうかと。そういうニーズがあって新設したのか、ちょっとわからないところです。
それはともかく、Safari(≒WebKit)系はゴミプロセスがメモリ上に残りまくるので(Mail.appもメッセージを表示するだけでゴミプロセスが残るし)、その点がちょっとどうなのかという点と、Webコンテンツ上の画像ボタンを文字認識しておかしな動作をしまくるので、そのあたりは勘弁してほしいところです。
AppleScript名:Safariのtabのpidを取得.scpt |
tell application "Safari" tell window 1 set aList to pid of every tab –> {33892} end tell end tell |
iWork Apps(Keynote、Pages、Numbers)がバージョン14.2にアップデートしました。
すべてのアプリでAppleScript用語辞書への変更はありません。
Keynote 14.2では、macOS 15, Sequoia上でHDRコンテンツの表示をサポートしています。
バグの修正がうたわれていますが、Pagesのページ上のオブジェクトの情報を取得できる範囲が現在表示中の見開き+6ページに制限されるというアホな仕様は変わっていないことを確認しています。
電子書籍新刊「AppleScriptでたのしむ レトロ・グラフィック プログラム集」を刊行しました。全154ページ、サンプルAppleScriptアーカイブつき。
→ 販売ページ
1980年代や90年代の8/16ビットPCのBASICで描かせていた、三角関数による各種グラフィックスをAppleScriptで再現。ダイアログで表示するだけでなく、各種GUIアプリ(Keynote、Numbers、Pages、Excel、PowerPoint、Word、Pixelmator Pro)を操作して描画したり、画像書き出ししてAirDropでiOSデバイスに転送するようなサンプルを収録しています。
懐かしのレトロCGの世界を再現
時代を経て感じる郷愁とも異なるテイスト
その昔、十数分かけて描いた三角関数グラフ
1秒以下で終了 vs 6分で終了
最新環境で動くAppleScriptにBASICのプログラムを移植
アップルスクリプトは、構文色分け必須の、色で要素を見分ける環境
最低限の知識でAppleScriptによるグラフィックを
AppleScript書類内に、実行に必要なライブラリを同梱
筆者の関数計算ライブラリ「calcLibAS」内蔵関数
コラム ポケコンエミュレータ“pockemul”
1994年から採用され続けている言語
GUIアプリを操作するために存在。搭載実行環境がとても多い
書き方は、アプリ内に存在する用語辞書を参照
本来の機能を利用するためにはシステム設定で許可する必要が
10.10以降でCocoaを直接呼べるようになったインタプリタ言語
GUI部品を直接操作してアプリを操作する強制操作機能が人気?
Web上のAPIを呼んでクラウド系の機能も利用
AS自体で予約語と機能を記述するライブラリ機能
コラム AppleScriptの世界の全体像 OS機能の最深部からGUIそのものの操作まで
Cocoaの機能を呼び出してメモリ上で画像を作成
NSAlertの上にNSImageViewを作成しグラフィック表示
Cocoaのグラフィックス座標系”
主要なアプリケーションの座標系”
画像ファイルに書き出せば”
他のアプリにコピー&ペースト”
当時は存在していなかった透過画像”
パラメータを変えると動作が変わる”
コラム GUIアプリごとの応答速度の違い
スクリプトエディタでオープンして実行するだけ
必要なライブラリはバンドル内にすべて格納
掲載リストはグラフィックス描画にかかわる箇所のみ
How to use/ダイアログ表示AppleScript
How to use/ファイル出力AppleScript
How to use/ファイル出力+AirDrop AppleScript
How to use/クリップボード転送AppleScript
How to use/各種GUIアプリ操作AppleScript
OS標準搭載の13の実行環境およびサードパーティの数十の実行環境
線画テスト
円画テスト①
円画テスト②
サイクロイド曲線
バラ曲線
パスカルの蝸牛形
リサージュ曲線
ダイヤモンドパターン
アルキメデスの螺旋
メキシカンハット①
メキシカンハット②
メキシカンハット③
メキシカンハット④
コラム マシンごとの実行速度の違い
WWDC24において、macOS 15, Sequoia(セコイア)が発表されました。
このところ、初期β版ではインストール最中に止まったまま動かなくなるなど「ひどい出来」でしたが、macOS 15ではそういうことはありませんでした。
AppleScriptのバージョンは引き続きv2.8。これは予想どおりです。次のmacOS 16でv2.9になるのか、そのままなのか……そこが注目点でしょう。macOS 15には「安定動作」を願いたいところです。
ひととおり、AppleScript対応のデフォルト搭載アプリケーションの用語辞書を調べてみたところ、差分が検出されたのはSafariのtabにpid(プロセスID)というプロパティが新設されたぐらい。個別にプロセスをkillするための仕掛けでしょうか。
このところ、不具合が出まくっていたText To Speechまわりで、大きな変更がありました。いろいろ読み上げ音声キャラクタが追加されています。ただし、AppleScriptのsayコマンドで指定可能な日本語読み上げキャラクタは、従来どおりKyoko、Otoyaぐらい。音声キャラクタ名がローカライズ表示されてしまうものについては、sayコマンドで指定できません。
macOS 15環境のAppleScriptは、いまのところ「macOS 14と同じ」ように感じられます。
つまり、macOS 14で知られているバグはmacOS 15でも同様に存在します。何も手が加わっていません。
サードパーティのアプリケーションが起動できないといった問題が存在していますが、これは初期βならではということでしょうか。
ちなみに、ウィンドウの吸着機能については、その日のうちにオフにしました。
システム設定>デスクトップとDock>ウィンドウに設定があるので、これらをすべてオフにするといい感じです。おそらく、自分は二度とこの機能をアクティブにすることはないでしょう。
◯[追加] Safariのtabにpidプロパティが追加される
◯[修正] AppleScriptドロップレットにドロップしたファイル/フォルダが、xattr「com.apple.quarantine」の影響とGatekeeperの兼ね合いですべて受け渡されない現象がmcOS 10.12から継続して発生していたが、これが改められ、ドロップされたファイル/フォルダの欠損が発生しなくなった。なお、この変更がmacOS 13.xおよび14.xにもさかのぼって適用された。
◯[修正] 半角スペース文字列の数値への型変換で処理系自体がクラッシュするバグ(14.0, Sonoma Crasher)が解消
×[バグ] スクリプトエディタ上で「Cocoa-AppleScript Applet」のテンプレートから作成したアプレットが動作しない問題が継続中
×[バグ] スクリプトメニューから呼び出したAppleScriptの実行速度が、スクリプトエディタ上よりも6倍以上遅くなる現象が継続中
×[バグ] テキスト読み上げキャラクタのうち一部のキャラクタで名前がローカライズされてしまい、sayコマンドで指定できないバグが継続中(日本語環境限定バグ)
電子書籍「Cocoa Scripting Course」の第9巻、File Processingを刊行しました。PDF 449ページです。
→ 販売ページ
本書は、Cocoa Scripting本の第9弾。Cocoaの機能を使って圧倒的に高速かつ高度なファイル処理を行いたいScripterには必携の1冊です。8巻と9巻は続巻になっており、ファイルパスの処理については8巻で、実際のファイル処理についてまとめたのがこの9巻です。ファイル処理の基礎的なものから実践的なレベルまで、幅広い内容をよりわかりやすく解説しました。
AppleScriptを習得している人は、もれなくCocoa Scriptingを使うべきです。そして、その最大の理由がこのファイル処理(高速&高機能)といえます。
Cocoaのファイル処理は、大量のファイルを処理してはじめて実力を発揮します。SSD+Cocoa Scriptingによるファイル処理は、Finder経由で行うよりも、大量のファイル処理時にスピード面で大きなアドバンテージがあります。
◽️ファイル処理の基礎知識
ファイルパス関連の専門用語
ファイル処理の基礎
AppleScriptとCocoaのパス表現の違い
本書掲載のファイル処理AppleScriptについて
◽️ファイル/フォルダ名の取得
ファイル名の取得
フォルダ名の取得
◽️ファイル/フォルダの存在確認
ファイル/フォルダの存在確認
フォルダの存在確認(+なければ作成)
◽️ファイル/フォルダ名の変更(リネーム)
ファイル名のリネーム
フォルダ名のリネーム
(参考資料)リネームできない名前
◽️ファイル/フォルダのコピー
ファイルのコピー
フォルダのコピー
◽️ファイル/フォルダの移動
ファイルの移動
フォルダの移動
ファイルの移動(新規フォルダ作成つき)
フォルダの移動(新規フォルダ作成つき)
◽️ファイル/フォルダの削除
ファイル/フォルダの削除(ゴミ箱に移動)
ファイル/フォルダの削除
◽️ファイル内容の読み込み
文字コードを指定してファイル読み込み
文字コードを自動判別して読み込み①
文字コードを自動判別して読み込み②
文字コードを自動判別して読み込み③
◽️ファイル書き込み
指定文字コードでファイル書き込み①
指定文字コードでファイル書き込み②
指定文字コードでファイル書き込み③
◽️ファイル比較
2つのファイルの比較
2つのテキストファイルの内容比較
◽️Finderラベルの処理
FinderラベルとFinderタグ
Finderラベルについて
ファイルのラベルを取得する
ファイルのラベルをクリアする
ファイルのラベルを設定する
ラベル名称を取得
指定言語でローカライズされたラベル名を取得
ラベルINDEXで絞り込み検索
ラベルINDEXで絞り込み検索(Spotlight)
◽️Finderタグの処理
Finderタグについて
タグを取得する
タグをクリア
タグを設定する
タグを追加する
タグ名からINDEX値を取得
◽️ファイル/フォルダの属性情報の変更
ファイルの作成/修正日時の変更
ファイルの作成日時の変更(ダイアログ選択)
フォルダの作成日時の変更
フォルダの作成日時の変更(ダイアログ選択)
EXIF情報をもとにJPEG画像の作成日を変更①
EXIF情報をもとにJPEG画像の作成日を変更②
指定フォルダ以下のScript書類の作成・修正日を変更
◽️フォルダ内のファイル取得
ファイルパス/ファイル名一覧取得
ファイルパス一覧取得+ファイル名でソート
ファイルパス一覧取得+変更日付でソート
指定文字列を含む名称のファイルを取得①
指定文字列を含む名称のファイルを取得②
拡張子リストの拡張子のファイルパスを取得
拡張子リストの拡張子のファイル名を取得
指定UTIに属するファイルパスを取得①
指定UTIに属するファイルパスを取得②
◽️ファイル名衝突回避つきリネーム
新規名称を指定して名称衝突回避しつつリネーム①
新規名称を指定して名称衝突回避しつつリネーム②
指定パスの存在確認+リネーム
フォルダの存在確認+フォルダ確認+リネーム
ファイルの存在確認+衝突回避+子番号追加
フォルダ内の大量のファイルの一括リネーム①
フォルダ内の大量のファイルの一括リネーム②
フォルダ内の大量のファイルの一括リネーム③
フォルダ内の大量のファイルの一括リネーム④
フォルダ内の大量のファイルの一括リネーム⑤
◽️Metadata Libを用いたSpotlightファイル検索
指定フォルダ以下のSpotlight検索①
指定フォルダ以下のSpotlight検索②
指定フォルダ以下のSpotlight検索③
指定フォルダ以下のSpotlight検索④
指定フォルダ以下のSpotlight検索⑤
指定フォルダ以下のSpotlight検索⑤
指定フォルダ以下のSpotlight検索⑥
指定フォルダ以下のSpotlight検索⑦
指定フォルダ以下のSpotlight検索⑧
◽️NSFileManagerによるファイル検索
NSFileManagerによるファイルパスの取得
NSFileManagerによるファイルパスの取得+拡張子による抽出
◽️ファイル/フォルダへのカスタムアイコンの設定
指定ファイルのアイコン取得、設定
指定ファイルのカスタムアイコン削除
指定フォルダのアイコン取得、設定
指定フォルダのカスタムアイコン削除
◽️ファイルの暗号化/復号化
FBEncryptorで文字列の暗号化、復号化
◽️Zipアーカイブの情報取得
ZIP関連のオープンソースプログラムの注意点
アーカイブ中のファイル情報取得(ZipZap)
アーカイブ中のファイル情報取得(SevenZip)
アーカイブ中のファイル情報取得(ZipZap)①
アーカイブ中のファイル情報取得(ZipZap)②
アーカイブのパスワード設定確認(ZipArchive)
アーカイブのパスワード照合(ZipArchive)
◽️Zipアーカイブの作成/展開
ファイルからZipアーカイブの作成(ZipArchive)
フォルダからのZipアーカイブの作成(ZipArchive)
フォルダからのZipアーカイブの作成(ZipArchive)
ファイルからZipアーカイブの作成(ditto)
フォルダ構造ごとZipアーカイブの作成(ditto)
Zipアーカイブの展開
NSDataを圧縮/展開
◽️ファイルのチェックサムやハッシュ値の計算
ファイルのMD5/SHA1/SHA512ハッシュ値を計算(md5Lib)
NSDataのMD5ハッシュ値を計算
ハッシュ値をもとに画像判定①
ハッシュ値をもとに画像判定②
ハッシュ値をもとに画像判定③
添付サンプルScript紹介
資料編
Cocoa Scripting関連のAppleScript命令
Cocoa ScriptingとScript Object
AppleScript Droplet
サードパーティ製FrameworkやAppleScript Librariesを呼ぶ
AppleScript mini reference
AppleScript 各種ランタイム環境および関連ツール
AppleScript予約語一覧
エラーコード表
理解度確認テスト
あとがき、奥付
以前からその傾向がありましたが、AdobeがInDesign v19.4からパス表現形式にHFSではなくPOSIX pathを採用するとのこと。
v19.3の段階ではまだHFS pathが有効であるものの、設定によりPOSIX pathのみに変更もできるのだとか。
Adobeのアプリケーションといえば、POSIX pathを受け付けていたり(Adobe Photoshop)、POSIX pathでないと日本語のパスで問題があったり(Adobe Photoshop)、POSIX pathしか使えなかったり(Acrobat Distiller)、AppleScript用語辞書で一切説明していないにもかかわらず、そういうことをしてきました。
InDesignでもPOSIX pathを使うようになる(AppleScriptで指定する必要がある)とのことで、正直なところshell scriptを呼び出す場合や、Cocoa ScriptingでPOSIX pathを日常的に使っているため、バグがなければとくに問題はないと感じます。
Appleも各macOSの初期βの段階だとPOSIX pathへの変換機能を呼び出すと、そのままでは使えないようなパスを返すバグを飽きもせず毎回毎回入れてくるので、Adobeがやらかさない保証はまったくありません。
ただ、今回の件は知っておかないと「いきなりScriptが動かなくなった!」と大騒ぎになってしまうことでしょう。
外付けのドライブやファイルサーバーからデータをオープンするような場合に、POSIX pathの表現が正しく行われるのか、実際にやってみないと不安な気もします。
電子書籍「Cocoa Scripting Course」の第8巻、File path Processingを刊行しました。PDF 446ページです。
→ 販売ページ
本書は、Cocoa Scripting本の第8弾。ファイルパスの処理を基礎から応用まで幅広く扱っています。Cocoaの機能を使って圧倒的に高度なファイル処理を行いたいScripterには必携の1冊です。8巻と9巻は続巻になっており、並行して同時に企画しています(ファイル処理は9巻で扱います)。
「Cocoa経由で高速にファイル操作を行いたい」と思っても、意外なほど参考文献が少ないことに気づきます。単独で成立しているものは皆無でしょう。
以前は、AppleScriptでファイルパスの処理を行う際に、いろいろ困らされる話がありました。さまざまな注意すべきポイントはありつつも、Cocoaの機能を用いてファイルパスの処理を行えることは、FinderやSystem Eventsだけでファイル処理を行なっていた時代を思えば、隔世の感があります。
なんといっても、UTI系の演算が行えて、指定のUTIに所属するファイルだけを抽出するといった(拡張子だとJPEGとJPGの両方を指定)、スマートな処理ができるのは素晴らしいことです。高度な処理をお手軽に。圧倒的に高速に。
ファイルパスの基礎知識
ファイルパス操作の基礎
ファイルパス計算
ファイル名の操作
ファイル名の抽出
ファイル/フォルダのローカライズ名を取得
指定パスの種別チェック
特定のフォルダへのパスを求める
ファイルパスの高度な処理
ファイルそのものの情報+メタ情報について
ファイル情報の取得
Spotlightメタデータ情報の取得
xattr拡張ファイル情報の操作
EXIF情報の取得
MIME情報の取得
Finderで選択中のファイルの取得/設定
拡張子/UTI/MIMEの位置付けについての基礎知識
UTIについての基礎知識
UTI同士の計算
UTI利用サンプル
Dynamic UTIについて
UTIについての資料
ドライブ情報を取得
ドライブのマウント/アンマウント
添付サンプルScript紹介
資料編
Cocoa Scripting関連のAppleScript命令
Cocoa ScriptingとScript Object
AppleScript Droplet
サードパーティ製FrameworkやAppleScript Librariesを呼ぶ
AppleScript mini reference
AppleScript 各種ランタイム環境および関連ツール
AppleScript予約語一覧
エラーコード表
理解度確認テスト
あとがき、奥付
Keynote、Pages、NumbersのiWorkアプリがバージョン14にアップデートされました。
本バージョンはmacOS 13以降に対応しています。
各アプリのAppleScript用語辞書に変更はありません。Pagesで見られている、ウィンドウで表示されていないページ上のオブジェクトからの情報取得ができない(正確にいえば、表示中の見開き+2見開き分まで取得可能)という挙動は変わっていません。どうも処理速度向上のための仕様のようなので、この部分はこのままだと思います。
電子書籍「Cocoa Scripting Course」の第7巻、NSColorを刊行しました。PDF 478ページです。
→ 販売ページ
本書は、Cocoa Scripting本の第7弾。色関連の処理をAppleScriptで行いたい人向けの解説書です。画像処理やRTF処理などで避けては通れない「色」に関する内容です。
色についての処理は割と概念が独特で、色空間、色の扱い、色差(ΔE)、明度計算などなど、知っていれば「そんなもんか」という程度のものですが、知らないとさっぱり分かりません。
ささいなOS上の色設定の情報をplistから読み取って処理するような場合にも、「普通、RGB値の色しか設定しないよね」と誰もが思っていたスクリプトエディタの構文色分け設定に、CMYK色やGrayscale色を設定しているユーザーがいて、慌てていろいろ対応する羽目になったりと、いい思い出がたくさんあります。
Adobe Swatch Exchangeファイル書き出しや、頻出色のリストアップ、近似色の計算や色差ΔEの計算など、今日明日からすぐに役立つ内容を多く含んでいます。
1章 入門編
Cocoa Scriptingの概要
Cocoa Scriptingってどういうもの?
Cocoa Scriptingの実際
Cocoa Scriptingの威力
Cocoa Scriptingのメリット
Cocoa Scriptingに必要なもの
Cocoa Scriptingまとめ
Cocoa Scripting9つの誓い
Cocoa Scriptingに適したmacOSについて
Cocoa Scripting環境の進化の歴史
Cocoa Scriptable macOS
参考資料:AppleScriptランタイム環境情報
Cocoa Scripting環境ごとの挙動の違い
SIP解除の是非
プログラミングスタイル
開発・実行環境のちがい
処理手順の違い
メインスレッド実行が必須な機能のScripting
delegation, notification
実行スタイルの違いによる書き換え
AppleScriptでCocoaオブジェクトを呼び出すと…
サブルーチン記述
オブジェクト階層を示すmyとme
クラス拡張
高速なCocoa Scriptを書くためには
アプリケーションとのやりとり
暗黙の型変換
一部のコマンドで書き換えが必要
計算の優先順位を示すカッコを修正
オブジェクトの数え方
情報の調べ方
Cocoa Scriptingを行う際の調べ方
Appleのオンラインドキュメント
Xcodeでヘッダーファイルを「素早く開く」
ヘッダーファイルの歩き方
ヘッダーファイルの構成要素
Deprecatedな機能に遭遇した場合
Enum(定数)の記載パターン
AppleScriptの数値表現幅を超えるEnum(定数)
2章 実践編
Cocoa Scriptを実際に動かす
Script Editor/Script Debuggerを起動
Cocoa Scriptを実行
Cocoa Objectのログを表示
Cocoa Scriptの書類を保存
Cocoa Scriptのエクスポート形式
Objective-CのCocoa呼び出し記述をAppleScript記述に翻訳する
Cocoa Script(AppleScriptObjC)の構成
Objective-Cの各種データ表記書き換え(1/3)
Objective-Cの各種データ表記書き換え(2/3)
Objective-Cの各種データ表記書き換え(3/3)
Cocoaメソッド名の大文字小文字指定
Cocoaメソッド名の変換(1/3)
Cocoaメソッド名の変換(2/3)
Cocoaメソッド名の変換(3/3)
基礎的なCocoaオブジェクト解説
メソッド呼び出し時のパラメータ
NSString(文字列)
NSArray(配列)
NSDictionary(辞書)
Number(数値)
Enum(定数)
nil
NSObject
Cocoa Scriptingの特徴的な動き
AppleScriptとCocoa間の
オブジェクト変換
AppleScriptオブジェクトに対応するCocoaクラス
配列関連のCocoaクラス
レコード関連のCocoaクラス
文字列関連のCocoaクラス
日付関連のCocoaクラス
File Path関連オブジェクト
File Path関連オブジェクト変換方法
画像関連Cocoaオブジェクト
ファイルパス文字列(NSString)関連(1/2)
ファイルパス文字列(NSString)関連(2/2)
URL関連
Remote URL文字列関連(1/2)
Remote URL文字列関連(2/2)
Local File URL文字列関連
配列関連
Dictionary関連
NSString文字エンコーディング関連
Color関連
HTML関連
Cocoa Object同士の変換、生成
NSData
Styled String(1/2)
Styled String(2/2)
2次元座標データ
1次元座標系データ
言語、Locale系データ
有用なCocoaオブジェクト(抜粋)
3章 NSColor編
Colorデータの位置付けと役割
NSColor Basic Samples
NSColorList Basic Samples
NSColorSpace Basic Samples
4章 Color処理 基礎編
choose colorコマンドで表示されるカラーピッカーの使い方
choose colorコマンドで指定したRGB色でNSColorを作成
Numbers書類上に記入したRGB値を色プレビュー
NSColorからRGBAの各要素を取得
RGB色からHSBA色に変換
NSColorからHSBAの各要素を取得
NSColorから色空間名を取得
鉛筆(クレヨン)ピッカーに登録されている色名を取得
5章 Color処理 上級編
色から明度情報を取得
画像の指定座標のピクセルの色情報を取得
AppleScriptの構文色分け設定の書式情報読み取り
HTML色コードの取り扱い
CIColorを作成してCoreImageフィルタを実行
ざっくりとした色判定(カラードメイン処理)
色差(ΔE)を計算する
色名を推定(dbColNamesKit)
色のポスタライズ
頻出色の抽出(ColorCube)
2つの色の合成
輝度をMAXにした色を取得(Colours)
Adobe Swatch Exchangeファイル作成
画像の空白判定
添付サンプルScript紹介
資料編
Cocoa Scripting関連のAppleScript命令
Cocoa ScriptingとScript Object
AppleScript Droplet
サードパーティ製FrameworkやAppleScript Librariesを呼ぶ
AppleScript mini reference
AppleScript 各種ランタイム環境および関連ツール
AppleScript予約語一覧
エラーコード表
理解度確認テスト
あとがき、奥付
macOS 13.6.5アップデート(13.6.5(22G605))が配信されましたが、AppleScript系のバグは直っていません。
Appleのエンジニアは、「会社から給料をもらって日々新しいバグを作るのが仕事」という状況です。新しい機能よりも、新しいバグの方が多いというのは、もはやメーカーではなくてクラッシャーと名乗るべきなのでは?
・スクリプトエディタ上のテンプレートから選択するCocoa-AppleScript Appletランタイムが動作しなくなった
・スクリプトエディタ上でscpt形式のAppleScript書類に書いた「説明」が白地に白文字で表示されて見えなくなる
・日本語環境で、特定のTTSキャラクタ名(Bells、Hysterical、Organ、Princess、Trinoids、Whisper)が指定できない
2023年に使用していたmacOS:macOS 13
毎年行なっている、Piyomaru Softwareが書いたAppleScriptの1年を振り返る記事の2023年版です。10年ほど続けてきた旧「AppleScriptの穴」Blogが2018年の年初にホスティング会社との行き違いでシャットダウンされ、再構築したのがこの現行の「AppleScriptの穴」Blogです。
→ 2018年に書いた価値あるAppleScript
→ 2019年に書いた価値あるAppleScript
→ 2020年に書いた価値あるAppleScript
→ 2021年に書いた価値あるAppleScript
→ 2022年に書いた価値あるAppleScript
旧「AppleScriptの穴」Blogの内容については、データベースから抜き出したデータをもとに再構成した「Blogアーカイブ本」にまとめています。
AppleScriptの穴Blogアーカイブvol.1
AppleScriptの穴Blogアーカイブvol.2
AppleScriptの穴Blogアーカイブvol.3
AppleScriptの穴Blogアーカイブvol.4
AppleScriptの穴Blogアーカイブvol.5
AppleScriptの穴Blogアーカイブvol.6
本Blogは、機械翻訳で翻訳しやすいように、平易な日本語で記述してある点がチャームポイントです。それはもう、小学生の日記ぐらいの難易度で。もともとは、2000年代初頭に開発していた「人工知能インタフェース Newt On」のソースコード部品バラバラにして掲載し、用いた部品を個別にメンテナンスすることを「隠れた目的」としていました。また、Scripter間のノウハウの共有を推進することも目的としています。
AppleScript以外の一般的なテーマの記事については、こちらにいろいろ投稿しています。
2023年的な状況といいますか、昨今のMac環境をとりまく状況として新バージョンのmacOSとしてmacOS 14がありつつも、Appleがマイナーアップデートで新たなバグを盛り込んでくるため、macOS 14に付き合うこと自体がリスクです。β版で確認を行なっても、Release版で安定度が激下がりして、その後にバグ改修と新機能追加が行われるため、つねにどこかにド派手な不具合を抱えているという状況です。
2023年にはそれほど発表できるようなAppleScriptを書いていない(=自分の作業を効率化するものしか書いていないので外部に発表のしようがない)のと、それほど技術レベルや解決策のレベルが上がったような内容のものはありません。
さまざまな技術的な内容をまとめた記事については、電子書籍に掲載したり、付録Scriptとして添付しています。年間19冊出しています。
ポケコンサークル「LL」会誌Vol.19復刻版(282ページ)
AppleScript基礎テクニック集(29)セキュリティ機能解除(36ページ)
AppleScript+Xcodeで作るMacアプリ(484ページ)
ChatGPTにAppleScriptを書かせてみた!(76ページ)
AppleScript基礎テクニック(30)コンテクストメニューScriptの作り方(41ページ)
AppleScript基礎テクニック(30)コンテクストメニューScriptの作り方 英語版(41ページ)
AppleScript基礎テクニック(31)スクリプトバンドルの活用(34ページ)
AppleScript 7つの宝珠(3)(35ページ)
Cocoa Scripting Course #5 NSImage(473ページ)
ゆっくりAppleScript解説(1)(45ページ)
ゆっくりAppleScript解説(2)(45ページ)
つたわる資料のつくりかた(66ページ)
Keynote Scripting Book With AppleScript(434ページ)
Cocoa Scripting Course #6 PDFKit(560ページ)
ゆっくりAppleScript解説(3)(42ページ)
AppleScript最新リファレンス v2.8(1008ページ)
AppleScript最新リファレンス v2.8英語版(223ページ)
戦場の絆〜僕らの15年戦争〜v2(394ページ)
Piyomaru Software電子書籍カタログ 2024冬(100ページ)
2023年に書いたものは、例年どおりの「価値あるAppleScript」と言うほどのものではなく、「2023年に書いた記事の中で注目すべきもの」をリストアップするという程度の内容になりそうです。
住所ジオコーディング(住所→緯度経度情報)/逆住所ジオコーディング(緯度経度情報→住所)は、AppleScriptで普通に実行できてほしい処理のひとつです。こうしてObjective-C/Swiftで書いたプログラムをFrameworkとして呼び出せるようにして呼び出すとか、いろいろ方法があるわけで……少なくとも、ローカルで処理が完結する解決策は用意しておきたいところです。
AppleScriptからのChatGPTのREST API呼び出しは、かなり早期からできていました。処理したい内容のScriptをChatGPTに書かせて実行するといった「なげやり」な方法であれば、こうしたScriptの延長線上で可能ですが、あらかじめきちんと動くことを保証したScriptのパラメータ部分だけをLLMから取得するとか、複数のScriptを組み合わせて処理を実行させるといった内容を実現する方法を見つけたいところです。
Keynoteはいいアプリケーションだと思うものの、あまりバージョンアップしても機能が追加されないというか、実際に使っている人間からのフィードバックがさっぱりないというか、ユーザーと開発現場の距離が離れてしまっている感じがします。
他形式の3DデータをUSDZデータに変換するあたりのツールが充実する必要があるというか、Keynote側の読み込み機能がもう少し強化されてもよさそうな気もします。
この本は、発行するのに30冊以上も本を出す必要があり、数年かけて計画を実行して、ようやくアップデートにこぎつけました。最初の「AppleScript最新リファレンス」から7年が経過していることに驚かされます。
Microsoft Excelは依然としてAppleScript用語辞書が大きなアプリケーションではあるのですが、Excelの機能が強力すぎる(表現力が豊かすぎる)ために、目的の処理を行うためにはなかなか一筋縄では行かないようです。
PowerPointにかぎらず、Microsoft OfficeアプリのAppleScript用語辞書が、より詳細な記述を行なっているところに懸念をおぼえます。こんなに細かく書かないとダメなのだろうかと。敷居が高くなりすぎていないかと。あと、Script MenuにPowerPointを操作するAppleScriptを入れて実行すると動かないというのは、ランタイム環境が強く限定され、こんにちのmacOS環境の中で標準レベルといえるScript Menuで動かないのは、よくないと考えます。
macOS 12.xのマイナーバージョンアップ時に機能が損なわれた箇所です。そして、Appleにバグレポートしても治らない。こんな根本的な部分で不具合を起こされても困るのですが……。
「システム環境設定」が「システム設定」に変わったときに、各設定Paneを表示するためのAppleScript用語辞書が機能しない、空白の期間が発生していました。macOS 14βで本機能が復旧されたのと同じタイミングで、macOS 13.xにもさかのぼって同じ機能が実装されました。
ただ、システム設定の各Paneへの表示切り替えが行えるだけで、たとえばオーディオ入出力デバイスの切り替え機能が提供されているわけではないため、それについては別途実装したものを呼び出すという解決方法が必要になります。
Piyomaru Softwareの電子書籍カタログ(2024年冬版)を刊行しました(フリー配布)。PDF 100ページです。
数年前は「AppleScriptの書籍がぜんぜんない」と言われていましたが、いまでは「多すぎて選べない」と言われる状況に。いろいろな角度から、ぴったり合う本が選べることでしょう。
macOS 13.6.3betaが出てきました。通常のmacOSでは、マイナーアップデートが.6台で終了することが多く、.7台まで行くことは「まれ」です。
誰もが目を覆いたくなるような大失敗だった「macOS 10.13」「macOS 10.15」(はじめてBlogに登場記事の掲載を拒否)といった、歴史に残る失敗OSバージョンでも、マイナーバージョン6ないし7で打ち止めです。
# 歴史に残る失敗バージョンのmacOSには、Apple Siliconで不具合出まくりのmacOS 11(永遠のβ)とか、Release後にバグが出まくるmacOS 12、13もあるわけで、いい加減にしていただきたいところです
早速、Cocoa-AppleScript Applet(通常環境ではない、Script Editorのテンプレートから作成する特殊なCocoa AppleScript環境)が動作するのかどうか確認してみたところ、相変わらず動きません。
Cocoa-AppleScript Appletが動かない問題が、macOS 13.x台で改修されるのかは、果てしなく怪しい雰囲気になってきました。
●Mac OS X v10.0 (Cheetah)~10.0.4 (2001年6月22日)
2001年3月24日
●Mac OS X v10.1 (Puma)~10.1.5 (2002年6月6日)
2001年9月25日
●Mac OS X v10.2 (Jaguar)~10.2.8 (2003年10月3日)
2002年8月24日
●Mac OS X v10.3 (Panther)~10.3.9 (2005年4月15日)
2003年10月24日
●Mac OS X v10.4 (Tiger)~10.4.11 (2007年11月14日)
2005年4月29日
●Mac OS X v10.5 (Leopard)~10.5.8 (2009年8月5日)
2007年10月26日
●Mac OS X v10.6 (Snow Leopard)~10.6.8 v1.1 (2011年7月25日)
2009年8月28日
●OS X v10.7 (Lion)~10.7.5 (2012年9月19日)
2011年7月20日
●OS X v10.8 (Mountain Lion)~10.8.5 (12F45) (2013年10月3日)
2012年7月25日
●OS X v10.9 (Mavericks)~10.9.5 (13F34) (2014年9月17日)
2013年10月22日
●OS X v10.10 (Yosemite)~10.10.5
2014年10月17日
●OS X v10.11 (El Capitan)~10.11.6
2015年09月31日
●macOS v10.12 (Sierra)~10.12.6
2016年10月21日
●macOS v10.13 (High Sierra)~10.13.6
2017年10月21日
●macOS v10.14 (Mojave)~10.14.6
2018年09月26日
●macOS v10.15 (Catalina)~10.15.7
2019年10月8日
●macOS v11 (Big Sur)~11.7.3
2020年11月13日
●macOS v12 (Monterey)~12.6.3
2021年10月22日
●macOS v13 (Ventura)~13.6.3?
2022年10月24日
●macOS v14 (Sonoma)~14.0
2023年09月27日
macOS 13.xで、アプリケーション組み込み型のAppleScript実行環境(内蔵Script Menu装備)において、ホームディレクトリ下のAppleScriptライブラリを読み込んで実行することが「できなかった」ものを、「できる」ように改修されたようです。
実際に確認を行ったのは、macOS 13.xとCotEditorの組み合わせにおいてです。macOS 13の早期バージョンにおいてはライブラリ呼び出しが行えなかったものが、macOS 13.6.2においては呼び出せるように変わっています。なお、CotEditor側ではAppleScript実行機能まわりに改修を行なっていないことを確認しています。
CotEditorのAppleScript実行機能の実装はosascriptコマンドを呼び出すというものであり、手間をかけていない割に.scpt形式も.scptd形式も実行できるため、「妥当な実装」といったところでしょう。
自分は、各AppleScriptランタイム環境においてAppleScriptライブラリの読み込みと実行が行えるかをチェックしており、現時点でこれが行えない環境は……
・Automatorおよび書き出したアプレット(古すぎる。廃止予定)
・スクリプトエディタの内蔵コンテクストメニュー(セキュリティ的に無理そう)
・フォルダアクション(セキュリティ的に無理そう)
・Switch Control(パレットごと配布することを考えると、やらないほうが安心?)
・FileMaker Pro(構造が違いすぎて対応が難しい?)
・Hammerspoon(applescriptFromFile)(できてもおかしくないが……)
と認識しています。もしかしたら、Hammerspoonは再確認したら動くかもしれません。
なお、もっと巨大で深刻なバグ(AppleScriptドロップレットにドラッグ&ドロップしたファイルが正しく処理されない問題)はmacOS 10.12から相変わらず放置されています。
電子書籍「AppleScript最新リファレンスv2.8対応」の英訳プロジェクトを開始しました。
同書は、1,000ページを超えるボリウムを持つ大規模書籍であるため、いきなりすべてを翻訳することはできません(間違いなく挫折します)。そこで、おおよそ250ページごとに分けた4分冊にする方向で作業を進めることにしました。
まずは、スクリプトエディタ内のローカリゼーションファイルから情報をClaris FileMaker Proに書き出して、検索できるようにしてみました。
実際にAppleScriptを書いてスクリプトエディタ内のloctableファイルを読み込んで言語ごとに分け(macOSは39言語にローカライズされている)、Claris FileMaker Proにデータを順次格納してみたら、1万レコードを超えてもまだ処理が続きそうだったので、強制停止。
enと「en_GB」、それと「ja」のローカライズ情報のみに限定して書き出しておいたほうがよさそうです。
あとは、macOS/AppleScriptの専門用語について日本語と英語の対訳データベースを作っておきたいところです。
AppleScript名:Script Editor内部のloctable情報を抽出.scpt |
use AppleScript version "2.4" use scripting additions use framework "Foundation" script spdB property urlList : {} end script property NSPredicate : a reference to current application’s NSPredicate property NSArray : a reference to current application’s NSArray –Script Editorのバンドル内のResourceから「.loctable」で終わるファイル名のパスを抽出 tell application "Finder" set defPath to application file id "com.apple.ScriptEditor2" end tell set defPath to (POSIX path of (defPath as alias)) & "Contents/Resources" –Cocoa流のPOSIX path set fList to getFilesIn(defPath) of me set anArray to NSArray’s arrayWithArray:fList set aPred to NSPredicate’s predicateWithFormat:"SELF ENDSWITH ’.loctable’" set locRes to (anArray’s filteredArrayUsingPredicate:aPred) as list –.loctableファイルでループ repeat with i in locRes set j to contents of i set (urlList of spdB) to (my readPlistAt:(j)) set langKeys to ((urlList of spdB)’s allKeys()) as list –Language Codeでループ repeat with ii in langKeys set jj to contents of ii set aLangDat to ((urlList of spdB)’s valueForKey:jj) —plist(=loctable)のlabelでループ set allLangKeys to (aLangDat’s allKeys()) as list repeat with iii in allLangKeys set jjj to contents of iii set aVal to (aLangDat’s valueForKey:(jjj)) copy {j, jj, jjj, aVal as string} to tmpList createFMRec(tmpList) of me end repeat end repeat end repeat on createFMRec(aList) copy aList to {f1, f2, f3, f4} tell application "FileMaker Pro" tell database 1 set curRec to create new record tell curRec set cell "FilePath" to f1 set cell "LangID" to f2 set cell "LabelName" to f3 set cell "stringVal" to f4 end tell end tell end tell end createFMRec –Read Plist on readPlistAt:thePath set thePath to current application’s NSString’s stringWithString:thePath set thePath to thePath’s stringByExpandingTildeInPath() set theDict to current application’s NSDictionary’s dictionaryWithContentsOfFile:thePath return theDict end readPlistAt: –指定フォルダ内のファイルのフルパス一覧を返す on getFilesIn(posixPath) script spd property allItems : {} end script set allItems of spd to {} — make URL set theNSURL to current application’s |NSURL|’s fileURLWithPath:posixPath — make file manager set theNSFileManager to current application’s NSFileManager’s new() — get URL enumerator set theNSFileEnumerator to theNSFileManager’s enumeratorAtURL:theNSURL includingPropertiesForKeys:{current application’s NSURLIsDirectoryKey, current application’s NSURLIsPackageKey} options:((current application’s NSDirectoryEnumerationSkipsPackageDescendants) + (current application’s NSDirectoryEnumerationSkipsHiddenFiles as integer)) errorHandler:(missing value) — get all items from enumerator set (allItems of spd) to theNSFileEnumerator’s allObjects() set theFolders to {} — to store folders — loop through repeat with i from 1 to count of (allItems of spd) — is it a directory? set {theResult, isDirectory} to ((item i of (allItems of spd))’s getResourceValue:(reference) forKey:(current application’s NSURLIsDirectoryKey) |error|:(missing value)) if isDirectory as boolean = false then set {theResult, isPackage} to ((item i of (allItems of spd))’s getResourceValue:(reference) forKey:(current application’s NSURLIsPackageKey) |error|:(missing value)) — is it not a package? if not isPackage as boolean then set end of theFolders to (item i of (allItems of spd))’s |path|() as string –«class furl» end if end if end repeat return theFolders end getFilesIn |
macOS 13.6.2アップデートが配信されました。Cocoa-AppleScript AppletがmacOS 13.xの途中で動かなくなり、macOS 13.6.x台で修正されるのではないか? などと思っていましたが、そういう状態にはなっていないようです。
ちなみに、macOS 13.xよりももっと古いOSで「Cocoa-AppleScript Applet」のアプレットを作成し、そこから実行バイナリ部分(/Contents/MacOS/CocoaApplet)を抜き出して、macOS 13.x上で作ったCocoa-AppleScript Appletの同一バイナリを削除して入れ替えると動く、という検証報告も入っています。
正直、Cocoa-AppleScript Appletは登場以来、「こんなので使えるか!?」という存在でした。その後OS X 10.10で一般のAppleScript実行環境でCocoa呼び出しが許可されてから、Scripter側にCocoa活用のノウハウが蓄積され、「標準環境よりもできることが多い」とのことで再評価されたものでもあります。