Menu

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

AppleScriptの穴

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

投稿者: Takaaki Naganoya

macOS 26.4で実装されたAppleScript scanning機能

Posted on 8月 6 by Takaaki Naganoya

Appleが現地時間2026年08月03日付けで公開/アップデートした「Apple Platform Security (PDF)」によると、Appleは悪意のあるコマンドをターミナルにコピー&ペーストさせたり、悪意のあるスクリプトをダウンロードし実行させるソーシャルエンジニアリング攻撃に対処するため、ターミナルのペースト保護機能を含め3つの保護機能を macOS 26.4で実装。

それが、「Terminal paste protection」「Pasteboard command blocking」そしてAppleScriptに関する「AppleScript scanning」です。

全文を含むPDF(英文)
https://help.apple.com/pdf/security/en_US/apple-platform-security-guide.pdf

(原文)
AppleScript scanning for AppleScript and JavaScript for Automation (JXA) scripts uses XProtect technology. Because the scanning is integrated into the OpenScripting framework, all AppleScript executions on macOS are subject to local inspection, whether the script is loaded from storage or from memory.

「AppleScript scanning for AppleScript and JavaScript for Automation (JXA) scripts 」はXProtect技術を用いています。このスキャニングはOpen Scripting Architecture frameworkに組み込まれており、すべてのmacOS上のローカルの資源への探索を行うAppleScriptの実行がスキャン対象です。これは、SSDやHDDなどのストレージから読み込まれたか、メモリ上から読み込まれたかを問いません。すべてが対象です。

(原文)
When a script matches a known malicious signature, macOS blocks execution and presents the user with a notification.

これらのScriptが既知の悪意ある署名にマッチした場合、macOSは通知を表示しつつ実行をブロックします(XProtectがマルウェアの検出を、バイナリ全体を見て実行)。

(原文)
If the blocked script is associated with a file stored on one of the following, the user can choose to override the block through the existing malware protection override in Finder: •Internal storage •External device •Cloud-based service •Mounted file server

実行をブロックされたScriptがストレージ(内蔵SSD、外付けドライブ、クラウドストレージ、マウントしたファイルサーバー)上のファイルに関連づけられている場合、ユーザーは Finder の既存のマルウェア保護オーバーライドを通じてブロックをオーバーライドすることを選択できます(実際にブロックされるところを見ていないので不明)。

(原文)
Scripts executed without an associated file—such as those run directly from memory—can’t be overridden. The user needs to save the script first before requesting an override.

関連ファイルなしで実行されるスクリプト (メモリから直接実行されるスクリプトなど) はオーバーライドできません。ユーザーは、オーバーライドをリクエストする前に、まずスクリプトをファイルに保存する必要があります。

Piyomaru Softwareの所見

マルウェアがAppleScriptバイナリを含む場合、その実行Scriptのチェックサム同士で比較している印象を受けます。実行時に実行Scriptのチェックサムを取得し、問題があるScriptと同一であれば実行をブロック、と読めます。

気になる点は2つ。

XProtectによってマルウェアScriptとの比較を行うのにどの程度の処理のオーバーヘッドが発生するのか? 
単独のファイルとして存在していないScriptのチェックを行えるのか? 

メモリ上で組み立てたScriptについてはチェック対象ではないといった記述があるため、他の実行ファイルのバイナリ内部に埋め込んだScriptについては、対処できないように見えます。

また、URL Events経由で流し込まれた悪意あるAppleScript(スクリプトエディタでオープン)の構文確認時(Apple Eventsへのコンパイル時)にXProtectのチェックが動かないと意味がないのでは? とも考えます。

さらに、何かの手違いで手元のScriptが「マルウェアScript」と判定された場合の異議申し立て方法については一切何も説明されていません。

いきなり強めのセキュリティしばりを加えるよりも、段階的にセキュリティ機能を追加するという方針は(なんとなく)理解できはするのですが、例によってApple社内の誰が本件について担当しているのかが不明なので、文句を言う先がよくわかりません。

Posted in Security | Tagged 26.0savvy 27.0savvy | Leave a comment

macOS 27 AppleScriptからApple Foundation Modelsを呼び出す

Posted on 8月 4 by Takaaki Naganoya

macOS 27から標準搭載されるシェルコマンド「fm」(/usr/bin/fm)を通じて、Apple Foundation Models(=Apple IntelligenceのLLM)を呼び出すことができます。

macOS 27のBetaをインストールしてある環境であれば、AFMを試すことができます。開発者登録している方、あるいは一般のユーザーでもβユーザー登録してあればmacOS 27をインストールできます。

Apple Silicon搭載Macであればこれらの環境を利用可能ですが、念のためRAM 16Gバイト以上だと安心できることでしょう。

その他、fmコマンドを利用するには、システム設定でSiriをオンにしてある必要があります。AFMが使用可能になっているかどうかをfmコマンド自体で確認可能です。

ターミナル(Terminal.app)上で以下のように「fm available」コマンドを実行することで、現在使用中の(macOS 27以降の)環境でAFMが使用可能かどうかを確認できます。

% fm available
System model available
PCC model available

有効/無効確認の手段が用意されていることは前向きに評価できます。

fmコマンドでできること

fmコマンドができることは、LLMへの問い合わせです。おおよそChatGPTやGeminiなどへの問い合わせを行うのと同様に自然言語によるテキストチャットによる対話も行えます。

英語でも日本語でも応答してくれますが、応答/翻訳できるのは15言語程度です。

日本語、英語(米国、英国、オーストラリア、カナダ、ニュージーランド、インド、シンガポール)、フランス語、ドイツ語、イタリア語、ポルトガル語、中国語(簡体字、繁体字)、韓国語、ベトナム語、デンマーク語、オランダ語、ノルウェー語、スウェーデン語、トルコ語

AFMからの応答は必要に応じてMarkdownで装飾されて返ってきます(プログラムリストや見出しなど)。

用途に応じて2つのモデルを指定可能

AFMにはデフォルトで用意されているLLMモデルが2つあります。

ローカルで完結する「system」と、Appleのプライベートクラウドのサーバー群で動作する「pcc」の2つです。インターネット接続不要のsystem、接続必須のpccと見ることもできます。

ローカルのモデルは、「とりあえず動く」程度の内容であり、ちょっと込み入った内容になると、

「Appleのウェブサイトで、最新の製品情報や機能をご確認ください。」

といった当たり障りのない(情報量のない)内容を返すようになります。

コマンドラインからfmコマンドを介してモデルを指定して応答を取得してみましょう。モデルによって情報量が大幅に異なります。

% fm respond "AppleScriptとは何ですか?" --model system
% fm respond "AppleScriptとは何ですか?" --model pcc

(system)AppleScriptは、Appleのコンピュータで動作するスクリプト言語で、アプリケーションやシステムの操作を自動化するために使用されます。テキストベースの言語であり、テキスト編集やファイル操作、アプリケーションの起動など、さまざまなタスクを簡潔に記述できる点が特徴です。

(pcc)AppleScriptは、Appleが開発したスクリプト言語で、macOS上でアプリケーションやシステム機能を自動化するために使用されます。この言語は、英語に近い自然な構文を持っているため、プログラミングの経験が少ない人でも比較的簡単にスクリプトを書くことができます。

AppleScriptを使うことで、例えば以下のような作業を自動化できます:

- ファイルやフォルダの管理
- アプリケーションの操作(メールの送信、ドキュメントの作成など)
- システム設定の変更
- インターネットからのデータの取得

スクリプトは「Script Editor」というアプリケーションを使って作成・実行され、他のアプリケーションとAppleEventsというメカニズムを通じて通信します。これにより、macOS環境での作業効率を大幅に向上させることができます。

AFMの使用可能な残トークン確認

pccはAppleの自社クラウド上にあるLLMのサービスであるため、ローカルのsystemとは異なり、使用可能なトークン上限が設定されています。Web上で探してみると「4096トークン/日」となっているようですが、macOS 27のリリース時にこのままなのかは不明です。まだβ版であるため、最終仕様ではありません。

% fm quota-usage --model pcc
PCC: ✓ Available
% fm quota-usage --model system
System: Not applicable (quota only applies to PCC)

fmコマンド経由では、使用可能なトークン数を厳密に取得することはできないようです。あくまで、使用可能(Available)かどうかを返してきます。

なお、実行するまえにクエリがどの程度のトークンを消費するかを確認できるようになっています。

% fm count-tokens "AppleScriptとは何ですか?"
Token count: 15

このとき、pccかsystemかといったモデルの指定はできませんが、暗黙の了解でpcc使用時の消費トークン数でしょう(ローカル動作のsystemではトークン消費を気にする必要がありませんし)。

AFMの情報最新日付を確認

LLMへの一般的なアプローチがAFMでも有効で、モデルの学習データの最新日付がいつなのかを問い合わせると答えてくれます。

% fm respond 'あなたの現在の日付を教えてください。' --model pcc
% fm respond 'あなたの現在の日付を教えてください。'

  pcc: 2025年04月29日
  system: 2024年10月29日

つまり、これよりも新しいネット上の情報は反映されていない状態です。macOS 27のリリース時(iOS 27のリリース時?)にはこれらのモデルも更新される可能性がありますが、本稿執筆時点では上記のとおりです。

# 本稿を書いて塩漬けにしている間に上記の応答が変わりました。

----system(Local LLM)の応答(2026/08/04)
私はAppleによって開発された言語モデルです。

[必要なツールを検索]
今日の日付を取得するためのツールが存在しません。しかし、現在の日付を正確に把握するには、サーバー上のタイムサーバーからの情報が必要であり、その情報を提供できる機能は存在しません。そのため、具体的な日付を提供することはできません。
---

AFMも一般的なLLMと同様に、個人情報に関わることには答えてくれなかったり、米国における政治状況やAppleの利益に反することには回答してくれません。

fmコマンドを実行する環境ごとに利用できるmodelも異なる

macOS標準搭載のTerminal.app上では、modelがsystem(Local)でもpcc(クラウド)でもどちらも指定して実行できます。

しかし、AppleScriptのdo shell scriptコマンド上では制限がかかっており、利用できるのはsystem(Local)のみです。

