Menu

Skip to content
AppleScriptの穴
  • Home
  • Products
  • Books
  • Docs
  • Events
  • Forum
  • About This Blog
  • License
  • 仕事依頼

AppleScriptの穴

Useful & Practical AppleScript archive. Click '★Click Here to Open This Script' Link to download each AppleScript

投稿者: Takaaki Naganoya

macOS 12 beta7が登場

Posted on 9月 22, 2021 by Takaaki Naganoya

ここ最近のmacOSのβ版の出来・不出来

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は、不吉な予感を抱かせるものでした。

Cocoa ScriptingなどAppleScript系の処理速度の回復と向上

自分は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

さて、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)で関数計算を間違えるバグについては、当該機種を所有していないため、自分には追跡調査は行えていません。

Posted in Bug news | Tagged 12.0savvy | Leave a comment

Pagesの最前面の書類で選択中のツメを修正する

Posted on 9月 22, 2021 by Takaaki Naganoya

Pagesで作成中の書類すべての見開き右側ページ右端につけている「ツメ」(辞書や電話帳でページ端につけているマーク的なもの、A〜Zのうちいま「S」の部分を表示していますよ、という場合にはSの箇所のみ色を変えておくなど)の修正を行うAppleScriptです。

PagesはiWork 3兄弟で唯一、選択中のオブジェクトがselectionで取得できるアプリケーションです。selectionでオブジェクトを選択可能かどうかでScriptの書きやすさが段違いです。

「ツメ」の修正が必要な事態になりました。AppleScriptのプログラムでPages書類を順次オープンして、書類中の右側ページ右端についている超縦長の表オブジェクトを「ツメ」であると仮定。このツメ(表)の修正を行う処理部分が、本AppleScriptの該当部分です。

Pages書類上の表の各種操作は、削除についてはdelete row 2とかdelete column 3といった操作が行えるのですが、追加に関してはinsert rowとかadd rowといった明示的なコマンドがあるわけではなく、propertyのcount rowを変更することで表末尾への行追加を行うことになります。

その後は、表のセル内の値を移動させたり、書式を変更するなどの「つじつま合わせ」を行うことになるでしょう。

あとは、指定フォルダ以下に入っているPages書類を抽出して、順次オープンし、書類中の右側ページ右端にある「ツメ」を計算でピックアップ。「ツメ」に対して修正を行い、保存してクローズ、という処理になるでしょうか。一度しか使えない壮大な「使い捨てScript」です。

AppleScript名:選択中のツメの修正・変更.scpt
tell application "Pages"
  tell front document
    set aSel to selection
    
if aSel = {} then return
    
    
set aaSel to first item of aSel
    
    
tell aaSel
      set row count of it to 15 –表の行数変更
      
      
tell row 14
        set aCon to value of cell 1
        
        
tell cell 1
          set value to "14"
          
set font name to "7barSPBd"
          
set font size to 22.0
          
set text color to {32767, 32767, 32767}
        end tell
        
      end tell
      
      
tell row 15
        set value of cell 1 to aCon
      end tell
      
    end tell
  end tell
end tell

★Click Here to Open This Script 

Posted in Object control | Tagged 10.15savvy 11.0savvy 12.0savvy Numbers | 1 Comment

Pagesの座標系

Posted on 9月 19, 2021 by Takaaki Naganoya

ここしばらくPagesで書類を作る日々が続いていました。間もなく終わりそうな気配です。

Pagesは不思議なワープロというか簡易DTPアプリケーションで、Keynoteから派生したという独特の出自からして、さっさと何かページレイアウトを作って仕上げる……という味付けのアプリケーションであります。

さっさと作るのは、比較的苦もなくできます。1ページもののレイアウトぐらいならそうでしょう。

複数ページのレイアウトになってくると、やや大変です。ルーラーを表示して、ページのレイアウト範囲に補助線を引いて参考にするという作業が……できないことはないのですが、毎ページルーラーを引き直す必要があります。

書類のマスターページという概念がなく、いきなりテンプレートを作らされます。

それでも、1書類で巨大な内容を作らない。書類を極力小分けにする、といった方法でなんとか使いこなしてきました。

昔のバージョンのPages(iOSとソース共通化する前、旧Pagesと呼ぶ)は、もっとDTPソフトっぽい機能を有しており「普通のユーザーが使えるInDesign」とも言われ、けっこうよかったのですが……。

そんな現在のPagesではありますが、いろいろと対策が進んで作れるドキュメントの幅や分量も増えてきました。いま、200ページぐらいのコンテンツをPagesだけで作っていますが、もちろん書類は小分けにしまくっています。

その、Pagesの書類も分量が増えてくると……ヤツを入れたくなってきます。入れないとわからなくなってきます。ツメです。英語で表現すると、辞書のIndexといえばいいんでしょうか。辞書のページの端についている、アルファベットごとに検索しやすくするために印刷されている記です。

DTP系の人間にはおなじみの「手で作るのはごめん被りたいアイテム第1位」のアレです。手で作るなんて正気の沙汰ではありません。

でも、Pagesにその機能がないので、手作りしました。手作りしたのちに、やっぱプログラムで制御しないとしんでしまうと思い、いろいろ調べだしました。

そして知るのです。Pagesの座標系が全ページつながった独自のものであることを。

つまり、ツメの(縦方向、Y軸)の各ページ単位の座標系がないので、各ページのY座標の原点からの相対座標を計算するためには、ページの物理的なサイズ(座標的なX、Y軸の上限値)を知る必要があります。

ページの物理的なサイズを取る手段があるだろ……ない。

テンプレートには物理的なサイズの定義とかが……ない。

現在編集中の書類のページのサイズがわからないのは、けっこう困りますが……オブジェクトのサイズは計測できるので、あらかじめ各テンプレートの上にページいっぱいのサイズでオブジェクトを作っておいて、そのオブジェクトのサイズ(width、height)を調査。

テンプレート名称なりIDから、ページサイズ表を検索して、座標的なサイズを取得するしかないでしょう。

Posted in bounds | Tagged 10.15savvy 11.0savvy 12.0savvy Pages | Leave a comment

FM-1グランプリで予選通過

Posted on 9月 13, 2021 by Takaaki Naganoya

FileMaker Proのカスタムアプリケーション(データベース)のコンテスト「FM-1グランプリ」で、応募作品「FileMaker PowerPack」が第2回予選を通過しました(全3回の予選の2回目)。

内容は、FileMaker Proを制御するCocoa Scriptのサンプル集です。ちょうど、CotEditor用に出しているPowerPackのFileMaker Pro版といった位置付けで、厳選したCocoa Scriptを掲載しています。

他の開発者の方が使って便利と感じる「ベネフィット」だけの存在として企画し、「コピペで即戦力的に使えるAppleScriptのコード集。その場でテスト実行できる」という、ベネフィットだけで実体がほとんどないという不思議な異次元作品になりました。

実体がないといっても、FileMaker Proでできることが飛躍的に広がる……といいますか、各種掲示板などで「これができない」「これに困っている」という話が出ていたものを丹念に調査し、そうしたものを中心に(すべてではない)収録。とくに、HTMLのタグ除去処理とテキストからの絵文字除去処理!!!

さすがに強豪ぞろいで大賞は取れないと思うのですが、予選通過できて一安心です。一晩で作ったので、ちょっと問題点がいろいろありましたが、修正可能な範囲だったのでセーフ! セーフでしょう。

