月: 2023年1月

Keynoteの表の選択中のセルのデータをDeepLで翻訳して書き戻す

Posted on by

Keynoteの最前面の書類中の、現在表示中のスライドの表の選択中のセル中のテキストを取得してDeepLのREST APIを呼び出して指定言語に翻訳し、表のセルに翻訳後のテキストを書き戻すAppleScriptです。

DeepLのREST API呼び出しのためには、DeepL SE社のWebサイトで「DeepL API Free」(無料コース)か「DeepL API Pro」プランにサインアップして、API Keyを取得して、プログラムリスト中に記入したうえで実行してください。


さんかく実行前。Keynote書類上の表の翻訳対象のセルを選択して実行


さんかく実行後。Keynote書類上の表の翻訳対象のセルをに翻訳後の内容をストア

実際に使ってみると、けっこう翻訳に時間がかかるのと、一度翻訳した同じフレーズを再度翻訳させるのはコストがかかるため、ローカルに「翻訳キャッシュ」を作って、翻訳ずみの内容を再翻訳しないように工夫する必要がありそうです。

AppleScript名:Keynoteの表の選択中のセルのデータをDeepLで翻訳して書き戻す.scpt

– Created by: Takaaki Naganoya
– Created on: 2023年01月30日

– Copyright © 2023 Piyomaru Software, All Rights Reserved

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

property NSString : a reference to current application’s NSString
property NSCountedSet : a reference to current application’s NSCountedSet
property NSJSONSerialization : a reference to current application’s NSJSONSerialization
property NSUTF8StringEncoding : a reference to current application’s NSUTF8StringEncoding

set myAPIKey to "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"
set myTargLang to "EN" –翻訳ターゲット言語

set aTableDat to returnSelectedTableCellDataOnCurrentSlide() of me
–> {"プロパティ項目", "データ型", "読み/書き", "内容(サンプル)", "説明"}

set nList to {}
repeat with i in aTableDat
set j to contents of i
set tRes to translateWithDeepL(j, myAPIKey, myTargLang) of me
set the end of nList to tRes
end repeat

–表に翻訳した内容を書き戻す
storeSelectedTableCellDataOnCurrentSlide(nList) of me

on storeSelectedTableCellDataOnCurrentSlide(sList)
tell application "Keynote"
tell front document
tell current slide
try
set theTable to first table whose class of selection range is range
on error
return false –何も選択されてなかった場合
end try

tell theTable
set cList to every cell of selection range
if (length of cList) is not equal to (length of sList) then error

set aCount to 1
repeat with i in cList
set j to contents of i
tell j
set value of it to (contents of item aCount of sList)
end tell
set aCount to aCount + 1
end repeat
end tell
end tell
end tell
end tell
end storeSelectedTableCellDataOnCurrentSlide

on returnSelectedTableCellDataOnCurrentSlide()
tell application "Keynote"
tell front document
tell current slide
try
set theTable to first table whose class of selection range is range
on error
return false –何も選択されてなかった場合
end try

tell theTable
set vList to value of every cell of selection range
set cCount to count of column of selection range
set rCount to count of row of selection range

–複数行選択されていた場合にはエラーを返すなどの処理の布石
return vList
end tell
end tell
end tell
end tell
end returnSelectedTableCellDataOnCurrentSlide

–DeepLのAPIを呼び出して翻訳する
on translateWithDeepL(myText, myAPIKey, myTargLang)
set sText to "curl -X POST ’https://api-free.deepl.com/v2/translate’ -H ’Authorization: DeepL-Auth-Key " & myAPIKey & "’ -d ’text=" & myText & "’ -d ’target_lang=" & myTargLang & "’"
try
set sRes to do shell script sText
on error
error
end try

set jsonString to NSString’s stringWithString:sRes
set jsonData to jsonString’s dataUsingEncoding:(NSUTF8StringEncoding)
set aJsonDict to NSJSONSerialization’s JSONObjectWithData:jsonData options:0 |error|:(missing value)

set tRes to aJsonDict’s valueForKeyPath:"translations.text"
if tRes = missing value then
set erMes to (aJsonDict’s valueForKey:"message") as string
error erMes
else
return contents of first item of (tRes as list)
end if
end translateWithDeepL

新発売:ポケコンサークル「LL」会誌Vol.19復刻版

Posted on by

1987年に結成し、1994年まで会誌を発行し続けていたポケットコンピュータのユーザーズサークル「LL」の会報Vol.19の復刻・電子書籍版を刊行しました。

販売ページ

Piyomaru Softwareによる電子書籍の71冊目です。例によって制作過程では大量のAppleScriptが使用されていますが、AppleScriptに関する本ではありません。

1987年に結成された、ポケコンサークル「LL」の会誌最終号(Vol.19)の復刻版です(当時のLL会員の方には無償配布)。1994年に発行された会誌Vol.19のバックアップCD-Rデータから再作成して蘇った電子書籍版。PDF 282ページ。

目次

しかく巻頭カラーグラビアページ

・欧州の森に謎のPC-1560を見た!
・幸福の青いPC-1500″D”
・月々240円で昔の彼女に会える
・SC61860をサポートするクロスアセンブラ
・2022年に新発売のMEPに驚愕!
・これがCE-140Fエミュレータだ!
・PC-1600用 大容量RAMモジュール
・露国在住のHWRなあんちくしょう
・多機種対応/合体式Bluetoothモジュール
・CE-126Pエミュレータで感熱紙不要の印刷を
・鉄人・堀川浩司氏のイベント参加魂!
・独仏のWebサイトは一味も二味も違う!
・東京都青梅市に古パソコン動態保存の「夢の図書館」
・ポケコン用のLCDをオリジナルで作成・販売
・ポケコン用周辺機器の製造・販売を行う高松製作所
・ポケコンなどの3Dモデルをフリー公開
・日本国内外のパソコンメーカー栄枯盛衰