do shell scriptコマンド内でも環境変数の設定により、Terminal.app上と同様にpcc(クラウド)を利用できるようになるのかはわかりませんが、現状ではsystem(Local)のみであると認識しています。

逆をいえば、Swiftでそのような処理を行うプログラムを書いてAppleScriptからdo shell scriptで呼び出せばよいだけでしょう。そういう使い方ができないAppleScript実行環境(ライブラリ呼び出し不可+バンドル形式Script実行不可)では、system(Local)のみ利用できることになるでしょう。

Posted in Apple Inteligence | Tagged 27.0savvy | Leave a comment

ディスプレイ選択ダイアログ

Posted on 7月 21 by Takaaki Naganoya

現時点でMacに接続されているディスプレイ情報を取得して、座標値からその位置関係や大きさを計算して画像にレンダリングし、ポップアップメニューから処理対象のディスプレイを選択してNSRectを返すAppleScriptです。

まだ試作品レベルですが、macOS 27 beta上で動作しています。ただ、NSAlertによるダイアログを表示させた場合に、アイコンもタイトルもサブタイトルもすべて左寄せになってしまうところがいまひとつです。

なんでこんなものを作ったかといえば、複数ディスプレイがつながっているMac上で任意のディスプレイ上に表示されているウィンドウ(に含まれるdocument)だけを処理対象とし、他のディスプレイ上のウィンドウを無視するといった処理をしたいと考えたからです。

少々AIにお願いしてコードを書いてもらっていますが、そのためにやや不要な処理までやっているような気もします。

AppleScript名:ディスプレイ情報を取得して、位置関係を画像化_take2_1b.scptd
—
–  Created by: Takaaki Naganoya
–  Created on: 2026/07/19
—
–  Copyright © 2026 Piyomaru Software, All Rights Reserved
—

use AppleScript version "2.8"
use scripting additions
use framework "Foundation"
use framework "AppKit"

property K_MAX_WIDTH : 600.0
property K_MAX_HEIGHT : 300.0
property selectedDispRes : missing value

set {aInfoList, aIMG, aSizeList} to drawDisplayLayout() of me
–return aIMG

set aInfoList to aInfoList as list
if length of aInfoList = 1 then return

set aParamRec to {myDispInfo:aInfoList, myImgView:aIMG, mySizeList:aSizeList, mymainTitle:"ディスプレイ選択", mySubTitle:"メイン画面が「1」、その他は左上から「2, 3…」となります。"}

–my dispLayoutAndPopup:aParamRec–for debugging on Script Editor
my performSelectorOnMainThread:"dispLayoutAndPopup:" withObject:(aParamRec) waitUntilDone:true
return (visibleFrame of selectedDispRes)’s |description|() as string –For Debugging

–Macに接続されているディスプレイ一覧から処理対象を選択するダイアログを表示
on dispLayoutAndPopup:aParam
  set dList to (myDispInfo of aParam) as list
  
set aIMG to myImgView of aParam
  
set aMainTitle to (mymainTitle of aParam) as string
  
set aSubTitle to (mySubTitle of aParam) as string
  
set {imgWidth, imgHeight} to (mySizeList of aParam) as list
  
set dNum to length of dList
  
set numStrList to makeNumberStringList(dNum) of me
  
  
set currentAlert to current application’s NSAlert’s alloc()’s init()
  
currentAlert’s setMessageText:aMainTitle
  
currentAlert’s setInformativeText:aSubTitle
  
  
set imageView to current application’s NSImageView’s alloc()’s initWithFrame:(current application’s NSMakeRect(0, 0, imgWidth, imgHeight))
  
imageView’s setImage:aIMG
  
  
set a1Button to (current application’s NSPopUpButton’s alloc()’s initWithFrame:(current application’s NSMakeRect(0, 0, imgWidth – 100, 30)) pullsDown:false)
  
a1Button’s removeAllItems()
  (
a1Button’s addItemsWithTitles:(numStrList))
  
  
  
— 画像ビュー
  
set imageView to current application’s NSImageView’s alloc()’s initWithFrame:(current application’s NSMakeRect(0, 0, imgWidth, imgHeight))
  
imageView’s setImage:aIMG
  
imageView’s setImageScaling:(current application’s NSImageScaleProportionallyUpOrDown)
  
  
— ポップアップ
  
set popupWidth to imgWidth – 80
  
set a1Button to (current application’s NSPopUpButton’s alloc()’s initWithFrame:(current application’s NSMakeRect(0, 0, popupWidth, 30)) pullsDown:false)
  
a1Button’s removeAllItems()
  (
a1Button’s addItemsWithTitles:(numStrList))
  
  
— OKボタン幅に合わせると見た目がよい
  
a1Button’s setControlSize:(current application’s NSControlSizeRegular)
  
  
————————————————–
  
— 中央寄せコンテナ
  
————————————————–
  
set containerWidth to imgWidth
  
set containerHeight to imgHeight + 60
  
  
set containerView to current application’s NSView’s alloc()’s initWithFrame:(current application’s NSMakeRect(0, 0, containerWidth, containerHeight))
  
  
— StackView
  
set stackView to current application’s NSStackView’s alloc()’s initWithFrame:(containerView’s |bounds|())
  
  
stackView’s setOrientation:(current application’s NSUserInterfaceLayoutOrientationVertical)
  
stackView’s setAlignment:(current application’s NSLayoutAttributeCenterX)
  
stackView’s setDistribution:(current application’s NSStackViewDistributionGravityAreas)
  
stackView’s setSpacing:16.0
  
  
— Auto Layout
  
stackView’s setTranslatesAutoresizingMaskIntoConstraints:false
  
  
— 追加
  
stackView’s addArrangedSubview:imageView
  
stackView’s addArrangedSubview:a1Button
  
  
containerView’s addSubview:stackView
  
  
————————————————–
  
— StackViewをコンテナ中央へ固定
  
————————————————–
  
set centerX to (stackView’s centerXAnchor())
  (
centerX’s constraintEqualToAnchor:(containerView’s centerXAnchor()))’s setActive:true
  
  
set centerY to (stackView’s centerYAnchor())
  (
centerY’s constraintEqualToAnchor:(containerView’s centerYAnchor()))’s setActive:true
  
  
————————————————–
  
— accessoryView設定
  
————————————————–
  
currentAlert’s setAccessoryView:containerView
  
currentAlert’s runModal()
  
  
–popup buttonの選択肢を取得する
  
set tmpSegSel to (a1Button’s indexOfSelectedItem()) as number
  
set tRes to (tmpSegSel + 1)
  
  
set selectedDispRes to (contents of item tRes of dList)
end dispLayoutAndPopup:

on makeNumberStringList(aMax)
  set aList to {}
  
set aCount to 1
  
repeat aMax times
    set the end of aList to (aCount as string)
    
set aCount to aCount + 1
  end repeat
  
return aList
end makeNumberStringList

on drawDisplayLayout()
  set allScreens to current application’s NSScreen’s screens()
  
if allScreens is missing value or allScreens’s |count|() = 0 then return
  
  
— 1. メイン画面(配列の先頭)を取得
  
set mainScreen to allScreens’s firstObject()
  
  
— 2. サブ画面たちをリストとして抽出
  
set otherScreensList to {}
  
repeat with i from 1 to (allScreens’s |count|()) – 1
    copy (allScreens’s objectAtIndex:i) to end of otherScreensList
  end repeat
  
  
— 3. サブ画面を「左上から順(Y座標の降順 > X座標の昇順)」に手動ソート
  
— ※AppleScript側でハンドリングした方がCocoaの構造体ネスト問題を回避できて確実です
  
repeat with i from 1 to (count otherScreensList)
    repeat with j from i + 1 to (count otherScreensList)
      set scrI to item i of otherScreensList
      
set scrJ to item j of otherScreensList
      
set frameI to scrI’s frame()
      
set frameJ to scrJ’s frame()
      
      
set yI to current application’s NSMinY(frameI)
      
set yJ to current application’s NSMinY(frameJ)
      
set xI to current application’s NSMinX(frameI)
      
set xJ to current application’s NSMinX(frameJ)
      
      
— Yが小さい(下にある)か、Yが同じでXが大きい(右にある)場合は入れ替え
      
if (yI < yJ) or (yI = yJ and xI > xX) then
        set item i of otherScreensList to scrJ
        
set item j of otherScreensList to scrI
      end if
    end repeat
  end repeat
  
  
— 4. 最終的な順序の配列を作成(1番目がメイン、2番目以降がサブ)
  
set sortedScreens to current application’s NSMutableArray’s array()
  (
sortedScreens’s addObject:mainScreen)
  
repeat with aScr in otherScreensList
    (sortedScreens’s addObject:aScr)
  end repeat
  
  
— 5. 全体を含むバウンディングボックスの計算
  
set minX to 9.9999E+4
  
set maxX to -9.9999E+4
  
set minY to 9.9999E+4
  
set maxY to -9.9999E+4
  
  
repeat with aScreen in sortedScreens
    set f to aScreen’s frame()
    
set sx to current application’s NSMinX(f)
    
set sy to current application’s NSMinY(f)
    
set sw to current application’s NSWidth(f)
    
set sh to current application’s NSHeight(f)
    
    
if sx < minX then set minX to sx
    
if sy < minY then set minY to sy
    
if (sx + sw) > maxX then set maxX to (sx + sw)
    
if (sy + sh) > maxY then set maxY to (sy + sh)
  end repeat
  
  
set totalWidth to maxX – minX
  
set totalHeight to maxY – minY
  
  
— 6. スケール比率の計算
  
set scaleX to K_MAX_WIDTH / totalWidth
  
set scaleY to K_MAX_HEIGHT / totalHeight
  
set theScale to scaleX
  
if scaleY < theScale then set theScale to scaleY
  
  
set imgWidth to totalWidth * theScale
  
set imgHeight to totalHeight * theScale
  
set canvasSize to current application’s NSMakeSize(imgWidth, imgHeight)
  
set displayImage to current application’s NSImage’s alloc()’s initWithSize:canvasSize
  
  
— 7. 描画処理
  
displayImage’s lockFocus()
  
  
current application’s NSColor’s clearColor()’s |set|()
  
current application’s NSRectFill(current application’s NSMakeRect(0, 0, imgWidth, imgHeight))
  
  
set screenCount to sortedScreens’s |count|()
  
