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

タグ: 10.15savvy

新発売:AppleScript基礎テクニック集(19)リモートコントロール

Posted on 7月 11, 2022 by Takaaki Naganoya

電子書籍の新刊を発売しました。新シリーズ「AppleScript基礎テクニック集」の第19巻、「リモートコントロール」です。PDF 37ページ、付録AppleScriptのZipアーカイブを添付。

→ 販売ページ

AppleScriptは、リモートコントロールを行うために作られた言語です。1台のコンピュータ上でスクリプトの実行環境と、操作対象のアプリケーションという別々のプロセスの間でメッセージを送り合って、制御を行います。その姿は、あたかも電話をかけて出前の注文をお願いしているかのようです。

1台のコンピュータ上ですら「通信」しているのですから、ネットワーク、主にLAN上で通信して他のコンピュータ上で起動しているアプリケーションとの間で通信して操作するのも同様に「通信」でできます。これがリモートApple Eventsです。

柔軟に通信を行って、イベントを投げ合うのがAppleScriptの本来の姿ではあるのですが、昨今のセキュリティ問題の高まりにより、あまり野放図に柔軟な処理ができないようにいろいろな制約が設けられるようになった……はずだったのですが、なぜかmacOS 10.13あたりからふたたび制限が緩和され、ネットワークごしのリモート・アプリケーション操作機能が復活しました。

いろいろ注意すべき点はありますが、使いこなすと便利で楽しいリモートコントロール。詳しく分かりやすく、誰も教えてくれない内容について、1冊まとめて説明いたします。

macOS 12.5 beta 5の不具合でAppleScriptはおろかドラッグ&ドロップでファイルのオープンができなくなるわ、Finderのtoolbarに登録したアイコンのクリックも3回目以降は効かなくなるわで、最悪の作業環境の中、LAN上の他のOSバージョンのマシンにリモートコントロールで作業を依頼していろいろ作っていました。

目次

■リモートコントロール入門

リモートコントロールのための言語
AppleScript実行時のリモートコントロールの詳細
通常のリモートコントロールのイメージ
同一マシン上のリモートコントロールのイメージ
リモートマシンのリモートコントロール
リモートAppleEventsの歴史

■ローカルマシン上の常駐アプレットをリモートコントロール

AppleScriptと常駐アプレットの間で通信する
アプリケーション操作と同じ呼び出しも可能

■ローカル・マシン上の他のユーザ・アカウントで動作中の常駐アプレットをリモートコントロール

他のユーザの常駐アプレットをリモートコントロール
他のユーザに切り替えて常駐アプレットを実行
同一マシン上の他のユーザのプロセスを指定

■他のマシン上の常駐アプレットをリモートコントロール

操作対象となるコンピュータの名前を調べる
コンピュータ名/Bonjour名は編集可能
対象マシンのユーザ名を確認
例:macOS 10.15以降のユーザ名制限解除
ネットワーク上の他のマシン上のアプレット操作
リモート・マシンの指定方法
リモートApple Events操作時の注意点

■他のマシン上のアプリケーションをリモートコントロール

他のマシン上のアプリケーションのリモートコントロール
リモートコントロールを行うべきか、べきでないのか?
対象マシン上のアプリケーションをコントロール

Posted in Books news | Tagged 10.14savvy 10.15savvy 11.0savvy 12.0savvy | Leave a comment

新発売:AppleScript基礎テクニック集(18)グラフ表示ダイアログ

Posted on 7月 6, 2022 by Takaaki Naganoya

電子書籍の新刊を発売しました。新シリーズ「AppleScript基礎テクニック集」の第18巻、「グラフ表示ダイアログ」です。PDF 37ページ、付録AppleScriptのZipアーカイブを添付。

→ 販売ページ

地味で控え目なAppleScriptにおいて、ダイアログ上でアニメーション表示可能なグラフを表示できるようになったのは、ごくささいな小さな発見があったためです。

macOS 10.10以降ですべての実行環境でサポートされるようになったCocoa呼び出し機能。当然WebViewも生成して表示可能なことはわかっていました。ところが、標準的なNSWindowの上にWkWebViewを配置して初期設定を行なっただけでは、WkWebView上のイベント回しが効かず、アニメーション表示は行えませんでした。

ところが、そんな状況を打破したのはNSAlertダイアログ。ごくごく限られたUIを乗せて利用するようにメーカー側から指導されてきた、誰も見向きもしなかった間に合せのダイアログ表示インタフェースです。

ところが、このNSAlert上でWkWebViewを表示すると、Webコンテンツのイベント回しをきちんと処理して、グラフ表示アニメーションやマウスによる操作、マウスカーソル移動のマウスオーバーのイベントにも反応することがわかりました。

ここから、さまざまなJavaScript製グラフ表示ライブラリを試行錯誤し、今日ではテキストエディタ上の選択範囲のテキストの文字種別を円グラフでアニメーション表示するといった、きわめて身近で日常的な用途に手軽にグラフ表示ダイアログが利用されるようになりました。

このやり方について、基礎的なところから詳細に解説を行い、実際に動くコードを提示し、macOS上のさまざまな実行環境での状況をご紹介しています。

■グラフ表示ライブラリでダイアログ上にグラフ表示

グラフ表示ダイアログの全体像
グラフ表示ダイアログの構成技術
組み立てるWeb系データの構造
CDN上のグラフ表示ライブラリを呼ぶ
Web表示部品をダイアログ上に表示
JavaScriptで扱えるデータを組み立てる
AppleScriptのバンドル中からhtmlを読み込む
HTMLテンプレートファイルを準備

■Webダイアログ表示ライブラリを呼び出し

HTMLテンプレートをまとめる作業
JavaScript書き換え例
Webダイアログで
さまざまなグラフを表示
AMCharts:円グラフ
AMCharts:棒グラフ
AMCharts:ワードクラウド
AMCharts:世界地図+国選択
AMCharts:世界地図(ドリルダウン)+国選択

■さまざまなランタイム環境でWebダイアログ表示を実行

特殊なAS実行環境ではさらなる変更も必要
Automator環境では、表示されない
ショートカット環境では、表示されない
Switch Control環境では表示OK!
Service Station環境で動作
Stream Deck環境で動作
FileMaker Pro環境では動く
Visual Studio Code環境で表示OK(一応)

Posted in Books news | Tagged 10.14savvy 10.15savvy 11.0savvy 12.0savvy | Leave a comment

Keynoteの表で選択中のセルの文字列長さを一覧表で表示

Posted on 7月 4, 2022 by Takaaki Naganoya

Keynoteの最前面の書類で表示中のスライド中の表で、選択中の各セルの内容の文字列の長さを表インタフェースで一覧表示するAppleScriptです。

こんなKeynote書類上の表があったとして、その選択中の各セルに入っている文字列の長さを、AppleScriptライブラリ「display table by list」を用いて一覧表示します。実行には同ライブラリのインストールが必要です。

実行の前提として、Keynoteで書類をオープンしてあり、書類上の表の集計対象のセルを選択しておくことが必要です。

文字列長と元の文字列を一覧表示します。

AppleScript名:Keynoteの表で選択中のセルの文字列長さを一覧表で表示.scpt
—
–  Created by: Takaaki Naganoya
–  Created on: 2022/07/04
—
–  Copyright © 2022 Piyomaru Software, All Rights Reserved
—
use AppleScript version "2.5" — El Capitan (10.11) or later
use framework "Foundation"
use scripting additions
use easyTable : script "display table by list"

tell application "Keynote"
  tell front document
    tell current slide
      try
        set theTable to first table whose class of selection range is range
      on error
        display notification "Numbers: There is no selection"
        
return
      end try
      
      
tell theTable
        set aRes to value of cells of selection range
      end tell
    end tell
  end tell
end tell

set fLabels to {"文字列長", "文字列"}

set newList to {}
repeat with i in aRes
  set j to contents of i
  
if j is not equal to missing value then
    set aLen to length of j
    
set the end of newList to {aLen, j}
  end if
end repeat

tell current application
  set aRes to (display table by list newList main message "テキストの文字列長" sub message "Keynoteの表で選択中のテキストの各セルの文字列長" size {800, 400} labels fLabels icon "")
end tell

★Click Here to Open This Script 