まえがき

ポケコンを当時何に使っていたの?〜当時のポケコンユーザーの活動内容を振り返る

会誌作成テクノロジーの進歩〜LL会誌を作る道具がどのように進化していったか

できるかな? Vol.2 ポケコン用PC-9801マウスインタフェース「鼠小僧キューハチ」完成!

CE-140F徹底解析

X680x0によるポケコンのクロス開発

酸化ナトリウムくらぶ Vol.16 Pocket Movie Project第2回 「コントロール・コード」

常駐型 多重再生PCM&サウンドドライバーSound TSR 16K

CHENGER mkII For PC-1600K, PC-1605K, PC-1600

常駐型割り込みハードコピープログラムFor PC-1600K, PC-1605K, PC-1600 Post It! ver1.2

白黒二値画面情報圧縮用副プログラム集 LIPS For PC-1600K, PC-1605K, PC-1600

割り込みリアルタイムクロック For PC-1600K, PC-1605K, PC-1600

カルチャーショック野球拳 For PC-1600K, PC-1605K

でぃじたる和時計 For PC-1600K, PC-1605K

しかくエッセイ

しかくふりーとーく

しかくかつて運営していたパソコン通信ホスト「LLine」をふりかえる

しかくThe LL Times

しかくTV LL

しかく編集後記2023

16進数の計算

Posted on by

ちょっとした16進数の計算を行いたいときに、AppleScriptのネイティブ機能にはそういうのはないので、別のものが持っている機能を利用することになります。

いろいろCocoa系の機能も探してみたものの、結局「shellのbcコマンドが手っ取り早くていいよね!」ということに。

ポケコンサークルの会誌のダンプリストをもとに、入力用のBASICのリストを自動作成するとき、アドレスを変更しなくては入力できないことが判明。このさい、アドレス計算を行うのに16進数の加算が必要でした。そのために作ってみたものです。

AppleScript名:16進数の計算.scpt

– Created by: Takaaki Naganoya
– Created on: 2023年01月25日

– Copyright © 2023 Piyomaru Software, All Rights Reserved

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

set a to "8030"
set b to "6000"
set h1 to hexStrAdd(a, b) of me
–> "E030"

set h3 to hexStrSub(a, b) of me
–> "2030"

on hexStrAdd(aStr as string, bStr as string)
set sStr to "echo \"ibase=10; obase=10; " & aStr & "+" & bStr & "\" | bc"
set aRes to do shell script sStr
return aRes as string
end hexStrAdd

on hexStrSub(aStr as string, bStr as string)
set sStr to "echo \"ibase=10; obase=10; " & aStr & "-" & bStr & "\" | bc"
set aRes to do shell script sStr
return aRes as string
end hexStrSub

SHARP MZ MML再生_アルハンブラ_mono

Posted on by

はるかかなた昔の、MZ-80Bが採用していた単音3オクターブの範囲の音楽再生を行うPLAY文、それに準拠したポケットコンピュータ用の音楽再生プログラムのデータ「アルハンブラの想い出」の再生を行うため「だけ」に、そのMML再生プログラムをAppleScriptで作ってみたものです(2時間ぐらいだったか)。

音階再生用に、オープンソースの「MPSoundEngine」フレームワークをUniversal Binaryでビルドし直して、これを用いて音階データと音の長さのデータのテーブルを作って再生しています。

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

オリジナルのMZにしてもポケットコンピュータのMML再生プログラムにしても、単音しか出ない仕様ですが、このデータの原作者が楽譜を細切れにしてアルペジオ奏法で演奏させているかのような効果を生み出しています。これは、当時も腰を抜かしましたが、普通こんなものはやらない狂気の産物、人類レベルの遺産といえます。

本AppleScriptの再生ムービー

MPSoundEngineをフレームワーク化したものを呼び出しているため、実行にはScript Debuggerが必要です。macOS 11よりも古い環境では以前に掲載したFramework(Intelバイナリのみ)がそのまま利用できるはずです。

まだ、いまひとつ休符(R)の処理などがうまく行っていないようで、この曲以外のデータを再生させると、首をひねってしまう演奏をしてしまうものの、それはオリジナルのデータの出来がよくなかったのか、あるいはこのプログラムの再現度が高くないためかは不明です。

AppleScript名:SHARP MZ MML再生_アルハンブラ_mono.scptd

– Created by: Takaaki Naganoya
– Created on: 2022年12月22日

– Copyright © 2022 Piyomaru Software, All Rights Reserved

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

script spd
property musStr : ""
property musList : {}
property mmlList : {}
end script

set octL to {"-C", "-#C", "-D", "-#D", "-E", "-F", "-#F", "-G", "-#G", "-A", "-#A", "-B", "C", "#C", "D", "#D", "E", "F", "#F", "G", "#G", "A", "#A", "B", "+C", "+#C", "+D", "+#D", "+E", "+F", "+#F", "+G", "+#G", "+A", "+#A", "+B"}

set lenL to {130.81, 138.59, 146.83, 155.56, 164.81, 174.61, 185.0, 196.0, 207.65, 220.0, 233.08, 246.94, 261.63, 277.18, 293.66, 311.13, 329.63, 349.23, 369.99, 392.0, 415.3, 440.0, 466.16, 493.88, 523.25, 554.37, 587.33, 622.25, 659.25, 698.46, 739.99, 783.99, 830.61, 880.0, 932.33, 987.77}

set noteList to {"9", "8", "7", "6", "5", "4", "3", "2", "1", "0"}
set noteTime to {4, 3, 2, 1.5, 1, 0.75, 0.5, 0.375, 0.25, 0.125}

