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

タグ: 13.0savvy

CotEditorで2つの書類の行単位での差分検出

Posted on 3月 12, 2024 by Takaaki Naganoya

CotEditorで2つの書類をオープンしておき、行単位での差分を検出し、新規書類に結果を出力するAppleScriptです。

もともと、macOS搭載のFramework名一覧の差分を検出する資料を作成する必要があり、これを片付けるために作成しました。

本AppleScriptを実行すると……

のように、結果を出力します。それほど巨大なデータを想定して作ってはいないので、ほどほどの規模に抑えて利用してください。

AppleScript名:左右のドキュメントを比較.scpt
use AppleScript version "2.4"
use scripting additions
use framework "Foundation"

script spd
  property aList : {}
  
property bList : {}
end script

set (aList of spd) to {}
set (bList of spd) to {}

tell application "CotEditor"
  set dCount to count every document
  
if dCount is not equal to 2 then
    display notification "Error: This script needs only 2 documents"
    
return –Document number Error
  end if
  
  
tell window 1
    set w1Bounds to bounds
    
copy w1Bounds to {w1X1, w1Y1, w1X2, w1Y2}
    
set w1Doc to document of it
  end tell
  
  
tell window 2
    set w2Bounds to bounds
    
copy w2Bounds to {w2X1, w2Y1, w2X2, w2Y2}
    
set w2Doc to document of it
  end tell
  
  
if w1X1 > w2X1 then
    set {w1, w2} to {2, 1}
  else
    set {w1, w2} to {1, 2}
  end if
  
  
tell document w1 –左ウィンドウ
    set (aList of spd) to paragraphs of contents
  end tell
  
  
tell document w2 –右ウィンドウ
    set (bList of spd) to paragraphs of contents
  end tell
  
end tell

–ゴミ掃除
set (aList of spd) to cleanUp1DList((aList of spd), {"
"
}) of me

set (bList of spd) to cleanUp1DList((bList of spd), {"
"
}) of me

–差分計算
set (cList of spd) to getDiffBetweenLists((aList of spd), (bList of spd)) of me

–結果出力テキスト組み立て
set aRes to listToTextUsingDelim(addItems of (cList of spd), "")
set bRes to listToTextUsingDelim(minusItems of (cList of spd), "")

–結果の新規書類への出力
set d3 to makeNewCotEditorDoc("左→右で追加された項目" & return & return & aRes) of me
set d4 to makeNewCotEditorDoc("左→右で削除された項目" & return & return & bRes) of me

on getDiffBetweenLists(aArray as list, bArray as list)
  set allSet to current application’s NSMutableSet’s setWithArray:aArray
  
allSet’s addObjectsFromArray:bArray
  
  
–重複する要素のみ抜き出す
  
set duplicateSet to current application’s NSMutableSet’s setWithArray:aArray
  
duplicateSet’s intersectSet:(current application’s NSSet’s setWithArray:bArray)
  
  
–重複部分を削除する
  
allSet’s minusSet:duplicateSet
  
set resArray to (allSet’s allObjects()) as list
  
  
set aSet to current application’s NSMutableSet’s setWithArray:aArray
  
set bSet to current application’s NSMutableSet’s setWithArray:resArray
  
aSet’s intersectSet:bSet –積集合
  
set addRes to aSet’s allObjects() as list
  
  
set cSet to current application’s NSMutableSet’s setWithArray:bArray
  
cSet’s intersectSet:bSet –積集合
  
set minusRes to cSet’s allObjects() as list
  
  
return {addItems:minusRes, minusItems:addRes}
end getDiffBetweenLists

on cleanUp1DList(aList as list, cleanUpItems as list)
  set bList to {}
  
repeat with i in aList
    set j to contents of i
    
if j is not in cleanUpItems then
      set the end of bList to j
    end if
  end repeat
  
return bList
end cleanUp1DList

–デリミタ文字を指定してリストを文字列化
on listToTextUsingDelim(aList, aDelim)
  set curDelim to AppleScript’s text item delimiters
  
set AppleScript’s text item delimiters to aDelim
  
set outText to every text item of aList
  
set outText to outText as string
  
set AppleScript’s text item delimiters to curDelim
  
return outText
end listToTextUsingDelim

–指定テキストでCotEditorの新規書類を作成
on makeNewCotEditorDoc(aCon)
  tell application "CotEditor"
    activate
    
set newDoc to make new document
    
tell newDoc
      set contents to aCon
    end tell
  end tell
end makeNewCotEditorDoc

★Click Here to Open This Script 

Posted in diff list Text | Tagged 13.0savvy 14.0savvy CotEditor | Leave a comment

Pagesで、現在表示中のページから離れたページのオブジェクト情報を取得できない

Posted on 3月 10, 2024 by Takaaki Naganoya

Pagesのいつかのバージョンから現在表示中のページから離れたページのオブジェクト情報取得および操作ができなくなっていました。バージョン13.xではすでにそうなっていました。12.xからそうだったかもしれません。

2024/4/3追記:Pages v14.0で確認したところ、同じ挙動でした

1〜2ページを表示中に、3〜4ページのオブジェクト情報取得および操作は行えるものの、7〜8ページ以降のオブジェクト情報は取得できないという状況です。自分が確認したのはtableオブジェクトのposition情報。

25%の縮小表示を行った場合には、

問題なく、すべてのページのtable(ツメ)のpositionを取得できますが、

拡大表示すると……

7ページ以降のtableのpositionを取得できていません。

この現象は、全ページに対してツメ(Dictionary index)を付加して統一操作を行うAppleScriptにおいて問題になっていました。実際に、ファイル名に「章番号」を書いておくと、それをピックアップして、ツメの見た目を変更するというAppleScriptを作成して運用しています。このScriptは、ツメの塗りの状態を自動検知して当該章の塗り方を自動で反映するようになっています。

このような高機能Scriptを実用化したものの、最近になっておかしな挙動が確認されていました。

・現在表示中のページのオブジェクト操作は行える
・表示中から離れたページのオブジェクト操作/情報取得が行えない

なんじゃこら????

Pages書類のツメ操作で、いろいろ問題に。

そこで、実験のために表示ページを移動しながらオブジェクト情報を取得してみたら、問題なく情報取得できました。

Pagesには表示対象ページの変更機能はないので、GUI Scriptingで「次のページ」コマンドを強引に実行。あるいは、実行前にPagesの書類表示ズーム倍率を、25%に変更しておく……というほうが「楽」かもしれません。

これをバグとして報告すべきなのか、アプリケーションの挙動として「知っておくべき情報」なのかは判断できません。処理速度向上のための「改善」の結果としてこのような状況が生まれてしまったのかもしれないためです。

ただ、特定のページを表示状態にする機能がないのに、表示範囲外(現在の見開きから+2見開きを超える範囲)のオブジェクトの情報を取得できないのは、片手落ちの状態でしょう。

Posted in Object control | Tagged 13.0savvy 14.0savvy Pages | Leave a comment

Adobe AcrobatをAppleScriptから操作してPDF圧縮

Posted on 2月 23, 2024 by Takaaki Naganoya

Adobe Acrobatは、一応AppleScript用語辞書がついてはいるものの、ほぼ「使えないアプリ」「役に立たない用語辞書」の名をほしいままにしてきました。AppleScript界における「がっかり遺産」のような存在です。

登場以来、一番期待されるPDF本文テキスト抽出の用途にまったく役に立たない(文字化けした謎テキストを出力)うえに、TOCやBookmarkへのアクセスもさっぱりです。

Classic MacOS時代にAdobe AcrobatのAppleScript用語辞書への深い失望があって、そこからフリーの「Skim PDF Viewer」の登場とか、のちにCocoaを直接呼べるようになって、十分なPDFへのアクセスが行えるようになりました。もはや、「もっといいもの」がいろいろ存在しているため、PDFを操作したいとか情報を抽出したいという需要は別のものによって満たされている状態です。