応募時の内容は、テキスト処理系と画像処理系を中心にまとめました。PDF処理系と画像フィルタ系も試していたのですが、FileMaker Proに組み込む書き方で難儀してこの第1回応募作品には間に合っていません。

# 画像のフィルタ処理を行うためにCIFilterを呼び出していたのですが、結局明示的にメインスレッド実行する必要がありました。FileMaker ProのAppleScriptランタイム環境の挙動が他の環境と違いすぎて、けっこう手を焼きます

応募作品の内容を審査していただいたところ、いろいろ細かい問題点は見つかりました。

・Retina環境で動かすと画像処理系で問題の出るScriptがある(顔認識+マスク処理)、、、これは、他の画像処理(重ね合わせとか)ではRetina対応できているので、こいつだけ間に合っていなかったっぽいです。FileMaker Pro上では単なるテキストとしてScriptを書く必要があり、バンドル内にライブラリを格納するとかインストールした外部ライブラリを呼び出せないといった「AppleScriptランタイム環境としては過酷」なFileMaker Proランタイムの制限が厳しいところです

・データベースが複数オープンされていると正しく「最前面のデータベース」を検出できない、、、、database 1で最前面のデータベースを指定してしまったので、その点を修正。審査Blogには「M1対応していない」と書かれていますが、開発自体をM1 Mac miniで行なっているので、複数データベースをオープンしている状況に対処できていなかっただけでしょう(アプリケーションを終了してデータベース1つだけの状態になったので動作)

ルール上、3回目の最終選考に修正したものを出せることになっているので、FileMaker ProでPhotoshopばりの画像フィルタ処理を行いまくるScriptを追加して出せるといいのではないかと(ただ、CIFilterを使うことになるので、AppleScriptからパラメータを指定できるものが少ない)。

ほかにも有効と思われるのは2点間の距離計算であるとか、多次元配列処理、与えられたデータの順列組み合わせ計算(Permutation)、あたりでしょうか。地味なところで、各種日付表記フォーマットでの文字列化。タグクラウド処理あたりはやりたいところです。データベースに入っているデータをもとに、タグクラウドを生成して表示するといったところで。感覚的にデータ内容の傾向をつかみやすいので。

Posted in news | Tagged FileMaker Pro | Leave a comment

ヤバイ本のiOS版を発売

Posted on 9月 5, 2021 by Takaaki Naganoya


「空前絶後 あなたの知らないヤバイAppleScriptの世界」のiOS版、FileMaker Goを使って読む電子ブックの販売を開始しました。1,000円です。

→ 販売ページ

なんでこれを作ろうと思ったか?

PDF版をiOS上で読んでいただくことも可能ですが、画面の縦横比とかなんとか。とにかくPDF版の読書体験がよくありません。

そして、AppleのiBooks Storeに本を出すのに、ISBNだ何だといろいろうるさく、これに付き合っていられません。

そのため、いろいろ検討したうえでFileMaker Goに白羽の矢を立て、このアプリケーションを読書用のプラットフォームとして活用するために実験を繰り返していました。

小さな画面で文字を読むのは、ガラケーの時代から大変なことですが、スマホで読んでも大変なことに変わりはありません。

レイアウトに一緒に画像を入れるのも大変なので、基本的に文字コンテンツだけです。一応、なんとかすれば画像表示用レイアウトも混在させて、画像を見ていただくことは可能です。

これまで、PDF版(フル・レイアウト)のオマケとか、サブセットとして出すとか(AppleScriptポケットリファレンス)、そういう試みはしてきましたが、.fmp12単体で売ってみるというのははじめてのことです。iPhoneだけで暮らしたことが皆無なので、まだちょっと見落としていることがあるかもしれませんが、失敗も含めて貴重な経験になることでしょう。

FileMaker Goのデータベースアプリケーションとしての出来については、いまひとつ評価が定まっていないというか、バージョンごとに少しずつ問題があるという見立てになっています。期待をしすぎてはダメというところなんでしょう。

ですが、単にレイアウト切り替えをするとか、フィールドに入れた文字を読むというだけであれば問題が出るとも思えません。

いえ、正直なところiPad mini+FileMaker Go 18(前バージョン)で読んでいたときに、突如としてフィールドが真っ白になってレコード表示がうまく動かなくなったということはありました。

それでも、iPhone+FileMaker Go 19であれば、とくに問題らしい問題に遭遇したことはありません。RAMが少ないと環境だと問題があるのかもしれません。

とりあえず、「何かあったとき」のために……筆者に文句を送信できるよう、電子ブックに感想送信フォームをつけておきました。

個人的には、.fmp12形式のままBOOTH上で販売したいのですが、その点について提案したもののお返事をいただいていません。

Posted in news PRODUCTS | Tagged 10.15savvy 11.0savvy 12.0savvy FileMaker Pro | Leave a comment

macOS 12 beta6、Cocoa Scriptingの速度低下なし

Posted on 8月 31, 2021 by Takaaki Naganoya

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経由で電話番号を取得できないというバグを見つけました(レポート済み)。プログラミング言語ではなく、ユーザー環境の設定言語に依存して発生するようです。いまのところ、日本語環境で問題が発生し、英語環境では発生していません。

Posted in Bug news | Tagged 12.0savvy | Leave a comment

Numbersの書類上で選択中の範囲のセルの値をシャッフル

Posted on 8月 24, 2021 by Takaaki Naganoya

Numbersの書類上で選択中の範囲のセルの値をシャッフルするAppleScriptです。Numbers書類の表の上で節度ある範囲(テスト用なので…100個ぐらい?)のセルを選択して実行し、シャッフされたデータをNumbersに描き戻します。

# 単なるデモScriptなので、数千とか数万個のセルを選択した場合には、CSVに書き出してNumbersでオープンし、そのデータ内容をコピペで元のNumbersに書き戻したほうが処理が速いことでしょう。

実際にmacOS 12 beta5でどの程度、処理速度が向上したかを確認するために書いてみました。

–> Watch macbookpro10,1_10.14_macminim1_12 demo

上記の画像で左がMacBookPro 10,1(Intel Core i7 2.66GHz、macOS 10.14.6)、右がMacmini9,1(Apple M1 3.2GHz、macOS 12 beta5)です。

これまで使用してきたMacBook Pro Retina 2012と現行のM1 Mac miniの速度差は気になります。macOS 11上ではM1 Mac miniのほうが10倍遅かったわけですが、最新のmacOS 12 beta5ではどうなのか。

きっちり両方とも揃えてスタートできているわけではありませんが、それでもM1のほうが2倍強ほど高速になっていることがわかります。このぐらいだと友人知人におすすめしても恨まれないレベルだと思います。

ただ、お勧めするにしてもmacOS 12の正式版が出てからですね。自分のMac App Storeに出しているアプリも、macOS 12がリリースされる前にUniversal Binary版を出すと「M1対応にしても速くなっていない」などと文句を言われそうです。

逆に、macOS 12の正式版がリリースされたら「Intel版のままなのに信じられないほど速くなった」ということになりそうです。

AppleScript名:セルの値のシャッフル.scptd
—
–  Created by: Takaaki Naganoya
–  Created on: 2021/08/22
—
–  Copyright © 2021 Piyomaru Software, All Rights Reserved
—

use AppleScript version "2.7" — High Sierra (10.13) or later
use framework "Foundation"
use framework "GameplayKit"
use scripting additions

tell application "Numbers"
  tell front document
    tell active sheet
      try
        set theTable to first table whose class of selection range is range
      on error
        return –何も選択されてなかった場合は終了
      end try
      
      