set aDict to current application’s NSMutableDictionary’s dictionaryWithObjects:(lenL) forKeys:(octL)
set bDict to current application’s NSMutableDictionary’s dictionaryWithObjects:(noteTime) forKeys:(noteList)

set (musStr of spd) to "-A0+E+E+EE+E+E+E+C0+E+E+EE+E+E+EB0+D+D+DE+D+D+D-A0+C+C+CE+C+C+CA0+C+C+CE+C+C+CB0+D+D+DE+D+D+D-A0+E+E+EE+E+E+E+C0+E+E+EE+E+E+E+C0+E+E+EE+E+E+E-A0+E+E+EE+E+E+E+C0+E+E+EE+E+E+E+D0+F+F+FG+F+F+FC0+G+G+GG+G+G+G+E0+G+G+GG+G+G+G+E0+F+F+FG+F+F+FC0+E+E+EG+E+E+E+C0+E+E+EG+E+E+E+D0+F+F+FG+F+F+FC0+G+G+GG+G+G+G+E0+G+G+GG+G+G+G+E0+G+G+GG+G+G+GC0+G+G+GG+G+G+G+E0+G+G+GG+G+G+G+E0+G+G+GG+G+G+G-F0+C+C+CC+C+C+CA0+C+C+CC+C+C+CG0+B+B+BC+B+B+B-F0+A+A+AC+A+A+A+F0+A+A+AC+A+A+A-D0+B+B+BF+B+B+B-E0+A+A+AB+A+A+A+E0+#G+#G+#GB0+#G+#G+#G+E0+#G+#G+#GB0+#G+#G+#G-E0+#G+#G+#G+D0+#G+#G+#G+E0+#G+#G+#G+D0+#G+#G+#G+E0+#G+#G+#G+D0+#G+#G+#G-A0+#A+#A+#A+#C0+#A+#A+#A+E0+#A+#A+#A+#C0+#A+#A+#A+E0+A+A+A+#C0+A+A+A#C0+G+G+GA+G+G+G+E0+G+G+GA+G+G+G+F0+A+A+AA+A+A+AD0+G+G+G+E+G+G+G+D0+F+F+FA+F+F+F+D0+F+F+FA+F+F+FD0+F+F+FA+F+F+F+D0+F+F+FA+F+F+F+D0+F+F+FA+F+F+FD0+E+E+EA+E+E+E+B0+E+E+EA+E+E+E+B0+D+D+DA+D+D+D-F0+C+C+C#D+C+C+CA0+C+C+C#D+C+C+CA0+D+D+DD+D+D+D-E0+C+C+CE+C+C+C#G0BBBEBBB#G0BBBEBBB-E0BBBEBBB#G0BBBEBBB#G0BBBEBBB-A0+E+E+EE+E+E+E+C0+E+E+EE+E+E+EB0+D+D+DE+D+D+D-A0+C+C+CE+C+C+CA0+C+C+CE+C+C+CB0+D+D+DE+D+D+D-A0+E+E+EE+E+E+E+C0+E+E+EE+E+E+E+C0+E+E+EE+E+E+E-A0+E+E+EE+E+E+E+C0+E+E+EE+E+E+E+D0+F+F+FG+F+F+FC0+G+G+GG+G+GE0+G+G+GG+G+G+G+E0+F+F+FG+F+F+FC0+E+E+EG+E+E+E+C0+E+E+EG+E+E+E+D0+F+F+FG+F+F+FC0+G+G+GG+G+G+G+E0+G+G+GG+G+G+G+E0+G+G+GG+G+G+GC0+G+G+GG+G+G+G+E0+G+G+GG+G+G+G+E0+G+G+GG+G+G+G-F0+C+C+CC+C+C+CA0+C+C+CC+C+C+CG0+B+B+BC+B+B+B-F0+A+A+AC+A+A+A+F0+A+A+AC+A+A+A-D0+B+B+BF+B+B+B-E0+A+A+AB+A+A+A+E0+#G+#G+#GB0+#G+#G+#G+E0+#G+#G+#GB0+#G+#G+#G-E0+#G+#G+#GD0+#G+#G+#G+E0+#G+#G+#G+D0+#G+#G+#G+E0+#G+#G+#GD0+#G+#G+#G-A0+#A+#A+#A+#C0+#A+#A+#A+E0+#A+#A+#A+#C0+#A+#A+#A+E0+A+A+A+#C+A+A+A#C0+G+G+GA+G+G+G+E0+G+G+GA+G+G+G+F0+A+A+AA+A+A+AD0+G+G+G+E+G+G+G+D0+F+F+FA+F+F+F+D0+F+F+FA+F+F+FD0+F+F+FA+F+F+F+D0+F+F+FA+F+F+F+D0+F+F+FA+F+F+FD0+E+E+EA+E+E+E+B0+E+E+EA+E+E+E+B0+D+D+DA+D+D+D-F0+C+C+C#D+C+C+CA0+C+C+C#D+C+C+CA0+D+D+DD+D+D+D-E0+C+C+CE+C+C+C#G0BBBEBBB#G0BBBEBBB-E0BBBEBBB#G0BBBEBBB#G0BBBEBBB-A0+E+E+EE+E+E+E+#C0+E+E+EE+E+E+EB0+D+D+DE+D+D+D-A0+#C+#C+#CE0+#C+#C+#CA0+#C+#C+#CE0+#C+#C+#CB0+D+D+DE+D+D+D-A0+E+E+EE+E+E+E+#C0+E+E+EE+E+E+E+#C0+E+E+EE+E+E+E-A0+E+E+EE+E+E+E+#C0+E+E+EE+E+E+E+#C0+E+E+EE+E+E+E-A0+#F+#F+#F#F0+#F+#F+#F+D0+#F+#F+#F#F0+#F+#F+#F+D0+#F+#F+#F#F0+#F+#F+#F-A0+D+D+DD+D+D+DB0+D+D+DD+D+D+DD0+#F+#F+#F#F0+#F+#F+#F-A0+#F+#F+#F-D0+#F+#F+#G+#F+#C0+E+E+EE+E+E+E+#C0+E+E+EE+E+E+E-A0+E+E+EE+E+E+E+#C0+E+E+EE+E+E+E+#C0+E+E+EE+E+E+E-#F0+A+A+A#F+A+A+AA0+A+A+A+#C+A+A+AA0+A+A+A#F+A+A+A#G0+#G+#G+#G#G0+#G+#G+#G#B0+#G+#G+#G#D0+#G+#G+#G#B0+#D+#D+#D#G0+#D+#D+#D#C0+#F+#F+#F#G0+#F+#F+#F+#C0+E+E+E#G+E+E+E+#C0+E+E+E#G+E+E+E#C0+E+E+E#G0+E+E+E+#C0+E+E+E#G+E+E+E+#C0+E+E+E#G+E+E+E-B0+D+D+DF+D+D+DF0+D+D+DD+D+D+DE0+D+D+DF+D+D+D-E0+#C+#C+#CE0+#C+#C+#CE0+#C+#C+#CE0+#C+#C+#C-E0BBBDBBB-A0BBBEBBBE0AAAEAAA#F0AAAGAAA-A0AAAEAAA#C0AAAEBBBA0+#C+#C+#CB0+D+D+D-A0+E+E+EE+E+E+E+#C0+E+E+EE+E+E+EB0+D+D+DE+D+D+D-A0+#C+#C+#CE0+#C+#C+#CA0+#C+#C+#CE0+#C+#C+#CB0+D+D+DE+D+D+D-A0+E+E+EE+E+E+E+#C0+E+E+EE+E+E+E+#C0+E+E+EE+E+E+E-A0+E+E+EE+E+E+E+#C0+E+E+EE+E+E+E+#C0+E+E+EE+E+E+E-A0+#F+#F+#F#F0+#F+#F+#F+D0+#F+#F+#F#F0+#F+#F+#F+D0+#F+#F+#F#F0+#F+#F+#F-A0+D+D+DD+D+D+DB0+D+D+DD+D+D+DD0+#F+#F+#F#F0+#F+#F+#F-A0+#F+#F+#F-D0+#F+#F+#F+#C0+E+E+EE+E+E+E+#C0+E+E+EE+E+E+E-A0+E+E+EE+E+E+E+#C0+E+E+EE+E+E+E+#C0+E+E+EE+E+E+E-#F0+A+A+A#F+A+A+AA0+A+A+A+#C+A+A+AA0+A+A+A#F+A+A+A#G0+#G+#G+#G#G0+#G+#G+#G#B0+#G+#G+#G#D0+#G+#G+#G#B0+#D+#D+#D#G0+#D+#D+#D#C0+#F+#F+#F#G0+#F+#F+#F+#C0+E+E+E#G+E+E+E+#C0+E+E+E#G+E+E+E#C0+E+E+E#G+E+E+E+#C0+E+E+E#G+E+E+E+#C0+E+E+E#G+E+E+E-B0+D+D+DF+D+D+DF0+D+D+DD+D+D+DE0+D+D+DF+D+D+D-E0+#C+#C+#CE0+#C+#C+#CE0+#C+#C+#CE0+#C+#C+#C-E0BBBDBBB-A0AAAEAAAE0AAAEBBBA0+C+C+CB+D+D+D-A0+E+E+EE+E+E+E+C0+E+E+EE+E+E+EB0+D+D+DE+D+D+D-A0+C+C+CE+C+C+CA0+C+C+CE+C+C+CB0+D+D+DE+D+D+D-A0+E+E+EE+E+E+E+C0+E+E+EE+E+E+E+C0+E+E+EE+E+E+E-A0+E+E+EE+E+E+E+C0+E+E+EE+E+E+E+D0+F+F+FG+F+F+FC0+G+G+GG+G+G+G+E0+G+G+GG+G+G+G+E0+F+F+FG+F+F+FC0+E+E+EG+E+E+E+C0+E+E+EG+E+E+ED0+F+F+FG+F+F+FC0+G+G+GG+G+G+G+E0+G+G+GG+G+G+G+E0+G+G+GG+G+G+GC0+G+G+GG+G+G+G+E0+G+G+GG+G+G+G+E0+G+G+GG+G+G+G-F0+C+C+CC+C+C+CA0+C+C+CC+C+C+CG0+B+B+BC+B+B+B-F0+A+A+AC+A+A+A+F0+A+A+AC+A+A+A-D0+B+B+BF+B+B+B-E0+A+A+AB+A+A+A+E0+#G+#G+#GB0+#G+#G+#G+E0+#G+#G+#GB0+#G+#G+#G-E0+#G+#G+#GD0+#G+#G+#G+E0+#G+#G+#G+D0+#G+#G+#G+E0+#G+#G+#G+D0+#G+#G+#G-A0+#A+#A+#A+#C0+#A+#A+#A+E0+#A+#A+#A+#C0+#A+#A+#A+E0+A+A+A+#C+A+A+A#C0+G+G+GA+G+G+G+E0+G+G+GA+G+G+G+F0+A+A+AA+A+A+AD0+G+G+G+E+G+G+G+D0+F+F+FA+F+F+F+D0+F+F+FA+F+F+FD0+F+F+FA+F+F+F+D0+F+F+FA+F+F+F+D0+F+F+FA+F+F+FD0+E+E+EA+E+E+E+B0+E+E+EA+E+E+E+B0+D+D+DA+D+D+D-F0+C+C+C#D+C+C+CA0+C+C+C#D+C+C+CA0+D+D+DD+D+D+D-E0+C+C+CE+C+C+C#G0BBBEBBB#G0BBBEBBB-E0BBBEBBB#G0BBBEBBB#G0BBBEBBB-A0+E+E+EE+E+E+E+#C0+E+E+EE+E+E+EB0+D+D+DE+D+D+D-A0+#C+#C+#CE0+#C+#C+#CA0+#C+#C+#CE0+#C+#C+#CB0+D+D+DE+D+D+D-A0+E+E+EE+E+E+E+#C0+E+E+EE+E+E+E+#C0+E+E+EE+E+E+E-A0+E+E+EE+E+E+E+#C0+E+E+EE+E+E+E+#C0+E+E+EE+E+E+E-A0+#F+#F+#F#F0+#F+#F+#F+D0+#F+#F+#F#F0+#F+#F+#F+D0+#F+#F+#F#F0+#F+#F+#F-A0+D+D+DD+D+D+DB0+D+D+DD+D+D+DD0+#F+#F+#F#F0+#F+#F+#F-A0+#F+#F+#F-D0+#F+#F+#F+#C0+E+E+EE+E+E+E+#C0+E+E+EE+E+E+E-A0+E+E+EE+E+E+E+#C0+E+E+EE+E+E+E+#C0+E+E+EE+E+E+E-#F0+A+A+A#F+A+A+AA0+A+A+A+#C+A+A+AA0+A+A+A#F+A+A+A#G0+#G+#G+#G#G0+#G+#G+#G#B0+#G+#G+#G#D0+#G+#G+#G#B0+#D+#D+#D#G0+#D+#D+#D#C0+#F+#F+#F#G0+#F+#F+#F+#C0+E+E+E#G0+E+E+E+#C0+E+E+E#G0+E+E+E#C0+E+E+E#G0+E+E+E+#C0+E+E+E#G+E+E+E+#C0+E+E+E#G+E+E+E-B0+D+D+DF+D+D+DF0+D+D+DD+D+D+DE0+D+D+DF+D+D+D-E0+#C+#C+#CE0+#C+#C+#CE0+#C+#C+#CE0+#C+#C+#C-E0BBBDBBB-A0BBBEBBBE0AAAEAAA#F0AAAGAAA-A0AAAEAAAE0AAAEAAAE0AAAEAAA-A0AAAFAAAF0AAAFAAAF0AAAFAAA-A0BBBFBBBA0+C+C+CF+C+C+CA0+D+D+DF+D+D+D-A0+E+E+EE+E+E+E+#C0+E+E+EE+E+E+E+#C0+E+E+EE+E+E+E-A0+E+E+EE+E+E+E+#C0+E+E+EE+E+E+E+#C0+E+E+EE+E+E+E-E0+E+E+E#G+E+E+E#G0+E+E+E#G+E+E+E#G0+E+E+E#G+E+E+E-E0+D+D+D#F+D+D+DE0+C+C+CE+C+C+C-E0BBBDBBB-A0AAAEAAAE0AAA#EAAAF0AAA#EAAA-A0AAAEAAAE0AAAEAAAE0AAAEAAA-A0AAAFAAAF0AAAFAAAF0AAAFAAA-A0BBBFBBBA0+C+C+CF+C+C+CA0+B+B+BF+B+B+B-A0+E+E+EE+E+E+E+#C0+E+E+EE+E+E+E+#C0+E+E+EE+E+E+E-A0+E+E+EE+E+E+E+#C0+E+E+EE+E+E+E+#C0+E+E+EE+E+E+E-E0+#G+#G+#GE0+#G+#G+#G+E0+#G+#G+#GE0+#G+#G+#G+E0+#G+#G+#GE0+#G+#G+#G-E0+#F+#F+#FE0+#F+#F+#F+#C0+E+E+EE+E+E+EB0+D+D+DE+D+D+D-A0+#C+#C+#CE0+#C+#C+#CA0+#C+#C+#CE0+#C+#C+#C#F0+#C+#C+#CA0+#C+#C+#C-A0+#C+#C+#CE0+#C+#C+#CA0+#C+#C+#C-E0+#C+#C+#C-#B0+#C+#C+#C#C0+#C+#C+#C-A0+#C+#C+#CE0+#C+#C+#CA0+#C+#C+#C-E0+#C+#C+#C-#B0+#C+#C+#C#C0+#C+#C+#C-A3EA+#C+E+A+E8A7R7"

