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

PowerPoint書類の各スライドのタイトルを取得

Posted on 8月 3, 2023 by Takaaki Naganoya

PowerPoint書類(presentation)の各スライドのタイトルを取得するAppleScriptです。

正確にいえば、タイトルを取得するかもしれないAppleScriptです。本Scriptの実行時にはPowerPointで何らかのPPTX書類をオープンしていることを期待しています。

PowerPointをこづき回してみると、各スライドのタイトルを保持しているプロパティとかいったものが「ない」ことに気づきます。

ではどうやって取り出すかといえば、

(1)slideのplace holderを取得する
(2)place holder内にtext frameが存在しているかを確認
(3)text frameが存在している場合には、内部にアクセスして文字を取り出す

という手順になるようです。

ただし、place holderにアクセスする都合上、

スライドのレイアウトの種類によってはplace holderが存在していないものもあるため、place holderの存在確認から行うべきかもしれません。

また、slide内に複数のplace holderが存在する場合に、どれがtitleに該当するのかを調べる必要があるとか(座標とか、文字サイズとかを頼りに推測)、いろいろと処理が破綻しそうな「例外条件」が多数存在していそうです。

AppleScript名:各slideのタイトル文字列を取得 v2.scpt
—
–  Created by: Takaaki Naganoya
–  Created on: 2023/08/03
—
–  Copyright © 2023 Piyomaru Software, All Rights Reserved
—

set tList to getEveryPPTSlideTItles() of me
–> {"Title", "1章", "Slide1", "Slide2", "2章", "Slide3", "Slide4"}

on getEveryPPTSlideTItles()
  set tList to {}
  
  
tell application "Microsoft PowerPoint"
    tell active presentation
      set sList to every slide
      
      
repeat with i in sList
        set j to contents of i
        
        
tell j
          
          
set plaList to every place holder
          
set aPla to contents of first item of plaList
          
set hText to (has text of text frame of aPla) as boolean
          
          
if hText = true then
            set hTextR to (content of text range of text frame of aPla) as string
          else
            set hTextR to ""
          end if
          
        end tell
        
        
set the end of tList to hTextR
      end repeat
      
      
return tList
      
    end tell
  end tell
end getEveryPPTSlideTItles

★Click Here to Open This Script 

Posted in Object control | Tagged 13.0savvy PowerPoint | Leave a comment

PowerPointが扱うファイルパス形式が支離滅裂な件

Posted on 8月 2, 2023 by Takaaki Naganoya

いろいろ調べてみたら、PowerPointが扱うファイルパス形式に整合性がまったくないことがわかりました。なんなんでしょう、これは。

ファイルのオープン時:alias(HFS path)

これは、とくに問題はありません。最低限のラインはクリアしているといってよいでしょう。

PDF書き出し時:HFS pathのテキスト

fileオブジェクトではなくHFS pathの文字列です。ここでかなり「おかしなプログラムだな」という感想を抱きます。こんなおかしなデータを要求するのはPowerPointぐらいだと思いますよ?

PPTX書類の新規保存時:HFS pathのテキスト

PDF書き出しもPPTX書類の保存も、同じく「save」コマンドで行うので、仕様が同じなのも納得ですが、通常書類のsaveにこれでは相当変わった仕様にしか見えません。

書類のフルパス情報:POSIX path

これは、致命的におかしな挙動であり、呆れるほどおかしな仕様です。担当者が正気なのか疑わしいレベルです。Office 2011のPowerPointでpresentation(書類)のfull name(フルパス情報)を取得してみたところ、HFS path文字列が返ってきたという調査結果が残っていました。

いま、バージョン16.75のPowerPointのpresentation(書類)のfull name(フルパス情報)を取得すると、POSIX pathが返ってきます。


▲Office 2011のPowerPointのパス情報の記述


▲バージョン16.75のPowerPointのパス情報の記述

AppleScript用語辞書上の記載内容にはたいして変化はないのですが、こんな頭のおかしな状態になっているとは思いませんでした。正直、PowerPointで何かまとまった処理を行おうとは思ったことが(それほど)なかったのですが、Keynoteで山のようにいろいろ強烈なScriptを書いているので、PowerPointでもいろいろできるのでは? と、冗談半分で試してこの通りです。