tell theTable
        set mySelectedRanges to value of every cell of selection range
        
set cellList to cell of selection range
      end tell
    end tell
  end tell
end tell

–1D Array Shuffle
set anArray to current application’s NSArray’s arrayWithArray:mySelectedRanges
set randomArray to anArray’s shuffledArray() as list — requires macOS 10.12

tell application "Numbers"
  tell front document
    tell active sheet
      tell theTable
        repeat with i from 1 to (length of cellList)
          tell item i of cellList
            set value to item i of randomArray
          end tell
        end repeat
      end tell
    end tell
  end tell
end tell

★Click Here to Open This Script 

Posted in list | Tagged 10.14savvy 10.15savvy 11.0savvy 12.0savvy Numbers | Leave a comment

「AppleScript最新リファレンス」に追加ダウンロードコンテンツ

Posted on 8月 23, 2021 by Takaaki Naganoya

既刊本「AppleScript最新リファレンス」に追加ダウンロードコンテンツをご用意いたしました。

FileMaker Goを使ってiPhone/iPad上で閲覧する、「AppleScriptリファレンス ポケット版」ともいうべきものです。

購入された方は、無料で追加ダウンロードしていただけます。Mac上にダウンロードしたうえで、Zip圧縮を展開し、iCloud Drive経由でiPhone/iPadに転送していただけます。もちろん、Mac/Windows版のFileMaker Proをお持ちであれば、Mac/PC上でご覧になることも可能です。

コンテンツは、「最速マスター」、「各MacOSのAppleScriptの歴史」、「コマンドリファレンス」部分を独立させたものです。

閲覧方法(MacからiCloud Drive経由による方法):

(1)BOOTHの「AppleScript最新リファレンス」ダウンロードページから、追加ダウンロードコンテンツをMac/PCにダウンロード
(2)ダウンロードしたZipアーカイブを展開(AppleScript_Reference.fmp12.zip→AppleScript_Reference.fmp12)
(3)Finder上のiCloud Drive経由でiPhone/iPadに転送

(4)iPhone/iPad上のFileMaker Goを起動

(5)FileMaker Go上で「マイApp」>「iPhone上」を選択

(6)画面上のフォルダ+ダウンロード矢印のついたアイコンをタップ

(7)iCloud Drive上から「AppleScript_Reference.fmp12」を指定

(8)iCloud Driveからダウンロードが終了すると起動

閲覧方法(MacからAirDrop経由による方法):

(1)BOOTHの「AppleScript最新リファレンス」ダウンロードページから、追加ダウンロードコンテンツをMac/PCにダウンロード
(2)ダウンロードしたZipアーカイブを展開(AppleScript_Reference.fmp12.zip→AppleScript_Reference.fmp12)
(3)MacのWiFi接続をオンにして(WiFiネットワークにつながっていることが前提)、AirDrop経由で「ppleScript_Reference.fmp12」ファイルをiPhone/iPadに転送
(4)iPhone/iPad上で画面にどのアプリケーションを利用してオープンするかを聞いてくるので、インストールしたFileMaker Goのうち一番新しいバージョンのものを指定

(5)起動

となります。

Posted in Books news PRODUCTS | Leave a comment

macOS 12 beta5でAppleScript処理系の大幅なスピードアップ。M1もIntelも

Posted on 8月 18, 2021 by Takaaki Naganoya

以前から本Blogでは、M1 Mac+macOS 11上でAppleScriptの実行、とくにCocoaの機能呼び出しが10〜77倍遅くなるという件についてレポートしてきました。

–> macOS 11, AppleScriptをFirestormではなくIcestormで実行か?!

CPUの乗り換え直後ということもあり、淡々とAppleにバグレポートしつつ、周囲には「まだM1に手を出すべきではない」と話していたものが、最新のmacOS 12 beta 5においてどの程度変わったのでしょうか?

2つのスピード低下問題

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でも処理速度が大幅に向上した、という「現象」のみが確認できているだけです。

ベンチマーク1:Permutation

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倍程度、高速化しています。

ベンチマーク2:乱数配列の生成とソーティング

M1+macOS 11の環境では「要素数の多い配列の操作」と「乱数の生成」(AppleScriptのrandom number)がとくに遅いという傾向が出ていたので、10万要素、20万要素、30万要素の配列でベンチマークを行いました。ただし、本ベンチマークでは乱数の生成を最速の方法で計算しているため、M1 Macで1.3倍速、Intel Macでも同程度の速度向上になっています。とくに、要素数が少ないほど速度向上の割合が増えており、これは歓迎できる傾向です。

ベンチマーク3:AppleScriptのrandom number関数を用いた乱数配列の生成とソーティング

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倍速度が向上していることを確認しています。

macOS 11の正式版がmacOS 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各コアの動きが変わっているように見える、ということです。

Posted in Bug news | Tagged 11.0savvy 12.0savvy | Leave a comment

M1 Macの各種温度センサーから値を取得する

Posted on 8月 17, 2021 by Takaaki Naganoya

Mac内の各種温度センサーから値を取得するAppleScriptのM1 Mac(Apple Silicon Mac)の対応版です。

近年、macOSのCPU温度管理+放熱ファンの回転数制御がとってもいい加減で、AppleScriptからOSの機能を呼び出しまくるとCPU温度の加熱を心配する必要が出ていました(本当)。AppleScriptから高速にコントロールを行うとCPU温度が上昇し、サーマルスロットリングを引き起こしていました(本当)。

そのため、CPUの温度を計測する処理はけっこう重要なものになっていました。ちかごろは、バッチでまとまった処理を行うさいには、ループの一部でCPUの温度を計測して、異常過熱に備えるようになっています。

→ SMCkitで各種センサー値を取得する

M1 Macではそれほど温度の上昇は激しくはありませんが、製品ラインナップ中にはファンレス機(MacBook Air)もあるので、依然として温度センサーへのアクセスはAppleScriptによるバッチ処理でも必要となるはずです。

# 幸いにというか残念なことにというか、現在のM1 Mac+macOS 11.xではCocoaの機能呼び出し時にM1のIcestormで各種処理が行われてしまうために、心配するほどの異常過熱はなさそうです。速度がIntel Macよりも遥かに遅くなるので心配ありません(macOS 11時代の話。macOS 12でこれが改善されたために、Cocoaの機能を呼び出してもIntel Macを超えるスピードで処理できるようになった)

# 放熱ファンの回転数制御もできたらよかったのですが、そちらはなかなかAppleScriptからは呼べていません。TG Proの開発元にファン制御機能をAppleScriptから呼べるようにすることも提案しましたが、回転数を下げたままCPUをブン回すと異常加熱を起こすため、一律に強制ファン回転させることで対処することを逆に提案されました(つまり、提案が却下されたわけです)

その肝心のモジュールであるSMCWrapperがM1 Mac上では動かなくなっていました。理由の1つには、書かれた時代が古くてビルドできないこと。もう1つは、Intel MacとApple Silicon Macのハードウェア構成はそもそも別物なので、Intel Mac向けに書かれたプログラムでは必要なセンサーの値を取れなくなっていたことがあります。

「というわけで、M1 Mac上で温度センサーの値を取れません」

と、書こうとして「apple_sensors」のプロジェクトを見つけました。このプログラムを一部書き換え、センサー値の取得をループで行っていた部分を、1回で終了するようにしてバッチ処理の中で呼び出せるようにしてみました。

