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

タグ: 12.0savvy

FM-1グランプリにFileMaker PowerPackを出品

Posted on 11月 15, 2021 by Takaaki Naganoya

FileMaker Proの作品コンテスト「FM-1グランプリ」の第2回予選を通過した「FileMaker PowerPack」を、内容拡充し第3回予選に再応募しました。

CotEditorのPowerPackにつづく、FileMaker ProのPowerPack。178本のAppleScriptを収録した、FileMaker Proに組み込んで動かすと便利そうなものを収録したサンプル集です。

Cocoa Scriptingのデモンストレーションを行うフリー配布ソリューションです。

FileMaker ProとAppleScriptなので、相性抜群! 楽勝で作れるに違いない!

……そんなことを考えていた時期が自分にもありました。

しかし、割と前代未聞のトラブルに遭遇。苦労話にはことかかないありさまです。だいたい、内容がなかなか決まらずに企画段階でかなり困っていました。

ここでは、お気楽そうに見える見た目とはまったく異なる技術的な内容について記すこととします。

FM独自のAppleScriptランタイム環境が大変

FileMaker ProのAppleScriptランタイム環境は独特のもので、ランタイム名を取得しても「FileMaker Pro」と独自の名前が返ってきます。Vanilla AppleScriptについては環境の違いにともなう「差異」は感じないところですが、Cocoa Scriptingを行うと「まったくの別物」であることを痛感できます。

FileMaker Pro内蔵のスクリプトステップ「AppleScriptを実行」は、実行したAppleScriptが生成したオブジェクトがメモリ上に常駐したりしません。実行後、即座にメモリ上からパージされるようです。ARC的な「使わなくなって時間がたったから自動で消しとくね!」という挙動とはまるっきり違います。

このことで、OS側から各種Notificationを受信するようなもの(USBメモリがマウントされたらAppleScriptを実行させるなど)は、瞬時にクラッシュ。NSTimerでタイマーを生成してタイマ割り込み処理を行おうとするとクラッシュ!

さらに、標準的なランタイム環境(スクリプトエディタ、Script Menu)で実行したときには発生しないトラブルが山のように発生します。

とくに、CoreImageの機能を呼び出して画像処理を行おうとした場合には、明示的にメインスレッドでの処理を指定する必要があり、これに気づくまではまったく画像フィルタ処理ができない始末。FileMaker PowerPackでは無駄にCoreImageのフィルタ呼び出しプログラムばかり60本ぐらい突っ込んでありますが、このCoreImageの処理で問題のある挙動を示すものがないか全数チェックしたという次第です。

Cocoa Scriptingについては、おそらくメーカー側でもノーチェックの部分なので、調べられる機会に調べておいたほうが得策です。

今回のFileMaker PowerPackでいろいろ余計なノウハウがたまりましたが、osascriptなどのランタイム環境と比べてもずいぶん風変わりなCocoa Scripting環境であることを意識しておく必要があることでしょう。

FileMaker PowerPackには目下178のScriptを入れてあり、FileMaker Pro DB上のサンプルデータをもとにデータ処理を行い、結果がある場合にはDB上に結果を描き戻すようになっています。

今回、さまざまなテストを重ね、「極力FileMaker Pro内蔵のAppleScript実行環境を利用しない」ことが問題解決の近道であることを痛感しました。できるだけ、FileMaker Proの外部に補助アプレットを用意して、そちらでCocoa Scriptingの処理を行うべきです。まして、タイマー処理やNotificationの受信処理などはFileMaker Pro内では行えないため、FM内では最低限の処理にとどめ、処理本体を外部に出すべきでしょう。

macOS 12のFramework再編の影響も

macOS 12で行われたFramework再編の影響も受けました。PDFKitの機能を利用する場合、macOS 11までであれば、

use framework "QuartzCore"

と記述していましたが、macOS 12では、

use framework "PDFKit"

と記述する必要があります。

macOS 11までのOSと、macOS 12以降のOSにそれぞれ対応するライブラリを書いて、実行時のOSバージョンを検出して呼び出しを切り替える処理をスクリプトエディタ上で動作確認してあったのですが、これをそのままFileMaker Proのランタイムに持っていくとコンパイル(構文確認)をパスしません。

仕方なく、macOS 11までのScriptと、macOS 12以降のScriptで別々のものに分ける必要がありました。

自称・世界最小の簡易形態素解析エンジン「easyJParse」のFM環境への移植

さまざまなランタイム環境で動作する必要のある、Piyomaru Softwareによる世界最小の簡易形態素解析エンジン「easyJParse」を、このFileMaker PowerPackに組み込んでいます。

このeasyJParseは初出時には80行程度、現在でも100行そこそこという超小型の形態素解析プログラムであり、自然言語(主に日本語)によるコマンドを分解するために開発したものです(飛行機の中でも動かすべく、REST APIで外部のサービスを呼び出したりはしていません)。

当初、easyJParseがFileMaker Proランタイム上で動かず、けっこう焦りましたが……いつもの「ソート方向指定」の「ascending」とか「descending」などのキーワードがFMの予約語と衝突していただけでした。

このeasyJParseが動くことで、FileMaker Pro上でTanzaku的な自然言語によるコマンド指定ソリューションが動きまくるはずですが、32KBまでのScriptしかホスティングできないという制限が地道に大変そうであります。

FM-1 GPにFileMaker選手権2021と結果発表が相次ぐ

ウチの検証環境(Intel+M1 Mac mini)でテストした範囲では問題ないことを確認していましたが、どうもM1 MacBook+Retina Display環境では検証できないので、その環境ではいろいろ問題に遭遇していたようです。問題の洗い出しを行えたことは前向きにとらえるべきですが、その環境がないので事前にチェックすることは不可能です。

# M1のRetina Display+MacBook環境が手元にないのでコンテストに応募したわけで…

肝心の総合結果発表は11月27日。大賞を取ることは難しそうですが、予選を通過したため何かいただけそうです。噂によればFileMaker選手権2021も近い日程で結果が発表されるとかしないとか。こちらにも応募はしているため、せめて参加賞ぐらいはいただきたいものです(モバイルバッテリーだったか)。

FileMaker PowerPackについては、その内容を解説し、書き換えるためのガイドを行う書籍を近日発行予定です。さらに、Cocoa Scripting的な立ち入った解説を行うものも計画しています。

これらの付録に、「FM-1グランプリ戦記」をつける予定です。

Posted in news | Tagged 12.0savvy FileMaker Pro | Leave a comment

AS Publisher v18–> v19

Posted on 11月 7, 2021 by Takaaki Naganoya

とくに新しいわけでもなんでもありませんが、「スクリプトエディタでオープン中のScriptをリンクつきのHTMLとして書き出すAppleScript」である「AS Publisher」の機能改修版です。前バージョンまではURLエンコーディング処理にpythonを呼び出して処理していましたが、Cocoaの機能を呼び出すように書き換えました。

# v18に処理のミスがあり、そのミスがOS側で「こういう間違いが多いから通しておこう」と見逃されていたのが厳密に処理されるようになったため、ミスの部分を修正しておきました

AppleScriptのリストをBlogなどに掲載する場合、WordPressやMarkdownの構文自動認識フォーマットを使って掲載されているものを見かけますが、そもそも「return return」(改行コードを返す)といった記述が許可されており、それらがきちんと構文色分けされているAppleScriptにおいて、単なるキーワードによる構文自動認識フォーマットが役立つわけがありません(知らずによく実装したもんですわ>オリジナル版を作った人)。

それ以前に「必要があったので」作ったAppleScriptでもあります。手元に残っている最古のバージョンは2005年の4月1日のタイムスタンプになっていますが、おそらくそれ以前から作っていたものでしょう。

# retMacOSpathList ハンドラで、ファイルパスをやたらとCastしている箇所がありますが、Mac OS X 10.5より前のAppleScriptではファイルパスの文字列のエンコーディングに問題を抱えていた(AppleScript側の文字列とのエンコーディング/ノーマライズの不整合)ので、その対策です。ただし、不必要なぐらい無駄な処理をしているので、参考にはなりません。Mac OS X初期の試行錯誤を強いられていた時代の遺物とでも思ってください

本Scriptおよびその派生版は、macOS標準装備のScript Menuに入れて実行することを想定しています。AppleScriptからスクリプトエディタを操作する場合に、Mac OS X 10.4の時代ではあまり動作が安定せず、もう少し後のバージョンのOSになるまで(10.5ぐらい?)、たいへんスリリングな(クラッシュが頻発する)Scriptingを強いられていました。

いまはそのあたりは安定していますが、ごく初期においては挙動が怪しい部分があったということです(その時期で知識が止まっている人はそういう認識のまま)。

話を戻しましょう。

AppleScriptのプログラムをBlogなどに掲載する際に、自分はこういう道具を作って使用しています。巨大なリストを掲載する場合には記事の文字数が膨大になってしまい、掲載をあきらめたこともありましたが、ほんのごく一部です。

このScriptをもとに、自分が使いやすいように(色指定とか)変更してみてもよいでしょう。