まさか、ExcelとWordもこの調子なのでは?(^ー^;

AppleScript名:オープン中の最前面のPowerPoint書類のフルパスの文字列を取得.scpt
set a to getPPTpath() of me
–> "Cherry:Users:me:Documents:2013-MacUDingCFUD.ppt"–Office 2011
–> "/Users/me/Documents/AppleScript 13/PowerPoint/TESTプレゼンテーション1 .pptx"–Office 2019

–オープン中の最前面のPowerPoint書類のフルパスの文字列を取得
on getPPTpath()
  tell application "Microsoft PowerPoint"
    set pCount to count every presentation
    
if pCount = 0 then return false
    
tell active presentation
      –Documentのフルパスを取得する
      
set aPath to full name
      
return aPath
    end tell
  end tell
end getPPTpath

★Click Here to Open This Script 

PowerPointの書類からTOCつきのPDFを書き出すAppleScriptを書いた際には、頭のおかしなPowerPoint 16.75が返してくるパス形式をサブルーチン側で吸収して処理するようにしました。ただ、将来的にこの頭のおかしな形式からまともな形式に戻してきたときに問題が発生するので、再変更に備えてもう少し準備しておいたほうがよいのかもしれません。

このPowerPointの担当者は、頭がおかしいです。

AppleScript名:オープン中のPowerPoint書類のパスをalias形式で取得.scpt
set pptPath to getPPTpath() of me
–> alias "Macintosh HD:Users:me:Documents:AppleScript 13:PowerPoint:TESTプレゼンテーション1 (Sectionなし).pptx"

–オープン中の最前面のPowerPoint書類のフルパスの文字列を取得
on getPPTpath()
  tell application "Microsoft PowerPoint"
    set pCount to count every presentation
    
if pCount = 0 then return false
    
    
tell active presentation
      –Documentのフルパスを取得する
      
set aPath to full name
    end tell
  end tell
  
  
set aFile to POSIX file aPath
  
set anAlias to aFile as alias
  
return anAlias
end getPPTpath

★Click Here to Open This Script 

Posted in File path Object control | Tagged 13.0savvy PowerPoint | Leave a comment

PowerPointのスライドから各種情報を取得

Posted on 8月 2, 2023 by Takaaki Naganoya

KeynoteからPDF書き出しを行う際に、デフォルトの機能ではTOCも何もついていないのですが、AppleScriptからあらゆる手段を講じてTOCつきで書き出せるようにしています(新刊「Keynote Scripting Book with AppleScript」に掲載)。

一方、PowerPointではどうかといえば、sectionを作成し章構成を分けて、スライドを章ごとに折りたためるようになっています。PDF書き出し時にこのsectionが反映されるということはまったくなく、sectionを追加しようが書き出されたPDFはそのままです。

このsection内のインデント情報が取得できれば、それを元にTOCを作ってもよいのですが、残念ながらインデント情報は取り出せないようです。

ただ、処理に必要な最低限の情報が取れるので、Keynoteと同レベルのTOCつきPDFをAppleScriptで合成することは可能と思われます。

AppleScript名:各スライドから情報を取得.scpt
tell application "Microsoft PowerPoint"
  tell active presentation
    set sList to every slide
    
    
repeat with i in sList
      set j to contents of i
      
tell j
        set sInd to section index
        
set sNum to section number
        
set myLayout to layout as string
        
log {sInd, sNum, myLayout}
      end tell
    end repeat
  end tell
end tell

★Click Here to Open This Script 

各スライドのタイトルを取得しようとしたら、素直に取得できず……かといって取れなさそうでもないので、いろいろ調べてみたら、どうやら取得できたようです。

AppleScript名:各slideのタイトル文字列を取得.scpt
tell application "Microsoft PowerPoint"
  tell active presentation
    set sList to every slide
    
    
repeat with i in sList
      set j to contents of i
      
tell j
        set sInd to section index
        
set sNum to section number
        
set myLayout to layout as string
        
log {sInd, sNum, myLayout}
        
        
set plaList to every place holder
        
set aPla to contents of first item of plaList
        
set hText to (has text of text frame of aPla) as boolean
        
log hText
        
        
if hText = true then
          set hTextR to (content of text range of text frame of aPla) as string
          
log hTextR
        end if
      end tell
    end repeat
  end tell
end tell

★Click Here to Open This Script 

Posted in Object control | Tagged 13.0savvy PowerPoint | Leave a comment

新発売:Keynote Scripting Book with AppleScript

Posted on 7月 29, 2023 by Takaaki Naganoya

Piymaru Softwareによる電子書籍の82冊目、「Keynote Scripting Book with AppleScript」を発売しました。PDF 434ページ+サンプルScript Zipアーカイブで構成されています。macOS標準装備のScript Menuに入れてKeynoteをコントロールするメニューScript集も添付しています。

→ 販売ページ



初級、中級、上級のScripting解説内容に加え、大量かつ強力なAppleScriptサンプルを掲載しています。これは、実際に筆者が自分のマシンにインストールして使っているものと同じものです。

実用編

 付録Script Menuスクリプトのインストール
 Script Menuスクリプトのインストール①
 Script Menuスクリプトのインストール②

TOCつきでPDF書き出し
 最前面の書類をTOCつきPDF出力①
 最前面の書類をTOCつきPDF出力②
 最前面の書類をTOCつきPDF出力③
 すべてデスクトップ上にPDF出力

クリップボードに入れたものを処理
 指定色でモノクロ化してクリップボードへ
 赤でモノクロ化してクリップボードへ
 水色でモノクロ化してクリップボードへ
 グリーンでモノクロ化してクリップボードへ
 マゼンタでモノクロ化してクリップボードへ

自動スライドめくり
 冒頭から末尾まで自動スライドめくり

表を処理
 表オブジェクトの重なり合い(2つ以上対応)を検出
 AppleScript Recordから表を作成
 選択中のセルの文字列長さを一覧表で表示
 全スライドの表で行番号入り表の連番修正
 現在のスライド上にある選択中の表のカラム幅を自動調整
 現在のスライド上にあるすべての表のカラム幅を自動調整
 選択中のページのオリジナル表のセル幅に以降の表のセル幅を統一
 選択中のページの表1のセル幅に以降の表のセル幅を統一
 現在のスライド上にあるすべての表のカラム幅を自動調整
 マル付き数字のインクリメント(+1)
 マル付き数字のデクリメント(ー1)
 マル付き数字のリナンバー

現在のスライドからテキストアイテムを色で選択
 x色系のみ選択

選択中の最前面の書類に対する処理
 連続する同一タイトルに子番号を振る
 スライド末尾にQRコードを追加

選択中の画像へのぼかしフィルタ処理
 選択中の画像にぼかし処理

選択中の各種オブジェクトへの処理
 オブジェクトの重なり合い(2つペア)を検出してグループ化
 テキストを座標値でソートしてまとめてクリップボードへ
 横幅を均等に変更
 数える
 選択中のオブジェクトのうちテキストだけ残す

現在表示中のスライドに対する処理
 テキストを上から順に連結してクリップボードに転送
 指定した文字で囲まれたキーワードの色を置換する
 PDFに書き出してオープン

選択中のテキストアイテムの処理
 AppleScriptとみなして、構文確認してスタイル付きテキストとして書き戻す
 AppleScriptとみなして、構文確認してスタイル付きテキストとして書き戻す(結果つき)
 それぞれ個別のAS書類として保存する
 まとめて1つのAS書類として保存する
 テキストアイテム中のURLにリンクを張って
 HTMLタグを外す
 文字の実際の幅でリサイズ
 文字の実際の幅と高さでリサイズ

選択中のスライドの処理
 すべての表の文字色を黒にする
 タイトルをまとめてクリップボードに入れる
 現在のスライド以降の同じスライドレイアウト(同階層の)スライドのタイトルを取得してクリップボードへ
 現在のスライド以降の同じスライドレイアウト(同階層)のスライドのタイトルを取得して改行でまとめてクリップボードへ(末端レベルではないものが対象)
 選択中のスライドのグループアイテムをグループ解除
 選択中のスライド中の各テキストアイテムのうち指定フォントサイズのものの色を変更
 不透明度が100でないオブジェクトの透明度を解除
 選択スライド枚数を数える
 選択中のスライドのshapeのうち最も右上にあるものの座標を右上角に変更

目次作成
 クリップボードへ転送
 Numbersの表を作成

カレンダー作成
 指定月の日曜日はじまりカレンダーを表で作成

オブジェクトの詰め込み
 指定範囲にスライド上のオブジェクトを詰め込み①
 指定範囲にスライド上のオブジェクトを詰め込み②

2ページ間(現在、次)のオブジェクト整頓
オブジェクトの位置をそろえる

没スライドに対する処理
 現在の書類と同じ階層に没スライド入れを作成

Posted in Books news | Leave a comment

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

Posted on 7月 29, 2023 by Takaaki Naganoya

指定画像をbase64でエンコードしたのちに、デコードして画像に戻すAppleScriptです。

base64文字列からのデコードだけをテストしたかったのですが、テストのために本来は不要な画像のエンコード部分を付け足しています。

macOS 13.5上で動作確認していますが、OSのバージョンやAppleScriptのバージョンに依存はしないことでしょう。

AppleScript名:指定画像をbase64エンコード文字列に変換→デコード.scptd
—
–  Created by: Takaaki Naganoya
–  Created on: 2023/07/29
—
–  Copyright © 2023 Piyomaru Software, All Rights Reserved
—
property NSData : a reference to current application’s NSData
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.8" — macOS 12 or later
use framework "Foundation"
use scripting additions

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

set aImage to decodeImageFromBase64String(aStr) of me
–> (NSImage)

–Base64 Decode
on decodeImageFromBase64String(aString)
  set restoreData to NSData’s alloc()’s initWithBase64EncodedString:aString options:0
  
set restoreImage to NSImage’s alloc()’s initWithData:restoreData
  
return restoreImage
end decodeImageFromBase64String

–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 12.0savvy 13.0savvy | Leave a comment

PowerPointで最前面の書類をPDF書き出し

Posted on 7月 29, 2023 by Takaaki Naganoya

よくある、Microsoft PowerPointで、オープン中の最前面の書類を指定のパスにPDFで書き出すAppleScriptです。M1 Mac mini+macOS 13.5上で動作するMicrosoft PowerPointバージョン16.75で確認しています。

スクリプトエディタ上で動かしてみましたが、デスクトップ上にファイルを書き込もうとしたときに、初回のみPowerPointがデスクトップフォルダにアクセスしてよいか、OSが確認ダイアログを表示してきました。こういう動作はScriptからのコントロール時には困ります。自動処理を行う前にクリアしておきたい(あらかじめダイアログ表示+認証を済ませておきたい)ところです。


▲PowerPointから書き出したPDF

Microsoft PowerPointのAppleScript用語辞書を確認してみたところ、「export」コマンドが存在しません。情報をいろいろ調べてみたところ「save as PDF」で指定パスにPDFを保存するようです。

さらに、こうした場合にsaveコマンドで指定するファイルパスは、fileオブジェクトで指し示しますが、PowerPointでは少々事情が異なるようでした。fileを指定すると、書き出されません。HFS形式のパスをテキストで指定する必要がありました。どうもこのあたり、ところどころバグめいた実装が散見されます。

Excelへの画像貼り込みScriptのように、POSIX pathでPDF書き出し先を指定してみましたが、こちらはPOSIX pathで指定しても書き出せませんでした。

AppleScript名:最前面の書類をPDF書き出し.scpt
set theOutputPath to ((path to desktop folder) as string) & (do shell script "uuidgen") & ".pdf"

tell application "Microsoft PowerPoint"
  tell active presentation
    save in theOutputPath as save as PDF
    
–保存先のファイルパスを文字列で指定する必要がある
    
–fileオブジェクトで指定すると書き出されない(バグのような挙動)
  end tell
end tell

★Click Here to Open This Script 

Posted in file File path PDF | Tagged 13.0savvy PowerPoint | Leave a comment

出るか?「AppleScript最新リファレンス」のバージョン2.8対応版

Posted on 6月 15, 2023 by Takaaki Naganoya

Piyomaru Softwareの電子書籍も、いまでは80冊ほど出していますが、最初のきっかけは「AppleScript最新リファレンス」という名前の薄い本(500ページぐらい)でした。


▲計画段階の「AppleScript最新リファレンス」。ここから、実際に書けない記事をふるい落とすという「妥協」が…….

その後、何回かアップデート計画が浮上しては、あまりの分量の多さの前に挫折。ゼロから書くよりも、アップデートする作業の方が実は大変です。

「AppleScript最新リファレンス」はいわば何でもありの「大辞典」に相当するものです。「これでは更新し切れないねー」とあきらめて、小さなテーマごとに最新情報を集めて各種電子書籍を書くという「小辞典」「中辞典」方式を展開。

項目数の少ない「小辞典」「中辞典」で情報のリストアップと更新を行い、その結果を「大辞典」に反映させるというやりかたです。

ここに来て、ようやく更新できるんじゃないか?(仮説)という雰囲気になってきたため、更新をすすめています。まえがきとあとがきを書き、その他のコンセプトに関わるページを書いてみて「いけそうかも」という手応えを得ています(挫折する可能性はあるかも)。

「AppleScript最新リファレンス」はMacDownとPages(扉ページや凝ったレイアウトが必要なページだけ)を用いて作成したのですが、記述環境としてのMacDownがあまりにも使えないので、MarkdownのページはPagesで作り直しています。

最新版のmacOSが動くマシンが手元にM1 Mac miniの1台しかないので、これにBeta版のmacOS 14などを入れてしまった日にはスクリーンショットが撮れません。正確に言えば、スクリーンショットを撮っても使えません(禁止事項)。

なので、外付けSSDへのベータ版のmacOSのインストールは必須なのですが、macOS 13の際に「リリース後には、外付けSSDからの複数バージョンのOSのインストールや起動を禁止する」というジャイアン風味たっぷりなAppleの対応。さらに、β版のmacOSよりもRelease版のmacOSの方がバグだらけで(OS X 10.13、10.15にひきつづき3回目)、macOS 14についてもβプログラムの存在意義について疑問視しています。

とにかく、macOS 14についてはβ版をガン無視して「AppleScript最新リファレンス」のアップデートを行うべき、という判断です。

Claris FileMaker Pro 2023と、Microsoft Officeの最新版については、AppleScript記述方法に関する記事は掲載したいところです(Developer Program入ってるし、Office 365の契約しているし)。Adobe Creative Cloudについては契約していないので、このあたりの話は書けません。

AppleScriptコマンドリファレンスについては、各種書籍用にアップデートしながらメンテナンスしているので、これは最新版を掲載できることでしょう。エラーコード表も然りです。

全体的に、Script Sampleを掲載しまくるような本ではなく、それぞれの項目について「最新環境ではどうなっているのか」という情報を提供する書籍になることでしょう。

そして、挫折しなければv2.8対応版を出せることでしょう。

→ AppleScript最新リファレンス v2.8対応(日本語版)
→ AppleScript The Latest Reference for v2.8 (1) (English Version)

Posted in Books news | Tagged 13.0savvy | 1 Comment

Pixelmator Proで2つの書類のレイヤー表示状態をシンクロ

Posted on 6月 6, 2023 by Takaaki Naganoya

Pixelmator Pro上でオープン中の2つの書類のレイヤー表示状態をシンクロさせるAppleScriptです。

ちょうど、「ゆっくりAppleScript解説」の続刊を作成中で、レイヤー別に部品が分かれている書類(すべてのレイヤー名は同じ)の表情を「同じ状態」にするのが面倒です。

正直なところ、表情名を入力すると該当するレイヤーを表示状態にしてほしいぐらいです。

そこまで行かないにせよ、1つの書類に対して行ったレイヤー表示操作を、もう一度別の書類に対して行わなくてはならないのは大変です(2つの書類を統合して、キャラクター別の差異をレイヤーで吸収するという手もありますが、、、)。

そこで、2つの書類をオープンしておき、最前面の書類のレイヤー表示状態(=表情の操作)を他方の書類に反映させるAppleScriptを書いてみました。

Pixelmator Proバージョン3.3.6に対してレイヤーの取得を指令してみましたが、なかなか大変です。再帰処理で一番上から末端まで、表示状態になっているレイヤーだけを抽出できるかと考えていたのですが、そうもいきません。

再帰処理がダメなので、もうレイヤー名を決め打ちで指定するようにして(つまり、この用途以外には使えないものと割り切って)、各レイヤーグループ内を走査するように記述しました。

AppleScript名:同一名、同一構造の2つの書類のレイヤー表示状況をシンクロ.scpt
—
–  Created by: Takaaki Naganoya
–  Created on: 2023/06/06
—
–  Copyright © 2023 Piyomaru Software, All Rights Reserved
—

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

tell application "Pixelmator Pro"
  set allD to {}
  
  
set dList to name of every document
  
–> {"ゆっくり素材れいむ.pxd", "ゆっくり素材まりさ.pxd"}
  
  
tell front document
    set d1Name to name of it
    
if d1Name contains "れいむ" then
      set d2Name to retAnItemByCond(dList, "れいむ") of me
    else
      set d2Name to retAnItemByCond(dList, "まりさ") of me
    end if
    
    
tell layer "root"
      tell layer "顔"
        set dList to every layer
        
repeat with i in dList
          set j to contents of i
          
tell j
            set ddList to (name of every layer whose visible is true)
            
if ddList is not equal to {} then
              set aCon to contents of first item of ddList
              
set the end of allD to {"root", "顔", name of j, aCon}
            end if
          end tell
        end repeat
      end tell
    end tell
  end tell
  
  
tell document d2Name
    repeat with i in allD
      copy i to {L1, L2, L3, L4}
      
tell layer L3 of layer L2 of layer L1
        set tmpL to name of every layer
        
repeat with ii in tmpL
          set jj to contents of ii
          
tell layer jj
            if jj = L4 then
              set visible to true
            else
              set visible to false
            end if
          end tell
        end repeat
      end tell
    end repeat
  end tell
end tell

on retAnItemByCond(aList, aParam)
  repeat with i in aList
    set j to contents of i
    
    
if j does not contain aParam then
      return j
    end if
  end repeat
end retAnItemByCond

★Click Here to Open This Script 

Posted in Image | Tagged 11.0savvy 12.0savvy 13.0savvy Pixelmator Pro | Leave a comment

macOS 14, Sonoma

Posted on 6月 6, 2023 by Takaaki Naganoya

WWDC23でmacOS 14, Sonomaが発表されたとのことで、WWDCのビデオを見たかぎりではさほどmacOS 13から変わっていないように見えます。

とにかく、Beta段階では安定して動いていたものが、Release時に崩壊してしばらくまともに動かず、1年のうちでまともに安定して使える時期が短いとかいう冗談は勘弁してほしいところです。

日本語入力IMがメモリをバカ喰いして固まるとか、メールをScriptから操作すると表示用プロセスが2つずつ生成されて解放されなくてメモリが埋まってほぼ動かなくなるとか、Finder上の基礎的な操作が効かないとか、macOS 13は悪い冗談のオンパレード。

BetaよりもReleaseのほうが低品質というのでは、Beta Programの位置付けがよくわかりません。

Posted in news | Tagged 14.0savvy | Leave a comment

Claris FileMaker 2023がリリースされる

Posted on 5月 23, 2023 by Takaaki Naganoya

日本国内においても、Claris FileMaker 2023および前バージョンのClaris FileMaker v19.xからのアップデータがリリースされました。「2023」と銘打っているからには、翌年には「2024」が出てくることが期待されるわけで……販売戦略的なものがいろいろ変更されることがうかがわれます。

商標その他で記述すべき名称は変わっていますが、macOS上でのプロセス名としては「FileMaker Pro」であることに変更はありません。Clarisの(技術サポート系の)Web上の表記は「FileMaker Pro 20.1」となっているようです。

なお、macOS上でのバンドルIDは「com.filemaker.client.pro12」のままで変更されていません。

アプリケーションのアイコンは変更されています。

まだ確認中ではありますが、AppleScript用語辞書も前バージョンから変更なく、書籍のアップデートもとくに行わなくてもよさそうな雰囲気であります(アイコンと画面スナップショットの都合で差し替えるか別の本にする必要があるかもしれません)。

「Claris FileMaker 2023」が製品シリーズを包括する名称で、macOS上で動作するクライアントソフトウェアについては「Claris FileMaker Pro 2023」であると認識しています。

Claris FileMaker Pro 2023がサポートするOSは、macOS 12と13。Windows 10(22H2、64bitのみ)、Windows 11(22H2、64bitのみ)。

FileMaker GoはiOS 16/iPadOS 16が動作するデバイスが稼働対象です。

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

指定のアプリケーションの実行アーキテクチャを変更

Posted on 5月 3, 2023 by Takaaki Naganoya

指定のアプリケーションの実行アーキテクチャを変更するAppleScriptです。

–> Download setArchLib.scptd

Apple Silicon Mac上でアプリケーションをRosetta 2によってIntel 64バイナリのARMエミュレーション動作を行うかどうかは、Finder上の「Rosettaを利用して開く」のチェックボックスによって制御されています。

これを、外側(FinderのGUI)から操作するか、内側(何らかのOS内のサービスやメタデータ)から操作するかによって、その「やりかた」は大きく異なります。

自分は、できることなら極力GUI Scriptingを使いたくない派なので、「そういえばASからこのあたりの設定をいじくった記憶がない」と思いつつ、「内側から操作する方法はないものか」と考えていました。

さっそくGithub上でいろいろ調査してみたところ、LaunchServiceのプライベートAPIに「_LSSetArchitecturePreferenceForApplicationURL」というものがあって、これを呼ぶことで処理を実現できそうだということが判明。

処理内容は、アゴが外れそうなほど簡単なので、AppleScript(AppleScriptObjC)でも普通に書けそうな勢いでしたが、アンダースコアで始まるAPIはAppleScriptにBridgeしにくく、もともとのプロジェクトのもの(UNIXのコマンドラインから呼び出す「SetArchPrefForURL」プロジェクト)をビルドしたバイナリをScriptバンドル内に入れて、呼び出すようにしてみました。

Cocoa Frameworkのプロジェクトを作成して、AppleScriptから普通にPOSIX pathとCPUアーキテクチャを渡せば結果をbooleanで返してくるようなスタイルに書き換えようとして、途中で頓挫してしまいました。そんなに気合いを入れる内容でもないので、こんなものでいいんでしょう。

AppleScript名:setArchLib.scptd
—
–  Created by: Takaaki Naganoya
–  Created on: 2023/05/03
—
–  Copyright © 2023 Piyomaru Software, All Rights Reserved
—
use AppleScript version "2.4" — Yosemite (10.10) or later
use framework "Foundation"
use scripting additions

set appPath to choose file of type {"com.apple.application-bundle"}
–set archStr to "x86_64"
set archStr to "arm64"

set archRes to setArchForApp(appPath, archStr as string) of me

on setArchForApp(appPath, archStr as string)
  if archStr is not in {"x86_64", "arm64"} then error "Invalid architecture"
  
  
set exePath to POSIX path of (path to resource "SetArchPrefForURL")
  
set sRes to do shell script (quoted form of exePath) & " " & (quoted form of POSIX path of appPath) & " " & archStr
  
return (sRes = "") as boolean
end setArchForApp

★Click Here to Open This Script 

Posted in file System | Tagged 11.0savvy 12.0savvy 13.0savvy | Leave a comment

画像をExcelのワークシート上に配置

Posted on 4月 4, 2023 by Takaaki Naganoya

Microsoft 365のExcel v16.71、Windows版とmacOS版のソースコードが共通化されたというふれ込みではあるものの、実はけっこうフォーム部分が違うし、VBのマクロエディタで日本語が記入できないとか、互換性のない関数(Mac上で動作しないENCODEURL、Switch,IFS、FILTERXML、WEBSERVICEなどの関数)の存在など、いろいろ勘弁してほしい出来です。

しばらくはNumbersだけで用が済んでいたのですが、ここのところWindows版のExcelの講座なども行っていたので、併せてmacOS版のExcelについても追加調査。細かい点のチェックを行っていました。

そんなExcelでアドインのオンラインストアからQRコード作成用アドインを探してみたところ、フリーなものは存在していないようです。

Cocoaの機能を利用すれば、割とすぐにできてしまう程度のQRコード。わざわざアドインの力を利用する必要などなかったのです。AppleScriptでQRコードを生成して、Excelのワークシートに差し込めばよいだけです。

ところが、ひさしぶりにExcelのScriptを引っ張り出してきて、昔書いた「Excelに指定の画像を配置する」Scriptを実行してみたところ、エラーで動きません。

ワークシート上にshapeを作成できるのに、そのshapeに指定パスの画像を割り当てる処理でエラーになります。

そんな時、「出来の悪いプログラマは、POSIX pathで誤魔化して実装する」という経験則が思い出されました。

目を閉じると、AppleのKeynoteで一時期行われていた、画像配置コマンドにPOSIX pathを要求していたアレな実装であるとか(あれはひどかった)、いまだにアレであり続けているAdobe Acrobat DistillerのdistillコマンドがPOSIX pathを要求する件であるとか(file pathって書いてあるのに、aliasじゃなくてPOSIX pathを要求するという地雷仕様)、枚挙にいとまがありません。

そんなわけで、普通に書いても通らなかったのでパスをPOSIX pathで与えてみたところ、見事(?)配置されました。

AppleScript名:画像をワークシート上に配置.scpt
set anImagePath to choose file
set anImagePOSIX to POSIX path of anImagePath

tell application "Microsoft Excel"
  set cwb to workbook 1
  
tell cwb
    tell worksheet 1
      set aPicShape to make new shape at the beginning
      
set width of aPicShape to 312
      
set height of aPicShape to 312
      
user picture of aPicShape picture file anImagePOSIX
    end tell
  end tell
end tell

★Click Here to Open This Script 

Posted in Bug file File path | Tagged 11.0savvy 12.0savvy 13.0savvy Excel | Leave a comment

Keynote,Pages,Numbers v13.0がリリースされる

Posted on 4月 2, 2023 by Takaaki Naganoya

Keynote, Pages, Numbersのバージョン13.0がリリースされました。AppleScript用語辞書的な変更点はありません。

Keynote v11からずっと、新規書類を保存するとエラーになる。Full Disk Accessの権限をKeynoteに与えていてもエラーになる、という重大な問題が解消されないままである、という認識でおりました。状況はKeynote v13.0でも変わりません。

これは、Apple側が問題として認識していないのではないか? という仮説を立て、いろいろ試してみました。

まずは、v12から継続している状況についての説明。Keynoteで新規書類を保存する際に「as Keynote」という、明らかに「指定してくださいね」というオプションがAppleScript用語辞書の中にあるので、指定したくなるところですが

AppleScript名:Keynoteで書類を新規保存(A).scpt
set newFile to ((path to desktop) as string) & "newDoc1111.key"

tell application "Keynote"
  set newDoc to make new document
  
save document 1 in file newFile as Keynote
end tell

★Click Here to Open This Script 

これを指定するとエラーになります。これが、Keynote v12.0から続いており、1年以上継続している状況です。以前のバージョンで通っていた記述がエラーを出すようになった、というものです。

ふとここで、「as Keynote」というオプション指定をはずしてみると…….

AppleScript名:Keynoteで書類を新規保存(A).scpt
set newFile to ((path to desktop) as string) & "newDoc1111.key"

tell application "Keynote"
  set newDoc to make new document
  
save document 1 in file newFile
end tell

★Click Here to Open This Script 

エラーが出なくなりました!!!(^ー^;;;; ファイル保存もできました。

なんなんでしょう、これは、、、、

Posted in Bug news | Tagged 12.0savvy 13.0savvy Keynote Numbers Pages | 1 Comment

Xcode 14.2でAppleScript App Templateを復活させる

Posted on 3月 21, 2023 by Takaaki Naganoya

AppleScript+Xcodeでアプリケーション開発を行う方法についてわかりやすくまとめた電子書籍「AppleScript+XcodeでつくるMacアプリ Xcode 14対応」を刊行しました(PDF 448ページ+付録、サンプルXcode Project Zipアーカイブ)。

この書籍の中では、テンプレートがXcode 14.2に存在していないので、書籍添付のプロジェクトをコピーして使ってください、という説明を行っています。

と、そんな本をまとめたところ、edama2さんから「なんか、前バージョンのXcodeからテンプレートをコピーして来れるみたいだよ」という話が!

早速、調べてみました。edama2さんから教えていただいた記事のとおりにはいかなかったので、Xcodeのバージョンによっては細部が変わっているようです。

自分は、Apple Developer Connectionに契約しているので、古いバージョンのXcodeもダウンロードできます。古いといっても古すぎるのはどうかと思いますので、ここではXcode 13.2をダウンロードしてきました。アーカイブ展開してさっそく、Xcode 13.2のバンドルパッケージ内にアクセスします。

Xcode 13.2.appをFinder上で選択して、マウスの右ボタンクリックでコンテクストメニューを表示させ、「パッケージの内容を表示」を実行。

/Contents/Developper/Library/Xcode/Templates/Project Templates/macOS/Other

の中に「AppleScript App.xctemplate」が存在していました。

この「AppleScript App.xctemplate」をXcode 14.2(記事執筆時最新)が認識するテンプレートのフォルダにコピーすれば使えるでしょう。

~/Library/Developer/Xcode/Templates

の中にコピーすると、Xcodeが14.2が認識してくれました。

Xcode 14.2を起動し、File>New Project

「AppleScript App」を選択すると、問題なく新規プロジェクトが作成できます。

テンプレートをZip圧縮して、ダウンロードできるようにしておきます。

Download Templates.zip

Posted in How To news | Tagged 13.0savvy Xcode | Leave a comment

geoCodingLibで逆住所ジオコーディング

Posted on 3月 16, 2023 by Takaaki Naganoya

逆住所ジオコーディング(住所→緯度経度)/逆住所ジオコーディング(緯度経度→住所)のための、よくありがちなObjective-CのコードをCocoa Framework化した「geoCodingLib」を呼び出して、逆住所ジオコーディングを行うAppleScriptです。

Cocoa Frameworkを呼び出すため、実行にはScript Debuggerあるいは同ソフトから書き出した拡張アプレット環境が必要です。Apple純正のスクリプトエディタでは実行できません。

–> geoCodingLib.framework(Universal Binary)

AppleScript名:geoCodingLibで逆住所ジオコーディング.scptd
—
–  Created by: Takaaki Naganoya
–  Created on: 2023/03/16
—
–  Copyright © 2023 Piyomaru Software, All Rights Reserved
—

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

set aLat to 35.7356786
set aLong to 139.6516811
set aLoc to current application’s CLLocation’s alloc()’s initWithLatitude:(aLat) longitude:(aLong)
set aRes to my getAddressOf:aLoc
–> 東京都練馬区豊玉北6丁目12-1

–緯度経度→住所
on getAddressOf:aLocation
  set aGeo to current application’s geocodingLib’s alloc()’s init()
  
aGeo’s getAddress:aLocation
  
  
delay 1.0E-4
  
  
repeat 1000 times
    delay 1.0E-4
    
set aRes to aGeo’s placeAddress()
    
if aRes is not equal to missing value then exit repeat
  end repeat
  
  
if aRes is equal to missing value then return false
  
return aRes as string
end getAddressOf:

★Click Here to Open This Script 

Posted in geolocation | Tagged 13.0savvy CoreLocation | 1 Comment

geoCodingLibで住所ジオコーディング

Posted on 3月 16, 2023 by Takaaki Naganoya

住所ジオコーディング(住所→緯度経度)/逆住所ジオコーディング(緯度経度→住所)のための、よくありがちなObjective-CのコードをCocoa Framework化した「geoCodingLib」を呼び出して、住所ジオコーディングを行うAppleScriptです。

Cocoa Frameworkを呼び出すため、実行にはScript Debuggerあるいは同ソフトから書き出した拡張アプレット環境が必要です。Apple純正のスクリプトエディタでは実行できません。

–> geoCodingLib.framework(Universal Binary)

AppleScript名:geoCodingLibで住所ジオコーディング.scptd
—
–  Created by: Takaaki Naganoya
–  Created on: 2023/03/16
—
–  Copyright © 2023 Piyomaru Software, All Rights Reserved
—

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

set aRes to my getGeoInfo:"東京都練馬区豊玉北6丁目12-1"
if aRes = false then return
return aRes –> {35.7356786, 139.6516811}

–住所→緯度経度
on getGeoInfo:addressText
  set aGeo to current application’s geocodingLib’s alloc()’s init()
  
aGeo’s getLatLong:addressText
  
  
delay 1.0E-3
  
  
repeat 1000 times
    delay 1.0E-3
    
set aRes to aGeo’s placemarksArray()
    
if aRes is not equal to missing value then exit repeat
  end repeat
  
  
if aRes is equal to missing value then return false
  
  
set aaRes to first item of aRes
  
set theDescription to aaRes’s |description|()
  
set theName to aaRes’s |name|() –> "河辺町x丁目XX-X"
  
set theCountry to aaRes’s country() –> "日本"
  
set thePostal to aaRes’s postalCode() –> "198-00XX"
  
set theAdminarea to aaRes’s administrativeArea() –> "東京都"
  
set theSubAdmin to aaRes’s subAdministrativeArea() –> (null)
  
set theLocality to aaRes’s locality() –> "青梅市"
  
set theSubLocality to aaRes’s subLocality() –> "河辺町"
  
set theThoroughfare to aaRes’s thoroughfare() –>"河辺町x丁目"
  
set theSubThoroughfare to aaRes’s subThoroughfare() –>"XX-X"
  
set theTZ to aaRes’s timeZone() –> "Asia/Tokyo (JST) offset 32400"
  
set theRegion to aaRes’s region() –> CLCircularRegion (identifier:’<+35.xxxxx,+139.xxxxx> radius 70.64’, center:<+35.xxxxx,+139.xxxxx0>, radius:70.64m)
  
set theRegCenter to theRegion’s |center|()
  
set aLat to theRegCenter’s latitude
  
set aLng to theRegCenter’s longitude
  
  
return {aLat, aLng}
end getGeoInfo:

★Click Here to Open This Script 

Posted in geolocation | Tagged 13.0savvy CoreLocation | 1 Comment

アラートダイアログ上にWebViewで3Dコンテンツを表示(WebGL+three.js)v3

Posted on 3月 7, 2023 by Takaaki Naganoya

アラートダイアログ上にWkWebViewを作成して、さまざまなグラフや3Dアニメーションを表示してきた「箱庭ダイアログ」の1つの到達点、「periodictable」(元素周期表)選択UIの表示デモAppleScriptです。

このデモ、macOS 10.14あたりまでは動いていたのですが、その後のmacOSのアップデートにより、表示されなくなっておりました。

いろいろ調べたところ、macOSの開発者もiOSの開発者も揃いも揃って「表示できない」と言っているのを見て、逆に何か解決策がありそうな気がしてきました。

ローカルに保存しておいた1枚ものの表示用HTML(2020/05に作成したもの)は、当時のSafariで表示できており、WkWebViewでも表示できていました。

現在、この1枚もののHTMLはSafariでもWkWebViewでも表示できないようになっています。
その一方で、three.jsのWebサイトに掲載されているperiodictableのサンプルは現行のSafariで表示でき、操作も行えます。

当初は、これを「SafariとWkWebViewの差」だと思って、WkWebViewをカスタマイズしまくらないとSafariと同等の表示が行えないのではないか? と考えていました。ただ、探しても探しても答えが見つからず、この方向で情報収集を行っても「無駄」に思えてきました。

そこでにわかに浮上してきたのが、「periodictable」や「three.js」自体がアップデートされている説、です。

WebKit(WkWebView)側のアップデート、およびCDN上のJavaScriptのライブラリのアップデートの相互作用によって表示できなくなったのではないかと、調査の方向を変えてみました。

当時のサンプルHTMLと現在のサンプルHTMLのdiffをとって、読み込むCDN上のライブラリを変更したり、追加することで現行OS上のWkWebView上でも動作するようになりました。

つまり、文字列として与えているHTMLの部分のみ変更しただけで、AppleScript部分とかWkWebViewまわりは一切手をつけていません。わかってしまえば、「なーんだ」という内容ですが、これにはなかなか対応できませんでした。

あとは、クリックした項目のURLイベントをAppleScript側で受信できればなおよいのですが、、、アプリケーションとして独立したものに変更して、AppleScript用語辞書を介して「display periodictable」みたいなコマンドでAppleScript側と値をやりとりするのがよいのかもしれません。

AppleScript名:アラートダイアログ上にWebViewで3Dコンテンツを表示(WebGL+three.js)v3.scptd
—
–  Created by: Takaaki Naganoya
–  Created on: 2020/06/13
–  Modified on: 2023/03/07
—
–  Copyright © 2020-2023 Piyomaru Software, All Rights Reserved
—
use AppleScript version "2.7"
use framework "Foundation"
use framework "AppKit"
use framework "WebKit"
use scripting additions

property |NSURL| : a reference to current application’s |NSURL|
property NSAlert : a reference to current application’s NSAlert
property NSString : a reference to current application’s NSString
property NSButton : a reference to current application’s NSButton
property WKWebView : a reference to current application’s WKWebView
property WKUserScript : a reference to current application’s WKUserScript
property NSURLRequest : a reference to current application’s NSURLRequest
property NSRunningApplication : a reference to current application’s NSRunningApplication
property NSUTF8StringEncoding : a reference to current application’s NSUTF8StringEncoding
property WKUserContentController : a reference to current application’s WKUserContentController
property WKWebViewConfiguration : a reference to current application’s WKWebViewConfiguration
property WKUserScriptInjectionTimeAtDocumentEnd : a reference to current application’s WKUserScriptInjectionTimeAtDocumentEnd

property returnCode : 0

–https://www.cresco.co.jp/blog/entry/7427/
— By sgi-chang @ UX Design Center
set myStr to "<!DOCTYPE html>
<html>

<head>
<title>three.js css3d – cresco xmas inspired by periodic table</title>
<meta charset=\"utf-8\">
<meta name=\"viewport\" content=\"width=device-width, user-scalable=no, minimum-scale=1.0, maximum-scale=1.0\">
<link type=\"text/css\" rel=\"stylesheet\" href=\"https://threejs.org/examples/main.css\">
<style>
a {
color: #8ff;
}

#menu {
position: absolute;
bottom: 20px;
width: 100%;
text-align: center;
}

.element {
width: 120px;
height: 160px;
box-shadow: 0px 0px 12px rgba(0, 255, 255, 0.5);
border: 1px solid rgba(127, 255, 255, 0.25);
font-family: Helvetica, sans-serif;
text-align: center;
line-height: normal;
cursor: default;
}

.element:hover {
box-shadow: 0px 0px 12px rgba(0, 255, 255, 0.75);
border: 1px solid rgba(127, 255, 255, 0.75);
}

.element .number {
position: absolute;
top: 20px;
right: 20px;
font-size: 12px;
color: rgba(127, 255, 255, 0.75);
}

.element .symbol {
position: absolute;
top: 40px;
left: 0px;
right: 0px;
font-size: 60px;
font-weight: bold;
color: rgba(255, 255, 255, 0.75);
text-shadow: 0 0 10px rgba(0, 255, 255, 0.95);
}

.element .details {
position: absolute;
bottom: 15px;
left: 0px;
right: 0px;
font-size: 12px;
color: rgba(127, 255, 255, 0.75);
}

button {
color: rgba(127, 255, 255, 0.75);
background: transparent;
outline: 1px solid rgba(127, 255, 255, 0.75);
border: 0px;
padding: 5px 10px;
cursor: pointer;
}

button:hover {
background-color: rgba(0, 255, 255, 0.5);
}

button:active {
color: #000000;
background-color: rgba(0, 255, 255, 0.75);
}
</style>
</head>

<body>
<script src=\"https://threejs.org/examples/jsm/libs/tween.module.min.js\"></script>
<script src=\"https://threejs.org/examples/jsm/controls/TrackballControls.js\"></script>
<script src=\"https://threejs.org/examples/jsm/renderers/CSS3DRenderer.js\"></script>

<div id=\"info\"><a href=\"http://piyocast.com/as\" target=\"_blank\">AppleScript 3D UI Demonstration</a> By Piyomaru Software</div>
<div id=\"container\"></div>
<div id=\"menu\">
<button id=\"table\">TABLE</button>
<button id=\"sphere\">SPHERE</button>
<button id=\"helix\">HELIX</button>
<button id=\"grid\">GRID</button>
</div>

    <!– Import maps polyfill –>
    <!– Remove this when import maps will be widely supported –>
    <script async src=\"https://unpkg.com/es-module-shims@1.5.8/dist/es-module-shims.js\"></script>

    <script type=\"importmap\">
      {
        \"imports\": {
          \"three\": \"https://unpkg.com/three@0.142.0/build/three.module.js\",
          \"OrbitControls\": \"https://unpkg.com/three@0.142.0/examples/jsm/controls/OrbitControls.js\"
        }
      }
    </script>
    