set baseTime to 0.25
set (musList of spd) to characters of (musStr of spd)
set octV to 0 –Ave Octave

set defaultNote to {octave:0, noteStr:missing value, sharpF:missing value, flatF:missing value, noteLength:missing value}
copy defaultNote to curNote

set prevNoteLength to -1
set (mmlList of spd) to {}

repeat with i in (musList of spd)
set j to contents of i

considering case
if j = "-" then
if noteStr of curNote is not equal to missing value then
set the end of (mmlList of spd) to curNote
set prevNoteLength to noteLength of curNote

copy defaultNote to curNote
set (noteLength of curNote) to prevNoteLength
set octave of curNote to -1
else
set octave of curNote to -1
end if

else if j = "+" then
if noteStr of curNote is not equal to missing value then
set the end of (mmlList of spd) to curNote
set prevNoteLength to noteLength of curNote

copy defaultNote to curNote
set (noteLength of curNote) to prevNoteLength
set octave of curNote to 1
else
set octave of curNote to 1
end if

(*
else if j = "b" then –Flat
if noteStr of curNote is not equal to missing value then
set the end of mmlList to curNote
set prevNoteLength to noteLength of curNote

copy defaultNote to curNote
set (noteLength of curNote) to prevNoteLength
else
set flatF of curNote to true
end if
*)
else if j = "#" then –Sharp
if noteStr of curNote is not equal to missing value then
set the end of (mmlList of spd) to curNote
set prevNoteLength to noteLength of curNote