Posted in list Text | Tagged 10.15savvy 11.0savvy 12.0savvy Keynote | 1 Comment

Keynoteの最前面の書類で表示中のスライドで選択中の表の指定行のテキストのセルの文字列長の分布を計算

Posted on 7月 4, 2022 by Takaaki Naganoya

Keynoteの最前面の書類で表示中のスライド(ページ)で選択中の表の、指定行のテキストのセルの文字列長の分布をグラフ出力するAppleScriptです。

# Blogの英訳本の企画を動かしていますが、たしかに日本語のタイトルを(日本人が)見てもけっこうわかりにくいのかも?
# タイトルをGoogle翻訳に突っ込むと、それなりに「そんな感じじゃね?」という英語が出てきますが、、、

こういう、電子書籍の紹介文を掲載しているページがあって、そこに書いてある紹介文の長さの分布を計算してみるために、ありものの部品を組み合わせて作ったものです。

「だいたい3行ぐらい」というふんわりとしたルールのもとに18冊分ほど書いてきましたが、本の冊数が増えてページを追加するにあたって、文字列長の分布を計算してみようと思い立ってScriptを書いてみました。

043 #
044 ##
045 
046 ###
047 
048 ##
049 ###
050 #
051 #
052 #
053 
054 #
055 
056 #
057 #
058 
059 
060 
061 
062 
063 
064 
065 
066 
067 
068 #

分布はわかりましたが、似たような処理を行うことが多いので、何か簡単なGUIをつけておいたほうがいいような気がするような、、、

AppleScript名:選択中の表のデータを取得して、特定の行のデータの文字列長を集計.scpt
—
–  Created by: Takaaki Naganoya
–  Created on: 2022/07/04
—
–  Copyright © 2022 Piyomaru Software, All Rights Reserved
—
use AppleScript version "2.4"
use scripting additions
use framework "Foundation"

property NSMutableArray : a reference to current application’s NSMutableArray

set aList to get2DListFromKeynoteTableSelection() of me
if aList = "" then return false

–取得した各セルの文字列長をすべて取得する
set aLen to length of aList
set aaLen to length of item 1 of aList

set nList to {}
repeat with i from 3 to (aLen) by 3
  repeat with ii from 1 to aaLen
    set the end of nList to length of (contents of item ii of item i of aList)
  end repeat
end repeat

–文字列長の度数分布を計算
set minRes to calcMin(nList) of me
set maxRes to calcMax(nList) of me

set itemCount to maxRes – minRes
set n2List to makeBlankListByItem(itemCount + 1, 0) of me

repeat with i in nList
  set j to contents of i
  
set tmpNum to contents of item (j – minRes + 1) of n2List
  
set tmpNum to tmpNum + 1
  
set item (j – minRes + 1) of n2List to tmpNum
end repeat

–文字列長の度数分布のグラフを文字出力
set tList to {}
set aCount to minRes

repeat with i in n2List
  set gText to returnRepeatedText(i, "#") of me
  
set tNumStr to makeFN(aCount, 3) of me
  
set totalText to tNumStr & " " & gText
  
set the end of tList to totalText
  
set aCount to aCount + 1
end repeat

return retArrowText(tList, return) of me

–リストを任意のデリミタ付きでテキストに
on retArrowText(aList, aDelim)
  set aText to ""
  
set curDelim to AppleScript’s text item delimiters
  
set AppleScript’s text item delimiters to aDelim
  
set aText to aList as text
  
set AppleScript’s text item delimiters to curDelim
  
return aText
end retArrowText

on returnRepeatedText(aNum, aChar)
  set aText to ""
  
repeat aNum times
    set aText to aText & aChar
  end repeat
  
return aText
end returnRepeatedText

on makeBlankListByItem(itemNum, blankItem)
  set tmpList to {}
  
repeat itemNum times
    set the end of tmpList to blankItem
  end repeat
  
return tmpList
end makeBlankListByItem

on calcMin(aList as list)
  set tmpFItem to first item of aList
  
set aClass to class of tmpFItem
  
  
set nArray to (NSMutableArray’s arrayWithArray:aList)
  
if aClass = real then
    set maxRes to (nArray’s valueForKeyPath:"@min.self")’s doubeValue()
  else
    set maxRes to (nArray’s valueForKeyPath:"@min.self")’s intValue()
  end if
  
  
return maxRes
end calcMin

on calcMax(aList as list)
  set tmpFItem to first item of aList
  
set aClass to class of tmpFItem
  
  
set nArray to (NSMutableArray’s arrayWithArray:aList)
  
if aClass = real then
    set maxRes to (nArray’s valueForKeyPath:"@max.self")’s doubeValue()
  else
    set maxRes to (nArray’s valueForKeyPath:"@max.self")’s intValue()
  end if
  
  
return maxRes
end calcMax

on makeFN(aNum, aDigit)
  set aText to "00000000000" & (aNum as text)
  
set aLen to length of aText
  
set aRes to text (aLen – aDigit + 1) thru -1 of aText
  
return aRes
end makeFN

–Keynoteで選択中の表のすべてのセルのデータを2Dで返す
on get2DListFromKeynoteTableSelection()
  tell application "Keynote"
    tell front document
      tell current slide
        try
          set theTable to first table whose class of selection range is range
        on error
          return "" –何も選択されてなかった場合
        end try
        
        
tell theTable
          set selList to value of every cell –すべてののデータを取得
          
set selHeight to count every row
          
set selWidth to count every column
          
        end tell
      end tell
    end tell
  end tell
  
  
set aLen to length of selList
  
set aaLen to selHeight
  
  
set bList to {}
  
repeat with i from 1 to aaLen
    set aHoriList to {}
    
    
repeat with ii from 1 to selWidth
      set j1 to ii + (i – 1) * selWidth
      
set tmpCon to contents of item j1 of selList
      
      
set aClass to class of tmpCon
      
if aClass = number or aClass = integer or aClass = real then
        set tmpCon to tmpCon as integer
      end if
      
      
set the end of aHoriList to tmpCon
    end repeat
    
    
set the end of bList to aHoriList
  end repeat
  
  
return bList
end get2DListFromKeynoteTableSelection

–テキストを指定デリミタでリスト化
on parseByDelim(aData, aDelim)
  set aText to current application’s NSString’s stringWithString:aData
  
set aList to aText’s componentsSeparatedByString:aDelim
  
return aList as list
end parseByDelim

–1D/2D Listのユニーク化
on uniquifyList(aList as list)
  set aArray to current application’s NSArray’s arrayWithArray:aList
  
set bArray to aArray’s valueForKeyPath:"@distinctUnionOfObjects.self"
  
return bArray as list
end uniquifyList

★Click Here to Open This Script 

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

新発売:AppleScript基礎テクニック集(17)リスト(配列)

Posted on 7月 1, 2022 by Takaaki Naganoya

電子書籍の新刊を発売しました。新シリーズ「AppleScript基礎テクニック集」の第17巻、「リスト(配列)」です。PDF 35ページ、付録AppleScriptのZipアーカイブを添付。

→ 販売ページ

AppleScriptにも配列変数はあります。その名も「リスト型変数」、一般的には「リスト」と呼ばれています。

AppleScriptのリストに対して、他のプログラミング言語と比べて「配列の要素が1から始まるなんて信じられない!」という意見も見かけますが、0で始まる(0-based index)か、1で始まる(1-based index)かの違いだけです。

リスト(配列)を使った基礎的な処理、要素の取り出しやループ、削除、しぼりこみ、ソートなどの定番をご紹介。 PDF 35ページ、サンプルScriptのZipアーカイブつき

目次

■リスト型変数=配列〜超基礎編

AppleScriptの配列=リスト型変数
リストの名前の付け方
リストの要素指定①
リストの要素指定②
リストに入れられるデータ

■リスト型変数=配列〜よくある処理

リストの内容でループ
複数の配列を同時にループ
指定要素を削除
指定アイテムを指定アイテム番号に挿入
配列の添字っぽい書き方でアクセス

■リスト型変数=配列〜しぼりこみ

2次元リストから要素の内容を部分一致で抽出①
2次元リストから要素の内容を部分一致で抽出②

■1次元リスト型変数〜ソート