「動けばいい」ぐらいの割り切りで、秘伝のタレに継ぎ足してメンテナンスしてきましたが、HTMLタグで書式制御するよりはCSSで制御したほうがシンプルにできてよさそうな感じもします。

ファイル処理も、とくに「ここまでやる必要ってあったっけ?」という感想を持ってしまいます。なにぶん、2006年ごろに作ったものなので、自分で自分のプログラムを見ても違和感がものすごいですね。「OSの処理に対する不信感」がそこかしこに漂っています、、、、

AppleScript名:AS Publisher v19.scpt
—
–  Created by: Takaaki Naganoya
–  Created on: 2014/11/09
–  Modified on: 2021/11/07
—
–  Copyright © 2006-2021 Piyomaru Software, All Rights Reserved
—
use AppleScript version "2.4"
use scripting additions
use framework "Foundation"

property quotChar : string id 34

property headerCol : "0000CC" –"0000CC" –ヘッダー部分(濃い色)
property bodyBackCol : "EEFFFF" –"EEFFFF" –Script本文下地(薄い色)
property footerCol : "66FFFF" –"66FFFF" –スクリプトリンク部分

set a to path to me

set pName to "com.apple.ScriptEditor2"

using terms from application "Script Editor"
  tell application id pName
    if (count every document) = 0 then
      display dialog "スクリプトをエディタでオープンした状態で実行してください。" buttons {"OK"} default button 1 with icon 1
      
return
    end if
    
    
set aP to path of front document
    
if aP = "" then
      display dialog "スクリプトを保存してから実行してください。" buttons {"OK"} default button 1 with icon 1
      
return
    end if
    
    
tell front document
      set aInfo to properties
      
set curLang to name of language of aInfo –現在のOSA言語の名称を取得する
    end tell
    
    
–OSA Language名称をもとに色セットを変更する
    
changeColor(curLang) of me
    
    
set c to name of front document
    
    
set aF to retMacOSpathList(aP) of me
    
set htmlFilePath to retHTMLpath(aF) of me
    
    
set contText to contents of front document
    
set encText to makeEncodedScript(contText) of me
    
    
set newLinkText to "applescript://com.apple.scripteditor?action=new&script=" & encText
    
–set insLinkText to "applescript://com.apple.scripteditor?action=insert&script=" & encText
    
–set apndLinkText to "applescript://com.apple.scripteditor?action=append&script=" & encText
    
    
set comText to description of front document
    
    
set textList to every attribute run of front document
    
set textList_ref to a reference to textList
    
    
set colorList to color of every attribute run of front document
    
set colorList_ref to a reference to colorList
    
    
set aTest to contents of item 2 of textList
    
set asciiTest to id of aTest
  end tell
end using terms from

set tabChar to string id 9

