commentBlogアーカイブのMarkdown書類をリネーム。NaganoyaFinderで選択中のファイルすべてに対して、親フォルダ名、親+1階層のフォルダ名を反映させたファイル名をつけるAppleScriptです。Blogアーカイブ本を作るのに、こうした道具を作って使っています。一度書いておけば、2度目からは大幅に時間を短縮できます。最初のファイルから拡張子を取得してそれを後続のファイルすべてに適用するため、同一種類のファイルである必要があります。自分用のツールならではの手抜きといったところでしょうか。AppleScript名:BlogアーカイブのMarkdown書類をリネーム。NaganoyaNumbersでオープン中の最前面の書類中にあるすべてのシートの名前を置換するAppleScriptです。内容は簡単ですが、Numbersにそうした機能が存在しないので、作っておくと便利です。アーカイブ本を作るのに、こうした(↓)資料を作る必要があるわけですが、そのためにこうしたこまごまとしたScriptをその場で作って作業の効率化を図っています。▲上の画像あくまでは処理イメージなので、厳密に同一データの処理前・処理後の画面スナップショットではありません。Object関連の調べ物をしていて、AppleのWebサイト掲載のReferenceを見ていたら、サンプルをまじえて説明されていたので、理解が深まりました。AppleScript:トップレベルObject。可変it:現在のアプリケーションObject。itというレベルになっていることもよく理解できました。サンプルが自分的にいまひとつわかりやすくなかったので、自分用に書き換えてみました。バージョン取得しないで名前を取得しないと分からないんじゃないでしょうか。testMeを続けることができません。Naganoya最前面のアプリケーションのAppleScript用語辞書をオープンするAppleScriptです。Menuに入れて呼び出すことを前提に作りました。かなた昔に作って、OSバージョンが上がるごとに細かい改修を行なって使い続けているものです。この手のScriptは日常的にAppleScriptを書いている人間なら、たいてい書いてみたことがあるはずです。生真面目なアプローチでアプリケーションバンドル中のsdefのパスを求めてオープンといった処理を行っていると、「例外」にブチ当たって困惑します。path)で指定してもsdefをオープンできません。Office系アプリケーションのsdefも、外部の(OS側のsdef)テンプレートをincludeするようなので、生真面目に対象アプリケーションのInfo.plistの情報をもとにアプリケーションバンドル中のsdefファイルをオープンするように処理すると、sdefの一部のみを表示するようになってしまって、sdef全体を表示することができません。Editorでオープンするように指定しています。"本アプリケーションは、各種OSA言語によるコントロールに対応していません。10.12から変更になっています。Visualizerによりバッチ出力。X環境に移行した後に重要度が上がったコマンドです。OS側が用意している特別な意味を持つフォルダの場所を返してくれます。X環境はマルチユーザー環境なので、とくにPicturesとかDocumentsとかDesktopとかの特別なフォルダのパスを求める機能は基礎的ではあるものの、とても重要です。このあたりをめんどくさがってなんでもかんでも固定パスで書きたがる人を見かけたことがありますが、その人が書いたプログラムは他のユーザー環境で動かなくて苦労していました(本人ではなく周囲の人々が)。AdobeのCS/CCアプリケーションのサンプルAppleScriptでも固定パスで書かれたものを多数見かけましたが、あれはなんだったんでしょう。OSのシステムフォルダ(Classic環境をサポートするOS&ハードウェアの組み合わせ上でのみ有効)などの「ドメイン」が指定できることになっていました。domainはユーザーのホームフォルダ以下。ProではNetBoot非サポート)ほか、そのような環境下にないと有意な結果が得られません。domainも使ったことのあるユーザーは稀(まれ)でしょう。10.12で変更になっていました。テンポラリフォルダの特性ゆえに、細かいディレクトリ名はユーザー環境ごと、実行時ごとに微妙に異なりますが(赤字部分が変化する部分)、上の図では(↑)どのあたりに作られるのかという点に着目して色分けしてみました。domainでも同じような場所が指定されることになることがわかります。ちなみに、Cocoaの機能を用いて求められる一時フォルダはまた別の場所が示されています。Naganoyaディスプレイの輝度変更を行うAppleScriptです。Scripting経由で(画面上のGUI部品を野蛮に操作して)変更するか、あるいは「他の方法」を採用することになります。本Scriptは「他の方法」をとってみたものです。画面の輝度変更については、そのようなニーズがあり、割とまともにOSに機能が実装されていることもあり、IOKitを呼び出して変更している例がいろいろ見つかります(Objective-Cとかで)。いったものをFramework化してAppleScriptから呼び出すか、あるいはコマンドライン上で動作するプログラムをAppleScript内に入れて呼び出すか、といったところになります。Github上で探し物をしてみたところ、nriley氏の「brightness」というツールがコマンドライン上から呼び出せるようになっており、AppleScriptのバンドル内に突っ込んで呼び出しやすそうでした。そこで、実際にAppleScriptバンドル書類中に突っ込んで、いい感じに呼び出せるように最低限の機能を実装してみました。ディスプレイの接続数の確認(getDisplayNumber)、指定ディスプレイの現在の輝度確認(getBrightNess)、そして指定ディスプレイの輝度設定(setBrightNess)です。bundle)ディスプレイ番号は1から始まるものとして扱っています。輝度は0.0〜1.0(1.0が一番明るい)までの値を指定します。ProやiMacなどの内蔵ディスプレイだけです。外部接続したディスプレイの輝度は変更できません。Mode運用している(本体を閉じて外部ディスプレイをつないで使っている)状態への対処などです。本Scriptはそこまで厳密な対応を行っていません。実用上はこのぐらいで問題はなさそうだ、という「割り切り」を行って手を抜いています。各条件でテストを行って「使える」という確証が得られたら、sdef(AppleScript用語辞書)をつけたライブラリにでもするとよさそうです。10.15.xは「バグが多すぎ」「実用性なし」と判断。10.15.xは自分としては「パス」するつもりなので、現時点において対処する必要性を感じません(仕事で納品するバイナリについては全力で対処しますが)。Naganoya指定文字列のAppleScriptをコンパイル(構文確認、中間コードへのコンパイル)、実行してエラーの詳細を取得するAppleScriptです。{NSAppleScriptErrorMessage:"beepz変数は定義されていません。NSAppleScriptErrorBriefMessage:"beepz変数は定義されていません。NaganoyaSVGのPath指定(相対座標指定)をparseして、x,y座標の最小値、最大値を求めるAppleScriptです。countryといった命令を作る野望が)。メルカトル図法の世界地図で塗った箇所がわからないぐらいの規模の国が世界中にはたくさんあることを再認識しただけでした。アメリカ合衆国とかロシアとか中華人民共和国ぐらい国土が広ければ赤く塗っておけば視認できますが、赤く塗っても面積が小さければ視認できません。そこで、地図上では「点」にしか見えないような国の位置を明示するためには、色を変えて塗る以外の表現方法が必要になってきます。SVG世界地図上では、それぞれの国データがpathで表現されていました。このpathはすべてを絶対座標で表現するタイプと相対座標で表現するタイプがあり、部品として使いまわしたりデータサイズを抑えることを考えれば、相対座標でデータ表現したくなることでしょう。実際、自分が見つけたSVG世界地図データは相対座標でデータが作られていました。そこで、指定のPath内の座標値をすべて絶対座標に計算し直しつつ、x,y座標の最小値、最大値を求め、その値を元に塗りつぶすことで、面積の小さな国の所在位置を赤い線の交点として表現できそうだと考えました。した実証実験のために作成したのが本AppleScriptです。テストデータは日本列島のもので、このサイズのデータからx,yの最小値、最大値を計算するのに0.06秒ぐらいで処理できています(自分の開発環境での計測値です)。プログラムの作りやすさを優先して、あとで全データから最大値/最小値を求めていますが、座標計算しながら最大値/最小値を求めれば、0.05秒ぐらいにはなると思います。同時に計算したら0.039秒で済みました座標データ数がそれほど多くないので、Cocoaの機能を利用しても大幅な速度向上は見込めません。▲米領サモア本Scriptで取得したPathの最小値、最大値をもとに塗りつぶしを行なってみたところ、地図上で1ドットにも満たないような面積の国でも所在位置がわかるように表現できました。面積に応じて、塗りつぶし時のアルファ値を変更するような処理もためしていますが、面積が広いのに点にも見えない国(島で構成される国)だと、対象が見えないのに塗りつぶし色が薄くて見にくいなど、まだいろいろ試行錯誤が必要なようです。code)で示した国の名称を取得するAppleScriptです。現在のロケールでローカライズして取得するもの(retCountryNameInCurrentLocale)と、指定ロケールでローカライズするもの(retCountryNameInSpecifiedLocale)を用意しておきました。v2.0(30言語以上ローカライズした)の審査は年越し確実で、審査に1か月以上かかるという、自分の知っている範囲での最長記録を更新しつつあります(AppleがOSに作ったバグを回避する以外の追加機能はわずかなのに)。そんな中、各国語で国名を表記する方法を調べておきました。ヒンディー語、タイ語、ギリシア語あたりは文字が見慣れないながらもギリギリ文字単位での識別が可能で、非日常感があって(日本語の表記範囲で出てこない文字なので)クールな感じがします(個人の見解です)。アラビア語やヘブライ語になってしまうと、コンピュータの挙動が変わってしまうので(表記が右→左)、ちょっとシャレにならない感じであります。Naganoyaアラートダイアログで、ウィンドウタイトルを表示させるAppleScriptです。dialog」が備わっていました。dialogコマンドの表示を見ると、あまりの素朴さに驚かされます。Xへの移行時にはいまひとつ合わない感じがしていました。alert」ダイアログです。Xらしく変更されました。alertは使いません)。notificationで通知表示が使えるようになり、これで一応の解決を見たというところでしょうか。Projectの中で「どうしても欲しい」という要望が出て、2000年代初頭にすでに仲間内で作ってもらったものがあり、AppleScriptから半透明のダイアログ(画面右側からスライドアニメーション表示)を表示させていました。tableといった、ダイアログに各種GUI部品を詰め込んで簡易表示させるインタフェース「箱庭インタフェース」が今年局所的なブームを起こし、地図は表示させるわテーブルは表示させるわ、世界地図を表示して国選択を行わせるわで「計算結果を手軽に表示できたり、ファイルパスをわかりやすく選択できて便利」という評価をいただいています。dialogのインタフェースを用いています。alertで表示されるものと同じGUI部品ですね。colorダイアログ。アイコン部分を色プレビュー領域に。強烈に使いやすいちょっとした結果表示や項目選択のためにアラートダイアログ上にGUI部品を並べるやりかたは、「アリ」だと思っています。そんな中、知り合い筋から「alertダイアログにタイトルは出せないのか?」と問い合わせがありました。Guidelineに合わない仕様なので、タイトル表示は使ってきませんでした。「箱庭インタフェース」シリーズでここまで無茶苦茶をやっておいて、いまさら他人に「HIGに反する」とかいっても説得力がまったくありません。HIGのガイドラインに反するといっても、実際に使い勝手がよくなったり、顧客や上司からの無茶振りをかわすためであればアラートダイアログにタイトルを追加するというのも、アリなのかもしれません。自分はやりませんけれども。Naganoya西暦→元号の変換を行うAppleScriptです。Library」をv2.1にアップデートしました。Debugger)の差異の影響を受けてドラッグ&ドロップを受信できないとか実行時に明示的にメインスレッド実行が必要になるケースが見られます。AppleScript用語辞書を通じてアクセスすることで、そうした問題を「うやむやにできる」ことがわかってきたので(技術的には説明できないものの、だいたいそんなもんだろうと予想はしていました)、こうした再利用の可能性が高いGUI利用部品は積極的にライブラリにまとめています。Naganoya指定緯度における1kmあたりの経度の角度などを計算するAppleScriptです。Rubyのコードで書かれたものがあったので、AppleScriptに翻訳してみました。三角関数を用いるため、関数計算ライブラリ「calcLibAS」を併用しています。Mapsの仕様で、地図表示エリアの指定時に表示距離ではなく表示角度(spn)が要求されるようなので、計算方法を求めておいたという次第です。scripter」の配布を開始しました。10.10以降(作成+動作確認は10.14)で、動作するはずです。Eventsで行われるため、本ライブラリを通じてMaps.appを操作しても、macOSの「セキュリティ」ダイアログは表示されません。そのかわり、100%操作できるという保証もありません(時間帯によって処理要求が返ってこなかったりします。Maps.appの実行のためにインターネット接続が必須です。Eventのみでコントロール可能なアプリケーションです。操作の方法がエキセントリックすぎるので、一般的なAppleScript対応アプリケーションと同様の英語的な用語でアクセスできるようにしてみました。例によって、実行結果イメージやサンプルScriptをsdefの中に入れてあります。here」コマンドが、のようなエラーを表示することがあります。これは、どうも位置情報サービスに要求を出したのに拒否されたという種類のOS側のエラーのようで、システム環境設定の「セキュリティとプライバシー」>「プライバシー」>「位置情報サービス」のあたりで認証が行われなくてはならないはずのもの(認証済み)が、エラーを起こしているようで、、、、macOS側のバグと言っていい挙動だと思います。Maps.app以外でも、AppleScript系の機能実装がおかしいApple純正のアプリケーションに対し、Framework経由でデータアクセスするようなライブラリがあると便利かもしれませんが、そこまでやったらフリー配布はちょっと勘弁してほしい感じがします。Naganoyaマウスカーソルの現在座標を取得するAppleScriptです。各種アプリケーションで座標系が微妙に(左上が原点だったり、左下が原点だったり)違いますが、Cocoaの座標系は左下が原点です。取得したところで何に使うかというあたりに疑問があります。そんなに使った記憶がありません。Menuから実行した場合には、実行時のメニュー選択のマウスカーソルの座標が返ってくるだけです。ひとひねりして、タイマー割り込みで定期的に取得したところで、何か意味のあるデータが取れるわけでもありません(ジェスチャー検出まで昇華できる気がまったくしない)。逆に、マウスカーソルの座標の取得でどれだけ「いいこと」があるか教えてほしいもんです。NaganoyaiTunesLibrary.framework経由でiTunes/Music.appのライブラリのジャンルごとの再生回数を集計するAppleScriptです。10.14.6)で0.7秒程度で終了します。10.15.1で0.6秒程度です。10.15以降(Music.app)でも同様にiTunesLibrary.framework経由でライブラリへのアクセスが行えます。List(1次元配列)のデータを指定セグメント単位で合成(加算)するAppleScriptです。何を言っているのか作った本人にしか通じない雰囲気が漂っていますが、単にデータの集計単位を変更するためのものです。24時間を1時間単位で集計したデータを3時間単位で区切って集計するとか、午前午後(2セグメント)でまとめて集計するとかといった用途に使います。いちじるしく、日常的に書き捨てしているレベルの処理ではありますが、再利用できる部品にまとめておきました。10.13.xでは、動くことは動くんですがOS自体の未修正バグが多すぎて動作保証いたしかねます)。OSをアップデートすると機能が落ちるとは何事だろう?PDFViewのド派手なバグ(currentPageを取得できない)を回避するために、自前でAppleScriptでいろいろ回避コードを走らせているので、ページめくりのスピードが落ちています(個人的にこれのために作ったので、テンションが落ちるところです)。Storeでリジェクトされる危険性があります(より新しい代替APIであるMetalを使わないと因縁を付けられる気が、、、)。そこで、GPUImageに依存しているコードをすべて書き換え、GPUImageを完全に取り外しました。これには、よくよく調べたら、PDFの各ページをグレースケール画像に変換する箇所でしか利用していなかったことが大きいです。これで、名実ともに「すべてAppleScriptで記述したアプリケーション」に。GPUImageの除去は使い勝手には一切影響しません。若干の前向きな機能追加も行なっておきましょう。これまでに意見として寄せられていないものの、どうもグレースケール画像で比較を行うことに不満を持っていたユーザーが一定数いるものとにらんでいたので、カラーのまま比較する機能を追加しました。正直なところ、「カラー比較モード」は個人的には不要と思っている(文字主体の書籍の校正用に作った)のですが、念のためです。PDFはデータ上のささいな違いを「見逃す」ように作ってあります。AcrobatのPDF比較機能が、見た目には影響を及ぼさないデータ上の些細な違いばかりピックアップして実用性がまったくないことから思いついたものです。見た目に影響のない差異を見逃して、見た目や文字で差が発生している箇所を指摘するツールという味付けになっています。画像サイズを小さくした上でグレースケール化して比較するのはそのための重要な機能です。間違って色が変わったことを検出したいような用途もあることでしょう。Spaceの削除機能を追加しました。細かい箇所でまだ不具合点(右側のビューワーのノンブルが表示されないことがある)がありますが、とりあえず出してみてもよさそうな気配はしています。Mode対応させました。Credits.rtfのダークモード対応など、地味に工数が増えるのは勘弁してほしいです。あとは、外部アプリケーション操作要求を行うためのInfo.plistのエントリ追加などもあります。これを追加しないと外部アプリケーションへの操作要求のダイアログ自体が出ない=一切操作できないので要注意点です。AppleScriptアプリケーションのプロジェクトを作ると、デフォルトではソースコード開示状態のビルドセッティングになってしまうので、これも要チェック点でしょう。onlyになっていませんでした。List(1次元配列)同士を加算するAppleScriptです。書き捨てていますが、AppleScriptにそんな命令はないのでループで加算することになります。最近では、Musicの楽曲ライブラリ中の曲の、カテゴリごとの最終再生日時の分布集計を行なったときに、「Classical」「クラシック」などの表記ゆれを吸収するために、これらの複数カテゴリのデータを合成するときに使いました。書き捨てレベルだとこんな感じ(↑)ですが、今後使い回すことを考えて書いておくと、こんな感じ(↓)でしょうか。Listを連続して大量に加算する必要が発生した際への対策を行なっています。