Naganoya作成した画像(NSImage)に円を塗るAppleScriptです。最近、6角形の図形ばかり塗りつぶしていましたが、「円に変えるとどうなんだろう?」と考えて、本ルーチンを試作してみました。ためしに、6角形ではなく円で塗りつぶしてみたものの、そんなにイケていない感じがします。Naganoya指定画像の指定エリア(矩形)を透明色で塗りつぶすAppleScriptです。透明色で塗りつぶす=矩形で切り抜いたようなかっこうになります。画像(NSImage)を指定色で塗りつぶすという処理はよく見かけるものですが、clearColor()(透明色)で塗りつぶすという処理を行うとどうなるかといえば............何も起こりません。透明色でNSImageを塗りつぶすという処理は、たいへんに「ありそう」な処理ですが、なかなか見つからない。探し回ったのですが、自分には見つけられませんでした。Edama2さんに相談してみたところ、こういう処理を探し出してもらえました(ありがとうございますー)。見つけてきた処理そのままでは思い通りの結果にならなかったので、修正が必要であったとのこと。透明塗りつぶし(切り抜き)の指定座標はCocoaの座標系をそのまま利用しているので、左下が原点です。NSBezierPathで切り抜き(透明色で塗りつぶし)できるといいのになーという感じではあります。commentBlogアーカイブのMarkdown書類をリネーム。NaganoyaFinderで選択中のファイルすべてに対して、親フォルダ名、親+1階層のフォルダ名を反映させたファイル名をつけるAppleScriptです。Blogアーカイブ本を作るのに、こうした道具を作って使っています。一度書いておけば、2度目からは大幅に時間を短縮できます。最初のファイルから拡張子を取得してそれを後続のファイルすべてに適用するため、同一種類のファイルである必要があります。自分用のツールならではの手抜きといったところでしょうか。AppleScript名:BlogアーカイブのMarkdown書類をリネーム。10.14ですが、やはりバグはありました。デフォルト設定値の問題で、階層表示は行えることを確認しました。10.14ではこれがパッケージ内のファイルは選択できるものの、階層表示できていません。contentsの挙動なんて見たことがありません。10.14.6上の動作。edama2さんから「こちらではそういうことはないよ?」というツッコミを送っていただきました。10.14では「なし」ではなく「名前」になっているために、自分のデフォルト設定では階層表示されていなかったようです。10.14.6環境の初期状態。Naganoya入力フォームつきのPDFにデータ入力して別名保存するAppleScriptです。他のGUIアプリを操作してフォーム入力するのではなく、直接PDFKitの機能を利用してフォームPDFへの記入を行なっています。テキスト入力フォーム、チェックボックス、コンボボックスへの入力に対処してみましたが、リストボックスの項目選択はまだ行えていません。Debugger上で表示したPDFフォーム上の各種プロパティ。NaganoyaオープンソースのGPUImage.frameworkはAppleScriptから呼び出すのも簡単ですし、機能セットも充実しており、非常に重宝して使っています。GPUImage自体はSwiftで書き直されたGPUImage2、OSの変更を受けてOpenGLではなくMetalを用いるように書き直され、いまだ発展途上のGPUImage3と変化してきました。45GPUImage2/3とバージョンが進むにつれて搭載フィルタ数が減っており、かつAppleScriptから呼べないため、GPUImage3は(自分の)移行先になりません。Objective-CベースのGPUImage1系のプログラムを使い続けるという判断をしている開発者は多いようで、Github上で派生プログラムが大量にみつかります。GPUImage1系はmacOSがOpenGLを完全廃止にしたとたんに動かなくなるはずです。このため、GPUImage1系に依存しているプログラムは別の部品を呼び出して処理する必要が出てきます。有望なのは、macOS標準搭載のCIFilter。CIFilterについては、実際にプログラムを組んでみて「組みにくい」という印象を受けていました(機能はちゃんとしていそうなものの、機能数にドキュメントが見合っていません)。あと、AppleScriptからパラメータを指定しにくいという印象を受けていました。その後、各種フィルタを呼び出す汎用ルーチンを整備することで、利用難易度を下げる努力を自主的に行なっています。174そこで、実際に処理速度の面でどうなのか、CIFilterとGPUImageを比較するとどうなのか、調べてみました。ありもののルーチンを引っ張り出してきて実行。どちらも期待どおりの動作をしてくれます。周辺ルーチンの仕様が違っていたのでそこも合わせます。commandの「uuidgen」はお手軽な反面、呼び出すのに時間がかかるので(手元の時間で0.1秒程度強)、より高速なCocoaのUUIDStringを用いる部品に置き換えました。それぞれのフレームワークごとの挙動の違いもあります。経験上、GPUImage.frameworkは初回実行時だけは時間が長くかかる傾向があり(1秒以上かかる)、2回目以降はより短い時間で処理できるようになることを確認しています。CIFilterは初回およびそれ以降の呼び出しでもさほど処理時間が変わりません。これら2つを実際に同じデータで同一条件下で比較してみたところ、同一の処理(画像の差分計算)を行なったかぎりでは処理時間に差はほとんど有意な差はありませんでした。2)を0.1〜0.2秒程度で処理できています。Disk上に置いたり、並列処理するとよいのではないでしょうか(シングルスレッド処理が高速なマシンを用意するというのが一番効きそうではあります。5Kの上位モデルとか)。v3」を作成済みなので、GPUImageなしでもさほど困りません。v3」で各種サイズの画像の空白検出を実行(単位:秒)Objective-C/Swift系の開発者の方々に「GPUImageを経由してGPUのパワーを使って処理するよりも、AppleScript単体で空白の比較演算処理したほうが速かった」という事実をお話しすると、最初は「嘘つけ」というひきつった笑顔の反応なのですが、実際にコードを動かして動作原理を丁寧に説明すると分かっていただけるようです。Naganoya指定ファイルからのメタデータ情報の取得を行うAppleScriptです。commandの「mdls」で行えます。ループですぺての属性値を取得するか、属性ラベルを指定して個別に属性値を取り出すことになります。commandのほうが手っ取り早そうです。IDで指定したアプリケーションからすべてのLocaleを取得し、ダイアログ選択したLocale内のすべてのstringsファイルを読み込んでNSDictionary化して指定のキーワードを含むものを抽出するAppleScriptです。stringsファイルのパスをリストで返します。調査のための下調べを行うものです。getLocalizationsFromBundleID–指定アプリケーションファイルの、指定Localeにおけるローカライズ言語リストを求める。Naganoya指定フォルダ以下のすべてのファイル名とフォルダ名から絵文字を除去するAppleScriptです。StanleyのremoveEmojiルーチンを使っています。10.14.1で絵文字が大幅に追加されたため、これらの絵文字をファイル名に用いていた場合には10.14.1以下のバージョンのOS環境にそのままファイルを持っていくことができません。コピーできない(エラー)という状態になります。絵文字自体に害はないのですが、規格がコロコロ変わる(追加される)ことで、ファイル名に用いるのには問題があるということでしょう。▲もともとのファイル名、フォルダ名。絵文字を大量に使用している(普段はファイル名に絵文字は使っていません)▲本Scriptで一括で処理したファイル名、フォルダ名。pathを用いて指定フォルダ以下すべてをリネームするようなScriptは組んでいなかったので、ちょっと考えさせられました。10.13.6の環境に持っていけました。絵文字がないと寂しい感じがします指定フォルダ以下のファイル/フォルダを一括取得するのに、今回はあえてSpotlightを使っていません。ファイルサーバー上のファイル/フォルダを処理する可能性がありそうなのと、外部ライブラリを使わないほうがよいと考え、このような構成になっています。NaganoyaSafariの最前面のウィンドウで表示中のページのうち、現在ウィンドウ内に表示中の表要素をCSV書き出ししてNumbersでオープンするAppleScriptの改良版です。HTMLのtable中にrowspan(複数セルを行方向に連結)とcolspan(複数セルを列方向に連結)の属性値が指定されていた場合に対応します。ElementsのWebコンテンツ中の表示座標を取得して、絞り込みを行なっています。各DOM座標はWebブラウザのスクロールにしたがって数値が変わる(相対座標)ため、少々手こずりました。本Scriptでは上下スクロールのみ考慮してDOM要素の抽出を行なっており、横に長いページの横方向スクロールは考慮しておりません。colspanへの対処を追加しました。行単位で(1次元配列ベースで)表を作っていてはとても対処できなかったので、HTMLの表と同じセル数のヌル文字が入った2次元配列を作成し、そこにX座標/Y座標を指定してセルを埋めるように処理内容を変更しました。rowspan/colspanの属性を見つけた場合には、結合されていた複数セルを個別の(同じ値を入れた)セルに分解しています。本バージョンでは、1つのセル(td)でrowspanとcolspanを同時に指定しないことが処理の前提条件となっています。上の行がヘッダーの場合を想定しており、一番左の列がヘッダーになっているケースには対処しておりません。Naganoya指定のAppleScript書類からソーステキストを取得して、書き換えたあとに別途ファイル保存するAppleScriptです。OSAKitの機能を利用しており、スクリプトエディタを使用しません。最小限の実装しかしていませんが、これ以上どこをどうするという箇所もないのでこんなもんなんでしょう。.scptファイルについてはこんな感じで処理できそうですが、.scptdファイルの書き換え処理についてはノーアイデアです。バンドル内の指定の.scptファイルを書き換えるといった、rtfとrtfdの関係のような感じになるのだろうかと思わないでもありませんが、いろいろ落とし穴がありそうで困ります。Appletに書き出すAppleScriptも作って試していますが、OS内の機能をそのまま使っているだけだと、バンドル形式のScriptのバンドル中に含まれている他のファイル(ライブラリとか、Frameworkとか、起動時に表示できるdescription.rtfdファイルとか)をもともとのScriptからコピーしてくれないので、そのあたりいちいち自分で書かないといけないのでしょうか。スクリプトエディタをAppleScriptからコントロールしてAppleScript書類をAppletに書き出すような処理はよくやっていますが、OSAKitの機能を用いて同様のことは行えます。フラットなScript書類(バンドルではない)をアプレットに書き出す程度の処理が(現状では)到達点のようです。大量のAppleScript書類を高速にアプレット書き出しする必要があれば、それなりに時間をかけて処理を記述するかもしれませんが、そういう用途がなければスクリプトエディタをコントロールしたほうがよさそうです。Naganoya指定フォルダ以下のすべてのAppleScript書類(通常書類、バンドル書類)をSpotlightで検出して、各書類の冒頭に書いてあるヘッダーコメントをすべて書き換えて保存するAppleScriptです。MacOSの時代からやっていた記憶があります。AppleScriptをAppleScriptで書くとか書き換えるといった処理は、割と重箱の隅をつつくような(メーカー側も想定していないわけではないだろうけれど、そんなに検証してなさそう)ものなので、未知の問題に遭遇することの多いものです。安定して動作させられれば得るものも大きいです。CotEditorの配布用サンプルScriptをまとめる際に、ヘッダーコメント部分を統一する作業がなにげに大変でした。そこで、本Scriptを作成して一括してAppleScript書類のヘッダーコメント統一を行えるようにしました。60ファイル程度あるので、すべて手作業で書き換えるのは非効率的です(サンプルを書くよりも本Scriptを書くほうが時間がかかりました。一度書けば2度目以降は自動で処理できます)。EditorをコントロールしてAppleScript書類の書き換えを行っています。AppleScript書類自体の詳細な書式情報はCocoaの機能を用いて抽出しています。Editorをコントロールするメリットはありません(Cocoa側の機能を用いてScriptの修正と保存ができれば、すぐにでも本ワークフローから外したい)。AppleScriptの構文色分け書式にアクセスして構文要素を文字色で区分けしているため、本Scriptの実行環境で構文色分け書式がデフォルトのままとか、各構文要素の指定色でごくごく似たものがあったような場合には正常に動作しません。v4」になっているのは、コメントを追加するプログラムとコメントを削除するプログラムの2系統のものを別々に作って、最終的に「コメントを削除するプログラム」に機能を統合したためです。メインのScriptの内容のみ掲載していますが、(巨大な)ライブラリ入りのScript掲載は頭が痛いところです。実行して試せるということを重視してみました。NaganoyaSafariの最前面のウィンドウで表示中のページのうち、現在ウィンドウ内に表示中の表要素をCSV書き出ししてNumbersでオープンするAppleScriptです。このところ下調べを行なっていた「Webブラウザで表示中の要素を処理する」「表示中ではない要素は処理をしない」というScriptです。これで、「表の一部を選択しておく」とかいった操作は不要になりました。ウィンドウ内に表示されている表をWebコンテンツ内部の表示座標をもとに自動抽出します。表示エリア外に位置しているものは書き出し処理しません。ElementsのWebコンテンツ中の表示座標を取得して、絞り込みを行なっています。各DOM座標はWebブラウザのスクロールにしたがって数値が変わる(相対座標)ため、少々手こずりました。本Scriptでは上下スクロールのみ考慮してDOM要素の抽出を行なっており、横に長いページの横方向スクロールは考慮しておりません。本Scriptは大量一括処理を志向するプログラムではなく、「見えているもの」をそのまま処理してほしいという考えで作ったものでもあり、Webブラウザ(Safari)で表示中のページのソースを取得してそのまま処理しています。ユーザーが閲覧中のページのデータそのものを処理しています。Chromeにはできない処理です(同じURLの内容を別途curlコマンドなどで取得すればOK。Cookie値などの再現が大変でしょうけれども)。その他、実際に作って使ってみた感想は、装飾用に使われている表データまで取り込んでしまう点に不満があるぐらいでしょうか。これら「ゴミデータ」(再利用する価値のない装飾用の表データ)を区別するために、行数が足りない場合には書き出さないといった「足切り」を行う必要性を感じます。NaganoyaバンドルIDで指定したアプリケーションのResourcesフォルダ中の、指定ロケールのstringsファイルをすべて読み込んでkeyを取り出すAppleScriptです。アプリケーション内の指定のローカライズしたメッセージ(テキスト)の内容を取り出すことはできますが、そのためにはキーを知っておく必要があります。そのキーを取り出してローカライズされた文字列を取り出すため、キーを調査してみました。これをそのまま何かのツールなりScriptに使うというものではなく、いわゆる「下調べ」のためのScriptの部品です。ありもののルーチンを再利用しただけのプログラムでできていますが、ありものはありもので、数千本のAppleScriptのストックからそれを探し出してくるのも一苦労です。アプリケーションバンドル内のResourcesフォルダ以下の(各lprojフォルダ以下の)stringsファイルの中身はまんま(シリアライズした)NSDictionaryなので、そのままDictionaryに読み込んでallkey()などのメソッドを実行できます。昔のstringsファイルはテキストファイルだったような気がしますが、テキストファイルだとparseしないといけないんで、ビルド時にparseしておいてDictionaryの状態でファイルに書いておくのは正しいと思います。8あたりから、アプリケーションのローカライズのルールが変更になったようで、基本となる言語環境がBase.lprojになり、英語はen.lprojといった1ローカライズ言語という位置付けに変更になりました。NSLocalizedStringFromTableInBundleを使ってアクセスしようかとも思ったのですが、こちらはまだ目的を達成できていません。11上で実験的に作成したAppleScriptアプリケーションのバンドル構造(左)。ローカライズしていない状態だとEnglishではなくBase.lprojが作成される。右はKeynote.app/Contents/Resources/ja.lprojフォルダの内容。getLocalizationsFromBundleID–指定アプリケーションファイルの、指定Localeにおけるローカライズ言語リストを求める。NaganoyaSafariで表示中のページのうち、テキストを選択中のキーワードを含む表をCSVファイルに書き出してNumbersでオープンするAppleScriptです。movie実行前にSafariの「開発」メニューから、「スマート検索フィールドからのJavaScriptの実行を許可」「AppleEventからのJavaScriptの実行を許可」を実行しておく必要があります(実行済みの場合には必要ありません)。▲本Scriptで表をCSVに書き出してNumbersでオープン以前に作成した「Safariで表示中のPageの選択中の文字を含む表データを取得」Scriptがいい線を行っていた(あらかじめ表中のテキストを選択しておく、という前提条件がかったるいかと思っていたのに、そうでもなかった)ので、ありもののサブルーチンを追加して、表部分のHTMLからのタグ削除やCSV書き出しなどを行えるようにしました。v6.1に「表を新規作成して表のセル数を指定すると多くの場合にエラーになる」というバグがあるので、Numbersを直接操作してデータ出力させることはやっていません。処理時間もさほどかからないので、表示中のページのすべての表オブジェクトをCSV化したり、表を選択するUIを実装して、「どの表を出力するか?」という選択処理をしてもいいかもしれません。▲漫然とMacOS日本語で書き出ししたため文字化けしたもの(左)、UTF8を指定して書き出ししたために文字化けしなくなったもの(右)途中でCSV書き出しした表データに文字化けが発生していたのですが、これはUTF8でファイル書き出ししていなかったためでした。本Scriptは前バージョンよりもキーワードの検出処理をていねいに行なっています。各TableのHTMLに対してタグの除去を行なったうえでWebブラウザ上で選択中の文字列を含んでいるかどうかをチェックしています。Naganoya指定アプリケーションのsdefの内容を強引に取得するAppleScriptです。スクリプトエディタをAppleScriptからコントロールして、指定アプリケーションのsdef(AppleScript用語辞書)の内容を取得します。AppleScript対応のアプリケーションに限ります。対応/非対応の判定はあらかじめ行なっておいてください。Libraryの整備のための資料として、既存のAppleScript対応アプリケーションの識別コード(4文字コード)を取得して確認しておきたかったためです。2:アプリケーションバンドル内のsdefを取得という流れになります。これで済めば処理は非常に短時間に完了します。ファイル処理だけなので。実際にやってみると............標準的な方法でsdefを取得できないアプリケーションがいくつか存在することに気づきます。Illustratorなどバンドル内にsdefが存在しない。動的にsdefを生成しているのでは?(2)scriptSuite+scriptTerminologyバンドル内にsdefではなく.scriptSuiteファイルと.scriptTerminologyファイルを格納。Editor.app)などが該当する。一部のアプリケーション(MS-Officeなど)ではsdefファイルのうち一部を外部からincludeしているため、アプリケーションバンドル内のsdefファイルを読んだだけでは完全なsdefが取得できないといった問題もあります。そこで、この「スクリプトエディタをコントロールしてsdefの内容を取得する」という頭の悪そうな処理が必要になりました。10.14.x)でsdefコマンドはうまく動いていないように見えます。Naganoya指定フォルダ以下のアプリケーションをSpotlightで検索して、それらのうちAppleScript対応の(Scriptableな)ものを集計するAppleScriptです。Libを呼び出してSpotlight検索を行い、アプリケーションファイルの一覧を取得。その後、各アプリケーションのInfo.plistの情報を取得してNSAppleScriptEnabled=trueのアプリケーションのパスをlist(array)に追加します。Author)これだけではScript対応かどうかの完全な判断は行えません。AppleScriptなどのOSA言語によるコントロールに対応していないアプリケーションはこれで完全にフィルタできます。NSAppleScriptEnabledのエントリがInfo.plistに存在しないものは非対応アプリケーションです。非対応のアプリケーションに対して、AppleScriptからは起動、終了、ファイルのオープン、印刷などの基礎的な操作やアプリケーションの情報取得(名称やバージョンなど)、Finder経由で指定書類をアプリケーションでオープン、ぐらいの操作。Scriptingによるメニューやボタンの強制操作しかできません。Frameworkで読み込んで、本文(HTML)中に記載されているリンクURLを抽出するAppleScriptです。eml形式ファイルは、Mail.appからドラッグ&ドロップでメールを書き出したファイルです。書き出し後のファイルはMail.appの管轄ではなく、メールデータはFinderの専門外。AppleScriptではこのeml形式ファイルへのアクセスは一切できず、eml形式ファイルが相手では手も足も出ませんでした。10.10でAppleScriptの主要ランタイムでCocoaの機能が利用できるようになり、これまでにアクセスできなかったデータ形式にアクセスできるようになりました。その典型例がこのemlファイルです。メールの各種データへのアクセスを行えるMailCore2.frameworkを使えば、簡単にこのemlファイル内の各種情報にアクセスできます。各種Frameworkに甘やかされまくって、HTMLを自力でparseするとかいったことは一切努力しようとしていない今日このごろ。Frameworkで解釈したHTMLからリンクをひとまかせで抽出しています。Illustrator書類上にある、QRコードのオブジェクトをクリップボード経由でNSImageに変換してQRコード認識するAppleScriptです。Framework化したものを使っています。Illustrator書類上になにがしかのプラグインで作成されたとおぼしきQRコードのオブジェクトが配置されていたことです。これをデコードして内容が正しいか、デコードしたURLは実在するものかといったチェックをする必要がありました(もっと大きなプログラムの一部として)。これはけっこうな難問でした。AI書類全体をPDFや他の形式の画像として書き出したものを認識させてみたものの、なかなかQRコードとして認識してくれません。試行錯誤していくうちに、AI書類を構成する各部品ごとに画像書き出しして認識させると、QRコードとして認識したりしました。item)にアクセスし、クリップボード経由で(いったんコピーして)画像に書き出すと認識してくれました。ファイルに書き出すオーバーヘッドを減らしたかったので、クリップボードの内容をそのままNSImageとして取得。clipboard)からCocoaのNSPasteBoardを使うように変更したことで、大幅なスピードアップを図れました。クリップボード経由でデータ変換するやりかたは、データが小さければ手軽かつ便利でいいのですが、データが大きくなると処理に時間がかかってたいへんです。Xへの移行時のScripter間の共通認識だったので、なるべく避けていたんですね)。Illustrator上でコピーしておいたQRコードのオブジェクトを、クリップボード(ペーストボード)経由でQRコードとしてデコードするものができ、便利に使っています。Debugger、マシンのSIPを解除してあればスクリプトエディタ上でも動作という環境で動作します。10.14.x上でSIPを解除していない状態でも、アプレット書き出しした状態であればバンドル内のFrameworkを読み込んで動作します。Naganoya指定の画像ファイルをグレースケールのPNG画像ファイルに変換するAppleScriptです。Framework化してみたところ、グレースケールの画像を要求されたため、画像をグレースケール化するルーチンを作ってみました。結局、MNISTの手書き画像認識はうまく行かなかったのですが(全部「0」が返ってくる、、、)、グレースケール変換ルーチンは実用的だったので載せておくことにしました。