いまや、Adobe AcrobatのAppleScript用語辞書の存在感は「歴史上、そんなものがあったと語りつがれさえもしない」という「Air」のようなレベルです。事実、それに見出せる価値は何もありません。

そうした歴史認識と前提となる話がありつつも、それでも1つだけAdobe Acrobatには価値ある機能が存在します。本当に1つだけ。

それが、PDFの圧縮機能です。

最近は、macOS上のQuartzFilterのPDF圧縮もまったく機能しておらず、逆に呼び出すとファイルサイズが大きくなるとかいう笑えない冗談みたいな状態。PDFの圧縮ソリューションについてはAdobe Acrobatないしはactobat.adobe.comのWebアプリぐらいしか、手軽に使えるものが存在していない状態です。

とはいうものの、Adobe AcrobatのPDF圧縮機能は、AppleScript用語辞書に呼び出し用のコマンド用語が用意されてはいません。強引にGUIを操作するしかないようです。

Adobe AcrobatのAppleScript用語辞書の中にも「execute」コマンドが用意されており、任意のメニュー項目を操作できるような雰囲気が漂っていますが、いくら指定しても操作できません。

というわけで、とても嫌ではあるもののGUI Scripting経由で機能にアクセス。ちなみに、こういう時のために用意しておいた「dynamicMenuClicker」ライブラリは、Adobe Acrobat向けにはうまく動作しません。アプリケーション名、プロセス名、表示プロセス名などでAdobe Acrobatは不具合を持つ「特異点」であるため、Acrobatを操作する場合にのみ別の対処ルーチンを組み込んでおく必要があることでしょう。

AppleScript名:GUI Scripting経由でオープン中のPDFのファイルサイズを縮小.scpt
tell application "Adobe Acrobat"
  tell front document
    set aCount to count every document
    
if aCount = 0 then return
  end tell
end tell

activate application "Adobe Acrobat"
tell application "System Events"
  tell process "Acrobat"
    –ファイル>その他の形式で保存>サイズが縮小されたPDF…
    
click menu item 1 of menu 1 of menu item 9 of menu 1 of menu bar item 3 of menu bar 1
    
    
delay 0.5
    
    
–ダイアログ上のボタン「OK」をクリック
    
tell window 1
      click button "OK"
    end tell
    
    
delay 0.5
    
    
–保存ダイアログ(名前を付けて保存)
    
tell window 1
      click button "保存" –Localized
      
      
delay 0.5
      
      
set sList to every sheet
      
      
if length of sList is not equal to 0 then
        tell sheet 1
          click button "置き換え" –Localized
        end tell
      end if
    end tell
    
    
  end tell
end tell

★Click Here to Open This Script 

下記Scriptは、動作しません。

AppleScript名:本来はこう書けば動くはずだったメニュー操作.scpt
use dynC : script "dynamicClicker"

set appName to "AdobeAcrobat" –Application Name
set aList to {"ファイル", "その他の形式で保存", "サイズが縮小されたPDF…"} –Localized Menu Titles

set aRes to clickSpecifiedMenuElement(appName, aList) of dynC

★Click Here to Open This Script 

Posted in Object control PDF | Tagged 13.0savvy Adobe Acrobat | Leave a comment

与えられた文字列の1D Listのすべての順列組み合わせパターン文字列を返す v3(ベンチマーク用)

Posted on 2月 18, 2024 by Takaaki Naganoya

Macの処理速度を測るのにちょうど手頃な内容のプログラムです。与えた配列要素の、順列組み合わせ計算を行います。

M2 MacBook Air@macOS 15.1の環境の実行結果は、

–> {{4, 0.004417896271}, {5, 0.009887933731}, {6, 0.063844919205}, {7, 0.450636982918}, {8, 3.521628022194}, {9, 31.777850985527}}

なので、ほとんどM1 Mac miniと変わりません(少し遅いぐらい)。

AppleScript名:与えられた文字列の1D Listのすべての順列組み合わせパターン文字列を返す v3_for benchmark.scptd
— 2014-10-06 Original By Nigel Garvey@macscripter.net
— 2019-06-19 Modified By Takaaki Naganoya
— 2024-02-18 Modified By Takaaki Naganoya
use AppleScript version "2.4"
use scripting additions
use framework "Foundation"

script spdPerm
  property permutations : missing value
  
property allRes : {}
end script

on run
  set allList to {{"A", "T", "G", "C"}, {"A", "T", "G", "C", "1"}, {"A", "T", "G", "C", "1", "2"}, {"A", "T", "G", "C", "1", "2", "3"}, {"A", "T", "G", "C", "1", "2", "3", "4"}, {"A", "T", "G", "C", "1", "2", "3", "4", "5"}}
  
  
repeat with i in allList
    set theList to contents of i
    
    
set a1Dat to current application’s NSDate’s timeIntervalSinceReferenceDate()
    
set aRes to permute(theList) of me
    
set b1Dat to current application’s NSDate’s timeIntervalSinceReferenceDate()
    
set c1Dat to (b1Dat – a1Dat)
    
set the end of (allRes of spdPerm) to {length of theList, c1Dat}
    
  end repeat
  
  
return (allRes of spdPerm)
  
— MacBook Pro 2012 Retina Core i7 2.6GHz@macOS 10.14.6 の実行結果
  
–> {{4, 0.01 }, {5, 0.010347008705}, {6, 0.05}, {7, 1.44}, {8, 11.54}, {9, 107.271}}
  
  
–M1 Mac mini@macOS 13.6.5 の実行結果
  
–> {{4, 0.005248069763}, {5, 0.01240503788}, {6, 0.063866019249}, {7, 0.434872984886}, {8, 3.519423961639}, {9, 31.62052500248}}
end run

on permute(theList as list)
  set theArray to current application’s NSMutableArray’s arrayWithArray:theList
  
set (permutations of spdPerm) to current application’s NSMutableArray’s array()
  
prmt(theArray, 0, (count theList) – 1)
  
  
–Return AppleScript string list
  
set aFinishArray to current application’s NSMutableArray’s new()
  
set anEnum to (permutations of spdPerm)’s objectEnumerator()
  
repeat
    set aValue to anEnum’s nextObject()
    
if aValue = missing value then exit repeat
    
set aStr to aValue’s componentsJoinedByString:""
    (
aFinishArray’s addObject:aStr)
  end repeat
  
  
return aFinishArray as list
end permute

on prmt(theArray, theStart as number, theEnd as number)
  if (theStart = theEnd) then
    (permutations of spdPerm)’s addObject:theArray
  else
    repeat with x from theStart to theEnd
      set theCopy to theArray’s mutableCopy()
      
–swap
      
if (x > theStart) then (theCopy’s exchangeObjectAtIndex:theStart withObjectAtIndex:x)
      
prmt(theCopy, theStart + 1, theEnd)
    end repeat
  end if
end prmt

★Click Here to Open This Script 

Posted in list | Tagged 13.0savvy 14.0savvy | Leave a comment

最前面の書類中の選択中のテキストアイテムの文字サイズを、特定サイズのみ対象にして置換 v3

Posted on 2月 18, 2024 by Takaaki Naganoya

Pages書類で選択中のtext item(Pagesでこれを識別するクラスがないのでshape)内のテキストに複数の文字サイズが存在している場合に、特定の文字サイズ部分のみ異なるものに置き換えるAppleScriptです。

–> Play demo movie

ただし、本Scriptで使用している自作のdisplay text fieldsライブラリを、本ScriptをmacOS標準搭載の「スクリプトメニュー」に入れた状態で呼び出すと、ダイアログ中への文字入力ができませんでした(macOS 13.6.5)。Pagesの書類の方に文字入力フォーカスが残ってしまっています。文字サイズをポップアップメニューからの選択方式にするなど、テキスト入力「以外」の方法に差し替えることで対処できることは判明しています。