copy defaultNote to curNote
set (noteLength of curNote) to prevNoteLength
else
set sharpF of curNote to true
end if

else if j is in {"C", "D", "E", "F", "G", "A", "B", "R"} then
if noteStr of curNote is not equal to missing value then
set the end of (mmlList of spd) to curNote
set prevNoteLength to noteLength of curNote

copy defaultNote to curNote
set (noteLength of curNote) to prevNoteLength

end if

set (noteStr of curNote) to j

else if j is in noteList then
set noteLength of curNote to j
if noteStr of curNote is not equal to missing value then
set the end of (mmlList of spd) to curNote
set prevNoteLength to noteLength of curNote

copy defaultNote to curNote
set (noteLength of curNote) to prevNoteLength
else
set the end of (mmlList of spd) to curNote
end if

end if
end considering

end repeat

if noteStr of curNote is not equal to missing value then set the end of (mmlList of spd) to curNote –Append Last Item
–return mmlList

–Play
set engine to current application’s MPMonoSoundEngine’s alloc()’s init()
engine’s start()

repeat with i in (mmlList of spd)
set j to contents of i

set curOctave to octave of j
set curOctaveStr to encodeOctave(curOctave) of me

set sharpFlag to sharpF of j
set flatFlag to flatF of j
set sfStr to encodeSharpAndFlat(sharpFlag, flatFlag) of me