<script type=\"module\">
import * as THREE from ’https://threejs.org/build/three.module.js’;
import { TWEEN } from ’https://threejs.org/examples/jsm/libs/tween.module.min.js’;
import { TrackballControls } from ’https://threejs.org/examples/jsm/controls/TrackballControls.js’;
import { CSS3DRenderer, CSS3DObject } from ’https://threejs.org/examples/jsm/renderers/CSS3DRenderer.js’;
    
var table = [
\"1\", \"Hydrogen\", \"1.00794\", 1, 1,
\"2\", \"Helium\", \"4.002602\", 1, 2,
\"3\", \"Lithium\", \"6.941\", 1, 3,
\"4\", \"Beryllium\", \"9.012182\", 1, 4,
\"5\", \"Boron\", \"10.811\", 1, 5,
\"6\", \"Carbon\", \"12.0107\", 2, 1,
\"7\", \"Nitrogen\", \"14.0067\", 2, 3,
\"8\", \"Oxygen\", \"15.9994\", 3, 1,
\"9\", \"Fluorine\", \"18.9984032\", 3, 3,
\"101\", \"Saturday\", \"July\", 4, 2,
\"I\", \"Moscovium\", \"(290)\", 6, 1,
\"I\", \"Livermorium\", \"(293)\", 6, 2,
\"I\", \"Tennessine\", \"(294)\", 6, 3,
\"I\", \"Titanium\", \"47.867\", 6, 4,
\"I\", \"Vanadium\", \"50.9415\", 6, 5,
\"Y\", \"Chromium\", \"51.9961\", 8, 1,
\"Y\", \"Manganese\", \"54.938045\", 9, 2,
\"Y\", \"Iron\", \"55.845\", 10, 3,
\"Y\", \"Cobalt\", \"58.933195\", 10, 4,
\"Y\", \"Nickel\", \"58.6934\", 10, 5,
\"Y\", \"Copper\", \"63.546\", 11, 2,
\"Y\", \"Zinc\", \"65.38\", 12, 1,
\"O\", \"Gallium\", \"69.723\", 14, 1,
\"O\", \"Copernicium\", \"(285)\", 14, 2,
\"O\", \"Nihonium\", \"(286)\", 14, 3,
\"O\", \"Oganesson\", \"(294)\", 14, 4,
\"O\", \"Neon\", \"20.1797\", 14, 5,
\"O\", \"Sodium\", \"22.98976…\", 15, 1,
\"O\", \"Magnesium\", \"24.305\", 15, 5,
\"O\", \"Aluminium\", \"26.9815386\", 16, 1,
\"O\", \"Silicon\", \"28.0855\", 16, 5,
\"O\", \"Phosphorus\", \"30.973762\", 17, 1,
\"O\", \"Sulfur\", \"32.065\", 17, 2,
\"O\", \"Chlorine\", \"35.453\", 17, 3,
\"O\", \"Argon\", \"39.948\", 17, 4,
\"O\", \"Potassium\", \"39.948\", 17, 5,
\"M\", \"Calcium\", \"40.078\", 1, 7,
\"M\", \"Scandium\", \"44.955912\", 1, 8,
\"M\", \"Roentgenium\", \"(280)\", 1, 9,
\"M\", \"Germanium\", \"72.63\", 1, 10,
\"M\", \"Lead\", \"207.2\", 1, 11,      
\"M\", \"Arsenic\", \"74.9216\", 2, 8,
\"M\", \"Selenium\", \"78.96\", 3, 9,
\"M\", \"Bromine\", \"79.904\", 3, 10,
\"M\", \"Krypton\", \"83.798\", 4, 8,
\"M\", \"Rubidium\", \"85.4678\", 5, 7,
\"M\", \"Strontium\", \"87.62\", 5, 8,
\"M\", \"Yttrium\", \"88.90585\", 5, 9,
\"M\", \"Zirconium\", \"91.224\", 5, 10,
\"M\", \"Niobium\", \"92.90628\", 5, 11,
\"A\", \"Molybdenum\", \"95.96\", 7,8,
\"A\", \"Technetium\", \"(98)\", 7, 9,
\"A\", \"Ruthenium\", \"101.07\", 7, 10,
\"A\", \"Rhodium\", \"102.9055\",7, 11,
\"A\", \"Palladium\", \"106.42\", 8, 7,
\"A\", \"Silver\", \"107.8682\", 8,9,
\"A\", \"Cadmium\", \"112.411\", 9, 7,
\"A\", \"Indium\", \"114.818\", 9, 9,
\"A\", \"Tin\", \"118.71\", 10, 8,
\"A\", \"Antimony\", \"121.76\", 10, 9,
\"A\", \"Gadolinium\", \"157.25\", 10, 10,
\"A\", \"Terbium\", \"158.92535\", 10, 11,
\"R\", \"Dysprosium\", \"162.5\", 12, 7,
\"R\", \"Holmium\", \"164.93032\", 12, 8,
\"R\", \"Erbium\", \"167.259\", 12, 9,
\"R\", \"Thulium\", \"168.93421\", 12, 10,
\"R\", \"Ytterbium\", \"173.054\", 12, 11,
\"R\", \"Lutetium\", \"174.9668\", 13, 7,
\"R\", \"Hafnium\", \"178.49\", 13, 9,
\"R\", \"Samarium\", \"150.36\", 14, 7,
\"R\", \"Europium\", \"151.964\", 14, 9,
\"R\", \"Tantalum\", \"180.94788\", 15, 8,
\"R\", \"Tungsten\", \"183.84\", 15, 10,
\"R\", \"Rhenium\", \"186.207\", 15, 11,
\"U\", \"Osmium\", \"190.23\", 17, 7,
\"U\", \"Iridium\", \"192.217\", 17,8,
\"U\", \"Platinum\", \"195.084\", 17, 9,
\"U\", \"Gold\", \"196.966569\", 17, 10,
\"U\", \"Mercury\", \"200.59\", 18, 11,
\"U\", \"Thallium\", \"204.3833\", 19, 11,
\"U\", \"Bismuth\", \"208.9804\", 20, 7,
\"U\", \"Polonium\", \"(209)\", 20, 8,
\"U\", \"Astatine\", \"(210)\", 20, 9,
\"U\", \"Francium\", \"(223)\", 20, 10,
\"U\", \"Radium\", \"(226)\", 22, 9,
\"U\", \"Actinium\", \"(227)\", 22, 10,
\"U\", \"Thorium\", \"232.03806\", 22, 11,
\"A\", \"Protactinium\", \"231.0588\", 22, 7,
\"A\", \"Uranium\", \"238.02891\", 23, 9,
\"A\", \"Neptunium\", \"(237)\", 23, 8,
\"A\", \"Plutonium\", \"(244)\", 23, 9,
\"A\", \"Americium\", \"(243)\", 23, 10,
\"A\", \"Curium\", \"(247)\", 23, 11,
\"S\", \"Berkelium\", \"(247)\", 24, 7,
\"S\", \"Californium\", \"(251)\", 24, 8,
\"S\", \"Einstenium\", \"(252)\", 24, 9,
\"S\", \"Fermium\", \"(257)\", 24, 11,
\"S\", \"Mendelevium\", \"(258)\", 25, 7,
\"S\", \"Nobelium\", \"(259)\", 25, 9,
\"S\", \"Lawrencium\", \"(262)\", 25, 11,
\"S\", \"Rutherfordium\", \"(267)\", 26, 7,
\"S\", \"Dubnium\", \"(268)\", 26, 9,
\"S\", \"Seaborgium\", \"(271)\", 26, 10,
\"S\", \"Bohrium\", \"(272)\", 26, 11,
\"A\", \"Hassium\", \"(270)\", 27, 8,
\"B\", \"Meitnerium\", \"(276)\", 27, 9,
\"C\", \"Darmstadium\", \"(281)\", 27, 8,
\"D\", \"Tellurium\", \"127.6\", 27, 9,
\"E\", \"Iodine\", \"126.90447\", 27, 10,
\"F\", \"Xenon\", \"131.293\", 28, 9,
\"G\", \"Caesium\", \"132.9054\", 28, 10,
\"H\", \"Barium\", \"132.9054\", 28, 11,
\"I\", \"Lanthanum\", \"138.90547\", 29, 8,
\"J\", \"Cerium\", \"140.116\", 29, 9,
\"K\", \"Praseodymium\", \"140.90765\", 29, 10,
\"L\", \"Neodymium\", \"144.242\", 29, 8,
\"M\", \"Promethium\", \"(145)\", 29, 9,
  \"PS\", \"Piyomaru Software\", \"(PiyoPiyo)\", 29, 10,  
  \"AS\", \"AppleScript\", \"(osalang)\", 29, 11,  
];