このあたりのmacOS側の挙動に対して、「ナニコレ?」と違和感をおぼえつつも……スクリプトメニューに入れて呼び出す場合には対処するしかないのでしょう。細かい機能がAppleScriptランタイム環境ごとに「使える」「使えない」といった違いを生んでいるうえに、こうしたGUIの挙動についてもAppleScriptランタイム環境ごとに違っている点について、より細かい点をチェックする必要がありそうです(メーカー側がどんどん基礎的な部品の挙動を変更しては発表もしない状況)。


▲架空の本のPages書類のうち、処理対象のtext itemを選択状態にして実行


▲どのフォントサイズを置き換えるかをダイアログ選択。リサイズ後の数値を入力するとリサイズ。空欄のままにすると、リサイズしない

AppleScript名:最前面の書類中の選択中のテキストアイテムの文字サイズを、特定サイズのみ対象にして置換 v3.scptd
—
–  Created by: Takaaki Naganoya
–  Created on: 2024/02/16
—
–  Copyright © 2024 Piyomaru Software, All Rights Reserved
—

use AppleScript version "2.7" — macOS 10.13 or later
use framework "Foundation"
use scripting additions
use tfLib : script "display text fields"

tell application "Pages"
  tell front document
    set tmpList to selection
    
    
repeat with i in tmpList
      set j to contents of i
      
set tmpC to class of j
      
      
–選択中のアイテムがshape(text itemを指定したいが、PagesではこのClassは存在しない)の場合のみ処理
      
if tmpC is equal to shape then
        –最大サイズの文字のみ抽出
        
set cRes to (size of every character of object text of j)
        
set uRes to removeDuplicates(cRes) of me
        
        
set selection to {j}
        
        
–ダイアログ表示
        
set strList to stringfyListItems(uRes) of me
        
set blankList to makeBlankListByIndicatedItem(strList, "") of me
        
        
set dRes to confirm text fields main message "テキストアイテムの文字サイズ置換" sub message "置換しない場合には空欄のまま。サイズはポイント数で指定" key list strList value list blankList
        
if dRes = false then exit repeat
        
        
–文字サイズ置換
        
repeat with ii from 1 to (length of strList)
          set targSize to (contents of item ii of strList) as real —From Size
          
set repSize to contents of item ii of dRes –To Size
          
          
if repSize is not equal to "" then
            set repSizeNum to repSize as real
            
set size of (every character of object text of j whose size is targSize) to repSizeNum
          end if
        end repeat
        
      end if
    end repeat
  end tell
end tell

–指定リストの項目数によって、空白アイテムが入ったリストを返す
on makeBlankListByIndicatedItem(aList, blankItem)
  set newList to {}
  
set aLen to length of aList
  
  
repeat aLen times
    set the end of newList to blankItem
  end repeat
  
  
return newList
end makeBlankListByIndicatedItem

–リストの全項目をテキスト化
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

–リスト内の要素をすべてテキストに変換する
on stringfyListItems(a as list)
  set newL to {}
  
repeat with i in a
    set j to contents of i
    
set j to j as string
    
set the end of newL to j
  end repeat
  
  
return newL
end stringfyListItems

★Click Here to Open This Script 

Posted in Font Object control | Tagged 13.0savvy Pages | Leave a comment

macOS 13.6.5 AS系のバグ、一切直らず

Posted on 1月 30, 2024 by Takaaki Naganoya

macOS 13.6.5アップデート(13.6.5(22G605))が配信されましたが、AppleScript系のバグは直っていません。

Appleのエンジニアは、「会社から給料をもらって日々新しいバグを作るのが仕事」という状況です。新しい機能よりも、新しいバグの方が多いというのは、もはやメーカーではなくてクラッシャーと名乗るべきなのでは?

・スクリプトエディタ上のテンプレートから選択するCocoa-AppleScript Appletランタイムが動作しなくなった

Cocoa-AppleScript Appletランタイムが動かない?

・スクリプトエディタ上でscpt形式のAppleScript書類に書いた「説明」が白地に白文字で表示されて見えなくなる

スクリプトエディタで記入した「説明」欄の内容が消えるバグ

・日本語環境で、特定のTTSキャラクタ名(Bells、Hysterical、Organ、Princess、Trinoids、Whisper)が指定できない

macOS 13, Ventura(継続更新)

Posted in Bug Cocoa-AppleScript Applet news | Tagged 13.0savvy | Leave a comment

2023年に書いた価値あるAppleScript

Posted on 1月 29, 2024 by Takaaki Naganoya

2023年に使用していたmacOS:macOS 13

毎年行なっている、Piyomaru Softwareが書いたAppleScriptの1年を振り返る記事の2023年版です。10年ほど続けてきた旧「AppleScriptの穴」Blogが2018年の年初にホスティング会社との行き違いでシャットダウンされ、再構築したのがこの現行の「AppleScriptの穴」Blogです。

→ 2018年に書いた価値あるAppleScript
→ 2019年に書いた価値あるAppleScript
→ 2020年に書いた価値あるAppleScript
→ 2021年に書いた価値あるAppleScript
→ 2022年に書いた価値あるAppleScript

旧「AppleScriptの穴」Blogの内容については、データベースから抜き出したデータをもとに再構成した「Blogアーカイブ本」にまとめています。

AppleScriptの穴Blogアーカイブvol.1
AppleScriptの穴Blogアーカイブvol.2
AppleScriptの穴Blogアーカイブvol.3
AppleScriptの穴Blogアーカイブvol.4
AppleScriptの穴Blogアーカイブvol.5
AppleScriptの穴Blogアーカイブvol.6

本Blogは、機械翻訳で翻訳しやすいように、平易な日本語で記述してある点がチャームポイントです。それはもう、小学生の日記ぐらいの難易度で。もともとは、2000年代初頭に開発していた「人工知能インタフェース Newt On」のソースコード部品バラバラにして掲載し、用いた部品を個別にメンテナンスすることを「隠れた目的」としていました。また、Scripter間のノウハウの共有を推進することも目的としています。

AppleScript以外の一般的なテーマの記事については、こちらにいろいろ投稿しています。

https://note.com/140software/

2023年的な状況といいますか、昨今のMac環境をとりまく状況として新バージョンのmacOSとしてmacOS 14がありつつも、Appleがマイナーアップデートで新たなバグを盛り込んでくるため、macOS 14に付き合うこと自体がリスクです。β版で確認を行なっても、Release版で安定度が激下がりして、その後にバグ改修と新機能追加が行われるため、つねにどこかにド派手な不具合を抱えているという状況です。

2023年にはそれほど発表できるようなAppleScriptを書いていない(=自分の作業を効率化するものしか書いていないので外部に発表のしようがない)のと、それほど技術レベルや解決策のレベルが上がったような内容のものはありません。

さまざまな技術的な内容をまとめた記事については、電子書籍に掲載したり、付録Scriptとして添付しています。年間19冊出しています。

ポケコンサークル「LL」会誌Vol.19復刻版(282ページ)

AppleScript基礎テクニック集(29)セキュリティ機能解除(36ページ)

AppleScript+Xcodeで作るMacアプリ(484ページ)

ChatGPTにAppleScriptを書かせてみた!(76ページ)

AppleScript基礎テクニック(30)コンテクストメニューScriptの作り方(41ページ)

AppleScript基礎テクニック(30)コンテクストメニューScriptの作り方 英語版(41ページ)

AppleScript基礎テクニック(31)スクリプトバンドルの活用(34ページ)

AppleScript 7つの宝珠(3)(35ページ)

Cocoa Scripting Course #5 NSImage(473ページ)

ゆっくりAppleScript解説(1)(45ページ)

ゆっくりAppleScript解説(2)(45ページ)

つたわる資料のつくりかた(66ページ)

Keynote Scripting Book With AppleScript(434ページ)

Cocoa Scripting Course #6 PDFKit(560ページ)

ゆっくりAppleScript解説(3)(42ページ)

AppleScript最新リファレンス v2.8(1008ページ)

AppleScript最新リファレンス v2.8英語版(223ページ)

