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

タグ: 11.0savvy

Pagesで選択中の表オブジェクトのデータ行を逆順に

Posted on 9月 26, 2021 by Takaaki Naganoya

Pagesで編集中の最前面の書類上で選択中の表オブジェクトに対して、行単位で逆順に入れ替えるAppleScriptです。Pages v11.1+macOS 12beta7で開発して使用しています。

Pagesの表操作機能には大したものはありませんが、さすがに昇順/降順のソートぐらいはできます。ただ、そうしたソートではなく、単純に順番を入れ替えたいといったときに処理する機能がありません。

この表データにはソート用のキーが存在していません。「軍隊の階級順にソート」とかいうお花畑な機能があれば使うんでしょうけれど、頭がいいヒトなら一時的にソート用の列を作ってシーケンシャル値を入れておき、逆順ソートして一時ソートキー列を削除することでしょう。

ただ、この「ソート用の一時データ列」すら作るのがめんどくさかったので、ありあわせの機能を使って使い捨てレベルのScriptを書いてみました。AppleScriptで書いておけば、同じ作業を行うさいに、2度目からは手間をかけずに行えますので。

PagesはiWork3兄弟(Keynote、Pages、Numbers)の中で、唯一、「selection」で各種選択中のオブジェクトを取得できます。Keynoteもこの仕様になってほしいのですが、違っています(Keynoteでは選択中のスライドが返ってくるだけ)。

正直なところ、いったんPages上の表のデータをコピペでNumbersに持って行って、Numbers側で並べ替えて手動でふたたびPagesの表に書き戻せばScriptを持ち出す必要もないんですが、繰り返し行う作業っぽいのでmacOS標準搭載のScript Menuに組み込んでおくことを前提に書いてみました。

ほぼ組み捨てレベルの使い捨てScriptなので、さまざまな条件でのテストは行っていません。何か問題があったらコメント欄でお知らせください。

Keynote/Pages/Numbers共通で、表のデータを取得すると1次元配列(1D List)で返ってきます。それはもう、既知の事実なので……1次元配列から2次元配列に変換するルーチンを用意して使っています。普通はBridgePlusの機能を呼び出して使うところですが、FileMaker ProのAppleScriptランタイム中でこれを呼び出せない(外部ライブラリの機能を一切呼び出せない)ことに苦しめられ、ちょっとBridgePlusを外しています。

AppleScript名:選択中の表オブジェクトのデータ行を逆順に.scpt
—
–  Created by: Takaaki Naganoya
–  Created on: 2021/09/26
—
–  Copyright © 2021 Piyomaru Software, All Rights Reserved
—
use AppleScript version "2.4" — Yosemite (10.10) or later
use framework "Foundation"
use scripting additions

tell application "Pages"
  tell front document
    set aSel to selection
    
if aSel = {} then return
    
    
set aTarg to first item of aSel
    
set aClass to class of aTarg
    
if aClass is not equal to table then return
    
    
–選択中の表オブジェクトを処理対象に
    
tell aTarg
      set rCount to count every row
      
set cCount to count every column
      
      
set hCount to header row count
      
set fCount to footer row count
      
      
set allData to value of every cell of cell range –表中の全セルのデータを取得(1Dで返ってくる)
      
set aRes to my subarraysFrom:(allData) groupedBy:(cCount) –1D Listの2D化
      
      
set bRes to items (1 + hCount) thru (-1 – fCount) of aRes
      
set rList to reverse of bRes –逆順に
      
      
–表にデータを書き戻す
      
repeat with rC from (1 + hCount) to (rCount – fCount)
        tell row rC
          repeat with cC from 1 to cCount
            tell cell cC
              set tmpVal to item cC of item (rC – hCount) of rList –けっこういい加減
              
if tmpVal = missing value then set tmpVal to ""
              
              
set value of it to tmpVal
            end tell
          end repeat
        end tell
      end repeat
      
    end tell
  end tell
end tell

–1D Listの2D化(BridgePlus不使用バージョン)
on subarraysFrom:(aList as list) groupedBy:(gNum as integer)
  script spdObj
    property list : aList
    
