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

Newt On Project〜Story Archive #2 インテリジェントな環境を構築するもうひとつの要素~SOAP

Posted on 10月 4 by Takaaki Naganoya

Newtonの環境は単なる電子手帳のレベルではなく、アプリケーションやデータファイルを抽象化して、ユーザーに存在を意識させないことを指向したものでした。



Newtonの開発がすべてキャンセルされ、販売が終了して数年が経過した今となっても、その思想を超える環境はいまだなく、MacOS Xへの統合が果たされることを夢見ているユーザーも少なくはないことでしょう。



しかし、Appleの開発チームはMacOS X環境の構築に予想よりも手こずりました。最初に登場したMacOS X 10.0では十分な完成度を持たせられず、MacOS X 10.1でようやく「MacOSらしさ」と「UNIXのファンクション」のバランスがハーモニーを奏でるレベルになってきました。実際のところ、使ってみるとかなりいい感じです。



しかし、「MacOS Xらしさ」という意味では、まだその片鱗が垣間見えてきたというレベルでしょうか。MacOSらしい使い勝手とUNIXらしい強靱な足回り。では、その先にあるべき「MacOS Xらしさ」とは何でしょう?

 

既存のメタファーを真似るだけの「まねっこマシン」として振る舞うだけでなく、それを超える何かが欲しいところです。はさみツールで画像を切り抜くがごとく、1つの命令で1つのアクションをこなす「文房具」的な動作ではなく、1つの指示で100でも1000万でも命令をこなすような「インテリジェントな」動作を行ってほしい。


……そこに加わるべき「インテリジェントなエッセンス」こそ「Newton」のフレーバーではないかと、「えせNewtonプロジェクトチーム」は考えています。


怪人Sal Soghoain、2年前に思わせぶりなセリフを残す

えせNewtonの構成要素のひとつが、AppleScriptと周辺アプリケーションであることは前回に説明しました。

MacOS標準搭載の言語解析エンジンをパーサーとして、命令とパラメータを認識。必要な命令を補助アプリケーションに投げて実行させれば、Newtonもどきな環境は作れるのではないだろうか、というのがその内容でした。



実は、AppleScript製品担当のSal Soghoianが2年前に来日したときに、直接本人に聞いたことがあります。



Piyomaru:言語解析エンジンを介して、簡単な文章を認識し、AppleScriptのリクエストをオンザフライで自動生成し、擬似的にインテリジェントな環境は作れるように見える。そういう研究はしていないのか?



Sal:Newtonのような環境のことを言っているのだろうが、具体的なことは答えられない。ただし、AppleScriptの自動生成については研究をしている。