戦場の絆〜僕らの15年戦争〜v2(394ページ)

Piyomaru Software電子書籍カタログ 2024冬(100ページ)

2023年に書いた記事の中で注目すべきもの

2023年に書いたものは、例年どおりの「価値あるAppleScript」と言うほどのものではなく、「2023年に書いた記事の中で注目すべきもの」をリストアップするという程度の内容になりそうです。

geoCodingLibで住所ジオコーディング

geoCodingLibで逆住所ジオコーディング

住所ジオコーディング(住所→緯度経度情報)/逆住所ジオコーディング(緯度経度情報→住所)は、AppleScriptで普通に実行できてほしい処理のひとつです。こうしてObjective-C/Swiftで書いたプログラムをFrameworkとして呼び出せるようにして呼び出すとか、いろいろ方法があるわけで……少なくとも、ローカルで処理が完結する解決策は用意しておきたいところです。

ChatGPTでchatに対する応答文を取得

AppleScriptからのChatGPTのREST API呼び出しは、かなり早期からできていました。処理したい内容のScriptをChatGPTに書かせて実行するといった「なげやり」な方法であれば、こうしたScriptの延長線上で可能ですが、あらかじめきちんと動くことを保証したScriptのパラメータ部分だけをLLMから取得するとか、複数のScriptを組み合わせて処理を実行させるといった内容を実現する方法を見つけたいところです。

Keynote,Pages,Numbers v13.0がリリースされる

Keynoteはいいアプリケーションだと思うものの、あまりバージョンアップしても機能が追加されないというか、実際に使っている人間からのフィードバックがさっぱりないというか、ユーザーと開発現場の距離が離れてしまっている感じがします。

他形式の3DデータをUSDZデータに変換するあたりのツールが充実する必要があるというか、Keynote側の読み込み機能がもう少し強化されてもよさそうな気もします。

出るか?「AppleScript最新リファレンス」のバージョン2.8対応版

この本は、発行するのに30冊以上も本を出す必要があり、数年かけて計画を実行して、ようやくアップデートにこぎつけました。最初の「AppleScript最新リファレンス」から7年が経過していることに驚かされます。

Excelの書類上に置かれているpictureが置かれているセルのアドレスを推定する v2

Microsoft Excelは依然としてAppleScript用語辞書が大きなアプリケーションではあるのですが、Excelの機能が強力すぎる(表現力が豊かすぎる)ために、目的の処理を行うためにはなかなか一筋縄では行かないようです。

PowerPointを操作するAppleScriptをScript Menuに入れて実行すると動作が完結しない問題

PowerPointにかぎらず、Microsoft OfficeアプリのAppleScript用語辞書が、より詳細な記述を行なっているところに懸念をおぼえます。こんなに細かく書かないとダメなのだろうかと。敷居が高くなりすぎていないかと。あと、Script MenuにPowerPointを操作するAppleScriptを入れて実行すると動かないというのは、ランタイム環境が強く限定され、こんにちのmacOS環境の中で標準レベルといえるScript Menuで動かないのは、よくないと考えます。

Cocoa-AppleScript Appletランタイムが動かない?

macOS 12.xのマイナーバージョンアップ時に機能が損なわれた箇所です。そして、Appleにバグレポートしても治らない。こんな根本的な部分で不具合を起こされても困るのですが……。

macOS 14の変更がmacOS 13にも反映

「システム環境設定」が「システム設定」に変わったときに、各設定Paneを表示するためのAppleScript用語辞書が機能しない、空白の期間が発生していました。macOS 14βで本機能が復旧されたのと同じタイミングで、macOS 13.xにもさかのぼって同じ機能が実装されました。

ただ、システム設定の各Paneへの表示切り替えが行えるだけで、たとえばオーディオ入出力デバイスの切り替え機能が提供されているわけではないため、それについては別途実装したものを呼び出すという解決方法が必要になります。

Posted in news | Tagged 13.0savvy 14.0savvy | Leave a comment

アプリケーション操作の次の段階へ

Posted on 1月 28, 2024 by Takaaki Naganoya

GUIアプリケーションの操作において、若干の不満を覚えつつもmacOS上のGUIアプリケーションの操作を行えてきました。

ただ、「次」の段階が見えているのに、GUIアプリケーション側の機能がそれに追いついていなかったり、未実装の部分があったりで、GUIアプリケーション側が足を引っ張っているように見える今日このごろです。

たとえばKeynoteにおいて、特定のグラフィックだけを削除したい(会社ロゴなど)という場合に、メニューに「この部品に近似する部品を削除」といった機能が実装されていてもよさそうな昨今ですが、それはありません。「類似画像を削除」「類似部品を削除」といった処理はやりたくなる部分だと(勝手に)考えるものです。だいたい、OS内の機能を見ても容易に実装できそうに見えます。

Keynote書類にはimageオブジェクトが用意されており、さまざまなプロパティを取得できるようになっていますが、file nameは取得できても、

file属性を取得できない状態です。

AppleScript名:画像からfile属性を取得(できない).scpt
tell application "Keynote"
  tell front document
    set aSel to selection
    
set aaSel to first item of aSel
    
    
set aFile to file of aaSel
    
–> error "Keynoteでエラーが起きました: AppleEventのハンドラで誤りが起きました。" number -10000
  end tell
end tell

★Click Here to Open This Script 

iCloud上に存在するKeynote書類の内部ファイルに対してのパスを表現しづらい、といった理由は理解できるかもしれませんが、用語辞書にfile属性が取れると明記してある以上、file属性は(ローカルに書類が存在するなどの条件下では)取得できるべきだと考えます。

そして、file属性(おそらく、file pathをalias形式で取得できる)を取れれば、画像の「内容」にもアクセスして、「指定の画像に近似するものを削除」といった処理はできるはずです(画像のハッシュ値を計算する処理は別途する必要はあるわけですが)。

このあたりの処理が、そろそろできてもいいんですが、いろいろ邪魔が入ってできないのが残念な感じがします。

Posted in Image | Tagged 13.0savvy 14.0savvy Keynote | Leave a comment

スクリプトエディタで記入した「説明」欄の内容が消えるバグ

Posted on 1月 9, 2024 by Takaaki Naganoya

macOS 13.6.4+スクリプトエディタ バージョン2.11 (229)の組み合わせで、AppleScript書類の「説明」欄に記入した内容が「消える」トラブルが発生しています。macOS 14上でも発生していることを確認しました。


▲スクリプトエディタ上で新規書類を作成して、AppleScript本文と「説明」欄の内容を書き込んでみた


▲スクリプトエディタで名称を指定して保存(.scpt形式)した状態


▲保存していったんクローズして、再度オープンしてみたところ。「説明」欄の内容が見えない


▲「説明」欄の内容を選択したところ。白い色の文字が存在していることがわかる

「消える」というよりは、「見えなくなる」というのが正しい状況と思われますが、macOSのマイナーアップデートでこうした変更が加わる(正確にいえば、APIなどの変更が行われた一方で、スクリプトエディタの修正が行われずに動作がおかしくなる)というのは納得できません。

なお、バンドル形式のAppleScript(.scptd形式)であれば、「説明」欄の内容が白く表示されることはないようです。

Posted in Bug | Tagged 13.0savvy 14.0savvy Script Editor | 1 Comment

可変次元のベクトルに対応したコサイン類似度計算

Posted on 11月 23, 2023 by Takaaki Naganoya

ChatGPTに書かせたAppleScriptを微修正したものです。ベクトルの内積、外積の計算を経てコサイン類似度計算のAppleScriptを書かせました。

もともとは、ChatGPTのAPIを利用して自然言語テキストをベクトル化し、それらの類似度を計算させるための準備で用意しました。自分が試したときには、ChatGPTのREST APIは1536次元のベクトルを返してきました。残念ながら、いま試してみると(全然REST API呼び出しをしていないのに)Quota Exceedのエラーが出てしまって目的の処理はできませんでした。