var camera, scene, renderer;
var controls;
var objects = [];
var targets = { table: [], sphere: [], helix: [], grid: [] };
init();
animate();
    
function init() {
camera = new THREE.PerspectiveCamera(40, window.innerWidth / window.innerHeight, 1, 10000);
camera.position.z = 3000;
scene = new THREE.Scene();
      
// table
for (var i = 0; i < table.length; i += 5) {
      
var element = document.createElement(’div’);
element.className = ’element’;

     //element.style.backgroundColor = ’rgba(128,0,64,’ + ( Math.random() * 0.5 + 0.25 ) + ’)’;
    //element.style.backgroundColor = ’rgba(64,0,128,’ + ( Math.random() * 0.5 + 0.25 ) + ’)’;
//element.style.backgroundColor = ’rgba(0,0,0,’ + ( Math.random() * 0.5 + 0.25 ) + ’)’;
element.style.backgroundColor = ’rgba(0,127,127,’ + ( Math.random() * 0.5 + 0.25 ) + ’)’;
//element.style.backgroundColor = ’rgba(18,77,174,’ + (Math.random() * 0.5 + 0.25) + ’)’;

var number = document.createElement(’div’);
number.className = ’number’;
number.textContent = (i / 5) + 1;
element.appendChild(number);
var symbol = document.createElement(’div’);
symbol.className = ’symbol’;
symbol.textContent = table[i];
element.appendChild(symbol);
var details = document.createElement(’div’);
details.className = ’details’;
details.innerHTML = table[i + 1] + ’<br>’ + table[i + 2];
element.appendChild(details);
var object = new CSS3DObject(element);
object.position.x = Math.random() * 4000 – 2000;
object.position.y = Math.random() * 4000 – 2000;
object.position.z = Math.random() * 4000 – 2000;
scene.add(object);
objects.push(object);
//
var object = new THREE.Object3D();
object.position.x = (table[i + 3] * 140) – 1330;
object.position.y = – (table[i + 4] * 180) + 990;
targets.table.push(object);
}
      
// sphere
var vector = new THREE.Vector3();
for (var i = 0, l = objects.length; i < l; i++) {
var phi = Math.acos(- 1 + (2 * i) / l);
var theta = Math.sqrt(l * Math.PI) * phi;
var object = new THREE.Object3D();
object.position.setFromSphericalCoords(800, phi, theta);
vector.copy(object.position).multiplyScalar(2);
object.lookAt(vector);
targets.sphere.push(object);
}
      
// helix
var vector = new THREE.Vector3();
for (var i = 0, l = objects.length; i < l; i++) {
var theta = i * 0.175 + Math.PI;
var y = – (i * 8) + 450;
var object = new THREE.Object3D();
object.position.setFromCylindricalCoords(900, theta, y);
vector.x = object.position.x * 2;
vector.y = object.position.y;
vector.z = object.position.z * 2;
object.lookAt(vector);
targets.helix.push(object);
}
      
// grid
for (var i = 0; i < objects.length; i++) {
var object = new THREE.Object3D();
object.position.x = ((i % 5) * 400) – 800;
object.position.y = (- (Math.floor(i / 5) % 5) * 400) + 800;
object.position.z = (Math.floor(i / 25)) * 1000 – 2000;
targets.grid.push(object);
}
      
//
renderer = new CSS3DRenderer();
renderer.setSize(window.innerWidth, window.innerHeight);
document.getElementById(’container’).appendChild(renderer.domElement);
      
//
controls = new TrackballControls(camera, renderer.domElement);
controls.minDistance = 500;
controls.maxDistance = 6000;
controls.addEventListener(’change’, render);
      
var button = document.getElementById(’table’);
button.addEventListener(’click’, function () {
transform(targets.table, 2000);
}, false);
      
var button = document.getElementById(’sphere’);
button.addEventListener(’click’, function () {
transform(targets.sphere, 2000);
}, false);
      
var button = document.getElementById(’helix’);
button.addEventListener(’click’, function () {
transform(targets.helix, 2000);
}, false);
      
var button = document.getElementById(’grid’);
button.addEventListener(’click’, function () {
transform(targets.grid, 2000);
}, false);
      
transform(targets.table, 2000);
//
window.addEventListener(’resize’, onWindowResize, false);
}
    