set noteLenStr to noteLength of j
set noteLenTime to (bDict’s valueForKey:noteLenStr) as real

set noteString to noteStr of j
if noteString = "R" then
engine’s |stop|()
(current application’s NSThread’s sleepForTimeInterval:(((noteLenTime * baseTime)) as real))
–delay (noteLenTime * baseTime) / 2
engine’s start()
else
set noteKey to curOctaveStr & sfStr & noteString
try
set noteFreq to (aDict’s valueForKey:noteKey) as real
on error
engine’s |stop|()
return
end try

(engine’s channel’s setFrequency:noteFreq)
–(engine’s rightChannel()’s setFrequency:noteFreq)

(current application’s NSThread’s sleepForTimeInterval:(((noteLenTime * baseTime)) as real))

end if
end repeat

engine’s |stop|()

on encodeSharpAndFlat(sharpF, flatF)
if {sharpF, flatF} = {missing value, missing value} then return ""
if {sharpF, flatF} = {true, missing value} then return "#"
if {sharpF, flatF} = {missing value, true} then return "b"
if {sharpF, flatF} = {true, true} then error "Sharp and Flat in one note"
end encodeSharpAndFlat

on encodeOctave(curOctave)
if curOctave = 0 then
set curOctaveStr to ""
else if curOctave = 1 then
set curOctaveStr to "+"
else if curOctave = -1 then
set curOctaveStr to "-"
end if
return curOctaveStr
end encodeOctave

HexDump to BASIC

Posted on by

これも同じく、8bitコンピュータ時代のクロスアセンブラが出力していたダンプリストを、BASICのPOKE文に展開して出力するという、20〜30年前の仕様のテキスト変換を行うために作ったものです。

CotEditorでオープン中のダンプリストのテキストの変換対象行を選択しておいた状態で実行すると、変換したリストを新規書類に出力します。

AppleScript名:HexDump to BASIC.scpt

– Created by: Takaaki Naganoya
– Created on: 2023年01月09日

– Copyright © 2023 Piyomaru Software, All Rights Reserved

tell application "CotEditor"
tell front document
set aaSel to paragraphs of contents of selection
end tell
end tell

set sNum to 100
set allText to ""
repeat with i in aaSel
set tmpL to ""

set bList to words of i
set aStr to retOnLineBasicPoke(bList) of me
set allText to allText & ((sNum as string) & ": ") & aStr & return
set sNum to sNum + 1
end repeat

tell application "CotEditor"
set newDoc to make new document
tell newDoc
set contents of it to allText
end tell
end tell

on retOnLineBasicPoke(aList)
set addrStr to first item of aList
set aList to rest of aList
set aaList to items 1 thru 8 of aList

set aStr to "POKE #0, &" & addrStr & ", "
repeat with i in aaList
set j to contents of i
set aStr to aStr & "&" & j & ", "
end repeat

return text 1 thru -3 of aStr
end retOnLineBasicPoke

Intel Hexa to BASIC

Posted on by

これ、8bitコンピュータ時代のクロスアセンブラが出力していたIntel Hexaフォーマットのダンプリスト(EPROMライター向けの出力フォーマットらしい)を、BASICのPOKE文に展開して出力するという、20〜30年前の仕様のテキスト変換を行うために作ったものです。

CotEditorでオープン中のIntel Hexaのテキストの変換対象行を選択しておいた状態で実行すると、変換したリストを新規書類に出力します。

汎用性は一切ないのですが、実際にさまざまな本を作る際に、こうした「ちょっとしたツール」を作るのと作らないのとでは生産性が段違いです。

ただ、元データと最終成果物を示すと途中のロジックをプログラム側で考えて出力してくれるといいのに、とは思います。

AppleScript名:Intel Hexa to BASIC.scpt

– Created by: Takaaki Naganoya
– Created on: 2023年01月09日

– Copyright © 2023 Piyomaru Software, All Rights Reserved

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

tell application "CotEditor"
tell front document
set aaSel to paragraphs of contents of selection
end tell
end tell