1次元リスト、数値ソート(昇順)
1次元リスト、数値ソート(降順)
1次元リスト、数値ソート(昇順/降順)
1次元リスト、カスタムソート順でソート

■2次元リスト型変数〜複数キー指定ソート

2次元リスト、数値ソート(昇順)(1/3)
2次元リスト、数値ソート(昇順)(2/3)
2次元リスト、数値ソート(昇順)(3/3)
1次元リスト、数値ソート(昇順/降順)

Posted in Books news | Tagged 10.14savvy 10.15savvy 11.0savvy 12.0savvy | Leave a comment

1D Listを2Dに評価してアイテム内の相違点を検出

Posted on 6月 28, 2022 by Takaaki Naganoya

1次元リスト(配列)を幅を指定しつつ2次元リストとして評価し、1番左側のセルとの変化を横方向にサーチして検出するAppleScriptです。

もともと、macOS標準搭載の「辞書.app」に収録される各辞書データの名称が、各OSバージョンでどのように変化しているかを表計算ソフトNumbers上でチェックしていました。辞書.appの辞書をCocoa Frameworkを通じて呼び出し、さまざまな便利な処理を行っているため、辞書名称が変わると日常的に利用しているAppleScriptに影響が出てしまいます。その変化を検出するために、辞書名の変化を知っておこうというチェック作業が発生しています。

辞書.appの収録辞書名称は、意図したものか意図していないものか不明ですが、OSバージョンごとに微妙に変化することが知られています。そうした名称細部の変化を実際にチェックするのに、専用のScriptを使っていました(過去形)。

ただし、NumbersのデータをAppleScriptから取得すると、2D Listではなく1D Listとして返ってきます。そのさいに、BridgePlusの機能を用いて1D→2D変換を行ったのちに、いろいろ処理を行ってきました。

リストの1D→2D変換処理なんて、使っている場所が多すぎて数えきれないぐらいですが、Script Menu上で動かすScriptでBridgePlusを呼び出せなくなっており(macOS 10.14以降)、今後Script Menuが機能強化されるとは考えにくいところです。

サードパーティのFastScriptsなどでFramework入りScriptの実行をサポートするとか、そういう進化ができてほしいところですが、それもちょっと期待できません。

結果として、BridgePlusを極力使わなくて済むように、機能の置き換えを進めるしかありません。無理な機能もありますが、1D→2D変換ぐらいなら問題ありません(そして、出現頻度がおっそろしく高いものであります)。

そして、実際にNumbers上のデータを横方向(左→右、冒頭から末尾へ)に走査して変更を検出する処理を書いてみました。

処理に柔軟性が欲しかったので、追加でフラグ(reNewF)を用意しました。

これがfalseの場合には、横方向に変更を走査し、変化を検出した場合には評価を打ち切ります。trueの場合には、変化を検出した場合でも変化の検出を続行します。

AppleScript名:1D Listを2D的に評価してアイテム内の相違点を検出.scptd
—
–  Created by: Takaaki Naganoya
–  Created on: 2022/06/28
—
–  Copyright © 2022 Piyomaru Software, All Rights Reserved
—
use AppleScript version "2.4" — Yosemite (10.10) or later
use framework "Foundation"
use scripting additions

set aList to {1, 1, 1, 2, 3, 3, 3, 3, 3, 4, 3, 5}
set diffRes to getListDifference2D(aList, 3, true) of me
–> {{xAddrs:{2}, yAddr:2}, {xAddrs:{2}, yAddr:4}}–reNewF=falseで評価
–> {{xAddrs:{2}, yAddr:2}, {xAddrs:{2, 3}, yAddr:4}}—reNewF=true で評価

–1D Listを、2D Listとして評価しつつ、{cell1, cell2, cell3}のcell 1とcell2, cell3が違っていないか評価して返す
on getListDifference2D(dList as list, aWidth as integer, reNewF as boolean)
  script tdSpd
    property dList : {}
  end script
  
  
copy dList to (dList of tdSpd)
  
  
set diffList to {}
  
set diffAdrList to {}
  
  
set yOffsetCount to 1
  
  
set aCountMax to ((length of dList) div aWidth)
  
  
repeat with aC from 1 to (length of dList) by aWidth
    set tmpList to items aC thru (aC + aWidth – 1) of (dList of tdSpd)
    
    
set i1 to first item of tmpList
    
set i2 to rest of tmpList
    
    
set xOffsetCount to 2
    
set xDiffList to {}
    
    
repeat with ii in i2
      set jj to contents of ii
      
      
if i1 is not equal to jj then
        set the end of diffList to {i1, jj}
        
set the end of xDiffList to xOffsetCount
        
        
if reNewF = true then
          copy jj to i1
        else
          exit repeat
        end if
      end if
      
      
set xOffsetCount to xOffsetCount + 1
      
    end repeat
    
    
if xDiffList is not equal to {} then
      set the end of diffAdrList to {xAddrs:xDiffList, yAddr:yOffsetCount}
    end if
    
    
set yOffsetCount to yOffsetCount + 1
  end repeat
  
  
return diffAdrList
end getListDifference2D

★Click Here to Open This Script 

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

新発売:AppleScript基礎テクニック集(16)スクリプトエディタの使い方

Posted on 6月 28, 2022 by Takaaki Naganoya

電子書籍の新刊を発売しました。新シリーズ「AppleScript基礎テクニック集」の第16巻、「スクリプトエディタの使い方」です。PDF 38ページ、付録AppleScriptのZipアーカイブを添付。

→ 販売ページ

スクリプトエディタは、Classic Mac OSのスクリプト編集プログラムをAppleがMac OS Xに移植したものです。

初期にはCarbonベースで書かれ、v10.4でCocoa&Universal Binary化、v10.6で64bit化。v11でApple Silicon/Intel 64のUniversal Binary化と、Mac上のすべての移行を経験してきた猛者です。

原始時代のスクリプト編集プログラムには、検索機能すら実装されておらず、Script Debuggerとの差は明白でした(仕事で使うならScript Debuggerが必要、という状況はいまでも変わりません)。

そんなスクリプトエディタも、Mac OS X 10.4で32Kバイト以上のスクリプトが編集可能になり、AppleScriptからのコントロールが行えるようになったことで、「使える道具」になってきました。

同時にURLイベントに対応したことで、筆者のBlog「AppleScriptの穴」掲載の、リンクのクリックで内容が転送されるプログラムリストをWeb上で共有できるようにもなりました。

本書を通してご覧になると、「これは拾い物!」「こんなの知らなかった!」というスクリプトエディタの機能が見つかることでしょう。

本書付録には、スクリプトエディタのコンテクストメニューから起動するスクリプト記述支援AppleScript集「Piyomaru Script Assistant v2.1」、各種macOS標準搭載アプリケーション用のテンプレートAppleScript集を添付。

さまざまな角度から、スクリプト記述のための生産性を向上させる仕組みを提供しています。

目次:

■編集環境としてのスクリプトエディタ

スクリプトエディタの機能一覧
スクリプト新規作成/テンプレートからの作成
ユーザー用Scriptテンプレートの追加方法
Cocoa-AppleScriptアプレットの新規作成
URLイベント受信
短縮入力の展開
「説明」欄の編集
構文書式設定
コンパイル(構文確認)
バンドル内ファイル編集
Info.plist編集
スクリプトアシスタント入力
ヘルプの閲覧
AppleScriptからの操作
新規作成スクリプトのデフォルトウィンドウ指定
その他の機能

■実行・デバッグ環境としてのスクリプトエディタ

AppleScriptの実行環境における位置付け
実行/強制メインスレッド実行
ログ表示/履歴管理
スクリプトメニューの有効化/無効化

■用語辞書閲覧環境としてのスクリプトエディタ

用語辞書の閲覧
ライブラリ管理

■保存、書き出し環境としてのスクリプトエディタ

スクリプト保存
スクリプト書き出し/コード署名

Posted in Books news | Tagged 10.15savvy 11.0savvy 12.0savvy Script Editor | Leave a comment

Keynote上でテキストアイテムとn重のシェープの重なりを検出 v2

Posted on 6月 25, 2022 by Takaaki Naganoya

Keynoteでオープン中の最前面の書類の現在のスライド(ページ)の上で3重のshapeオブジェクトを下に敷いているテキストアイテムを検出し、文字色を変更するAppleScriptです。