function transform(targets, duration) {
TWEEN.removeAll();
for (var i = 0; i < objects.length; i++) {
var object = objects[i];
var target = targets[i];
new TWEEN.Tween(object.position)
.to({ x: target.position.x, y: target.position.y, z: target.position.z }, Math.random() * duration + duration)
.easing(TWEEN.Easing.Exponential.InOut)
.start();
new TWEEN.Tween(object.rotation)
.to({ x: target.rotation.x, y: target.rotation.y, z: target.rotation.z }, Math.random() * duration + duration)
.easing(TWEEN.Easing.Exponential.InOut)
.start();
}
new TWEEN.Tween(this)
.to({}, duration * 2)
.onUpdate(render)
.start();
}
    
function onWindowResize() {
camera.aspect = window.innerWidth / window.innerHeight;
camera.updateProjectionMatrix();
renderer.setSize(window.innerWidth, window.innerHeight);
render();
}
    
function animate() {
requestAnimationFrame(animate);
TWEEN.update();
controls.update();
}
    
function render() {
renderer.render(scene, camera);
}
</script>
</body>

</html>"

set paramObj to {myMessage:"WebGL & three.js Test", mySubMessage:"This is a WebGL UI using three.js", htmlStr:myStr}
–my browseStrWebContents:paramObj–for debug
my performSelectorOnMainThread:"browseStrWebContents:" withObject:(paramObj) waitUntilDone:true