repeat with idx from 0 to screenCount – 1
    set aScreen to (sortedScreens’s objectAtIndex:idx)
    
set f to aScreen’s frame()
    
    
set rx to ((current application’s NSMinX(f)) – minX) * theScale
    
set ry to ((current application’s NSMinY(f)) – minY) * theScale
    
set rw to (current application’s NSWidth(f)) * theScale
    
set rh to (current application’s NSHeight(f)) * theScale
    
set drawRect to current application’s NSMakeRect(rx, ry, rw, rh)
    
    
— 枠と背景
    
current application’s NSColor’s windowBackgroundColor()’s |set|()
    
current application’s NSRectFill(drawRect)
    
current application’s NSColor’s textColor()’s |set|()
    
current application’s NSFrameRectWithWidth(drawRect, 1.5)
    
    
— ★【修正】数字の文字列生成方法をNSNumber経由に修正
    
set numObj to (current application’s NSNumber’s numberWithInteger:(idx + 1))
    
set numStr to numObj’s stringValue()
    
    
set fontHeight to rh * 0.4
    
if fontHeight > 24.0 then set fontHeight to 24.0
    
if fontHeight < 12.0 then set fontHeight to 12.0
    
    
set numFont to (current application’s NSFont’s systemFontOfSize:fontHeight weight:(current application’s NSFontWeightBold))
    
set paraStyle to current application’s NSMutableParagraphStyle’s alloc()’s init()
    (
paraStyle’s setAlignment:(current application’s NSTextAlignmentCenter))
    
    
set attrDict to current application’s NSMutableDictionary’s dictionary()
    (
attrDict’s setObject:numFont forKey:(current application’s NSFontAttributeName))
    (
attrDict’s setObject:paraStyle forKey:(current application’s NSParagraphStyleAttributeName))
    (
attrDict’s setObject:(current application’s NSColor’s textColor()) forKey:(current application’s NSForegroundColorAttributeName))
    
    
set strSize to (numStr’s sizeWithAttributes:attrDict)
    
set textY to ry + ((rh – (strSize’s height)) / 2.0)
    
set textRect to current application’s NSMakeRect(rx, textY, rw, strSize’s height)
    
    (
numStr’s drawInRect:textRect withAttributes:attrDict)
  end repeat
  
  
displayImage’s unlockFocus()
  
  
return {sortedScreens, displayImage, {imgWidth, imgHeight}}
end drawDisplayLayout

★Click Here to Open This Script 

Posted in dialog System | Tagged 10.15savvy 26.0savvy 27.0savvy | Leave a comment

Apple Creator Studio 15.3 Update

Posted on 7月 2 by Takaaki Naganoya

Apple Creator Studio(以下、ACSと略)に所属するKeynote、Pages、Numbers(旧iWork Apps)がバージョン15.3にアップデートしました。同じくACSに所属するApple純正の画像編集アプリ「Pixelmator Pro」で各書類上の画像を編集するための連携機能が追加されました。

これらのアプリのAppleScript対応機能については、Keynote 15.3が新たなトランジッション「radial wipe」(日本語ローカライズ名は「放射状ワイプ」)を指定できるようになりました。他に変更点はありません。

ただし、radial wipeで画面上で指定できるパラメータ「方向」(時計回り/反時計回り)や角度、ぼかしはAppleScriptから指定できないので、実用上は微妙な感じです。

「放射状ワイプ」自体は、Keynote 14.xでは実装されていませんでした。15.xのどこかのバージョンで追加されたものと思われますが、どの時点で追加されたかは明確ではありません。

ただ、個人的にはそんなことはどうでもいいから、Keynote/Pages/Numbers上で画像の内容やパスを取得できるようにしてほしいです。

tell application "Keynote Creator Studio"
  tell front document
    –radial wipeは、画面上では「放射状ワイプ」と表示
    
set transition properties of current slide to {transition effect:radial wipe, transition duration:2.0, transition delay:0, automatic transition:false}
    
–角度、ぼかし、方向(時計回り/反時計回り)などは指定できない
  end tell
end tell

★Click Here to Open This Script 

Posted in news | Tagged 15.0savvy 26.0savvy 27.0savvy Keynote | Leave a comment

macOS 27.0, Golden Gate #2

Posted on 6月 26 by Takaaki Naganoya

macOS 27, Golden Gateのベータ版(Beta 2)を利用していますが、従来のβよりもマシといえど、やはりβ版であることを感じさせます。

標準搭載アプリのバージョンが割といいかげん

各アプリのバージョン表記でおかしいところがあります。「ヒント(Hints)」はバージョン27.0がおそらく正しい番号ですが、1.0が割り当てられています。

メッセージ(Messages)もバージョン26.0が割り振られていますが、(何も意図がなければ)27.0が正しい番号でしょう。バージョン番号を見て判定するような処理には不安があります。

macOS 15.5 macOS 26.0 macOS 27.0
Finder 16 16 27
System Events 1.3.6 1.3.6 1.3.6
連絡先(Contacts) 14 14 14
Safari 18 19 27
Photos 10 11 12
Reminders 7 7 7
Notes 4.12.6 4 4
Messages 14 14 26
Mail 16 16 16
Music 1.5.5 2 2
Maps 3 3 3
Preview 11 11 11
TextEdit 1 1 1
Calendar 15 16 27
TV 1.5.5 2 2
QuickTime Player 10 10 10
Automator 2 2 2
Terminal 2 2 2
Console 1 1 1
Instruments 16 26 27
ScriptEditor 2.11 2.11 2.11
System Information 11 11 11
VoiceOver Utility 10 10 10
Shortcuts 7 7 10
Screen Sharing 5 6 7
ヒント(Hints) 16 26 1

standard additionsの用語を使う際に注意

Cocoa Script(use framework “Foundation”あるいは”Cocoa”を含むAppleScript)において、コンパイル(構文確認)時に、standard additionsの予約語を含む場合にエラーになるケースが増えました。

on writeToFileAsUTF8(this_data, target_file, append_data)
  tell current application
    try
      set the target_file to the target_file as text
      
set the open_target_file to open for access file target_file with write permission
      
if append_data is false then set eof of the open_target_file to 0
      
write this_data as «class utf8» to the open_target_file starting at eof
      
close access the open_target_file
      
return true
    on error error_message
      try
        close access file target_file
      end try
      
return error_message
    end try
  end tell
end writeToFileAsUTF8

★Click Here to Open This Script 

これだとエラーになります。「using terms from scripting additions」〜「end using terms from」で囲う必要が出てくるケースに遭遇しました。

on writeToFileAsUTF8(this_data, target_file, append_data)
  tell current application
    using terms from scripting additions
      try
        set the target_file to the target_file as text
        
set the open_target_file to open for access file target_file with write permission
        
if append_data is false then set eof of the open_target_file to 0
        
write this_data as «class utf8» to the open_target_file starting at eof
        
close access the open_target_file
        
return true
      on error error_message
        try
          close access file target_file
        end try
        
return error_message
      end try
    end using terms from
  end tell
end writeToFileAsUTF8

★Click Here to Open This Script 

Posted in Bug | Tagged macOS 27 | Leave a comment

macOS 27, Golden Gate

Posted on 6月 9 by Takaaki Naganoya

US Appleによる開発者向けイベントWWDC 26において、macOS 27, Golden Gateが発表されました。

前バージョン(macOS 26)で導入され、いまひとつ人気を得ていなかった「Liquid Glass」から、前々バージョンの「macOS 15」のデザインに差し戻したような印象を受けます。

macOS 26から過剰な装飾を削ぎ落としたようなデザインに変更。さらに、各種バグについて解消を図るほか、Siri AIの機能強化が行われたと発表されています。

珍しくUser系のBeta Program「Apple Seed」にもBeta 1が回ってきた(例年、Beta 1はDeveloper Betaにしか回ってこない)ので、さっそくMacBook Air M2にmacOS 27 Beta 1をインストールしたところ、まだ全体的にバグはあるものの、Beta 1としてはかなり評価できる印象です(常用はつらそう)。

不評だったmacOS 26を「なかったこと」にしつつ、悪かった点は改め、よい点は伸ばすというのがmacOS 27の位置付けのようです。ティム体制下ではこれまでになかった動きであり、これまでの「中身のない、株価対策のためだけのバージョンアップ」よりも評価できる動きです。

AppleScriptの仕様を調べてみるとバージョン2.8で変更はありません。スクリプトエディタにも変更はないようです。特筆すべき点として、このところ毎度毎度Beta初期段階で動作しないまま出てきていた「スクリプトメニュー」が、このBeta 1から動作していて驚かされました。

その他、Beta初期段階で何度も発生していた「aliasをPOSIX pathにcastするとおかしな表記のパスが返ってくる」という恥ずかしいバグも、このBeta 1では見られていません(それでも油断できない)。

バグ修正については、「Cocoa-AppleScript Applet」がまともに動いているように見えます。簡単な(ダイアログを表示する程度の)アプレットを作成し、アプレットとして保存。アプレットを実行すると、問題なくダイアログ表示されました。ただ、このアプレットを通常終了することができなかったので、その点は問題といえるでしょう。

Xcode上でAppleScriptで作成したDocument Basedなアプリが起動しなかったり(Kamenoko)、まだ初期段階だから発生しているのか、それとも他の問題によるものなのか不明な問題も確認しています。

Posted in Bug news | Tagged macOS 27 | Leave a comment

ワークスペース切り替えv2.1

Posted on 5月 6 by Takaaki Naganoya

macOSのSpaces(仮想デスクトップ機能)で、任意のワークスペースに切り替えを行うAppleScriptです。

–> Download changeSpace_v2.1.scptd(with spaces_tool in its bundle)

Spaces系の機能はAPIが公開されておらず、Private APIを叩きまくることになります。現在定義されているSpacesの名称一覧の取得(list)、現在表示中のSpacesの名称(current)についてはこの方法で情報を取得できています。

肝心のSpaces間の切り替えについては、GUI Scripting経由でキーコード(Control 1、Control 2など)を送出することで行なっています。これらのキーボードショートカットが有効になっていないと切り替え自体が行えません(このあたりの機能がOS内部で十分にサポートされていないため、このような行き当たりばったりの実装になってしまいます)。