{{sName:"PMGR SOC Die Temp Sensor1", sVal:33.1}, {sName:"PMU tdev5", sVal:-21.6}, {sName:"PMU tdie6", sVal:40.8}, {sName:"PMU tdev3", sVal:37.3}, {sName:"PMU2 TR1l", sVal:42.8}, {sName:"ANE MTR Temp Sensor1", sVal:30.0}, {sName:"PMU tdev6", sVal:36.5}, {sName:"ISP MTR Temp Sensor5", sVal:30.0}, {sName:"GPU MTR Temp Sensor4", sVal:30.0}, {sName:"PMU tdev8", sVal:36.4}, {sName:"PMU tdie8", sVal:40.0}, {sName:"PMU2 TR3b", sVal:41.8}, {sName:"SOC MTR Temp Sensor0", sVal:32.4}, {sName:"eACC MTR Temp Sensor3", sVal:29.9}, {sName:"pACC MTR Temp Sensor5", sVal:28.5}, {sName:"PMU TP3w", sVal:41.6}, {sName:"PMU2 TR1d", sVal:36.8}, {sName:"PMU tdie1", sVal:41.8}, {sName:"PMU2 TR5b", sVal:42.4}, {sName:"PMU tdev7", sVal:38.1}, {sName:"PMU tdev1", sVal:35.4}, {sName:"PMU2 TR3d", sVal:35.3}, {sName:"pACC MTR Temp Sensor9", sVal:32.7}, {sName:"PMU2 TR7b", sVal:41.3}, {sName:"PMU tdev4", sVal:-21.5}, {sName:"pACC MTR Temp Sensor7", sVal:32.5}, {sName:"PMU tdie5", sVal:40.7}, {sName:"PMU2 TR5d", sVal:36.3}, {sName:"pACC MTR Temp Sensor3", sVal:32.0}, {sName:"PMU tdie7", sVal:41.3}, {sName:"PMGR SOC Die Temp Sensor2", sVal:32.9}, {sName:"PMU2 TR2l", sVal:42.9}, {sName:"PMU tdie2", sVal:39.8}, {sName:"pACC MTR Temp Sensor8", sVal:33.2}, {sName:"PMU tcal", sVal:51.9}, {sName:"PMU2 TR0Z", sVal:51.9}, {sName:"PMU2 TR4b", sVal:42.5}, {sName:"pACC MTR Temp Sensor4", sVal:32.1}, {sName:"PMGR SOC Die Temp Sensor0", sVal:33.1}, {sName:"GPU MTR Temp Sensor1", sVal:30.0}, {sName:"eACC MTR Temp Sensor0", sVal:29.4}, {sName:"PMU tdie4", sVal:40.7}, {sName:"PMU2 TR2d", sVal:35.0}, {sName:"PMU2 TR6b", sVal:40.3}, {sName:"SOC MTR Temp Sensor2", sVal:33.1}, {sName:"PMU tdev2", sVal:35.9}, {sName:"SOC MTR Temp Sensor1", sVal:35.5}, {sName:"NAND CH0 temp", sVal:34.0}, {sName:"PMU2 TR4d", sVal:35.2}, {sName:"pACC MTR Temp Sensor2", sVal:31.7}, {sName:"PMU2 TR8b", sVal:40.3}}

ただ、自分のマシン以外にM1 Macを持っていないので、M1 Macをお持ちの方は動作するか確認してみてください。CPU Typeを見て、Intel Macでは実行を中断するようになっています。

–> Download M1 Temp sensor(Applet)

下記リストはバンドル内にセンサー値にアクセスするコマンドライン・プログラムを含んでいないため、実行しても無意味です。

追記:M1 Pro、M1 Max、M1 UltraなどM1の派生プロセッサではセンサー名称が異なっているとの報告があります。また、後継プロセッサでセンサー名称がそのまま変更されない保証はありません

AppleScript名:sensor.scptd
—
–  Created by: Takaaki Naganoya
–  Created on: 2021/08/17
—
–  Copyright © 2021 Piyomaru Software, All Rights Reserved
—

use AppleScript version "2.4" — Yosemite (10.10) or later
use framework "Foundation"
use scripting additions

–https://github.com/fermion-star/apple_sensors
–Temperature Sensor Monitor for Apple Silicon M1
property comPathPX : missing value

set cpuRes to getCPUType() of me
if cpuRes is not equal to "ARM64E" then
  display dialog "This is not Apple Silicon Mac"
  
return
end if

set tMin to getMINAppleSiliconMacSensorValue() of me
display dialog "Minimum Temp(Celsius):" & tMin as string

set tMax to getMAXAppleSiliconMacSensorValue() of me
display dialog "maximum Temp(Celsius):" & tMax as string

set tList to getAppleSiliconMacSensorValues() of me
–> {{sName:"PMGR SOC Die Temp Sensor1", sVal:33.3}, {sName:"PMU tdev5", sVal:-21.5}, {sName:"PMU tdie6", sVal:41.2}, {sName:"PMU tdev3", sVal:37.6}, {sName:"PMU2 TR1l", sVal:43.1}, {sName:"ANE MTR Temp Sensor1", sVal:30.0}, {sName:"PMU tdev6", sVal:37.3}, {sName:"ISP MTR Temp Sensor5", sVal:30.0}, {sName:"GPU MTR Temp Sensor4", sVal:30.0}, {sName:"PMU tdev8", sVal:36.9}, {sName:"PMU tdie8", sVal:38.7}, {sName:"PMU2 TR3b", sVal:40.5}, {sName:"SOC MTR Temp Sensor0", sVal:32.8}, {sName:"eACC MTR Temp Sensor3", sVal:29.1}, {sName:"pACC MTR Temp Sensor5", sVal:29.3}, {sName:"PMU TP3w", sVal:41.8}, {sName:"PMU2 TR1d", sVal:37.5}, {sName:"PMU tdie1", sVal:42.8}, {sName:"PMU2 TR5b", sVal:42.4}, {sName:"PMU tdev7", sVal:38.7}, {sName:"PMU tdev1", sVal:35.7}, {sName:"PMU2 TR3d", sVal:35.9}, {sName:"pACC MTR Temp Sensor9", sVal:32.5}, {sName:"PMU2 TR7b", sVal:42.0}, {sName:"PMU tdev4", sVal:-21.5}, {sName:"pACC MTR Temp Sensor7", sVal:35.2}, {sName:"PMU tdie5", sVal:41.6}, {sName:"PMU2 TR5d", sVal:36.7}, {sName:"pACC MTR Temp Sensor3", sVal:34.2}, {sName:"PMU tdie7", sVal:40.8}, {sName:"PMGR SOC Die Temp Sensor2", sVal:33.5}, {sName:"PMU2 TR2l", sVal:42.0}, {sName:"PMU tdie2", sVal:40.0}, {sName:"pACC MTR Temp Sensor8", sVal:34.5}, {sName:"PMU tcal", sVal:51.9}, {sName:"PMU2 TR0Z", sVal:51.9}, {sName:"PMU2 TR4b", sVal:42.9}, {sName:"pACC MTR Temp Sensor4", sVal:33.4}, {sName:"PMGR SOC Die Temp Sensor0", sVal:33.4}, {sName:"GPU MTR Temp Sensor1", sVal:30.0}, {sName:"eACC MTR Temp Sensor0", sVal:30.5}, {sName:"PMU tdie4", sVal:41.6}, {sName:"PMU2 TR2d", sVal:35.8}, {sName:"PMU2 TR6b", sVal:40.8}, {sName:"SOC MTR Temp Sensor2", sVal:35.0}, {sName:"PMU tdev2", sVal:36.2}, {sName:"SOC MTR Temp Sensor1", sVal:35.6}, {sName:"NAND CH0 temp", sVal:34.0}, {sName:"PMU2 TR4d", sVal:35.7}, {sName:"pACC MTR Temp Sensor2", sVal:32.0}, {sName:"PMU2 TR8b", sVal:42.9}}