macOS 12.5beta+Keynote v12.1の組み合わせで作成・チェックしてみましたが、Keynote v12.xの固有の機能などは使っていないので、もっと古い環境でも動くはずです。

–> Watch Demo Movie


▲処理前


▲処理後 右側のテキストの色まで変わってしまっているのは意図しなかった処理(わかってたけど)

Keynote書類上でshapeオブジェクトを重ねて何かを表現することはよくありますが、重ねた場所の上に置いてある文字色だけ変更したい場合が往々にしてあります。

さっさと動かすことだけ考えて、ありものの「オブジェクトの重ね合わせ検出」Scriptを使い回しました。そのため、本当に入れ子状態の3つのオブジェクトを検出しているわけではなく、重ね合わせが3回発生しているテキストアイテムを検出しています。

もうちょっと凝った処理を行えば、本当に3階層の入れ子状態のshapeを検出できそうな気はしますが、さすがに使い捨てレベルのScriptにそんなに手間暇をかけるわけにもいかないので、現状ではこんなものでしょう。

Keynoteのselectionがまともに動くようになったので、いろいろ実践的なレベルのScriptを書けるようになりましたが、オブジェクトの重ね合わせ順なども取れたりすると、もっといろいろ書けそうです。

オブジェクトのposition、width、heightを取得する処理は、もうちょっと高速に実行できるように書けそうです(まだまだ、安全第一の処理内容)。

あとは、imageオブジェクトのpathとかイメージデータそのものを取得して、各種画像フィルタをかけてKeynote書類に書き戻せるとよさそうな気がします。

AppleScript名:テキストアイテムと1重のシェープの重なり検出 v2.scptd
—
–  Created by: Takaaki Naganoya
–  Created on: 2022/06/25
—
–  Copyright © 2022 Piyomaru Software, All Rights Reserved
—

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

set collisonNum to 1
set targPointSize to 32.0
set targColList to {0, 0, 0} –Black

set tList to {} –text items
set trList to {}

set sList to {} –shapes
set srList to {}
–set bgColList to {} –background color

set colList to choose color

tell application "Keynote"
  tell front document
    tell current slide
      
      
–text itemの情報抽出ループ
      
set allTList to every text item
      
repeat with i in allTList
        set j to contents of i
        
        
tell j
          set {xPos, yPos} to position
          
set aWidth to width
          
set aHeight to height
          
set aRect to makeRect(xPos, yPos, aWidth, aHeight) of me
        end tell
        
        
set the end of tList to j
        
set the end of trList to aRect
      end repeat
      
      
      
–shapeの情報抽出ループ
      
set allSList to every shape
      
repeat with i in allSList
        set j to contents of i
        
tell j
          set {xPos, yPos} to position
          
set aWidth to width
          
set aHeight to height
          
–set aBGCol to background color
          
set aRect to makeRect(xPos, yPos, aWidth, aHeight) of me
        end tell
        
        
set the end of sList to j
        
set the end of srList to aRect
        
set the end of bgColList to aBGCol
        
      end repeat
      
      
set atLen to length of trList
      
set arLen to length of srList
      
      
set outTlist to {}
      
      
      
–shapeと重ね合わせが発生しているtext itemの検出ループ
      
repeat with i from 1 to atLen
        set atRec to contents of item i of trList
        
set atObj to contents of item i of tList
        
set collisionC to 0
        
        
set tmpCSize to point of first character of object text of atObj
        
        
–当該text itemに対して、shapeオブジェクトとのNSRectの重ね合わせが指定数発生しているかをチェック
        
repeat with ii from 1 to arLen
          set tmpRect to contents of item ii of srList
          
set aF to detectRectanglesCollision(atRec, tmpRect) of me
          
          
–背景色(background color)のリストを確認
          
set aBG to contents of item ii of bgColList
          
          
–if {aF, aBG, tmpCSize} = {true, targColList, targPointSize} then set collisionC to collisionC + 1
          
if {aF, tmpCSize} = {true, targPointSize} then set collisionC to collisionC + 1
        end repeat
        
        
–オブジェクトのRectangleが重なり合っている「回数」で判定
        
if collisionC = collisonNum then
          set the end of outTlist to atObj
        end if
      end repeat
    end tell
  end tell
end tell

–文字色を塗り替えるループ
tell application "Keynote"
  tell front document
    tell current slide
      repeat with i in outTlist
        set j to contents of i
        
ignoring application responses
          set color of object text of j to colList
        end ignoring
      end repeat
    end tell
  end tell
end tell

on makeRect(xPos, yPos, aWidth, aHeight)
  return current application’s NSMakeRect(xPos, yPos, aWidth, aHeight)
end makeRect

–NSRect同士の衝突判定
on detectRectanglesCollision(aRect, bRect)
  set a1Res to (current application’s NSIntersectionRect(aRect, bRect)) as {record, list}
  
set tmpClass to class of a1Res
  
  
if tmpClass = record then
    –macOS 10.10, 10.11, 10.12
    
return not (a1Res = {origin:{x:0.0, y:0.0}, |size|:{width:0.0, height:0.0}})
  else if tmpClass = list then
    –macOS 10.13 or later
    
return not (a1Res = {{0.0, 0.0}, {0.0, 0.0}})
  end if
end detectRectanglesCollision

–1から任意の数までのアイテムで、2個ずつの組み合わせのすべての順列組み合わせパターンを計算して返す
–ただし、1×1とか2×2などの同一アイテム同士の掛け合わせを除去するものとする
on retPairPermutationsWithoutSelfCollision(aMax)
  set aList to {}
  
  
repeat with x from 1 to aMax
    repeat with xx from 1 to aMax
      if x is not equal to xx then
        
        
set tmpItem to {x, xx}
        
set a2List to sort1DNumList(tmpItem, true) of me
        
        
if {a2List} is not in aList then
          set the end of aList to a2List
        end if
      end if
      
    end repeat
  end repeat
  
  
return aList
end retPairPermutationsWithoutSelfCollision

–1D List(数値)をsort / ascOrderがtrueだと昇順ソート、falseだと降順ソート
on sort1DNumList(theList as list, aBool as boolean)
  tell current application’s NSSet to set theSet to setWithArray_(theList)
  
tell current application’s NSSortDescriptor to set theDescriptor to sortDescriptorWithKey_ascending_(missing value, aBool)
  
set sortedList to theSet’s sortedArrayUsingDescriptors:{theDescriptor}
  
return (sortedList) as list
end sort1DNumList

★Click Here to Open This Script 

Posted in bounds list Object control | Tagged 10.15savvy 11.0savvy 12.0savvy Keynote | Leave a comment

iWork Appsがv12.1にアップデート

Posted on 6月 22, 2022 by Takaaki Naganoya

v12で発生していた、新規書類をAppleScriptから保存できないバグは修正されていません。

Posted in Bug | Tagged 10.15savvy 11.0savvy 12.0savvy Keynote Numbers Pages | Leave a comment

新発売:AppleScript高速化テクニック

Posted on 6月 20, 2022 by Takaaki Naganoya

電子書籍の新刊を発売しました。「AppleScript高速化テクニック」です。PDF 86ページ、サンプルAppleScriptのZipアーカイブを添付。

→ 販売ページ

本書は、高速なAppleScriptを書くための実践的なノウハウをまとめた、おそらく世界で初めての、現時点では唯一の書籍です。

AppleScript自体はインタプリタ型の処理系であるため、実行速度はSwiftやObjective-Cなどで書かれたプログラムにスピード面では遠く及びません。

ただし、処理系そのものや周辺環境に対する十分な理解をともなわずに書かれたScriptは、本来期待されるレベルを大きく下回るスピードしか出せません。大変残念なことです。AppleScriptはプログラミング言語というよりも、OSに対するシェルであるとか、一種のアプリケーションとしての性格が強いものです。そこには、明確な「使いこなし」のノウハウが存在しますし、癖もあります。

残念な状態に書かれたAppleScriptのプログラムは、自動車でいえば整備不良、ガス欠で、洗車も行われずに野ざらしになっている状態です。

本書は、いわばそうした残念な状態の自動車に対しての、整備、ガソリン補給、オイル交換や洗車についてご提案するものです。