そのため、本AppleScriptを実行するプログラム……スクリプトエディタ上で実行するのであればスクリプトエディタに、Script Menuで実行するのであればScript MenuにGUI Scriptingの実行権限(アクセシビリティ)を許可しておく必要があります。また、同様の理由からGUI Scripting呼び出し権限を取得できないAppleScriptの実行プログラムからはSpacesの切り替え操作を行えません。

以下のAppleScriptは内蔵ツールを呼び出すだけのものであり、これだけでは実行できません。上記リンクからバンドルスクリプト自体をダウンロードして、実行してください。

# もしかしたら、space_toolは各クライアント上でビルドし直さないとダメかもしれないので、実行時にビルド+実行する形態に書き換えるかもしれません

AppleScript名:ワークスペース切り替えv2.1.scptd
—
–  Created by: Takaaki Naganoya
–  Created on: 2026/05/05
—
–  Copyright © 2026 Piyomaru Software, All Rights Reserved
—

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

set aPath to path to resource "space-tool"
set pPath to POSIX path of aPath

delay 0.5 –超重要。スクリプトエディタ上で実行するには必須

— ① 一覧取得
set allSpaces to do shell script (quoted form of pPath) & " list"
(*
"Desktop_1
Desktop_2"
*)

— ② 現在選択されているSpaces名称を取得
set currentSpace to do shell script (quoted form of pPath) & " current"
–> "Desktop_1"

— ③ 切り替え(例:Desktop_2へ)
my switchToSpace(2)

on switchToSpace(spaceNumber)
  — 数字キーのキーコードマップ (1=18, 2=19, 3=20, 4=21, 5=23, 6=22, 7=26, 8=28, 9=25)
  
set keyCodes to {18, 19, 20, 21, 23, 22, 26, 28, 25}
  
set theCode to item spaceNumber of keyCodes
  
  
tell application "System Events"
    key code theCode using {control down}
  end tell
end switchToSpace

★Click Here to Open This Script 

Posted in Spaces System | Tagged 26.0savvy | Leave a comment

Safariの最前面のウィンドウで表示されているAmazon.co.jpの製品ページへの最短リンクを取得

Posted on 3月 30 by Takaaki Naganoya

Safariの最前面のウィンドウで表示中のamazon.co.jpの製品ページへの最短リンクを取得して、クリップボードに入れるAppleScriptです。動作確認はmacOS 26.4+Safari 26.4で確認しています。添付のアプレットはScript Menuに入れて呼び出しています。

–> Download Enhanced Applet with Framework

Amazon.co.jpの製品URLをWebブラウザのURL欄からコピー&ペーストで取得しようとしても、不要な情報が大量に付加されているため、Blogなどに投稿するのにけっこう苦労します。

そこで、実際に対象の製品ページへのリンクが可能な最短のURL(短縮URLではなく)を作成してクリップボードに入れます。