on browseStrWebContents:paramObj
  set aMainMes to myMessage of paramObj
  
set aSubMes to mySubMessage of paramObj
  
set htmlString to (htmlStr of paramObj)
  
  
set aWidth to 1600
  
set aHeight to 900
  
  
–WebViewをつくる
  
set aConf to WKWebViewConfiguration’s alloc()’s init()
  
  
–指定HTML内のJavaScriptをFetch
  
set jsSource to pickUpFromToStr(htmlString, "<script src", "</script>") of me
  
  
set userScript to WKUserScript’s alloc()’s initWithSource:jsSource injectionTime:(WKUserScriptInjectionTimeAtDocumentEnd) forMainFrameOnly:true
  
set userContentController to WKUserContentController’s alloc()’s init()
  
userContentController’s addUserScript:(userScript)
  
aConf’s setUserContentController:userContentController
  
  
set aWebView to WKWebView’s alloc()’s initWithFrame:(current application’s NSMakeRect(0, 0, aWidth, aHeight)) configuration:aConf
  
aWebView’s setNavigationDelegate:me
  
aWebView’s setUIDelegate:me
  
aWebView’s setTranslatesAutoresizingMaskIntoConstraints:true
  
using terms from scripting additions
    set bURL to |NSURL|’s fileURLWithPath:(POSIX path of (path to me))
  end using terms from
  
