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

数値に3桁セパレータを付加、外して数値に戻す v2

Posted on 11月 12, 2019 by Takaaki Naganoya

10進数の数字文字列に3桁セパレータを付加、外して数字文字列に戻すAppleScriptです。

めんどくさい上にCocoaに機能があり、かつそれほど大量のデータ処理を行うわけでもない(スピードを要求されない)処理のはずなので、手抜きでCocoaの機能を呼び出しています。

AppleScript名:数値に3桁セパレータを付加、外して数値に戻す v2
— Created 2016-10-12 by Takaaki Naganoya
— 2016 Piyomaru Software
use AppleScript version "2.5"
use scripting additions
use framework "Foundation"
–3桁セパレータ文字「,」をNSLocaleのcurrentLocaleから取得するように変更

property NSString : a reference to current application’s NSString
property NSLocale : a reference to current application’s NSLocale
property NSCharacterSet : a reference to current application’s NSCharacterSet
property NSNumberFormatter : a reference to current application’s NSNumberFormatter
property NSLocaleGroupingSeparator : a reference to current application’s NSLocaleGroupingSeparator
property NSNumberFormatterDecimalStyle : a reference to current application’s NSNumberFormatterDecimalStyle

set aNum to 100000000
set aStr to formatNum(aNum) of me
–> "100,000,000"

set bNum to deFromatNumStr(aStr) of me
–>  "100000000"

on formatNum(theNumber as number)
  set theResult to NSNumberFormatter’s localizedStringFromNumber:theNumber numberStyle:(NSNumberFormatterDecimalStyle)
  
return theResult as text
end formatNum

on deFromatNumStrAndRetNumber(theNumericString as string)
  set aThousandSep to NSLocale’s currentLocale()’s objectForKey:(NSLocaleGroupingSeparator)
  
set notWantChars to NSCharacterSet’s characterSetWithCharactersInString:aThousandSep
  
set targStr to NSString’s stringWithString:theNumericString
  
set newStr to (targStr’s componentsSeparatedByCharactersInSet:notWantChars)’s componentsJoinedByString:""
  
return ((newStr as string) as number) –Danger in OS X 10.10 (floating point casting bug)
end deFromatNumStrAndRetNumber

on deFromatNumStr(theNumericString as string)
  set aThousandSep to NSLocale’s currentLocale()’s objectForKey:(NSLocaleGroupingSeparator)
  
set notWantChars to NSCharacterSet’s characterSetWithCharactersInString:aThousandSep
  
set targStr to NSString’s stringWithString:theNumericString
  
set newStr to (targStr’s componentsSeparatedByCharactersInSet:notWantChars)’s componentsJoinedByString:""
  
return (newStr as string)
end deFromatNumStr

★Click Here to Open This Script 

Posted in Number Text | Tagged 10.12savvy 10.13savvy 10.14savvy 10.15savvy NSCharacterSet NSLocale NSLocaleGroupingSeparator NSNumberFormatter NSNumberFormatterDecimalStyle NSString | Leave a comment

10進数とn進数文字列の相互変換

Posted on 11月 12, 2019 by Takaaki Naganoya

10進数の数値とn進数の文字列を相互変換するAppleScriptです。

もともと、AppleScriptの言語仕様上、10進数とn進数文字列との相互変換機能は存在しないのですが、サードパーティから機能拡張書類(OSAX)でそのような機能が提供され、さらにClassic MacOSからMac OS Xへの移行時にそれらの機能拡張書類が使えなくなって(一部は移行)、個別にそれらの機能をスクリプター側で実装してMailing ListやBBS上、Blogなどで共有してきたという経緯があります。

AppleScript Users MLに流れていたもののような気がしますが、自分で作ったものかもしれません。出どころ不明です。

ただ、2進数変換や16進数変換などの各種変換ルーチンが乱立していたところに、「これ、全部1つで済むんじゃね?」と思ってまとめたような気がしないでもありません。自分で作っても簡単なので。

Cocoaの機能を一切使っていません。たしかにCocoaの機能を用いての変換も行えるのですが、データのサイズがとても小さい(桁数が少ない)ので、Cocoaの機能を呼び出さないほうが高速です。

もしも、AppleScriptの予約語のようにこれらの機能を呼び出したい場合には、これらのScriptをAppleScript Librariesにして、AppleScript用語辞書をつけて書き出せば(辞書はなくても大丈夫ですが)、

use nthLib: script "nThConvLib"

のように呼び出すことができるようになっています(macOS 10.9以降)。

AppleScript名:10進数をn進数文字列に変換する
set a to 100