このあたり、実際にChatGPTのコンソールから利用履歴を確認してみても、全然呼び出していないことが確認できたので、自分の記憶違いではありません。

もともと、日本語テキストを複数の機械翻訳APIを利用して英訳し、再度日本語訳したのちに文章をベクトル化。これらの複数の機械翻訳APIの結果を比較して、もともとの日本語の文章と類似度が高いものを「正確に英訳された文章」として採用してみるといいんじゃないかと思っていました。翻訳文の質を疑似的に評価してみようと思ったわけです。

ChatGPTに出力させたAppleScriptは、「間違ってはいないんだけど、正しくないし、微妙にムカつく(resultを使って計算したりする)」内容で、よくわかっている人間にとっては簡単に修正できるものですが、基礎がわかっていないとどこが間違っているか指摘しにくいし、そもそも間違っているかどうかも指摘しにくいので……より正確な知識が要求されます。

AppleScript名:可変次元のベクトルに対応したコサイン類似度計算.scpt
— ベクトルの例
set vectorA to {1, 2, 3, 4}
set vectorB to {4, 5, 6, 7}

— コサイン類似度を計算
set similarityResult to cosineSimilarity(vectorA, vectorB)

— 結果を表示
return similarityResult
–> 0.975900072949

— ベクトルのノルムを計算する関数
on vectorNorm(aVec)
  set sumSquares to 0
  
repeat with i from 1 to (count of aVec)
    set sumSquares to sumSquares + (item i of aVec) ^ 2
  end repeat
  
return (sumSquares) ^ 0.5
end vectorNorm

— ベクトルのコサイン類似度を計算する関数
on cosineSimilarity(vector1, vector2)
  set dimension1 to count of vector1
  
set dimension2 to count of vector2
  
  
if dimension1 = dimension2 then
    set dotProductResult to dotProduct(vector1, vector2)
    
set norm1 to vectorNorm(vector1)
    
set norm2 to vectorNorm(vector2)
    
set similarity to dotProductResult / (norm1 * norm2)
    
return similarity
  else
    error "ベクトルの次元数が一致していません。"
  end if
end cosineSimilarity

— ベクトルの内積を計算する関数
on dotProduct(vector1, vector2)
  set dimension1 to count of vector1
  
set dimension2 to count of vector2
  
  
if dimension1 = dimension2 then
    set sRes to 0
    
repeat with i from 1 to dimension1
      set sRes to sRes + ((item i of vector1) * (item i of vector2))
    end repeat
    
return sRes
  else
    error "ベクトルの次元数が一致していません。"
  end if
end dotProduct

★Click Here to Open This Script 

Posted in list Natural Language Processing | Tagged 13.0savvy 14.0savvy | Leave a comment

macOS 13 TTS環境の変化について

Posted on 11月 22, 2023 by Takaaki Naganoya

正確にいえばmacOS 12あたりから大幅に変わっていて、忙しさにかまけて詳細な調査は行なってこなかったのですが……必要に迫られていろいろ調べてみました(Piyomaru Context Menu Assistant関連で)。

変更点1:TTS Voiceから年齢(Age)という属性値が削除された

変更点2:TTS Voiceの名前(Name)という属性値がローカライズされて返るようになった

変更点3:AppleScriptのsayコマンドにTTS Voiceの名前(Name)を設定するとエラーになるものが多数出てきた

変更点4:TTS Voice低音質キャラクタと高音質キャラクタ(Premium、Enhanced)があった場合に、AppleScriptのsayコマンドで低音質キャラクタが指定されるようになった。高音質キャラクタ(Premium、Enhanced)を明示的に指定する方法はない(sayコマンドでは不可能。AVSpeechSynthesizerを呼び出して読み上げるのは可能)

変更点5:AppleScriptのsayコマンドでSiriボイスを指定できないが、システムのデフォルト読み上げ設定にSiri音声を指定していると、sayコマンドでTTSボイス無指定(システムのデフォルト設定ボイスを使用)でSiri音声で読み上げられる

変更点1は、ポリコレの一環なんでしょうか。別に機械音声なので「年齢を基準に処理するな」とかいう不満は誰も抱かないと思います。これを決定した責任者は、頭がおかしいです。

変更点2は、NameのほかにLocalizedNameとかいった属性値を持たせるべきだったんじゃないでしょうか。経験の足りないエンジニアがとりあえずやっつけで仕事をしてしまったように見えます。これを決めた責任者は頭がおかしいです。バカと言って差し支えないでしょう。

変更点3は、けっこう困ります。AppleScriptのデフォルトコマンドには、TTS Voiceキャラクタ名の一覧を取得する、といった命令が存在せず、なんとなく「システム環境設定に出てくる名前を指定して使ってね」といった無責任な状況になっていました。昔からあるTTS VoiceのうちBells、Hysterical、Organ、Princess、Trinoids、Whisperを指定してもエラーになります(OS内に存在しているのに)。これは、OSの内部が壊れているものと判断しています。いい加減にしてほしいです。

変更点4は、Apple社内がえらく混乱しているように見えます。ちゃんと状況を整理していないような、開発現場のカオスな状況しか感じません。エンジニアの人数はさほど増やしていないのに、OSの数を野放図に増やしすぎです。これは、そういう管理をしている管理職の頭がおかしいです。

変更点5は、おそらくApple側が意図していない動作だと思われますが、「いまだとsayコマンドでAppleScriptからSiriの音声が指定し放題」であるということです。sayコマンドでは音声の指定を行わないと、OSデフォルトの音声キャラクタが指定されます。このデフォルト音声をSiriの音声にしておいて、キャラクタ無指定でsayコマンドを実行すると、Siriの音声キャラクタで発声が行われます。

sayコマンドで指定できるということは、音声ファイルにレンダリング可能だということで、Appleがキャラクタ提供元とそういうライセンス契約をしているのであればよいのですが、バグによって意図しない使われ方をしてしまう可能性があるわけです。ただ、このような状況を作った責任はAppleにあるものであって、ユーザーにはありません。

–> Play TTS by Siri demo

追跡調査を行なってみたところ、shell commandの/usr/bin/sayは、これらの、AppleScriptのsayコマンドではエラーになるText To Speechキャラクタ「Bells」も問題なく指定できました。

Posted in Bug Text to Speech | Tagged 13.0savvy | Leave a comment

日付変更通知

Posted on 11月 12, 2023 by Takaaki Naganoya

日付の変更を通知するAppleScriptです。

この手のScriptを組もうとしたら、一定間隔で日付(current date)を確認する ぐらいが安全な方法として考えられます。on idleハンドラを利用して、一定間隔でタイマ割り込みを利用するのが「定番」でしょう。ただ、そのためにはApplet形式で書き出して実行する必要があります。

最近のAppleScript実行環境は、ごく一部の例外をのぞいてCocoaの機能を呼び出せるので、Cocoaの機能でタイマー割り込みを行って、一定間隔で日付データを確認することもできます。こちらは、。一度実行すればメモリ上にオブジェクトが常駐するので、Script Editorの実行が停止していても、起動さえしていれば日付変更時に通知を受信できます。

タイマー割り込み以外の方法を調べてみたら、こんなSystem Notificationが利用できたので、まとめておきました。

本Scriptが機能するのは、「AppleScript最新リファレンス v2.8対応」で明記した「システム通知の受信が有効なAppleScript実行環境」のみです。

AppleScript名:日付変更通知.scptd
—
–  Created by: Takaaki Naganoya
–  Created on: 2023/11/12
—
–  Copyright © 2023 Piyomaru Software, All Rights Reserved
—

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

set dOvs to current application’s NSNotificationCenter’s defaultCenter()
dOvs’s addObserver:me selector:"dateChanged:" |name|:(current application’s NSCalendarDayChangedNotification) object:(missing value)

on dateChanged:anObj
  display dialog "Update"
end dateChanged:

★Click Here to Open This Script 

Posted in Noification | Tagged 12.0savvy 13.0savvy 14.0savvy | Leave a comment