……悩ましいお返事(^-^; また、彼はこのようにも言っていました。



Sal:MacOS XのAppleScript環境では、MacOS以外の機器をコントロールできるようになる

……

このときには、家電コントロールのX-10を標準採用(現在はサードパーティのOSAXが必要)する程度かと考えていたものです。しかし、その種明かしは2001年7月のMacWorld Expo NYで唐突に行われました。


怪人Sal Soghoian、Seybold Seminorsで「SOAP!」と吠える

それが、MacOS Xで採用された非同期分散オブジェクト環境「SOAP」(Simple Object Access Protocol)。

アプリケーションへのイベントを投げる際に、MacであればAppleEventの形で「特定のアプリケーション」の「特定のオブジェクト」に対して「特定のリクエスト」が発行されます。これをAppleTalkもしくはAppleTalk over TCP/IPで他のMacに投げるわけですが、オフィスの他のマシンであっても地球の裏にいるマシンであっても非常に簡単にリクエストを投げられるものの、その相手はあくまでMacに限られてしまいます。

これを、MacOS以外のマシンに対して環境を問わずに行えるよう規格化したのがSOAP。AppleTalkではなくオープンなTCP/IPを用いて、イベントの内容はXMLで投げます。

「Salが言っていたのは、これのことだったのか! 

しかし、なんで基調講演のステージでイエーとかウオーとか叫びまくってんだこの人は!!(^-^;」

Seyboldの基調講演では、実際にMacOS X 10.1のAppleScriptを用いて、SOAP経由でサーバーにリクエストを投げて、気象条件に基づいてIllustrator上に作られた全米の地図を色分けするデモがSal Soghoianによって行われ、来場者の拍手喝采を浴びていました。



以後、SOAP関連のドキュメントを漁り、情報収集にいそしむ毎日。そして、このSOAPが「えせNewton」実現のためのキーとなるテクノロジーのひとつになることを確信しつつあります。

MacOSに載っていないアプリケーションについては、他のOS上に実装されているアプリケーションを利用。非インテリジェントなアプリケーションを組み合わせてインテリジェントな環境を擬似的に作れる(かもしれない)SOAPの思想は、AppleScriptをその源流に持つだけあってMacユーザー(というよりも、AppleScriptユーザー)にはなじみやすいでしょう。



誤解を恐れずに言ってしまえば、「 バカを100人集めて組織化することで1人の天才以上の力を発揮させるという発想」といえば分かりやすいでしょうか。……なんかちがうか、、、 


現在のSOAPに欠けている要素

しかし、SOAPの規格を調べれば調べるほどに、まだこの規格が「使いもの」になるレベルに達するには幾年かの熟成が必要であることが分かってきました。



イベントを投げる相手がどのようなアプリケーションを用いるかについては抽象化されているので、それがDB2であろうとORACLEであろうとINFORMIXであろうと別に構わない。しかし、そのデータなりアプリケーションがどこにあるかを「明示的に」示さなくてはならない。これがやっかいです。



「どこに何があるか」を集中的に管理するサービスが不在なので、これをまとめて管理する必要が早晩生じるでしょう。

また、その「何」を指し示す際には言語(英語とか日本語とか)の差異を吸収できる仕組みが必要。

リクエストを行うXMLの中に言語タイプが指定できるので、それを基にパラメータを翻訳して渡すとか。

 DNSのような分散データベースであっても、Sherlockのようなクライアント側で複数のサーバーに対して串刺しリクエストを行うタイプであってもよいが、リクエストを投げる相手自体を抽象化できるとうれしい。



そして、SOAPによるリクエストをうまくキューイングして負荷分散を行う仕組みも必要となってくるでしょう。大規模なシステムでXMLベースのリクエストを大量に流した場合の検証はまだまだこれからといったところ(IBMやMicrosoftやHPがすでに実験を行っている可能性はある)?



また、広域にユーザー認証できるシステムも必要。リクエストがどこかのサーバーのSOAPベースアプリケーションを通るたびにユーザー名とパスワードをキーボードから入力させられてはたまらないですから(そんな風に実装するとは思えませんが、一応)。



ただし、これらの仕組みが出来上がれば、エージェント的な動作が非インテリジェントなアプリケーションの組み合わせで実現できることでしょう。


えせNewtonの実現した姿は……?

えせNewtonを実現するのに現代のありとあらゆるテクノロジーを動員するのは、いささか大げさと取られるかもしれません。

しかし、実際のところNewtonにこめられた思想を「本気で」実現するにはまだまだ不足気味です。



おそらく、初期のえせNewtonは、インターネットに常時接続されたPowerMac G4の上に、一般的なアプリケーションを組み合わせて実現されるでしょう(ViaVoiceでコントロールしているかもしれない)。

そして、それを見たデベロッパーが着想を得て、もっと小振りなアプリケーションで再構成し、iBookやPowerBookでも使いものになるレベルに達するに違いありません(?)。



しかし、それでも小型の持ち運びできるデバイスにその環境を集約できるかどうかは定かではありません。

AppleがPowerBookをさらに小型化することは考えにくいので……下手をすると、フロントエンドの部分はPalmか何かのデバイスを用いて、これがインターネット経由で自宅に置いてあるPowerMacにリクエストを投げ、PowerMacが処理を行って結果だけ返す形になるかもしれません。



ちょっとだけ風呂敷を広げてみましたが、実際のところは着実に「できること」から手を付けていくのが正しいのでしょう。

とにかく、スクリプタブルなアプリケーションのうち「欠けているもの」を補っていくことが最優先課題であろうかと。



ただ、それがひじょうに地味で地道な作業であるだけに、このようなロードマップを書いておくことが肝要と思っている次第(^-^;。

Posted in Natural Language Processing Newt On Project | Tagged 10.1savvy | Leave a comment

Newt On Project〜Story Archive #1 始動

Posted on 10月 4 by Takaaki Naganoya

Appleが世界に先駆けて商品化したPDA(Personal Digital Assistant)、「Newton」(ニュートン)。

市場の評価は悪くはなかったものの、会社の方針転換で販売終了となり、いまでは中古でしか入手できません。

Newtonに採用された技術はなかなかのもので、一度さわってみると「なぜこの使用感をMacOSに取り入れない?」と疑問に思ってしまうほど。

Newtonのクールでナイスな操作感覚

Newtonで「すげーなー」と感心させられるのは、スケジュールの予約。「Meet Takamatu Saturday」と入力して(どこぞのPDAのように升目に入力なんていわず、画面全部を使って入力。漢のPDAといえるでしょう)、アシストボタンを押すと……

 Meet……スケジュール予約なんだな

 Takamatu……住所録からTakamatu氏を検索して

 Saturday……こんどの土曜日かー

と、勝手に解釈してスケジュール予約をしてくれます。時間と場所が抜けていれば、それをどうするかも聞いてきます。
すばらしい。ペン入力はこのさいどうでもいいので、このようなインテリジェントかつアバウトなクエリーを受け付けるソフトを作れないものか……そう考えた人は少なくないはずです。

Newton復活の要素はすでにある?!

よくよく考えてみると……個別のパーツはすでに身の回りに転がっていることに気付きます。

アプリケーションの間を取り持つグルー(糊)言語であるAppleScript。MacOS標準登載の言語解析エンジン、AppleScriptから操作可能なスケジューラー、あと抜けているのは……曜日を計算する「カレンダー計算機」とでも呼ぶものだけです。

仕事柄、Info-macのCD-ROMをすべてひっくり返したり、世界中のダウンロードサイトからダウンロードしまくって、スクリプタブルな(AppleScriptから操作可能な)アプリケーションの調査を行っています。

たまに、とんでもないソフトがスクリプタブルだったりして(モールス信号の解読プログラムとか、PDP-11のエミュレータとか)、腰を抜かすこともあるのですが……その一方で、「なぜ、このジャンルでスクリプタブルなものが存在しないのだ?」と、首をひねってしまうことも。

そうした意味で、よくよく調べてみたら……「カレンダー」にスクリプタブルなものが存在しないことが分かりました。Newtonライクなソフト「なんちゃってNewton」を作るための要ともいえるソフトが世界中さがしてもないということです。なんてこったい!

スクリプタブルなカレンダーを作っちゃえ!

Office:mac付属のEntourageはスクリプタブルじゃないか! という指摘はあるかもしれません。しかし、あれは単にスケジュールとか住所録とかメールの機能だけで、カレンダーとして期待するような機能はいっさい実装されていないのが現状です。マイクロソフトさん、そこんとこひとつよろしくぅ!(^ー^;

それでは、スクリプタブルなカレンダーというものに、どういう機能が実装さるべきかを考えてみることにしましょう。

基本的には、カレンダーがらみの「計算」を行ってくれるもの、ということがいえましょう。

next Saturday……次の土曜日の日付けを返す。もちろん、月曜日から日曜日まで指定可能
10 days after……(今日から)10日後の日付けを返す。afterとbeforeの日付けの相対指定
today in next year……来年の今日の情報を得る。33年前の自分の誕生日の情報を得たりもできる
left in this month……今月の残り日数を得る
left in this month in business……営業日で今月の残り日数を得る。公的な休日や会社や個人の休日については、別ファイルに記述しておく。「in business」オプションは、その他の相対日時指定にも使用可能
get calendar in this month……指定月のカレンダーをテキスト形式で取得
age from "1968/8/8" to today……指定日からの年令(期間)計算。

といったところでしょうか。

強力な助っ人、強力な製品!

……ということを友人のありたゆきお氏に話したら「えっ、そんなもんでいいの?」ということに。くぅー作れる人間は言うことが違う! さらに、IBMがViaVoiceの新版を発売。えせNewtonプロジェクトも急に盛り上がりを見せてきました。

……そんなわけで、ペン入力でなく音声入力でNewtonライクなことができないかというプロジェクトが本格的に始動しつつあります。途中でコケても、その成果物はそれなりに意味がある?!

Posted in Natural Language Processing Newt On Project | Tagged 10.1savvy | Leave a comment

Newt On Project〜Story Archive 0

Posted on 10月 4 by Takaaki Naganoya

2002年にAppleScriptで、現在のSiriのようなシステムを作ってデモを行っていました。

そもそも、本Blog「AppleScriptの穴」は、このNewt On Projectで作った膨大なAppleScirptを分解して掲載し、macOSのアップデート時の差異から動作しなくなることを防ぐべく、一般に公開することで動作しない場合のレポートによりメンテナンスすることを目的として設立したものです。そのために、初期からカレンダー計算系のScriptが異様に充実していたのです。

このNewt On Projectの件については、国内外で紹介してきましたが、MacScripter.netの管理人から「その時代にAppleScript Studioは登場していない。あんたは嘘つきだ!」となじられました。

たいへんに失礼な話であり、自分の知識のなさと想像力の欠如と技術力のなさを棚に上げて「嘘つき」呼ばわりとはたいしたものです(私をMacScripter.netでBanした本人が、こうして根拠薄弱な個人攻撃をするとはお笑い草です)。

当時、AppleやMicrosoftの人間やら、一般のMacユーザーの前で何度もデモを行なってきているので、それをなかったことにしようとは。

さらに、ムービーに映っているメニュー左上には「Word」と表示されているのがわかります。目が見えていればそれも認識できることでしょう。このScriptはMicrosoft Wordをフロントエンドとして、Microsoft Word v.Xの日本語形態素解析の機能を活用して動作していました。逆をいえば、Microsoft Office v.XのWordに過度に依存していたために、メジャーアップデートで機能構成が変わって(日本語形態素解析機能をAppleScriptから利用できなくなって)、動作できなくなりました(AppleScript Studio上に試作品なども作っていたのですが、自分が求める機能に自分の実装レベルが追いつけなかった記憶があります)。

現在、2002〜2003年ごろに書いたNewt On Projectの記事アーカイブについてはWeb上に残されていません。そのため、そうした心無い人々が「嘘だ」と言ったとしても、実際に動くバイナリとYouTube上のムービーしか残っていない状態です(ちょっと前にedama2さんが実際に動かして遊んで驚いていました)。

そのため、過去の記事ではありますが、Newt On Projectの成り立ちや実際のデモ風景などをまとめた記事アーカイブを掲載しておくことにしました。

–当時の活動履歴(2002〜2003)

2003/5/24 Apple Users Group Meeting/Tokyoにて、Newt On、漢字Talkerなどをデモ。

2003/5/4~5 iWeek 2003に出展。Newt On、漢字Talkerのデモを実施。漢字Talker開発途上版CDを販売。

2003/2/23 GUI Scriptingの応用例として、デモンストレーションをApple Users Group Meeting/Tokyoで実施。CCDカメラからの入力映像でモーションを検出すると、iChatで報告するAppleScriptを紹介。→ 記事

2003/1/25 楽器のユーザーインタフェース例として、JaminatorのデモをApple Users Group Meeting/Tokyoで実施。とかく煩雑になりがちな音楽系のインタフェースが、ここまで簡単にできるという好例として紹介→ 記事

2002/11/30 プロジェクトの方向性や問題について話し合うための緊急ミーティングが開催されました。→ 記事

2002/10/29 「Mac People」誌10/29発売号のP-11に、大谷和利さんのコラム「People Watching」でNewt Onが紹介されています。「OS Xが疑似人工知能に! Newtonを超えるNewt On」というタイトルです。なんと、目次の次の記事ということで、最初は見つけられませんでした(^-^; 付録CD-ROMにはNewt Onと一般初公開のNewt Off.(なんと、Web公開よりも前にCD収録)が入っています。ぜひ書店にてお買い求めください。

2002/10/26 Apple Users Group懇親会で、PowerMate(ボリウム式コントローラ)、Keyspan Digital Media Remote(Macを動かす赤外線リモコン)、Zeph IR!(家電コントロール用の赤外線コントローラ)のデモを行いました。また、PowerMateでNewt Off.のコマンド認識機構を呼び出すデモなども実施。

2002/9/末 Apple Users Group懇親会で、Newt Off.のデモをPowerMac G4 1.2Gデュアルを使って行いました。

2002/9/8 AUGST in Tokyoにて「Newt Off.」のデモを実施。その様子をレポートにまとめました。→ 記事

2002/8/23 SSFactory氏による「Newt Off.」の一般配布版のバイナリがNewt Onプロジェクトメンバー向けに公開されました。ドキュメントを整備したのちに一般配布のはこびとなります。本バージョンでは、Newt Off.の所有者認識、顔グラフィックによるより進歩したビジュアルフィードバック、現在もっとも高レベルにある日本語コマンド解析機能などが盛り込まれています。Newt Off.については、office v.Xさえあれば誰でもすぐに試せるものです(公開に向けてプロジェクト内での検証作業中)。

2002/8/17 Newt On/Newt Off.ともに各種DB処理にファイルメーカーPro以外のデータベースを使用して高度な処理を行えるようAppleScriptの書き換えを準備中。現時点で試験実装しているのは、Valentina。 

2002/8/10.11 名古屋で行われたAUGST in 名古屋で、Newt On/Newt Off.をデモしました。Newt Off.で「今年のクリスマスイブの夜にデート」などの高度なスケジュール予約を披露。→ デモムービー 

2002/8/7 Newt On/Newt Off.用の、カレンダー計算を行う重要なコンポーネント「Calendar Scripting」を、鈴木@MacLab.氏の助言により、きちんと日本語表示や処理が行えるようになりました(そのままでは、Mac OS X上のASのバグのせいで日本語処理が破綻)。これによって、デモ時にClassic環境の起動が不要に。

2002/8/3,4 仙台で行われたAUGST in 仙台でNewt Onと、本邦初公開の「Newt Off.」(office v.X向けカスタムバージョン)をデモしました。

 「今年のクリスマスイブの夜にデート」
 「15時からミーティング」

など、Newton顔負けの日本語コマンドを認識! Entourageのスケジュール予約を念頭に置いて作られた開発途上バージョンのNewt Off.でしたが、その高度な日本語認識機能を披露。

もっとイベント全体に人が集まっていればよかったのですが(^-^; それでも、見てくださった方にはもれなくインパクトを与えたようです。

2002/7.27 アップルUsers Group懇親会にて、Newt Onをデモ。

現段階のMacを原始的な「電卓レベル」であるとし、われわれはこれをインテリジェントな「ドラえもん」のレベルに持っていくプログラム(=Newt On)を作っている、と説明。

内容について駆け足でご紹介しましたが、最後には大きな拍手をいただきました。

AUGSTの仙台、名古屋、東京の各会場にて、Newt Onのデモを実施いたします。

Posted in Natural Language Processing Newt On Project | Tagged 10.1savvy | Leave a comment

テキストベースの棒グラフ取得

Posted on 9月 27 by Takaaki Naganoya

テキストで作成した棒グラフの生成AppleScriptです。

比較的どうでもいいデータの傾向を知りたい場合に棒グラフ表示させて全体の傾向を把握することが、よくあります。そんなときに、文字だけで作成した棒グラフを生成します。何回か書いたことがあるような気もするのですが、簡単なものを作っておきます。

本Scriptで生成するグラフのタイプは2種類。


▲モノクロ表示用の、同じ文字を重ねて棒グラフを表示するタイプ


▲カラー(色分け)表示用の、絵文字を用いて色分けして棒グラフを表示するタイプ

項目名の最大文字数を求めて、他の項目で文字数が足りない箇所には不足分のスペースを足して、グラフの位置揃えを行なっていますが、このあたりタブで処理するべきなのか。

実際には、Pages書類上で選択しておいたオブジェクトから画像(image)のみピックアップして、それらの幅を集計してグラフ表示するような用途に使っています。

AppleScript名:テキストベースの棒グラフ取得.scptd
—
–  Created by: Takaaki Naganoya
–  Created on: 2025/09/27
—
–  Copyright © 2025 Piyomaru Software, All Rights Reserved
—

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

set bList to {12, 21, 15, 26}
set labelList to {"Aaaa", "Bbb", "Cc", "D"}

set aStr to retCharBarChart(labelList, bList, "|") of me
set aStr to "Name" & tab & tab & "Data" & tab & tab & "Number" & return & return & aStr
display text view aStr main message "Bar chart Sample 1" sub message "Sub Message" with properties {font name:"Courier", size:32, width:800, height:300, color:{0, 255, 128}}
(*
"Name    Data    Number

Aaaa    |||||||||||| 12
Bbb     ||||||||||||||||||||| 21
Cc     ||||||||||||||| 15
D     |||||||||||||||||||||||||| 26
"
*)

set bStr to retCharBarChart(labelList, bList, false) of me
(*
"Aaaa    
🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥 12
Bbb     
🟦🟦🟦🟦🟦🟦🟦🟦🟦🟦🟦🟦🟦🟦🟦🟦🟦🟦🟦🟦🟦 21
Cc     
🟨🟨🟨🟨🟨🟨🟨🟨🟨🟨🟨🟨🟨🟨🟨 15
D     
🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩 26
"
*)

set bStr to "Name" & tab & tab & "Data" & tab & tab & "Number" & return & return & bStr
display text view bStr main message "Bar chart Sample 2" sub message "Sub Message" with properties {font name:"Courier", size:16, width:800, height:150, color:{0, 255, 128}}

–文字ベースで棒グラフを作成するための文字グラフルーチン
on retCharBarChart(labelList, bList, charFlag)
  –ラベル文字の長さをそろえる(文字種類については不問、単に文字数をそろえるだけ)
  
set tMax to maximumItemLengthFromList(labelList) of me
  
  
set resText to ""
  
–set aChar to "■"
  
set aCharList to {"🟥", "🟦", "🟨", "🟩", "🟧", "🟪", "🟫", "⬛️", "❤️", "💙", "💛", "💚", "🧡", "💜", "🤎", "🩶", "🖤", "🔴", "🔵", "🟡", "🟢", "🟠", "🟣", "🟤", "⚫️"}
  
set aCharLLen to length of aCharList
  
  
set iCounter to 1
  
set aCharPointer to 1
  
  
if charFlag = false then
    –ローテーション方式の色文字グラフ
    
repeat with i in bList
      set j to contents of i
      
set aLabel to (contents of item iCounter of labelList) as string
      
set aLabel to paddingSpacesAfter(aLabel, tMax, " ") of me
      
      
set tmpChar to contents of item aCharPointer of aCharList
      
set resText to (resText & aLabel & tab & tab & makeCharRep(j, tmpChar) of me & " " & j as string) & return
      
      
set iCounter to iCounter + 1
      
set aCharPointer to aCharPointer + 1
      
if aCharPointer > aCharLLen then
        set aCharPointer to 1
      end if
    end repeat
  else
    –指定文字で作成する文字グラフ
    
repeat with i in bList
      set j to contents of i
      
      
set aLabel to (contents of item iCounter of labelList) as string
      
set aLabel to paddingSpacesAfter(aLabel, tMax, " ") of me
      
      
set resText to (resText & aLabel & tab & tab & makeCharRep(j, charFlag) of me & " " & j as string) & return
      
      
set iCounter to iCounter + 1
      
set aCharPointer to aCharPointer + 1
      
if aCharPointer > aCharLLen then
        set aCharPointer to 1
      end if
    end repeat
  end if
  
  
return resText
end retCharBarChart

–指定文字を指定回数連結したテキストを返す
on makeCharRep(aNum, aChar)
  set aText to ""
  
repeat aNum times
    set aText to aText & aChar
  end repeat
  
return aText
end makeCharRep

–指定文字列に、指定の長さまで空白文字列を追加
on paddingSpacesAfter(aDat as string, targLen as integer, padStr as {boolean, string})
  set dLen to length of aDat
  
if dLen > targLen then error "Logical error: Target length is shorter than data length"
  
copy aDat to aStr
  
  
set padStr to makeCharRep(targLen – dLen, padStr) of me
  
return aStr & padStr
end paddingSpacesAfter

–1D Listで最長の文字列の文字数を返す
on maximumItemLengthFromList(nList as list)
  script o
    property nl : nList
    
property itemNo : 1
  end script
  
  
set max to length of (item 1 of o’s nl)
  
  
repeat with i from 2 to (count nList)
    set n to length of (item i of o’s nl)
    
if n > max then
      set max to n
      
set o’s itemNo to i
    end if
  end repeat
  
return length of (contents of (item (o’s itemNo) of nList))
end maximumItemLengthFromList

★Click Here to Open This Script 

Posted in dialog | Tagged 13.0savvy 14.0savvy 15.0savvy 26.0savvy | Leave a comment

MacBook Air/MacBook Proのディスプレイ開閉角度を取得

Posted on 9月 23 by Takaaki Naganoya

samhenrigold氏によるLid Angle SensorをCocoa Framework化して呼び出して、MacBook Air/MacBook Proのディスプレイ開閉角度を取得するAppleScriptです。画面角度センサーを持たないMac miniなどで実行した場合には値を返さず処理終了します。


▲左:119度 右:90度 センサーが返してくる値と実際の画面角度の値には若干の「差」がある。0度の開始値が若干画面が開いた状態になっている?

本記事に掲載しているAppleScriptのプログラムリストだけでは実行できないため、下記のリンクからFrameworkバイナリ入りのScript Bundleをダウンロードして実行してください。

Apple Silicon Macでは実行確認していますが、Intel Macで動くかどうかは未検証です。一応、githubのsamhenrigoldの説明によると2019年のMacBook Pro以降で導入されたセンサーとのことで、Intel Macでも当該モデルであれば動作することが期待されます。

ただし、M1 MacBook Air/Proで問題が発生することが報告されているようです(自分は実機で確認していません。センサー値の取得だけなら問題が起きないのか、センサー値の取得で問題が起きているのか)。

同プログラムをCocoa Framework化して呼び出しているため(Universal Binary)、Script Debuggerおよび同環境で書き出したEnhanced Appletなどで実行可能です。

→ Download Script Bundle with Framework

→ Download angleSensorKit Xcode Project

AppleScript名:画面開閉角度センサーの値を取得.scptd
—
–  Created by: Takaaki Naganoya
–  Created on: 2025/09/07
—
–  Copyright © 2025 Piyomaru Software, All Rights Reserved
—

use AppleScript version "2.4" — Yosemite (10.10) or later
use framework "Foundation"
use framework "angleSensorKit" — Created by Sam on 2025-09-06. https://github.com/samhenrigold/LidAngleSensor
use scripting additions

set anASensor to current application’s LidAngleSensor’s alloc()’s init()

set aRes to anASensor’s isAvailable() as boolean
if aRes = false then return —Maybe not MacBook Air/Pro
set sensorVal to anASensor’s lidAngle()

return sensorVal

★Click Here to Open This Script 

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

スクリプトメニューでAirDropが使えない?

Posted on 9月 23 by Takaaki Naganoya

macOS 15/26にて、AirDropをAppleScriptから利用するAirSharing Libを、スクリプトメニューに入れたAppleScriptから呼び出せないという現象に直面しています。

スクリプトエディタ上で動かすと動作するのですが、スクリプトメニューから動かすとまったく動作しません。一般ユーザー向けのAppleScript実行環境であるスクリプトメニューで動作しないのはかなり問題です。

AirSharing LibはもともとSal Soghoianが書いたプログラムにWiFi制御系のコードを追加して書いたものですが、現状のmacOS 15上で動作する最低限の記述だとこんな感じ(↓)です。

スクリプトメニュー上で動作するために、何かの「おまじない」が必要なのか、そもそもスクリプトメニューの仕様上それが禁止されるようになったのか? なかなか不思議なところです。

動作確認できたAppleScript実行環境:
スクリプトエディタ、Script Debugger、Switch Control、Automator、Claris FileMaker Pro 2025、FastScript 3、Xojo 2025

AppleScript名:AirDropTest.scptd
—
–  Created by: Takaaki Naganoya
–  Created on: 2025/09/23
—
–  Copyright © 2025 Piyomaru Software, All Rights Reserved
—

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

property airDropService : missing value

set theFile to POSIX path of (choose file with prompt "AirDropで共有するファイルを選んでください:")

my performSelectorOnMainThread:"shareWithAir:" withObject:(theFile) waitUntilDone:true
–my shareWithAir:theFile–for debug

on shareWithAir:thePOSIXFile
  set theFile to thePOSIXFile as string
  
set fileURL to current application’s NSURL’s fileURLWithPath:(theFile)
  
  
— AirDrop用の共有サービスを取得
  
set airDropService to current application’s NSSharingService’s sharingServiceNamed:(current application’s NSSharingServiceNameSendViaAirDrop)
  
  
if airDropService ≠ missing value then
    airDropService’s performSelectorOnMainThread:"performWithItems:" withObject:{fileURL} waitUntilDone:true
  else
    display dialog "AirDrop共有サービスが利用できません。" buttons {"OK"} default button 1
  end if
end shareWithAir:

★Click Here to Open This Script 

Posted in AirDrop Bug Library | Tagged 15.0savvy 26.0savvy | Leave a comment

各種GUIアプリ書類のオープン速度を向上するためにUIアニメーションの一時停止を

Posted on 9月 22 by Takaaki Naganoya

AppleScriptから各種GUIアプリを操作すると、各種GUIアプリ上の操作に要する時間がそのまま必要になります。端的なところでいえば、書類のオープン時のアニメーションも毎回行われるわけで、割と無意味なアニメーションに、そこそこの時間が消費されています。

そのUIアニメーションを無効化する処理について調査したところ、割と簡単に情報が見つかりました。

ここに掲載しているサンプルAppleScript(要・Metadata Lib)では、Finder上の最前面のウィンドウで選択中のフォルダ以下にあるPages書類をSpotlightの機能を用いてすべてピックアップし、それらを「UIアニメーションあり」「UIアニメーションなし」の条件でオープン/クローズだけ行うものです。

結論をいうと、M2 MacBook Air上で通常のUIアニメーションつきの処理では68秒かかっていたものが、UIアニメーションを無効化するだけで43秒で処理できました(125個のPages書類で実験)。

これはちょうど、M1 MacからM4 Macに買い替えるぐらいの処理速度の向上が、ただUIアニメーションを無効にするだけで実現できたということを意味します。

1書類あたり0.2秒の処理速度向上が見られたわけですが、これが400個の書類を処理するとなれば80秒も変わってくるわけで、割と洒落にならない速度向上が実現できます。もっと早く調べておけばよかったと思うことしきりです。

AppleScript名:UI アニメーションの無効化による速度向上実験.scptd
—
–  Created by: Takaaki Naganoya
–  Created on: 2025/09/22
—
–  Copyright © 2025 Piyomaru Software, All Rights Reserved
—

use AppleScript version "2.4" — Yosemite (10.10) or later
use framework "Foundation"
use scripting additions
use mdLib : script "Metadata Lib"

tell application "Finder"
  set aSel to (selection as alias list)
  
if aSel = {} then
    set origPath to choose folder
  else
    set origPath to (first item of aSel)
  end if
end tell

–SpotlightでPages書類を検出
set aResList to perform search in folders {origPath} predicate string "kMDItemContentType == %@ || kMDItemContentType == %@" search arguments {"com.apple.iwork.pages.sffpages", "com.apple.iwork.pages.pages"}
–return aResList

–UI Animationを許可
set a1Dat to current application’s NSDate’s timeIntervalSinceReferenceDate()
openClosePagesDocs(aResList, true) of me
set b1Dat to current application’s NSDate’s timeIntervalSinceReferenceDate()
set c1Dat to b1Dat – a1Dat

–UI Animationを禁止
set a2Dat to current application’s NSDate’s timeIntervalSinceReferenceDate()
openClosePagesDocs(aResList, false) of me
set b2Dat to current application’s NSDate’s timeIntervalSinceReferenceDate()
set c2Dat to b2Dat – a2Dat

return {c1Dat, c2Dat, length of aResList}

on openClosePagesDocs(aResList, animationF)
  if animationF = true then
    –UI Animationをオンにする
    
try
      do shell script "defaults delete NSGlobalDomain NSAutomaticWindowAnimationsEnabled"
    end try
  else –UI Animationをオフにする
    do shell script "defaults write NSGlobalDomain NSAutomaticWindowAnimationsEnabled -bool NO"
  end if
  
  
–Pages書類を順次オープンしてタイトル(?)を取得
  
set pagesTitleList to {}
  
repeat with i in aResList
    set aFile to POSIX file i
    
    
tell application "Pages"
      open (aFile as alias)
    end tell
    
    
tell application "Pages"
      close front document saving no
    end tell
    
  end repeat
  
  
if animationF = false then
    –UI Animationをオンにする
    
try
      do shell script "defaults delete NSGlobalDomain NSAutomaticWindowAnimationsEnabled"
    end try
  end if
end openClosePagesDocs

★Click Here to Open This Script 

Posted in shell script Spotlight | Tagged 13.0savvy 14.0savvy 15.0savvy Pages | Leave a comment

指定フォルダ内から指定拡張子のファイルを取得し、エイリアスだったらオリジナルのパスをPOSIX pathで取得

Posted on 9月 20 by Takaaki Naganoya

指定フォルダから、指定拡張子のファイルを取得し、取得したファイルがエイリアス書類だったらオリジナルのパスを返すAppleScriptです。

AppleScriptを指定スケジュールで実行するAppleScriptを作成しており、スケジュールフォルダ以下に「毎月15日 15時」といった名前のフォルダを作っておき、その中に入れたAppleScriptを指定スケジュールで実行するようにしてありました。

ただ、フォルダ内に入れるのが「AppleScript書類そのもの」だと、運用上いろいろまずい(同じScriptの複製が大量にできてしまうとか)ので、エイリアスを入れても反応するように、本Scriptを書いてみた次第です。

割とちゃんと動いているように見えます。

2025/9/29修正:
処理対象にエイリアス書類「ではなく」本物のファイルが指定されていた(=エイリアス書類ではなかった)場合にエラーになっていました。作成・使用目的は「エイリアス書類の実体の追跡」ではあったものの、実体のファイルに行き当たった場合にエラーになるのは意図しない動作です。

このため、掲載リストを一部修正しました。

AppleScript名:指定フォルダ内から指定拡張子のファイルを取得し、エイリアスだったらオリジナルのパスをPOSIX pathで取得.scptd
—
–  Created by: Takaaki Naganoya
–  Created on: 2025/09/19
–  Modified on: 2025/09/29
—
–  Copyright © 2025 Piyomaru Software, All Rights Reserved
—

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

set aRoot to choose folder

set scptList to getFilePathListWithResolveAlias(aRoot, "scpt") of me
–> {"/Users/me/Documents/sample2.scpt", "/Users/me/Documents/sample1.scpt"}

on getFilePathListWithResolveAlias(aFol, aExt)
  set aURL to current application’s |NSURL|’s fileURLWithPath:(POSIX path of aFol)
  
# 指定フォルダの直下のファイルを取得
  
set filePaths to current application’s NSFileManager’s defaultManager’s ¬
    contentsOfDirectoryAtURL:aURL ¬
      includingPropertiesForKeys:{current application’s NSURLNameKey} ¬
      
options:(current application’s NSDirectoryEnumerationSkipsHiddenFiles) ¬
      
|error|:(missing value)
  set f0List to filePaths as list
  
if f0List = {} then return {}
  
  
set f2List to {}
  
repeat with i in f0List
    set tmpPath1 to POSIX path of i
    
set tmpPath2 to (my fullpathOfOriginalFileForAlias:tmpPath1)
    
set tmpPath to (current application’s NSString’s stringWithString:(tmpPath2))
    
set the end of f2List to tmpPath as string
  end repeat
  
  
return f2List
end getFilePathListWithResolveAlias

–エイリアスファイルのパスからオリジナルのファイルパス(POSIX Path)を返す
on fullpathOfOriginalFileForAlias:posixPath
  tell current application’s |NSURL|
    set anNSURL to its fileURLWithPath:posixPath
    
set theData to its bookmarkDataWithContentsOfURL:anNSURL |error|:(missing value)
    
set theResult to its resourceValuesForKeys:{current application’s NSURLPathKey} fromBookmarkData:theData
  end tell
  
  
if theResult = missing value then return posixPath
  
  
return (theResult’s objectForKey:(current application’s NSURLPathKey)) as text
end fullpathOfOriginalFileForAlias:

★Click Here to Open This Script 

Posted in File path | Tagged 13.0savvy 14.0savvy 15.0savvy 26.0savvy | Leave a comment

macOS 15.xで自作AppleScriptライブラリの一部がScript Menuから使えなくなったので修正

Posted on 9月 19 by Takaaki Naganoya

X(旧Twitter)上でPiyomaru SoftwareのAppleScriptライブラリについてフィードバックをいただきました。おおよそ改修が済んでいるため、ドキュメントを書き次第、最新版をBlogからダウンロードできるようにしておきます。

こうしたフィードバックを得るために公開しているので、動作しないとか、予想外の動作を行った場合にはフィードバックしていただきたいところです(すぐに対処できる保証はないのですが)。

確認された現象

Piyomaru Software制作のAppleScriptライブラリの一部で、macOS 15.xのスクリプトメニューに呼び出しScriptを入れた場合に実行できないものがありました。その一方で、スクリプトエディタ/Script Debugger上では実行できます。

・AirSharing Lib
・Choose location Lib
・Display Youtube Lib
・Pickup Color Lib

修正して動作するようになった事例

CheckboxLibについては、SDEF中のdocumentからのムービーおよび画像へのリンクを削除。

Enumをas stringでstringにcast処理していた箇所が、スクリプトメニュー上では動作しなくなっていた(→ stringへのcastをやめることで問題解消)。

choose color Libも同様に、Enumをas stringでstringにcast処理していた場所で、スクリプトメニュー上では動作しなくなっていたので修正。

動作条件そのものが変更になったライブラリ

・Display youtube Lib
macOS 15上ではInfo.plistにNSAppTransportSecurityのエントリを追加してアプレット書き出しが必要です。
ただし、macOS 26上ではスクリプトメニュー上で呼び出しScriptを実行しても、問題なくYouTubeムービーの再生が可能です。

問題を解消できていないライブラリ

目下、スクリプトメニューから呼び出すと動作しないライブラリは以下の通り。

・AirSharing Lib
・Choose location Lib

Posted in Library | Tagged 15.0savvy 26.0savvy | Leave a comment

シンプルな文字置換

Posted on 9月 13 by Takaaki Naganoya

AppleScriptで文字置換を行う場合には、いくつかの方法があります。

①text item delimitersを利用する

AppleScriptの登場以来、利用されてきた方法です。AppleScriptの処理系では最速といってよい方法ですが、複数の箇所を一気に置換するのでやや過剰なのと処理方法が独特なので敬遠する人もいるようです。

また、処理対象の文字列のサイズが数Mバイト以上になると、処理が終了しなかったりします。巨大な文字列の置換には⑤が推奨されます。CotEditorのようなScriptableなテキストエディタの機能を利用するのもアリでしょう。

AppleScript名:文字置換(最短).scpt
set origText to "abcdefg"
set targStr to "de"
set repStr to "xx"

set a to repChar(origText, targStr, repStr) of me
–> "abcxxfg"

–Written By Philip Aker
–文字置換ルーチン
on repChar(origText as string, targStr as string, repStr as string)
  set {txdl, AppleScript’s text item delimiters} to {AppleScript’s text item delimiters, targStr}
  
set temp to text items of origText
  
set AppleScript’s text item delimiters to repStr
  
set res to temp as text
  
set AppleScript’s text item delimiters to txdl
  
return res
end repChar

★Click Here to Open This Script 

②shellコマンドを利用する

do shell scriptコマンド経由で置換コマンドを利用する方法です。Mac OS X以降後に利用できるようになったものですが、日本語に対して正確に置換できるのか不安が残るので、個人的にはあまり積極的には利用していません。

③OSAXを利用する

macOS 10.15でサードパーティのOSAX(Scripting Additions)が廃止されたため、現在では利用できません。

④AppleScript Librariesを利用する

Shane StanleyのRegexAndStuffLibなどのライブラリを用いて正規表現を用いた文字置換を利用するものです。

⑤Cocoaの機能を利用する

Cocoaの機能を呼び出して文字置換を行うものです。いくつも利用できる機能があります。正規表現を使うものなど、お好きなものを利用してください。

AppleScript名:ASOCで文字置換5.scptd
— Created 2015-06-30 by Takaaki Naganoya
use AppleScript version "2.4"
use scripting additions
use framework "Foundation"

set a to "あいうえお++かきくけこ"
set b to cleanUpText(a, "+", "●")
–> "あいうえお●●かきくけこ"

on cleanUpText(someText, targStr, repStr)
  set theString to current application’s NSString’s stringWithString:someText
  
set targString to current application’s NSString’s stringWithString:targStr
  
set repString to current application’s NSString’s stringWithString:repStr
  
  
set theString to theString’s stringByReplacingOccurrencesOfString:targString withString:repString options:(current application’s NSRegularExpressionSearch) range:{location:0, |length|:length of someText}
  
return theString as text
end cleanUpText

★Click Here to Open This Script 

これらに加えて、もっと簡単な方法がないかと探してみたら、

⑥offset ofで文字列検索して置換を行う

offset ofで置換対象の文字列を検索して置換を行います。オリジナル文字列に対して置換対象の文字列の位置が「冒頭ではない」「末尾ではない」という条件がそろっていて、かつ置換対象が0ないし1回しか対象文字列中に存在しないことが事前に分かりきっている場合にのみ使えます。

set urlData to "https://www.amazon.co.jp/gp/css/summary/print.html/ref=oh_aui_ajax_invoice"

set anOffset to offset of "/gp/" in urlData
set newURL to (text 1 thru (anOffset + (length of "/gp/") – 1) of urlData) & "legacy" & (text (anOffset + (length of "/gp/") – 1) thru -1 of urlData)

–> "https://www.amazon.co.jp/gp/legacy/css/summary/print.html/ref=oh_aui_ajax_invoice"

★Click Here to Open This Script 

このぐらいで使えますが、本当にすべてのパターンを利用するには、場合分けしつつ書く必要があります。シンプルなはずなのに、シンプルになっていないという。

AppleScript名:単純文字置換.scpt
set urlData1 to "https://www.amazon.co.jp/gp/css/summary/print.html/ref=oh_aui_ajax_invoice"
set newURL1 to replaceOne(urlData1, "/gp/", "/gp/legacy/") of me
–> "https://www.amazon.co.jp/gp/legacy/css/summary/print.html/ref=oh_aui_ajax_invoice"

set urlData2 to "https://www.amazon.co.jp/css/summary/print.html/ref=oh_aui_ajax_invoice/gp/"
set newURL2 to replaceOne(urlData2, "/gp/", "/gp/legacy/") of me
–> "https://www.amazon.co.jp/css/summary/print.html/ref=oh_aui_ajax_invoice/gp/legacy/"

set urlData3 to "https://www.amazon.co.jp/css/summary/print.html/ref=oh_aui_ajax_invoice/gp/"
set newURL3 to replaceOne(urlData3, "https://", "http://") of me
–> "http://www.amazon.co.jp/css/summary/print.html/ref=oh_aui_ajax_invoice/gp/"

on replaceOne(origStr as string, targStr as string, repStr as string)
  set anOffset to offset of targStr in origStr
  
if anOffset = 0 then return origStr
  
set {aLen, bLen} to {length of origStr, length of targStr}
  
  
if anOffset + bLen > aLen then
    –置換対象文字が末尾にある場合
    
set newStr1 to (text 1 thru (anOffset – 1) of origStr)
    
set newStr2 to ""
  else if anOffset = 1 then
    –置換対象文字が先頭にある場合
    
set newStr2 to (text (anOffset + ((length of targStr))) thru -1 of origStr)
    
set newStr1 to ""
  else
    –通常パターン
    
set newStr1 to (text 1 thru (anOffset – 1) of origStr)
    
set newStr2 to (text (anOffset + ((length of targStr))) thru -1 of origStr)
  end if
  
return newStr1 & repStr & newStr2
end replaceOne

★Click Here to Open This Script 

Posted in Text | Tagged 13.0savvy 14.0savvy 15.0savvy 26.0savvy | Leave a comment

macOS(Mac OS X/OS X)上のAppleScriptの歴史

Posted on 9月 9 by Takaaki Naganoya

macOS 26.0のリリース日が公開されそうなので、AppleScriptの歴史年表について書いておきます。

各種電子書籍に掲載している内容ですが、一般にも共有できていたほうがメリットが多そうなので公開しておきます。

マイナーバージョンで発生したバグの件については、すべて掲載できていません。ファイル書き込み時の文字エンコーディングが狂うとか、OSのバージョン番号をまともに返してこないとか。

Mac OS X 10.0(AppleScript v1.6)
◯Classic Mac OS向けに書かれたOSAXを認識しなくなった 
◯Unicode Textを扱えるようになった(as Unicode Text)
◯Mac OS Xのファイル/アプリケーションの新しい仕組み「バンドル」を扱えるようになった 
◯コマンドラインからosascript、osacompile、osadecompile、osalangが使えるようになった 
◯read/writeコマンドで2GB以上のデータの読み書きができるようになった

Mac OS X 10.1(AppleScript v1.7)
◯AppleScript自体の改行コードに、CR+LF(Windows)、CR(Mac)、LF(Unix)の3種類を使えるようになった(ネイティブはCR)
◯プログラムリンクの機能が復活。ただし、AppleTalkによるノード名称の指定はできず、TCP/IPベースに変更される(eppc://)
◯SOAPとXML-RPCの機能がサポートされた
◯拡張子を扱えるようになった
◯アプレット保存時にPowerPC/68kのどちらかのバイナリを選択するようになった

Mac OS X 10.2(AppleScript v1.9)
◯choose URLがWindows系サービスとFTPサーバーに対応
◯Script Menuの機能が単体でダウンロード提供されるようになった
(Folder ActionsがSystem Eventsの管轄にあるなど混乱期)

Mac OS X 10.3(AppleScript v1.9.2)
×AppleScript史上最大最悪のバグ「is in」演算子が使えないバグが発生(→10.3.x台で修正される)
◯AppleScriptおよびアプリケーションがバンドル形式でも保存できるようになった
◯delayに小数点以下の数値が指定できるようになった
(×AppleScriptの処理系のバグがとても多かった暗黒時代)

Mac OS X 10.4(AppleScript v1.10)
◯日本語環境がらみのバグが多数修正されたが、本格的な修正は10.5を待つ必要があった
×バグの指摘から修正まで時間がかかり、このバージョンを経てようやく処理系の安定が図られるようになった
×Finderからファイルパスを取得するとエンコーディングがおかしくなったり、display dialogで日本語がまともに表示できないアプリが存在していたのもこのバージョンまで

Mac OS X 10.5(AppleScript v2.0)
◯文字列をすべてUnicodeで扱うようになった
◯ASCIIキャラクター0〜255だけでなく、Unicodeの広い範囲の文字を取得できるように「text id xxxx」(xxxxは10進数で指定)が新設された
◯日本語の文字を含むファイルパスの取扱いがまともになってきた
◯アプリケーション起動中の状態(running)を取得できるようになった
◯アプリケーションをバンドルIDで指定できるようになった
◯FolderAction SetupがScriptableになった
◯「#」ではじまるコメント行を書けるようになった

OS X 10.6(AppleScript v2.1)
◯「スクリプトエディタ」が「AppleScriptエディタ」と名称変更
◯AppleScriptエディタが「ユーティリティー」フォルダに移動になった
◯AppleScriptエディタ上での構文色分け機能が強化された
◯AppleScript処理系の(ログイン後の)起動が速くなった
→ ただし、逆にログインアイテムに登録したAppleScriptアプレットが正しく実行されないというバグを生んだ。ログインアイテムに登録したAppleScriptアプレットでSystem Eventsを呼び出すと、System Eventsの起動が間に合わず、エラーになったりしていた

OS X 10.7(AppleScript v2.2)
◯AppleScriptエディタにスクリプトテンプレートの機能が追加された
◯AppleScriptエディタ上でAppleScriptObjC(Cocoa AppleScript Applet)を書けるようになった
×64bit版に書き直されたFinder、通称「Cocoa Finder」の動作速度が遅く、とくにファイル処理をFinderに任せると大幅に速度が低下する現象が発生。Scripterの間で「ファイル処理をFinderで行わないという」暗黙の合意が広がった

OS X 10.8(AppleScript v2.2)
◯AppleScriptエディタに「エクスポート」の機能がついた。アプレットはエクスポートして生成するよう変更
◯AppleScriptがOSのSandbox化の機能の影響を受けるようになった

OS X 10.9(AppleScript v2.3)
◯AppleScript 20年来の大改革。ライブラリ機能「AppleScript Libraries」が追加された
◯ユーザーへのNotification Center経由での通知命令「display notification」が追加された
◯AppleScriptObjCのハンドラ記述方式に、Objective-Cに似た記述方式が使えるようになった(Xcode上)
◯AppleScriptエディタでアプレットへのコードサインができるようになった
◯AppleScriptエディタがiCloudに対応し、iCloud上にAppleScriptを保存、iCloudからのAppleScriptの読み込みができるようになった

OS X 10.10(AppleScript v2.4)
◯「AppleScriptエディタ」が名称変更でふたたび「スクリプトエディタ」に
◯スクリプトエディタ上でCocoaの機能を利用するAppleScriptObjCを標準でサポートするようになった
◯プログレスバーの表示機能をサポート
◯「as」による型変換(cast)で複数の型をリストで指定できるようになった
◯AppleScriptObjCのハンドラ記述方式に、Objective-Cに似た記述方式が使えるようになった(スクリプトエディタ上)
◯ハンドラ(サブルーチン)宣言部でパラメータの型指定が行えるようになった
◯無意味句を用いたハンドラ記述した場合に、パラメータ省略時の初期値を宣言できるようになった

×AppleScriptアプレット中でdelayコマンドを利用したときに、正しく時間待ちされないバグ

×AppleScriptとCocoaの間で小数点を含む実数を変換すると小数点以下の値が欠落するバグ
×NSStringとtext、NSStringとstring、NSStringとUnicode textの間でデータ 変換をしたときに、一部の文字が正しく変換されないというバグ(castバグ)
×Folder Actionにバグ。利用者権限に抵触してまともに動作しない(OS X 10.11で修正)

OS X 10.11(AppleScript v2.5)
◯Folder Actionのバグ修正。FSEventsを用いて随時ドロップされたファイルのイベントを受け付けるように処理方式があらためられた(以前は数秒ごとに対象フォルダをチェック する方式)
◯10.10のAppleScriptObjCのバグ修正(cast、enum)
◯AppleScript Librariesのファイルの置き場所を追加(環境変数で指定可能に)
◯より多くのCocoaのデータ型をAppleScriptの型に変換するようになった
◯delayの時間待ち無効バグ修正

macOS 10.12(AppleScript v2.5)
◯パフォーマンス改善のためのバグ修正を実施
×ドロップレットに不具合。ファイルの拡張属性「com.apple.quarantine」がついていると、ファイルが無視される(Script側で対処。以後Apple修正せず)
×Scripting Bridgeの定義ファイルに不具合。Enum「NSNotFound」のブリッジされている定義値が-1にならない(macOS 10.13.1で修正)

macOS 10.13(AppleScript v2.7)
◯セキュリティ関連の修正を実施
◯NSCharacterSet newlineCharacterSet()のようなメソッドでクラッシュしなくなった
◯NSNotFoundのScriptingBridge経由でブリッジされる定義値を-1に修正(macOS 10.13.1)
◯Remote AppleEventsの機能が復旧し、AppleScriptからLAN上の他のマシンの上で動作しているアプリケーションを直接操作できるようになった(起動している必要がある)

◯ScriptingBridge定義ファイルにバグ。PDFKit中のPDFPageのcurrentPage()がブリッジされていない。報告するも未修正(ずっと未修正)

macOS 10.14(AppleScript v2.7)
◯システム環境設定の「アクセシビリティ」>「プライバシー」に、「フルディスクアクセス」「オートーメーション」が新設され、ディスクやリソースへのアクセス、アプリケーションとの通信を管理するようになった。これに伴い、このアプリケーションへのアクセス認証を得ていない場合に発生するエラー(エラーコード-1743)が新設された。
◯サードパーティのOSAXサポートが廃止された
◯スクリプトメニューが、Menu Extraから独立したアプリケーションに変更になった
◯DVDプレイヤーがアプリケーションから補助ツールに格下げになり、AppleScriptからの操作が行えなくなった
◯SIPの機能が強化されセキュリティが強化された。その結果、アプレット内にFrameworkを同梱して配布したり、~/Library/Frameworksに入れたフレームワークをスクリプトエディタが認識しなくなった(事実上、Script Debuggerが必須に)
◯スクリプトエディタのAppleScript用語辞書から「execute」コマンドが削除された
◯住所録(Contacts.app)でプラグインScriptを利用できる機能が削除された(AppleScript用語辞書には残されているが機能しない)

macOS 10.15(AppleScript v2.7)
◯Remote AppleEvents(eppc)経由で他のマシン上のアプリケーションと通信する場合に、同一ユーザー名であることが必要になった。この制限を解除するためには、「defaults write /Library/Preferences/com.apple.AEServer RestrictAccessToUserSession -bool false」の操作をターミナル上で行う必要がある
◯AppleScript専用補助ツール「Image Events」がデフォルト状態ではファイルに一切アクセスできない状態で出荷される(セキュリティ設定によりアクセス可能に。その後のOSバージョンでも修正されない)

◯Cocoa呼び出しを行なった際の実行速度が大幅に低下(→macOS 12で修正)

macOS 11.0(AppleScript v2.7)
◯ARM(Apple Silicon)対応。AppleScript Appletなど実行アプリケーションがすべてApple Silicon/Intel 64のUniversal Binary化
◯Automator Action用に盲腸のように残っていたAppleScript Studioランタイムの廃止が明言される

◯AppleScriptアプレット中にproperty値が保存されなくなった。property値を保存する場合にはUser Defaultsに書き込む必要がある
◯ファイル共有のプロトコルに「afp://」が利用できなくなった。「smb://」に一本化

◯AppleScript書類(.scpt)アイコンが単なるプレーンテキストのものに変わっている(バグなのか本気なのかは不明。macOS 11.x台では修正されない見込み)

◯System Eventsの初回操作時に明示的に「launch」コマンドの実行が必要に(自動起動しない)

◯macOS 11.5において、NSString’s stringWithFormat:メソッドをAppleScriptから呼び出してもクラッシュしなくなった(macOS 11.0〜11.4の間はクラッシュ発生)

◯これまでに書かれたCocoa Scriptingのプログラムで「書き方が間違っているが、許容されてきた」書き方がエラーもしくはクラッシュを引き起こすようになった
×AppleScriptがM1 CPUの高効率コア「Icestorm」で実行されてしまうため、Cocoa Scripting時にIntel CPUにくらべて10分の1〜70分の1程度にパフォーマンス低下(→macOS 12で修正)

macOS 12.0(AppleScript v2.8)
◯ショートカット.appが標準搭載される。ショートカットにAppleScript実行アクションが搭載され、ショートカット中からAppleScript(Cocoa Scripting機能を含む)の呼び出しが可能に
◯ショートカット.appが起動中でなくてもショートカットを実行できるShortcuts Eventsが標準搭載される

◯Piyomaru Softwareの働きかけにより、macOS 10.15で生じたCocoa Scriptingの速度低下、およびmacOS 11で生じたApple Silicon MacのCocoa Scripting速度低下が是正される。Cocoa呼び出し時のAppleScriptの大幅な処理速度向上
◯macOS 12.3、悪意を持って作られたAppleScriptバイナリ(アプレット)のセキュリティ上の問題(CVE-2022-22626)を解消
◯macOS 12.1〜2の間、日本語環境限定で、NSDataDetectorで自然言語テキストから「電話番号」を抽出する機能が動作していなかった(12.3で修正)
◯macOS 12.3、スクリプトエディタのコンテクストメニュー(スクリプトアシスタント表示用)にバグ。項目が複数回表示される(macOS 13で修正)

◯macOS 12.3.1、セキュリティ強化にともなう不具合(Finder上のselectionをオープンすると、ファイルを作成したアプリケーションが起動されないエラーなど)を修正

◯macOS 12.4、AppleScriptアプレットで、入力検証を強化して、領域外読み込みの脆弱性に対処(CVE-2022-26697)。アプリケーションが予期せず終了したり、プロセスメモリが漏洩したりする可能性がある脆弱性に対し、配列境界チェック機能を改善して対処(CVE-2022-26698)。

macOS 13.0(AppleScript v2.8)
◯「システム環境設定」が「システム設定」に。AppleScriptで各種Paneを表示させる機能が動作しなくなった
→ macOS 13.5あたりでmacOS 14同様の機能を実装、機能復旧
◯「Font Book」がAppleScript非対応に
◯「アプリケーションのAppleScript用語辞書をブラウズする方法が、「アプリケーションのアイコンをスクリプトエディタにドラッグ&ドロップする」ものから「アプリケーションのアイコンをスクリプトエディタの「ライブラリ」ウインドウにドラッグ&ドロップもしくは「+」ボタンのクリックで追加するやりかたに変更される(macOS 14で復旧)
×Text To Speech(テキスト読み上げ音声)のIDがすべて変更になる。日本語環境用にSiriのO-renとHattoriが搭載されるが、sayコマンドで使えるようにはなっていない

×AppleScriptからMail.appにメール作成+送信を行うと1通作成ごとに生成されたプロセスがメモリ上から消えず、メモリを食い潰してマシンの処理速度自体が遅くなる
×スクリプトエディタ上で「Cocoa-AppleScript Applet」のテンプレートから作成したアプレットが動作しない問題が発生
◯テキスト読み上げキャラクタのうち一部のキャラクタで名前がローカライズされてしまい、sayコマンドで指定できないバグが発生(日本語環境限定バグ)

macOS 14.0(AppleScript v2.8)
◯「システム設定」のAppleScriptで各種Paneを表示させる機能が復旧
◯Safari v17で隠し命令「show credit card settings」が追加される。do javascript命令の実行許可のための「Apple EventからのJavaScriptを許可」の場所が設定>デベロッパに変更される
◯ミュージック.appでplaylistの「loved」属性が「favorited」に変更される
◯連絡先.appの廃止済みプラグイン機能用の「Address Book Rollover Suite」の属性がhiddenに変更される

◯スクリプトエディタのコンテクストメニュー・スクリプトに、絵文字つきのファイル/フォルダのコンテンツを入れると、コンテクストメニューに「項目が重複して表示される」不具合が修正される
◯「アプリケーションのAppleScript用語辞書をブラウズする方法「アプリケーションのアイコンをスクリプトエディタにドラッグ&ドロップ」が復旧する
×スクリプトエディタ上で「Cocoa-AppleScript Applet」のテンプレートから作成したアプレットが動作しない問題が継続中
×スクリプトメニューから呼び出したAppleScriptの実行速度が、スクリプトエディタ上よりも6倍以上遅くなる現象が発生
×半角スペース文字列の数値への型変換で処理系自体がクラッシュするバグ(14.0 Sonoma Crasher→ 15.0で修正)
×テキスト読み上げキャラクタのうち一部のキャラクタで名前がローカライズされてしまい、sayコマンドで指定できないバグが継続中(日本語環境限定バグ)

macOS 15.0(AppleScript v2.8)
◯Safariのtabにpidプロパティが追加される
◯AppleScriptドロップレットにドロップしたファイル/フォルダが、xattr「com.apple.quarantine」の影響とGatekeeperの兼ね合いですべてが受け渡されない現象がmcOS 10.12から継続して発生していたが、これが改められ、ドロップされたファイル/フォルダの欠損が発生しなくなった。なお、この変更がmacOS 13.xおよび14.xにもさかのぼって適用された
◯半角スペース文字列の数値への型変換で処理系自体がクラッシュするバグ(14.0, Sonoma Crasher)が解消
×スクリプトエディタ上で「Cocoa-AppleScript Applet」のテンプレートから作成したアプレットが動作しない問題が継続中

×スクリプトメニューから呼び出したAppleScriptの実行速度が、スクリプトエディタ上よりも6倍以上遅くなる現象が継続中
×テキスト読み上げキャラクタのうち一部のキャラクタで名前がローカライズされてしまい、sayコマンドで指定できないバグが継続中(日本語環境限定バグ)

macOS 26.0(AppleScript v2.8)
◯スクリプトエディタ上で「Cocoa-AppleScript Applet」のテンプレートから作成したアプレットがApple Silicon Mac上で動作しない問題が解決される(??????)
◯スクリプトエディタ上でコンパイル(構文確認)を行うと、最終行が見えなくなる問題が解決される

◯スクリプトエディタがDark Modeに対応
◯スクリプトエディタのアイコンがmacOS 26風に変更される

Posted in History | Tagged 26.0savvy | Leave a comment

暗黙のuseコマンド

Posted on 9月 2 by Takaaki Naganoya

かつてAppleScript関連で大きな議論を呼んだ話題に「暗黙のrunハンドラ」というものがありました。

何も書かないAppleScriptのプログラムに暗黙のrunハンドラが存在している(ように動く)という話です。

現在でも同様に、

「明確に仕様として明記されていないものの、おそらくこういう動作になっているだろう」

と推測して書いているものがあります。それが、暗黙のuseコマンドです。

useコマンドはデフォルトで指定されている

何もuseコマンドを書かなくても、仮にuseコマンドを記述しても、パラメータを指定しない場合にはデフォルト値が

use AppleScript
無指定時には、現在実行中のバージョンのAppleScriptで動作するようになっているようです。

use scripting additions
macOS 10.15以降はサードパーティのScripting Additionのサポートが廃止されたため、Apple純正のStandard Additionsのオン/オフ設定コマンドという位置付けになっているようです。

use framework
この記述では、とくに無指定時のデフォルト値というものはないようです。

ただし、Vanilla ScriptとCocoa Scriptで動作が異なっています。また、Script Object内に記述したAppleScriptでも動作が変わります。

AppleScript名:scripting additions 1.scpt
display dialog "TEST"

★Click Here to Open This Script 

AppleScript名:scripting additions in script object.scpt

testScript’s testMes("TEST")

script testScript
  on testMes(aMes as string)
    display dialog aMes
  end testMes
end script

★Click Here to Open This Script 

AppleScript名:scripting additions 2.scpt
use AppleScript
use framework "Foundation"

–display dialog "TEST"–構文チェック自体できない

★Click Here to Open This Script 

AppleScript名:scripting additions in script object.scpt
use AppleScript
use framework "Foundation"

testScript’s testMes("TEST")

script testScript
  use AppleScript
  
use framework "Foundation"
  
use scripting additions –ないと、構文確認をパスできない
  
property parent : AppleScript –なくても動く。Scriptオブジェクトの階層を増やすと必須になったりする
  
  
on testMes(aMes as string)
    display dialog aMes
  end testMes
  
  
on testMes2(aMes as string)
    using terms from scripting additions —どの用語辞書の予約語かを明示的に指定するよう構文確認時に求められるケースがある
      display dialog aMes
    end using terms from
  end testMes2
end script

★Click Here to Open This Script 

Posted in Scripting Additions | Tagged 13.0savvy 14.0savvy 15.0savvy | Leave a comment

開始時刻から終了時刻までhh:mm形式の文字列を15分単位でリスト出力

Posted on 8月 13 by Takaaki Naganoya

指定の開始時刻から終了時刻まで、hh:mm形式の文字列を15分間隔でリスト出力するAppleScriptです。

ありもののサブルーチンを組み合わせて即席で作ったCocoa版のルーチンと、ChatGPT(GPT-5)に書かせた非Cocoa版のルーチンの2つがあり(ChatGPTにCocoa使用を指定せず)、速度を比較してみたら……

非Cocoa版のルーチンのほうが6倍ぐらい高速でした。データが小さすぎるとか、処理内容が小さすぎる場合にはCocoaの機能を利用しないほうが高速に処理できる場合があります。

Shane Stanleyの処理時間計測アプリ「ScriptGeek」が、かなりCocoa Scriptingの登場初期から存在しており、不思議に思ってきたものですが……処理内容の規模によってはCocoa Scriptingのほうが遅くなるケースがあるため、実際に書いて動かして計測してみないと、Cocoa Scriptingで高速化が達成できるかわからないところです。

このほか、AppleScriptのランタイム環境が何になるかによって実行速度は変わってきます。Xcode上で開発するCocoa Applicationなども実行特性が違うため、やはり動かして計測してみないと何がベストなのかはわかりません。

ただ、この程度の処理であれば、0.0028秒が0.4秒になったところで、何か実用上の差異が発生するわけでもありません。

追記:
追加で最速パターンを掲載しておきます。汎用性を求めて計算して出力していましたが、ほとんどの用途で毎回同じようなデータを出力することでしょう。なので、固定データを返すだけでいいだろうかと。高速版とくらべても65〜70倍ぐらい高速です(当たり前)。

AppleScript名:15分メッシュの時間文字列を生成.scptd
—
–  Created by: Takaaki Naganoya
–  Created on: 2025/08/13
—
–  Copyright © 2025 Piyomaru Software, All Rights Reserved
—

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

set aRes to generateWorkUnitList() of me
–> {"5:15", "5:30", "5:45", "6:00", "6:15", "6:30", "6:45", "7:00", "7:15", "7:30", "7:45", "8:00", "8:15", "8:30", "8:45", "9:00", "9:15", "9:30", "9:45", "10:00", "10:15", "10:30", "10:45", "11:00", "11:15", "11:30", "11:45", "12:00", "12:15", "12:30", "12:45", "13:00", "13:15", "13:30", "13:45", "14:00", "14:15", "14:30", "14:45", "15:00", "15:15", "15:30", "15:45", "16:00", "16:15", "16:30", "16:45", "17:00", "17:15", "17:30", "17:45", "18:00", "18:15", "18:30", "18:45", "19:00", "19:15", "19:30", "19:45", "20:00", "20:15", "20:30", "20:45"}

on generateWorkUnitList()
  set hList to {}
  
  
repeat with h from 5 to 20 by 1
    repeat with m from 0 to 59 by 15
      if {h, m} is not equal to {5, 0} then
        set mStr to numToZeroPaddingStr(m, 2, "0")
        
set the end of hList to (h as string) & ":" & mStr
      end if
    end repeat
  end repeat
  
  
return hList
end generateWorkUnitList

–整数の値に指定桁数ゼロパディングして文字列で返す
on numToZeroPaddingStr(aNum as integer, aDigit as integer, paddingChar as text)
  set aNumForm to current application’s NSNumberFormatter’s alloc()’s init()
  
aNumForm’s setPaddingPosition:(current application’s NSNumberFormatterPadBeforePrefix)
  
aNumForm’s setPaddingCharacter:paddingChar
  
aNumForm’s setMinimumIntegerDigits:aDigit
  
  
set bNum to current application’s NSNumber’s numberWithInt:aNum
  
set aStr to aNumForm’s stringFromNumber:bNum
  
  
return aStr as text
end numToZeroPaddingStr

★Click Here to Open This Script 

AppleScript名:15分メッシュの時間文字列を生成(高速).scpt
—
–  Created by: Takaaki Naganoya
–  Created on: 2025/08/13
—
–  Copyright © 2025 Piyomaru Software, All Rights Reserved
—

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

set mList to retWorkingMeshStrList() of me
–> {"5:15", "5:30", "5:45", "6:00", "6:15", "6:30", "6:45", "7:00", "7:15", "7:30", "7:45", "8:00", "8:15", "8:30", "8:45", "9:00", "9:15", "9:30", "9:45", "10:00", "10:15", "10:30", "10:45", "11:00", "11:15", "11:30", "11:45", "12:00", "12:15", "12:30", "12:45", "13:00", "13:15", "13:30", "13:45", "14:00", "14:15", "14:30", "14:45", "15:00", "15:15", "15:30", "15:45", "16:00", "16:15", "16:30", "16:45", "17:00", "17:15", "17:30", "17:45", "18:00", "18:15", "18:30", "18:45", "19:00", "19:15", "19:30", "19:45", "20:00"}

on retWorkingMeshStrList()
  set startSeconds to (5 * 3600) + (15 * 60) — 5:15 の相対秒
  
set endSeconds to (20 * 3600) — 20:00 の相対秒
  
set intervalSeconds to 15 * 60 — 15分間隔
  
  
set timeList to {}
  
  
repeat with t from startSeconds to endSeconds by intervalSeconds
    set h to t div 3600
    
set m to (t mod 3600) div 60
    
— 2桁表示に整形
    
–set hStr to text -2 thru -1 of ("0" & h)
    
set hStr to h as string
    
set mStr to text -2 thru -1 of ("0" & m)
    
set end of timeList to (hStr & ":" & mStr)
  end repeat
  
  
return timeList
end retWorkingMeshStrList

★Click Here to Open This Script 

AppleScript名:15分メッシュの時間文字列を生成(最速).scptd
—
–  Created by: Takaaki Naganoya
–  Created on: 2025/08/10
—
–  Copyright © 2025 Piyomaru Software, All Rights Reserved
—

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

set hList to generateWorkUnitList() of me

on generateWorkUnitList()
  return {"5:15", "5:30", "5:45", "6:00", "6:15", "6:30", "6:45", "7:00", "7:15", "7:30", "7:45", "8:00", "8:15", "8:30", "8:45", "9:00", "9:15", "9:30", "9:45", "10:00", "10:15", "10:30", "10:45", "11:00", "11:15", "11:30", "11:45", "12:00", "12:15", "12:30", "12:45", "13:00", "13:15", "13:30", "13:45", "14:00", "14:15", "14:30", "14:45", "15:00", "15:15", "15:30", "15:45", "16:00", "16:15", "16:30", "16:45", "17:00", "17:15", "17:30", "17:45", "18:00", "18:15", "18:30", "18:45", "19:00", "19:15", "19:30", "19:45", "20:00"}
end generateWorkUnitList

★Click Here to Open This Script 

Posted in date list Text | Tagged 14.0savvy 15.0savvy 26.0savvy ChatGPT | Leave a comment

Adobe InDesignのAppleScript実行エンジンがCarbonからCocoaベースに書き換えられる

Posted on 7月 30 by Takaaki Naganoya

最新のAdobe InDesignにおいて、AppleScriptの実行エンジンが従来のCarbonベースのものから、Cocoaベースのものに置き換えられるという情報が入ってきました。

実行エンジンの切り替えにともない、利用できる各種機能に変更点があるかどうかは未確認です。

従来のAdobe InDesignのAppleScript実行エンジンはCocoa系の機能実行に関しては最強レベルのものが搭載されており、Script Debugger並みのユーザーディレクトリ下のFramework呼び出しをはじめ、最強クラスの実行エンジンが搭載されていました。

通常のAppleScript実行はもちろんのこと、幅広い対応を行なっていたCocoa Scripting機能対応が、どの程度新エンジンに継承されているかがみどころです。評価できるといいのに。

Posted in news | Tagged 15.0savvy InDesign | Leave a comment

Finderを終了させる

Posted on 7月 29 by Takaaki Naganoya

Finderを終了させたままにしておくAppleScriptです。

この種類のQ&Aだと、

do shell script "killall Finder"

といった回答が書かれがちですが、これだと終了させたままにはできません。

Finderを終了させたままにしておく方法について調べてみたら、見つかったのでまとめておきました。

AppleScript名:Finderを終了させる.scpt
do shell script "defaults write com.apple.Finder QuitMenuItem -boolean true"

tell application "Finder" to quit

★Click Here to Open This Script 

Posted in process | Tagged 13.0savvy 14.0savvy 15.0 26.0savvy Finder | Leave a comment

Claris FileMaker Pro 2025(v22)がリリースされた

Posted on 7月 12 by Takaaki Naganoya

Appleの子会社であるClarisから、Claris FileMaker Pro 2025(v22)がリリースされました。

AppleScript名:Claris FileMaker Pro 2025のバージョン番号取得.scpt
tell application "FileMaker Pro"
  version
  
–> "22.0.1"
end tell

★Click Here to Open This Script 

AppleScript用語辞書は前バージョンから変更されていません。

Posted in news | Tagged 14.0savvy 15.0savvy 26.0savvy | Leave a comment

ASCII ARTで直線を引く v3.1

Posted on 7月 8 by Takaaki Naganoya

ASCII ARTで指定の2点間に線を引くAppleScriptです。(デモ用の)文字で表現するゲームを作る場合に、基礎ルーチンを整備しておく必要性を感じて、書いておきました。

AppleScript名:ASCII ARTで直線を引く v3.1.scpt
—
–  Created by: Takaaki Naganoya
–  Created on: 2025/07/07
—
–  Copyright © 2025 Piyomaru Software, All Rights Reserved
—

property widthCount : 40
property heightCount : 25
property spaceChar : " "
property drawChar : "■"

— 使用例
set canvas to makeBlankCanvas() of me

set canvas to drawLine(canvas, 0, 0, 39, 24, 1) of me — 太さ1の線

set curDelim to AppleScript’s text item delimiters
set AppleScript’s text item delimiters to return
set resultText to canvas as text
set AppleScript’s text item delimiters to curDelim

return resultText

on makeBlankCanvas()
  set blankLine to ""
  
repeat widthCount times
    set blankLine to blankLine & spaceChar
  end repeat
  
set canvas to {}
  
repeat heightCount times
    set end of canvas to blankLine
  end repeat
  
return canvas
end makeBlankCanvas

on drawLine(canvas, x0, y0, x1, y1, thickness)
  script spd
    property drawnPositions : {}
    
property drawXCoords : {}
    
property canvas : {}
    
property lineChars : {}
  end script
  
  
copy canvas to (canvas of spd)
  
  
set dx to x1 – x0
  
set dy to y1 – y0
  
set lineLength to (dx * dx + dy * dy) ^ 0.5
  
  
if lineLength = 0 then
    if x0 ≥ 0 and x0 < widthCount and y0 ≥ 0 and y0 < heightCount then
      set theLine to item (y0 + 1) of (canvas of spd)
      
set newLine to replaceCharAt(theLine, x0 + 1, drawChar)
      
set item (y0 + 1) of (canvas of spd) to newLine
    end if
    
    
return (canvas of spd)
  end if
  
  
set nx to –dy / lineLength
  
set ny to dx / lineLength
  
  
set halfThickness to (thickness – 1) / 2
  
if halfThickness < 0 then set halfThickness to 0
  
  
set x to x0
  
set y to y0
  
  
set dxAbs to absNum(dx) of me
  
set dyAbs to absNum(dy) of me
  
set sx to signNum(dx) of me
  
set sy to signNum(dy) of me
  
set err to dxAbs – dyAbs
  
  
set (drawnPositions of spd) to {}
  
  
repeat
    set (drawXCoords of spd) to {}
    
repeat with t from –halfThickness to halfThickness
      set pxF to x + nx * t
      
set pxInt to pxF as integer
      
if pxInt ≥ 0 and pxInt < widthCount then
        if (drawXCoords of spd) does not contain pxInt then
          set end of (drawXCoords of spd) to pxInt
        end if
      end if
    end repeat
    
    
set pyInt to y as integer
    
if pyInt ≥ 0 and pyInt < heightCount then
      set theLine to item (pyInt + 1) of (canvas of spd)
      
set (lineChars of spd) to characters of theLine
      
      
repeat with pxInt in (drawXCoords of spd)
        set posKey to (pxInt as string) & "," & (pyInt as string)
        
        
if (drawnPositions of spd) does not contain posKey then
          set item (pxInt + 1) of (lineChars of spd) to drawChar
          
set end of (drawnPositions of spd) to posKey
        end if
        
      end repeat
      
      
set newLine to (lineChars of spd) as string
      
set item (pyInt + 1) of (canvas of spd) to newLine
    end if
    
    
if x = x1 and y = y1 then exit repeat
    
    
set e2 to 2 * err
    
if e2 > –dyAbs then
      set err to err – dyAbs
      
set x to x + sx
    end if
    
    
if e2 < dxAbs then
      set err to err + dxAbs
      
set y to y + sy
    end if
  end repeat
  
  
return (canvas of spd)
end drawLine

on replaceCharAt(str, pos, char)
  if pos < 1 or pos > (length of str) then return str
  
set prefix to text 1 thru (pos – 1) of str
  
set suffix to text (pos + 1) thru -1 of str
  
return prefix & char & suffix
end replaceCharAt

on absNum(n)
  if n < 0 then return –n
  
return n
end absNum

on signNum(n)
  if n > 0 then return 1
  
if n < 0 then return -1
  
return 0
end signNum

★Click Here to Open This Script 

Posted in Text | Tagged 13.0savvy 14.0savvy 15.0savvy 26.0savvy | Leave a comment

ASCII ARTで円を塗る

Posted on 7月 5 by Takaaki Naganoya

ASCII ARTで円を塗りつぶすAppleScriptです。(デモ用の)文字で表現するゲームを作る場合に、基礎ルーチンを整備しておく必要性を感じて、書いておきました。

AppleScript名:ASCII ARTで円を塗る.scpt
—
–  Created by: Takaaki Naganoya
–  Created on: 2025/07/04
—
–  Copyright © 2025 Piyomaru Software, All Rights Reserved
—

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

— 円の半径 (この数値を変更すると円の大きさが変わります)
set radiusNum to 12

— キャンバスのサイズ
set canvasWidth to 80
set canvasHeight to 40

— 円の中心座標
set centerX to canvasWidth / 2
set centerY to canvasHeight / 2

— 全角文字のアスペクト比補正係数
set aspectRatio to 0.7
set aaRes to aaFillCircle(radiusNum, canvasWidth, canvasHeight, centerX, centerY, aspectRatio) of me

on aaFillCircle(radiusNum, canvasWidth, canvasHeight, centerX, centerY, aspectRatio)
  script spd
    property outputText : ""
  end script
  
  
— 描画結果を格納する変数
  
set (outputText of spd) to ""
  
  
— 描画処理 (1行ずつ文字を生成)
  
repeat with y from 1 to canvasHeight
    set currentLine to ""
    
repeat with x from 1 to canvasWidth
      — 円の方程式を使い、中心からの距離を計算
      
set distSquared to ((x – centerX) * aspectRatio) ^ 2 + (y – centerY) ^ 2
      
      
— 現在の座標が円の内側または円周上にあるか判定
      
if distSquared ≤ radiusNum ^ 2 then
        set currentLine to currentLine & "■"
      else
        set currentLine to currentLine & " "
      end if
    end repeat
    
— 1行分の文字列と改行を出力に追加
    
set (outputText of spd) to (outputText of spd) & currentLine & "
"
  end repeat
  
  
return contents of (outputText of spd)
end aaFillCircle

★Click Here to Open This Script 

Posted in Text | Tagged 13.0savvy 14.0savvy 15.0savvy | Leave a comment

ASCII ARTで円を線で描く

Posted on 7月 5 by Takaaki Naganoya

ASCII ARTで円を線で描くAppleScriptです。(デモ用の)文字で表現するゲームを作る場合に、基礎ルーチンを整備しておく必要性を感じて、書いておきました。

AppleScript名:ASCII ARTで円を線で描く.scpt
—
–  Created by: Takaaki Naganoya
–  Created on: 2025/07/04
—
–  Copyright © 2025 Piyomaru Software, All Rights Reserved
—

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

set radiusNum to 12

— キャンバスのサイズ
set canvasWidth to 80
set canvasHeight to 40

— 円の中心座標
set centerX to canvasWidth / 2
set centerY to canvasHeight / 2

— 全角文字のアスペクト比補正係数
set aspectRatio to 0.7

— 描画する線の太さ
set lineWidth to 0.5
set ssRes to aaDrawCircleLine(radiusNum, canvasWidth, canvasHeight, centerX, centerY, aspectRatio, lineWidth) of me

on aaDrawCircleLine(radiusNum, canvasWidth, canvasHeight, centerX, centerY, aspectRatio, lineWidth)
  script spd
    property outputText : ""
  end script
  
  
— 描画結果を格納する変数
  
set (outputText of spd) to ""
  
  
— 描画処理 (1行ずつ文字を生成)
  
repeat with y from 1 to canvasHeight
    set currentLine to ""
    
repeat with x from 1 to canvasWidth
      — 円の方程式を使い、中心からの距離を計算
      
set distSquared to ((x – centerX) * aspectRatio) ^ 2 + (y – centerY) ^ 2
      
      
— 現在の座標が円周上にあるか判定
      
if (distSquared > (radiusNum – lineWidth) ^ 2) and (distSquared < (radiusNum + lineWidth) ^ 2) then
        set currentLine to currentLine & "■"
      else
        set currentLine to currentLine & " "
      end if
    end repeat
    
— 1行分の文字列と改行を出力に追加
    
set (outputText of spd) to (outputText of spd) & currentLine & "
"
  end repeat
  
return contents of (outputText of spd)
end aaDrawCircleLine

★Click Here to Open This Script 

Posted in Text | Tagged 13.0savvy 14.0savvy 15.0savvy | Leave a comment

Appleに買収されたPixelmator ProがAppleとしての初アップデート

Posted on 7月 2 by Takaaki Naganoya

前回の「買収されました」メッセージを表示するだけのアップデートとは異なり、Apple体制下でのそれらしいアップデート(v3.7)が行われました。

AppleScript用語辞書にも変更が加わっているのですが、

Pixelmatorの各バージョンに設定されていたコードネームを返してくるコマンドが廃止になったようです。そんな機能があったとは知りませんでした。廃止はまぁ、機能的に何も影響がないので妥当なところだろうかと。

Posted in Update | Tagged 13.0savvy 14.0savvy 15.0savvy Pixelmator Pro | Leave a comment

Post navigation

  • Older posts
  • Newer posts

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

Google Search

Popular posts

  • Numbersで選択範囲のセルの前後の空白を削除
  • macOS 26, Tahoe
  • macOS 15でも変化したText to Speech環境
  • KagiのWebブラウザ、Orion
  • Script Debuggerの開発と販売が2025年に終了
  • 【続報】macOS 15.5で特定ファイル名パターンのfileをaliasにcastすると100%クラッシュするバグ
  • macOS 15 リモートApple Eventsにバグ?
  • NSObjectのクラス名を取得 v2.1
  • 2024年に書いた価値あるAppleScript
  • macOS 15:スクリプトエディタのAppleScript用語辞書を確認できない
  • Xcode上のAppleScriptObjCのプログラムから、Xcodeのログ欄へのメッセージ出力を実行
  • (確認中)AppleScript Dropletのバグっぽい動作が解消?
  • AVSpeechSynthesizerで読み上げテスト
  • AppleScript Dropletのバグっぽい動作が「復活」(macOS 15.5β)
  • 指定フォルダ以下の画像のMD5チェックサムを求めて、重複しているものをピックアップ
  • Apple、macOS標準搭載アプリ「写真」のバージョン表記を間違える
  • macOS 26, 15.5でShortcuts.app「AppleScriptを実行」アクションのバグが修正される
  • Numbersで選択中の2列のセルを比較して並べ直して書き戻す v2
  • Script Debuggerがフリーダウンロードで提供されることに
  • 新刊電子書籍「Pages+AppleScriptで本をつくろう!」を刊行

Tags

10.11savvy (1101) 10.12savvy (1242) 10.13savvy (1391) 10.14savvy (587) 10.15savvy (438) 11.0savvy (283) 12.0savvy (212) 13.0savvy (204) 14.0savvy (159) 15.0savvy (158) 26.0savvy (21) CotEditor (66) Finder (52) 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 (56) 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
  • Newt On Project
  • 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
  • Spellchecker
  • Spotlight
  • SVG
  • System
  • Tag
  • Telephony
  • Text
  • Text to Speech
  • timezone
  • Tools
  • Update
  • URL
  • UTI
  • Web Contents Control
  • WiFi
  • XML
  • XML-RPC
  • イベント(Event)
  • 未分類

アーカイブ

  • 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