return tList

–最も値が小さなセンサー値を返す
on getMINAppleSiliconMacSensorValue()
  checkComPath() of me
  
  
set smcRes to do shell script comPathPX
  
set {aList, bList} to paragraphs of smcRes
  
  
set b1List to parseByDelim(bList, ", ") of me
  
set b1List to items 1 thru -2 of b1List
  
  
–マイナス値のデータを無視する
  
set b2List to {}
  
repeat with i in b1List
    set j to contents of i
    
if j > 0 then
      set the end of b2List to j
    end if
  end repeat
  
  
set maxRes to minimumFromList(b2List) of me
  
return maxRes as real
end getMINAppleSiliconMacSensorValue

–最も値が大きなセンサー値を返す
on getMAXAppleSiliconMacSensorValue()
  checkComPath() of me
  
  
set smcRes to do shell script comPathPX
  
set {aList, bList} to paragraphs of smcRes
  
  
set b1List to parseByDelim(bList, ", ") of me
  
set b1List to items 1 thru -2 of b1List
  
  
set maxRes to maximumFromList(b1List) of me
  
return maxRes as real
end getMAXAppleSiliconMacSensorValue

–すべてのセンサー名と値を取得
on getAppleSiliconMacSensorValues()
  checkComPath() of me
  
  
set smcRes to do shell script comPathPX
  
set {aList, bList} to paragraphs of smcRes
  
  
set a1List to parseByDelim(aList, ", ") of me
  
set b1List to parseByDelim(bList, ", ") of me
  
  
set a1List to items 1 thru -2 of a1List
  
set b1List to items 1 thru -2 of b1List
  
  
set aLen to length of a1List
  
set outList to {}
  
  
repeat with i from 1 to aLen
    set aDat to contents of item i of a1List
    
set bDat to contents of item i of b1List
    
set the end of outList to {sName:aDat, sVal:bDat as real}
  end repeat
  
  
return outList
end getAppleSiliconMacSensorValues

on checkComPath()
  if my comPathPX = missing value then
    set mePath to (path to me) as string
    
set comPath to mePath & "Contents:Resources:temp_sensor2"
    
set my comPathPX to quoted form of (POSIX path of comPath)
  end if
end checkComPath

on parseByDelim(aData, aDelim)
  set curDelim to AppleScript’s text item delimiters
  
set AppleScript’s text item delimiters to aDelim
  
set dList to text items of aData
  
set AppleScript’s text item delimiters to curDelim
  
return dList
end parseByDelim

–最小値を取得する
on minimumFromList(nList)
  script o
    property nl : nList
  end script
  
  
set min to item 1 of o’s nl
  
repeat with i from 2 to (count nList)
    set n to item i of o’s nl
    
if n < min then set min to n
  end repeat
  
return min
end minimumFromList

–最大値を取得する
on maximumFromList(nList)
  script o
    property nl : nList
  end script
  
  
set max to item 1 of o’s nl
  
repeat with i from 2 to (count nList)
    set n to item i of o’s nl
    
if n > max then set max to n
  end repeat
  
return max
end maximumFromList

on getCPUType()
  set cpuStr to CPU type of (system info)
  
set aInd to (offset of " " in cpuStr)
  
if aInd = 0 then return cpuStr
  
set cpuStr to text 1 thru (aInd – 1) of cpuStr
  
return cpuStr
end getCPUType

★Click Here to Open This Script 

Posted in System | Tagged 11.0savvy Apple Silicon Mac | Leave a comment

新刊 elgato STREAM DECK 徹底活用Mac+STREAM DECKで時短+作業効率化!! 刊行

Posted on 8月 16, 2021 by Takaaki Naganoya

ついに出ました! AppleScriptによる各種自動化と相性のよい、elgato STREAM DECKの説明と使いこなしのガイド本、「elgato STREAM DECK 徹底活用Mac+STREAM DECKで時短+作業効率化!!」を刊行しました。

わかりやすくSTREAM DECKについて、その機能や設定方法について紹介し、効果的な使い方とその中でももっとも効き目のある「アクションからのAppleScript呼び出し」について、実例(添付AppleScriptあり)をあげて紹介しています。

AppleScript書きの立場からも、いつもの「走り出したら数分間処理が止まらない」とかいったヘビー級の処理ではなく、だいたいユーザーが期待する時間内に終わって、事前の準備や条件がデリケートでなく、機能が名前から類推しやすいものが適していたりもします。また別の方向性が求められる実行環境でもあります。

ページ数:126ページ(PDF+付録Script Zipアーカイブ)
価格:2,000円

となっています。日本国内の代理店を探して多方面に問い合わせしたり、elgatoに問い合わせたりと、予想よりもはるかに手間のかかったものになりました(>_<)

→ サポートページ
→ 販売ページ
→ お試し版PDFダウンロードページ

Posted in Books PRODUCTS | Tagged Stream Deck | 1 Comment

CotEditorで最前面の書類の内容をすべて選択してコマンド実行

Posted on 8月 13, 2021 by Takaaki Naganoya

CotEditorでオープン中の最前面の書類の内容をすべて選択してコマンド(半角→全角 文字変換)を実行するAppleScriptです。

データ処理内容の確認のためにCotEditor上で処理したときに「あれ? 書類の内容を全選択する処理って書いたことなかったわ〜」と気づいて、慌てて書きました。

AppleScript名:最前面のドキュメント内を全選択して全角変換.scpt
tell application "CotEditor"
  tell front document
    set tLen to length
    
set aRange to {0, tLen}
    
set range of selection to aRange
    
change roman width selection to full
  end tell
end tell

★Click Here to Open This Script 

Posted in Text | Tagged 10.15savvy 11.0savvy 12.0savvy CotEditor | Leave a comment

Stream DeckのKeynote操作プラグインがKeynoteの操作を妨害するメカニズム

Posted on 8月 7, 2021 by Takaaki Naganoya

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

★Click Here to Open This Script 

Posted in Bug | Tagged Stream Deck | Leave a comment

macOS 11.5+Keynote 11.1でGUI Scriptingに障害?

Posted on 8月 1, 2021 by Takaaki Naganoya

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のソフトウェア自体が実行を邪魔していたとは….

–> Browse Demo Movie

メニューバーのメニュー項目を指し示そうとして、

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

★Click Here to Open This Script 

のようなお気軽な内容を試してみたところ、エラーに。メニューが存在していて、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

★Click Here to Open This Script 

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

★Click Here to Open This Script 

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から撤去してほしいものです

Posted in Bug GUI Scripting | Tagged 11.0savvy Keynote Stream Deck | 5 Comments

M1への各種Framework移行

Posted on 7月 30, 2021 by Takaaki Naganoya

M1 Mac miniをメインマシンに変更してはや1か月ぐらい。普段のアプリケーションを利用する使い方では、ほとんどIntel Macと差がないというか、違いが分からない感じで使えています。

M1 Mac上でAppleScriptを動かすとIntel Macの10〜77倍遅いケースがままある(Cocoa Scripting時)ので、高性能マシンに乗り換えた感じはまったくしません。KeynoteとかMail.appとかSafariが速いだけの環境です。AppleScriptでバリバリにプログラムを書いているなら、iMac Proのほうが快適でしょう。Mac Proについては……三角関数の計算を間違える問題マシンとして認識しているので、まったく食指が動きません(価格的に無理ですが)。