property bList : {}
  end script
  
  
  
–Group Num check
  
if gNum = 0 then return false
  
if length of aList < gNum then return false
  
  
if (length of aList) mod gNum is not equal to 0 then return
  
  
set (bList of spdObj) to {}
  
  
set tmpList to {}
  
set aCount to 1
  
  
repeat with i in aList
    set j to contents of i
    
set the end of tmpList to j
    
set aCount to aCount + 1
    
    
if aCount > gNum then
      set the end of (bList of spdObj) to tmpList
      
set tmpList to {}
      
set aCount to 1
    end if
  end repeat
  
  
return (bList of spdObj)
end subarraysFrom:groupedBy:

★Click Here to Open This Script 

Posted in list | Tagged 10.15savvy 11.0savvy 12.0savvy Pages | 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

ヤバイ本の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

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

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

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

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

CotEditor Script Pack v3の一般向け配布を開始

Posted on 7月 8, 2021 by Takaaki Naganoya

macOS用テキストエディタ「CotEditor」の機能強化AppleScript集「Script Pack v3」の配布を開始しました。

→ 配布ページ

Script Packは従来バージョン同様に、機能強化ユーティリティScript集の「PowerPack」および、AppleScriptによる基礎的なCotEditorの操作を解説した「Basic Pack」から構成されています。macOS 10.15.xおよび11.x+CotEditor v4.xとの組み合わせで利用することを想定しています。M1 Mac上でも動作確認ずみです。

PowerPack v3では、CotEditor上で編集中のテキストの文字種別を集計してグラフ表示させたり、編集中のテキストで使われている単語をもとにタグクラウド表示を行うなど、従来では把握しにくかったテキストの傾向をビジュアル表示する機能を追加しています。

外部アプリケーションを使わずにCSVデータのプレビュー(100行までの制限あり)、Markdownテキストのプレビューを行えるなど、CotEditorの動作速度を損うことなく大幅な機能追加を行なっています。

Posted in news PRODUCTS | Tagged 10.15savvy 11.0savvy CotEditor | Leave a comment

CotEditor強化Script集「PowerPack v3」の解説本を発売

Posted on 7月 7, 2021 by Takaaki Naganoya

電子書籍の新刊を出しました。「機能強化AppleScript集 CotEditor用 PowerPack 取扱説明書」ページ数:191ページ、フォーマット:PDF+Zipアーカイブ(PowerPack、BasicPack)となっています。

→ 販売ページ
→ お試し版書籍ダウンロード

「CotEditor」は、Github上のオープンソース・プロジェクトで公開されているmacOS用の高機能テキストエディタです。本書は、そのCotEditorに便利で強力な機能を追加できるAppleScript集「PowerPack v3」の取扱説明書です。

本書にはPowerPack v3(ソース編集可能版)+Basic Packが含まれています。現在準備中の一般配布版のPowerPack v3は内容が見られません。ただ実行するだけです。

新たにリリースしたPowerPackバージョン3では、グラフ表示やタグクラウド表示などの「ド派手な機能」を追加。Markdown書類のプレビューやCSVデータの表プレビュー、タブ区切りテキストによるKeynote書類の生成、ミュージック.appのトラックへの歌詞データの書き込みなど、AppleScriptによる高度な処理を手軽にご堪能いただけます。

→ 書籍サポートページ

Posted in Books PRODUCTS | Tagged 10.15savvy 11.0savvy CotEditor | 1 Comment

macOS 11で「withFormat」系のAPIが軒並みエラーに?

Posted on 7月 1, 2021 by Takaaki Naganoya

すでにAppleにフィードバックしている内容ではあるのですが(修正されることを祈るばかりです)、NSStringのstringWithFormat:メソッドがmacOS 11ではエラーになります。エラーというよりも、実行処理系そのものがクラッシュします(確定した事実)。