実機で実際にAppleScriptのプログラムを動かし、実行時間を計測。どの程度速くなるか、そのメリットを数値でご理解いただけることでしょう。

目次

■AppleScriptは遅いのか?

書き方によって速度差が出やすいAppleScript
①大規模データ操作時の固有ノウハウ
②GUIアプリ操作の固有ノウハウ
③各アプリ固有の操作ノウハウ
④適材適所
⑤連携運用できるプログラムなどへの知識
まとめ:AppleScriptは遅いのか?

■遅いScriptを実際に高速化

とても遅くて下手なScriptのサンプル
素人Scriptからの高速化:さまざまな方向から
Script高速化の第一歩は「時間計測」
下手なScriptは、少ないデータ件数では目立たない
高速化ポイント1:一括取得
高速化ポイント1:一括取得
高速化ポイント2:受け取ったデータの保持
高速化ポイント3:受信データの変換
高速化ポイント4:rangeの変換処理を自前で
素人Scriptを高速化①:データ保持方法を変える
素人Scriptを高速化②:通信頻度を減らす

■高速化しやすい処理の傾向

AppleScriptの処理で高速化しやすい箇所
Finderをファイル処理に使わない①
Finderをファイル処理に使わない②
1次元リスト(配列)のソート
1D Listのソート
1D Listのソート
2次元リスト(配列)のソート
2D Listのソート(1/2)
2D Listのソート(2/2)
2D Listのソート
アプリケーションのオブジェクトへのアクセス
画面部品を強引に動かすGUI Scripting
指定の値をクリップボードに入れる
遅くなりがちな処理を避ける
漠然と「遅い」と言われた処理の傾向
スクリプトエディタとAppleScript間の通信①
スクリプトエディタとAppleScript間の通信②

■データ量と処理内容のバランスを取る

複数アクセス方法すべてで実行速度を計測
リスト(配列)データの要素数によって変わる選択肢
1000〜3万件文字列追加+時間計測
まとめて操作できるデータを個別操作
要素が連続する部分をリスト上で検出
まとめて書式設定(1/2)
まとめて書式設定(2/2)
RTF読み取りライブラリ(1/2)
RTF読み取りライブラリ(2/2)
RTF読み取りライブラリ(rtfToDict)の結果
非同期実行モードの利用
Numbersの表のセルを100個埋めるテスト
処理対象に応じて因数分解を行う部品を変更

■処理内容を見直す &使用部品を変える

AppleScriptの速いバージョンのmacOSを選択
処理に使用する部品を変更(乱数生成)
処理に使用する部品と方式を変更
処理モジュールを一体化
使用するマシン構成を変更:複数のマシンで分散処理
使用するマシンを変更:本当に速いマシンを使う

■ランタイム環境の選択

AppleScriptのさまざまな実行環境
AppleScript実行環境の名称を取得する方法
エディタ①
エディタ②
エディタ③
アプレット,ドロップレット①
アプレット,ドロップレット②
メニュー実行①
メニュー実行②
メニュー実行③
その他実行プログラム①
その他実行プログラム②
その他実行プログラム③
アプリケーション内蔵メニュー①
アプリケーション内蔵メニュー②

Posted in Books news | Tagged 10.14savvy 10.15savvy 11.0savvy 12.0savvy | Leave a comment

相対パスを計算で求める

Posted on 6月 14, 2022 by Takaaki Naganoya

指定のPOSIX pathを元に相対パスを計算するAppleScriptです。

Unix shellであれば、相対パスについては「../../../」などと表現できるわけですが、シェルを介さずに計算する方法が見つからなかったので、必要に迫られて作っておきました。

AppleScript名:上位パスを相対的に求める.scptd
—
–  Created by: Takaaki Naganoya
–  Created on: 2022/06/14
—
–  Copyright © 2022 Piyomaru Software, All Rights Reserved
—

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

set aFile to "/Users/me/Documents/1/2/3"

set aNum to 1
set bFile to getUpperDir(aFile, aNum) of me

–> "/Users/me/Documents/1/2"

set aNum to 2
set cFile to getUpperDir(aFile, aNum) of me
–>"/Users/me/Documents/1"

set aNum to 3
set dFile to getUpperDir(aFile, aNum) of me
–> "/Users/me/Documents"

–与えられたパスから指定階層「上」のパスを求める
on getUpperDir(aPOSIXpath as string, aNum as integer)
  if aNum < 1 then return aPOSIXpath
  
set pathString to current application’s NSString’s stringWithString:aPOSIXpath
  
repeat aNum times
    set pathString to pathString’s stringByDeletingLastPathComponent()
  end repeat
  
return pathString as string
end getUpperDir

★Click Here to Open This Script 

AppleScript名:下位パスを配列で追加して求める.scptd
—
–  Created by: Takaaki Naganoya
–  Created on: 2022/06/14
—
–  Copyright © 2022 Piyomaru Software, All Rights Reserved
—

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

set aPOSIXpath to "/Users/me/Documents/" –AppleScriptのPOSIX path表現(フォルダを表現するさい、末尾に「/」)
set catDirList to {"1", "2", "3"}
set bPath to getChildPathByAppendingDirsByArray(aPOSIXpath, catDirList) of me
–> /Users/me/Documents/1/2/3

set aPOSIXpath to "/Users/me/Documents" –CocoaのPOSIX path表現(フォルダを表現する場合でも、末尾に「/」入らず)
set catDirList to {"3", "2", "1"}
set cPath to getChildPathByAppendingDirsByArray(aPOSIXpath, catDirList) of me
–> "/Users/me/Documents/3/2/1"

on getChildPathByAppendingDirsByArray(aPOSIXpath, catDirList)
  set pathString to current application’s NSString’s stringWithString:aPOSIXpath
  
set aList to (pathString’s pathComponents()) as list
  
set aList to aList & catDirList
  
  
set bPath to current application’s NSString’s pathWithComponents:aList
  
return bPath as string
end getChildPathByAppendingDirsByArray

★Click Here to Open This Script 

Posted in File path list Text | Tagged 10.13savvy 10.14savvy 10.15savvy 11.0savvy 12.0savvy | Leave a comment

新発売:AppleScript基礎テクニック集(15)フォルダアクション

Posted on 6月 13, 2022 by Takaaki Naganoya

電子書籍の新刊を発売しました。新シリーズ「AppleScript基礎テクニック集」の第15巻、「フォルダアクション」です。PDF 33ページ、サンプルAppleScriptのZipアーカイブを添付。

→ 販売ページ

フォルダアクションは、任意のフォルダにAppleScriptを添付して、ユーザーがファイルを入れたり削除したり、フォルダをオープンしたりクローズすると指定のAppleScriptが実行されます。

実際には、共有フォルダに対してフォルダアクションを設定、多くのユーザーが所定のファイルをフォルダに入れることで、提出処理を簡略化したり、時間のかかる処理を集約してサーバー機で行わせる、所定の処理を確実に所定のパラメータや手順で行わせるといったシステムが使われてきました。

本書では、Macの便利で強力な機能である本フォルダアクションについて、ローカルのMac上に設定する方法について、基礎的な内容をご説明しています。

目次:

■フォルダアクションの歴史と仕組み

フォルダアクションとは?
フォルダアクション運用例
Classic Mac OS時代から続く伝統の機能
フォルダアクション関連ツール、ファイル
フォルダアクションScript中で利用可能な技術

■フォルダアクションの設定方法

フォルダアクション設定の使い方①
フォルダアクション設定の使い方②
フォルダアクション設定の注意点①
フォルダアクション設定の注意点②

■フォルダアクション自体のAppleScriptからの操作

Script側から行えるフォルダアクション操作①
Script側から行えるフォルダアクション操作②
Script側から行えるフォルダアクション操作③
Script側から行えるフォルダアクション操作④

■フォルダアクションの種類と書き方

イベントハンドラのパラメータ内容①
イベントハンドラのパラメータ内容②
実例1:入ってきたフォルダ中のPDFを大きさで分類①
実例1:入ってきたフォルダ中のPDFを大きさで分類②
実例1:入ってきたフォルダ中のPDFを大きさで分類③
実例2:指定フォルダのウィンドウ操作を受信