set sNum to 100
set allText to ""
repeat with i in aaSel
set tmpL to ""
set j to contents of i
set {addrStr, hexList} to procOneLine(j) of me
set aStr to retOnLineBasicPoke(addrStr, hexList) of me
set allText to allText & ((sNum as string) & " ") & aStr & return
set sNum to sNum + 1
end repeat

tell application "CotEditor"
set newDoc to make new document
tell newDoc
set contents of it to allText
end tell
end tell

on retOnLineBasicPoke(addrStr, aList)
set aStr to "POKE #0, &" & addrStr & ", "
repeat with i in aList
set j to contents of i
set aStr to aStr & "&" & j & ", "
end repeat

return text 1 thru -3 of aStr
end retOnLineBasicPoke

on procOneLine(a)
set fChar to first character of a
if fChar is not equal to ":" then error

set byteC to text 2 thru 3 of a
set byteNum to retIntFromHexString(byteC) of me

set addrStr to text 4 thru 7 of a

set hList to {}
repeat with i from 10 to (10 + (2 * (byteNum – 1))) by 2
set tmpStr to text i thru (i + 1) of a
set the end of hList to tmpStr
end repeat
return {addrStr, hList}
end procOneLine

on retIntFromHexString(aHex as string)
set {aRes, hexRes} to (current application’s NSScanner’s scannerWithString:aHex)’s scanHexInt:(reference)
if aRes = false then
return "" –エラーの場合
else
return hexRes
end if
end retIntFromHexString

新発売:Mail.app Scripting Book with AppleScript

Posted on by

Piymaru Softwareによる電子書籍の70冊目は、AppleScript対応アプリケーション徹底解説シリーズの第6弾。

macOS上の主要アプリケーション、FileMaker Pro、ミュージック.app、Webブラウザ、iWork(Keynote、Pages、Numbers)、CotEditorときて、ご要望の多かった「メール」(Mail.app)についてのScripting本です。macOS 13.1+Mail.app v16対応。PDF 369ページ+サンプルScript Zipアーカイブで構成されています。

販売ページ

本書は、Mail.appのAppleScriptによるScriptingについて基礎からハイ・テクニックまで、詳細にまとめた決定版です。

メールの詳細な情報取得や送信、ファイル添付送信、メールのスレッドをマインドマップ風に可視化して表示したり、REST API経由で高速メール配信サービスを用いた送信まで。幅広く実用的なメール関連のAppleScriptのノウハウをご紹介しています。

ずいぶん時間をかけて書いた本で、あとから企画が出た数冊の本が追い抜いていました。CotEditor本も、あとから企画したものの、あちらが先に完成しました。とにかくアプリケーションの規模が大きく、機能が多く、試しておくべき機能が多いので、とにかく時間がかかるんですね。実際、年末年始も書いていました。

以前から(2004年ぐらいから)受信メールのサブフォルダへの再仕分けScriptを運用しており、いまも利用していますが、これを添付しています。

また、選択したメールスレッドのマインドマップ形式の可視化Scriptも、別途アプリケーションをインストールしなくても利用できるものを添付しています。

SendGridのREST APIを呼び出して超高速にメール送信を行うScriptは、あんまり速いので腰が抜けるほどですが、これも一見の価値あるものでしょう。

Numbersの表に入れたデータをもとに、メールの文面にデータを差し込んで送信するScriptも添付しているので、年末年始のごあいさつなどに威力を発揮することでしょう。

しかくしかく目次

しかく初級

スクリプトエディタを起動しよう
スクリプトエディタを起動しよう!
スクリプトエディタのヘルプ
色設定を変えてみよう!
スクリプトを入力してみよう
スクリプトを保存しよう
スクリプトを実行しよう(1/2)
スクリプトを実行しよう(2/2)
セキュリティとプライバシー
プライバシーとセキュリティ(13.x以降)
セキュリティとプライバシー>プライバシー
プライバシーとセキュリティ(macOS 13)

メール.appを起動しよう
メール(Mail.app)を指定
メール.appを起動
メール.appを終了
メール.appのAppleScript用語辞書の調べ方
メニュー項目や画面強制操作の調べ方
メール.appの詳細仕様について

メール.appの情報を取得しよう
メール.appの名前を取得
メール.appのバージョンを取得
メール.appのプロパティ項目と内容(1/2)
メール.appのプロパティ項目と内容(2/2)

選択中のメールボックス、メールを取得
selected mainboxes=選択中のメールボックス
selected messages=選択中のメール
selection=選択中のメッセージを取得
メールボックスのプロパティ項目と内容

メール情報の取得
メッセージ(メール)の内容を取得
メッセージ(メール)のソースを取得
メッセージ(メール)の各種情報を取得
メッセージのプロパティ項目と内容
メッセージのプロパティ項目と内容
メッセージのプロパティ項目と内容

条件に合ったメールの抽出
条件に合うメッセージを取得

メールアカウント情報
メールアカウントは複数存在可能
accountオブジェクトの詳細情報を取得
アカウントのプロパティ項目と内容1
アカウントのプロパティ項目と内容2

メールアドレスを取り出す
文字列からメールアドレスと氏名を抽出
選択中のメッセージからメールアドレスと氏名を抽出

シグネチャ(署名)
設定>署名で「署名」を管理
署名から情報を取得
アプリケーションの選択中署名情報
署名の属性値の書き換え(名称、本文)

スクリプトメニューからの操作
スクリプトメニューからの操作1
スクリプトメニューからの操作2
スクリプトメニューからの操作3

プリントアウト
メール.appから印刷出力(GUI側)
AppleScriptによる印刷
AppleScript(GUI Scripting)による印刷

しかく中級

アカウントを指定しての新着メール確認
メールアカウント種類ごとのメール確認
新着メール確認スケジュールの設定/停止