ただ、M1 MacはCPUが熱くならないので放熱ファンで風を送らなくてよく、夏でも静かなのは助かります。

# macOS 12になって、Cocoa Scripting速度が大幅に改善されたので、(OSのバグや不具合はありますが)自分の使っている範囲では高速で快適です

Frameworkの移行

macOS 10.10以降、AppleScriptからオープンソース系のCocoa Frameworkが呼べるようになって、ほぼObjective-Cのコードを直接呼び出して実行できるようになって大変便利な状態になっています。Swiftで書かれたプログラムもBridging Headerを書けば呼べるらしいのですが、自分はいまひとつです。

Intel Mac環境でビルドして利用していたIntel BinaryのFrameworkを、そのまま呼び出すことはできていません。FrameworkについてはRosetta 2で翻訳されて実行できるという状況にはないので、Universal Binaryビルドを行う必要があるものと認識しています。

FrameworkのUniversalビルド

オープンソースのFrameworkのXcodeプロジェクトをそのまま手元に置いてあったので、Xcode 12でオープンしてビルドして、そのままAppleScriptから呼び出して実行できるものもありました。

「これなら問題なくいけるかも?」

……ある意味Yesともいえるし、Noともいえる状況です。

HTMLReader.frameworkあたりはほぼ何も考えずにUniversal Binaryビルドできました。これがないととても困るので助かります。

Intel MacとM1 Macではハードウェアの構成が違うので、そうしたIntel Macのハードウェアを前提としているものはもう、まるっきり動きません。オーディオ出力先のデバイスを変更するものは、まるっきりダメ。各種センサー類から情報を取得するもの(SMCkit)もダメでした。

macOS内蔵Frameworkでも互換性がないものも

Private Frameworkになりますが、ServerInformation.frameworkの中に入っている各種ハードウェアの名称テキストが、M1 Macについては入っていなかったりで。Intel Macとまるっきり同じ情報が入っているわけではないというのが意外でした。

macOSのバージョン間の違いによる「差」

これはFrameworkまわりの話ではありませんが、M1への移行は最新のmacOSへの移行でもあります。新しいという言葉から「改良されている」「よくなっている」と無条件に思ってしまいがちですが、「なくなっている機能がある」「削られた機能がある」という側面も無視できません。

macOSのバージョンが違えば、その構成ファイルも変わっています。とくに、Menu Extrasの構成が大きく変わっており、身近なところではScript MenuがmacOS 10.14でMenu Extrasから独立した小型アプリケーションに置き換わったりもしています。これがScript Menuだけでなく他のMenu Extrasでも同様の動きが起きており、どんどんその数が減少しています。

Menu Extrasの中の実行ファイルを呼び出しているようなScriptは、M1 MacつまりmacOS 11.x環境に持って行ったときに動かなくなります。ファイルそのものが存在していないので「当然」ではあります。

Posted in System | Tagged 11.0savvy 12.0savvy | Leave a comment

Macの製品名を求める(M1以降対応)v1a

Posted on 7月 29, 2021 by Takaaki Naganoya

実行中のMacの製品名を求めるAppleScriptです。もともと、AppleScriptで作成して使用しているアイデアプロセッサ「Kamenoko」で行っている処理なのですが、

M1上で実行すると、製品名は間違えるわ、仕様は合っていないわで散々でした。あ、マシンのアイコンは取ってきていますね。その他のデータはマシン移行をしたときにそのまま前のマシンのデータが残っていたためでしょう。

調べてみると、M1 Macでは従来どおりの製品名データを持っていないようで、Intel Macでは取得できていた製品の名前をわかりやすく記述するデータがありません。各国語にローカライズされていて便利だったのですが。

そこで、M1 MacかどうかのCPUタイプ検出を行い、そのうえで処理を分けることにしました。動作原理上、購入してセットアップしたてのマシンでこのファイルが存在しているかどうか、検証が必要だと思います。

AppleScript名:Macの製品名を求める(M1以降対応)v1a.scpt
—
–  Created by: Takaaki Naganoya
–  Created on: 2021/07/28
—
–  Copyright © 2021 Piyomaru Software, All Rights Reserved
—
use AppleScript version "2.7" — macOS 10.13 or later
use framework "Foundation"
use scripting additions

set hRes to retModelName() of me
–> "Mac mini (M1, 2020)"–macOS 11.5
–> "Mac mini Intelデュアルコアプロセッサおよび統合型グラフィックス搭載、2014年後期に投入。"–macOS 12beta
–> "15インチMacBook Pro, Retinaディスプレイ, Intel Core i7 (Mid 2012)"–macOS 10.14.6

on retModelName()
  set cRes to CPU type of (system info)
  
  
if cRes begins with "ARM" then
    –Apple Silicon Mac
    
set sText to "defaults read ~/Library/Preferences/com.apple.SystemProfiler.plist" & " ’CPU Names’ | cut -sd ’\"’ -f 4"
    
set hRes to do shell script sText
    
return hRes
  else if cRes begins with "Intel" then
    –Intel Mac
    
set hRes to retModelInfo() of me
    
return hRes
  end if
end retModelName

on retModelInfo()
  tell application "System Events"
    set osVersion to system version of (system info)
  end tell
  
— macOS 10.15.3 –> 15
  
  
considering numeric strings
    if osVersion ≥ "10.15" then
      –macOS 11.0以降
      
set pListPath to "/System/Library/PrivateFrameworks/ServerInformation.framework/" & "Versions/A/Resources/ja.lproj/SIMachineAttributes.plist"
    else if osVersion > "10.14" then
      –macOS 10.14まで
      
set pListPath to "/System/Library/PrivateFrameworks/ServerInformation.framework/" & "Versions/A/Resources/Japanese.lproj/SIMachineAttributes.plist"
    end if
  end considering
  
  
set aRec to retDictFromPlist(pListPath) of me
  
set hwName to (do shell script "sysctl -n hw.model")
  
set aMachineRec to retRecordByLabel(aRec, hwName) of me
  
set aMachineRec2 to first item of aMachineRec
  
return |description| of _LOCALIZABLE_ of aMachineRec2
end retModelInfo

on retDictFromPlist(aPath)
  set thePath to current application’s NSString’s stringWithString:aPath
  
set thePath to thePath’s stringByExpandingTildeInPath()
  
set theDict to current application’s NSDictionary’s dictionaryWithContentsOfFile:thePath
  
return theDict as record
end retDictFromPlist

on retRecordByLabel(aRec as record, aKey as string)
  set aDic to current application’s NSDictionary’s dictionaryWithDictionary:aRec
  
set aVal to aDic’s valueForKey:aKey
  
return aVal as list
end retRecordByLabel

on retRecordByKeyPath(aRec as record, aKey as string)
  set aDic to current application’s NSDictionary’s dictionaryWithDictionary:aRec
  
set aVal to aDic’s valueForKeyPath:aKey
  
return aVal
end retRecordByKeyPath

–1D Listを文字列長でソート v2
on sort1DListByStringLength(aList as list, sortOrder as boolean)
  set aArray to current application’s NSArray’s arrayWithArray:aList
  
set desc1 to current application’s NSSortDescriptor’s sortDescriptorWithKey:"length" ascending:sortOrder
  
set desc2 to current application’s NSSortDescriptor’s sortDescriptorWithKey:"self" ascending:true selector:"localizedCaseInsensitiveCompare:"
  