macOS 13.xでAS処理系に変更。組み込み実行環境でもライブラリ呼び出しをサポート?

Posted on 11月 8, 2023 by Takaaki Naganoya

macOS 13.xで、アプリケーション組み込み型のAppleScript実行環境(内蔵Script Menu装備)において、ホームディレクトリ下のAppleScriptライブラリを読み込んで実行することが「できなかった」ものを、「できる」ように改修されたようです。

実際に確認を行ったのは、macOS 13.xとCotEditorの組み合わせにおいてです。macOS 13の早期バージョンにおいてはライブラリ呼び出しが行えなかったものが、macOS 13.6.2においては呼び出せるように変わっています。なお、CotEditor側ではAppleScript実行機能まわりに改修を行なっていないことを確認しています。

CotEditorのAppleScript実行機能の実装はosascriptコマンドを呼び出すというものであり、手間をかけていない割に.scpt形式も.scptd形式も実行できるため、「妥当な実装」といったところでしょう。

自分は、各AppleScriptランタイム環境においてAppleScriptライブラリの読み込みと実行が行えるかをチェックしており、現時点でこれが行えない環境は……

・Automatorおよび書き出したアプレット(古すぎる。廃止予定)
・スクリプトエディタの内蔵コンテクストメニュー(セキュリティ的に無理そう)
・フォルダアクション(セキュリティ的に無理そう)
・Switch Control(パレットごと配布することを考えると、やらないほうが安心?)
・FileMaker Pro(構造が違いすぎて対応が難しい?)
・Hammerspoon(applescriptFromFile)(できてもおかしくないが……)

と認識しています。もしかしたら、Hammerspoonは再確認したら動くかもしれません。

なお、もっと巨大で深刻なバグ(AppleScriptドロップレットにドラッグ&ドロップしたファイルが正しく処理されない問題)はmacOS 10.12から相変わらず放置されています。

Posted in news | Tagged 13.0savvy 14.0savvy CotEditor | Leave a comment

指定のPages書類の言語設定を英語に

Posted on 11月 7, 2023 by Takaaki Naganoya

電子書籍「AppleScript The Latest Reference for v2.8」の翻訳作業を行うにあたって、同書を作成しているPagesを操作して、書類の言語設定を変更するAppleScriptを記述しました。なぜこれが必要になってくるかといえば、英単語のハイフネーション方式をネイティブの方式に合わせる必要があったためです。Pages自体のメニューなどのUIの表示は日本語のままで使い続けられる、というのがメリットでしょう。

本記事にScriptは掲載しておきますが、動作のためには同書に同梱しているライブラリ「dynamic Menu Clicker」が必要であり、ここではScriptの内容そのものは重要視していません。

一度作成して、テストデータで問題なく動作していたものの、数時間後に同じ書類に対して同じScriptを実行してみたら、エラー続出で動かなくなっていた、という怪奇現象が発生。この問題の解決に時間がかかりました。

このトラブルが発生した箇所はGUI Scriptingでウィンドウの上に表示されたシート、の上のポップアップボタンをクリックするという記述箇所です。

結論からいえば、Pages上で作業をしていたときにカラーピッカーのパレットを表示させたままにしたため、これがWindow 1とカウントされ、ドキュメントのウィンドウはWindow 2と認識されたため、問題が発生しました。

しかも、Pagesを後ろに持っていくとカラーピッカーのパレットは表示されなくなります。これで、何が原因なのかがわかりにくく、まさに怪奇現象のように振る舞いました。こんなのは久しぶりです。

結局、ウィンドウの名称をすべて取得して、カラーピッカーが表示されていたらドキュメント表示ウィンドウのインデックスを2にする、というやっつけで対処することになりました。

カラーピッカーはPagesが最前面のときには表示され、背面に回したときには表示されなくなります。この種類のフローティングパレットはPagesに4つ搭載されており、より広域に配布するScriptであればこれらをすべて表示させた状態を想定する必要があることでしょう。

ただし、本Scriptは自分1人が使うことを想定しているため、「パレットの非表示状態を確認したうえでScriptを実行」という申し送りをScript内に記述することで回避することにしました。ただ、なかなか原因がわからなかったので、英訳プロジェクトの第1日目にしてけっこう消耗しました。

AppleScript名:指定のPages書類の言語設定を英語に.scpt
—
–  Created by: Takaaki Naganoya
–  Created on: 2023/11/06
—
–  Copyright © 2023 Piyomaru Software, All Rights Reserved
—
use AppleScript version "2.8" — Monterey (12) or later
use framework "Foundation"
use scripting additions

use dClick : script "dynamicClicker"
use dLib : script "display drop dialog"

–注意:使用前にPagesのカラーパレットが表示されていないことを確認すること!!!!

set aMainMes to "Drop Pages Document"
set aSubMes to "Drag and Drop Pages files to Table (.pages)"
set aUTI to "com.apple.iwork.pages.sffpages"
set aRes to (display drop dialog aUTI main message aMainMes sub message aSubMes with initial folder "" OK button title "Execute")

activate application "Pages"

repeat with i in aRes
  set j to i as alias
  
  
tell application "Pages"
    open j
  end tell
  
  
chengeLangTo() of me
  
  
tell application "Pages"
    close front document with saving
  end tell
  
end repeat

on chengeLangTo()
  set appName to "Pages" –Application Name
  
set aList to {"ファイル", "詳細", "言語と地域…"} –Localized Menu Title Structure
  
set aRes to clickSpecifiedMenuElement(appName, aList) of dClick
  
delay 1
  
changeDocLanguageSetting("英語", "アメリカ合衆国") of me –"English" , "United States"
  
–changeDocLanguageSetting("日本語", "日本") of me
end chengeLangTo

on changeDocLanguageSetting(targLang, targCountry)
  activate application "Pages"
  
tell application "System Events"
    tell process "Pages"
      set winNum to 1
      
set nList to name of every window
      
if "テキストのカラー" is in nList then set winNum to 2 –Pagesのカラーパレットが表示状態の場合
      
      
tell window winNum
        tell sheet 1
          
          
click pop up button 1
          
tell pop up button 1
            tell menu 1
              click menu item targLang
            end tell
          end tell
          
          
click pop up button 2
          
tell pop up button 2
            tell menu 1
              click menu item targCountry
            end tell
          end tell
          
          
click button "OK"
        end tell
      end tell
    end tell
  end tell
end changeDocLanguageSetting

★Click Here to Open This Script 

Posted in GUI Scripting How To | Tagged 13.0savvy System Events | Leave a comment

display drop dialogライブラリをv1.5にアップデート

Posted on 11月 4, 2023 by Takaaki Naganoya

電子書籍「AppleScript最新リファレンスv2.8対応」の添付Scriptの中にこのAppleScriptライブラリを呼び出しているものがあったので、macOS 11以降のUIに応じて各種サイズを変更した「display drop dialog」のバージョン1.5をリリースしました。

複数のUTIを指定して、複数タイプの書類のドラッグ&ドロップを受け付けるようにしました。.scptと.scptdのドラッグ&ドロップを受け付けるとか。

また、本ライブラリではダイアログ上でのファイルの並び順もドラッグ&ドロップで変更できるため、複数のPDFをドラッグ&ドロップで指定して、処理順をダイアログ上で変更するといった用途に用いることを想定しています。

AppleScriptをmacOS標準搭載のスクリプトメニューから呼び出したような場合に、処理対象のファイルをドラッグ&ドロップで指定する場合のファイル受け付けのインタフェースとして用意したものです。

–> Download displayDropDialog15(Install to ~/Libraries/Script Libraries/ folder)

AppleScript名:accept AppleScript documents.scpt
use dropLib : script "display drop dialog" version "1.5"

set aMainMes to "Drop AppleScript"
set aSubMes to "Drag and Drop AppleScript files to Table (.scpt & .scptd)"
set aUTI to {"com.apple.applescript.script-bundle", "com.apple.applescript.script"}
set execButtonTitle to "Execute"