Posted in Books news | Tagged 10.14savvy 10.15savvy 11.0savvy 12.0savvy | Leave a comment

新発売:AppleScript基礎テクニック集(14)ファイルサーバーのマウント

Posted on 6月 6, 2022 by Takaaki Naganoya

電子書籍の新刊を発売しました。新シリーズ「AppleScript基礎テクニック集」の第14巻、「ファイル処理」です。PDF 32ページ、サンプルAppleScriptのZipアーカイブを添付。

→ 販売ページ

サーバー上の任意のマウント対象フォルダの情報を確認する方法がそっけなくて(地味で)、知らないと手も足も出ないという状況でもあります。

サーバー上の特定のフォルダをドライブとしてマウントする、という些細な処理ではあるものの、知っておくべき要点が多いのでまとめてみました。

続刊として予定しているeppc(リモートAppleEvent)について、このファイルサーバーのマウントの延長線上にあるため、eppcを使いたい人にはマスターしておくべきテーマといえるでしょう。

目次:

■macOSのファイル共有の仕組み

ファイル・サーバーとクライアントの関係
macOSのバージョンとファイル共有機能の変化
資料:ファイル共有プロトコルの歴史
共有する側(サーバー)の共有設定
共有する側(サーバー)の共有設定
共有URLの確認①
共有URLの確認②
共有URLの確認③

■サーバー・マシン名の確認

サーバー名の確認
サーバーURLの表記方法

■LAN上のサーバーの存在確認

LAN内のサーバー・プロトコル
指定プロトコルのサーバー一覧の取得①
指定プロトコルのサーバー一覧の取得②
指定プロトコルのサーバー一覧の取得③
指定プロトコルのサーバー一覧の取得④

■AppleScriptのmount volumeコマンド

mount volumeコマンド
指定のサーバー/フォルダをマウント
ファイルサーバーちょっといいノウハウ

Posted in Books news | Tagged 10.14savvy 10.15savvy 11.0savvy 12.0savvy | Leave a comment

Keynote書類中のスライドのトビラページを推測する

Posted on 6月 5, 2022 by Takaaki Naganoya

Keynote書類中の各スライド(ページ)のベースレイアウト(テンプレート)の名称から、トビラのページを推測するAppleScriptです。

まずは、なんでトビラのページを特定する必要があるのかといえば、TOC(Table Of Contents)つきでPDFに書き出す際に必要だからです。

トビラのページとは、

こういうものです。記事の開始ページに入っており、記事と記事の区切りをわかりやすくするために入れるものです。

そして、TOCはこういうものです。

目下、このTOCにおける階層をベースレイアウト名から推測するロジックをAppleScriptで組んでいますが、ざっくり言って「ベースレイアウト名」から推測している状態です。

もともと、Keynote書類からAppleScriptで各スライドの階層(Level)を取得できるとか、そもそもKeynote自体にTOCつきPDFを書き出す機能がついていれば、外部からScriptで操作しなくても済むわけですが、バージョンアップを繰り返してもそんな便利な機能がつく気配すらありません。Appleに機能追加のリクエストを出して、それが実装されるまで気長に待つよりも、今日すぐにでもScriptから実装したほうがよほど建設的です。また余計なことをされて機能不全を起こされても迷惑ですし。

なので、非常に遠回りな方法ではあるものの、ベースレイアウト(テンプレート)の名称からレベルを推測せざるを得ないというのが現状です。

ただ、これにも限界があります。「だいたい扉のページにはこのベースレイアウト(テンプレート)を使うよね」という「お約束」をベースに、処理を組み立てることになります。

扉のページにつかいがちなベースレイアウト(テンプレート)をあらかじめリストアップしておいて、該当するものを一律に「扉」とみなしてもいいはずです。

ただ、これもいまひとつ信用できないので、もう1手間かけておきたいところです。

Keynote書類のすべてのスライドからベースレイアウト(テンプレート)名を取得し、出現頻度やスライドの傾向から扉ページを特定したいところでもあります。

まずは、ベースレイアウト名一覧を取得し、ユニーク化(重複削除)。それぞれのベースレイアウト名でループして、書類中における出現頻度を求めます。

出現頻度については、1回ということはないでしょうし(規模によってはあるかもしれない)、全ページが該当するものでもないでしょう。また、表紙(最初のページ)、裏表紙(最後のページ)も異なります。

さらに、扉ページについていえば、ページ内に存在する文字アイテム(text item)が少ないことが期待されます。少なくとも自分が作るようなコンテンツではそうした傾向があります。

とりあえず、AppleScriptでKeynote書類からさまざまな情報を取得し、統計的なデータを取得(ページ上に存在するtext item数の標準偏差)するなどして、全体的な傾向を把握して検討するところでしょう。

あまりやりたくはないものの、完全な一括処理(ユーザーにどれが扉ページかを問い合わせない)を行うのではなく、ユーザー(自分)に扉ページのベーススライド名を確認する処理を追加することになるでしょうか。

--> {{baseLayoutName:"タイトルのみ", itemNumList:{10, 3, 3, 7, 14, 16, 10, 8, 6, 17, 9, 11, 16, 17, 11, 3, 3, 3, 15, 7, 16, 7, 3, 8, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 12, 12, 10, 3, 3, 3, 13}, stdDev:4.939129779062}, {baseLayoutName:"タイトル(上)広告用", itemNumList:{56, 22}, stdDev:17.0}, {baseLayoutName:"セクション", itemNumList:{4, 3, 2, 2, 2, 2, 2}, stdDev:0.728431359085}}
AppleScript名:各ベースレイアウト出現頻度およびレイアウト上のアイテム数の分布から扉を推測するテスト.scptd
—
–  Created by: Takaaki Naganoya
–  Created on: 2022/06/04
—
–  Copyright © 2022 Piyomaru Software, All Rights Reserved
—

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

property NSExpression : a reference to current application’s NSExpression
property NSMutableArray : a reference to current application’s NSMutableArray

tell application "Keynote"
  tell front document
    set themeNames to name of base layout of every slide
    
set themeList to items 2 thru -2 of themeNames
    
–> {"タイトルのみ", "タイトル(上)_飾りなし", "タイトル(上)広告用", "タイトル(上)広告用", "セクション", "タイトルのみ", "タイトルのみ", "セクション", "タイトルのみ", "タイトルのみ", "セクション", "タイトルのみ", "タイトルのみ", "タイトルのみ", "タイトルのみ", "セクション", "タイトルのみ", "タイトルのみ", "タイトルのみ", "タイトルのみ", "タイトルのみ", "タイトルのみ", "タイトルのみ", "タイトルのみ", "タイトルのみ", "タイトルのみ", "セクション", "タイトルのみ", "タイトルのみ", "タイトルのみ", "タイトルのみ", "タイトルのみ", "タイトルのみ", "タイトルのみ", "タイトルのみ", "タイトルのみ", "タイトルのみ", "タイトルのみ", "タイトルのみ", "タイトルのみ", "セクション", "タイトルのみ", "タイトルのみ", "タイトルのみ", "タイトルのみ", "タイトルのみ", "セクション", "タイトルのみ", "タイトルのみ", "タイトルのみ", "タイトルのみ"}
    
    
set uniList to uniquify1DList(themeList) of me
    
–> {"タイトルのみ", "タイトル(上)_飾りなし", "タイトル(上)広告用", "セクション"}
    
    
set tobiraKouhoList to {}
    
    
repeat with i in uniList
      set j to contents of i
      
set tmpSList to (every slide whose name of base layout is equal to j)
      
      
if length of tmpSList ≥ 2 then
        set tRatioList to {}
        
        
repeat with ii in tmpSList
          set jj to contents of ii
          
tell jj
            set aList to (every iWork item)
            
set the end of tRatioList to length of aList
          end tell
        end repeat
        
set d1Res to calcStddev(tRatioList) of me
        
set the end of tobiraKouhoList to {baseLayoutName:j, itemNumList:tRatioList, stdDev:d1Res}
      end if
      
    end repeat
    
    
return tobiraKouhoList
    