–set TIDsList to {{"&", "&amp;"}, {">", "&gt;"}, {"<", "&lt;"}, {"¥"", "&quot;"}}
set TIDsList to {{"\\", "\"}, {"’", "’"}, {"&", "&amp;"}, {">", "&gt;"}, {"<", "&lt;"}, {"  ", "  "}, {string id 13, string id 10}, {string id 13, "<br>"}, {string id 10, "<br>"}, {"\"", "&quot;"}}
–set TIDsList to {{"&", "&amp;"}, {">", "&gt;"}, {"<", "&lt;"}, {"¥"", "&quot;"}}

set TIDsList_ref to a reference to TIDsList

set dataOut to {}
set dataOut_ref to a reference to dataOut

set iCounter to 1
repeat with i in textList_ref
  set j to contents of i
  
  
set curDelim to AppleScript’s text item delimiters
  
repeat with eachItem in TIDsList_ref
    set AppleScript’s text item delimiters to contents of item 1 of eachItem
    
set j to every text item of j
    
set AppleScript’s text item delimiters to contents of item 2 of eachItem
    
set j to j as string
  end repeat
  
set AppleScript’s text item delimiters to curDelim
  
  
set cText to RBG2HTML(item iCounter of colorList_ref) of me
  
  
set the end of dataOut_ref to "<font color=" & cText & ">" & j & "</font>"
  
set iCounter to iCounter + 1
end repeat

set htmlHeader to "<table width=" & quotChar & "100%" & quotChar & " border=" & quotChar & "0" & quotChar & "cellspacing=" & quotChar & "2" & quotChar & " cellpadding=" & quotChar & "2" & quotChar & ">
<tr>
<td bgcolor=\"#" & headerCol & "\"><font color=" & quotChar & "#FFFFFF" & quotChar & ">" & curLang & "名:" & c

if comText is not equal to "" then
  set comText to "<br><font size=" & quotChar & "2" & quotChar & ">【コメント】 " & comText & "</font><br>"
end if

set htmlHeader2 to "</font></td>
</tr>
<tr>
<td bgcolor=\"#" & bodyBackCol & "\"><font size=\"3\">"

set htmlFooter1 to "</font></td>
</tr>
<tr>
<td bgcolor=\"#" & footerCol & "\"><p><font size=\"2\"><a href=\"" & newLinkText & "\">★Click Here to Open This Script</a> </font></p>
</td>
</tr>
</table>
"

set dataText to htmlHeader & comText & htmlHeader2 & (dataOut as text) & htmlFooter1
set dataText to dataText as Unicode text

–set dDir to (path to desktop as text) & "index.html"
–write_to_file(dataText, htmlFilePath, false) of me
–saveInEncoding(dataText, htmlFilePath, "UTF8") of me –UTF8
write_to_file_Safely(dataText, htmlFilePath) of me

tell application id "com.apple.ScriptEditor2"
  display dialog "HTML書き出し完了" buttons {"OK"} default button 1 with icon 1 giving up after 1
  
return
end tell

on retHTMLpath(aF)
  tell application "Finder"
    –set aF to retMacOSpathList(aP) of me
    
set afA to aF as alias
    
set aInfo to info for afA
    
set aExt to name extension of afA
    
    
set aFileName to name of afA
    
set aFileName to aFileName as text
    
set aFileName to aFileName as Unicode text
    
    
set aFileName_rev to reverse of (every character of aFileName) as text
    
set parentF to ((parent of afA) as alias) as text
    
set htmlFileName to name of afA
    
set htmlFileName to htmlFileName as text
    
set htmlFileName to htmlFileName as Unicode text
    
    
    
if aExt is not equal to "" then
      set htmlFileNameText to ((reverse of (items ((length of aExt) + 2) thru -1 of aFileName_rev)) as text) & ".html"
    else
      set htmlFileNameText to (aFileName as text) & ".html"
    end if
    
set htmlFileNameFullPath to parentF & htmlFileNameText
  end tell
  
return htmlFileNameFullPath
end retHTMLpath

on makeEncodedScript(contText)
  (*

  set aList to every paragraph of contText
  set aClass to class of aList
  if aClass = list then
    set aLen to length of aList
  else
    set aLen to 1
  end if
  
  set aaList to {}
  
  set delim to AppleScript’s text item delimiters
  set AppleScript’s text item delimiters to "//piyomaru_replacement_temp//"
  set bList to aList as text
  set AppleScript’s text item delimiters to delim
  
  set aaList to (encodeURL(bList) of me) as Unicode text
  
  set search_string to "//piyomaru_replacement_temp//" as Unicode text
  set replacement_string to "%0A" as Unicode text
set bList to replace_chars(aaList, search_string, replacement_string) of me
*)

  
  
set aaList to (encodeURL(contText) of me) as Unicode text
  
  
return aaList
end makeEncodedScript

–RGB値からHTMLの色指定に変換
on RBG2HTML(RGB_values)
  — NOTE: this sub-routine expects the RBG values to be from 0 to 65536
  
set the hex_list to {"0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "A", "B", "C", "D", "E", "F"}
  
set the the hex_value to ""
  
repeat with i from 1 to the count of the RGB_values
    set this_value to (item i of the RGB_values) div 256
    
if this_value is 256 then set this_value to 255
    
set x to item ((this_value div 16) + 1) of the hex_list
    
set y to item (((this_value / 16 mod 1) * 16) + 1) of the hex_list
    
set the hex_value to (the hex_value & x & y) as string
  end repeat
  
return ("#" & the hex_value) as string
end RBG2HTML

–安全なファイルの書き出し
on write_to_file_Safely(this_data, target_file)
  tell current application
    set finalPath to target_file
    
    
–テンポラリフォルダに一度書き出して、ターゲットのパスに移動  
    
set tmpFol to path to temporary items from system domain
    
set tmpName to do shell script "date +%Y%m%d%H%M%S"
    
set tmpPath to (tmpFol as string) & tmpName
    
    
–テンポラリのパスにファイル書き出し
    
try
      set the target_file to the tmpPath as text
      
set this_data to this_data as Unicode text
      
      
set the open_target_file to open for access file target_file with write permission
      
set eof of the open_target_file to 0 –つねにoverwrite mode(appendではなくて)
      
write this_data to the open_target_file starting at eof as «class utf8»
      
close access the open_target_file
      
    on error error_message
      try
        close access file target_file
      end try
      
return error_message
    end try
    
    
–ファイルの移動を行う
    
set tFilePOSIX to quoted form of POSIX path of target_file
    
set fPathPOSIX to quoted form of POSIX path of finalPath
    
set sText to "mv " & tFilePOSIX & " " & fPathPOSIX
    
try
      do shell script sText
    on error error_message
      return error_message
    end try
    
    
return true
  end tell
end write_to_file_Safely

on replace_chars(this_text, search_string, replacement_string)
  set AppleScript’s text item delimiters to the search_string
  
set the item_list to every text item of this_text
  
set AppleScript’s text item delimiters to the replacement_string
  
set this_text to the item_list as string
  
set AppleScript’s text item delimiters to ""
  
return this_text
end replace_chars

on encodeURL(origStr as string)
  set aStr to current application’s NSString’s stringWithString:origStr
  
set encodedStr to aStr’s stringByAddingPercentEncodingWithAllowedCharacters:(current application’s NSCharacterSet’s alphanumericCharacterSet())
  
return encodedStr as string
end encodeURL

on retMacOSpathList(aFile)
  set aPath to POSIX file aFile
  
set aPath to aPath as alias
  
set aPath to aPath as string
  
set aPath to aPath as Unicode text
  
set aliasFileList to aPath
  
return aliasFileList
end retMacOSpathList

–ファイルの追記ルーチン「write_to_file」
–追記データ、追記対象ファイル、boolean(trueで追記)
on write_to_file(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 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 write_to_file

on changeColor(aLang)
  if aLang = "AppleScript" then
    set headerCol to "0000CC" –"0000CC" –ヘッダー部分(濃い色)
    
set bodyBackCol to "EEFFFF" –"EEFFFF" –Script本文下地(薄い色)
    
set footerCol to "66FFFF" –"66FFFF" –スクリプトリンク部分
    
  else if aLang = "JavaScript" then
    set headerCol to "804000" –"0000CC" –ヘッダー部分(濃い色)
    
set bodyBackCol to "E2D3D3" –"EEFFFF" –Script本文下地(薄い色)
    
set footerCol to "E7AC53" –"66FFFF" –スクリプトリンク部分
  end if
end changeColor

★Click Here to Open This Script 

Posted in OSA Text | Tagged 10.14savvy 10.15savvy 11.0savvy 12.0savvy Script Editor Script Menu | 15 Comments

FileMaker Pro Scripting Book with AppleScriptをアップデート

Posted on 11月 4, 2021 by Takaaki Naganoya

FileMaker ProのAppleScriptからの操作を詳細に解説した電子書籍「FileMaker Pro Scripting Book with AppleScript」(日本語版)をアップデートしました。

macOS 12に合わせた内容のアップデート、v1.2までに説明されていなかった内容の補完、および別冊付録リファレンスをまとめています。

すでに購入された方は、購入ページからの再ダウンロードで入手可能です。

→ FileMaker Pro Scripting Book with AppleScript オンラインブックストア(BOOTH)

Posted in Books news PRODUCTS | Tagged 12.0savvy FileMaker Pro | Leave a comment

Shortcuts Eventsでショートカットのインストール+実行

Posted on 11月 1, 2021 by Takaaki Naganoya

macOS 12で標準搭載された「ショートカット.app」(Automatorを置き換える簡易ワークフロー構築・実行ツール)を操作して(実際にはGUIなしのShortcuts Events.app)、自分がiCloud上で共有しているショートカット・ワークフローのインストールと実行を行わせるAppleScriptです。

ショートカット・ワークフローはローカルではなくiCloud上に置かれています。それらは「名前」で識別できますが、ユニークなIDが振られているわけではありません。ものすごく不満ですが、一応識別できることにしましょう。

ショートカット・ワークフローは「共有」することが可能で、とくに「リーディングリストで共有」すると、iCloud上の生URLが得られる(SafariのURL欄に表示される)ため、このURL情報を共有すれば「指定のショートカット・ワークフローが存在していない場合にはiCloud上からインストールさせる」という処理が可能になります。

# このあたり、まだ試行錯誤中なので「現時点ではこういう運用をしている」という程度です

今日確認したら、「ファイル」メニューの「共有」に「iCloudリンクをコピー」という項目がありました。

リンクをコピーする機能を入れるなら「編集」メニューではないのかと思わないではないですが、機能的にはこちらがシンプルなのでご利用ください。

お使いの環境に指定のショートカット・ワークフローがインストールされていない場合には、インストールを求めます。ただ、単なる「名称」でしかチェックしていないのと、あらかじめ「同じ名前で内容が違うショートカット」が存在していたら、「インストールずみ」と判定してしまうので、一意に識別できるユニークな識別子がショートカット・ワークフローについていないのはどうかと思います。入手先のiCloud URLでもよいのですが、、、、

# 一応、コンピュータ上で互いを識別するための「id」は持っています

ここで、インストールを行わなかった場合には、それを検出してダイアログ表示します。

AppleScript名:Shortcuts Eventsでショートカットのインストール+実行.scpt
—
–  Created by: Takaaki Naganoya
–  Created on: 2021/11/01
—
–  Copyright © 2021 Piyomaru Software, All Rights Reserved
—

set aName to "ASTEST3" –Shortcut名称
set aURL to "https://www.icloud.com/shortcuts/e788482535704922aaa9f617491353b2" –共有URL
set sRes to installAndRunShortcuts(aName, aURL) of me

–Install Shortcut and run it
on installAndRunShortcuts(aName, aURL)
  tell application "Shortcuts Events"
    set n1List to name of every shortcut
  end tell
  
  
if n1List does not contain aName then
    display notification "Plese Install my Shortcuts workflow"
    
open location aURL
  end if
  
  
tell application "Shortcuts Events"
    set n2List to name of every shortcut
  end tell
  
  
if n2List does not contain aName then
    display dialog "I can’t run my Shortcuts because you canceled installing"
    
return false
  end if
  
  
tell application "Shortcuts Events"
    run shortcut aName
    
return true
  end tell
end installAndRunShortcuts

★Click Here to Open This Script 

Posted in Shortcuts Workflow | Tagged 12.0savvy Shortcuts Shortcuts Events | 1 Comment

Skim v1.6.5+macOS 12.0.1でPDFに埋め込んだapplescript://リンクの動作を確認

Posted on 10月 28, 2021 by Takaaki Naganoya

macOS 10.15で「PDFView上で発生した(カスタムURLスキームの)URLイベントを途中でブチ切る」という変更を、ユーザーに何の断りもなく行ったApple。

本Blog掲載のプログラムリスト末尾に入っている「applescript://」URLリンク。Webブラウザ(HTML)→スクリプトエディタの間では、このURLリンクは有効です。この仕様を引き継いで、AppleScript解説本のPDFでも同様のURLリンクを入れてあったのですが……これがmacOS 10.15で意図的にブロックされました。

URLリンクの長さが規定の文字数を超えるものは途中で切ったり、リンクをそもそも無効にしたりと、AppleはmacOS 10.15.x上でマイナーアップデートのたびに悪のかぎりを尽くしていました。90年代の傍若無人なマイクロソフトを想起させるような、強引すぎるやり方です。

こういうのはとてもよくないことだと思います。PDFの扱いがいいからmacOSを使っている、という部分は大きいわけですが、その基盤となるPDFの扱いをいろいろ無断で変更するというのは、感心しません。

macOS 10.15はβ段階から出来が悪く、「こんなのに付き合っていられるか!」と10.14を継続使用することを決め、10.15をガン無視することにしました。

macOS 10.15は「リリースしてはいけない」レベルのOSだと感じました。このあたり、ダメなものにストップをかけられないのは、Appleという会社の構造的な問題なんでしょう(イエスマンばっかりやがな)。

macOS 10.15を無視したことは個人の生産性を損なわなかったという意味では「いいこと」でしたが、macOS 10.5で発生していたさまざまな問題を自分が認識しなかった(そういうレベルまで付き合う気がしなかった)ために、問題の発覚が遅れたという副作用もありました(まさか、Cocoa Scriptingの実行速度が大幅に低下していたとは!>macOS 10.15)。

macOS 10.15におけるPDF埋め込みリンクについては、macOS標準添付のPreview.appであろうがサードパーティの(オープンソースの)Skim PDF Viewerだろうが、自分でXcode上で作ったお気軽PDFブラウザだろうが、PDFViewを使っている限りはこの制限が発生していました。

真剣にサードパーティのPDF関連Frameworkの利用も検討しましたが、価格面でなかなか折り合いが合わなかったのと、PDFViewに相当するクラスが提供されていなかったのでダメでした。

本件についてはAppleにレポートしていましたが、Apple側でガン無視状態(いろいろリクエストしても無視されるのがデフォルト状態)。サードパーティのPDFビューワまで影響が出るため、macOS 10.15を使わないという消極的な対策しかできない状況でした。

ちょうどこの時期に執筆していたMusic.appのScripting本が完全に頓挫するなど、少なからず打撃を受けた出来事だったのです(各種既刊本のアップデート計画も白紙撤回していました)。

その後、Piyomaru SoftwareのScripting本については「本誌掲載Scriptは別途Zipアーカイブを添付」という原始時代のやり方にたちかえることになります。

そんな中、ふとmacOS 12.0.1+Skim v1.6.5で冗談半分に「URLリンクが復活してたりして」と試してみたら……………「!!!!!』

なんと、Skim上では「applescript://」URLリンクが正常に動作して、内容が途切れることなくスクリプトエディタに転送されていました。さすがに、追加試験でPreview.app上で実行してみたらリンクをまるごとブロックされましたが、Skimについては大丈夫なようです。

こっそり禁止して、こっそり修正ということなんでしょうか。現状がこのまま維持されるのか、それとも将来にまた仕様が変更されるのか不明ですが、コソコソ仕様を変えられるのはとても不愉快です。

OSのRelease Notesをちゃんと出さないことは、不満です。

Posted in news PDF | Tagged 12.0savvy | Leave a comment

AppleScriptからショートカット実行&ショートカット内でAppleScriptを実行

Posted on 10月 27, 2021 by Takaaki Naganoya

macOS 12で新規搭載された「ショートカット.app」、このアプリケーション上で記述するワークフローを「ショートカット」、ショートカットを構成する各コマンドを「アクション」と呼びます。

ショートカット.appは日本語ローカライズされた名称であって、実際には「Shortcuts.app」という名前です。

AppleScript用のショートカット実行GUIなしアプリケーション「Shortcuts Events.app」が別途(ショートカット.appのバンドル内に)存在しており、こちらもAppleScript用語辞書を備えています。

Shortcuts.appに対してコマンドを実行すると、同アプリケーションが起動します。Shortcuts Events.appに対してコマンドを実行すると、Shortcuts.appは起動しません。

両者とも辞書内容は一緒であり、バージョン番号と名前以外に差異はありません。

AppleScript名:ショートカットのプロパティを取得.scpt
tell application "Shortcuts"
  properties
  
–> {frontmost:false, class:application, name:"Shortcuts", version:"5.0"}
end tell

★Click Here to Open This Script 

AppleScript名:Shortcuts Eventsのプロパティを取得.scpt
tell application "Shortcuts Events"
  properties
  
–> {frontmost:false, class:application, name:"Shortcuts Events", version:"1.0"}
end tell

★Click Here to Open This Script 

ショートカット.appを起動するとこのようなウィンドウが表示されます。

あるいは、このようなウィンドウです。

ショートカット一覧が並んだ表示状態で実行することもできますし、ダブルクリックして個別ウィンドウ表示した状態で実行することも可能です。

また、メニューから実行することも可能です。

環境設定では、以下のような設定が行えます。「詳細」に「スクリプトの実行を許可」の項目があり、デフォルトではオフになっています。当然、ここはオンにします。他の項目についても適宜、自己責任でオンにすることになります。

ショートカット(ワークフロー)はローカルに保存されません。iCloud上に保存されます。

ショートカット(ワークフロー)の共有はコンテクストメニューから行います。このさい、iCloud上のURLが直接表示されないため、少々面倒な感じです。

「リーディングリスト」で共有すると、WebブラウザのURL欄に詳細なURLが表示されるため、これを用いるとよさそうです。

https://www.icloud.com/shortcuts/e788482535704922aaa9f617491353b2

新規ショートカットの作成には、メニューから「ファイル」>「新規ショートカット」(Command-n)を実行するか、ショートカット.appのウィンドウでツールバーの「+」をクリックします(すべてのショートカット、My Shortcutなど選択中のフォルダによって表示/非表示状態が変わります)。

初期状態はこんな(↑)感じです。アクションを選択してダブルクリックするか、ビュー上にドラッグ&ドロップするとアクションが置かれます。

最初なので、ダイアログでも出しておきましょう。

ツールバー上の「▶︎」ボタンをクリックするか、Command-rでショートカット(ワークフロー)を実行します。

ショートカットは名前で識別することになります。ツールバー上の名称を変更すると名前を付けられます。

AppleScript側からはこの名前「AS TEST2」を指定して呼び出すことになります。

AppleScript名:ショートカット.appでショートカット実行.scpt
tell application "Shortcuts"
  run shortcut "AS TEST2"
end tell

★Click Here to Open This Script 

AppleScript名:Shortcuts Eventsでショートカット実行.scpt
tell application "Shortcuts Events"
  run shortcut "AS TEST2"
end tell

★Click Here to Open This Script 

現在のところ、Shortcuts.appならびにShortcuts Events.appのrunコマンドでパラメータを指定すると実行時にエラーになるので、パラメータをAS側からショートカット側に指定できていません。クリップボード経由で指定するとかいってアクロバット技を使えばできないことはありませんが、パラメータを指定できないのは明らかな「バグ」です。

あとは、他のプログラムとの相互運用性を高めるためには、ショートカット側の実行結果をAS側に返してくれることが望ましいです。オブジェクトによっては、sdefを通じてやりとりできないCocoa Object(CLLocationなど)もありますが、結果は得られるべきでしょう。

ショートカット.appについては、ヘルプにけっこうな内容の説明が書かれているので、まずはそちらを読むとよいでしょう。ただ、日本語訳がよくないのか「お前は何を言ってるんだ?」という表現が散見され、説明文というよりも広告みたいな内容の箇所もあります。

Posted in news | Tagged 12.0savvy Shortcuts Shortcuts Events | 12 Comments

macOS 12が正式リリースされる

Posted on 10月 26, 2021 by Takaaki Naganoya

macOS 12が正式にリリースされました。ソフトウェアの互換性が確認されていれば、macOS 10.15や11からは(久しぶりに)乗り換える価値のあるOSです。とくに、Apple Silicon Macについては「Must Update」なOSといえるでしょう。

あらたに搭載されたmacOS用のショートカット.app

iOS用にサードパーティが出していたアプリケーション「DeskConnect」をAppleが買収してiOSに「ショートカット」の名前で搭載した自動化アプリケーション。そのmacOS版が搭載されました。Automatorの後継環境として位置付けられているもので、AutomatorのWorkflowの読み込み機能を有しています。

デフォルトでショートカットの内容をメニューバーに表示する機能があり、Script Menuのようにメニューバーから選択・実行が可能です。

自分のiOS環境にはDeskConnectをインストールしてあったので、

Mac上で見てもこんなDeskConnect時代のショートカットも残っているのですが、すでにDeskConnectが動作しないので消すしかありません。

ショートカット.appについては、現時点では「使い物にならない」という評価しかできません。Mac上で動作する標準装備ツールでありながら、実行にiOS用のアプリが必要なMac上で動かないショートカット・アクションが大量に存在しており、Mac上で実行できないことを警告する機構が存在していません。実行してはじめて「Mac上で実行できない」というエラーが表示される程度。「ツイート」アクションも、実行するとエラーになります。

ショートカットについては、Automatorよりも1つ1つのアクションに細かいものが用意されているため、Automatorよりは一般的なプログラミング言語っぽい(下手するとAppleScriptと同じぐらいの粒度の命令がある)印象さえ受けるのですが、微妙に日本語訳がこなれていないのか、日本語で表示すると理解に苦しむアクションが大量に存在しています。

下手をすると、これは「日本語AppleScript」の再来なのではないか、と思わせるような風景が展開されており、ちょっと困惑をおぼえます。

ただ、「AppleScriptを実行」アクションが搭載されており、これが一応普通に動くことを確認してあります。Cocoaの機能も呼び出せるなど、ここだけは「ちゃんとしている」印象を受けます。

ちなみに、ショートカット実行プログラムのランタイム名は「MacHelper」となっており、これは「ショートカット.app」上から実行しても、GUIなしの「Shortcuts Events.app」から実行しても同じ内容が返ってきます。

ショートカット上のAppleScriptの処理速度については、実行されるまでのチェック段階が多々存在しているため、スピードを議論するレベルではないと思います。Automatorにきわめて似た使用感です。

ショートカットのAppleScriptを実行アクションに記述するAppleScriptについては、

use AppleScript
use scripting additions
use framework "Foundation"

on run {input, parameters}
	set procInfo to current application's NSProcessInfo's processInfo()
	set aName to procInfo's processName() as string
	display dialog aName
	
	return aName
end run

と、Automatorとほぼ同一の記述方法です。この実行環境は、ローカルにインストールしたAppleScriptライブラリの呼び出しを許容するので、Switch Controlよりは自由度があります。

ここはよしあしで、iCloud経由で共有するショートカットで、AppleScriptライブラリの個別環境へのインストールが必要となるAppleScriptを含んでいる場合には、運用性が下がります。AppleScriptライブラリ自体をアクションに埋め込むような形態になっていれば話は別なんでしょうけれど。

現状では、macOS上でショートカットを運用できるメリットが少ないものと判断しました。荒削りすぎて、まだα版みたいな完成度です。こまかいところでバグも多々あります。macOS 12の登場に合わせてショートカットの書籍の発行を検討していたものの、そのあまりの完成度の低さにプランを投げ出したほどです。

それでも、現状のショートカットに対して2つだけメリットを見出すとしたら、

 (1)iOS用のアクションを編集できる大きな画面を備えた環境であること。macOS環境は「編集環境」と割り切る
 (2)macOS上でSiriによる音声認識からAppleScriptを実行できる仕組みとして活用

といったあたりでしょうか。現状ではiOS用ショートカットのクロス開発、Mac上での音声認識コマンド実行用部品 としての価値しかありません。

macOS上にはアクセシビリティ系の音声認識+AppleScript実行システムが搭載されており、macOS 10.12あたりから日本語音声認識が使えるようになりました。現状ではこのDictation音声認識システムとSiriの音声認識システムの2つのシステムが載っています。前者についてはなるべくメニューの奥深くの目立たない場所に移動されており、そのあたりに「意図」を感じずにはいられません。

Automatorを置き換える件については、現状では夢物語のレベル。もともと性格が大きく異なります。Automatorのほうがすぐれている点もあれば、ショートカットのほうがすぐれている点もあります。ただし、AppleScript Studioの仕組みを引きずっているAutomatorの機構の維持そのものにかかる手間が大きいのでしょう。移行は止むを得ないというところでしょう(現状で、Automatorが事実上何にも役立っていないので)。

AppleScript v2.8

バージョン番号を変えるほどの変化があったのか、自分にはよくわからないのですが、リリースノートが「AppKit」といった単位でしか書かれなくなったために、詳細がわかりません。

……少なくとも、macOS 10.15で極端に遅くなっていたCocoa呼び出し速度が(Intel Macでも)改善され、さらにApple Silicon MacでのCocoa呼び出し速度が大幅に向上しています(macOS 11の30〜40倍速)。これは、macOS 11+Apple Silicon MacでAppleScriptからのCocoa機能呼び出しが極端に遅くなっていた(高性能コア「FireStorm」ではなく、高効率コア「IceStorm」で実行されてしまっていた)点が修正されたためです。

Cocoaの機能を利用していない場合でも、macOS 11より高速になっているため、M1 Macを使っているScripterにはmacOS 12へのアップデートをおすすめしたいところです(職場のアプリケーションの互換性維持のため、アップデートしないというポリシーがある場合をのぞく)。

OSの構造変化による影響も受けています。既報のように、macOS内のフレームワークがmacOS 11あたりで再編(Umbrella Frameworkだったものが独立。とくにPDFKitとか)され、useコマンドで別のものを指し示すよう書き換える必要が出てきています。

macOS 12.0.1では、日本語環境でNSDataDetectorを用いて自然言語テキストから電話番号を抽出できないというバグがまだ解消されていません。

総評

このmacOS 12というOSにアップデートする価値があるのかどうか、という話については「アップデートできるならアップデートすべき」です。これは、バグだらけでリリースされて信用を大きく失ったmacOS 10.13、10.15とは異なるレベルの「ちゃんとしたmacOS」です。

また、macOS 11ではApple Silicon Macの持つパフォーマンスを発揮し切れていませんでした。M1 MacにmacOS 12を入れると、AppleScriptで作成したソリューションの動作速度の向上幅に腰を抜かすことでしょう。自分もMac App Storeで販売しているAppleScriptで記述した自作アプリケーションのかずかず(とくにKamenoko)をmacOS 12で動かすと、その速さと快適さにmacOS 11には戻れなくなってしまいました。

M1 MacでもIntel Macでも、環境が許せばすぐにアップデートすべき、近年稀に見るOSでしょう。ただし、Uncontrollableな混乱を楽しめる限りにおいて。

Posted in news | Tagged 12.0savvy Shortcuts Shortcuts Events | Leave a comment

Stream Deck Softwareがバージョン5.1.2にバージョンアップ

Posted on 10月 16, 2021 by Takaaki Naganoya

ElgatoのStream Deck用ソフトウェアがバージョン5から5.1.2にバージョンアップしました。

従来は1台のStream Deckに対してプロファイルを複数登録して、「プロファイルを切り替え」アクションで1→2→3→4→1と、順送りで切り替えして、物理ボタンが15個であってもボタン数を超える機能を呼び出せるようにしてありました。

この仕組みはあらためて説明されると理解できるのですが、一目見て理解できるというものでもありません。自分も書籍を書くために仔細に調査を行うまで分かりませんでした。このあたりの「説明不足感」を解消するために「ページ切り替え」「ページインジケータ」も用意したのでしょうか。

物理ボタン数を超える機能を呼び出すための「プロファイルを切り替え」アクションであったり、「フォルダ」アクションであったり、「ページ切り替え」アクションであったり。同じ働きを行う機能を、見せ方を変えて複数実装してあるというのは、それだけ「問題点」だと(販売・営業的に、)みなされているためでしょうか。

より多くのアクションをボタン上にホスティングするために、プロファイル切り替えアクションに、ページ切り替えアクション、ページ表示アクション、フォルダ移動アクションなど操作系のアクション配置ボタンが増え、実質的にSD上に配置できるアクションが減ってしまう(6ボタンの最小のSDの場合には切り替え用で半分埋まる?)わけで、購入時によりボタン数の多いSDモデルへの誘導を行いたいのか、実ボタン以上のアクションをホスティングできることを訴求したいのか……それは自分にはわかりませんが、力を入れている場所であることは確かです。

最終的にはフェイスプレート部分に透明窓を追加して、プロファイル切り替えやページ切り替え、フォルダ切り替えなどの追加表示をSDの画面上で行うといったあたりに「落とし所」がありそうです。

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

macOS 12beta10が登場

Posted on 10月 14, 2021 by Takaaki Naganoya

AppleScriptの実行速低下は観測されていませんが、日本語環境でNSDataDetectorでテキストから電話番号を抽出できないバグは治っていません。

2021/10/19にApple Eventがオンライン開催されることが発表され、どうやらMacBook Pro 16インチにApple Silicon搭載モデルが出てきそうだ、と見られています。果たしてどうなりますやら。

Script Editorを背面に回した瞬間にクラッシュする傾向が見られます。Script Editorがやたらと不安定で、何もしていない瞬間にクラッシュするようになりました(Beta 9では発生せず)。システム環境設定に登録してあったプリンタのエントリが消去されるとか、いろいろ不思議が現象が多発。なんか、いきなりこれまでに見られなかった不具合が急に増えてきて「残念な完成度」に>macOS 12

Posted in news | Tagged 12.0savvy | Leave a comment

macOS 12 Frameworkの再編の影響がAppleScriptにも

Posted on 10月 14, 2021 by Takaaki Naganoya

Cocoa Scripting Course本のVol.4「System Hardware & Software Information」の執筆のために基礎調査を行なっていた段階で気づいていたのですが、macOS 10.15あたりからFrameworkの再編が行われていて、AというFrameworkの下位Frameworkとして存在していたBというFrameworkが、macOS 12あたりで独立したりと位置付けがいろいろ変わっています。

具体例を出すと、みんな大好きPDF操作用のPDFKit。これまでPDFKitはQuartzフレームワークの下位フレームワーク(Umbrella Framework)として存在していました。それが独立したため、AppleScriptでも、

use framework "Quartz"

などと書いていたものを、

use framework "PDFKit"

などと書き換える必要が出てきました。

なかなかこのあたりの問題が顕在化しないのは、実行環境側でPDFKitをincludeしていると、AppleScriptもそのご利益にあやかってuse frameworkが目的のものを指していなくても、実行できてしまっているためです。

ところが、別のランタイム環境(Script Menuとか)に持って行くと、そちらではPDFKitをincludeしていなかったりする場合に、「PDFDocumentなんて知らないよ? allocできないよ?」という話になってしまいます。とくに、Script Menuはエラーの出力先もない「寡黙な実行環境」なので、エラー発生源がよく分からないんですね。

そして、Script Menuから呼び出すScriptにいろいろエラートラップを仕掛けて発生しているエラーを調査し、この問題が発生していることが判明したわけです。

もしかしたら、AppleScript ver. 2.8でバージョン番号をあらためる必要があったのは、内部的な要因(Apple Silicon Macへの最適化)もさることながら、こうしたOS内のさまざまな変更が大きいため、それを区切る必要がある(外部的な要因)と判断されたためなのかもしれません。

Posted in news | Tagged 12.0savvy | Leave a comment

Pages末尾から指定ページまでページ削除

Posted on 10月 12, 2021 by Takaaki Naganoya

「ページ単位でページを削除する」という機能を持たないPagesに対して、限定的ながらもページ単位の削除を行うAppleScriptです。Pages v11.2+macOS 12beta9で動作確認していますが、macOS 11.xやmacOS 10.15でも動作すると思います。

Pagesでまとまった内容の書類(例:書籍)を作る場合には、1書類にすべての内容を詰め込むのは自殺行為で、なるべく記事単位に分割するのがセオリーです。さすがに1ページあたり1書類といった作り方はしませんが、まとまった意味のある内容で1つの書類(扉ページと記事ページは別書類)ぐらいの分け方はします。

それというのも、Pagesがページ単位での入れ替えとかページ単位での削除、ページ単位での挿入といった操作系の機能が弱いからです。ページ単位での削除、入れ替えといった操作ができません。おまえはPagesなんて名乗らず「Overflow」とか名乗っとけ! という気持ちでいっぱいです。Page関連操作の弱いPages.app。

Pagesのヘルプで確認しても、ページ単位での削除については、「ページ上のオブジェクトを削除したあと、地に敷いている文字を削除して回れ」という、脳みそに何か湧いているような説明しか見当たりません。

ウィンドウ左に表示されているページのサムネイルを選択して、コンテクストメニューから「削除」を選ぶと書類の内容がまるごと削除されるという「わけのわからない」挙動をします。セクションを小分けしてある場合には、当該ページを含むセクションを削除してくれるようですが、1セクション=1ページという作り方をしていない場合には複数ページが削除されてしまいます。

–> Watch Page Removal Demo on Pages Movie

そこで、仕方なく本Scriptを作成してみたわけです。本Scriptの前バージョンとして「最終ページ上のオブジェクトの全削除」Scriptを作成して、実際にこれでページ削除が行える/行えないパターンについて検証を重ねてきました。実用性もある程度あったので、実際に作業で使ってもいました。

条件1:ページ削除は末尾側から行う。先頭側からは行えない
条件2:書類作成時に、ページの「地」に文字を置かず、テキストボックスを配置して文字を流し込んでいる

–> Watch Page Removal AppleScript Demo Movie

本Scriptでは、ページの地に直接「テキスト」や「表」を流し込んでいるような作り方の書類だと、書類上の内容をまるごと削除してしまいます。そういう場合には、Pages上の「表」などの元データが存在しているはずなので、そちらを再利用して別のPagesレイアウトに流し込み直すような対応になることでしょう。

なお、Pagesは(KeynoteやNumbersも)書類に変更を加えるとリアルタイムにファイルに変更が反映されるため、本Scriptのような道具でページ単位の削除をおこなった場合、「ファイル保存していないから、ファイルの再オープンを行えば復帰」ということはできません。あらかじめ、元の書類のコピーを作っておいた上で実行するようにしてください。

AppleScript名:末尾から指定ページまでページ削除.scpt
—
–  Created by: Takaaki Naganoya
–  Created on: 2021/10/12
—
–  Copyright © 2021 Piyomaru Software, All Rights Reserved
—

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

set dMax to 3 –このページまで残す。ここから後はすべて削除する

tell application "Pages"
  set dCount to count every document
  
if dCount < 1 then
    display notification "Pagesでオープンしている書類はありません"
    
return
  end if
end tell

set pMax to getPageNum() of me
if pMax < (dMax + 1) then
  display notification "Pagesでオープンしている書類は、指定よりも少ないページ数であるため、削除の必要がありません"
  
return
end if

–セクションごとのページ数のリストを取得
set aList to retSectionPageList() of me
set bList to sectionPageListToSectionHeaderList(aList) of me

repeat with i from pMax to (dMax + 1) by -1
  tell application "Pages"
    tell front document
      –オブジェクト削除前のページ数
      
set pMax1 to getPageNum() of me
      
      
tell last page
        delete every iWork item
      end tell
      
      
–セクション先頭の場合
      
set curPStat to contents of item i of bList
      
if curPStat = true then
        tell last section
          set body text to ""
        end tell
      end if
      
      
–オブジェクト削除後のページ数
      
set pMax2 to getPageNum() of me
      
      
–オブジェクト削除処理を行ってもページ数に変動がない場合には、last section上のbody textも消してみる
      
if pMax2 = pMax1 then
        tell last section
          set body text to ""
        end tell
      end if
    end tell
  end tell
end repeat

–セクションごとのページ数のリストを、ページ単位のセクション開始位置リストに変換する
on sectionPageListToSectionHeaderList(aList)
  set bList to {}
  
  
repeat with tmpP in aList
    
    
if tmpP = 1 then
      set the end of bList to true
    else
      set the end of bList to true
      
repeat (tmpP – 1) times
        set the end of bList to false
      end repeat
    end if
  end repeat
  
  
return bList
end sectionPageListToSectionHeaderList

–最前面の書類の各セクションごとのページ数を1Dリスト(1次元配列)で返す
on retSectionPageList()
  tell application "Pages"
    tell front document
      set sList to every section
      
set pList to {}
      
repeat with i in sList
        set the end of pList to count every page of i
      end repeat
    end tell
  end tell
  
return pList
end retSectionPageList

–最前面の書類のページ数を取得
on getPageNum()
  tell application "Pages"
    tell front document
      return count every page
    end tell
  end tell
end getPageNum

★Click Here to Open This Script 

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

Pages書類の最終ページ上のすべてのオブジェクトを削除

Posted on 10月 11, 2021 by Takaaki Naganoya

最前面のPages書類のうちの最終ページ上のオブジェクトとテキストを削除するAppleScriptです。

Pagesで凝ったレイアウトの書類を作る場合、やりかたはいくつかありますが……ページはすべてセクション(改ページ処理みたいなもの)を入れて1ページ=1セクションみたいにページを作って、その上にテキストフレームを配置、ページ間のテキストフレームの連続はGUI上で指定しておき、テキストが先頭から末尾まで、指定ボックス上を流れていくように指定しています。

別途、脚注のテキストは別のテキストボックスを配置しておき、こちらも前ページの脚注と連結する必要があればつないでおきます。

そのうえで、このように作成したPages書類を前後で分割しようとした場合に、

(1)書類をコピー
(2)前半の書類は、後半部分を削除
(3)後半部分の書類は、前半部分を削除

となるわけです。

が、Pagesに「指定ページを削除」する機能はないので、このようなScriptを組んでいろいろ対処を行っています。

本Scriptは、(2)の処理を行うためのものです。最終ページ上のオブジェクトおよびテキストを削除することで、ページ自体を削除できます。

あとは、1ページ=1セクションで書類が構成されているかどうかをチェックすれば、ページ削除とほぼ同義で扱えるところです。

AppleScript名:末尾のページのオブジェクトを全削除.scpt
tell application "Pages"
  tell front document
    tell last page
      delete every iWork item
    end tell
    
    
tell last section
      set body text to ""
    end tell
    
    
  end tell
end tell

★Click Here to Open This Script 

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

AppleScript Version 2.8?

Posted on 10月 9, 2021 by Takaaki Naganoya

macOS 10.13以降、ながらくAppleScript Version 2.7の時代が続いておりました。

正直なところ、macOS 10.15でScripting Additionsを廃止したあたりとかでバージョン番号を変えておかないとまずくないか? と思っておりました。サードパーティのScripting Additionを使えなくした、というのは世界観の大きな分岐点といってよいでしょう。

AppleScriptの処理系そのものには手を加えていませんよ、互換性に問題が出たりはしませんよ、というメッセージをこめて意固地にバージョン番号を変えてこなかったのかと思っていました。


それが、macOS 12beta9でAppleScriptのバージョンを「system info」コマンドで確認していたところ(Cocoa Scripting Course続刊作成のため)、2.8という数字が表示されていることに気づきました。

{AppleScript version:"2.8", AppleScript Studio version:"1.5.3", system version:"12.0", short user name:"me", long user name:"XXXXXXXXXX", user ID:504, user locale:"ja_JP", home directory:alias "Macintosh HD:Users:me:", boot volume:"Macintosh HD:", computer name:"M1 mini", host name:"m1mini.local", IPv4 address:"192.168.0.xx", primary Ethernet address:"99:99:99:99:xx:99", CPU type:"ARM64E", CPU speed:missing value, physical memory:16384}

上記の実行例はM1 Mac miniの実行結果ですが、Intel Mac上でも同様のAppleScript Version 2.8という結果を返します。

Apple Silicon Macの「真の能力(ちから)」を発揮するバージョンとしての2.8なのか、それともiOSを含めたショートカット的な世界観を含んだ2.8なのか、テーマ設定がどこにあるのかはわかりませんが、ここで1つの区切りをつけたいんだろうなという「意図」は感じます。

AppleScript Version 2.7の期間のmacOSときたら、史上最低最悪の事故物件であるmacOS 10.13、大失敗を容易に2度繰り返してしまったmacOS 10.15、トラブルが絶えずβ版という印象がぬぐえなかったmacOS 11など、macOS 10.14以外は(それ自体も末期になるまで使う気がしなかった)あまり思いだしたくないOSバージョンばかりで、これらとの訣別という意味において「2.8」の数字を冠する(臭いものにはフタをしたい)という意図であれば一定の理解は可能です。

バージョン2.8になったからといって、64bit化されたCocoa Finderに対するフィルタ参照の実行速度が上がったりはしていません。Finderによるファイル操作は、「現在選択中のファイルの取得」「最前面にオープンされているWindowのターゲット取得」ぐらいにとどめておいたほうがいい(遅いので)という傾向が変わることはありません(Cocoa系の機能を呼び出すと100〜1,000倍ぐらい高速)。

これら以外に、何か意味が込められているのかはインサイダーではないため不明ですが、とにかくVersion 2.8というバージョン番号が振られたことについては認識しておく必要があることでしょう。

macOS 10.13の大失敗が、キリスト教国における不吉な数字としての「13」に起因するものであるとしたら、macOS 12の次の「macOS 13」は不吉な存在の集合体であり総決算でもあるわけで、ぜひとも開発プロジェクトの瓦解の真相究明と公表が求められるところです。

Posted in news | Tagged 12.0savvy | Leave a comment

macOS 12 beta9が登場

Posted on 10月 7, 2021 by Takaaki Naganoya

macOS 12 beta9が出てきています。もう、リリース間近というより大した問題がなければbeta 8でリリースしていたのでしょう。

AppleScript系では、Cocoa Scriptingの処理速度の低下は観測されていません。Beta 5以降はほぼ誤差の範囲内の変化しかありません。これはいいことです。

あいかわらず、日本語環境でNSDataDetectorで自然言語テキストからの電話番号の抽出に失敗します。これは、少し不幸なことですが、修正されることを期待したいところです。

Posted in Bug news | Tagged 12.0savvy | Leave a comment

iWorks Apps v11.2が登場

Posted on 9月 30, 2021 by Takaaki Naganoya

Apple純正のiWorks App(Keynote、Pages、Numbers)の新バージョンv11.2がリリースされました。

バージョン番号が「11.1」から「11.2」に変わっただけですが、内部的にも…各アプリケーションともアイコン自体が変更になり、大きな節目のバージョンであることが伺われます。

iOS、iPadOSが新製品とともに9月にアップデートし、iWorkアプリケーションがアップデートした後にmacOSのアップデートが行われるわけで、実にリリース間近であることを感じさせます。Windows 11の発表日がどの程度注目を浴びているかはわかりませんが、10月5日より前に発表することは…ないのではないかと(ノーアイデアです)。

これらのアプリケーションのAppleScript用語辞書については、「get」コマンドが追加されたことを確認していますが、このコマンドがないと実現できないことが不明(普通は省略されるコマンド)なので、何か後で追加するための「布石」と見るのが正しい見方でしょう。

Keynote v11.2の変更点:
・スライド上のライブビデオ
・複数発表者スライドショー
・レーダーグラフ(レーダーチャートのこと)

Pages v11.2の変更点:
・ブックの公開の改善
・素早くテキストを翻訳
・レーダーグラフ(レーダーチャートのこと)

Numbers v11.2の変更点:
・強力なピボットテーブル
・レーダーグラフ(レーダーチャートのこと)
・フィルタの改善

そして、AppleScript用語辞書に「レーダーグラフ」の作成機能は反映されていないため、まだAppleScriptから追加することはできません。通例だと、マイナーアップデート2回後ぐらいに反映されるのではないでしょうか?

Pages v11.2でトンでもない変更が加わっていることが判明しました。なんと、selectionを取得できなくなっています。

これは、Pagesの数少ない長所だったのですが、selectionを取得できないととても困ります、、、、、

一応、フィードバックしておきましたが、直るかどうかは不明です。Pagesの唯一の美点であった、selectionを返せ!!!

Keynote v11.2でも、selectionが使えなくなっていました(スライド単位の選択も無効に)。

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

macOS 12 beta8が登場

Posted on 9月 30, 2021 by Takaaki Naganoya

macOS 12 beta7からほどなく、beta8が出てきました。どうやら、このbetaか次あたりでリリースしたい様子が伺われます(推測)。

レポートずみのバグは修正されていませんが(確認された事実)、Release版で駆け込み修正が行われるか、Release後に後付け修正するつもりなのでしょう(希望的観測)。

macOS 10.13のときにRelease版が壊滅した(客観的事実)のは駆け込み修正の整合性がとれていなかったためと見る(推測、憶測)筋もあり、それに懲りて「GM」宣言をやめました(客観的事実)し、駆け込み修正を行わないように方針を転換したように見えます(観測結果からの意見)。

現状のmacOS 12beta8のままリリースされれば、自分が見ている範囲ではそれほど悪くない出来でしょう(個人の感想)。

→ Beta8でIntel Macで外部ディスプレイに表示できないというバグが発生したもよう。Intel Mac miniで動作確認していますが、こうした構成ではなくノートなど本体にディスプレイを搭載しているモデルの話でしょうか

Posted in news | Tagged 12.0savvy | Leave a comment

Pagesでページ数とfacing pagesフラグの値から右側ページを判定

Posted on 9月 26, 2021 by Takaaki Naganoya

Pagesでページ数とfacing pagesの値から該当のページが右側に存在するかどうかを判定するAppleScriptです。

ページが右側にあるかどうか、というこの判定処理はツメ処理のために用意したものです。見開きの右側に置くのが基本といいますか、別に左側にもあってもいいんですが、右側ページ右端に置いた縦長の表オブジェクトをツメと見立てて処理することに(個人的に)したためです。


▲同一のPages書類を「見開きページ」の設定をオフにした状態(左)、オンにした状態(右)でページの並びが変わる

AppleScript名:Pages書類のfacing Pagesを取得.scpt

set fRes to getFacingPages() of me

on getFacingPages()
  tell application "Pages"
    tell front document
      return facing pages
    end tell
  end tell
end getFacingPages

★Click Here to Open This Script 

こんな記述でfacing pagesの値を取得でき、この値とページ数(ノンブル)をもとに奇数ページ、偶数ページの判定を行い、ページの左右を判定できます。

本Scriptを実行すると、以下のようにログ表示を行います。{facing pages, ノンブル, 右側ページかどうかの判定結果}を表示しています。

(*false, 1, false*)
(*false, 2, true*)
(*false, 3, false*)
(*false, 4, true*)
(*false, 5, false*)
(*false, 6, true*)
(*true, 1, true*)
(*true, 2, false*)
(*true, 3, true*)
(*true, 4, false*)
(*true, 5, true*)
(*true, 6, false*)

以前にどこかで「奇数/偶数の判定処理なんて、素朴な処理をサブルーチンとして独立して用意しておくのか?」と聞かれたことがありましたが、このように、サブルーチンとして用意しておいたので簡単に使い回して利用できているわけです。

AppleScript名:Pagesのページ番号の該当ページが右側にあるかどうか計算.scpt

set flagList to {false, true}
repeat with i in flagList
  set aFlag to contents of i
  
repeat with aPage from 1 to 6
    set rRes to checkPagesRightPage(aPage, aFlag) of me
    
log {i, aPage, rRes}
  end repeat
end repeat

–Pagesのページ番号の該当ページが右側にあるかどうか計算
on checkPagesRightPage(aNum, aFlag)
  set oddF to chkOddNum(aNum) of me –奇数チェック
  
if {aFlag, oddF} = {true, true} then
    return true –右側ページ
  else if {aFlag, oddF} = {false, false} then
    return true –右側ページ
  else
    return false
  end if
end checkPagesRightPage

–奇数かどうかチェック
on chkOddNum(aNum)
  set a to aNum mod 2
  
if a = 1 then
    return true
  else
    return false
  end if
end chkOddNum

–偶数かどうかチェック
on chkEvenNum(aNum)
  set a to aNum mod 2
  
if a = 0 then
    return true
  else
    return false
  end if
end chkEvenNum

★Click Here to Open This Script 

Posted in boolean Number | Tagged 10.15savvy 11.0savvy 12.0savvy Pages | Leave a comment

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

Posted on 9月 26, 2021 by Takaaki Naganoya

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

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

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

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

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

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

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

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

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

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

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

★Click Here to Open This Script 

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

macOS 12 beta7が登場

Posted on 9月 22, 2021 by Takaaki Naganoya

ここ最近のmacOSのβ版の出来・不出来

macOS 12 beta 7が出てきました。macOSのリリースはiOS/iPadOSの後にリリースされるのが通例(というか、技術的にそうしないと無理)で、β番号から見て割とβ版の末期にあるものと推測されます。

例年だと、8月の終わりのmacOSの出来でRelease時の品質が推し図れています(農作物みたいだ)。

macOS 10.13:Beta中はとても好感触 → Release版で大事故(前代未聞の大惨事。macOS Vistaと呼ばれる)
macOS 10.14:Beta中、バグが多くて使う気になれず → 最終版(macOS 10.14.6)まで様子見
macOS 10.15:Beta中、8月末に大事故。開発者がそろって「こいつは新たなmacOS 10.13だ」として見放す。8月中にmacOS Vista 2のあだ名が確定
macOS 11:Beta中の印象は好感触(Intel Mac)。だが、Release後にM1 Macハードウェアがらみの未知の問題点が多数報告される

というのが、ここ最近のmacOSのリリースの流れです。

macOS 10.13、10.15と「奇数番号は地雷」という状態で、この命名法則でいえば「10.17」にあたるmacOS 12は、不吉な予感を抱かせるものでした。

Cocoa ScriptingなどAppleScript系の処理速度の回復と向上

自分はmacOS 10.15を全力で見送り、macOS 10.14.6をメイン環境にすえました。通例、新たなmacOSがリリースされるとScript環境まわりの評価記事を書きますが、10.15ははじめて評価記事をボイコットしたほどひどいものでした。

「10.15がひどい」という中には、「①本当にバグや不具合のもの」「②勝手に仕様変更して周知しなかったもの」「③OS全体のセキュリティ強化にともない、結果として機能不全になったもの」など多々あります。

その後、M1 Mac mini導入にともないmacOS 11に環境を移しました。M1 Mac mini+macOS 11は、世間の評判もよく、安住の地となるはずでした。

ところが! M1 Mac miniを開封して1時間もたたずに血の気がひきます。Cocoa Scriptingを多用している現代のAppleScriptを走らせると、2012年のMacBook Pro Retina 2012よりも10倍ぐらい遅かったからです。

調べてみると、macOS 10.15の時代からCocoa呼び出しで大幅なスピード低下が発生しており、その延長線にあるmacOS 11も同様の現象が発生。

さらに、M1に搭載されたCPUコアのうち、高性能コアではなく省エネコア(Ice Storm)を使用してAppleScriptが実行されているようで、2011年のMacBook Airよりも数倍M1 Mac miniが遅い処理が出てくる状況でした。

そこで、Shane Stanleyと相談してAppleに詳細なレポートを提出し、「おまえんとこの最新鋭機種は10年前のへっぽこマシンよりはるかに遅いぞ、どうしてくれる?」という報告をしたわけです。もちろん、M1 Mac mini購入後のアンケートでは「10年前のIntel Macの10倍も遅い。不満」と答えています。

運よく、レポートが功を奏してM1がらみの速度低下問題はmacOS 12beta 5で解決。同時にmacOS 10.15から発生していたCocoa呼び出しの速度低下問題も解決(たぶん)。このことで、Intel Macでも、速度低下発生前のmacOS 10.14より高速な処理が行えるようになったほどでした(もちろん、macOS 10.15や11よりも高速です)。

この問題の検証のため、手元のアップデート可能なMacは2台ともmacOS 12に上げてしまい、先日リリースされたmacOS 11.6においてパフォーマンス低下問題がフィードバックされたのかどうかは検証できません。

高速だが小バグが直っていないmacOS 12beta7

さて、macOS 12beta7ですが、ベンチマークを実施したところBeta 5、6と同様にCocoa Scriptingの速度は維持されています。Beta5よりも速くなった処理がある一方で、若干速度低下した項目も見られますが、誤差の範囲内でしょう。


▲同一ハードウェアでOSのアップデートにともない、速度低下が解消され、高速化


▲約700箇所の位置情報と8,000箇所の駅の位置情報との間での最短距離計算。macOS 11+M1 Macでは1時間かかって気を失いかけたが、いまではiMac Proより2.5倍高速の異次元の速さを実現。これなら、ScripterにもApple Silicon Macをおすすめできます

一方で、日本語環境でのみ発生しているNSStringからのData Detectorによる電話番号ピックアップができないバグは直っていません。GUI部品のお守りよりもデータ処理を行うことが多いAppleScript界隈としては「無視できない問題」です。

Release版では直ってほしいですよね>誰となく

また、macOS 11で確認された特定ハードウェア(Mac Pro 2019)で関数計算を間違えるバグについては、当該機種を所有していないため、自分には追跡調査は行えていません。

Posted in Bug news | Tagged 12.0savvy | Leave a comment

Pagesの最前面の書類で選択中のツメを修正する

Posted on 9月 22, 2021 by Takaaki Naganoya

Pagesで作成中の書類すべての見開き右側ページ右端につけている「ツメ」(辞書や電話帳でページ端につけているマーク的なもの、A〜Zのうちいま「S」の部分を表示していますよ、という場合にはSの箇所のみ色を変えておくなど)の修正を行うAppleScriptです。

PagesはiWork 3兄弟で唯一、選択中のオブジェクトがselectionで取得できるアプリケーションです。selectionでオブジェクトを選択可能かどうかでScriptの書きやすさが段違いです。

「ツメ」の修正が必要な事態になりました。AppleScriptのプログラムでPages書類を順次オープンして、書類中の右側ページ右端についている超縦長の表オブジェクトを「ツメ」であると仮定。このツメ(表)の修正を行う処理部分が、本AppleScriptの該当部分です。

Pages書類上の表の各種操作は、削除についてはdelete row 2とかdelete column 3といった操作が行えるのですが、追加に関してはinsert rowとかadd rowといった明示的なコマンドがあるわけではなく、propertyのcount rowを変更することで表末尾への行追加を行うことになります。

その後は、表のセル内の値を移動させたり、書式を変更するなどの「つじつま合わせ」を行うことになるでしょう。

あとは、指定フォルダ以下に入っているPages書類を抽出して、順次オープンし、書類中の右側ページ右端にある「ツメ」を計算でピックアップ。「ツメ」に対して修正を行い、保存してクローズ、という処理になるでしょうか。一度しか使えない壮大な「使い捨てScript」です。

AppleScript名:選択中のツメの修正・変更.scpt
tell application "Pages"
  tell front document
    set aSel to selection
    
if aSel = {} then return
    
    
set aaSel to first item of aSel
    
    
tell aaSel
      set row count of it to 15 –表の行数変更
      
      
tell row 14
        set aCon to value of cell 1
        
        
tell cell 1
          set value to "14"
          
set font name to "7barSPBd"
          
set font size to 22.0
          
set text color to {32767, 32767, 32767}
        end tell
        
      end tell
      
      
tell row 15
        set value of cell 1 to aCon
      end tell
      
    end tell
  end tell
end tell

★Click Here to Open This Script 

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

Post navigation

  • Older posts
  • Newer posts

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

Google Search

Popular posts

  • 開発機としてM2 Mac miniが来たのでガチレビュー
  • CotEditorで2つの書類の行単位での差分検出
  • macOS 15, Sequoia
  • 指定のWordファイルをPDFに書き出す
  • Pages本執筆中に、2つの書類モード切り替えに気がついた
  • Adobe AcrobatをAppleScriptから操作してPDF圧縮
  • メキシカンハットの描画
  • 与えられた文字列の1D Listのすべての順列組み合わせパターン文字列を返す v3(ベンチマーク用)
  • Numbersで選択範囲のセルの前後の空白を削除
  • Pixelmator Pro v3.6.4でAppleScriptからの操作時の挙動に違和感が
  • AdobeがInDesign v19.4からPOSIX pathを採用
  • Safariで「プロファイル」機能を使うとAppleScriptの処理に影響
  • Cocoa Scripting Course 続刊計画
  • AppleScriptによる並列処理
  • macOS 14.xでScript Menuの実行速度が大幅に下がるバグ
  • NaturalLanguage.frameworkでNLEmbeddingの処理が可能な言語をチェック
  • Keynote/Pagesで選択中の表カラムの幅を均等割
  • AppleScript入門③AppleScriptを使った「自動化」とは?
  • macOS 15 リモートApple Eventsにバグ?
  • Keynote、Pages、Numbers Ver.14.0が登場

Tags

10.11savvy (1102) 10.12savvy (1243) 10.13savvy (1392) 10.14savvy (587) 10.15savvy (438) 11.0savvy (283) 12.0savvy (212) 13.0savvy (189) 14.0savvy (141) 15.0savvy (119) CotEditor (66) Finder (51) iTunes (19) Keynote (115) 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 (54) 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
  • dialog
  • diff
  • drive
  • Droplet
  • exif
  • file
  • File path
  • filter
  • folder
  • Font
  • Font
  • GAME
  • geolocation
  • GUI
  • GUI Scripting
  • Hex
  • History
  • How To
  • iCloud
  • Icon
  • Image
  • Input Method
  • Internet
  • iOS App
  • JavaScript
  • JSON
  • JXA
  • Keychain
  • Keychain
  • Language
  • Library
  • list
  • Locale
  • Localize
  • Machine Learning
  • Map
  • Markdown
  • Menu
  • Metadata
  • MIDI
  • MIME
  • Natural Language Processing
  • Network
  • news
  • Noification
  • Notarization
  • Number
  • Object control
  • OCR
  • OSA
  • parallel processing
  • PDF
  • Peripheral
  • PRODUCTS
  • QR Code
  • Raw AppleEvent Code
  • Record
  • rectangle
  • recursive call
  • regexp
  • Release
  • Remote Control
  • Require Control-Command-R to run
  • REST API
  • Review
  • RTF
  • Sandbox
  • Screen Saver
  • Script Libraries
  • sdef
  • search
  • Security
  • selection
  • shell script
  • Shortcuts Workflow
  • Sort
  • Sound
  • Spellchecker
  • Spotlight
  • SVG
  • System
  • Tag
  • Telephony
  • Text
  • Text to Speech
  • timezone
  • Tools
  • Update
  • URL
  • UTI
  • Web Contents Control
  • WiFi
  • XML
  • XML-RPC
  • イベント(Event)
  • 未分類

アーカイブ

  • 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