set bArray to aArray’s sortedArrayUsingDescriptors:{desc1, desc2}
  
return bArray as anything
end sort1DListByStringLength

★Click Here to Open This Script 

Posted in System | Tagged 10.13savvy 10.14savvy 10.15savvy 11.0savvy 12.0savvy | Leave a comment

targetが重複しているFinder Windowをクローズする

Posted on 7月 22, 2021 by Takaaki Naganoya

日常的に生じている不満を解消するための、ちょっとしたかき捨てScript……になるはずだったものです。

Classic Mac OSからMac OS Xへの移行後、Finderの仕様で大きく変わった点が1つあります。「同じフォルダのウィンドウを複数枚オープンできるようになった」点です。

その結果、

といったように、同じフォルダを指し示すウィンドウが何枚もたまる現象が起きています。これは別にバグでも不具合でもありません。仕様です。

この重複Windowを掃除するためのScriptを書いてみました。

AppleScript名:ターゲットが同じWindowを取得(未遂).scpt
tell application "Finder"
  tell window 1
    set aTarg to target
  end tell
  
  
set wList to every window whose target  is equal to aTarg
end tell

★Click Here to Open This Script 

何も考えずに書き始めると、こんな(↑)感じでしょう。ただ、このScriptは動きません。フィルター参照は、たとえばファイル名や拡張子、ファイル種別(kind)あたりには使えるものの、この「target」属性に対しては効きません。

そこで、仕方なくちょっと腰をすえて書いてみました。これ(↓)を動かすと、

のように重複ウィンドウが一掃されます。これでいいはずです。

AppleScript名:targetが重複しているFinder Windowをクローズする.scpt
—
–  Created by: Takaaki Naganoya
–  Created on: 2021/07/22
—
–  Copyright © 2021 Piyomaru Software, All Rights Reserved
—

set clList to {}

tell application "Finder"
  set wList to every window
  
–> {Finder window id 1775 of application "Finder", Finder window id 1612 of application "Finder", Finder window id 1740 of application "Finder", Finder window id 1641 of application "Finder", Finder window id 1630 of application "Finder", Finder window id 1618 of application "Finder", Finder window id 1599 of application "Finder", Finder window id 1592 of application "Finder", Finder window id 1586 of application "Finder", Finder window id 1580 of application "Finder", Finder window id 1575 of application "Finder", Finder window id 1569 of application "Finder", Finder window id 1563 of application "Finder"}
  
  
set tList to (target of every window) as alias list
  
–> {alias "Macintosh HD:Users:me:Public:ドロップボックス:", alias "Macintosh HD:Users:me:Documents:AppleScript 12.0:", alias "Macintosh HD:Users:me:Public:ドロップボックス:", alias "Macintosh HD:Users:me:Public:ドロップボックス:", alias "Macintosh HD:Users:me:Public:ドロップボックス:", alias "Macintosh HD:Users:me:Public:ドロップボックス:", alias "Macintosh HD:Users:me:Public:ドロップボックス:", alias "Macintosh HD:Users:me:Public:ドロップボックス:", alias "Macintosh HD:Users:me:Public:ドロップボックス:", alias "Macintosh HD:Users:me:Public:ドロップボックス:", alias "Macintosh HD:Users:me:Public:ドロップボックス:", alias "Macintosh HD:Users:me:Public:ドロップボックス:", alias "Macintosh HD:Users:me:Public:ドロップボックス:"}
  
  
–ターゲットフォルダをユニーク化
  
set bList to removeDuplicates(tList) of me
  
–> {alias "Macintosh HD:Users:me:Documents:AppleScript 12.0:", alias "Macintosh HD:Users:me:Public:ドロップボックス:"}
  
  
–ユニーク化したターゲットでループ
  
repeat with i in bList
    set j to (contents of i) as alias
    
set firstF to true
    
    
–ウィンドウでループ
    
repeat with ii in wList
      set jj to contents of ii
      
set tmpTarg to (target of jj) as alias
      
      
if tmpTarg is equal to j then
        –最初の1つ目のWindowだけ残す
        
if firstF = true then
          set firstF to false
        else
          –2個目以降のWindowはクローズ対象リストに入れる
          
set the end of clList to jj
        end if
      end if
    end repeat
  end repeat
  
  
–クローズ対象とされるFinder Windowを順次クローズ
  
repeat with i in clList
    set j to contents of i
    
try
      ignoring application responses
        close j
      end ignoring
    end try
  end repeat
end tell

on removeDuplicates(aList)
  set newList to {}
  
repeat with i from 1 to (length of aList)
    set anItem to item 1 of aList
    
set aList to rest of aList
    
if {anItem} is not in aList then set end of newList to anItem
  end repeat
  
return newList
end removeDuplicates

★Click Here to Open This Script 

edama2さんがコメント欄に投稿してくださったプログラムを掲載しておきます。自分が「安全のためにこのぐらいの処理は必要(かも?)」と付けまくった処理を「それ別に実際のところ必要ないんじゃない?」と省略された感じです。

あとは、edama2さんのScriptだと「最前面のWindowのtargetと同じtargetを持つWindowをクローズする」という動作ですが、自分のScriptは「targetが重複しているWindowは1つを残してあとすべてをクローズする」という動作を行うので、厳密にいえば違うものです。

AppleScript名:targetが重複しているFinder Windowをクローズする v2.scpt
–  Created by: edama2
–  Created on: 2021/07/22

tell application "Finder"
  tell front window
    set aTarg to target
  end tell
  
set aList to (every Finder window) as list
  
repeat with num from 2 to count aList
    set anItem to (aList)’s item num
    
if (anItem’s target is aTarg) then close anItem
  end repeat
end tell

★Click Here to Open This Script 

Posted in folder | Tagged 10.14savvy 10.15savvy 11.0savvy 12.0savvy Finder | 1 Comment

Stream Deck MK.2が登場

Posted on 7月 20, 2021 by Takaaki Naganoya

AppleScriptのランチャーとして手軽に構成を変更して運用できるelgato Stream Deck、Mac上で利用する場合のガイド本を作成中ですが、Stream Deckソフトウェアのv5.xの登場にくわえ、新製品の「Stream Deck MK.2」が登場!

# ニュースをみつけて膝から崩れ落ちました。また追記が必要、、、

新機種のStream Deck mk.2は、従来のStream Deck(15key版)を置き換えるもののようで、あくまでデザインや些細な仕様を変更したもの、と明記されています。フェイスプレートを載せ替えなければ見た目はあまり変わりませんし、対応OSなどの動作条件も変わりません。

・USBケーブルが着脱式に変更(従来は着脱不能)
・スタンドが折りたたみ式ではなくStream Deck XL(24key版)と同様のしっかりしたものに変更。マグネットで脱着
・フェイスプレートを変更可能。7種類のデザインの異なるフェイスプレートを交換し、表面部分をカスタマイズできる(ユーザーがグラフィックを送ってカスタム印刷するという種類のものではなく、異なるデザインの交換式フェイスプレートを追加で購入できる)

深い。とてもよく顧客を見ている。これで欠品とか品薄でなければもっといいのに。

Posted in news | Tagged 10.15savvy 11.0savvy Stream Deck | Leave a comment

NSString’s stringWithFormat:がクラッシュするバグが修正された

Posted on 7月 18, 2021 by Takaaki Naganoya

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アーキテクチャごとの構成比率グラフを実行してもアプリケーションごとクラッシュしなくなりました

Posted in Bug | Tagged 11.0savvy 12.0savvy NSString | Leave a comment