set aRes to (display drop dialog aUTI main message aMainMes sub message aSubMes with initial folder "" OK button title execButtonTitle)

★Click Here to Open This Script 

Posted in dialog file File path GUI Library | Tagged 11.0savvy 12.0savvy 13.0savvy 14.0savvy | Leave a comment

macOS 13.6.2アップデート Cocoa-AppleScript Applet修正はなし

Posted on 10月 28, 2023 by Takaaki Naganoya

macOS 13.6.2アップデートが配信されました。Cocoa-AppleScript AppletがmacOS 13.xの途中で動かなくなり、macOS 13.6.x台で修正されるのではないか? などと思っていましたが、そういう状態にはなっていないようです。

ちなみに、macOS 13.xよりももっと古いOSで「Cocoa-AppleScript Applet」のアプレットを作成し、そこから実行バイナリ部分(/Contents/MacOS/CocoaApplet)を抜き出して、macOS 13.x上で作ったCocoa-AppleScript Appletの同一バイナリを削除して入れ替えると動く、という検証報告も入っています。

正直、Cocoa-AppleScript Appletは登場以来、「こんなので使えるか!?」という存在でした。その後OS X 10.10で一般のAppleScript実行環境でCocoa呼び出しが許可されてから、Scripter側にCocoa活用のノウハウが蓄積され、「標準環境よりもできることが多い」とのことで再評価されたものでもあります。

Posted in Bug Cocoa-AppleScript Applet news | Tagged 13.0savvy | Leave a comment

Finder上で選択中のASバンドル書類をオープンしてscpt形式で再保存

Posted on 10月 20, 2023 by Takaaki Naganoya

Finder上で選択中のAppleScriptバンドル形式書類をスクリプトエディタでオープンして、scpt形式で保存し直すAppleScriptです。

スクリプトエディタのコンテクストメニューが.scpt形式しか認識しないので、バンドル形式のScriptを変換するために作ったものです。

Finderの選択中のファイルをフィルタするのに、フィルタ参照ではなくUTIを求めて判定しています。

「AppleScript最新リファレンスv2.8対応」の付録Scriptの加工用に作ったものです。バンドル形式への変換は書いてあったものの、scpt形式に変換するものは書いていなかったので急遽、用意しました。

AppleScript名:Finder上で選択中のASバンドル書類をオープンしてscpt形式で再保存.scptd
—
–  Created by: Takaaki Naganoya
–  Created on: 2023/10/20
—
–  Copyright © 2023 Piyomaru Software, All Rights Reserved
—
use AppleScript version "2.4"
use scripting additions
use framework "Foundation"

property |NSURL| : a reference to current application’s |NSURL|
property NSArray : a reference to current application’s NSArray
property NSPredicate : a reference to current application’s NSPredicate
property NSURLTypeIdentifierKey : a reference to current application’s NSURLTypeIdentifierKey

on run
  set aResList to main("com.apple.applescript.script-bundle") of me
  
  
set ngList to {}
  
  
repeat with i in aResList
    set anAlias to contents of i
    
set aRes to saveAppleScriptAsScript(anAlias) of me
    
    
if aRes = false then
      set the end of ngList to contents of i
    end if
  end repeat
  
  
return ngList
end run

–scptdファイルをaliasで渡すと、scptファイルで同じ場所に保存し直す
on saveAppleScriptAsScript(aFile)
  set dPOSIX to POSIX path of aFile
  
if dPOSIX ends with "/" then
    set dPOSIX to (strings 1 thru -2 of dPOSIX)
  end if
  
  
–フルパスから、拡張子を付け替える
  
set newPath to changeExtFromPath(dPOSIX, "scpt") of me
  
set newFile to POSIX file newPath
  
  
tell application id "com.apple.scripteditor2"
    try
      open aFile
      
      
tell front document
        check syntax
      end tell
      
      
save front document as "script" in file newFile
      
close front document without saving
      
return true
    on error
      return false
    end try
    
  end tell
end saveAppleScriptAsScript

–POSIX pathの拡張子を付け替える
on changeExtFromPath(aPath, newExt)
  set pathString to current application’s NSString’s stringWithString:aPath
  
set newPath to ((pathString’s stringByDeletingPathExtension())’s stringByAppendingPathExtension:newExt) as string
  
return newPath
end changeExtFromPath

on main(acceptUTI)
  tell application "Finder"
    set aSel to selection as alias list
  end tell
  
  
set aList to {}
  
  
repeat with i in aSel
    set anAlias to contents of i
    
set aUTI to getUTIfromPath(anAlias) of me
    
if aUTI is not equal to missing value then
      set uRes to filterUTIList({aUTI}, acceptUTI) of me
      
      
if uRes is not equal to {} then
        set the end of aList to contents of i
      end if
    end if
  end repeat
  
  
return aList
end main

–AliasからUTIを求める
on getUTIfromPath(anAlias)
  set aPOSIXpath to POSIX path of anAlias
  
set aURL to current application’s |NSURL|’s fileURLWithPath:aPOSIXpath
  
if aURL = missing value then return missing value
  
set aRes to aURL’s resourceValuesForKeys:{current application’s NSURLTypeIdentifierKey} |error|:(missing value)
  
if aRes = missing value then return missing value
  
return (aRes’s NSURLTypeIdentifierKey) as string
end getUTIfromPath

–UTIリストが指定UTIに含まれているかどうか演算を行う
on filterUTIList(aUTIList, aUTIstr)
  set anArray to NSArray’s arrayWithArray:aUTIList
  
set aPred to NSPredicate’s predicateWithFormat_("SELF UTI-CONFORMS-TO %@", aUTIstr)
  
set bRes to (anArray’s filteredArrayUsingPredicate:aPred) as list
  
return bRes
end filterUTIList

★Click Here to Open This Script 

Posted in file File path filter | Tagged 12.0savvy 13.0savvy 14.0savvy Finder Script Editor | Leave a comment

新刊発売 AppleScript最新リファレンス v2.8対応

Posted on 10月 13, 2023 by Takaaki Naganoya

ようやく完成しました。最初の「AppleScript最新リファレンス macOS 10.11対応」の刊行から7年。完全刷新のアップデート版を刊行しました。PDF 974ページです。

→ 販売ページ

最新OS環境に合わせてアップデート

現行のAppleScript v2.8環境に合わせ、macOS 12/13/14を対象としたアップデートを行いました。可能なかぎり、macOS 10.13あたりからの各アプリケーションの用語辞書の変化などを追いかけ、それぞれのAppleScript実行プログラムのセキュリティ上の制約について、ベンチマークScriptを用いて評価も行なっています。

より広く、よりわかりやすく、よりくわしく

最初の「AppleScript最新リファレンス」(483ページ)から大幅にページを増やして974ページ。その分、解説範囲を広げています。

また、解説内容の難易度や想定ユーザーのレベルに分けた章構成を採用しています。

Script入門者向けに有用な情報(入門編)、Script利用者向けに有用な情報(利用編)、実際にScriptを書くユーザー向けに有用な情報(実践編)、困ったときに調べると便利な情報(資料編)など。

本書の付録は、スクリプトエディタのコンテクストメニューから呼び出すSnipet Scriptの「Piyomaru Context Menu Assistant」最新版、スクリプトエディタのテンプレートとして呼び出せる「Piyomaru Script Templates」、そしてGUI Scriptingの強力な助っ人「Dynamic Menu Clicker」などで構成されます(これからまとめて添付します。ちょっと手直しも必要なので)。

これからScriptに手を出そうかなという人にも、すでに使っているという人にも有用と思われる情報をわかりやすくまとめた1冊です。