これと似た記法を行う「NSPredicate predicateWithFormat:」も同様にエラーになることが判明しました。こちらはクラッシュを発生させるほどではありませんが、これまでのOSバージョンで動作していた記法がエラーになっています(勘違い)。

どうもこれらの発生原因は同じような処理の箇所のように見えるため、macOS 11では「withFormat:」のAPIが、AppleScriptからScripting Bridge経由で呼び出すと一律にエラーになるものと想像しています。

→ テストに使用したScriptに間違いがあって、macOS 10.15以前では「たまたま動いていた」ということがわかりました。「NSPredicate predicateWithFormat:」自体でエラーが出ていたのではなく、その中に書いていたPredicate文に間違いがあったことがわかりました(確認・確定した事実)

Posted in Bug | Tagged 11.0savvy | Leave a comment

Shane StanleyのFramework入りAppleScript LibraryがM1対応

Posted on 6月 28, 2021 by Takaaki Naganoya

Shane StanleyのFrameworkバイナリ入りAppleScript Library「Bridge Plus」「Myriad Tables Lib」「SQLite Lib2」がApple Silicon対応していました。

それぞれ単独の配布アーカイブではApple Silicon対応していないのですが、「Shane’s Script Library Pack」でまとめて配布されているものはApple Silicon対応のUniversal Binaryでビルドされています。

インストーラーはAppleScriptアプレットになっており、実行すると……これらのライブラリがインストールされていません。このため、Shane Stanley本人に聞いてみたところ、これらのインストール対象のライブラリがすでにインストールされている場合には、あらかじめ削除しておいてほしいとのこと。