aWebView’s loadHTMLString:htmlString baseURL:(bURL)
  
  
— set up alert  
  
set theAlert to NSAlert’s alloc()’s init()
  
tell theAlert
    its setMessageText:aMainMes
    
its setInformativeText:aSubMes
    
its addButtonWithTitle:"OK"
    
–its addButtonWithTitle:"Cancel"
    
its setAccessoryView:aWebView
    
    
set myWindow to its |window|
  end tell
  
  
— show alert in modal loop
  
NSRunningApplication’s currentApplication()’s activateWithOptions:0
  
my performSelectorOnMainThread:"doModal:" withObject:(theAlert) waitUntilDone:true
  
  
–Stop Web View Action
  
set bURL to |NSURL|’s URLWithString:"about:blank"
  
set bReq to NSURLRequest’s requestWithURL:bURL
  
aWebView’s loadRequest:bReq
  
  
if (my returnCode as number) = 1001 then error number -128
end browseStrWebContents:

on doModal:aParam
  set (my returnCode) to (aParam’s runModal()) as number
end doModal:

on viewDidLoad:aNotification
  return true
end viewDidLoad:

on fetchJSSourceString(aURL)
  set jsURL to |NSURL|’s URLWithString:aURL
  
set jsSourceString to NSString’s stringWithContentsOfURL:jsURL encoding:(NSUTF8StringEncoding) |error|:(missing value)
  
return jsSourceString
end fetchJSSourceString

on pickUpFromToStr(aStr as string, s1Str as string, s2Str as string)
  set a1Offset to offset of s1Str in aStr
  
if a1Offset = 0 then return false
  
set bStr to text (a1Offset + (length of s1Str)) thru -1 of aStr
  
set a2Offset to offset of s2Str in bStr
  
if a2Offset = 0 then return false
  
set cStr to text 1 thru (a2Offset – (length of s2Str)) of bStr
  
return cStr as string
end pickUpFromToStr