■特集
AppleScriptv2.8の全貌
Shortcuts Events
OSAXなき時代のAppleScript命令拡張
各種セキュリティ制限を解除する
各種支援プログラムの現状
macOS標準装備&Apple純正アプリのAppleScript対応度解説
Finder/Automator/カレンダー/連絡先/メール/マップ/メッセージ/ミュージック/メモ/写真/システム設定/プレビュー/QuickTime Player/リマインダー/Safari/スクリプトエディタ/ショートカット/ターミナル/テキストエディット/tv/VoiceOver/画面共有/コンソール/System Information/Keynote/Pages/Numbers/Claris FileMaker Pro/Xcode/Apple Configurator/Garageband/iMovie/Instruments

■入門編
AppleScriptの世界を形作るもの
macOS標準搭載アプリケーションで AppleScript対応機能を持つもの
AppleScriptを実行できる、 さまざまなmacOS標準搭載ツール
AppleScriptを実行できる、 サードパーティのハード&ソフト
AppleScriptってなんだろう?
スクリプトエディタの使い方
「構文確認」時に行われること
Scriptを書く前に準備しておくこと
AppleScript最速マスター
文法編
AppleScript予約語一覧
AppleScript最新リファレンス
tellブロック/アクション/ダイアログ表示/コマンド/他の言語呼び出し/序数/制御構文/文字列操作/システム日付/データ型/定数/変数・プロパティ宣言/関数/演算子/パス関連/ファイル入出力/ローカライズ関連/テキスト要約/Webサービス呼び出し/フィルタ参照/サブルーチン宣言/無意味語/クリップボード制御/音量制御/スクリプトオブジェクト/その他
アプリケーションへの命令パターン
Script Debuggerとは?
Finder用語辞書攻略ガイド
Finderを使った定型処理
コラム GUIアプリの操作に影響を与えるFinder設定項目

■利用編
Script Menuの使い方
FastScripts 3
アプリケーションごとのScript Menu
フォルダアクション解説
Terminalから使うAppleScript
各種プラグインAppleScript
PDF Workflow Script解説
Mail Plugin Script解説
コンテクストメニューから呼び出す
廃止されたプラグインAppleScript
その他のAppleScriptランチャー〜スイッチコントロール/Automator/ショートカット/音声コントロール/Adobe Illustrator 2023/Adobe InDesign 2023/Keyboard Maestro/Hammerspoon/Service Station/Dropzone 4/Visual Studio Code/CotEditor+PowerPack/Xojo 2023/Live Code/Elgato Stream Deck
制限つきユーザーアカウント&制限つきマシン環境下のAppleScript
ペアレンタルコントロールとAppleScript
MDMによる制限環境下のAppleScript

■実践編
OSバージョン番号確認
ランタイム環境を知る
ハードウェア情報
GUI Scriptingの概要
AppleScriptからネット上の機能を手軽に活用
REST API呼び出し
CDN上のJavaScriptライブラリ呼び出し
ドロップレットを作らなくても大丈夫なScript運用術
Cocoa Scripting入門
対応Framework一覧(macOS 13/14)
Mac App StoreでAppleScriptで作ったアプリを販売
Piyomaru コンテクストメニューアシスタント
Piyomaru Script Templates

■資料編
AppleScriptと相性のよくない技術
各アプリケーションにおけるさまざまな座標系
独自マクロ言語内に記述するAppleScript〜Microsoft Office VBA/Claris FileMaker Pro Script Step
iOSデバイスとの連携
下準備
iOSデバイスからAppleScriptを実行する
iOSデバイス上の情報を更新する
AppleScriptで電話をかける
AppleScriptでSMSを送信する
iPhone/iPadとFaceTimeで通話する
リソースリファレンス〜Predicate文/UTI/アイコン/ディスクイメージ
AppleScriptの歴史
macOSとAppleScriptの要素技術史
AppleScriptの歴史 macOS編
AppleScriptの歴史 Classic MacOS編
AppleScript FAQs
エラー番号とエラーメッセージ
AppleScriptのエラー・コード表
キーコード表
キー入力シミュレーション用キーコード
あとがき

Posted in Books news | Tagged 12.0savvy 13.0savvy 14.0savvy | Leave a comment

macOS 13.6.1アップデート。Cocoa-AppleScript Appletの修正はなし

Posted on 10月 4, 2023 by Takaaki Naganoya

macOS 13.6.1アップデートがβ段階を経由せずに配信されました。セキュリティ上の問題を解消するためのもの、とのことです。

念のために試してみましたが、macOS 13.x上で実行ができなくなっているCocoa-AppleScript Appletランタイムは、依然として実行できません。彼らがこれを直す気があるのかどうか、まったくわかりません。

Posted in Cocoa-AppleScript Applet news | Tagged 13.0savvy | Leave a comment

Cocoa-AppleScript Appletランタイムが動かない?

Posted on 9月 22, 2023 by Takaaki Naganoya

AppleScriptObjC(Cocoa Scripting)の実行環境は大きく分けて3つあります。

1つ目は、Script EditorもしくはScript Debugger上で動かすもの、あるいはアプレットの書き出しを行なったもの。実行環境IDを取得すると、AppletとDropletは別のIDが返ってきますが、だいたい同じものです。

2つ目は、Xcode上で作成するCocoaアプリケーションです。AppleScriptでアプリを作成して、Mac App Store上で販売することもできます。かなり多くのCocoaの機能を利用できます。

3つ目が、これら2つの中間的な機能を持つCocoa AppleScript Appletです。Script Editorのファイル>テンプレートから新規作成>Cocoa-AppleScript Applet.appを実行すると編集可能になります。

Cocoa-AppleScript Appletは、Script Editor上のCocoa Scriptと同様の機能が使える上に、アプリケーション由来のイベント(起動中であるとか、起動終了したとか)を利用できます。

Cocoa-AppleScript Appletが登場したOS X 10.7時代、Xcode上のようにInterface Builderで手軽にGUIが作成できるわけでもなく、Script Editor上で普通に動かすScriptのようにログを表示してデバッグができるわけでもなく、何か明確な用例が存在するわけでもないため「これでどないせーっちゅーんじゃ?」と、とても手を出せないものと感じました。自分はこれを明確な「失敗作」として評価していました。この環境を嬉々として使っている人物といえば、edama2氏ぐらいのものです。

その後、macOS 10.10以降で通常のScript Editor上で動かすAppleScriptでもCocoaの機能が利用できるようになったため、Cocoa Scriptingのノウハウが蓄積され、「より高機能なCocoa Scripting環境」としてCocoa-AppleScript Appletが再評価されるようになりました。

Script Editor上で記述するCocoa Scriptで機能的に不十分だと感じるようになる場面で、Xcodeを使ってフル機能のアプリケーションを作るほどでもない、という状況において、Cocoa-AppleScript Appletという第3の選択肢が存在していることの意義はあったのです(使っているユーザーがめちゃくちゃ少ないとは思いますが)。

そして、ごくたまに様子を見るぐらいだったCocoa-AppleScript Applet環境ですが、最近(macOS 13.x上で)動かないという声が寄せられるようになりました。自分も動かないことを確認しています。テンプレートから1行も追加していない状態でも動かないので、これは明らかにApple側のミスでしょう。

バグレポートすれば直してもらえるのかもしれませんが、こうした情報が共有されるとか、Appleがドキュメントを出すようにしないと、いつも不手際をこっそり誤魔化すだけで「給料をもらって毎日バグを作るAppleエンジニア」「Appleのエンジニアは製品を作らない。バグを作る」といった批判をかわせない状態になることでしょう。

これは、年表を頻繁に作る立場の人間からいえば、Mac OS X 10.3で「is in」演算子が動作しなかったのと同じぐらいの大規模なバグに見えます。

本件、macOS 14RC上でも同様に発生しています。おおかた、「証明書の期限が切れている」といったたぐいのトラブルだと思っています。

Posted in Bug Cocoa-AppleScript Applet | Tagged 13.0savvy 14.0savvy | 2 Comments

Post navigation

  • Older posts
  • Newer posts

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

Google Search

Popular posts

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

Tags

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

カテゴリー

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

アーカイブ

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

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

メタ情報

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

Forum Posts

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

メタ情報

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