新刊発売「空前絶後 あなたの知らないヤバイAppleScriptの世界」

Posted on 7月 17, 2021 by Takaaki Naganoya

発売しました! コンセプト先行で表紙を作って、それから中身を作った前例のない電子書籍です。一度項目出しをしたあと、全然ヤバくなくて頭を抱えましたが……Podcast番組収録時の話を再構成して、まとめて資料を添付。関係者へのメールインタビューを経て難産のすえ、ようやく誕生です。

→ サポートページ
→ 販売ページ

Posted in Books PRODUCTS | Leave a comment

Post navigation

  • Older posts
  • Newer posts

電子書籍(PDF)をオンラインストアで販売中!

Google Search

Popular posts

  • 開発機としてM2 Mac miniが来たのでガチレビュー
  • macOS 15, Sequoia
  • Pages本執筆中に、2つの書類モード切り替えに気がついた
  • Numbersで選択範囲のセルの前後の空白を削除
  • メキシカンハットの描画
  • Pixelmator Pro v3.6.4でAppleScriptからの操作時の挙動に違和感が
  • AppleScriptによる並列処理
  • macOS 15でも変化したText to Speech環境
  • Safariで「プロファイル」機能を使うとAppleScriptの処理に影響
  • デフォルトインストールされたフォント名を取得するAppleScript
  • AppleScript入門③AppleScriptを使った「自動化」とは?
  • 【続報】macOS 15.5で特定ファイル名パターンのfileをaliasにcastすると100%クラッシュするバグ
  • Script Debuggerの開発と販売が2025年に終了
  • macOS 15 リモートApple Eventsにバグ?
  • AppleScript入門① AppleScriptってなんだろう?
  • macOS 14で変更になったOSバージョン取得APIの返り値
  • NSObjectのクラス名を取得 v2.1
  • macOS 15:スクリプトエディタのAppleScript用語辞書を確認できない
  • 有害ではなくなっていたSpaces
  • AVSpeechSynthesizerで読み上げテスト

Tags

10.11savvy (1101) 10.12savvy (1242) 10.13savvy (1391) 10.14savvy (587) 10.15savvy (438) 11.0savvy (283) 12.0savvy (212) 13.0savvy (197) 14.0savvy (150) 15.0savvy (139) CotEditor (66) Finder (51) Keynote (119) NSAlert (61) NSArray (51) NSBitmapImageRep (20) NSBundle (20) NSButton (34) NSColor (53) NSDictionary (28) NSFileManager (23) NSFont (21) NSImage (41) NSJSONSerialization (21) NSMutableArray (63) NSMutableDictionary (22) NSPredicate (36) NSRunningApplication (56) NSScreen (30) NSScrollView (22) NSString (119) NSURL (98) NSURLRequest (23) NSUTF8StringEncoding (30) NSView (33) NSWorkspace (20) Numbers (76) Pages (55) Pixelmator Pro (20) Safari (44) Script Editor (27) WKUserContentController (21) WKUserScript (20) WKWebView (23) WKWebViewConfiguration (22)

カテゴリー

  • 2D Bin Packing
  • 3D
  • AirDrop
  • AirPlay
  • Animation
  • AppleScript Application on Xcode
  • Beginner
  • Benchmark
  • beta
  • Bluetooth
  • Books
  • boolean
  • bounds
  • Bug
  • Calendar
  • call by reference
  • check sum
  • Clipboard
  • Cocoa-AppleScript Applet
  • Code Sign
  • Color
  • Custom Class
  • date
  • dialog
  • diff
  • drive
  • Droplet
  • exif
  • file
  • File path
  • filter
  • folder
  • Font
  • Font
  • GAME
  • geolocation
  • GUI
  • GUI Scripting
  • Hex
  • History
  • How To
  • iCloud
  • Icon
  • Image
  • Input Method
  • Internet
  • iOS App
  • JavaScript
  • JSON
  • JXA
  • Keychain
  • Keychain
  • Language
  • Library
  • list
  • Locale
  • Localize
  • Machine Learning
  • Map
  • Markdown
  • Menu
  • Metadata
  • MIDI
  • MIME
  • Natural Language Processing
  • Network
  • news
  • Noification
  • Notarization
  • Number
  • Object control
  • OCR
  • OSA
  • parallel processing
  • PDF
  • Peripheral
  • process
  • PRODUCTS
  • QR Code
  • Raw AppleEvent Code
  • Record
  • rectangle
  • recursive call
  • regexp
  • Release
  • Remote Control
  • Require Control-Command-R to run
  • REST API
  • Review
  • RTF
  • Sandbox
  • Screen Saver
  • Script Libraries
  • sdef
  • search
  • Security
  • selection
  • shell script
  • Shortcuts Workflow
  • Sort
  • Sound
  • Spellchecker
  • Spotlight
  • SVG
  • System
  • Tag
  • Telephony
  • Text
  • Text to Speech
  • timezone
  • Tools
  • Update
  • URL
  • UTI
  • Web Contents Control
  • WiFi
  • XML
  • XML-RPC
  • イベント(Event)
  • 未分類

アーカイブ

  • 2025年7月
  • 2025年6月
  • 2025年5月
  • 2025年4月
  • 2025年3月
  • 2025年2月
  • 2025年1月
  • 2024年12月
  • 2024年11月
  • 2024年10月
  • 2024年9月
  • 2024年8月
  • 2024年7月
  • 2024年6月
  • 2024年5月
  • 2024年4月
  • 2024年3月
  • 2024年2月
  • 2024年1月
  • 2023年12月
  • 2023年11月
  • 2023年10月
  • 2023年9月
  • 2023年8月
  • 2023年7月
  • 2023年6月
  • 2023年5月
  • 2023年4月
  • 2023年3月
  • 2023年2月
  • 2023年1月
  • 2022年12月
  • 2022年11月
  • 2022年10月
  • 2022年9月
  • 2022年8月
  • 2022年7月
  • 2022年6月
  • 2022年5月
  • 2022年4月
  • 2022年3月
  • 2022年2月
  • 2022年1月
  • 2021年12月
  • 2021年11月
  • 2021年10月
  • 2021年9月
  • 2021年8月
  • 2021年7月
  • 2021年6月
  • 2021年5月
  • 2021年4月
  • 2021年3月
  • 2021年2月
  • 2021年1月
  • 2020年12月
  • 2020年11月
  • 2020年10月
  • 2020年9月
  • 2020年8月
  • 2020年7月
  • 2020年6月
  • 2020年5月
  • 2020年4月
  • 2020年3月
  • 2020年2月
  • 2020年1月
  • 2019年12月
  • 2019年11月
  • 2019年10月
  • 2019年9月
  • 2019年8月
  • 2019年7月
  • 2019年6月
  • 2019年5月
  • 2019年4月
  • 2019年3月
  • 2019年2月
  • 2019年1月
  • 2018年12月
  • 2018年11月
  • 2018年10月
  • 2018年9月
  • 2018年8月
  • 2018年7月
  • 2018年6月
  • 2018年5月
  • 2018年4月
  • 2018年3月
  • 2018年2月

https://piyomarusoft.booth.pm/items/301502

メタ情報

  • ログイン
  • 投稿フィード
  • コメントフィード
  • WordPress.org

Forum Posts

  • 人気のトピック
  • 返信がないトピック

メタ情報

  • ログイン
  • 投稿フィード
  • コメントフィード
  • WordPress.org
Proudly powered by WordPress
Theme: Flint by Star Verte LLC