–リストを任意のデリミタ付きでテキストに
on retArrowText(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 retArrowText

on array2DToJSONArray(aList)
  set anArray to current application’s NSMutableArray’s arrayWithArray:aList
  
set jsonData to current application’s NSJSONSerialization’s dataWithJSONObject:anArray options:(0 as integer) |error|:(missing value) –0 is
  
set resString to current application’s NSString’s alloc()’s initWithData:jsonData encoding:(current application’s NSUTF8StringEncoding)
  
return resString
end array2DToJSONArray

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

★Click Here to Open This Script 

Posted in 3D dialog JavaScript | Tagged 12.0savvy 13.0savvy WKWebView | 1 Comment

ChatGPTでchatに対する応答文を取得

Posted on 3月 6, 2023 by Takaaki Naganoya

OpenAIが提供しているREST APIを呼び出して、チャットに対する応答を生成するAppleScriptです。実行のためにはOpenAIのWebサイトにサインアップして、実行のためのAPI Keyを取得してください。

ChatGPTなどのサービスを提供しているOpenAIにサインアップして、各種サービスをAppleScriptから利用できます。Freeアカウントでは1分あたりに発行できるクエリー数の上限が低めに設定されていますが、実験を行う程度であれば十分なレベルでしょう。

https://platform.openai.com/docs/introduction

「chat」は、いわゆるChatGPTでよく知られている処理で、チャットに応答するものです。この呼び出し方に対して、さらにroleとして「system」「user」「assistant」などの役割を指定することで、チャットらしいやりとりを生成するようです(Chat completion)。

AppleScript名:Chat.scptd
—
–  Created by: Takaaki Naganoya
–  Created on: 2023/03/05
—
–  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 myText to "こんにちは"

set barerKey to "xx-XXXXXXXxXxxxxXxxXXxXXXXxxxXXxxxxXXxxxXXxXXxxXXxx"

set aText to "curl https://api.openai.com/v1/chat/completions -H ’Content-Type: application/json’ -H ’Authorization: Bearer " & barerKey & "’ -d ’{\"model\": \"gpt-3.5-turbo\",\"messages\": [{\"role\": \"user\", \"content\": \"" & myText & "\"}]}’"
set sRes to do shell script aText

set jsonString to NSString’s stringWithString:sRes
set jsonData to jsonString’s dataUsingEncoding:(NSUTF8StringEncoding)
set aRes to NSJSONSerialization’s JSONObjectWithData:jsonData options:0 |error|:(missing value)
set chatRes to (aRes’s valueForKeyPath:"choices.message.content") as list
–>{"こんにちは!こんにちはと言うと、こんにちはと返してくださる方が多いですね。私はAIアシスタントなので、いつでもお話し相手になれます。何かお話を聞かせてください。"}
–> {"、こんにちは! 私はAIアシスタントです。何かお手伝いできることはありますか?"}
–> {"こんにちは!私はAIアシスタントです。何かお手伝いできますか?"}
–> {"、私はAIアシスタントです。何かお手伝いできることはありますか?"}
–> {"こんにちは!こんにちはは、日本語で「こんにちは」と書き、挨拶の一つです。相手と会話をする際に使われる一般的な挨拶の言葉で、おはようございます、こんにちは、こんばんはなどがあります。どうぞよろしくお願いします!"}

★Click Here to Open This Script 

Posted in JSON Natural Language Processing Network REST API | Tagged 12.0savvy 13.0savvy ChatGPT | Leave a comment

ChatGPTで質問に対する回答を生成(Compilations)

Posted on 2月 26, 2023 by Takaaki Naganoya

OpenAIが提供しているREST APIを呼び出して、質問に対する回答を生成するAppleScriptです。実行のためにはOpenAIのWebサイトにサインアップして、実行のためのAPI Keyを取得してください。

ChatGPTなどのサービスを提供しているOpenAIにサインアップして、各種サービスをAppleScriptから利用できます。Freeアカウントでは1分あたりに発行できるクエリー数の上限が低めに設定されていますが、実験を行う程度であれば十分なレベルでしょう。

https://platform.openai.com/docs/introduction

「質問に対する回答を生成」は、いわゆるChatGPTでよく知られている処理で、対話的に質問文に回答するものです。回答内容が正しいかどうかはちょっとアレですが、自然言語処理もこのレベルまで来たのかと感心させられます。

対話っぽい動作(前回の問い合わせを踏まえた上で回答する)を考えて「user」パラメータを付けて呼び出していますが(ここも自分のユーザーアカウントに書き換えてください)、いまひとつWebブラウザ上で問い合わせを行ったときのような「つながり」を感じられないので、何かまだ指定する必要があるのかもしれません。

AppleScript名:Compilations(質問に対する回答を生成).scptd
—
–  Created by: Takaaki Naganoya
–  Created on: 2023/02/24
—
–  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 myText to "バンダイナムコのアーケードゲーム「戦場の絆1」の初代プロデューサーの名前は、小山順一朗さんです。"

set barerKey to "xx-XXXXXXXxXxxxxXxxXXxXXXXxxxXXxxxxXXxxxXXxXXxxXXxx"

set sRes to (do shell script "curl https://api.openai.com/v1/completions -H ’Content-Type: application/json’ -H ’Authorization: Bearer " & barerKey & "’ -d ’{\"model\": \"text-davinci-003\", \"prompt\": \"" & myText & "\", \"max_tokens\": 200, \"temperature\": 0, \"user\": \"maro_ml@piyocast.com\"}’")

set jsonString to NSString’s stringWithString:sRes
set jsonData to jsonString’s dataUsingEncoding:(NSUTF8StringEncoding)
set aRes to NSJSONSerialization’s JSONObjectWithData:jsonData options:0 |error|:(missing value)
set modelRes to aRes as {anything, record}

–>{|id|:"cmpl-6nMNGJzTFei6eMbn1rnMgMN9ML4qi", object:"text_completion", created:1.677222098E+9, model:"text-davinci-003", choices:{{|index|:0, finish_reason:"stop", logprobs:missing value, |text|:"小山順一朗さんは、バンダイナムコのゲームプロデューサーとして、「戦場の絆1」をはじめとした数々のアーケードゲームをプロデュースしてきました。また、「戦場の絆1」のプロデューサーとして、「戦場の絆2」「戦場の絆3」「戦場の絆4」などのシリーズをプロデュースしています。"}}, usage:{total_tokens:224, completion_tokens:163, prompt_tokens:61}}

★Click Here to Open This Script 

Posted in Natural Language Processing REST API Text | Tagged 12.0savvy 13.0savvy ChatGPT | Leave a comment

ChatGPTで文章の感情検出(Moderations)

Posted on 2月 26, 2023 by Takaaki Naganoya

OpenAIが提供しているREST APIを呼び出して、指定文章の感情検出を行うAppleScriptです。実行のためにはOpenAIのWebサイトにサインアップして、実行のためのAPI Keyを取得してください。

ChatGPTなどのサービスを提供しているOpenAIにサインアップして、各種サービスをAppleScriptから利用できます。Freeアカウントでは1分あたりに発行できるクエリー数の上限が低めに設定されていますが、実験を行う程度であれば十分なレベルでしょう。

https://platform.openai.com/docs/introduction

「文章の感情検出」は、ユーザーサポートなどの現場においてユーザーからの投稿が質問などのものなのか、あるいは感情的な文章なのかといった「当たり」をつけるために用いられているといった印象があります。

ただ、「I want to kill him.」という例文に対して「hate」が検出されないなど、ややその評価内容には疑問の余地が残されているようです。

AppleScript名:Moderations(感情検出).scptd
—
–  Created by: Takaaki Naganoya
–  Created on: 2023/02/24
—
–  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 aSentence to "I want to kill him."

set barerKey to "xx-XXXXXXXxXxxxxXxxXXxXXXXxxxXXxxxxXXxxxXXxXXxxXXxx"
set sRes to (do shell script "curl https://api.openai.com/v1/moderations -H ’Content-Type: application/json’ -H ’Authorization: Bearer " & barerKey & "’ -d ’{\"input\": \"" & aSentence & "\" }’")

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

set mRes to aRes as {anything, record}
–> {|id|:"modr-6o8PPeHjWYIH5z5Qi79etbe8JaWY8", model:"text-moderation-004", results:{{flagged:true, category_scores:{sexual:3.26660915561661E-6, |sexual/minors|:2.58405265185502E-7, |hate/threatening|:2.28086973947939E-5, hate:0.007466733921, |self-harm|:1.23088886994083E-6, violence:0.794520378113, |violence/graphic|:4.90069034242424E-8}, categories:{sexual:false, |sexual/minors|:false, |hate/threatening|:false, hate:false, |self-harm|:false, violence:true, |violence/graphic|:false}}}}

★Click Here to Open This Script 

Posted in Natural Language Processing REST API Text | Tagged 12.0savvy 13.0savvy ChatGPT | Leave a comment

Post navigation

  • Older posts
  • Newer posts

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

Google Search

Popular posts

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

Tags

10.11savvy (1101) 10.12savvy (1242) 10.13savvy (1391) 10.14savvy (587) 10.15savvy (438) 11.0savvy (283) 12.0savvy (212) 13.0savvy (199) 14.0savvy (153) 15.0savvy (142) CotEditor (66) Finder (52) Keynote (119) NSAlert (61) NSArray (51) NSBitmapImageRep (20) NSBundle (20) NSButton (34) NSColor (53) NSDictionary (28) NSFileManager (23) NSFont (21) NSImage (41) NSJSONSerialization (21) NSMutableArray (63) NSMutableDictionary (22) NSPredicate (36) NSRunningApplication (56) NSScreen (30) NSScrollView (22) NSString (119) NSURL (98) NSURLRequest (23) NSUTF8StringEncoding (30) NSView (33) NSWorkspace (20) Numbers (76) Pages (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