–10進→16進数変換
set b to aNumToNthDecimal(a, 16, 4, {"0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "A", "B", "C", "D", "E", "F"}, true) of me
–> "64"

–10進→8進数変換
set c to aNumToNthDecimal(a, 8, 4, {"0", "1", "2", "3", "4", "5", "6", "7"}, true) of me
–> "144"

–10進→2進数変換
set d to aNumToNthDecimal(a, 2, 8, {"0", "1"}, false) of me
–> "01100100"

–10進数をn進数文字列に変換する

–origNum:変換対象の数字
–nTh: n進数のn
–stringLength: 出力指定桁(上位桁のアキはゼロパディングされる)
–zeroSuppress: 上位桁がゼロになった場合に評価を打ち切るかのフラグ、ゼロパディングを行わない(ゼロサプレスする)場合に指定
on aNumToNthDecimal(origNum, nTh, stringLength, stringSetList, zeroSuppress)
  set resString to {}
  
repeat with i from stringLength to 1 by -1
    if {origNum, zeroSuppress} = {0, true} then exit repeat
    
set resNum to (origNum mod nTh)
    
set resText to contents of item (resNum + 1) of stringSetList
    
set resString to resText & resString
    
set origNum to origNum div nTh
  end repeat
  
return (resString as string)
end aNumToNthDecimal

★Click Here to Open This Script 

AppleScript名:n進数文字列を10進数に変換する v2a
–2進数文字列→10進数数値変換
set a to "11"
set b to aNthToDecimal(a, {"0", "1"}) of me
–> 3

–8進数文字列→10進数数値変換
set a to "144"
set c to aNthToDecimal(a, {"0", "1", "2", "3", "4", "5", "6", "7"}) of me
–> 100

–16進数文字列→10進数数値変換
set a to "64"
set b to aNthToDecimal(a, {"0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "A", "B", "C", "D", "E", "F"}) of me
–> 100

–n進数文字列を10進数に変換する
on aNthToDecimal(origStr as string, nTh as list)
  set resNumber to 0
  
set sList to reverse of (characters of origStr)
  
set aLen to length of nTh
  
set digitCount to 0
  
  
repeat with i in sList
    set j to contents of i
    
set aRes to (offsetInList(j, nTh) of me)
    
    
set resNumber to resNumber + (aLen ^ digitCount) * (aRes – 1)
    
set digitCount to digitCount + 1
  end repeat
  
  
return resNumber as integer
end aNthToDecimal

–元はCocoaの機能を利用していたが、処理対象のデータが小さいのでOld Style AppleScriptで書き直した
on offsetInList(aChar as string, aList as list)
  set aCount to 1
  
repeat with i in aList
    set j to contents of i
    
if aChar is equal to j then
      return aCount
    end if
    
set aCount to aCount + 1
  end repeat
  
return 0
end offsetInList

★Click Here to Open This Script 

Posted in Number Text | Tagged 10.12savvy 10.13savvy 10.14savvy 10.15savvy | Leave a comment

macOS 10.15のPDFViewのバグに対処した簡易PDFリーダー

Posted on 11月 7, 2019 by Takaaki Naganoya

従来のmacOSではPDFリーダー「Skim」上で「applescript://」スキームのURLリンクをクリックした場合に正常にスクリプトエディタ/Script Debuggerに新規スクリプト作成のURLイベントが伝達されていました。

macOS 10.15.xには、PDFView上でPDF閲覧中にクリックしたURLが「applescript://」プロトコルの場合に、正確にデコードされるべき内容がデコードされずにスクリプトエディタに転送されるというバグが確認されています。

このmacOS 10.15のPDFViewのバグに対処するための簡易PDFリーダーのアプリケーション「PiyoREADER」を作成してみました。フリーで配布いたします。コード署名はしてありますが、ダウンロードして初回起動時にハネられるので、システム環境設定の「セキュリティとプライバシー」>「一般」で「そのまま起動」を選ぶ必要があります。

–> Download PiyoReader(2.1MB)

この簡易PDFリーダーにはもう1つ重要な機能があります。PDF中の「http://」スキームのURLリンククリック時に、本BlogのURLである場合には内部テーブルにもとづきURLをフォワードするという機能です。つまり、2018年1月末のXserver.jpによるBlog消去以前のURLを、現行のBlog上のURLに変換してオープンするというものです。

なお、PDF内に仕込まれた「applescript://」スキームのURLリンクはスクリプトエディタに、「http://」スキームのURLリンクはSafariに伝えるように固定しています。

PiyoReaderはmacOS 10.10以降で動作し、macOS 10.15以外のまともに「applescript://」スキームのURLを扱えるOSでは、「AppleScriptの穴」BlogのURL変換の機能が活用できる簡易PDFリーダーということになります。

Piyomaru Softwareが執筆・刊行している各種電子書籍には「applescript://」URLリンクが埋め込んであり、ご好評をいただいておりますが、この書籍の価値をmacOS 10.15上でも維持するためにこの簡易PDFリーダーを作成する必要に迫られました。こんなバグをAppleが作らなければ必要のなかった作業です。

レポートずみではありますが、Appleがこのバグを認識して早期に修正することを希望してやみません。

Posted in PDF URL | Tagged 10.15savvy | 4 Comments

Tanzakuの実証実験用バージョン「Tanshio」の配布を開始

Posted on 11月 6, 2019 by Takaaki Naganoya

Tanzakuの実証試験用バージョン「Tanshio」の配布を開始しました。Tanzakuは、Piyomaru Softwareが開発中の自然言語インタフェース系自動処理プログラムの最新シリーズです。

# Tanzakuの派生シリーズや実験プログラムは「Tan-XXX」と命名します。

TanshioはTanzakuで予定している各種機能の縮小版をひととおり実装して、使い勝手を調べたりユーザー環境でうまく動作するかといったことを検証するためのものです。本バージョンには2020/1/31までの動作期限を設けています。

–> Download Tanshio(70KB)

Tanzakuの動作原理は、「ファイル名にユーザーが行いたい内容を記述することで、Tanzakuプログラムがそれを解釈して実行する」というものです(Talking Droplet)。

Tanshioでは、指定アプリケーションのメニュー項目をファイル名に記述することで、その項目をクリックします。

アプリケーション名>メニュー名>メニュー項目名1>メニュー項目名2

のように、階層メニュー名称をファイル名に記述することで、一切のプログラミングなしにメニュー項目の自動クリックを実現するものです。プログラミングを一切行わず、ファイル名を付け替えるだけでメニューのクリックを行い、ファイル名の指定が正しくない場合にはアプリケーション名、メニュー名などをユーザーに問い合わせることで、正しいファイル名を自動フィードバックします。

コマンドをファイル名から取得し、ファイル名のつけかえにより動作を変更し(可塑性のあるプログラム)、いったんコマンドを受理したあとはツールのように振る舞うといったTanzakuの主な特徴を備えています。さらに、入力コマンド(ファイル名)を誤った場合にはユーザーに対して選択肢を提示して正しいコマンドへと誘導する仕様もこのTanshioに実装。実際に使ってみてウザくないかといった確認を行うためのテストベッドです。

動作OSバージョンはmacOS 10.14.6および10.15.xですが、10.14を推奨します。また、システム環境設定の「セキュリティとプライバシー」で、「アクセシビリティ」「オートメーション」などの項目にTanshioを登録する必要があるため、実行・運用にあたってはシステム管理者権限が必要になります。


▲初期状態のTanshio


▲初期状態だとファイル名にアプリケーション名やメニュー項目名が書かれていないため、エラーになる


▲操作アプリケーション選択


▲操作メニュー選択


▲操作メニュー項目選択(コマンドにたどり着くまで繰り返し)


▲Tanshioが自分自身のファイル名を書き換え、正しく、アプリケーション名やメニュー名、メニュー項目名などが記入される。

この状態でTanshioを実行すると、目的のアプリケーションのメニューを操作します。


▲別のアプリケーションや別のメニュー項目をクリックするように変更したい場合にはファイル名を「Tanshio」のような短い名前に付け替えると起動時にアプリケーション選択/メニュー選択を行う

実際に使ってみて

同じメニュー項目をトグルで差し替えるような処理を行っているアプリケーションだと(例:CotEditorの「表示」>「行番号を表示」/「行番号を非表示」)、メニュー項目名をそのまま指定しても、実行2回目になるとメニュー項目が存在していないので、エラーになってアプリケーション選択とメニュー選択のやり直しになるようです。

なーるーほーどー(汗)

Posted in GUI Scripting | Tagged 10.14savvy 10.15savvy | 2 Comments

指定フォルダ以下のすべてのファイルとフォルダ名から絵文字を除去する v2

Posted on 11月 5, 2019 by Takaaki Naganoya

指定フォルダ以下のすべてのファイル名とフォルダ名から絵文字を除去するAppleScriptです。Shane StanleyのremoveEmojiルーチンを使っています。

macOS 10.14.1で絵文字が大幅に追加されたため、これらの絵文字をファイル名に用いていた場合には10.14.1以下のバージョンのOS環境にそのままファイルを持っていくことができません。

 Zipアーカイブ → 展開時にエラー
 DiskImageにコピーするファイルを格納し、古いOSに持って行ってドライブとしてマウントしてファイルコピー → コピーできない(エラー)

という状態になります。絵文字自体に害はないのですが、規格がコロコロ変わる(追加される)ことで、ファイル名に用いるのには問題があるということでしょう。


▲もともとのファイル名、フォルダ名。絵文字を大量に使用している(普段はファイル名に絵文字は使っていません)


▲本Scriptで一括で処理したファイル名、フォルダ名。害のない1️⃣2️⃣3️⃣などの文字だけは残る

実際に作ってみたら、aliasに対するリネームはしょっちゅう行ってきたものの、POSIX pathを用いて指定フォルダ以下すべてをリネームするようなScriptは組んでいなかったので、ちょっと考えさせられました。


▲本Scriptでリネームして、CotEditorのScript PackをmacOS 10.13.6の環境に持っていけました。ただ、絵文字がないと寂しい感じがします

指定フォルダ以下のファイル/フォルダを一括取得するのに、今回はあえてSpotlightを使っていません。ファイルサーバー上のファイル/フォルダを処理する可能性がありそうなのと、外部ライブラリを使わないほうがよいと考え、このような構成になっています。

AppleScript名:指定フォルダ以下のすべてのファイルとフォルダ名から絵文字を除去する v2.scptd
—
—  Created by: Takaaki Naganoya
—  Created on: 2019/11/04
—
—  Copyright © 2019 Piyomaru Software, All Rights Reserved
—

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

property |NSURL| : a reference to current application’s |NSURL|
property NSString : a reference to current application’s NSString
property NSPredicate : a reference to current application’s NSPredicate
property NSFileManager : a reference to current application’s NSFileManager
property NSMutableArray : a reference to current application’s NSMutableArray
property NSRegularExpressionSearch : a reference to current application’s NSRegularExpressionSearch
property NSURLBookmarkResolutionWithoutUI : a reference to current application’s NSURLBookmarkResolutionWithoutUI

set aFol to POSIX path of (choose folder)

set anArray to NSMutableArray’s array()
set erArray to NSMutableArray’s array()
set aPath to NSString’s stringWithString:aFol
set dirEnum to NSFileManager’s defaultManager()’s enumeratorAtPath:aPath

repeat
  set aName to (dirEnum’s nextObject())
  
if aName = missing value then exit repeat
  
set aFullPath to aPath’s stringByAppendingPathComponent:aName
  
  
anArray’s addObject:aFullPath
end repeat

—逆順に(フォルダの深い場所&ファイル名から先に処理)
set revArray to (anArray’s reverseObjectEnumerator()’s allObjects()) as list

—リネーム
repeat with i in revArray
  set j to (NSString’s stringWithString:(contents of i))
  
set curName to j’s lastPathComponent() as string
  
set newName to removeEmoji(curName) of me
  
  
if curName is not equal to newName then
    set fRes to renameFileItem(j as string, newName) of me
    
if fRes = false then
      (erArray’s addObject:{j, newName})
    end if
  end if
end repeat

return erArray as list —リネームできなかったパス(フルパス、リネームするはずだった名称)

—絵文字除去
on removeEmoji(aStr)
  set aNSString to NSString’s stringWithString:aStr
  
return (aNSString’s stringByReplacingOccurrencesOfString:"[\\U0001F600-\\U0001F64F\\U0001F300-\\U0001F5FF\\U0001F680-\\U0001F6FF\\U00002600-\\U000026FF\\U00002700-\\U000027BF\\U0000FE00-\\U0000fE0F\\U0001F900-\\U0001F9FF\\U0001F1E6-\\U0001F1FF\\U00002B50-\\U00002B50\\U0000231A-\\U0000231B\\U00002328-\\U000023FA\\U000024C2-\\U000024C2\\U0001F194-\\U0001F194\\U0001F170-\\U0001F251\\U000025AB-\\U000025FE\\U00003297-\\U00003299\\U00002B55-\\U00002B55\\U00002139-\\U00002139\\U00002B1B-\\U00002B1C\\U000025AA-\\U000025AA\\U0001F004-\\U0001F004\\U0001F0CF-\\U0001F0CF]" withString:"" options:(NSRegularExpressionSearch) range:{0, aNSString’s |length|()}) as text
end removeEmoji

—ファイル/フォルダのリネーム
on renameFileItem(aPOSIXPath, newName)
  set theNSFileManager to NSFileManager’s defaultManager()
  
set POSIXPathNSString to NSString’s stringWithString:(aPOSIXPath)
  
  
–Make New File Path
  
set anExtension to POSIXPathNSString’s pathExtension()
  
set newPath to (POSIXPathNSString’s stringByDeletingLastPathComponent()’s stringByAppendingPathComponent:newName) –’s stringByAppendingPathExtension:anExtension
  
  
–Rename
  
if theNSFileManager’s fileExistsAtPath:newPath then
    return true
  else
    set theResult to theNSFileManager’s moveItemAtPath:POSIXPathNSString toPath:newPath |error|:(missing value)
    
if (theResult as integer = 1) then
      return (newPath as string)
    else
      return false
    end if
  end if
end renameFileItem

★Click Here to Open This Script 

Posted in file File path regexp Text | Tagged 10.14savvy 10.15savvy NSFileManager NSMutableArray NSPredicate NSRegularExpressionSearch NSString NSURL | Leave a comment

文字列から絵文字を削除

Posted on 11月 4, 2019 by Takaaki Naganoya

Shane Stanleyから投稿してもらった(いただいた)実用レベルの絵文字削除ルーチンです。

いろんな方面からツッコミが入って、徐々に実用レベルに到達するのではないかと予想していた絵文字削除ルーチン、いきなり最終兵器的なルーチンの登場により、「これでいいでしょ?」と思えるレベルに到達しました。

AppleScript名:remove emoji v0
—
—  Created by: Shane Stanley
—  Created on: 2019/11/04
—
use AppleScript version "2.7" — High Sierra (10.13) or later
use framework "Foundation"
use scripting additions

removeEmoji("2203)🔄❎⚙️🇯🇵簡易日本語形態素解析📚してそれっぽく❌伏せ字に(□に置き換え).scptd") of me
–> "2203)簡易日本語形態素解析してそれっぽく伏せ字に(□に置き換え).scptd"

on removeEmoji(aStr)
  set aNSString to current application’s NSString’s stringWithString:aStr
  
— Emoticons, Misc Symbols and Pictographs, Transport and Map, Misc symbols, Dingbats, Variation Selectors, Supplemental Symbols and Pictographs, Flags
  
return (aNSString’s stringByReplacingOccurrencesOfString:"[\\U0001F600-\\U0001F64F\\U0001F300-\\U0001F5FF\\U0001F680-\\U0001F6FF\\U00002600-\\U000026FF\\U00002700-\\U000027BF\\U0000FE00-\\U0000fE0F\\U0001F900-\\U0001F9FF\\U0001F1E6-\\U0001F1FF]" withString:"" options:(current application’s NSRegularExpressionSearch) range:{0, aNSString’s |length|()}) as text
end removeEmoji

★Click Here to Open This Script 

ただ、そこは一応「すべての絵文字」を入力して試しておく必要を感じるところ。手作業でぽちぽちキーボードから(絵文字バレットから)絵文字を入力しまくって本ルーチンで処理してみたところ、どうも文字コード上の「飛び地」にあるとおぼしき絵文字が消えません。

なので、削除テーブル部分に「消えなかった絵文字のコード」をこれでもかと追加しまくり、削除対象文字テーブルを強化してみました。一部、対象文字よりもひろめに削除範囲が指定されている箇所もありますが、本ルーチンは主にファイル名に対して使用された絵文字を除去してファイルの後方互換性を確保すること(最新のOSよりも古いバージョンのOSとファイルを安全に交換すること)が目的なので、そんなマイナー記号類が削除されても気にしないことにします。

すべての絵文字が削除されたわけではないといいますか、絵文字っぽい文字でなくなっただけで残っていたりもするのですが、今度はこれらの文字を消すと実害もありそうなので、現状ではこのぐらいでよいかと思われます。

もちろん、すぐにCotEditorのメニューに突っ込んで、選択範囲の絵文字を削除できるようにしておきました。

AppleScript名:remove emoji.scptd
—
—  Created by: Shane Stanley
—  Created on: 2019/11/04
—  Modified by: Takaaki Naganoya (Emoji Table Data)

use AppleScript version "2.7" — High Sierra (10.13) or later
use framework "Foundation"
use scripting additions

set allEmoji to "☺️☹️☠️✌️☝️🖐✍️1️⃣2️⃣3️⃣⚙️😀😃😄😁😆😅😂🤣☺️😊😇🙂🙃😉😌😍🥰😘😗😙😚😋😛😝😜🤪🤨🧐🤓😎🤩🥳😏😒😞😔😟😕🙁☹️😣😖😫😩🥺😢😭😤😡🤬🤯😳🥵🥶😱😨😨😰😥😓🤗🤔🤭🤫🤥😶😐😑😬🙄😯😦😧😮😲😴🤤😪😵🤐🥴🤢🤮🤧😷🤒🤕🤑🤠😈👿👹👺🤡💩👻💀☠️👽👾🤖🎃😺😸😹😻😼😽🙀😿😾🤲👐🙌👏🤝👍👎👊✊🤛🤜🤞✌️🤟🤘👌👈👉👆👇☝️✋🤚🖐🖖👋🤙💪🖕✍️🙏🦶🦵🐶🐱🐭🐰🦊🐻🐼🐨🐯🦁🐮🐷🐽🐸🐵🙈🙉🙊🐒🐔🐧🐦🐤🐣🐥🦆🦅🦉🦇🐗🐴🦄🐝🐛🦋🐌🐞🐜🦟🦗🕷🕸🦂🐍🦎🦖🐙🦑🦐🦞🦀🐡🐟🐬🐳🦈🐊🐅🐆🦓🦍🐘🦛🦏🐪🐫🦘🐃🐂🐄🐎🐏🐑🦙🐐🦌🐕🐩🐈🐓🦃🦚🦜🦢🕊🐇🦝🦡🐁🐀🐿🐲🌵🎄🌲🌳🌴🌱🌿🍀🍃🍂🍁🍄🌾🌹🥀🌺🌼🌻🌚🌕🌖🌗🌘🌒🌎💫⭐️🌟⚡️☄️💥🔥🌪🌈🌤⛅️🌥☁️🌦🌧⛈🌩❄️☃️🌬💨💧💦☔️🌫🍏🍎🍐🍊🍋🍌🍇🍓🍈🍒🍑🍍🥥🥝🍅🍆🥑🌶🌽🥕🥔🍠🥐🥯🍞🥖🥨🧀🥚🍳🥞🥓🥩🍗🍖🦴🦴🌭🍕🥪🥙🌮🌯🥗🥘🥫🍝🍜🍛🍣🍱🍤🍙🍚🍘🍥🥠🥮🍢🍦🍰🎂🍭🍬🍫🍿🍩🍪🌰🥜🍯🥛🍼☕️🍵🥤🍶🍺🍻🥂🍷🥃🍸🍹🍾🥄🍴🍽🥣🥡🥢🧂🏀⚾️🥎🎾🏐🏉🥏🎱🏓🏸🏒🏏⛳️🏹🎣🥊🥋🎽🛹🛷⛸🥌🎿⛷🏂🏋️‍♂️🤼‍♀️🤼‍♂️🤺🤾‍♀️🤾‍♂️🏌️‍♀️🏌️‍♂️🏇🧘‍♀️🧘‍♂️🏄‍♀️🏄‍♂️🏊‍♀️🏊‍♂️🤽‍♀️🤽‍♂️🚣‍♀️🚣‍♂️🧗‍♀️🧗‍♂️🚵‍♀️🚵‍♂️🚴‍♀️🚴‍♂️🏆🥇🥈🥉🏅🎖🏵🎗🎫🎟🎪🤹‍♀️🤹‍♂️🎭🎨🎬🎤🎧🎼🎹🥁🎷🎺🎸🎻🎲♟🎯🎳🎮🎰🧩🚗🚙🚌🚎🏎🚓🚑🚒🚐🚛🚜🛴🚲🏍🚨🚔🚍🚘🚖🚡🚠🚟🚃🚋🚞🚝🚄🚅🚈🚂🚆🚇🚊✈️🛫🛬🛩💺🛰🚀🛸🚁🛶⛵️🚤🛳⛴🚢⚓️⛽️🚧🚦🚥🚏🗺🗿🗽🗼🏰🏯🏟🎡🎢🎠⛲️⛱🏖🏝🏜🌋⛰🏔🗻🏕🏠🏡🏘🏚🏗🏭🏢🏬🏣🏤🏥🏦🏨🏪🏫🏩💒🏛⛪️🕌🕍🕋⛩🛤🗾🎑🏞🌅🌄🌠🎇🎆🌇🌆🏙🌃🌌🌉🌁⌚️📱📲💻⌨️🖥🖨🖱🖲🕹🗜💽💾💿📀📼📷📸📹🎥📽🎞📞☎️📟📠📺📻🎙🎚🎛🧭⏱⏲⏰🕰⌛️⏳📡🔋🔌💡🔦🕯🧯🛢💸💵💴💰💳💎⚖️🧰🔧🔨⚒🛠⛏🔩🧱⛓🧲💣🧨🔪🗡⚔️🛡🚬⚰️⚱️🏺🔮📿🧿💈🔭🔬🕳💊💉🧬🦠🧫🧪🌡🧹🧺🧻🚽🚰🚿🛁🛀🧼🧽🧴🛎🔑🗝🚪🛋🛌🧸🖼🛒🎁🎈🎏🎀🎊🎉🎎🏮🎐✉️📩📨📧💌📥📤📦🏷📪📫📬📭📮📯📜📃📄📑🧾📊📈📉🗒🗓📆📅🗑📇🗳🗄📋📁📂🗂🗞📰📓📔📒📕📗📘📙📚📖🔖🧷🔗📎🖇📐📏🧮📌📍✂️🖊🖋✒️🖌🖍📝✏️🔍🔎🔏🔐🔒🔓🔓❤️🧡💛💚💙💜🖤💔❣️💕💞💗💖💘💝💟☮️✝️☪️🕉☸️✡️🔯🕎☯️☦️🛐⛎♈️♉️♊️♋️♌️♍️♎️♏️♐️♑️♒️♓️🆔⚛️🉑☣️📴📳🈶🈚️🈸🈺🈷️✴️🆚💮🉐㊙️㊗️🈴🈵🈲🅰️🅱️🆎🆑🅾️🆘❌⭕️🛑⛔️📛🚫💯💢♨️🚷🚯🚱🔞📵🚭❗️❕❓❓❔‼️⁉️🔅🔆〽️⚠️🚸🔱⚜️🔰✅🈯️💹❇️✳️❎🌐💠Ⓜ️🌀💤🏧♿️🅿️🈳🈂️🛂🛃🛄🛅🚹🚺🚼🚻🚮🎦📶🈁🔣ℹ️🔤🔡🔠🆖🆗🆙🆙🆒🆕🆓0️⃣1️⃣2️⃣3️⃣4️⃣5️⃣6️⃣7️⃣8️⃣9️⃣🔟🔢#️⃣*️⃣▶️⏸⏯⏹⏺⏭⏮⏩⏪⏫⏬🔼🔽⬅️⬇️↘️↖️↕️↙️↗️⬆️➡️◀️⏏️↪️↩️↔️⤵️🔀🔁🔄🔃⤵️⤴️🎵🎶➕➖➗♾💲💱©️👁‍🗨🔚🔙🔛🔝🔜➰➿➿☑️🔘🔴🔵🔺🔻🔸🔹🔶🔷🔳🔲▫️◽️◻️⬜️🔈🔇🔉🔊🔔🔔🔔🔕📣📢💬💭🗯♣️♦️🃏🎴🕐🕑🕒🕓🕔🕕🕖🕗🕘🕙🕚🕛🕜🕝🕞🕟🕠🕡🕢🕣🕤🕥🕥🕦🕧🀄️♥️♠️⬛️◼️◾️▪️⚪️✔️〰️®️™️✖️⭐️🏴🏁🏴‍☠️🏳️🚩🏳️‍🌈🇺🇳🇮🇸🇮🇪🇦🇿🇦🇫🇺🇸🇦🇪🇩🇿🇦🇷🇦🇼🇦🇱🇦🇲🇦🇮🇦🇴🇦🇬🇦🇩🇾🇪🇬🇧🏴󠁧󠁢󠁳󠁣󠁴󠁿🏴󠁧󠁢󠁷󠁬󠁳󠁿🇮🇱🇮🇹🇮🇶🇮🇷🇮🇳🇮🇩🇼🇫🇺🇬🇺🇦🇺🇿🇺🇾🇪🇨🇪🇬🇪🇪🇪🇹🇪🇷🇸🇻🇦🇺🇦🇹🇦🇽🇴🇲🇳🇱🇧🇶🇬🇭🇨🇻🇬🇬🇬🇾🇰🇿🇶🇦🇨🇦🇮🇨🇬🇦🇨🇲🇬🇲🇰🇭🇬🇳🇬🇼🇨🇾🇨🇺🇨🇺🇨🇼🇬🇷🇰🇮🇰🇬🇬🇹🇬🇵🇬🇺🇰🇼🇨🇰🇬🇱🇨🇽🇬🇩🇭🇷🇰🇾🇰🇪🇨🇮🇨🇨🇨🇨🇨🇷🇽🇰🇰🇲🇨🇴🇨🇬🇨🇩🇸🇦🇬🇸🇼🇸🇧🇱🇸🇹🇿🇲🇵🇲🇸🇲🇸🇱🇩🇯🇬🇮🇯🇪🇯🇲🇬🇪🇸🇾🇸🇬🇸🇽🇿🇼🇨🇭🇸🇪🇸🇩🇪🇸🇸🇷🇱🇰🇸🇰🇸🇮🇸🇿🇸🇨🇸🇳🇷🇸🇰🇳🇻🇨🇸🇭🇸🇴🇸🇧🇹🇨🇹🇭🇹🇯🇹🇿🇨🇿🇹🇩🇹🇳🇨🇱🇹🇻🇩🇰🇩🇪🇹🇬🇹🇰🇩🇴🇩🇲🇹🇹🇹🇲🇹🇷🇹🇴🇳🇬🇳🇷🇳🇦🇳🇺🇳🇮🇳🇮🇳🇪🇳🇨🇳🇿🇳🇵🇳🇫🇳🇫🇳🇴🇧🇭🇭🇹🇵🇰🇻🇦🇵🇦🇻🇺🇧🇸🇵🇬🇧🇲🇵🇼🇵🇾🇧🇧🇭🇺🇧🇩🇵🇳🇫🇯🇵🇭🇫🇮🇧🇹🇵🇷🇫🇴🇫🇰🇧🇷🇫🇷🇧🇬🇧🇫🇧🇳🇧🇮🇻🇳🇧🇯🇻🇪🇧🇾🇧🇿🇵🇪🇧🇪🇵🇱🇧🇦🇧🇼🇧🇴🇵🇹🇭🇳🇲🇭🇲🇴🇲🇰🇲🇬🇾🇹🇲🇼🇲🇱🇲🇹🇲🇶🇲🇾🇮🇲🇫🇲🇲🇲🇲🇽🇲🇺🇲🇷🇲🇿🇲🇨🇲🇻🇲🇩🇲🇦🇲🇳🇲🇪🇲🇸🇯🇴🇱🇦🇱🇻🇱🇹🇱🇾🇱🇮🇱🇷🇷🇴🇱🇺🇷🇼🇱🇸🇱🇧🇷🇪🇷🇺🇮🇴🇻🇬🇰🇷🇪🇺🇰🇷🇭🇰🇪🇭🇬🇶🇨🇫🇨🇳🇹🇱🇿🇦🇸🇸🇦🇶🇯🇵🎌🇬🇫🇵🇫🇹🇫🇻🇮🇦🇸🇲🇵🇰🇵"
removeEmoji(allEmoji) of me
–> "1⃣2⃣3⃣‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‼⁉〽0⃣1⃣2⃣3⃣4⃣5⃣6⃣7⃣8⃣9⃣#⃣*⃣⬅⬇↘↖↕↙↗⬆↪↩↔⤵⤵⤴©‍〰®™‍‍󠁧󠁢󠁳󠁣󠁴󠁿󠁧󠁢󠁷󠁬󠁳󠁿"

on removeEmoji(aStr)
  set aNSString to current application’s NSString’s stringWithString:aStr
  
  
— Emoticons, Misc Symbols and Pictographs, Transport and Map, Misc symbols, Dingbats, Variation Selectors, Supplemental Symbols and Pictographs, Flags
  
return (aNSString’s stringByReplacingOccurrencesOfString:"[\\U0001F600-\\U0001F64F\\U0001F300-\\U0001F5FF\\U0001F680-\\U0001F6FF\\U00002600-\\U000026FF\\U00002700-\\U000027BF\\U0000FE00-\\U0000fE0F\\U0001F900-\\U0001F9FF\\U0001F1E6-\\U0001F1FF\\U00002B50-\\U00002B50\\U0000231A-\\U0000231B\\U00002328-\\U000023FA\\U000024C2-\\U000024C2\\U0001F194-\\U0001F194\\U0001F170-\\U0001F251\\U000025AB-\\U000025FE\\U00003297-\\U00003299\\U00002B55-\\U00002B55\\U00002139-\\U00002139\\U00002B1B-\\U00002B1C\\U000025AA-\\U000025AA\\U0001F004-\\U0001F004\\U0001F0CF-\\U0001F0CF]" withString:"" options:(current application’s NSRegularExpressionSearch) range:{0, aNSString’s |length|()}) as text
end removeEmoji

★Click Here to Open This Script 

Posted in regexp Text | Tagged 10.14savvy 10.15savvy NSRegularExpressionSearch NSString | 2 Comments

文字列から絵文字のみ削除するじっけん

Posted on 11月 3, 2019 by Takaaki Naganoya

文字列から絵文字だけを削除する実験です(まだ、完全にはうまく削除しきれていないので)。

→ きちんと動くバージョン 文字列から絵文字を削除

CotEditorのScript PackをmacOS 10.13環境にインストールしようとして、Zipアーカイブが展開できないとか、ファイル名に絵文字が入っているためにファイルコピー自体が行えないという現象に直面しました。

macOS 10.14.1で絵文字が70個ほど追加になったという記録があるので、

macOS Mojave 10.14.1
アップデートこのアップデートの内容は以下の通りです。グループ FaceTime のビデオ通話とオーディオ通話に対応しました。最大 32 人の参加者が同時に通話することができ、会話の内容はエンドツーエンドで暗号化されるため、プライバシーも守られます。グループ FaceTime は、メッセージ App のグループチャットから始めることができ、通話に途中から参加することもできます。赤毛、白髪、巻き毛の新しいキャラクター、スキンヘッドの新しい絵文字、より感情豊かな笑顔のほか、動物、スポーツ、食べ物を表す絵文字など、70 種類以上の絵文字が新たに追加されました。

これらの絵文字ファイル名に用いたファイルをmacOS 10.14.1以降のOS上で作成し、それ以前のバージョンのOSに持って行こうとするとトラブルが発生するのは当然のことでしょう。

ファイル名が原因であることは明らかなので(ふだんはScriptのファイル名に絵文字を使うことはありません)、自動で指定フォルダ以下の書類やフォルダをすべてスキャンして絵文字キャラクターを削除するという処理を書こうとして、その前段階として指定文字列中の絵文字を削除するAppleScriptを書いてみました。

いい感じに削除できていると思えば、削除できない文字もあったりで、まだ完全ではない印象です。p{Emoji_Presentation}で検出しているのですが、検出できない絵文字があるようで、、、、

もともと、NSString上で完結するように処理しようと試みていたものの、matchesInStringで絵文字を検出したあとの消し込みにてこずって、「じゃあ、1文字ずつ分解してチェックルーチンを通せばいいや」と、トーンダウンした経緯があります。

特定の絵文字だけ検出できないというのは納得できません。本Scriptはまだ実戦配備できないレベルだと思います。

下手をすると、全絵文字の全パターンを配列(リスト)に入れておいて、存在確認を行うことになるのかも?

AppleScript名:テキストから絵文字抽出(複数)して削除.scptd
—
–  Created by: Takaaki Naganoya
–  Created on: 2019/11/03
—
–  Copyright © 2019 Piyomaru Software, All Rights Reserved
—
use AppleScript version "2.4" — Yosemite (10.10) or later
use framework "Foundation"
use scripting additions

set a1Str to "where’s 😎the 😎😎emoji 😎?"
set b1Str to removeEmoji(a1Str) of me
–> "where’s the emoji ?"

set a2Str to "2200)🔄❎すべて❌伏せ字に(□に置き換え)"
set b2Str to removeEmoji(a2Str) of me
–> "2200)すべて伏せ字に(□に置き換え)"

set a3Str to "2251)1️⃣2️⃣3️⃣昇順(1–>9)で連番を振る"
set b3Str to removeEmoji(a3Str) of me
–> "2251)1️⃣2️⃣3️⃣昇順(1–>9)で連番を振る"

set a4Str to "2203)🔄❎⚙️🇯🇵簡易日本語形態素解析📚してそれっぽく❌伏せ字に(□に置き換え).scptd"
set b4Str to removeEmoji(a4Str) of me
–> "2203)⚙️簡易日本語形態素解析してそれっぽく伏せ字に(□に置き換え).scptd"

set emojiStr to "😀😃😄😁😆😅😂🤣☺️😊😇🙂🙃😉😌😍🥰😘😗😙😚😋😛😝😜🤪🤨🧐🤓😎🤩🥳😏😒😞😔😟😕🙁☹️😣😖😫😩🥺😢😭😤😡🤬🤯😳🥵🥶😱😨😨😰😥😓🤗🤔🤭🤫🤥😶😐😑😬🙄😯😦😧😮😲😴🤤😪😵🤐🥴🤢🤮🤧😷🤒🤕🤑🤠😈👿👹👺🤡💩👻💀☠️👽👾🤖🎃😺😸😹😻😼😽🙀😿😾🤲👐🙌👏🤝👍👎👊✊🤛🤜🤞✌️🤟🤘👌👈👉👆👇☝️✋🤚🖐🖖👋🤙💪🖕✍️🙏🦶🦵"
set eRes to removeEmoji(emojiStr) of me
–> "☺️☹️☠️✌️☝️🖐✍️"

set emojiStr to "☺️☹️☠️✌️☝️🖐✍️1️⃣2️⃣3️⃣⚙️"
set eRes to removeEmoji(emojiStr) of me
–> "☺️☹️☠️✌️☝️🖐✍️1️⃣2️⃣3️⃣⚙️"

on removeEmoji(aStr)
  script spdC
    property outList : {}
    
property cList : {}
  end script
  
  
set (cList of spdC) to characters of aStr
  
log (cList of spdC)
  
set (outList of spdC) to {}
  
  
repeat with i in (cList of spdC)
    set j to contents of i
    
set eRes to chkEmoji(j) of me
    
if eRes = false then
      set the end of (outList of spdC) to j
    end if
  end repeat
  
return retDelimedText((outList of spdC), "") of me
end removeEmoji

on chkEmoji(aStr)
  set aNSString to current application’s NSString’s stringWithString:aStr
  
set aReg to current application’s NSRegularExpression’s regularExpressionWithPattern:"\\p{Emoji_Presentation}" options:0 |error|:(missing value)
  
set cResList to (aReg’s matchesInString:(aNSString) options:0 range:(current application’s NSMakeRange(0, aNSString’s |length|()))) as list
  
if length of cResList = 0 then return false –指定文字列に絵文字が入っていない場合
  
return true –指定文字列に絵文字が入っている場合
end chkEmoji

on retDelimedText(aList, aDelim)
  set aText to ""
  
set curDelim to AppleScript’s text item delimiters
  
set AppleScript’s text item delimiters to aDelim
  
set aText to aList as text
  
set AppleScript’s text item delimiters to curDelim
  
return aText
end retDelimedText

★Click Here to Open This Script 

Posted in Text | Tagged 10.14savvy 10.15savvy NSMakeRange NSRegularExpression NSString | Leave a comment

個人的に腹がたったmacOS/AppleScriptのバグ・ワースト10

Posted on 11月 2, 2019 by Takaaki Naganoya

歴代のmacOS自体やAppleScriptの処理系で腹が立ったバグについてまとめてみましょう。腹の立ったOSのバージョンでいえばmacOS 10.13が歴代でダントツの1位ですが、10.15もリリースされる前から「これはひどい」「10.13と同じぐらいひどい」とわかっていたので、10.14.6を選択。

10個にしぼりこむことがたいへんに難しかったですし、未修正の問題などもあり非常に腹立たしいかぎりです。たぶん、ワースト3以下は僅差だと思います。

Mac OS X 10.3でディスク暗号化機能の「FileVault」が登場したときには、野生のカンで「これは使ってはいけない機能だ」と様子見していたところ、見事に「FileVaultをオンにしたホームディレクトリ下のファイルにAppleScriptからアクセスできないバグがある」ことが発覚。以来、これをオンにしたことがありません(最近でも、macOS 10.15でFileVaultをオンにしているとMac mini 2018に接続したeGPUから出力できないとか。なかなか信用できません)。

1位:Mac OS X 10.3 “is in”演算子が動かないバグ(AppleScript)【修正済み】

こんな基礎的な演算子でバグ作られた日には何もできません。とくに、is in演算子はデータの「ゆらぎ吸収」処理に使いまくっているので、WWDCにハリセン持って担当者をブン殴りに行こうかと真剣に悩みました。

2位:macOS 10.13〜 PDFViewのcurrentPageを取得するとおかしな値が返ってくるバグ(Bug Reportしても直らない。殺意を覚える)(Scripting Bridge)【未修正】

これのせいで、自分のMac App Storeにアップしたアプリケーションが動かなくなりましたわ。ひどい。ひどすぎる。しかも、ちゃんとDevelopper Supportに連絡しても返事ひとつなく、修正もされません。Developer Support、仕事してませんよね。

# Developper Support、ほんっとになんにもしない。あの部署、何のためにあるんだろう? 今度、インシデントを消費して「じゃあ逆に、君たちは何をしてくれやがる部署ですか? 後学のために教えてくださいませ」と聞いてみようか

3位:OS X 10.9 ntpのシンクロが狂うバグ(OS)【修正済み】

当時、Mac App Storeに出す時計アプリを作ってたんですが、これのせいで時計が合わずに冷や汗かかされていました。まさかOSのバグとは、、、、おかげでアプリはお蔵入りしてしまいました。

4位:macOS 10.12〜 Input Methodのバグか何かで、ファイル名に不可視文字が混入するケースがあり、混入するとファイル名の文字列に追記するとエラーに(OS、日本語環境)【未修正】

これは、レポートもしていますし、波及範囲が広いので大問題なのですが、直っていませんね。認識すらしていないんじゃないでしょうか。

5位:Mac OS X 10.0〜10.4 File Pathの文字エンコーディングが変で日本語ファイルパスの扱いに慎重になる必要があったバグ(OS、AppleScript)【修正済み】

ファイルパスをas stringしてからas unicode textでcastさせられたりと、煮湯を飲まされていました。10.5で根本的に修正されたものの、10.5で根本的な修正を行うまで、問題が放置されっぱなし(こういうの多いなー)。

6位:Mac OS X 10.0〜10.4 display dialogで日本語表示を行うさいに、国際化対応アプリケーションへのtellブロック内で実行しないと文字化けするバグ(OS、AppleScript)【修正済み】

さすがに困って担当者に問い合わせて回避方法は教えてもらいましたが、そういう付け焼き刃的な回避方法を知らせる前につぶしてほしいと感じるものでした。

7位:Mac OS X 10.4、Script MenuがSystem Eventsの管轄下にあったため、Script Menuから呼び出したScript内でSystem Eventsの機能を呼び出すと実行が止まるバグ(AppleScript)【修正済み】

Mail.appのメッセージ仕分けBot Scriptがこれにヒットしてひどい目に遭いました。毎日使っているものなので、とても大きなダメージを喰らいました。Mac OS X 10.5で修正されました。

8位:OS X 10.10、Cocoa Objectsの実数値をASにcastすると小数点以下が無視されるバグ(Scripting Bridge)【修正済み】

これもひどかったですね。Shaneが対処のためのFrameworkやライブラリを用意しなかったら、いまほどCocoaの機能が利用されていなかったと思います。このバグはmacOS 10.11で修正されました。

9位:macOS 10.12、AppleScript Dropletにドロップしたファイルで、ファイル拡張属性(Xattr)のcom.apple.quarantineがついている場合には処理されないバグ(放置、未修正)(OS、AppleScript)【未修正】

無責任さここに極まれりといったところです。Core OSとAppleScriptの処理系との間で仕様のすりあわせが行われておらず、チーム間でぜんぜん連携が取れていない(というよりも、チーム間で垣根を超えて折衝する権限がないっぽい)、現在のAppleの社内体勢そのものに問題があるんでしょう。これも、対処方法が一応は確立しているものの、たまりません。

10位:macOS 10.13、NSRectがレコードではなくリストで返ってくるように(告知なしで)変更される(Scripting Bridge)【未修正】

なんなんでしょうね、コレ。作業量が増えて腹が立つんですが、個人的にはSwiftのアップデートに合わせてAPI側の仕様を変えてしまったんじゃないんかとにらんでいます。

Posted in Bug | Leave a comment

macOS 10.15でPDFView経由のURLイベントが正しくデコードされないバグ

Posted on 10月 31, 2019 by Takaaki Naganoya

macOS 10.15には上から下まで機能不全やバグが存在しており、とても常用に堪える仕上がりではありません。2019年10月に1年かけてのPublic β公開がはじまったという印象です(今回、Beta段階ではまともに動かず動作確認にすらなりませんでした)。

そんなmacOS 10.15に激烈なバグを発見。PDFView経由で発生したURLイベントが正しくデコードされないというバグです。httpやhttpsといったURL Eventでは発生しないものの、「applescript://」スキームのURLイベントで発生しています。

–> View movie of macOS 10.15 URL event bug

このため、Piyomaru Softwareが刊行している既存の電子ブックのScript LinkもmacOS 10.15環境では正しくスクリプトエディタに転送されません。現在作成中の新刊作成途中にmacOS 10.15のバグに直面。


▲macOS 10.15のPDFView上でapplescript://リンク入りのURLをクリックすると、内容が正しくデコードされずにスクリプトエディタに転送される

Skimで「applescript://」リンク入りのPDFをブラウズし、スクリプトリンクをクリックすると、Script Editorに正しく転送されません(URLデコード不良)。

macOS 10.15のバグなのかSkimのバグなのかを検証するために、わざわざPDFViewを貼り付けた最低限度のPDFビューワーアプリケーションを(AppleScriptで)作成し、PDFViewからのURLリンククリックに対してはSkimと同様の結果になる(=macOS 10.15側のバグ)であることを確認しています。

じゃあ、macOS 10.15のSafariでapplescript:// URL Link(本ブログ掲載のプログラムリスト末尾のリンク)はどうなのか? といえば、こちらは正しくSafari→デフォルトのScriptエディタ(スクリプトエディタとかScript Debuggerとか)に転送されます。問題はありません。Betaの時からさんざんクリックして確認していました。

なので、PDF中のapplescript://リンクの内容を正しくデコードするPDFリーダー「PiyoReader」を作ってみました。AppleがmacOS 10.15のこのバグを修正するのか(少なくとも10.16まで直らないと思います)不明ですが、これに対処するためのPDFリーダーです。

Mac App Storeに出す苦労を考えると、BOOTHあたりでオンライン販売するかといったところでしょうか(Piyomaru Software内で相談中)。
→ 急遽作ったので、売り物になるほどの仕上がりではなく(だいたい、1日で仕上げてもSkimを超える出来になりません)、フリー配布するしかないんじゃないの? というところです。

Posted in Bug | Tagged 10.15savvy | 6 Comments

macOS 10.15, Catalina上でBridgePlus,Myriad Tables LibなどのScript Libraryを利用

Posted on 10月 31, 2019 by Takaaki Naganoya

Shane StanleyからmacOS 10.15上でBridgePlusなど、ShaneのScript Librariesを使えるようにする手順を教えてもらいました。内容を実際に検証しつつ、以下に解説します。

Shane StanleyのAppleScript Libraries「BridgePlus」「Myriad Tables Lib」などは、有用な機能をScripterに提供する、たいへん有用なライブラリです。高機能なライブラリを実現するための肝は、ライブラリに同梱されたFrameworkの存在です。

macOS 10.14の状況

ところが、macOS 10.14でSIPが強化されてホームディレクトリ下のFrameworkをスクリプトエディタが認識しないようになりました。Script Debugger上では問題なくホームディレクトリ以下のFrameworkを認識してプログラミング&実行を行うことができました。

スクリプトエディタ上でも、これらBridgePlusなどのFrameworkを含むライブラリをuseコマンドで利用指定し、そのまま実行はできないものの、アプレット書き出しすればバンドルしたFrameworkを呼び出して実行することはできていました。

macOS 10.15の状況

macOS 10.15ではさらにセキュリティの機能が強化されて、デフォルトの状態ではScript Debuggerを用いても、BridgePlusやMyriad Tables Lib内蔵のFrameworkの実行(オープン)自体がOSに阻害されるようになりました(やりすぎじゃないの?)。

結論からいえば、macOS 10.15ではスクリプトエディタを利用しているだけではBridgePlusやMyriad Tables Libを利用できなくなりました。これらのツールを利用したい場合にはScript Debuggerの利用が必須という状況です。

もともと、OS標準装備のスクリプトエディタではCocoaオブジェクトのログ表示などは一切できないので、Cocoa Scriptingを行う=Script Debuggerの利用が必須であるため、無理もない状況です。

どうしてもmacOS 10.15上でOS標準装備のスクリプトエディタでBridgePlusやMyriad Tables Libの機能を利用したいという場合には、お使いのMacのSIPを無効化してください(10.14、10.15上で実際にできることを確認しました)。

macOS 10.15通常環境(SIP有効)でBridgePlusを利用する手順

以上の状況をふまえたうえで、macOS 10.15のSIPを無効化していない通常の環境で、BridgePlusなどのFramework同梱のAppleScript Librariesを利用できるようにするまでの手順を示します。

step 1. ライブラリをWeb上からダウンロード
step 2. ライブラリをインストール(~/Library/Script Libraries/ にコピー)

step 3. ライブラリを呼び出しているScriptをScript Debuggerでオープン
→ Download sample script calling BridgePlus

step 4. (開発元を検証できないためオープンできない旨、ダイアログ表示される)

step 5. システム環境設定の「セキュリティとプライバシー」>「一般」で「このまま開く」をクリック

step 6. Script DebuggerでBridgePlusのオープンダイアログが表示されるので、「View Dictionary」ボタンをクリック(ここ重要!!)

step 7. Script DebuggerでBridgePlusを呼び出しているScriptをオープン

あとは、BridgePlusを利用しているScriptのScript Debugger上でのコンパイル(構文確認)や実行を問題なく行えます。Myriad Tables Libなども同様です。

Posted in Script Libraries | Tagged 10.15savvy | Leave a comment

CotEditorのScript集、PowerPack & Basic Packをv2.0にアップデート

Posted on 10月 27, 2019 by Takaaki Naganoya

CotEditorの関連ScriptをまとめたScript Pack v2.0の配布を開始しました。無償、無保証、サポートなしで提供しています。CotEditor 3.8+macOS 10.14/10.15にて検証を行っています。

–> Download Page

基礎的なサンプルScriptの「Basic Pack」、強力なユーティリティScriptの「PowerPack」から構成され、今回アップデートしたのはPowerPackです。

PowerPackはCotEditorのScript Folder(~/Library/Application Scripts/com.coteditor.CotEditor)に入れればCotEditorのScript Menuに表示され、実行できるようになります。

Script Menuから実行すると、メニューバーにScript実行中のインジケーターが表示されます。

途中で停止したい場合には、⚙アイコンをクリックして表示されるメニューの×印ボタンをクリックすると、

実行がキャンセルされます。

さらに強化されたツールScript群:PowerPack

CotEditorのスクリプトメニューにインストールして使うためのScript群です。最大のアップデート内容は、メニュー内容の増加で見にくかった箇所を整理した点です。メニューにセパレータを入れて、おおまかな区分けを整理しています。v1.2で新規追加のScriptをわかりやすくしようと試みていましたが、メニュー内容が見にくくなったので廃止しました。


▲バージョンアップしてだんだんメニューが整理されてきました

アップデートしたものをご紹介いたします。

カウントレポート

「👀🔭🧼選択中のテキストの文字の種別ごとの構成比」を追加しました。長い文章の文字種判定を実行すると時間がかかるので、選択範囲のみ判定できるようにしたものです

🍎📜AppleScriptとして解釈


「📜AppleScript書類を読み込み、📄新規書類に展開」バンドル形式ではないAppleScript書類のソースコードを、CotEditorの新規書類に読み込みます
「📜🧼選択範囲をapplescript schemeの🌐URLに💙encodeして📄新規書類に展開」CotEditor上で編集中のAppleScriptの選択範囲をURLエンコードして、CotEditor新規書類に展開します

🧼🧼選択範囲を処理


「1️⃣2️⃣3️⃣行頭に番号を振る」選択中の行の先頭に連番を振ります
「🔄❎すべて❌伏せ字に」選択範囲の文字をすべて伏せ字にします
「🔄❎⚙️🇯🇵簡易日本語形態素解析📚してそれっぽく❌伏せ字に」選択範囲の日本語テキストを簡易形態素解析してそれっぽく伏せ字にします
「🔄❎⚙️🇬🇧英語簡易形態素解析📚してそれっぽく❌伏せ字に」同じく、選択範囲の英語のテキストをパースしてそれっぽく伏せ字にします(前置詞やbe動詞などを残してあとは伏せ字に)。まだ仕上がりがいまひとつです
「🔄✴️行頭にナカグロ(・)を入れる(箇条書き時の整形)」選択範囲の行頭にナカグロ(・)を入れます
「🔄✴️行頭のナカグロ(・)を削除する」行頭のナカグロ文字だけ削除します
「🔜⬇️行単位ソート(A→Z)」選択範囲の行を行単位で昇順ソートします
「🔙⬆️行単位ソート(Z→A)」選択範囲の行を行単位で逆順ソートします
「🔜🔃行単位で逆順に」選択範囲の行を行単位で現在と逆順に入れ替えます
「🔜🏞プロポーショナルフォントで🖥画面表示したピクセル数で行ソート」プロポーショナルフォントをオフスクリーン描画して、描画幅をもとにソートします
「🔄🎉行単位でランダム・シャッフル」行単位でシャッフルします

🈳青空文庫


「🈂️サンプル文章をオープン」同梱のサンプル文章「坊ちゃん」「こころ」「我輩は猫である」のうちのいずれかのテキストをオープンします

📝PDFから情報読み込み


「📝全ページの本文テキストを📗読み込む」指定のPDF本文テキストを新規書類に読み込みます
「📝指定ページの本文テキストを📗読み込む」指定のPDFの指定ページの本文テキストを新規書類に読み込みます
「🧾TOC(Table Of Contents)📗読み込み」指定のPDFのTOCテキストを新規書類に読み込みます
「🔗全ページの🌏URLリンクをまとめて📗新規書類に読み込む(http、https)」指定のPDFのURLリンクのうちプロトコルがhttp、httpsのURLを新規書類に読み込みます
「🔗全ページの🌏URLリンクをまとめて📗新規書類に読み込む(mailto)」指定のPDFのURLリンクのうちプロトコルがmailtoのURLを新規書類に読み込みます
「🔗全ページの🌏URLリンクをデコードして、それぞれ📗📗個別の📗📗新規書類に読み込む(applescript)」指定のPDFのURLリンクのうちプロトコルがapplescriptのURLをデコードして個別の新規書類に読み込みます
「🔗全ページの🌏URLリンクをデコードして、🧼選択語句を含むものをそれぞれ📗📗個別の📗📗新規書類に読み込む(applescript)」指定のPDFのURLリンクのうちプロトコルがapplescriptで、デコード内容にCotEditor上で選択中の語句を含むものを個別の新規書類に読み込みます

🎹iTunesまたはMusic


「🎹🖍現在の音楽トラックに歌詞として書き込む」CotEditorで選択範囲のテキストを、iTunes/Music上で選択中の音楽トラックの歌詞として書き込みます
「🎹👀現在の音楽トラックの歌詞を📗新規書類に読み込む」、iTunes/Music上で選択中の音楽トラックの歌詞をCotEditorの新規書類に読み込みます

🎲QRコード


「🎲💔QRコード画像をdecodeして📗新規書類に読み込み」QRコード画像をデコードして、CotEditorの新規書類に読み込みます
「🎲💙選択範囲をQRコードにencodeして🎆画像出力」CotEditor上で選択中のテキストをQRコードにエンコードしてデスクトップに画像出力します

🌇画像取り込み


「🔌💙base64 encodeして📃新規書類に読み込み」指定画像をbase64エンコードして新規書類に読み込みます
「)🔌💙base64 encodeして🏷img srcタグ🏷つきで📗新規書類に読み込み」指定画像をbase64エンコードして新規書類にimg srcタグつきで新規書類に読み込みます

📄⚙️ファイルの情報読み込み


「📄⚙️指定ファイルの🛍メタデータを📗新規書類に読み込み」指定ファイルのメタデータを新規書類に読み込みます

macOS 10.13上ではインストールできません

macOS 10.13上では配布中のZipファイルの展開時にエラーが出ることを確認していますが、macOS 10.13自体がバグの塊のようなバージョンなので、対処できるのかどうか、、、
–> DiskImageに入れて圧縮してみましたが、macOS 10.13上ではマウントしたDiskImageからのコピー時にエラーが出て(ファイル名をすべて変更しないと)コピー自体ができないようです

Posted in System | Tagged 10.14savvy 10.15savvy CotEditor | 2 Comments

指定画像をbase64エンコード文字列に変換

Posted on 10月 27, 2019 by Takaaki Naganoya

指定画像をbase64エンコーディング文字列に変換するAppleScriptです。

用途は、sdef(AppleScript用語辞書)に画像を突っ込む(ためのデータを作る)こと。それだけです。

ただ、あまりにでかい画像をbase64文字化して取得すると、スクリプトエディタが結果を表示したときに不安定になったり処理が返ってこなくなったりするので、文字列を取得する前にデータサイズを計算し、リサイズしてから文字列化するとか、他の形式(GIFなど)を用いてエンコードするなどのケアが必要になります。ねんのため。

元画像が何であっても、NSImageに読み込める画像なら(OSでサポートしている画像なら)読み込んで、PNG形式に変換したのちにBase64エンコード文字列に変換しています。


▲エンコードするにしても数10KBとかそのぐらいのファイルサイズの画像にしておかないと後がつらい


▲4K解像度の画像をbase64エンコードするとこんなに結果が巨大に

AppleScript名:指定画像をbase64エンコード文字列に変換.scptd
—
–  Created by: Takaaki Naganoya
–  Created on: 2019/10/25
—
–  Copyright © 2019 Piyomaru Software, All Rights Reserved
—
property NSString : a reference to current application’s NSString
property NSImage : a reference to current application’s NSImage
property NSPNGFileType : a reference to current application’s NSPNGFileType
property NSBitmapImageRep : a reference to current application’s NSBitmapImageRep
property NSUTF8StringEncoding : a reference to current application’s NSUTF8StringEncoding
property NSDataBase64EncodingEndLineWithLineFeed : a reference to current application’s NSDataBase64EncodingEndLineWithLineFeed

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

set aFile to choose file of type {"public.image"}
set aStr to base64StringFromImageFile(aFile) of me

–Base64 Encode
on base64StringFromImageFile(aFile)
  set aPOSIX to POSIX path of aFile
  
set anImage to NSImage’s alloc()’s initWithContentsOfFile:aPOSIX
  
set imageRep to NSBitmapImageRep’s alloc()’s initWithData:(anImage’s TIFFRepresentation())
  
set aPNGdat to imageRep’s representationUsingType:(NSPNGFileType) |properties|:(missing value)
  
set base64Str to aPNGdat’s base64EncodedDataWithOptions:(NSDataBase64EncodingEndLineWithLineFeed)
  
set bStr to (NSString’s alloc()’s initWithData:base64Str encoding:(NSUTF8StringEncoding))
  
return bStr as string –or return NSString (delete as string) for speedy processing
end base64StringFromImageFile

★Click Here to Open This Script 

Posted in Image Text | Tagged 10.12savvy 10.13savvy 10.14savvy 10.15savvy NSBitmapImageRep NSDataBase64EncodingEndLineWithLineFeed NSImage NSPNGFileType NSString NSUTF8StringEncoding | Leave a comment

Pages書類の1ページ目の表の背景色を置換 v5

Posted on 10月 25, 2019 by Takaaki Naganoya

Pagesでオープン中の最前面の書類の1ページ目に存在する表オブジェクト中の背景色を置換するAppleScriptです。カラー選択のポップアップメニューUser Interfaceをpickup colorライブラリに分離したため、実行できる環境が増えました(Script Debugger上でも動くようになりました)。

–> Download Code-signed AppleScript applet with sample Pages data

Pages書類の「表オブジェクト」にAppleScriptからアクセスするためには、Pages上で表オブジェクトを選択した状態で、

「オブジェクトの配置」を「移動しない」に事前に設定しておく必要があります。

本AppleScriptを実行可能なランタイム環境は、スクリプトエディタ、アプレットの2つです。スクリプトメニューおよびScript Debuggerでは各GUI部品のクリックイベントを拾えないために、実行しても選択などが行えません。

のように、1ページのみのPages書類に表オブジェクトを入れて、「移動しない」設定にしてある状態で本AppleScriptを実行。

表のセル中の色をすべて取得して、ユニーク化してポップアップメニューから「変更元」の色を選択できます。

選択して、「OK」ボタンをクリック。ここで選択した色が置換されます。

選択した色をどの色に変更(置換)するのかを指定します。

グレーを選択。

AppleScript名:Pages書類の1ページ目の表の背景色を置換 v5
— Created 2017-07-15 by Takaaki Naganoya
— Modified 2019-10-25 by Takaaki Naganoya
— 2019 Piyomaru Software
use AppleScript version "2.4"
use scripting additions
use framework "Foundation"
use framework "AppKit"
use Bplus : script "BridgePlus" –https://www.macosxautomation.com/applescript/apps/BridgePlus.html
use pickLib : script "pickup color" –http://piyocast.com/as/asinyaye

–v1:First Version
–v2:Pick Up target cells by calculate every background color (35% speed up)
–v3:Draw cells by range (x20 speed up)
–v3.1:Bug Fix (retRangeFromPosList)
–v3.1.1:Bug Fix (retRangeFromPosList)
–v4:Two-way Simulation (Horizontal / Vertical scan), Corner-Rounded NSImage, Dynamic Color Naming
–v4.1:Correct Vertical Scan simulation (Sort list for vertical range evaluation, at first)
–v5: Use "pickup color" library, Auto color name suggestion function was removed

property NSArray : a reference to current application’s NSArray
property SMSForder : a reference to current application’s SMSForder

–初期化
load framework

–Pagesの1ページ目にある表の塗り色を取得
tell application "Pages"
  if (count of (every document)) = 0 then return
  
  
tell front document
    if (count of (every table)) = 0 then return
    
    
tell table 1
      set c1List to background color of every cell
      
set aProp to properties
      
set xCount to column count of aProp
    end tell
  end tell
end tell

–色データをユニーク化(重複削除)
set bList to uniquifyList(c1List) of me

–Convert 1D List to 2D List
set c3List to (SMSForder’s subarraysFrom:c1List groupedBy:xCount |error|:(missing value)) as list

–missing value(背景色なし)を除外する
set c2List to (SMSForder’s arrayByDeletingBlanksIn:(bList)) as list

–Popup Menuで置換色選択
set cRes to pickup color c2List main message "Select Target Color" color max max65535
if cRes = 0 then return

set fromCol to (contents of item cRes of c2List)

–カラーピッカーで置換色選択
set tCol to choose color default color fromCol

set d1 to current date

–実際に表の背景色を置換する
set hitList to findDataFrom2DList(fromCol, c3List) of me –データ上で当該色のセル情報を計算する

–Rangeを横スキャンと縦スキャンの2通りで試算(Two way Simulation)
set rList1 to retRangeFromPosListHorizontal(hitList) of me –横方向へのrange評価
set rList2 to retRangeFromPosListVertival(hitList) of me –縦方向へのrange評価

–Simulationの結果、要素数の少ない方(=処理時間の短い方=高速な方)を採用する
–log {"Simulation", (length of rList1), (length of rList2)}
if (length of rList1) < (length of rList2) then
  copy rList1 to rangeList
else
  copy rList2 to rangeList
end if

tell application "Pages"
  activate
  
tell front document
    tell table 1
      repeat with i in rangeList
        set j to contents of i
        
        
ignoring application responses –非同期実行モードで高速実行
          set background color of range j to tCol
        end ignoring
        
      end repeat
    end tell
  end tell
end tell

set d2 to current date
return d2 – d1

on uniquifyList(aList as list)
  set aArray to NSArray’s arrayWithArray:aList
  
set bArray to aArray’s valueForKeyPath:"@distinctUnionOfObjects.self"
  
return bArray as list
end uniquifyList

on findDataFrom2DList(anItem, aList as list)
  script spd
    property aList : {}
    
property resList : {}
  end script
  
  
set (aList of spd) to aList
  
set (resList of spd) to {}
  
  
set yCount to 1
  
  
repeat with i in (aList of spd)
    
    
set aResList to (Bplus’s indexesOfItem:anItem inList:i inverting:false) as list
    
    
set tmpList to {}
    
if aResList is not equal to {} then
      repeat with ii in aResList
        set jj to contents of ii
        
set the end of tmpList to {jj, yCount}
      end repeat
      
set (resList of spd) to (resList of spd) & tmpList
    end if
    
    
set yCount to yCount + 1
  end repeat
  
  
return (resList of spd) –return {{x, y}…..} item list (1-based)
end findDataFrom2DList

on retRangeFromPosListVertival(posList as list)
  script rangeSPD
    property posList2 : {}
  end script
  
  
–縦方向へのrange評価に都合がいいようにソート
  
set (posList2 of rangeSPD) to shellSortListAscending(posList, {1, 2}) of me
  
  
–先頭データをピックアップ
  
set firstData to first item of (posList2 of rangeSPD)
  
set (posList2 of rangeSPD) to rest of (posList2 of rangeSPD)
  
  
copy firstData to {curX1, curY1}
  
set tmpRangeStr to aNumToExcelColumn(curX1) of me & (curY1 as string) & ":"
  
  
set tmpRange to {}
  
set hitF to false
  
  
set outList to {}
  
  
repeat with i in (posList2 of rangeSPD)
    copy i to {tmpX, tmpY}
    
    
–log {"{curX1, curY1}", {curX1, curY1}}
    
–log {"{tmpX, tmpY}", {tmpX, tmpY}}
    
    
if (curX1 = tmpX) and (curY1 + 1 = tmpY) then
      –Y方向への連続値を拾っている最中
      
if hitF = false then
        –log "case 1a"
        
–log {"hitF", hitF}
        
set hitF to true
      else
        –log "case 1b"
        
–log {"hitF", hitF}
        
–横に連続しているブロックの途中
      end if
    else
      –直前の値と連続していない
      
if hitF = false then
        –log "case 2a"
        
–log {"hitF", hitF}
        
set tmpRangeStr to tmpRangeStr & aNumToExcelColumn(curX1) of me & (curY1 as string)
        
set the end of outList to tmpRangeStr
        
set tmpRangeStr to aNumToExcelColumn(tmpX) of me & (tmpY as string) & ":"
        
set hitF to false
      else
        –log "case 2b"
        
–log {"hitF", hitF}
        
–連続ブロックの末尾を拾った
        
set tmpRangeStr to tmpRangeStr & aNumToExcelColumn(curX1) of me & (curY1 as string)
        
set the end of outList to tmpRangeStr
        
set tmpRangeStr to aNumToExcelColumn(tmpX) of me & (tmpY as string) & ":"
        
set hitF to false
        
–log {"tmpRangeStr", tmpRangeStr}
      end if
    end if
    
    
copy {tmpX, tmpY} to {curX1, curY1}
  end repeat
  
  
–log {tmpRangeStr, hitF}
  
  
if (hitF = true) or (tmpRangeStr is not equal to "") then
    set tmpRangeStr to tmpRangeStr & aNumToExcelColumn(curX1) of me & (curY1 as string)
    
set the end of outList to tmpRangeStr
  end if
  
  
return outList
end retRangeFromPosListVertival

on retRangeFromPosListHorizontal(posList as list)
  script rangeSPD
    property posList2 : {}
  end script
  
  
copy posList to (posList2 of rangeSPD)
  
  
–先頭データをピックアップ
  
set firstData to first item of (posList2 of rangeSPD)
  
set (posList2 of rangeSPD) to rest of (posList2 of rangeSPD)
  
  
copy firstData to {curX1, curY1}
  
set tmpRangeStr to aNumToExcelColumn(curX1) of me & (curY1 as string) & ":"
  
  
set tmpRange to {}
  
set hitF to false
  
  
set outList to {}
  
  
repeat with i in (posList2 of rangeSPD)
    copy i to {tmpX, tmpY}
    
    
–log {"{curX1, curY1}", {curX1, curY1}}
    
–log {"{tmpX, tmpY}", {tmpX, tmpY}}
    
    
    
if (curX1 + 1 = tmpX) and (curY1 = tmpY) then
      –X方向への連続値を拾っている最中
      
if hitF = false then
        –log "case 1a"
        
–log {"hitF", hitF}
        
set hitF to true
      else
        –log "case 1b"
        
–log {"hitF", hitF}
        
–横に連続しているブロックの途中
      end if
    else
      –直前の値と連続していない
      
if hitF = false then
        –log "case 2a"
        
–log {"hitF", hitF}
        
set tmpRangeStr to tmpRangeStr & aNumToExcelColumn(curX1) of me & (curY1 as string)
        
set the end of outList to tmpRangeStr
        
set tmpRangeStr to aNumToExcelColumn(tmpX) of me & (tmpY as string) & ":"
        
set hitF to false
      else
        –log "case 2b"
        
–log {"hitF", hitF}
        
–連続ブロックの末尾を拾った
        
set tmpRangeStr to tmpRangeStr & aNumToExcelColumn(curX1) of me & (curY1 as string)
        
set the end of outList to tmpRangeStr
        
set tmpRangeStr to aNumToExcelColumn(tmpX) of me & (tmpY as string) & ":"
        
set hitF to false
        
–log {"tmpRangeStr", tmpRangeStr}
      end if
    end if
    
    
copy {tmpX, tmpY} to {curX1, curY1}
  end repeat
  
  
–log {tmpRangeStr, hitF}
  
  
if (hitF = true) or (tmpRangeStr is not equal to "") then
    set tmpRangeStr to tmpRangeStr & aNumToExcelColumn(curX1) of me & (curY1 as string)
    
set the end of outList to tmpRangeStr
  end if
  
  
return outList
end retRangeFromPosListHorizontal

–2008/05/01 By Takaaki Naganoya
–10進数数値をExcel 2004/2008的カラム表現にエンコードするサブルーチン を使いまわし
–1〜1351までの間であれば正しいエンコーディング結果を返す
on aNumToExcelColumn(origNum as integer)
  if origNum > 1351 then
    error "エラー:Excel 2004/2008的カラム表現(A1形式)への変換ルーチンにおいて、想定範囲外(1351以上)のパラメータが指定されました"
  end if
  
  
set upperDigitEncTable to {"A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z", "A"}
  
set lowerDigitEncTable to {"A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z", "A"}
  
  
set oNum to origNum
  
set nTh to 26
  
set stringLength to 4
  
  
–数字が1桁の場合の対応
  
if origNum < 27 then
    set aRes to (item origNum of upperDigitEncTable) as string
    
return aRes
  end if
  
  
  
if origNum > 702 then
    –3桁になる場合
    
set upupNum to oNum div 676 –整数除算–上の上の桁
    
set oNum to oNum – (upupNum * 676)
    
set upNum to oNum div 26 –整数除算–上の桁
    
set lowNum to oNum mod 26 – 1 –余剰計算–下の桁
    
    
–超つじつま合わせ処理
    
if lowNum = -1 then
      set upNum to upNum – 1
      
set lowNum to 25
    end if
    
    
set upupChar to (item upupNum of upperDigitEncTable) as string
    
set upChar to (item upNum of upperDigitEncTable) as string
    
set lowChar to (item (lowNum + 1) of lowerDigitEncTable) as string
    
set resText to upupChar & upChar & lowChar
    
  else
    –2桁の場合
    
set upNum to oNum div 26 –整数除算–上の桁
    
set lowNum to oNum mod 26 – 1 –余剰計算–下の桁
    
    
–超つじつま合わせ処理
    
if lowNum = -1 then
      set upNum to upNum – 1
      
set lowNum to 25
    end if
    
    
set upChar to (item upNum of upperDigitEncTable) as string
    
set lowChar to (item (lowNum + 1) of lowerDigitEncTable) as string
    
set resText to upChar & lowChar
    
  end if
  
  
return resText
end aNumToExcelColumn

–入れ子のリストを昇順ソート
on shellSortListAscending(a, keyItem)
  return sort2DList(a, keyItem, {true}) of me
end shellSortListAscending

–入れ子のリストを降順ソート
on shellSortListDecending(a, keyItem)
  return sort2DList(a, keyItem, {false}) of me
end shellSortListDecending

–2D Listをソート
on sort2DList(aList as list, sortIndexes as list, sortOrders as list)
  
  
–index値をAS流(アイテムが1はじまり)からCocoa流(アイテムが0はじまり)に変換
  
set newIndex to {}
  
repeat with i in sortIndexes
    set j to contents of i
    
set j to j – 1
    
set the end of newIndex to j
  end repeat
  
  
–Sort TypeのListを作成(あえて外部から指定する内容でもない)
  
set sortTypes to {}
  
repeat (length of sortIndexes) times
    set the end of sortTypes to "compare:"
  end repeat
  
  
–Sort
  
set resList to (SMSForder’s subarraysIn:(aList) sortedByIndexes:newIndex ascending:sortOrders sortTypes:sortTypes |error|:(missing value)) as list
  
  
return resList
end sort2DList

★Click Here to Open This Script 

Posted in Color dialog Script Libraries | Tagged 10.13savvy 10.14savvy 10.15savvy Pages | Leave a comment

sdef(AppleScript用語辞書)に画像やムービーを入れる

Posted on 10月 25, 2019 by Takaaki Naganoya

sdef(AppleScript用語辞書)に画像が入っているとわかりやすくてよさそうだと思っていました。ただ、その実例がどこにも見つかりません。

見つからない場合には、いろいろ考えればいいわけで、少し考えて試してみたらできてしまいました。

–> Download pickup color.scptd(To ~/Library/Script Libraries)

sdefはxml形式のファイルで、その中には基本的にAppleScriptのコマンドやオブジェクト、属性値や列挙値が定義されています。

ただ、それだけだとわかりづらいかも? という配慮から、HTML形式のドキュメントも入れられるようになっています。

最近のPiyomaru Softwareのライブラリでは、sdef内にサンプルScriptを「applescript://」URL Link入りで本Blogと同様に掲載しています。これだとsdefの容量が大きくなってしまいますが、すぐに利用できる用例が掲載されていないと意味がないと判断し、ライブラリを小分けにすることでバランスを取ろうと考えました。

ここまでで、ワンクリックですぐに試せるサンプルScript入りのAppleScript用語辞書は実現できました。全コマンド、全オブジェクトの定義に対してサンプルScriptが掲載されていれば、迷うこともないでしょう。

そこまで実現しても、やはり内容を画像で伝えたい場合もあるわけで、このHTML形式のドキュメントの中にimg srcタグで画像を指し示せればいいんじゃなかろうかと思っていました。

実際、いろいろパスの書き方を工夫してみたものの、なかなか画像表示できませんでした。その一方で、リンク先が間違っているという表示にはなっているものの、画像表示自体は行えそうな雰囲気のレンダリング結果にはなっていました。

当初、バンドル内の画像を相対パスで指し示したいと試行錯誤していたものの、自分が試した範囲内ではできませんでした。Web上の画像をURLで指し示せば表示されそうな気配はしていたものの、オフライン状態で作業した場合にでも画像は表示されてほしいところです。

そんなときに、画像をbase64エンコードしてimg srcタグの中に直接記述するという荒技を見つけ、そのとおりに書いてみたところ無事表示できたという寸法です。

オフライン時に表示されなくてよいのであれば、

のように、Web上の画像をリンク表示することもできるので、sdefのサイズを大きくしたくないが画像を大量に使いたいという場合にはこちらも検討に値することでしょう。

できないと思いつつ、iframeタグでYouTubeのムービーを埋め込んでみようと試してみましたが、表示されませんでした(iframeのフレーム自体はその大きさのボックスが存在しているもよう)。mpeg4のムービーをWeb上に置いてリンクしてみたらムービー再生できました。フルスクリーン再生も可能でした。

その他、sdefのあまり利用されていない機能は、

 ・ローカライズできる

というあたりでしょうか。日本語ユーザー向けに日本語のAppleScript用語辞書も書けるわけで、けっこう英語が読めない(英語読めないとプログラミング無理だと思わなくもないですが)人が多いようなので、いろいろ試してみたいところではあります(昔、Classic MacOS時代に、e.Typistという日本語OCRソフトウェアのAppleScript用語辞書が日本語で書かれていているのを見たことがあります)。

ただ、そこにパワーを割くぐらいならサンプルScriptを掲載しておけば、くどくど説明せずともサンプルのURLリンクをクリックするだけで実際にScriptを実行できるので、めったに使わない機能ではあります。


▲FineReader OCR ProのAppleScript用語辞書が日本語ローカライズされているのを発見しました。そこ日本語化するよりも、連続OCR実行ができないとか、「C++」などの指定できない定数を定義しているあたりを修正するほうがいいと思うのですが、、、、、、

Posted in sdef | Tagged 10.12savvy 10.13savvy 10.14savvy 10.15savvy | 1 Comment

Music Control with AppleScript近日発売!

Posted on 10月 24, 2019 by Takaaki Naganoya

iTunesがMusic.appに置き換わったので、もともとのiTunes Controlからアップデートした、電子ブック「Music Control with AppleScript」を準備しています。

これまでの「AppleScriptえほんシリーズ」からバージョンアップして、本Blog同様に「applescript://」のURLリンクを入れているため、クリックだけですぐに内容をスクリプトエディタに転送して実行できるようになっています(OS標準搭載のPreviewではカスタムURLプロトコルのリンクがきかないので、フリーのSkimをご利用ください)。

→ PDFView上でのURLクリックのイベントをmacOS 10.15が正常にデコードしないというバグが見つかったので、そのバグに対処するための専用の簡易PDFビューワーを作成しました。macOS 10.15環境では、Skimではなくこちらを利用してください。

記事を書いている最中にこのバグに直面したので、途中でこの簡易PDFビューワーの作成の必要が生じて、若干作業が遅れております、、、、


▲テクスチャも人物も、フリー素材集を買ってきて組み合わせて使っているので、本人が描いているわけではありません

この当時には「えほんシリーズ」として位置付けていましたが、「FileMaker Pro Scripting With AppleScript」と同様、徹底活用シリーズに変更になりました。

Posted in イベント(Event) | Tagged 10.15savvy Music | Leave a comment

日付ダイアログで開始時と終了時を選択する

Posted on 10月 23, 2019 by Takaaki Naganoya

edama2さんからの投稿です。いつもながら、(同じAppleScriptを書いているのに)異種格闘技のようなフレーバーの違いを感じるものですが、ソースコードを美しく書くことへのこだわりと、実際に実現されている機能については折り紙つきです。

—- >8 投稿ここから

タイトルは「日付ダイアログで開始時と終了時を選択する」です。
「アラートダイアログ上のDate Pickerで日付選択」をベースに日付をふたつ選択できるようにしました
結果はレコードで帰って返ってきます

--> {|開始日|:date "2019年10月23日 水曜日 21:23:04", |終了日|:date "2019年10月24日 木曜日 21:23:04"}

NSDatePickerのコメントアウトしている部分を変更するとカレンダー以外にもできます

スプリクトオブジェクトの使い方が奇怪(?)だと思うかもしれませんが、
script-factory さんのクラスオブジェクトのやり方を参考に結果のプロパティ値を本体と分離するためにこうしています。

制作環境:macOS10.14.6
—– >8 投稿ここまで

まず「property parent : AppleScript」で腰を抜かしてしまいました。なるほど、こういう逃げ道があったんですか。Script文の中にCocoaの機能を呼び出すAppleScriptObjCを書く方法がなかなか見つからずに、個人的にそういう書き方はしてこなかったところですが、これは実際に試してみないと。

AppleScriptで作った部品を積み上げて新しい概念や機能を実現することには関心がありますが、記法の限界を探るという方向にはほとんど興味がないので、参考になります。

自分も、NSDatePickerにNSBoxをかぶせてアラートダイアログに表示させるところまでは同様に作っていたんですが、サイズの調整に手間取って、思い通りの表示を行えていませんでした。はい、まさにこういう形のものが作りたかった(利用したかった)ので、これを見て勉強させていただきましょう。

AppleScript名:日付ダイアログで開始時と終了時を選択する.scpt
on run
  set dateObj to my chooseDate("期間を選択", "開始日と終了日を選択してください。", "開始日", "終了日")
end run

#カレンダー作成対象の年、月を選択(ただし、日付をクリックして選択しないと値を取得できないので注意)
on chooseDate(aMainMes, aSubMes, aLabel1, aLabel2)
  script MyDialog
    property parent : AppleScript
    
use AppleScript
    
use scripting additions
    
use framework "Foundation"
    
property _the_date : missing value
    
on make
      set aClass to me
      
script
        property parent : aClass
      end script
    end make
    
## ダイアログの呼び出し
    
on chooseDate(aMainMes, aSubMes, aLabel1, aLabel2)
      set paramObj to {myMessage:aMainMes, mySubMessage:aSubMes, myLabel1:aLabel1, myLabel2:aLabel2}
      
parent’s performSelectorOnMainThread:"raize:" withObject:paramObj waitUntilDone:true
      
return (my _the_date)
    end chooseDate
    
## ダイアログの生成
    
on raize:paramObj
      set aMainMes to paramObj’s myMessage
      
set aSubMes to paramObj’s mySubMessage
      
set aLabel1 to paramObj’s myLabel1
      
set aLabel2 to paramObj’s myLabel2
      
set setTime1 to current date
      
set setTime2 to setTime1 + days
      
      
set aList to {}
      
set aList’s end to {boxLabel:aLabel1, aTime:setTime1}
      
set aList’s end to {boxLabel:aLabel2, aTime:setTime2}
      
      
set viewList to {}
      
set datePickerList to {}
      
set parentViewWidth to 0
      
set aMargin to 8
      
      
set countItem to count aList
      
repeat with num from 1 to countItem
        set anItem to (aList)’s item num
        
        
set setLabel to anItem’s boxLabel
        
set setTime to anItem’s aTime
        
        
## create a view
        
set opt to current application’s NSYearMonthDayDatePickerElementFlag
        
–set opt to opt + (current application’s NSHourMinuteSecondDatePickerElementFlag as integer)
        
tell current application’s NSDatePicker’s new()
          –setDatePickerStyle_(current application’s NSClockAndCalendarDatePickerStyle) –> 10.13以下
          
setDatePickerStyle_(current application’s NSDatePickerStyleClockAndCalendar) –> 10.14以上 カレンダー
          
–setDatePickerStyle_(current application’s NSDatePickerStyleTextField) –> 10.14以上 テキスト入力
          
–setDatePickerStyle_(current application’s NSDatePickerStyleTextFieldAndStepper) –> 10.14以上 ステップ入力
          
setDatePickerElements_(opt)
          
setDateValue_(setTime)
          
set thisSize to fittingSize()
          
setFrameSize_(thisSize)
          
          
### 余白の大きさを指定
          
set aWidth to (thisSize’s width) + aMargin * 3.75
          
set aHeight to (thisSize’s height) + aMargin * 5.25
          
set boxFrameSize to current application’s NSMakeSize(aWidth, aHeight)
          
setFrameOrigin_(current application’s NSMakePoint(aMargin, aMargin))
          
log frame()
          
set theDatePicker to it
        end tell
        
        
tell current application’s NSBox’s new()
          setTitle_(setLabel)
          
addSubview_(theDatePicker)
          
setFrameSize_(boxFrameSize)
          
setFrameOrigin_(current application’s NSMakePoint(parentViewWidth, 0))
          
set viewList’s end to it
        end tell
        
        
### 親NSViewの大きさを指定
        
set countItem2 to count viewList
        
repeat with num2 from num to countItem2
          set anItem2 to viewList’s item num2
          
set tmpFrame to anItem2’s frame()
          
set aBoxWidt to current application’s NSWidth(tmpFrame)
          
set parentViewHeight to current application’s NSHeight(tmpFrame)
          
set parentViewWidth to parentViewWidth + aMargin + aBoxWidt
          
log result
        end repeat
        
        
###
        
set datePickerList’s end to {pickerObj:theDatePicker, keyLabel:setLabel}
      end repeat
      
      
tell current application’s NSView’s new()
        –setAutoresizingMask_(0)
        
–setAutoresizesSubviews_(true)
        
setFrameSize_(current application’s NSMakeSize(parentViewWidth, parentViewHeight))
        
setSubviews_(viewList)
        
set theView to it
      end tell
      
      
## set up alert
      
tell current application’s NSAlert’s new()
        setMessageText_(aMainMes)
        
setInformativeText_(aSubMes)
        
addButtonWithTitle_("OK")
        
addButtonWithTitle_("Cancel")
        
setAccessoryView_(theView)
        
set returnCode to runModal() — show alert in modal loop
      end tell
      
      
if returnCode = (current application’s NSAlertSecondButtonReturn) then error number -128
      
      
## retrieve date
      
set keyList to {}
      
set dateList to {}
      
repeat with anItem in datePickerList
        set keyList’s end to anItem’s keyLabel
        
set dateList’s end to (anItem’s pickerObj)’s dateValue() as date
      end repeat
      
set my _the_date to (current application’s NSDictionary’s dictionaryWithObjects:dateList forKeys:keyList) as record
      
log result
    end raize:
  end script
  
  
##
  
tell (make MyDialog)
    return chooseDate(aMainMes, aSubMes, aLabel1, aLabel2)
  end tell
end chooseDate

★Click Here to Open This Script 

Posted in Calendar dialog GUI | Tagged 10.14savvy 10.15savvy | Leave a comment

CotEditorの最前面のドキュメントの選択範囲を伏せ字に

Posted on 10月 22, 2019 by Takaaki Naganoya

CotEditorの最前面のドキュメントの選択範囲を、簡易形態素解析ルーチンeasyJparseを用いて、いい感じに伏せ字にするAppleScriptです。

–> Download makeSelectionToFuseji(Code-Signed AppleScript applet with libraries in its bundle, co-work with CotEditor)

easyJparseは日本語のコマンド解析用にでっちあげた作った超簡易形態素解析プログラムです。単語(形態素)ごとに分割しますが、品詞まではわかりません。コマンド解釈用ではあるものの、少し他の用途にも使えないかと思い、このような用途に使ってみました。

# 本Scriptは、CotEditor用のScript Pack v2.0に収録されています


▲CotEditorの選択範囲を伏せ字にする。形態素解析して単語化して、単語単位で伏せ字にするかの判断を実行

テキストエディタ上で伏せ字処理というのは、個人的によく使います。たいていは、オリジナルの文章に対して同様の分量の文章を作らなくてはならないようなケースで、文字数の感覚をつかむために使います。一種のダミーレイアウトのようなものです。

本スクリプトのような伏せ字処理については、ニーズがあるんだかないんだか不明なものですが、とりあえず掲載してみました。自分で使ってみたところ、たしかに面白いものの、実用性については未知数という印象です。

(minusList of parseSPD) に入れている語群は、どこかからか拾ってきたもののようではあるものの、すでに何か方向性を見失っているような気がしないではありません。

AppleScript名:選択範囲を伏せ字に(簡易形態素解析でそれっぽく).scptd
— Created 2018-09-26 by Takaaki Naganoya
— 2018 Piyomaru Software
use AppleScript version "2.5" — El Capitan (10.11) or later
use framework "Foundation"
use scripting additions
use jParser : script "easyJParse"

property NSArray : a reference to current application’s NSArray
property NSMutableSet : a reference to current application’s NSMutableSet
property NSSortDescriptor : a reference to current application’s NSSortDescriptor

property fuesejiChar : "□"

script parseSPD
  property pList : {}
  
property p2List : {}
  
property oneLine : {}
  
property outStr : ""
  
property minusList : {}
end script

–伏せ字化しない助詞などの単語リスト。名詞だけを残すように整備。単語(形態素)単位で照合する
set (minusList of parseSPD) to {"", " ", "ー", "あ", "で", "も", "に", "と", "の", "は", "へ", "さ", "が", "せ", "か", "た", "だ", "だっ", "ば", "つ", "な", "い", "き", "お", "ら", "る", "れ", "なっ", "それ", "これ", "あれ", "どれ", "この", "どの", "あの", "その", "まで", "こと", "もの", "いつ", "いく", "たち", "ただ", "たい", "そう", "いる", "よう", "れる", "ない", "なら", "なる", "なけれ", "から", "する", "たら", "たり", "だけ", "って", "られ", "的", "化", "いくら", "そんな", "どんな", "あんな", "者", "陰", "時", "事", "こんな", "つれ", "けど", "ああ", "ある", "あっ", "あり", "しかし", "きっと", "すっかり", "例えば", "たとえば", "さっぱり", "たとえ", "だろう", "かつ", "ところ", "まるで", "だが", "全て", "すべて", "なり", "いい", "つれ", "つけ", "ながら", "せいぜい", "そうそう", "さらに", "もっと", "まだ", "なく", "し", "を", "て", "いけ", "行く", "また", "まま", "まぁ", "『", "』", "、", "。", "。。", "……。", "【", "】", "「", "」", "(", ")", "最近", "今度", "中", "チカチカ", "グラグラ", "ふわふわ", "少し", "ついで", "より", "っぽい", "ぐらい", "何", "とき", "ため", "そっくり", "そして", "やがて", "じきに", "すぐ", "今", "次", "できる", "出来る", "いや", "そう", "おそらく", "いえ", "らしい", "とも", "ほぼ", "つい", "もう", "きっかけ", "ころ", "頃", "早々", "そこ", "どこ", "なんか", "じゃ", "くれ", "ください", "こそ", "あいつ", "だれ", "誰", "おぼしき", "らしき", "らしい", "しか", "でき", "よっ", "確か", "どう", "こう", "そう", "ああ", "くる", "ざま", "ごとく", "きれ", "はず", "さらに", "さらなる", "更なる", "など", "ごと", "とても", "たく", "いう", "とっ", "いっ", "えっ", "おっ", "ここ", "そこ", "どこ", "なかっ", "ごく", "やる", "ゆい", "ふと", "たび", "ほど", "もた", "よし", "ぜひ", "いら", "よい", "ま", "み", "む", "め", "も", "や", "けれど", "だけど", "したがっ", "すごく", "そもそも", "ほしい", "なれる", "すぎ", "もふもふ", "モフモフ", "さん", "おと", "とー", "えっと", "け", "っけ", "なん", "よ", "ね", "しっくり", "くれる", "くれた", "なぜ", "まあ", "まぁ", "ん", "なんて", "!」"}

set (pList of parseSPD) to {}
set (p2List of parseSPD) to {}
set (oneLine of parseSPD) to {}
set (outStr of parseSPD) to {}

tell application "CotEditor"
  tell front document
    –選択部分が存在しているかどうかチェック
    
set aCon to contents of selection
    
if aCon = "" then return
    
    
set (pList of parseSPD) to paragraphs of aCon
  end tell
end tell

–伏せ字にする対象単語を、助詞などを消し込むことでピックアップ
repeat with i in (pList of parseSPD)
  if length of i > 1 then
    –簡易形態素解析
    
set tempList to parseJ(i) of jParser
    
    
–簡易形態素解析したリストと助詞などのリストの差分を計算
    
set cList to clacListDiff(tempList, (minusList of parseSPD)) of me
    
    
set (oneLine of parseSPD) to {}
    
repeat with ii in tempList
      set aLen to length of ii
      
if ii is in cList then
        –伏せ字化する場合
        
set bCon to multipleChar(fuesejiChar, aLen) of me
        
      else
        –そのまま出力する場合
        
set bCon to contents of ii
      end if
      
set the end of (oneLine of parseSPD) to bCon
    end repeat
    
    
–1つの文章ぶんの単語を連結
    
set cStr to retDelimedText((oneLine of parseSPD), "") of me
  else
    set cStr to ""
  end if
  
  
set the end of (p2List of parseSPD) to cStr
  
end repeat

–すべての文章を連結して配列からテキストに
set (outStr of parseSPD) to retDelimedText((p2List of parseSPD), return) of me

tell application "CotEditor"
  tell front document
    set contents of selection to (outStr of parseSPD)
  end tell
end tell

–指定文字を指定回数繰り返して連結して出力
on multipleChar(aChar as string, aLen as integer)
  set aList to {}
  
repeat aLen times
    set the end of aList to aChar
  end repeat
  
  
return retDelimedText(aList, "") of me
end multipleChar

–1D Listを要素間に指定デリミタをはさんで文字列化
on retDelimedText(aList as list, aDelim as string)
  set aText to ""
  
set curDelim to AppleScript’s text item delimiters
  
set AppleScript’s text item delimiters to aDelim
  
set aText to aList as text
  
set AppleScript’s text item delimiters to curDelim
  
return aText
end retDelimedText

–2つの1D Listの差分を計算
on clacListDiff(aList as list, bList as list)
  set aSet to NSMutableSet’s setWithArray:aList
  
set bSet to NSMutableSet’s setWithArray:bList
  
  
aSet’s minusSet:bSet –補集合
  
set aRes to aSet’s allObjects() as list
  
  
return aRes
end clacListDiff

★Click Here to Open This Script 

Posted in list Natural Language Processing Text | Tagged 10.12savvy 10.13savvy 10.14savvy 10.15savvy CotEditor NSArray NSMutableSet NSSortDescriptor | 1 Comment

Script Geek 2.0が公開される

Posted on 10月 22, 2019 by Takaaki Naganoya

Shane Stanleyのフリーソフトウェア「Script Geek」の新バージョンv2.0が公開されました。

→ Script Geek 2.0ダウンロードページ


▲Dark ModeにするとAbout画面の文字が見えない。うん、これ自分も気をつけよう(^ー^;

前バージョンからの相違点は、Dark Modeへの対応などですが、大幅に変わったりはしていません。2つのAppleScriptの処理時間を計測するというものです。

本ツールは利用頻度も高く、実際にScriptを書いている最中によく走らせています。

Cocoaの機能を呼び出す場合には、処理対象のデータ数によっては従来のAppleScriptによる処理よりも遅くなることがあるので、「本当にCocoaで処理させたほうが高速か?」ということをいちいち確認しておく必要があります。

ほんの数個の要素からなる配列のソートにCocoaの機能を使うと逆に遅くなりますし、数万要素の配列からの条件抽出にCocoaの機能を使わないと損です。

つまり、AppleScriptからのCocoaの利用については、速度的なメリットがない場合には使わないほうがいいという点が「真髄」といいますか、その一番大事なところであって、本ツールの存在・利用そのものがShane Stanleyのノウハウそのものなんですね。

ついでに、身の回りのマシンで同じ処理のベンチマークをScript Geek 2.0を用いて行ないました。処理内容は、おおよそCocoaの機能を使わないほうが速そうな、小さなデータの判定処理です。

Machine MacBookPro10,1 MacBookPro9,1 MacBookAir4,1 Macmini7,1
メインマシン。10.14以上に上げない環境 Beta版OS専用 持ち歩き用。検証環境 検証環境
CPU Core i7 2.6GHz Core i7 2.7GHz Core i5 1.6GHz Core i5 2.6GHz
CPU Core 4.0 4.0 2.0 2.0
RAM 8GB 8GB 4GB 16GB
OS 10.14.6 10.15.1beta 10.13.6 10.15
Storage SSD HDD SSD Fusion Drive
1st Script 0.115 0.138 0.182 0.086
2nd Script 0.608 14.179 1.589 13.798

以前に、花文字作成Scriptでメイン環境のMacBook Pro Retina 2012が、最近加入した検証用マシンMac mini 2014の10倍以上高速だったことがあって、しかもデータ的にはメモリ上で十分に終わってしまいそうな内容であったために、その理由がわからないままでした。

そこで、こうして手元のマシンをすべてかき集めて、Script Geekでベンチマークを行なった次第です。

その結果、

 (1)HDD搭載マシンがSSD搭載マシンの10倍程度の処理時間になっている。メモリ搭載量とか関係なくHDD搭載機だと遅い。Fusion Driveでも同様
 (2)コア数は少ないよりも多いほうがよいが、デュアルコア程度だとCocoaの機能を利用するのに不利。最低でもクアッドコアは必要
 (3)メモリは少ないよりも多いほうがよいが、それよりもブートドライブがSSDであること、CPUコア数が4コア以上であることが重要

といったことがわかりました。SSD搭載機でないマシンというのは現行のラインナップの中にも少なくなっていますが、HDD搭載のMac miniというのはプログラムの実行専用の機械としては割とありふれていますし、Fusion Drive搭載のiMacも同様でしょう。これらHDD搭載機だと場合によってはかるーく10倍ぐらい遅くなるということに留意すべきでしょう。

もちろん、ファイルI/Oを多用するScriptについてはSSDや、場合によってはRAM Diskを使うことが望ましいわけで、これぐらい処理データが小さいプログラムでも顕著な差が見られたことがポイントです。

AppleScriptで実際の処理を行なってみると、最新のマシンだからといって速くなっていないというか、むしろそんなに速くないとか、最上位機種のはずのiMac Proでも処理内容によっては2012年のMacBook Proの方が高速だったりと(これにはおどろいた)、機械ごとに得手・不得手があるというか、性能差というものが値段や年式に単純に比例しているわけではないことを痛感するものです(2013年以降、2018年ぐらいまでIntel CPUの製造プロセスは変わってないし、2018年ぐらいまでIPCが大幅に改善されたという話も聞きません)。

開発機としてしばらくMacBook Pro 13インチの2017年モデルを使っていましたが、正直MacBook Pro Retina 2012と比べてCPU自体の処理性能は同じか、むしろ遅いぐらいでした(バッテリーはアホみたいにもちましたが)。

ただ、メインメモリ8GBだとAdobeのCreative Cloudアプリケーションで足切りが行われており(最低16GB、実用上は32GBあたり?)、そろそろメイン環境は交代したいところです。

AppleScript名:script1
set aStr to "1111"
set aRes1 to chkEachDigitIsNotSameChar(aStr as string) of me
–> false

set aStr to "1234"
set aRes1 to chkEachDigitIsNotSameChar(aStr as string) of me
–> true

on chkEachDigitIsNotSameChar(aStr as string)
  set aLen to length of aStr
  
set aList to characters of aStr
  
  
set bList to {}
  
repeat with i in aList
    set j to contents of i
    
if j is not in bList then
      set the end of bList to j
    else
      return false
    end if
  end repeat
  
return true
end chkEachDigitIsNotSameChar

★Click Here to Open This Script 

AppleScript名:script2
— Created 2017-12-17 by Takaaki Naganoya
— 2017 Piyomaru Software
use AppleScript version "2.4"
use scripting additions
use framework "Foundation"

set aStr to "1111"
set aRes1 to chkEachDigitIsNotSameChar(aStr as string) of me
–> false

set aStr to "1234"
set aRes1 to chkEachDigitIsNotSameChar(aStr as string) of me
–> true

on chkEachDigitIsNotSameChar(aStr as string)
  set aList to characters of aStr
  
set aLen to length of aList
  
  
set aSet to current application’s NSCountedSet’s alloc()’s initWithArray:aList
  
set bList to (aSet’s allObjects()) as list
  
set bLen to length of bList
  
  
return (aLen = bLen)
end chkEachDigitIsNotSameChar

★Click Here to Open This Script 

Posted in Tools | Tagged 10.12savvy 10.13savvy 10.14savvy 10.15savvy Script Geek | Leave a comment

display text fields script Library v1.1

Posted on 10月 21, 2019 by Takaaki Naganoya

ちょっとしたデータをText Fieldの組み合わせでアラートダイアログ上に表示するUser Interfaceを提供するAppleScriptライブラリです。

–> Download displayTextFields_v11.scptd (To ~/Library/Script Libraries/)

本ライブラリは、あまり考えずにデータ内容を表示してユーザーへの確認を行うことが目的でした。実際に使ってみると、フィールド内容を微修正するような用途にも使いたいというニーズがPiyomaru Software内で出てきました。

従来の「display text fields」は単なる表示用(フィールド内容編集不可)、新規追加した「confirm text fields」コマンドではダイアログに表示したデータのユーザーによる編集が可能で、編集したデータ内容をリストで返します(キャンセルボタンのクリック時にはfalseが返る)。データの表示と微修正に便利だと思います。

もちろん、Piyomaru Software製のScript Libraryの共通仕様でAppleScript用語辞書そのものにサンプルAppleScriptを収録しているため、すぐに動かせます。

ただ、コマンドの説明文がグダグダで、いまいち英語の内容として意味が取りにくいような、、、、

AppleScript名:sample script2
—
–  Created by: Takaaki Naganoya
–  Created on: 2019/10/05
—
–  Copyright © 2019 Piyomaru Software, All Rights Reserved
—
use AppleScript version "2.5"
use scripting additions
use framework "Foundation"
use tfLib : script "display text fields"

set vRes1 to (confirm text fields main message "Zip archive Result" sub message "Edit this data to proc." key list {"scpt", "scptd", "applescript"} value list {98, 16, 3})
–> {"980", "160", "30"}

★Click Here to Open This Script 

Posted in dialog GUI Script Libraries | Tagged 10.12savvy 10.13savvy 10.14savvy 10.15savvy | Leave a comment

CotEditor PowerPackでボツにしたScript

Posted on 10月 21, 2019 by Takaaki Naganoya

ぴよまるソフトウェアの宣伝のために配布しているCotEditor PowerPackですが、アプリケーションに現代のAppleScriptのパワーを足すとヤバいことがいろいろできるという実例になっています。

ただし、「アプリケーション内蔵メニューから呼び出す」Scriptにはセキュリティ上の制約やアプリケーション側のポリシーによる制約が大きく、いろいろボツにしたものがあります。

一部のライブラリは呼べない

一応、CotEditor内蔵のScript Menuからバンドル形式のScriptは呼べるのものの、Script Libraryを入れて呼ぶようなことはできません。そのため、Windowの回転Scriptなどはライブラリの三角関数を呼び出していたため、その部分だけ切り出してScript内からサブルーチンとして呼び出せるようにしておきました。地図表示のScript(ぴよまるソフトウェアの最寄駅表示)も、本来はchoose locationライブラリを用いていたものを、ライブラリ化しないでScript内に展開(内容をコピペ)しました。

外部Frameworkを呼び出すものは呼べない

アプレット形式(.app)のScriptの呼び出しが許可されていない(CotEditor側のポリシーの問題)ため、サードパーティのプログラムをCocoa Frameworkとしてビルドした外部Frameworkをバンドル内に入れて呼び出すことができません。この制約は割ときつくて、たいへんよく利用するBridgePlus Script LibraryのようにFrameworkをバンドル内に含むライブラリも呼べません。そのため、BridgePlusに依存している処理をAppleScriptのみで処理できるルーチンに差し替えたりしました(2次元配列のソートなど)。

辞書.appの辞書で慣用句をキーワード検索するなどのScriptや、HTMLを解析してデータを取り出すScriptは強力で役に立つのですが、Applet(.app)形式のScriptの実行が許可されないかぎりCotEditorのScript Menuからは呼べません。

Safari上の表オブジェクトをCSV化してCotEditor上に展開するScriptなどはたいへん実用性もあり、いいと思うものの、HTMLReader.frameworkなしには実現できないので、ボツになりました(個人的には使っています)。

ただし、Frameworkを含んだAppletも、OS標準装備のScript Menu側からは呼べるので、別途そういうものを企画してみてもよいのかもしれません。

REST APIを呼び出すものは配布しにくい

これは、技術的な問題ではなく運用上の問題なのですが……REST APIを呼び出すようなものは収録を見送りました。たいていのREST APIは呼び出し用のキーが必要なわけですが、それをどーやって各ユーザーに取得してもらって、かつプログラムの中に記入してもらうかなど、説明し切れない(もうちょっとスマートに利用できないと説明がつらい)と判断して割愛しました。

文字コード関連のものはボツ

文字コードがらみのものは難しいものがあります。1つは、選択中の文字列の16進ダンプScript。UnicodeのNormalizeの方式の違いにより㍿などの文字のデータの持ちかたが変わってくるので、個人的にはたまに使っていますが、CotEditorの文字コードまわりの命令が動いていないので(GUI側からは機能している)そのあたりをつつきたくなかったということはあります。あと、闇が深そうですし。

仕様を決めにくいものはボツ

「こういうのがあったらデモとしても面白い」と、思ったものはいくつかありましたが、技術的に可能であっても、仕様を決めにくいものや公開しにくいものについてはボツにしました。

たとえば、選択中の文字を画像化してAirDropで近隣のマシンに転送するScriptを企画してみたのですが、文字数に応じてフォントサイズを可変とするなど、いろいろ実現のためのアイデアは持っていました。とはいえ、実際に作ろうとすると「ちょっとしたデモ」の範疇を超えるぐらいの手間がかかるため、ボツにしました。

opensslで選択中のテキストを暗号化するScriptも、かなり昔から使っているものがあるので、実用性で考えるとあったほうがいいものです。ですが、実際にPiyomaru Softwareのアプリケーション内部で利用しているものなので、そのものを単体で配布することはためらわれたため、ボツにしました。

普段使っていないアプリケーション(Google ChromeとかPowerPointとか)をコントロールするものも割愛しました。作ろうと思えば作れるものの、何か問題が起きて書き換えたほうがいいという話になっても、日常的にいじくっていないと問題点が把握しにくいところです(Keynote v9.1で表オブジェクトの作成に問題があるバグとか、日常的に使っていないと見つかりません)。

Posted in Release | Tagged CotEditor | Leave a comment

Post navigation

  • Older posts
  • Newer posts

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

Google Search

Popular posts

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

Tags

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

カテゴリー

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

アーカイブ

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

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

メタ情報

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

Forum Posts

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

メタ情報

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