SMTPサーバー
SMTPサーバー情報の取得
指定アカウントのSMTPサーバー設定を切り替え
SMTPサーバーのプロパティ項目と内容

新規メール作成
メッセージの新規作成

メール送信
メッセージの新規作成+送信
GUI側で作成していたメールの送信1
GUI側で作成していたメールの送信2

添付ファイルつきメール送信
メッセージの新規作成+ファイル添付+送信
メッセージの新規作成+アーカイブファイル添付+送信1
メッセージの新規作成+アーカイブファイル添付+送信2

メールの添付ファイルを処理
選択中のメールの添付ファイルを保存
選択中のメールの添付ファイルの種別を集計1
選択中のメールの添付ファイルの種別を集計2
選択中のメールに添付ファイルがあれば背景色を赤く変更

メール返信
選択中のメールへの返信1
選択中のメールへの返信2

メール転送(Forward)
選択中のメールの転送(forward)1
選択中のメールへの転送2

メールのリダイレクト
選択中のメールの非破壊転送(redirect)1

メールボックスへのアクセス
特別なメールボックスのオブジェクト
特別なメールボックスへのアクセス
アカウント毎の特別なメールボックスへのアクセス

メールフォルダのパス情報
メールボックスのパス表記
選択中のメールボックスのフルパスを取得
フルパス文字列でメールボックスを指定

メールのフォルダ間の移動
メールの指定1
メールの指定2
メールのコピー
メールの移動

ビューアウィンドウの操作
メール.appのウィンドウ種別
ビューアウィンドウ操作
message viewerのプロパティ項目と内容1
message viewerのプロパティ項目と内容2

メールのルールを扱う
受信メールから条件実行するアクション「ルール」
「ルール」の「AppleScriptを実行」環境
テンプレートのメール.app用プラグインScript
ルールにAppleScript側からアクセス
ルールの「条件」にアクセスするrule condition
rule conditionとGUI上の内容との対比
ルールの「操作」の内容にアクセス
ルール「操作」の詳細にアクセス

しかく上級

URL Eventの発生/受信
メール.appが対応しているURLイベント
mailto: URLイベント(概要)
mailto: URLイベントを発生してメール作成
message: ローカルのメールのURLを求めて表示

メールヘッダー情報の取得
メッセージヘッダーの内容を取得
メッセージ(メール)のヘッダーを取得
ヘッダーの構成例
ヘッダーからフィールド名一覧を取得
メーラー名(x-mailer)を集計

メールスレッドの可視化
スレッドの可視化1
スレッドの可視化2選択中のメール情報
スレッドの可視化3各メールヘッダ情報
スレッドの可視化4.dotデータの作成
スレッドの可視化5.dotデータを表示

メーリングリストの振り分け先フォルダを抽出する
メーリングリストを処理するルールを抽出
メッセージ移動先がないルールを抽出

メールの再仕分け
「メールの再仕分け」とは?
「メールの再仕分け」Script変更履歴
「メールの再仕分け」Script処理概要
「メールの再仕分け」Script1
「メールの再仕分け」Script2
「メールの再仕分け」Script3
「メールの再仕分け」Script4
「メールの再仕分け」Script5
「メールの再仕分け」Script6
「メールの再仕分け」Script7
「メールの再仕分け」Script8

スタイル付きテキストのメール作成+データ差し込み
スタイル付きメールを作成するために
書式スタイル付きメールを作成
HTMLからスタイル付きメールを作成
RTFからスタイル付きメールを作成1
RTFからスタイル付きメールを作成2

Numbers上のデータをもとにさしこみメール作成
データ差し込みメール送信【概要】
データ差し込みメール送信1
データ差し込みメール送信2
データ差し込みメール送信3
データ差し込みメール送信4

高速・大量メール送信
高速メール配信サービスの利用
高速メール配信サービス一覧
SendGridのAPI Key取得までの道1
SendGridのAPI Key取得までの道2
SendGridのAPI Key取得までの道2
SendGridによるメール配信テスト(メール.app)
SendGridによるメール配信テスト(メール.app)
メール.appによるメール配信プログラム(SendGrid使用)
REST APIによるメール高速配信プログラム
SendGridを用いたメール送信所要時間(500通)
メール.appで大量送信後のメモリの状態

ランタイム環境の選択
AppleScriptの実行環境はたくさんある
実行中に止まる、落ちるという場合には

資料集

メール.appのAppleScript用語辞書解説
メール.app用語辞書

メール.appのAppleScript用語の変遷
メール.app用語辞書の変遷

メール.app&AppleScript Q&A
AppleScriptに関するQ&A❶
AppleScriptに関するQ&A❷

AppleScript mini Reference
macOS搭載 AppleScript関連ドキュメント
AppleScript関連の情報源
macOSバージョンとAppleScriptの動向
macOSとAppleScriptの要素技術史
各macOSごとのAppleScript解説(2/4)
各macOSごとのAppleScript解説(3/4)
各macOSごとのAppleScript解説(4/4)
macOS内AppleScript補助ツールの歴史
System EventsのAppleScript用語辞書変更点
AppleScript 各ランタイム環境情報
AppleScript 関連ツール
Cocoa Scripting 関連ツール

AppleScript予約語一覧

サードパーティ製FrameworkやAppleScript Librariesを呼ぶ
Script BundleにFramework / AppleScript Librariesを入れる
Shane StanleyのScript Toolの変遷
Shane StanleyのScript Libraries
Piyomaru SoftwareのScript Libraries (1/2)
Piyomaru SoftwareのScript Libraries (2/2)

エラーコード表
AppleScriptのエラーコード
AppleScript Errors
Mac OS Errors
AppleEvent Errors (1/2)
AppleEvent Errors (2/2)
OSA Errors
あとがき