–> {{baseLayoutName:"タイトルのみ", itemNumList:{10, 3, 3, 7, 14, 16, 10, 8, 6, 17, 9, 11, 16, 17, 11, 3, 3, 3, 15, 7, 16, 7, 3, 8, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 12, 12, 10, 3, 3, 3, 13}, stdDev:4.939129779062}, {baseLayoutName:"タイトル(上)広告用", itemNumList:{56, 22}, stdDev:17.0}, {baseLayoutName:"セクション", itemNumList:{4, 3, 2, 2, 2, 2, 2}, stdDev:0.728431359085}}
  end tell
end tell

–標準偏差を計算する
on calcStddev(aList)
  –https://nshipster.com/nsexpression/
  
set anArray to NSMutableArray’s arrayWithArray:aList
  
set anExp to NSExpression’s expressionForFunction:"stddev:" arguments:{(NSExpression’s expressionForConstantValue:anArray)}
  
set valList to anExp’s expressionValueWithObject:(missing value) context:(missing value)
  
return valList as real
end calcStddev

on uniquify1DList(theList as list)
  set theSet to current application’s NSOrderedSet’s orderedSetWithArray:theList
  
return (theSet’s array()) as list
end uniquify1DList

★Click Here to Open This Script 

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

DTKeychainのじっけん

Posted on 6月 2, 2022 by Takaaki Naganoya

オープンソースのFramework「DTKeychain」をUniversal Binaryビルドして、Script Debugger環境からこれをAppleScriptで呼び出すテストを行なったものです。

–> Download DTKeychain.framework (To ~/Library/Frameworks)

macOS 10.7でKeychain Scriptingが廃止されて以来、shell commandの「security」や、さまざまなCocoa Frameworkを呼び出すようにScript側の対応が迫られてきたわけですが、割とKeychain関連のFrameworkは入れ替わりが激しいジャンルです。

SSKeychain –> SAMKeychain

ときて、いまmacOS用のKeychain系のFrameworkとして個人的に注目しているのが、

DTKeychain

です。SAMKeychainでひととおりのKeychainの機能を持っていたので、まだ機能が少ないDTKeychainは完全に代わりになってはいないのですが、SAMKeychainで様子を見つつDTKeychainの機能の充実に期待といったところでしょうか。

# DTKeychainもそんなに新しくないプロジェクトではあるものの、SAMKeychainの作者に問い合わせたところ「SAMKeychainはもうメンテしていないので他人に推奨しないでくれ(意訳)」と言われています

AppleScript名:DTKeychainのじっけん 1.scptd
—
–  Created by: Takaaki Naganoya
–  Created on: 2022/05/31
—
–  Copyright © 2022 Piyomaru Software, All Rights Reserved
—

use AppleScript version "2.4" — Yosemite (10.10) or later
use framework "Foundation"
use scripting additions
use framework "DTKeychain" –https://github.com/Cocoanetics/DTKeychain

— get shared instance
set keychain to current application’s DTKeychain’s sharedInstance()

— create a keychain query for generic passwords
set query to current application’s DTKeychainGenericPassword’s keychainItemQueryForService:"foo" account:(missing value)
–> {class:"genp", svce:"foo"}

— retrieve matching keychain items
set {itemList, errorRes} to keychain’s keychainItemsMatchingQuery:query |error|:(reference)
–> {{}, missing value}

if itemList as list is not equal to {} then
  log errorRes’s localizedDescription()
end if

★Click Here to Open This Script 

AppleScript名:DTKeychainのじっけん 2.scptd
—
–  Created by: Takaaki Naganoya
–  Created on: 2022/05/31
—
–  Copyright © 2022 Piyomaru Software, All Rights Reserved
—

use AppleScript version "2.4" — Yosemite (10.10) or later
use framework "Foundation"
use scripting additions
use framework "DTKeychain" –https://github.com/Cocoanetics/DTKeychain

— get shared instance
set keychain to current application’s DTKeychain’s sharedInstance()

— just create a new instance of the generic password and set values
set pass to current application’s DTKeychainGenericPassword’s new()

pass’s setAccount:"bar"
pass’s setService:"foo"
pass’s setPassword:"PIYOMARU"

— write the new object to the keychain
set kRes to keychain’s writeKeychainItem:pass |error|:(missing value)
–> true

★Click Here to Open This Script 

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

新発売:AppleScript基礎テクニック集(13)ファイル処理

Posted on 6月 1, 2022 by Takaaki Naganoya

電子書籍の新刊を発売しました。新シリーズ「AppleScript基礎テクニック集」の第13巻、「ファイル処理」です。PDF 33ページ、サンプルAppleScriptのZipアーカイブを添付。

→ 販売ページ

AppleScriptによるファイル処理は、MacBook AirからはじまったSSD標準採用、macOS 10.10以降のCocoa Scriptingの標準化、高速なApple Siliconへの移行なども相まって、非常に高速なものとなってきました。とくに、NSFileManager経由で処理をしたときの速度がすさまじく高速です。最新のOS、最新のマシンの組み合わせで必携の一冊!

目次:

最近のmacOSのファイル処理事情

AppleScriptのファイル処理には3通り
フルディスクアクセスの設定を
64ビット化されてFinderは遅くなった
どこで差がつく? ファイル処理
複数の条件をつけてFinderでファイル取得

条件抽出

ファイル情報の抽出
Finderラベルによる抽出

リネーム(名称変更)

ファイルの名称変更=リネーム
フォルダの名称変更=リネーム

コピー(複製)

ファイルのコピー
フォルダのコピー

移動

ファイルの移動
フォルダの移動

削除

ゴミ箱への移動を行うだけの「ファイル削除」
ファイルの完全削除
ゴミ箱への移動を行うだけの「フォルダ削除」
フォルダの完全削除

Posted in Books news | Tagged 10.14savvy 10.15savvy 11.0savvy 12.0savvy | Leave a comment

人類史上初、魔導書の観点から書かれたAppleScript入門書「7つの宝珠」シリーズ開始?!

Posted on 5月 30, 2022 by Takaaki Naganoya

いつものようにコードレス糸電話(FaceTime Audio)で企画会議を行なっていたら、「プログラミングを魔導書の形式で書くことが可能なのではないか?」というアイデアが登場。その場でアイデアスケッチを行い、あれよあれよという間に、実物ができてしまいました。

→ 販売ページ

ノリと勢いだけで作ってしまった1冊ですが、ビジュアル要素多めでまとめられました。ただ、宗教的なアレとかナニとかを完全に無視して作ったものなので、日本国内でしか流通させないほうがよいでしょう。

本書は、プログラミングという魔法について、「魔導書」の観点から記した人類最初の書物である。

難解なプログラミングを、なじみ深い魔導書の観点から説明すると親しみやすくなるのだろうか、という1つの魔術モルモット実験でもある。

本書で扱う内容はごくごく簡単で基礎的な内容だが、このぐらいにしぼって解説すれば難しく見えないという7テーマ、七宝珠である。

「習うより慣れろ」ということわざがあるように、難解な魔術であっても苦手意識を持たずに「慣れる」ことは重要である。 本書をもってしても、真の魔道士を育成することは難しい。だが、「だいたいこんなかんじ」という感覚をつかむためには、このぐらいの分量に抑えることが肝要だろう。

PDF 31ページ

目次

■魔導書「7つの宝珠」

神(Computer)との対話を行う人の子の書
失われし魔法の7つの宝珠を求めて
変数と代入文という最初の宝珠
if文〜条件分岐という宝珠
繰り返しループ 体力を削らせない宝珠
配列変数 詠唱呪文の機能を高める宝珠
コメント文 失われた知恵の宝珠
ログ表示 簡単に変数の中身を確認する宝珠
終了 そこで呪文実行を止める宝珠

■第1の宝珠 変数と代入文

神の言葉から人の子の言葉への移行
巻物で満ち溢れる人の子の世
牛飼いを羊飼いに変える変数
変数に牛や羊を入れるのが「代入」
変数の中に何がある?

■最短詠唱呪文集

魔術入門〜最短詠唱呪文
警告音を鳴らす魔術「beep」
現在の日付を知る魔法「current date」
クリップボードの内容を調べる魔法
時間待ちを行う魔法「delay」
ゆうしゃ(=あなた)のステータス

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

Keynoteの現在の書類と同じ階層に没スライド入れを作成

Posted on 5月 29, 2022 by Takaaki Naganoya