……それはわかりませんでした(^ー^;;

m1mini:~ me$ file /Users/me/Library/Script\ Libraries/BridgePlus.scptd/Contents/Frameworks/BridgePlus.framework/Versions/A/BridgePlus 
/Users/me/Library/Script Libraries/BridgePlus.scptd/Contents/Frameworks/BridgePlus.framework/Versions/A/BridgePlus: Mach-O universal binary with 2 architectures: [x86_64:Mach-O 64-bit dynamically linked shared library x86_64] [arm64:Mach-O 64-bit dynamically linked shared library arm64]
/Users/me/Library/Script Libraries/BridgePlus.scptd/Contents/Frameworks/BridgePlus.framework/Versions/A/BridgePlus (for architecture x86_64):	Mach-O 64-bit dynamically linked shared library x86_64
/Users/me/Library/Script Libraries/BridgePlus.scptd/Contents/Frameworks/BridgePlus.framework/Versions/A/BridgePlus (for architecture arm64):	Mach-O 64-bit dynamically linked shared library arm64

あれ? Dialog Toolkit PlusもFramework同梱ライブラリですが、これに含まれていないような、、、、
→ ああ、バンドル内にFrameworksフォルダが存在しているものの、中身はありませんでした(Thanks Shane!)

Posted in news | Tagged 11.0savvy | Leave a comment

macOS 11、NSSortDescriptorでNSArrayを作ると100%クラッシュ

Posted on 6月 25, 2021 by Takaaki Naganoya

ものすごくありふれた「レコードをリストに入れたデータ」を高速でソートするために用いているサブルーチン「sortRecListByLabel」がmacOS 11でクラッシュするという情報を得て、調査してみたところたしかに100%クラッシュすることを確認しました。

具体的にどこでクラッシュするとかいえば、NSSortDescriptorでNSArrayを作る箇所、

set sortDesc to NSSortDescriptor's alloc()'s initWithKey:bLabelStr ascending:ascendF
set sortDescArray to NSArray's arrayWithObjects:sortDesc--This line cause crash!!!

ここです。

クラッシュを回避するためには、明示的にNSSortDescriptorでNSArrayを作成せず、Scripting Bridge経由で暗黙のlist→NSArray変換が行われるように書き換えること。こうすればクラッシュは発生しませんでした。

→ 訂正:もともとarrayWithObjectsでNSArrayを作る際には末尾にnull(missing value)が必要になるなど、昨今ではあまり使うことが推奨されない(廃止されつつある)やり方でした。NSArray arrayWithArray:などで作ればとくに問題ないことが発覚。よく見ると、ASOC初期の古いコードでそういうやり方をしていたものがあったようです。これまで「たまたま動いていた」というのが真相のようで、、、、(Thanks Shane!)

AppleScript名:asoc_レコードのリストをソート v3
— Created 2021-06-24 by Takaaki Naganoya
— 2021 Piyomaru Software
use AppleScript version "2.4"
use scripting additions
use framework "Foundation"

script orig
  property aList : {}
end script

set (aList of orig) to {}

using terms from scripting additions
  repeat 100 times
    –乱数発生にrandom numberをmacOS 11+M1 Macで呼び出すと遅いので注意
    
set the end of aList of orig to {labelA:"a", labelB:(random number from 1 to 100)}
  end repeat
end using terms from

set bList to sortRecListByLabel((aList of orig), "labelB", false) of me –昇順ソート
return bList

–リストに入れたレコードを、指定の属性ラベルの値でソート
on sortRecListByLabel(aRecList as list, aLabelStr as string, ascendF as boolean)
  set aArray to current application’s NSArray’s arrayWithArray:aRecList
  
set sortDesc to current application’s NSSortDescriptor’s alloc()’s initWithKey:aLabelStr ascending:ascendF
  
–set sortDescArray to current application’s NSArray’s arrayWithObjects:sortDesc–macOS 11でクラッシュ
  
set sortedArray to aArray’s sortedArrayUsingDescriptors:{sortDesc}
  
set bList to (sortedArray) as anything
  
return bList
end sortRecListByLabel

★Click Here to Open This Script 

Posted in list | Tagged 11.0savvy NSArray NSSortDescriptor | Leave a comment

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

Posted on 6月 22, 2021 by Takaaki Naganoya

M1 Mac miniで各種AppleScript系のベンチマークをとってみたところ、信じられないほど遅く、「どうやらAppleScriptを高性能コア(Firestorm)ではなく高効率・省電力コア(Icestorm)」で実行しているのでは? という疑いを持ちました。

# 本件はmacOS 12で修正されました

10倍遅いというとショッキングな数値に見えますが、問題はこれが「まだマシな方」の結果であり、トータルで77倍遅い処理があったりと、目を疑いたくなるような結果のオンパレードです。

そんな中、アクティビティモニタの「ウィンドウ」>「CPUの履歴」で各CPUコアの履歴とともに種別が表示されることが判明。Icestormには「効率性」、Firestormには「パフォーマンス」とコアごとの種別が表示されます。

冗談抜きで、AppleScriptがIcestormで(効率性コア)実行されているようにしか見えません。

M1 Mac+macOS 11上で各種ベンチマークをとってみたところ、Intel Mac+macOS 10.14よりも大幅にパフォーマンスが低下する例が頻発。NSMutableArrayに21万項目の項目を追加するベンチマーク(5回計測して平均値を計算)を走らせてみたところ、

 MacBook Pro Retina 2012(Intel Core i7 2.6GHz、macOS 10.14.6):8.69秒
 Mac mini M1 2020(M1 3.2GHz、macOS 11.5beta):104.25秒

M1 MacがIntel Mac(しかも2012年のマシン)の77倍も処理時間がかかるという結果が出ています。このため、AppleScriptをFirestormではなくIcestormで動かしているのではないか、と疑っていました。

とくに、M1ではAppleScriptのrandom number(乱数計算)コマンドが極端に遅く、これを使ってテスト用に乱数データを作ると腰が抜けるほど時間がかかります。シーケンシャル値の続く配列を作ってGamePlaykit.frameworkを用いてシャッフルするのがよさそうです。ただ、本当にM1でrandom number計算は遅くなります。

700箇所の位置情報をもとに、日本全国の最寄りの鉄道駅を計算する距離計算を行なったところ、M1 Mac miniでは2012年製のMacBook Pro Retina 2012の10倍処理時間がかかりました。MBPで6分かかるところがM1だと1時間かかりました。

GUIアプリケーションにちょこちょこ命令するだけとかいう、「単なるマクロ言語」としての世界観(小乗AppleScript)で使う分にはよいのですが、アプリケーションに依存せず単体でデータ処理を行なったり、Mac App Storeで販売するGUIアプリケーションまで記述して実行しているわけで、Icestormで実行してほしくはありません。

Intel Macで6分あまりの処理にM1 Macでは60分以上かかっており、2012年のマシンに比べて2021年製の最新鋭のマシンがまさに文字通り「桁違いの遅さ」を見せているのが現状です。

実行中のアクティビティモニタの表示を見ると、高性能コア(Firestorm)への負荷はあまりかかっておらず、逆に高効率コア(Icestorm)への負荷が集中していることが見て取れます。

Intel Mac上で実行中には、4コア8スレッドのIntel Core i7の各コア(4コア)に均等に負荷がかかっていることが見て取れました。

M1 Mac miniの基本性能の高さはグラフィック性能やディスクI/O性能を中心に実証されているため、あくまでOS側の「味付け」の問題が原因と見ています。

AppleScriptが単なる「GUIアプリケーションをちょこっと自動化するだけのお可愛らしいマクロ言語」なのであれば、Icestormで実行するという話も悪くはないでしょう。ただ、Mac App Storeで販売しているGUIアプリケーションから各種データ処理を行うシビアな処理を行う処理系でもあり、やはり2012年のIntelマシンの10倍とか77倍遅いという現状は面白くはありません。

Posted in news | Tagged 10.14savvy 11.0savvy | Leave a comment

Post navigation

  • Older posts
  • Newer posts

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

Google Search

Popular posts

  • 開発機としてM2 Mac miniが来たのでガチレビュー
  • macOS 13.6.5 AS系のバグ、一切直らず
  • CotEditorで2つの書類の行単位での差分検出
  • Apple純正マウス、キーボードのバッテリー残量取得
  • macOS 15, Sequoia
  • 初心者がつまづきやすい「log」コマンド
  • ディスプレイをスリープ状態にして処理続行
  • 指定のWordファイルをPDFに書き出す
  • Adobe AcrobatをAppleScriptから操作してPDF圧縮
  • メキシカンハットの描画
  • 与えられた文字列の1D Listのすべての順列組み合わせパターン文字列を返す v3(ベンチマーク用)
  • Pages本執筆中に、2つの書類モード切り替えに気がついた
  • 2023年に書いた価値あるAppleScript
  • Pixelmator Pro v3.6.4でAppleScriptからの操作時の挙動に違和感が
  • AdobeがInDesign v19.4からPOSIX pathを採用
  • Safariで「プロファイル」機能を使うとAppleScriptの処理に影響
  • Cocoa Scripting Course 続刊計画
  • NaturalLanguage.frameworkでNLEmbeddingの処理が可能な言語をチェック
  • macOS 14.xでScript Menuの実行速度が大幅に下がるバグ
  • スクリプトエディタで記入した「説明」欄の内容が消えるバグ

Tags

10.11savvy (1102) 10.12savvy (1243) 10.13savvy (1392) 10.14savvy (587) 10.15savvy (438) 11.0savvy (283) 12.0savvy (206) 13.0savvy (163) 14.0savvy (113) 15.0savvy (90) CotEditor (64) Finder (51) iTunes (19) Keynote (115) NSAlert (61) NSArray (51) NSBitmapImageRep (20) NSBundle (20) NSButton (34) NSColor (51) NSDictionary (27) NSFileManager (23) NSFont (19) NSImage (41) NSJSONSerialization (21) NSMutableArray (62) NSMutableDictionary (21) NSPredicate (36) NSRunningApplication (56) NSScreen (30) NSScrollView (22) NSString (117) NSURL (97) NSURLRequest (23) NSUTF8StringEncoding (30) NSView (33) NSWorkspace (20) Numbers (72) Pages (53) Safari (44) Script Editor (26) 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
  • 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
  • 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)
  • 未分類

アーカイブ

  • 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