HTMLの解析については、いつものHTMLReader Framework(https://github.com/nolanw/HTMLReader)を利用しています。そのため、Script DebuggerからExportしたEnhanced Appletとして動作するように想定しています。

正直なところ、やり方はいくつもありますし、プログラム内容もやっつけで書いているので見るに堪えない部分はあるのですが、実際に動作する日常的なScriptなんてこんなもんだろうかと。

本Scriptは、日本のAmazon(amazon.co.jp)のURLを対象に処理していますが、他国のAmazon用に書き換えるのもとくに難しくはありません。

Google Chromeなど他のWebブラウザ用に改変するのもとくに難しくないので、試してみるといいのではないでしょうか。

AppleScript名:最前面に表示中のAmazonのページから製品リンクURLを抽出する_v2.scptd
—
–  Created by: Takaaki Naganoya
–  Created on: 2026/03/01
—
–  Copyright © 2026 Piyomaru Software, All Rights Reserved
—

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

property NSString : a reference to current application’s NSString
property NSPredicate : a reference to current application’s NSPredicate
property HTMLDocument : a reference to current application’s HTMLDocument
property NSMutableArray : a reference to current application’s NSMutableArray

–URL Check
set uRes to retURLFromActiveSafariTab() of me
if uRes does not start with "https://www.amazon.co.jp" then return –change each location’s Amazon URL

set aURL to getProductURLFromAmazon() of me
if aURL = "" then return

set bURL to current application’s |NSURL|’s URLWithString:aURL
set aList to bURL’s pathComponents()
aList’s removeObjectAtIndex:1 –2番目のアイテムを削除

set bList to aList as list
set bLen to length of bList
if bLen is not equal to 3 then return

if contents of item 1 of bList is not equal to "/" then return
if contents of item 2 of bList is not equal to "dp" then return

set aScheme to bURL’s |scheme|() as string
set aHost to bURL’s |host|() as string

set resURL to aScheme & "://" & aHost & "/" & (contents of item 2 of bList) & "/" & (contents of item 3 of bList)

set the clipboard to resURL
beep 1

on getProductURLFromAmazon()
  –Get HTML Source
  
set hRes to retHTMLSourceFromActiveSafariTab() of me
  
  
  
set aHTML to current application’s HTMLDocument’s documentWithString:(hRes as string)
  
set linkList to (aHTML’s nodesMatchingSelector:"link")
  
  
log linkList
  
  
repeat with i in (linkList as list)
    set j to contents of i
    
    
set aProp to (j’s attributes’s valueForKeyPath:("rel")) as string
    
    
if aProp = "canonical" then
      set resURL to (j’s attributes’s valueForKeyPath:("href"))
      
return resURL as string
    end if
    
  end repeat
  
  
return ""
end getProductURLFromAmazon

on retHTMLSourceFromActiveSafariTab()
  tell application "Safari"
    if running then
      if (every document) = {} then return false
      
tell front document
        set htmlRes to source
      end tell
    else
      return false
    end if
  end tell
  
  
set aStr to current application’s NSString’s stringWithString:htmlRes
  
set aNFC to (aStr’s precomposedStringWithCanonicalMapping()) as text –Normalize Text
  
return aNFC
end retHTMLSourceFromActiveSafariTab

on retURLFromActiveSafariTab()
  tell application "Safari"
    if running then
      if (every document) = {} then return missing value
      
tell front document
        set htmlRes to URL
      end tell
    else
      return missing value
    end if
  end tell
end retURLFromActiveSafariTab

★Click Here to Open This Script 

Posted in URL | Tagged 15.0savvy 26.0savvy Safari | Leave a comment

翻訳テスト

Posted on 3月 25 by Takaaki Naganoya

翻訳対象の文と、翻訳先の言語コード(2文字コード)を指定すると、macOS内のサービスを呼び出して翻訳して返します。

翻訳を司るTranslation.frameworkはAppleScriptObjCから呼び出せないため、Swiftを介して呼び出してみました。

実際に、AppleScriptObjCから呼び出すことも試みてみたのですが、結局できず……逆に、この手の処理はAppleScriptから呼び出せると有用性が高いもののはずなので、呼び出せないことに納得が行かず、いろんな方法を試行。

実行処理を考えると、AppleScriptバンドル書類内にSwiftからビルドした実行バイナリを入れて呼び出す方が速くてよいのですが、実行環境の多さを考慮してテキスト形式のSwiftを組み込むようにしてみました。

AppleScript名:翻訳テスト_v5.scptd
—
–  Created by: Takaaki Naganoya
–  Created on: 2026/03/25
—
–  Copyright © 2026 Piyomaru Software, All Rights Reserved
—

set targetLang to "ja"
set textList to {"Stay hungry, stay foolish.", "Innovation distinguishes between a leader and a follower."}
set sRes to translateList(targetLang, textList) of me
–>
(*
"飢え続け、愚かであり続けてください。
イノベーションはリーダーとフォロワーを区別します。"
*)

on translateList(targetLang, textList)
  — 引数の組み立て
  
set argString to targetLang
  
repeat with aText in textList
    set argString to argString & " " & (quoted form of aText)
  end repeat
  
  
— Swiftソースコード
  
— 実行速度と安定性を考慮し、RunLoopを使用して非同期完了を待機します
  
set shellCmd to "swift – " & argString & " <<’EOF’
import Foundation
import Translation
import NaturalLanguage

let args = CommandLine.arguments
guard args.count >= 3 else { exit(1) }

let targetLanguage = args[1]
let textsToTranslate = Array(args.dropFirst(2))

let recognizer = NLLanguageRecognizer()
recognizer.processString(textsToTranslate.joined(separator: \" \"))
guard let identifiedLanguage = recognizer.dominantLanguage?.rawValue else { exit(1) }

let source = Locale.Language(identifier: identifiedLanguage)
let target = Locale.Language(identifier: targetLanguage)

// 翻訳実行フラグ
var isFinished = false

Task {
let session = TranslationSession(installedSource: source, target: target)
do {
let requests = textsToTranslate.map { TranslationSession.Request(sourceText: $0) }
let response = try await session.translations(from: requests)
for result in response {
print(result.targetText)
}
} catch {
fputs(\"Error: \\(error.localizedDescription)\\n\", stderr)
}
isFinished = true
}

// 非同期処理が完了するまでRunLoopを回して待機する
while !isFinished {
RunLoop.main.run(until: Date(timeIntervalSinceNow: 0.1))
}
EOF"

  
  
try
    — do shell script は標準出力が返るまで待機します
    
set translatedResults to do shell script shellCmd
    
return translatedResults
  on error errMsg
    error "翻訳エラー" & return & errMsg
  end try
end translateList

★Click Here to Open This Script 

AppleScript名:翻訳言語コードを取得.scpt
—
–  Created by: Takaaki Naganoya
–  Created on: 2026/03/25
—
–  Copyright © 2026 Piyomaru Software, All Rights Reserved
—

set langList to returnLangCodes() of me
–> {"ar", "de", "en", "es", "fr", "hi", "id", "it", "ja", "ko", "nl", "pl", "pt", "ru", "th", "tr", "uk", "vi", "zh"}

on returnLangCodes()
  set shellCmd to "swift – <<’EOF’
import Foundation
import Translation

Task {
let availability = LanguageAvailability()
let supportedLanguages = await availability.supportedLanguages

// languageCode(ja, enなど)のみを抽出し、重複を除いてソート
let codes = Set(supportedLanguages.compactMap { $0.languageCode?.identifier }).sorted()

for code in codes {
print(code)
}
exit(0)
}

RunLoop.main.run(until: Date(timeIntervalSinceNow: 5))
EOF"

  
  
try
    — 言語コードを改行区切りで取得
    
set supportedCodes to do shell script shellCmd
    
    
— リスト形式に変換
    
set oldDelims to AppleScript’s text item delimiters
    
set AppleScript’s text item delimiters to string id 13
    
set codeList to text items of supportedCodes
    
set AppleScript’s text item delimiters to oldDelims
    
    
— 結果を表示
    
if (count of codeList) > 0 then
      return codeList
    else
      error "言語コードが見つかりませんでした。"
    end if
    
    
set the clipboard to (codeList as string)
  on error errMsg
    error "取得エラー" & return & errMsg
  end try
end returnLangCodes

★Click Here to Open This Script 

Posted in Natural Language Processing Swift Text | Tagged 26.0savvy | 2 Comments

Finder上で選択中のHEIC画像から位置情報を削除_v5

Posted on 3月 17 by Takaaki Naganoya

Finder上で選択中のHEIC画像から位置情報(緯度、経度)を削除するAppleScriptです。

JEPGのようにEXIF情報を編集するのとはHEIC画像の構造が異なるため、方法については試行錯誤の最中です。いろいろ試してみたところ、HEICの解析を行なっても仕様を追いきれなかったので、メモリ上にHEIC画像を読み込んで、HEIC画像でファイルに書き出し直しています。

また、画像の回転状態を元画像から取得して、自動回転させ、元画像と回転状態を維持しています。

NSImageにHEIC画像を読み込んでファイル書き込みするという方法でも、問題なく処理できることでしょう。

AppleScript名:Finder上で選択中のHEIC画像から位置情報を削除_v5.scptd
—
–  Created by: Takaaki Naganoya
–  Created on: 2026/03/16
—
–  Copyright © 2026 Piyomaru Software, All Rights Reserved
—

on run
  tell application "Finder"
    set targetFilesList to selection as alias list
  end tell
  
  
if targetFilesList is {} then
    display alert "エラー" message "FinderでHEICファイルを選択してください。"
    
return
  end if
  
  
set successfulReconstructions to 0
  
  
repeat with currentFile in targetFilesList
    set posixPathString to POSIX path of currentFile
    
    
if (posixPathString ends with ".heic") or (posixPathString ends with ".HEIC") then
      set isProcessed to my redrawImageMaintainingOrientation(posixPathString)
      
if isProcessed then
        set successfulReconstructions to successfulReconstructions + 1
      end if
    end if
  end repeat
  
  
display notification (successfulReconstructions as string) & " 個のファイルの位置情報を削除しました。" with title "位置情報抹消完了"
end run

on redrawImageMaintainingOrientation(posixPath)
  — Swiftプログラム
  
— 1. 画像データ(CGImage)と回転情報のみを抽出
  
— 2. 新しい画像として書き出し、回転情報を再設定
  
— 3. GPS情報は一切含めない
  
set swiftSource to "
import Foundation
import ImageIO
import CoreGraphics

let path = \"" & posixPath & "\"
let url = URL(fileURLWithPath: path)

guard let source = CGImageSourceCreateWithURL(url as CFURL, nil),
let type = CGImageSourceGetType(source) else { exit(1) }

let count = CGImageSourceGetCount(source)
// 元のファイルに新規作成(上書き)としてDestinationを準備
guard let destination = CGImageDestinationCreateWithURL(url as CFURL, type, count, nil) else { exit(1) }

for i in 0..<count {
// 1. 画像データのみを抽出
if let cgImage = CGImageSourceCreateImageAtIndex(source, i, nil) {

// 2. 新しいプロパティを作成(空の辞書)
let freshProperties = NSMutableDictionary()

// 3. 元のメタデータから「回転情報」だけを取得して引き継ぐ
if let oldProps = CGImageSourceCopyPropertiesAtIndex(source, i, nil) as? [String: Any] {
// 回転情報 (kCGImagePropertyOrientation)
if let orientation = oldProps[kCGImagePropertyOrientation as String] {
freshProperties[kCGImagePropertyOrientation as String] = orientation
}

// カラープロファイル (ColorModel) も維持しないと色が変わるため引き継ぐ
if let colorModel = oldProps[kCGImagePropertyColorModel as String] {
freshProperties[kCGImagePropertyColorModel as String] = colorModel
}
}

// 4. 回転情報は維持し、GPSを含まないプロパティで画像を書き込む
CGImageDestinationAddImage(destination, cgImage, freshProperties as CFDictionary)
}
}

if CGImageDestinationFinalize(destination) {
exit(0)
} else {
exit(1)
}
"

  try
    do shell script "swift -e " & quoted form of swiftSource
    
return true
  on error
    return false
  end try
end redrawImageMaintainingOrientation

★Click Here to Open This Script 

Posted in geolocation Image Swift | Tagged 26.0savvy | Leave a comment

住所ジオコーダー2026年最新版

Posted on 3月 16 by Takaaki Naganoya

AppleScriptから住所ジオコーダー/逆住所ジオコーダーの機能にアクセスして日常的に利用していますが、セキュリティ機能の強化によって旧来の機能にアクセスできなくなりつつあります。

住所ジオコーダー系の機能については、さまざまな方法でアクセスできるようにしてきましたが、どうやらmacOS 27あたりでさらにセキュリティ縛りがきつくなることが想定されます。

さまざまな方法を検討した結果、

・SwiftでCLIツールを作ってAppleScriptバンドル内に入れてdo shell scriptコマンドで呼び出す

これは実際にNFCタグの操作Scriptを作った際に試した方法です。問題はないのですが、これだと実行できないAppleScriptの実行環境もあるので、なるべく1つのAppleScript内で完結したいところです。

・AppleScript内に文字列でSwiftのプログラムを記述し、do shell scriptコマンド経由で「swift」(/usr/bin/swift)を呼び出して実行させる

今回はこれを採用してみました。AppleScript実行プログラム側のセキュリティ設定次第ですが、環境を選ばずに実行できるはずです。なお、Script Debugger上では動作しません。

AppleScript名:住所から緯度、経度を返す(Swift版).scpt
—
–  Created by: Takaaki Naganoya
–  Created on: 2026/03/16
—
–  Copyright © 2026 Piyomaru Software, All Rights Reserved
—

set myAddress to "東京都新宿区西新宿2丁目8−1"

set gRes to my geocode(myAddress)
set {aLat, Along} to parseByDelim(gRes, "|") of me
–> {"35.6894863", "139.6917052"}

on geocode(addressString)
  set swiftSource to "
import CoreLocation
import Foundation

let address = \"$TARGET$\"
let geocoder = CLGeocoder()
var completed = false
var resultString = \"Error: Timeout or Access Denied\"

geocoder.geocodeAddressString(address) { placemarks, error in
if let loc = placemarks?.first?.location {
resultString = \"\\(loc.coordinate.latitude)|\\(loc.coordinate.longitude)\"
} else {
resultString = \"Error: \\(error?.localizedDescription ?? \"Unknown\")\"
}
completed = true
}

// 5秒間、結果を待機しながらランループを回す
let timeout = Date(timeIntervalSinceNow: 5.0)
while !completed && Date() < timeout {
RunLoop.current.run(mode: .default, before: Date(timeIntervalSinceNow: 0.00001))
}

print(resultString)
"

  return my runSwift(swiftSource, addressString)
end geocode

on runSwift(source, targetValue)
  set finalCode to my replaceText("$TARGET$", targetValue, source)
  
try
    — ヒアドキュメントで実行
    
return do shell script "swift – <<’EOF’" & return & finalCode & return & "EOF"
  on error errMsg
    return "実行エラー: " & errMsg
  end try
end runSwift

on replaceText(s, r, t)
  set AppleScript’s text item delimiters to s
  
set textItems to every text item of t
  
set AppleScript’s text item delimiters to r
  
set res to textItems as string
  
set AppleScript’s text item delimiters to ""
  
return res
end replaceText

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

★Click Here to Open This Script 

AppleScript名:緯度経度から住所を返す(Swift版).scpt
—
–  Created by: Takaaki Naganoya
–  Created on: 2026/03/16
—
–  Copyright © 2026 Piyomaru Software, All Rights Reserved
—

— サンプル座標(東京都庁付近)
set myCoords to "35.6894863|139.6917052"
set gRes to my reverseGeocode(myCoords)
–> "東京都新宿区東京都庁"

———————————————————
— ハンドラ: 緯度|経度 -> 住所
———————————————————
on reverseGeocode(latLonString)
  set swiftSource to "
import CoreLocation
import Foundation

let input = \"$TARGET$\"
let parts = input.components(separatedBy: \"|\")

guard parts.count == 2,
let lat = Double(parts[0].trimmingCharacters(in: .whitespaces)),
let lon = Double(parts[1].trimmingCharacters(in: .whitespaces))
else {
print(\"Error: Invalid input format\")
exit(1)
}

let location = CLLocation(latitude: lat, longitude: lon)
let geocoder = CLGeocoder()
var completed = false
var resultString = \"Error: Timeout or No Data\"

geocoder.reverseGeocodeLocation(location) { placemarks, error in
if let p = placemarks?.first {
// 都道府県 + 市区町村 + 地番・ビル名などを結合
let addr = \"\\(p.administrativeArea ?? \"\")\\(p.locality ?? \"\")\\(p.name ?? \"\")\"
resultString = addr
} else {
resultString = \"Error: \\(error?.localizedDescription ?? \"Unknown\")\"
}
completed = true
}

// 5秒間、結果が返るまでランループを回す
let timeout = Date(timeIntervalSinceNow: 5.0)
while !completed && Date() < timeout {
RunLoop.current.run(mode: .default, before: Date(timeIntervalSinceNow: 0.00001))
}

print(resultString)
"

  return my runSwift(swiftSource, latLonString)
end reverseGeocode

———————————————————
— Swift実行サブシステム
———————————————————
on runSwift(source, targetValue)
  set finalCode to my replaceText("$TARGET$", targetValue, source)
  
try
    — ファイルを作らず標準入力から実行
    
return do shell script "swift – <<’EOF’" & return & finalCode & return & "EOF"
  on error errMsg
    return "Error: " & errMsg
  end try
end runSwift

on replaceText(s, r, t)
  set AppleScript’s text item delimiters to s
  
set textItems to every text item of t
  
set AppleScript’s text item delimiters to r
  
set res to textItems as string
  
set AppleScript’s text item delimiters to ""
  
return res
end replaceText

★Click Here to Open This Script 

Posted in geolocation Swift | Tagged 26.0savvy | Leave a comment

NFCタグリーダー/ライターの情報+タグ情報を取得

Posted on 3月 9 by Takaaki Naganoya

MacにUSB経由で接続したNFCタグリーダー/ライターの情報、およびそのリーダーに接触しているNFCタグの情報を取得するAppleScriptです(Apple Silicon Mac用、Intelバイナリはなし)。


▲音楽CD型のNFCタグ(おもちゃ) Apple Musicの配信先URLを記録しておくと、iPhoneにタッチするとApple Musicがオープンする仕組み

NFC関連の情報を取得するmacOS内のフレームワークは、CryptoTokenKitです。

最初は、これをAppleScriptObjCから直接呼び出すことを試みていたのですが、呼び出してオブジェクトを生成した段階でつまづいたので、ASOC経由で直接機能を呼び出すことには早々に見切りをつけました(↓できてもよさそうなのに)。

AppleScript名:NFCカードリーダーの存在確認_v1.scpt
use AppleScript version "2.8"
use scripting additions
use framework "Foundation"
use framework "CryptoTokenKit"

— リーダーの接続確認(ダメ!)
set cardManager to current application’s TKSmartCardSlotManager’s defaultManager()
if cardManager = missing value then
  display alert "リーダーが見つかりません。接続を確認してください。"
  
return
end if

set allSlots to cardManager’s slotNames()

if (count of allSlots) > 0 then
  display notification "リーダーを認識しました: " & (item 1 of allSlots) with title "NFC Ready"
else
  display alert "リーダーが見つかりません。接続を確認してください。"
end if

★Click Here to Open This Script 

このため、CryptoTokenKitフレームワークの機能を呼び出す部分はSwiftで記述したコマンドライン・ツールを用意し、AppleScriptバンドル内に格納してdo shell scriptコマンド経由で呼び出すことにしてみました。

Xcodeプロジェクト化してSwiftのプログラムを直接呼び出す方式でもよかったのですが、確実に呼び出せることを重視して前述の方式に。

–> Download Script Bundle within nfc_reader_writer cli tool

NFCタグリーダー/ライターを操作

日本市場で実績があって入手しやすいNFCリーダー/ライターはソニーのRC-S300一択という状況なので、ほぼ決め打ちでこの機種を想定してもよいのですが、海外市場がどんな状況になっているのかはわかりません。

本プログラムではMacに接続されているNFCリーダー/ライターの製品名(readerName)、NFCタグがスキャン範囲内にあるか?(tagReady)、NFCタグリーダー/ライターが書き込み可能かどうか(canWrite)、NFCタグの属性データ(atr)を取得できます。

–> {{readerName:”SONY FeliCa Port/PaSoRi 4.0″, tagReady:true, atr:”3B8F8001804F0CA0000003060300030000000068″, canWrite:true}}

NFCタグリーダー/ライターが複数接続されている場合にも対処するようになっていますが、複数台のリーダーで動作確認は行なっていません。

かるくUSのAmazonでNFCリーダー/ライターを検索してみたところ、ほぼ同様の仕組みのデバイスが流通していることを確認しました。

現在までにできていること

一応、NFCタグリーダー/ライターの存在確認(本プログラム)、NFCタグへのデータ書き込み(URLだけで確認)、NFCタグからのデータ読み込み……と、ひととおり、Swift+AppleScriptの組み合わせで実現できています。

ただ、どう考えても全MacユーザーがNFCタグリーダー/ライターを購入して利用する姿は想像しにくいため(MacにNFCリーダー/ライターが標準搭載される未来はたぶん来ない。キーボードやマウスだと可能性はゼロではないかも)、iPhoneを併用して、これでNFCタグを読み込んだり、データ書き込みする利用スタイルを想定しています。つまり、iPhoneでNFCタグを読み取ると、Macに通知が飛んでMac側でAppleScriptによって処理を行う流れになります(そんなに難しくないので、ほぼ実現できる)。

iPhone上でショートカット.appを用いてNFCタグの読み込みに応じて実行されるアクションを作成し、iCloud Drive経由でテキストデータを書き込み。Mac側でFolder Actionを用いて内容を読み取る……という流れを想定しています(ただし、自分が使っているのがiPhone 7なのでまだ実現していません……このアクションにはiPhone X以降が必要とのこと)。

このため、読み込みについてはiPhoneでスキャン→Macで実行というスタイルを考えています。書き込みについてはMac側で、ということになるでしょう(iPhone側でもできるようですが、運用上ちょっと混乱しそうなので)。

つまり、本プログラムを核としたテストプログラムのほとんどは「無駄」になってしまいそうなところです。技術的な調査がひととおり行えた、という意味では意義はあるのかもしれません。難しくなさそうなのに、セキュリティでがんじがらめなのでちょっと残念さを感じます。

AppleScript名:reader_list_v3.scptd
—
–  Created by: Takaaki Naganoya
–  Created on: 2026/03/09
—
–  Copyright © 2026 Piyomaru Software, All Rights Reserved
—

set rRes to getNFCReaderList() of me
— {{readerName:"SONY FeliCa Port/PaSoRi 4.0", tagReady:true, atr:"3B8F8001804F0CA0000003060300030000000068", canWrite:true}}

on getNFCReaderList()
  set mePath to POSIX path of (path to me)
  
set listTool to quoted form of (mePath & "Contents/Resources/nfc_list")
  
  
— plist文字列を取得
  
set xmlData to do shell script listTool
  
  
— Property List Dataとしてパース
  
tell application "System Events"
    set plistItems to make new property list item with data xmlData
    
set readerList to value of plistItems
  end tell
  
  
set outList to {}
  
  
— 取得したリストをパース
  
repeat with aReader in readerList
    — plistのキーに基づき値を取得
    
set rName to |name| of aReader
    
set rStatus to status of aReader
    
set rAtr to atr of aReader
    
set rCanWrite to can_write of aReader
    
    
if rStatus is "present" then
      set tmpRec to {readerName:rName, tagReady:true, atr:rAtr, canWrite:rCanWrite}
    else
      set tmpRec to {readerName:rName, tagReady:false, atr:rAtr, canWrite:rCanWrite}
    end if
    
set the end of outList to tmpRec
  end repeat
  
  
— 呼び出し元の想定に合わせて、最初のリーダーのレコードを返します
  
if (count of outList) > 0 then
    return outList
  else
    return {readerName:"", tagReady:false, atr:"", canWrite:false}
  end if
end getNFCReaderList

★Click Here to Open This Script 

Posted in NFC System | Tagged 10.15savvy 26.0savvy | Leave a comment

CotEditor v6.2.3でfolder documentが追加されるが……

Posted on 2月 25 by Takaaki Naganoya

CotEditor v6.2.3がリリースされ、AppleScript用語辞書に「folder document」クラスが追加されました。

AppleScript用語辞書では6箇所の変更点が検出されるのですが、folder document以外はすべて説明文の内容変更です。

folder documentは、CotEditorがフォルダごとオープンして、フォルダ階層自体をオープンして個別のファイルをいちいちオープンしなくても編集できるようにしたもの、のようです。

ただ、このfolder documentの操作を試みても、一切操作できません。

AppleScript名:folder documentをカウントする(できない).scpt
tell application "CotEditor"
  set dCount to count every document
  
set fdCount to count every folder document
  
–> error "CotEditorでエラーが起きました: every folder documentを取り出すことはできません。" number -1728 from every folder document
end tell

★Click Here to Open This Script 

カウントできないし、current documentも取得できないし、できないことづくしです。

AppleScript名:folder documentからcurrent documentを取得.scpt
tell application "CotEditor"
  tell front folder document
    set cDoc to current document
  end tell
end tell

★Click Here to Open This Script 

たぶん、これについては何もチェックも行われていないものなのでしょう。

フォルダ階層ごと書類にできるというべきなのか、windowの下に複数のdocumentがぶら下がっているというものなのか……試行錯誤の最中のようなので、まだこのfolder documentに手を出すべきではないのでしょう。

フォルダごと扱ってprojectっぽい扱いをしたいとか、markdownエディタ的な挙動を行いたいのか、といった理解はしてみますが、画像のビューワーも実装されている割にはrtfのプレビューもできません。

Posted in Object control | Tagged 15.0savvy 26.0savvy CotEditor | Leave a comment

音量計測テスト v3

Posted on 2月 25 by Takaaki Naganoya

Macの本体搭載マイクから音声入力を行い、音量を計測するAppleScriptです。0.1秒間隔で10秒ほど音量を計測してリストに出力します。

音量計測は割と事前の知識が必要なディープな処理で、システム側で想定されている最大音量を0dbとして、その値からの相対値で結果が出力されます。本Scriptでプラスの値が出ていたら、それは手を叩いたり騒音を出したりと瞬間的に大きな音(実際に録音したものを聞くと、おそらく音割れしている)が入力された場合です。

計測値はマイナスの値で出力されるため、一般的なスマホ上で動く騒音計アプリが出力する正の値(db)とくらべ違和感があります。

このマイナスの値が出てくると実用性を感じません。

ただ、これをプラスの値として出すためには、何らかの値(基準値)を足す必要があり、これは実際に無響室でMacの実機を持ち込んで基準となる音量を出しつつ計測するしかないでしょう。

機種ごと、同一機種でも製造年ごとに使用されているマイクの特性も異なるでしょうし、経年変化でマイクの穴にホコリが詰まって音量の「感度」が変化してしまうことでしょう。

無響室にかたっぱしから稼働中のマシンを叩き込んで計測するわけにもいかないので、同一機種の同一モデルで環境音もしくはスピーカーから出した音をマイク計測することで「聞こえ方」の変化の平均値を求めて経年変化などを実測していくしかないのでしょう。

なんといったらよいのか、ひたすらめんどくさいです。とりあえず、現状ではこのままです。

AppleScript名:音量計測テスト v3.scptd
—
–  Created by: Takaaki Naganoya
–  Created on: 2026/02/25
—
–  Copyright © 2026 Piyomaru Software, All Rights Reserved
—

use AppleScript version "2.8"
use framework "Foundation"
use framework "AVFoundation"
use scripting additions

property recorder : missing value

— 定数の直接定義(結局、ASの数値の桁数が足りなくて直接書いている。ここに残していることにメモ以上の意味はない)
property kAudioFormatAppleLossless : "1634492771" as integer — ’alac’
property AVAudioQualityMax : 127

–db値が入る
script vS
  property vList : {}
end script

on run
  setupRecorder() of me
  
if recorder is missing value then return
  
  
  
— 10秒間、0.1秒おきに音量を取得
  
repeat 100 times
    set tmpV to my getVolumeLevel()
    
set the end of (vList of vS) to tmpV
    
delay 0.1
  end repeat
  
  
recorder’s |stop|()
  
  
return (vList of vS)
  
–> {-47.89, -22.7, -26.29, -30.39, -34.0, -37.11, -39.87, -42.53, -43.21, -39.55, -34.34, -37.54, -27.52, -31.54, -34.65, -36.6, -38.25, -39.7, -41.37, -42.49, -43.89, -38.54, -33.26, -36.65, -39.36, -38.74, -34.47, -37.4, -39.25, -33.12, -36.15, -39.61, -42.5, -35.92, -35.52, -35.85, -38.02, -39.5, -34.86, -39.01, -41.89, -39.15, -37.5, -40.11, -38.1, -35.4, -33.35, -33.85, -35.76, -33.14, -35.21, -35.7, -35.41, -36.55, -33.9, -35.97, -38.45, -36.65, -38.02, -34.14, -35.98, -32.51, -34.71, -37.47, -37.34, -41.38, -39.31, -36.95, -37.92, -34.59, -37.82, -40.41, -43.67, -43.61, -40.3, -34.22, -35.49, -39.51, -43.57, -46.11, -42.36, -41.3, -45.14, -44.23, -38.4, -41.63, -34.71, -37.4, -40.76, -36.16, -39.49, -36.28, -38.27, -39.19, -39.04, -38.36, -39.51, -41.33, -39.5, -42.18, -48.23, -23.73, -27.04, -30.32, -33.36, -36.33, -36.51, -34.89, -38.28, -38.68, -40.08, -41.9, -34.01, -36.47, -32.51, -33.97, -36.79, -34.06, -35.58, -33.09, -36.67, -40.52, -40.13, -37.82, -41.57, -29.71, -32.41, -35.6, -37.91, -34.2, -37.36, -38.87, -38.14, -37.83, -39.65, -33.56, -34.82, -37.31, -35.34, -37.54, -40.05, -42.1, -40.33, -42.72, -45.63, -47.98, -46.96, -45.58, -39.56, -42.37, -44.01, -46.82, -46.01, -41.52, -33.35, -35.45, -34.2, -38.14, -31.96, -35.11, -38.16, -28.24, -32.52, -36.5, -39.57, -41.86, -41.61, -41.71, -43.3, -46.6, -49.13, -51.6, -50.43, -52.44, -37.73, -38.41, -40.31, -32.89, -33.74, -36.4, -40.21, -44.22, -33.76, -36.73, -39.96, -37.03, -37.05, -40.48, -37.44, -40.84, -44.45, -47.59, -32.53, -35.72, -37.82, -39.66, -37.11, -39.43, -37.51, -39.47}
end run

on setupRecorder()
  try
    set tempDir to current application’s NSTemporaryDirectory()
    
set filePath to (tempDir as text) & "vol_monitor.caf"
    
set fileURL to current application’s |NSURL|’s fileURLWithPath:filePath
    
    
set labelList to {current application’s AVFormatIDKey, current application’s AVSampleRateKey, current application’s AVNumberOfChannelsKey, current application’s AVEncoderAudioQualityKey}
    
    
set valueList to {"1634492771" as integer, "44100.0" as real, 1, 127}
    
    
set recordSettings to current application’s NSDictionary’s dictionaryWithObjects:valueList forKeys:labelList
    
    
set {theRecorder, theError} to current application’s AVAudioRecorder’s alloc()’s initWithURL:fileURL settings:recordSettings |error|:(reference)
    
    
if theRecorder is missing value then
      error (theError’s localizedDescription() as text)
    end if
    
    
set my recorder to theRecorder
    
    
recorder’s setMeteringEnabled:true
    
recorder’s |prepareToRecord|()
    
    
— マイク入力の開始
    
set success to recorder’s |record|()
    
    
if not success then
      display alert "エラー" message "録音の開始に失敗しました。"
    end if
    
  on error errMsg
    display alert "Setup Error" message errMsg
  end try
end setupRecorder

on getVolumeLevel()
  if recorder is missing value then return -160
  
  
recorder’s updateMeters()
  
  
— 平均音量(dB)を実数として取得
  
set dbLevel to recorder’s averagePowerForChannel:0
  
  
— 小数点以下2桁に丸めて文字列として返す
  
set roundedDb to (round (dbLevel * 100)) / 100
  
  
return (roundedDb)
end getVolumeLevel

★Click Here to Open This Script 

Posted in Sound System | Tagged 15.0savvy 26.0savvy | Leave a comment

macOS 26.3リリース〜AppleScript関連のバグ修正状況は?

Posted on 2月 13 by Takaaki Naganoya

本日リリースされたmacOS 26.3におけるAppleScript関連の既知のバグの修正状況をまとめてみました。

■Finderのempty trashで発生するエラー
→ 修正されています。

■System Events/Screen Saver preferencesのバグ
→ 修正されていません(継続発生中)

■Xcode 26.x上でAppleScriptObjCプロジェクトにAppleScript(.scpt)を組み込んで、ASオブジェクト(dateなど)をパラメータにして呼び出した場合のバグ
→ 修正されていません。

Posted in Bug | Tagged 26.0savvy | Leave a comment

Pagesの現在+6ページ分しかページ上のオブジェクトにアクセスできないバグが修正される

Posted on 2月 6 by Takaaki Naganoya

Pages v15.1ことPages Creator Studio v15.1において、従来のPages v14.x系のAppleScript系のバグが修正されていました。

AppleScriptの処理系のバグではなく、Pages側のバグで、タイトルにも書いていますが、

「現在のページ+6ページ上しかページ上のオブジェクトにアクセスできない」

というものです。この、「現在のページ」をAppleScript側から変更できればよいのですが、Pagesではそれはできません(強引にメニュー操作しなければ)。よって、ページ移動をメニュー操作で行いながら、操作対象のページに移動するという処理しかできていませんでした。

Pages Creator Studio v15.1+macOS 26.3β上では、問題なく6ページを超える範囲のページ上のオブジェクトにアクセスできているように見えます。propertiesを取得して、カウントして、内容を書き換えるテストをパスしています。

ただ、こうして検証用のAppleScriptを見直してみると、汎用オブジェクトへのアクセスを行う「iWork item」という用語(必須。ないと困る)が、「Creator Studio」という名前と合っていないような気がしないでもありません。

意味的には「general purpose item」とかいうあたりが正しいんでしょうけど、「creator studio item」とかいうんでしょうか。

–> Sample Pages Doc

AppleScript名:ページ上のアイテムへのアクセス上限チェック(バグ解消チェック).scpt
tell application "Pages Creator Studio"
  tell front document
    set pCount to count every page
    
    
count every iWork item of every page
    
  end tell
end tell

★Click Here to Open This Script 

AppleScript名:ページ上のアイテムへのアクセス上限チェック(バグ解消チェック2).scpt
tell application "Pages Creator Studio"
  tell front document
    set pCount to count every page
    
    
repeat with i from 1 to pCount
      tell page i
        set tList to every table
        
        
if length of tList > 0 then
          set aTable to first item of tList
          
          
–表のセル内容を書き換え
          
tell aTable
            set aProp to properties –とくに意味なし
            
            
set cCount to count every row
            
repeat with ii from 1 to cCount
              tell row ii
                tell cell 1
                  set value to "9"
                end tell
              end tell
            end repeat
          end tell
          
        end if
        
      end tell
    end repeat
  end tell
end tell

★Click Here to Open This Script 

Posted in Bug | Tagged 26.0savvy Pages Creator Studio | Leave a comment

ignoring時の超高速化にともなう処理内容の信頼性低下のその後 part 2

Posted on 2月 4 by Takaaki Naganoya

Numbersの選択中の範囲のセルに対して連続値で数値書き込みするAppleScriptにおいて、非同期実行モードでも勝手に処理を打ち切る、という不具合の改修がNumbers Creator Studio v15.1+macOS 26.3betaで行われていることを確認しました。

その話の補足です。

自分のテスト環境(MacBook Air M2 16GB)において、10万セル(10000行x10列)選択してselection rangeを取得する処理を行なったところ、

のように、エラー-1741のエラーになりました。これが、

(1)selection/selection rangeというコマンド自体の仕様限界
(2)Numbersがselectionを取得する際の限界

なのかは不明ですが、10万セルだと無理であることを確認しました。

結局、エラーが出ない範囲を探ってみたところ「7万310」セルの選択取得とシーケンシャル値で埋める処理は実行できました。7万320セルだとエラーになります。

アプリの内部処理的に問題がある場合にはエラーを返してくれたほうがよいので、これはこの動作で問題ないと考えます。アプリ側の処理的に上限はあるということでよいでしょう。

Posted in Bug | Tagged 15.0savvy 26.0savvy Numbers Numbers Creator Studio | Leave a comment

ignoring時の超高速化にともなう処理内容の信頼性低下のその後

Posted on 2月 4 by Takaaki Naganoya

重要な内容なのですが、話が入り組んでいるので、順に説明します。

AppleScriptの非同期実行モード

AppleScriptでアプリケーションを操作する場合には、コマンド発行、アプリ側の処理待ち、処理結果を返す、という動作が行われます。いわゆる同期実行で行われます。

一方で、処理内容の結果はいらないからコマンド実行だけ高速に行わせてくれという「非同期実行」モードもAppleScriptの登場初期から用意されており、これがignoring application responses〜end ignoring節です。

shell scriptやCocoa呼び出しでは意味がありませんが、macOS上のGUIアプリを操作する場合には、非同期実行で行えばおおよそ半分以下の処理時間で済みます。

非同期実行モードは、書類上に大量のオブジェクトを作成するような操作を行うときに便利で、事前に何度も確認を行なっておいて、まあ多分大丈夫でしょう、という確信が持てた場合に、処理速度向上のために部分的に導入しています。

処理結果を取得したいとか、確実に終了したことを確認したい場合には使用できませんが、それでも導入できる「部分もある」のです。

Numbers v14.x+macOS 15.xの組み合わせで起こる 問題現象

この非同期実行が、Numbers v14.xとmacOS 15.xの組み合わせで実行したときに問題現象を起こしています。

電子書籍「AppleScript最新リファレンス v2.8対応」でも詳しく言及しているのですが、この環境で非同期実行を行うと、腰が抜けるほど高速な反面、処理が完結しない(勝手に途中で処理を打ち切ってしまう)という問題動作が見られました。

つまり、処理速度を重視してignoringで非同期実行すると、勝手に途中で処理が打ち切られます。Numbers上で5万個のセルを選択して、非同期実行モードで連続値で埋めるというAppleScriptを実行すると、2〜3万セルぐらいで処理が中断されます(macOS 15.7.4+Numbers 14.5で28880セルで打ち切り)。

知っていて使う分には「1万セルずつ処理しようか?」という話にはなるのですが、知らずに処理して「セルが埋まっていなかった」だとダメージが大きすぎです。

非同期実行モードの処理速度が異様に速くなっていたので、「どうせ何か副作用があるんだろう」と思って検証してみたら、予想通りこのトンでもない欠陥が見つかったというわけです(Appleのエンジニアにありがち)。詳細にバグレポートし、動向を見守ることにしました。

Numbers Creator Studio v15.1で修正

このNumbersのヤバい動作が新たな「Numbers Creator Studio」(v15.1)でどうなっているのか、macOS 26.3β環境で確認してみたところ、なんと修正されていました。うれしい誤算です。

Screenshot

5万セル選択してテストAppleScriptを実行すると、5万セルがきちんと連続値で埋められていました。

処理時間は以前よりもかかるようになったのですが、それでも「勝手に放り出さなくなった」というのは大いに評価できます。

これが、10万セルだとどうなのかとか、macOS 15.7.4+Numbers Creator Studio v15.1の組み合わせで問題はないのかとか、少々気になるところではありますが、その点は未検証であるということを明記しておきます。興味がある方はお試しください。

Posted in Bug | Tagged 15.0savvy 26.0savvy Numbers Numbers Creator Studio | Leave a comment

Keynote->Keynote Creator Studio(以下同様)

Posted on 1月 29 by Takaaki Naganoya

Keynote v14.5、Pages v14.5、Numbers v14.5がリリースされました。これらは従来のiWork Appsの最終バージョンと位置付けられています。

これからは、Keynote/Pages/Numbersは「Keynote Creator Studio」「Pages Creator Studio」「Numbers Creator Studio」に改称されました。Finder上で表示されている名前は従来どおり「Keynote」ですが、実際の名前は「Keynote Creator Studio」です。

バージョンは3つとも統一で「15.1」です(2026年1月29日現在)。

BUndle IDも変更されており、

Keynote:com.apple.iWork.Keynote
Keynote Creator Studio:com.apple.Keynote

となっています。Pages Creator Studioもcom.apple.Pages、Numbers Creator Studioもcom.apple.Numbersに変更されています。

このため、Keynote用のAppleScriptをKeynote Creator Studio用に使用する際には、tell applicationの名前を書き換える必要があります。iTunes–>Musicの時のように自動で書き換えられたりはしないはずです。両方がインストールされている状態ではそうなりますが、Keynote Creator Studioだけがインストールされている環境では違っているのかも(ダイアログで「どのアプリケーションか?」と聞かれて自動で書き換えられるかも)。

AppleScript用語辞書的に、従来のiWork Appsから変更された点はありません。

AppleScript名:Keynote Creator Studio.scpt
tell application "Keynote Creator Studio"
  properties
  
–> {frozen:true, class:application, playing:false, version:"15.1", slide switcher visible:false, name:"Keynote", frontmost:false}
end tell

★Click Here to Open This Script 

AppleScript名:Pages Creator Studio.scpt
tell application "Pages Creator Studio"
  properties
  
–> {frontmost:false, class:application, name:"Pages", version:"15.1"}
end tell

★Click Here to Open This Script 

AppleScript名:Numbers Creator Studio.scpt
tell application "Numbers Creator Studio"
  properties
  
–> {frontmost:false, class:application, name:"Numbers", version:"15.1"}
end tell

★Click Here to Open This Script 

既刊の電子書籍については、アイコンや画面キャプチャなどの差し替えを行う感じでしょうか。前述のとおりAppleScript用語辞書の内容は変更されていないため、プログラム内容については修正の必要は(tell applicationの対象名以外は)ありません。

iWork AppsのKeynote/Pages/Numbersを、Creator Studio版のアプリが入った状態で起動すると、古いバージョンを削除してもいいよと表示されます。新しいバージョンを使うことを推奨しているようです。

とくに新バージョンに不安はないのですが(画面のデザインは思いっきり違和感ありまくりですが)、これまでの経験上、まだ従来バージョン(バグはあっても少なくともおかしな挙動はしない)を残しておくべきだと感じます。なにせ、相手があのAppleなので。

→ 書き換えが面倒だったので、iWork Appsのほうを削除してみました。iWork Apps用のAppleScript書類をオープンすると、Apple Creator Studio用に自動でtellブロックが書き換えられました。

Posted in news | Tagged 15.0savvy 26.0savvy Keynote Numbers Pages | Leave a comment

Apple Creator Studioに含まれるKeynote/Pages/Numbersは新バージョン?

Posted on 1月 14 by Takaaki Naganoya

Final Cut Pro、Pixelmator Pro、Logic Pro、Motion、Compressor、MainStage、Keynote、Pages、Numbers、フリーボードをサブスク(月額1,780円 年17,800円)で利用できる「Apple Creator Studio」が発表されました。映像・音楽系の作業を中心に行なっているユーザーには、よくできたスイーツです。

Adobe Creative Cloudと比べて、映像系はまあまあ、音楽系は優勢、画像系はちょっと落ちる(CMYKサポートがないので)、ページデザインについては冗談みたいな雰囲気です(Adobe InDesignとPagesを比較するなんて、恐れ多くて話題にもならない)。

既存のKeynote/Pages/Numbersについてもそのまま提供されるとのことですが、アイコンが明確に異なっているので現行の14.4のアップデート版である15.xが提供されるということでしょうか(現時点では何も明確な情報はありません。)。

Apple Creator Studioに含まれるKeynote/Pages/Numbersについては、「プレミアムコンテンツ」(テンプレートや素材?)、Apple Intelligenceを活用するAI機能(いつもの作文ツールとか。実体はほぼない)が追加利用できることが明記されています。

これまでにも、「特定のセル数の表が作れない」といったオリジナリティあふれるバグを山のように作られましたが、これからはもっと画期的なバグを作ってくれるのでしょうか? ワクワクと震えが止まりません。

Posted in news | Tagged 26.0savvy Apple Creator Studio Keynote Numbers Pages | Leave a comment

Post navigation

  • Older posts

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

Google Search

Popular posts

  • シンプルな文字置換
  • macOS(Mac OS X/OS X)上のAppleScriptの歴史
  • Apple Creator Studioに含まれるKeynote/Pages/Numbersは新バージョン?
  • 最初期に書かれた書籍「AppleScript道入門」の序文をいま振り返る
  • Claris FileMaker Pro 2025(v22)がリリースされた
  • 指定フォルダ内から指定拡張子のファイルを取得し、エイリアスだったらオリジナルのパスをPOSIX pathで取得
  • MacBook Air/MacBook Proのディスプレイ開閉角度を取得
  • ASCII ART QR Encoder
  • macOS 15.7.2 スクリプトメニューから実行できなくなった地図系ライブラリ?
  • Adobe InDesignのAppleScript実行エンジンがCarbonからCocoaベースに書き換えられる
  • 暗黙のuseコマンド
  • 「AppleScriptセキュリティ実践ガイド」を発売
  • 開始時刻から終了時刻までhh:mm形式の文字列を15分単位でリスト出力
  • 各種GUIアプリ書類のオープン速度を向上するためにUIアニメーションの一時停止を
  • ASCII ARTで円を線で描く
  • Finder上で選択中のHEIC画像から位置情報を削除_v5
  • Keynote->Keynote Creator Studio(以下同様)
  • ASCII ARTで直線を引く v3.1
  • FSFindFolder failed with error=-43
  • 2025年に書いた価値あるAppleScript

Tags

10.11savvy (1101) 10.12savvy (1242) 10.13savvy (1391) 10.14savvy (587) 10.15savvy (440) 11.0savvy (283) 12.0savvy (212) 13.0savvy (204) 14.0savvy (159) 15.0savvy (172) 26.0savvy (51) CotEditor (68) Finder (53) Keynote (123) 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 (80) Pages (58) Safari (45) Script Editor (27) WKUserContentController (21) WKUserScript (20) WKWebView (23) WKWebViewConfiguration (22)

カテゴリー

  • 2D Bin Packing
  • 3D
  • AirDrop
  • AirPlay
  • Animation
  • Apple Inteligence
  • 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
  • Newt On Project
  • NFC
  • 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
  • Scripting Additions
  • sdef
  • search
  • Security
  • selection
  • shell script
  • Shortcuts Workflow
  • Sort
  • Sound
  • Spaces
  • Spellchecker
  • Spotlight
  • SVG
  • Swift
  • System
  • Tag
  • Telephony
  • Text
  • Text to Speech
  • timezone
  • Tools
  • Update
  • URL
  • UTI
  • Web Contents Control
  • WiFi
  • XML
  • XML-RPC
  • イベント(Event)
  • 未分類

アーカイブ

  • 2026年8月
  • 2026年7月
  • 2026年6月
  • 2026年5月
  • 2026年3月
  • 2026年2月
  • 2026年1月
  • 2025年12月
  • 2025年11月
  • 2025年10月
  • 2025年9月
  • 2025年8月
  • 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