Keynoteの最前面の書類(現在の書類)と同じ階層に没スライドを入れるゴミ箱用のスライドを、編集中の現在のスライドと同じサイズ(Normal/HD)で同じテーマで作成するAppleScriptです。

ふだん、Keynoteで作業をしているときに、不要になったスライド(ページ)を完全削除せず、別書類に移動させて復活させられるようにしているのですが、その作業が煩雑だったのでScriptで自動化したものです。

同階層にゴミ箱用のスライド書類が存在していたら、それをオープンします。存在していなければ、新規作成して指定ファイル名で保存….というところで、v12のバグに遭遇してしまったわけです。

AppleScript名:Keynoteの現在の書類と同じ階層に没スライド入れを作成.scpt
—
–  Created by: Takaaki Naganoya
–  Created on: 2022/05/29
—
–  Copyright © 2022 Piyomaru Software, All Rights Reserved
—

use AppleScript version "2.4"
use scripting additions
use framework "Foundation"

property newFileName : "没.key" —"trash.key"

tell application "Keynote"
  tell front document
    set dName to getCurThemeName() of me
    
set curFile to (file of it) as alias
    
set myHeight to height of it
    
set myWidth to width of it
  end tell
end tell

–書類の親フォルダを取得(POSIX path)
set parentFol to getParentFol(curFile) of me
set newKeynoteFile to parentFol & "/" & newFileName

–ファイルの存在確認
set exRes to chkFileExistence(newKeynoteFile) of me
if exRes = true then
  –すでに存在している場合はそれをオープン
  
set newKeynoteFileAlias to (POSIX file newKeynoteFile) as alias
  
tell application "Keynote"
    open newKeynoteFileAlias
  end tell
  
return
else
  –まだ存在していない場合、最前面の書類と同じテーマ、縦横比(SD、HD)の新規書類を作成する
  
set parentFolAlias to (POSIX file parentFol) as alias as string –POSIX path to HFS path string
  
set saveFilePathStr to (parentFolAlias as string) & newFileName
  
  
tell application "Keynote"
    set newDoc to make new document with properties {document theme:theme dName, width:myWidth, height:myHeight}
    
–save newDoc in file saveFilePathStr as Keynote–Keynote v12のバグに遭遇したため機能オフに
  end tell
end if

–ファイルの存在確認
on chkFileExistence(aFilePathStr)
  set fileManager to current application’s NSFileManager’s defaultManager()
  
set aRes to fileManager’s fileExistsAtPath:aFilePathStr
  
return aRes as boolean
end chkFileExistence

on getParentFol(anAlias)
  set aPath to POSIX path of anAlias
  
set pathString to current application’s NSString’s stringWithString:aPath
  
set newPath to pathString’s stringByDeletingLastPathComponent()
  
return newPath as string
end getParentFol

on getCurThemeName()
  tell application "Keynote"
    set dCount to count every document
    
if dCount = 0 then error "No Document"
    
    
tell front document
      set aTheme to document theme
      
set atThemeName to name of aTheme
    end tell
  end tell
end getCurThemeName

★Click Here to Open This Script 

Posted in File path | Tagged 10.15savvy 11.0savvy 12.0savvy Keynote | Leave a comment

Keynoteで選択中のスライドのすべての表のセル内文字色を黒にする

Posted on 5月 27, 2022 by Takaaki Naganoya

Keynote v12.0以降で、最前面の書類で選択中のスライド(複数可)にある表のすべての文字色を「黒」に変更するAppleScriptです。

–> Watch Demo Movie

Keynote v12.0で「selection」がまともに機能するようになったので、Keynote用Scriptの実用性がたいへんに高まっています。

# ファイル保存できないとかいうバグが一刻も早く治ることを希望しています。とくに、Pages!

もともと、複数ページにわたって掲載している「表」の中に赤字でマークした箇所があって、そのマークの意図とは別の赤字を入れたかったので、いったんすべて書式をリセットしたかったので書いたものです。

もうちょっと長いScriptを書かなければならないかと思っていたのですが、ことのほかシンプルに書けました。
もっとシンプルに書けるか(everyを使ってスライドごと指定するとか)も試してみたのですが、どうやらこのあたりが限界のようです。

Keynoteのselectionを活かしたScriptでいまいちばん活躍しているのは、Keynoteのテキストアイテム(text item)から内容を取得して、メモリ上でAppleScriptとしてコンパイルし、構文色分けを反映させたスタイル付きテキストを取得して、テキストアイテムに書式を反映させるものです。実に、Keynote上にテキストで書いておいたAppleScriptのリストを構文色分けを反映させた掲載リストに変換できるので便利です。

AppleScript名:Keynoteで選択中のスライドのすべての表のセル内文字色を黒にする.scpt
—
–  Created by: Takaaki Naganoya
–  Created on: 2022/05/27
—
–  Copyright © 2022 Piyomaru Software, All Rights Reserved
—

tell application "Keynote"
  set aVer to version
  
  
considering numeric strings
    if aVer < 12.0 then return –Keynote v12.0より以前のバージョンでは実行できない
  end considering
  
  
tell front document
    set aaSel to selection
    
set selClass to class of contents of first item of aaSel
    
if selClass is not equal to slide then return –選択中のオブジェクトがslide(ページ)でなければ処理終了
    
    
repeat with i in aaSel
      set j to contents of i
      
      
tell j
        –現在のスライド上のすべての表のすべてのセルの文字色を黒 {0, 0, 0}に
        
set text color of every cell of every table to {0, 0, 0}
      end tell
      
    end repeat
    
  end tell
  
end tell

★Click Here to Open This Script 

Posted in list Object control | Tagged 10.15savvy 11.0savvy 12.0savvy Keynote | Leave a comment

新発売:AppleScript基礎テクニック集(12)Unix shell commandの利用

Posted on 5月 26, 2022 by Takaaki Naganoya

電子書籍の新刊を発売しました。新シリーズ「AppleScript基礎テクニック集」の第12巻、「Unix shell commandの利用」です。PDF 34ページ、サンプルAppleScriptのZipアーカイブを添付。

→ 販売ページ

Unix shell commandの利用といったときに、「AppleScriptからdo shell scriptコマンドでshell commandを呼び出す」話と、「shell commandやshell scriptの中でAppleScriptで書いたプログラムを呼び出す」という、まったく価値観の異なる別の話が含まれています。

本書は、これらのまったく別な話に含まれている概念やノウハウを整理し、わかりやすく具体的にその方法や制限についてご紹介する本です。

目次

■Terminal環境とdo shell script環境の違い

shell scriptをAppleScriptと組み合わせるために
ターミナルに書類のパスを入力する方法
Terminalからプロセスの確認と終了を
Terminalとdo shell sciptの環境変数
Terminal.appをAppleScriptで操作できる①
Terminal.appをAppleScriptで操作できる②

AppleScriptからshell scriptを呼び出す

do shell scriptコマンド
パス形式変換
Terminal.app上と同じ環境変数を使用するには
参考資料:新規インストールしたユーザーの環境変数
パラメータの与え方について
do shell scriptコマンドちょっといいノウハウ
コマンドライン呼び出しプログラムをScriptに同梱

shell scriptからAppleScriptを呼び出す

AppleScript関連のshell command
shell scriptからAppleScriptを呼び出す方法①
shell scriptからAppleScriptを呼び出す方法②
パラメータ指定できるAppleScriptの書き方
AppleScriptライブラリを呼び出せる?
パイプで指定した内容を受信できる?
GUI Scriptingを利用できる?
ホームディレクトリ下のFrameworkを呼べる?

Posted in Books news | Tagged 10.14savvy 10.15savvy 11.0savvy 12.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つの書類モード切り替えに気がついた
  • macOS 13 TTS環境の変化について
  • 2023年に書いた価値あるAppleScript
  • Pixelmator Pro v3.6.4でAppleScriptからの操作時の挙動に違和感が
  • AdobeがInDesign v19.4からPOSIX pathを採用
  • 可変次元のベクトルに対応したコサイン類似度計算
  • Safariで「プロファイル」機能を使うとAppleScriptの処理に影響
  • Cocoa Scripting Course 続刊計画
  • NaturalLanguage.frameworkでNLEmbeddingの処理が可能な言語をチェック

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 (112) 15.0savvy (89) 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 (71) 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