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

タグ: 10.14savvy

Numbers選択セルの内容の&エンコーディング文字をプレーン化

Posted on 12月 7, 2020 by Takaaki Naganoya

Numbersのワークシート上で選択したセル中の文字に&エンコーディング文字が存在している場合に、その内容をプレーンテキスト化するAppleScriptです。

内容自体はよくあるものなので、説明が必要なものでもありません。Stream DeckにNumbers関連のScriptをいくつか用意して試していますが、なかなか便利です(かといって、Stream Deckの購入を決意するほどではないのですが)。ただ、実際にデータ整理が少ない手間で行えました。

Stream Deck Softwareの「システム」>「開く」のアクションにscpt形式のAppleScript書類を登録しておけば実行してくれるため、そのような利用方法を想定しています。

Numbers関連のさまざまな雑多な作業をAppleScriptで省力化し、それをStream Deckから呼び出すことで作業の負荷を減らせることを実感しています。それでもStream Deckの物理的な厚みがあるので何度もパチパチ叩いていると疲れやすいような気もします。

AppleScript名:選択セルの内容の&エンコーディング文字をプレーン化.scpt
—
–  Created by: Takaaki Naganoya
–  Created on: 2020/12/06
—
–  Copyright © 2020 Piyomaru Software, All Rights Reserved
—

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

decodeSelection() of me

–Numbersの選択範囲のデータを2D Listで返す
on decodeSelection()
  tell application "Numbers"
    tell front document
      –現在表示中のシートを対象にする
      
tell active sheet
        –Tableを特定する
        
try
          set theTable to first table whose class of selection range is range
        on error
          display notification "Numbers: There is no selection"
          
return {}
        end try
        
        
tell theTable
          –選択範囲のデータを1D Listで取得する
          
set aRes to value of cells of selection range
          
–選択範囲のセルのアドレスデータを1D Listで取得する
          
set cellList to cell of selection range
        end tell
        
        
–Percent Decode
        
set newList to {}
        
repeat with i in aRes
          set j to contents of i
          
set aRes to decodeCharacterReference(j as string) of me
          
set the end of newList to aRes
        end repeat
        
        
–Write Back to Numbers
        
repeat with i from 1 to (length of cellList)
          tell item i of cellList
            set value to item i of newList
          end tell
        end repeat
        
      end tell
    end tell
  end tell
end decodeSelection

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

on decodeCharacterReference(aStr)
  set anNSString to current application’s NSString’s stringWithString:aStr
  
set theData to anNSString’s dataUsingEncoding:(current application’s NSUTF16StringEncoding)
  
set styledString to current application’s NSAttributedString’s alloc()’s initWithHTML:theData documentAttributes:(missing value)
  
set plainText to (styledString’s |string|()) as string
  
return plainText
end decodeCharacterReference

★Click Here to Open This Script 

Posted in Text | Tagged 10.14savvy 10.15savvy 11.0savvy Numbers | Leave a comment

Pixelmator Pro v2.0.1でAppleScript用語辞書に命令語追加

Posted on 12月 2, 2020 by Takaaki Naganoya

Pixelmator Proはバージョン1.8でAppleScriptに対応しましたが、その後のアップデートでも用語辞書に変更が加えられています。

v2.0では以前に作ったアイコンの各解像度画像の書き出しScriptがうまく動作していませんでしたが、v2.0.1ではうまく(エラーを出さずに)動作していることを確認しています。バグレポートしてから反映されるまでの時間が短くて、フットワークの軽さに感心しました。こういうところ、Piyomaru Softwareとは比べ物になりません。

■v1.8→v2.0


「elipse shape layer」(楕円レイヤー)に同義語(synonym)が追加定義されました。「circle shape layer」「oval shape layer」と入力して構文確認すると「elipse shape layer」として解釈されます。

■v2.0→v2.0.1


「select color range」コマンドが追加定義されました。写真のようなデータを相手に色域を指定して選択できるようです。このrangeで指定する値が、色差(ΔE)なのか、何か他の指標の数値なのかがいまひとつわかりません。

自分が作った色域指定のAppleScriptでは、文字色の選択のために作ったものなので、もう少し仕様が違います。

select color range v : Select all areas of a specified color. This command can be executed on the document (in which case every layer is sampled) or on a layer, in which case the selection is created based on the layer's content.
select color range document
color list of integer : The color of the areas that should be selected.
[range integer] : The range of the colors that should be selected. With a range of 1, only areas that are exactly of the specified color will be selected. As the range is increased, increasingly more similarly-colored areas will be selected.
[smooth edges boolean] : Whether the edges of the selection should be smoothed.

rangeはrangeとしか書かれていないですね。100を指定するとキャンバス全体が選択されてしまうので、数値範囲は事実上1〜99ということになると思います(AppleScript用語辞書に有効範囲ぐらいは書いておいてほしいなー)。

rangeの値をどう指定するかで、どのぐらいの範囲の「色」を選択できるかが変わってくるので、自分もテストデータの選択色範囲を見ながら値を調整したので、いま指定しているrangeの値が正しいという保証はありません。

もともと、対話的に値を模索するような値なので、画像で使われている色数の分布などの情報をあらかじめ取得して分析しておき、その中でどの程度の色をピックアップするのか知っておく必要があるでしょう。そこまで徹底的に分析してからでないと、このselect color rangeコマンドをバッチ処理的な世界観の中で有効利用することは難しいと思います。

このコマンドを実装するぐらいなら、画像をOCR処理してテキストを取り出して、指定のキーワードが入っているエリアをぼかし処理するといった「OCRフィルタリング」の機能の方がいいかも。画面キャプチャ画像で特定の文字が入っている部分をぼかし処理するパターンがとても多いので、これは自分でも組んでおきたい処理ではあります(OCR次第。OS標準搭載機能だけでなんとかできるとよさそう)。

AppleScript名:選択中のレイヤーから赤っぽい色を選択.scpt
tell application "Pixelmator Pro"
  tell front document
    tell current layer
      select color range color {65535, 0, 0} range 90
    end tell
  end tell
end tell

★Click Here to Open This Script 

AppleScript名:選択中のレイヤーから緑色っぽい色を選択.scpt
tell application "Pixelmator Pro"
  tell front document
    tell current layer
      select color range color {0, 65535, 0} range 90
    end tell
  end tell
end tell

★Click Here to Open This Script 

AppleScript名:選択中のレイヤーから青っぽい色を選択.scpt
tell application "Pixelmator Pro"
  tell front document
    tell current layer
      select color range color {0, 0, 65535} range 80
    end tell
  end tell
end tell

★Click Here to Open This Script 

Posted in Color | Tagged 10.13savvy 10.14savvy 10.15savvy 11.0savvy Pixelmator Pro | Leave a comment

歴史的大ニュース:Amazon AWSがMacインスタンスのサポートを開始

Posted on 12月 1, 2020 by Takaaki Naganoya

久しぶりに震えました。Amazon AWS(EC2)がMacのインスタンスをサポートしました(Amazon EC2 Mac instances)。

New – Use Amazon EC2 Mac Instances to Build & Test macOS, iOS, ipadOS, tvOS, and watchOS Apps

Amazon EC2 Mac InstancesDevelop, build, test, and sign Apple apps on Amazon EC2

このMacインスタンスは、通常のAWSとは異なりMac1台をまるまる占有するタイプのようです。ハードウェアはMac mini(Core i7 3.2GHz)でメモリ32GB。10Gbit Ethernet搭載モデルとのこと。

Amazon EC2 Mac InstancesがサポートするOSはmacOS 10.14と10.15、2021年にはM1 Mac miniの投入を検討しているのだとか。こちらはmacOS 11.x以降での運用になることでしょう。

利用者はTerminal上でSSHで接続するか、VNC Remote Desktop経由で接続することになるとのこと。XcodeでiOSなどのアプリケーションをビルドするための需要を見込んでいるようです。

「仮想マシンの1インスタンス時間貸し」というAWSのサービスイメージと大きく異なり、1台まるごと貸し出しサービスです。仮想化技術を用いて大量のインスタンスを同時実行する方向では、ライセンスの問題を解決できないことは明らかでしたが、逆に「こういう方法があったのか」というコロンブスの卵的な解決策ではあります。クラウドというよりは、時間貸しのコロケーションサービスともいえます。

最近のmacOSでは滅多にありませんが(のぞく、macOS 10.13と10.15)、OSごとまるごとクラッシュして再起動が必要になるとか、リセットが必要になるケースもないことはないでしょう。また、セキュリティ設定をユーザーが好き勝手にいじくれるかどうかも見所です(SIP解除して運用できるのかどうか、これは切実な問題です)。

Amazon EC2 Mac Instancesのサービス提供リージョンは、US East (N. Virginia), US East (Ohio), US West (Oregon), Europe (Ireland), and Asia Pacific (Singapore) とのことで、Tokyoは現段階ではありません。今後増えていくような書き方はされていますが、正直わかりません。

EC2というと、あらかじめディスクイメージを用意しておいて、インスタンスの起動をディスクイメージで実行、サービス運用と終了の必要な期間がきわめて短くて済むことを売りにしている印象があるものの、このAmazon EC2 Mac Instancesで運用するとどーなるのか。

利用料金をまだ確認できていないので、コロケーションサービス(初期費用が必要)に比べてどうなのかとか、実機まるごと買ったほうが安いんじゃないかとか、疑問はいろいろあるわけですが、REST APIのインタフェースだけ作ってしまえばクラウド上でAppleScriptによってサービスを作って提供できるわけで、ずいぶん悩ましい存在です。

AppleScript on the cloud的なサービスもできるし、仲間内で冗談でしか出てこなかった「Adobe Creative Grid」(時間貸しで大量のマシンによりAdobeアプリケーションのデータを高速かつ並列に処理する)みたいなサービスも作れてしまう(Adobe Createve Cloud税が高いのでむやみに実験はできないんですけれども)わけで、ずいぶん楽しい感じになってきました。

OS X 10.10で通常のAppleScriptからCocoaの機能が利用できるようになり、Cloud系のサービスを利用できるようになりました。機械学習系の機能も利用できています。

AppleScriptで大規模データとか超大量のデータ処理を行うさいの物理的な制約がなくなってきたわけで、数万人のユーザーへの一括メール送信とかいう無茶な処理も、外部のCloud(SendGrridなど)の機能を活用してできるようになりました(そこまで大量の送信は実際にはやっていないので、理論上最大値ということで)。

一方で、AppleScriptを使ってWebサービスそのものを作って運用するという方向には、ほとんど手が伸びていなかった状態です。外部でそのような需要が発生するか否かについては不明ですが、自分で作って自分で運営するサービスでは、柔軟に規模の拡大・縮小が行えることは重要です。

そうしたときに、外部とのI/FをRemote AppleEventで行うわけにはいかないでしょうし(AWSのデータセンターでポート3031へのリクエストが通るんだろか?)、一般的なREST APIでリクエストを受け付けてJSONで返すみたいな構造にする必要はあるでしょう。

あとは、並列処理技術。これまで、「Mac App Store向けのアプリケーションでは仕様上実装しづらい」ことから、それほど活躍の場がなかったAppleScriptによる並列処理技術ですが、外部からのリクエストを処理する場合には、とても必要になってくることでしょう。

やはり、実際にさわってみないとなんとも言えないですね。

Amazon EC2 Mac Instancesについて言及している記事一覧

Amazon Web Services ブログ 新登場 – Amazon EC2 Mac インスタンスを使用した macOS、iOS、ipadOS、tvOS、watchOS アプリの構築とテスト
もともとの記事の日本語版。サービス開始に向けた担当者の思いはわかるものの、費用とかmacOS環境でどのあたりがカスタマイズされているのか(ソフトウェア的に)とか、実際に使うとどの程度の差があるのかといった情報はない。Macユーザーに対して「Amazonは敵じゃないんだよー」と訴えている以上の情報はない

Amazon EC2 Mac Instance を早速使ってみました
EC2の使い方がわかる記事。これを読まないと接続までの手順がわかりづらいものの、これを読んだからといってMac Instanceの実情がわかるというほどの情報量はない

macOSがクラウドで利用可能に――、AWSがMac Miniベースの「Amazon EC2 Mac Instances」を一般提供開始

文章書きのプロがいい感じにまとめている。「よくわからない人」向けにまとめた記事

AWSにMacインスタンスが追加。6コアCore i7搭載Mac miniをクラウドで利用可能に

ニュースリリースまとめただけ。書くのに30分もかけていない速報記事(たぶん)

AWSがMac miniのクラウド化を発表、Apple Silicon Mac miniの導入は2021年初頭か

サービス料金面では一番詳細な記事。Amazon EC2 Mac Instancesは秒単位で課金されるが、最低利用ラインが「24時間」になっているため、24時間を過ぎたら秒単位で課金計算されるということが明記されている

Posted in Network news | Tagged 10.14savvy 10.15savvy 11.0savvy | Leave a comment

Uni Detector v1.2.1がMac App StoreのUtility部門で28位

Posted on 11月 28, 2020 by Takaaki Naganoya

Uni Detector v1.2.1がMac App StoreのUtility部門で28位(瞬間最大風速)になりました。トータルでは、163位です。

# ニホン(Japanese Version)のMac App Storeだけでしょうか?

Mac App Storeのランキングはひんぱんに再計算されるため、見ている間に順位が37位になりました。儚い。

ランキングの上の方を見ると、Brotherさん(企業)のスキャンユーティリティが2位にいます。無料ソフトなのに、けっこういろいろ言われていてドキドキします。有償にしてもよさそうな雰囲気ではあるのですが、そのあたりの動向は見ものです。

macOS 10.15内蔵のZipライブラリがこれまでと異なり7-zip(分割アーカイブ対応)を使ったことでおかしな挙動を示すようになり、アーカイバに対しての需要が強いことを感じさせます。

あとは、ランキング上位でも「なにこれ?」というものもあったりで、(子供の作ったような電卓アプリには驚きました)なかなか驚かされます。

Posted in PRODUCTS | Tagged 10.13savvy 10.14savvy 10.15savvy 11.0savvy Uni Detector | 2 Comments

Uni Detector v1.2.1をリリース

Posted on 11月 27, 2020 by Takaaki Naganoya

ケアレスミスで、「Scroll BarをWindowの枠外に配置してしまった」Uni Detector v1.2のリテイク版、v1.2.1をリリースしました。


▲MacBook Air 11インチを基準に、このマシンで最低限の操作が行えることを想定したUser Interface

バージョン1.2以降のUni DetectorのAppleScript用語辞書には、「check arch」のコマンドしか用意していませんが、Sandboxのセキュリティを乗り越えつつ必要な機能(ユーザーによる任意の指定フォルダ以下のアプリケーションのチェック)を実現することが目的です。

本来のScriptableなアプリケーションの意義を考えると、アプリケーションのチェック結果をリストで取得するべきですが、さすがに無償配布アプリケーションでそれはやりすぎなので、実装を控えています。

AppleScript名:アプリケーションのプロパティを取得.scpt
tell application "Uni Detector"
  properties
end tell
–> {frontmost:false, class:application, name:"Uni Detector", version:"1.2.1"}

★Click Here to Open This Script 

AppleScript名:指定アプリケーションをUni Detectorでチェック.scpt
use AppleScript version "2.7" –macOS 10.13 or later
use scripting additions
use framework "Foundation"

set anApp to choose file of type {"com.apple.application-bundle"} with prompt "Select target one App"

with timeout of 3600 seconds
  tell application "Uni Detector"
    set aRes to check arch anApp
  end tell
end timeout

★Click Here to Open This Script 

AppleScript名:指定フォルダ以下にあるアプリケーションすべてをUni Detectorでチェック.scpt
use AppleScript version "2.7" –macOS 10.13 or later
use scripting additions
use framework "Foundation"

set anApp to choose folder with prompt "Select target Folder"
set appList to getFileListWithSpotLight("kMDItemContentTypeTree", "*com.apple.application*", anApp) of me

with timeout of 3600 seconds
  tell application "Uni Detector"
    set aRes to check arch appList
  end tell
end timeout

on getFileListWithSpotLight(aMetaDataItem, aParam, startDir)
  
  
set sDirText to quoted form of POSIX path of startDir
  
set shellText to "mdfind ’" & aMetaDataItem & " == " & aParam & "’ -onlyin " & sDirText
  
try
    set aRes to do shell script shellText
  on error
    return {}
  end try
  
set pList to paragraphs of aRes
  
set aList to {}
  
repeat with i in pList
    set aPath to POSIX file i
    
set aPath to aPath as alias
    
set the end of aList to aPath
  end repeat
  
return aList
end getFileListWithSpotLight

★Click Here to Open This Script 

Posted in Bug PRODUCTS | Tagged 10.13savvy 10.14savvy 10.15savvy 11.0savvy Uni Detector | Leave a comment

Uni Detector v1.2をMac App Storeに提出

Posted on 11月 26, 2020 by Takaaki Naganoya

Universal Binary Checker「Uni Detector」のバージョン1.2をMac App Storeの審査に提出しました。

目下、Universal Binary対応アプリの提出騒乱状態なので、審査側がパンクしないようにイージーモードの審査が続いており、平時では通らないようなバグがそのまま残っていたv1.1.1でした(これは自分のせいです)。

Uni Detector v1.2はまだUniversal Binaryではありません。1つには、macOS 11.0上でUniversal Binary化できることは確認ずみで、いつでも対応可能であること。その割に、ビルド環境をmacOS 10.14.6から移行するのには(Mac App Store向けビルド環境の移行)手間がかかること。あと、どうせAppleScriptで書いたアプリケーションなので、Universal Binary化してもスピードアップの恩恵が限定的である(ことが予想される)ためです。

Uni Detector v1.2はScriptableになりました。外部からAppleScriptでコントロール可能です。AppleScript用語辞書には、本Blog同様ワンクリックですぐに利用可能なScriptサンプルを掲載しています。

ただし、実装した「check arch」コマンドはユーザーのホームディレクトリ以下に置いたアプリケーションやネットワークサーバー上のアプリケーションなどをチェックしたいという需要に応えるための必要最低限のものであり、チェックした結果のデータをlistやrecordで返すものではありません。

さすがに、他のソリューションに組み込んだり連携可能なデータを返す機能については、発展機能を持つ有償版で対処したいところです。フリー版の機能はこの程度にしておきたいところ。

AppleScriptで作ったGUIアプリケーションにAppleScript用語辞書をつけて外部のAppleScriptから呼び出すというのは、ひどく本末転倒といいますか、豆から作った豆腐を崩してふたたび固めて作る日本料理の「ひろうす」のような感じといいますか、妙な感じがします(普通にGUIつけないでフル機能をAppleScriptだけで書けるのに、変に遠回りなやりかたです)。

あとは、小さい画面の環境でも「Mac CPU Architecture Trend」の図が見えるように、ポップアップで別途表示できるようにしました。

この表示を行うために、既存のViewの内容をPDFとして取得してPDFViewで表示しています。

些細なスペルミスを修正したり、Fileメニュー以下のコマンドが一切動作していないというバグを修正したり、CM表示機能を強化したりと細かい点の修正を行っています。

Mac App Storeに提出したアプリケーションをAppleScript対応にしたのは今回が初めてです。Store未提出のアプリケーションではScriptableにしたことはありますし、AppleScript LibrariesにAppleScript用語辞書をつけて配布したことはありますが、GUIアプリにAppleScript用語辞書をつけて配布したのははじめてのことです。

次は、本アプリケーションをUniversal Binary化するぐらいでしょうか。それで、ひとまず「しなくてはならないこと」は一段落だと思います。一部のマシンでSpotlight DBが壊れたままで運用しているものがあるらしく、それを強制的にプログラムから再生成する機能でも呼び出せたほうがよいかと思っていますが、はたして、、、、

Posted in PRODUCTS | Tagged 10.13savvy 10.14savvy 10.15savvy 11.0savvy Uni Detector | Leave a comment

Elgato Stream DeckをAppleScriptでフル活用

Posted on 11月 25, 2020 by Takaaki Naganoya


▲Stream Deck本を発売しました! 新刊「elgato STREAM DECK 徹底活用Mac+STREAM DECKで時短+作業効率化!!」

友人から実機を借りて、Stream DeckからAppleScriptを実行する方法について一通り確認しました。この場をお借りして、Sutohさんにお礼を申し上げます。

また、初期公開時の記事に対してコメントいただいたTechnocraft様に感謝申し上げます。このお二方の尽力なしには評価できなかったことでしょう。

本記事はフィードバックを取り入れ、初回掲載時からは大幅に書き換えてあります。


▲Stream Deckの「システム」>「開く」アクションに登録して、macOSのGUIアプリケーションのメニュー操作を簡単に行うツール「Piyo Menu Clicker」ベータ版の配布を開始しました

Stream Deckとは?

Elgatoが製造・販売している、キートップ画面つきの小型サブキーボードです。Mac本体とはUSB端子で接続します。キートップの内容をカラー液晶ディスプレイで表示しており、キータッチ時の実行内容やキートップ表示内容の差し替えがソフトウェアにより柔軟に行えるようになっています。

メカニカルキーで、キーストロークはありますが、キーボードというよりもゲームコントローラのような操作感です。ゲームに使えるかと言われれば、不可能ではないものの快適とも言い難い感じです。キーストロークが深めなので、連打が不可能とは言いませんが、格子状のキー配置がゲーム向きというよりも業務系コントローラ的な印象を受けます(ゲーム用にハードな利用をしたときの耐久性は未知数)。ゲームコントローラには専用のデバイスやフットスイッチを使った方がよいでしょう。そんなにお安くはありません。

また、キー自体がテンキーのような格子状に配置されており、本体にずいぶん厚みもあるため、これで高速に文章を打つのは(キー数も足りないですし)無理だと思います。専用の日本語入力プログラムを用意すれば、15キー程度でもメールの返信ぐらいは不可能ではなさそうです(そういう野望は別途持っています。評価期間中には完成しないぐらいの壮大な野望が、、、、)。

はるかかなた昔(2000年代前半)、すべてのキートップの内容をカスタマイズできるよう、各キートップに有機EL(OLED)を搭載した「Optimus Maximus」が発表され、長い年月を経たのちに19万円(当時)という価格で発売されたことを覚えている人もいるでしょう。Optimus Maximusのコンセプト自体は広く支持されたものの、実現方法に無理があったために、ひじょうに高価で巨大なものとなってしまいました(そして、スマートフォンやタブレットの登場により魅力と需要は減ってしまいました)。

Stream DeckはOptimus Maximusの基本コンセプトを踏襲しつつ、その欠点(複雑すぎるハードウェア)を見直し、現実的な価格に収めたものと見ることができます。同機では1枚ものの液晶画面の上に透明なキートップのハードウェアキーボードを並べることで同様の操作系を実現しています。

また、フルキーボードではなく、LCDボタン6個、15個、32個といった限定されたキー数の製品をラインナップし、業務現場における簡単ワンキー操作ソリューションといった市場をねらっているようです。「ライブコンテンツ作成コントローラ」といった少し不思議な名前がついていますが、それは映像中継の現場などで使って便利なようにソフトウェアの標準機能が整備されているためで、本来そのように用途が限定されるものではありません。

そのような現場では、照明が暗く、キーボードが発光すること自体に意義があります。また、スマートな操作系を少ない設置の手間で実現でき、有線接続で確実に動作する本製品は競合に対しての牽制を行う「見栄アイテム」として有効でしょう(意外と重要)。自動車の運転席にコンピュータのインタフェースを設置するとしたら、ベストな形態かもしれません。車載コンピュータインタフェースとしては、おすすめできそうです(自分、運転しないので具体的な使用例を紹介できませんけれども)。

アクションはStream Deckの複数のキーボードに対して別々の内容で設定することができ、Stream DeckのすべてのキーにAppleScriptを呼び出すアクションを(別々のScriptを呼び出すものを)登録しておくこともできます。各Profileは最前面のアプリケーションごとに自動変更させられるために「物理キーボード版のScript Menu」のような運用ができます。

アプリケーション起動アクションを割り振っておくと、「物理ボタンのあるアプリケーションランチャー」として利用でき、この使い方もけっこう便利です(外では使えないけど)。

機能固定のStream Deckと最前面のアプリケーションごとに機能を自動変更させるStream Deckの2台を並べておくと便利そうな気がします。

AppleScriptを呼び出してこそ魅力を引き出せるStream Deck

Stream Deckで呼び出せる機能は、Elgatoが用意しているソフトウェア上で、デフォルトのアクションを選択してStream Deck上の各キーに指定することで使えるようになります。このソフトウェアキーボード設定(Profile)は複数持つことができ、macOSのメニュー上から随時切り替えられます(このProfileの切り替え自体をStream Deckのキーから行う「Switch Profile」アクションもあります)。キー数が少ないとProfileをこまめに切り替える必要があるわけで、15キーモデルが実用最低レベルでしょう(6キーモデルは何のために?)。

純粋に文字入力キーとして割り当てることも可能ですが、複数の動作をワンキーで行ってくれることが望ましいところです。

複数のアクションを連続して実行する「Multi Action」アクションが存在するものの、やはりまとまった処理についてはAppleScriptで記述して実行できたほうが便利に思います。

AppleScriptをこのようなソリューションに利用する意義は、条件を考慮して処理を変更できることでしょうか。

ネットワーク上にいるマシンがSleepしているか稼働しているかをチェックして、稼働していたらYouTubeの再生を別マシンに引き継がせるといった処理は、AppleScriptならではのものです。

時間や日付から処理を変える(休日は実行しないなど)こともできてしまうわけです(曜日によっては定休日のため「出前注文アクション」を実行しないなど)。

標準装備のAppleScript実行アクション。「System > Open」

Elgatoが標準で用意しているStream Deckソフトウェアに、指定のAppleScriptを実行するアクションはとくに用意されているように見えません。

見えませんが、さんざん確認してみたところ、アクションのうち「System > Open」でAppleScript書類のうち「.scpt」形式(非バンドルAppleScript書類)と「.applescript」形式(テキスト形式のAppleScript)については関連づけたアプリケーション(デフォルトではスクリプトエディタ)ではなく、osascriptコマンドを使って実行されます。

アクション名:Open(標準装備)
ランタイム名:osascript
指定可能要素:アイコン画像、Title、AppleScript File
Script File Format:.scpt / .applescript
インターネット接続:不可
ダイアログ系の命令実行:可
"facetime-audio" URL event発行:OK
GUI Scripting利用許可:OK

唯一、「.scptd」形式のAppleScript書類のみ、関連づけたアプリケーション(デフォルトではスクリプトエディタ)でオープンされ、実行されることはありません(自分が普段使っているAppleScriptって.scptd形式ばっかりなんでひっかかりました)。


▲AppleScript書類の形式が「.scpt」と「.applescript」の場合は実行、「.scptd」の場合にはエディタでオープンされる「System > Open」アクション

この「System > Open」アクションで実行されるAppleScriptでは、Cocoaの機能やGUI Scriptingを呼び出せますし、GUI Scriptingの認証も取得できます(2回目以降の実行で認証ダイアログが表示されることはありません)。display dialogやdisplay notification、choose from listなどのダイアログ系のUIの表示も問題ありません。

オープンソースのAppleScript実行アクション。scptd形式が実行できる「RunAppleScript」

このStream Deckソフトウェアデフォルトの「System > Open」アクションとは別に、Github上でオープンソースの「streamdeck-applescript」プロジェクトが配布されており、これを簡単に導入できました。

streamdeck-applescript-masterフォルダ中の「Release」フォルダに、「com.mushoo.RunAppleScript.streamDeckPlugin」が入っているので(ビルド不要)、これをダブルクリックすると、streamdeck-applescriptプラグインがSTREAM DECK管理ソフトウェアに読み込まれます。

バンドル形式のScriptおよびフラットなscptファイル、あるいは単なるテキストで書かれたAppleScript(inline script)を指定できます。

アクション名:RunAppleScript(Githubからダウンロード)
ランタイム名:RunApplescript
指定可能要素:アイコン画像、Title、Script File / AppleScript(Inline)
Script File Format:scpt / scptd / text (Inline)
インターネット接続:不可
ダイアログ系の命令実行:不可
"facetime-audio" URL event発行:OK
GUI Scripting利用許可:OK

Elgatoが自社Webから提供しているStream Deckソフトウェア自体は、Sandbox化されているわけではないようですが、いろいろ(長大な)AppleScriptを突っ込んで実行してみたところ、一定の制限が存在していることがわかりました。

すぐに気がつく点は、display dialog、display alert、display notification、choose from listなどのダイアログ表示系のコマンドが効かないということ。Standard scripting additionsの利用が禁止されているのではなく、「LSUIElement=true」の設定による影響を受けているように見えます。この点、標準装備のOpenアクションのほうが気楽に使える感じです。

Stream Deckアプリケーションはアプリケーション形式のドライバ/設定ソフトウェアであり、Dockにアイコンを表示しない状態で動作します。そのため、ダイアログ系の通知を行えない状態であると推測されます。とはいえ、Cocoaの機能を呼び出してAlert Dialogを表示させるとあっさり表示するという「裏技」があります。

Stream Deckから「streamdeck-applescript」アクション経由で呼び出したAppleScriptでは、インターネットへのアクセスが許可されておらず、これが最大の制約項目でしょう(Openアクションも同様)。

Stream Deckアプリケーション自体はSandbox化されていないため、「streamdeck-applescript」自体の制約に見えます。同アクションの開発者がAppleScriptから直接インターネット接続してWeb APIを呼び出すような処理を考慮していなかったためにこのようになっているのか、あるいはStream Deckソフトウェア自体の制限であるかは不明ですが、現状ではそうした(よくある)処理が行えません。

確認してみたところ、Stream DeckソフトウェアのInfo.plistに「Allow Arbitrary Loads=true」のエントリがないために、プラグインおよびそこから呼び出されるAppleScriptではネットワークへのアクセスが行えないようです。これを配慮不足と受け止めるか、セキュリティ上の面倒ごとに巻き込まれたくないものと受け止めるか、そこまで考えていないものと取るかは個人の受け止め方次第でしょう。

Stream Deckの各ボタンにRunAppleScriptアクションを割り振って、Stream Deckのボタンを乱打すると、アクション呼び出しがバッファリングして実行されるため、(挙動としては正しいものの)やや扱いに困る印象を受けました。

つまり、コンピュータに関して知識の少ないユーザーがStream Deck上のキーを押して、すぐに反応がない状態だとキーを連打する可能性があり、連打された内容はバッファリングされ、キャンセルが効きません。

このあたり、呼び出すScriptですぐに何らかの視覚的なフィードバックをしつつ処理に入るなどのケアを行う必要性を感じました。コンピュータに関する知識の少ないユーザーに使わせるには注意が必要でしょう。AppleScriptを割り当てて実行させる場合でも、「ちょっとかじった」ぐらいのScripterでは、十分な配慮を行えないため、Stream Deckの「streamdeck-applescript」アクション経由で動くAppleScriptを書くのにはけっこうなスキルが必要とされるように感じられました。

活用例

facetime-audioで所定の相手に通話を行うAppleScriptを、相手の顔写真入りで登録すると、まるで内線電話感覚でオーディオ通話をかけられて便利でした。

実際に作ってはいませんが、Web経由で出前の注文を行うScript(そんなに難しくないもの)を書いておいて実行すると、「パエリア注文、1時間後に」といった運用ができて便利です。定休日には注文を実施せず、配達時間もシステムクロックから拾ってきた値をもとに指定できるため、とても実用的なものとなるでしょう。

よく行う、LAN上のファイルサーバーのマウントや特定のフォルダのオープンを行わせるのも便利でした。TimeMachineドライブのアンマウントなども便利でしょう。

フローティングパレット上からAppleScriptを実行できる、macOS標準搭載の「Switch Control」も便利ですが、それらのScriptをStream Deckに登録すれば、画面上の場所を占有されることなく同様にAppleScriptを(最前面のアプリケーションごとにProfile表示を切り替えて)実行できるので、道具としてコンピュータを便利に使いこなすという方向で、キートップの表示内容を変更できるハードウェアキーのソリューションは実用的であり、さまざまな作業の苦痛を緩和してくれるものであると感じます。

総合評価

こうしたAppleScriptを自分はいつもScript Menuから実行していますが、アイコンつきの物理ボタンから呼び出せるのは本当に便利です。

Stream Deck標準搭載アクションでは、メールの未読本数の表示などStream Deck上のボタン表示に対してカスタム内容をフィードバック表示させることが可能です。一方で、RunAppleScriptアクションでその機能は利用できないため、不満がないわけではありません。Scriptからネットワーク接続できないのも、REST APIやCDN上のJavaScript Libraryを呼び出しまくっている今日のAppleScriptの利用レベルからすると、世界観が狭すぎて不満が残ります。

活用は行えるものの、Stream Deck自体が価格相応かと言われると「見栄用途」に使わないかぎり疑問が残ります。

そんな向きには、iOS用のElgato Stream Deck Mobileアプリが用意されており、とりあえずiPhoneやiPadにインストールしてこれらのデバイスをStream Deckに見立て、Macの操作を試すことができます(よくできている、、、)。

ちなみに、iOSデバイスとMacの間の接続は無線で行われ(WiFi?)Stream Deck実機のように有線接続する必要はありません。1月あたり350円(無料で1か月のお試しあり)なので手軽に試せるでしょう。また、iOSデバイスとStream Deck実機は同時使用できるため、iOSデバイスを臨時の追加Stream Deckとして運用することも可能です。

Stream Deckのドライバはアプリケーションとして動作するため、Intel版ではありますがM1 Mac上でも問題なく動作することでしょう。

冒頭に「友人から借りた」と書いてあるとおり、本製品には自分に購入させるだけの何かがあるわけではありません。身の回りのさまざまな用途に活用できるものの、たいていは代替手段が存在します。

一方で、リアルなハードウェアキーによる操作が欠かせない用途も存在することでしょう。多忙な現場、つねにオーディオチャットを内線電話のように利用している現場、あまりコンピュータに詳しくないユーザーに対して定型作業を行わせるような用途には、ハードウェアキーによる操作はわかりやすく、導入しやすいことでしょう。

再来週あたり友人に返却する必要があるのですが、少し「惜しい」と思える程度の魅力はあります。使うかどうかはその人次第でしょう。

(注:本記事の転載やまとめを禁じます)

Posted in How To | Tagged 10.14savvy 10.15savvy 11.0savvy Streamdeck | 13 Comments

Uni Detectorのアイコンを変更!

Posted on 11月 16, 2020 by Takaaki Naganoya

Uni Detectorのアイコンを変更します。ウニ(Sea Urchin)のアイコンには個人的に思い入れも深く、この現行のアイコンも随分前に奥方様と一緒に行った寿司屋でデジカメで撮影したものです(8年ぐらい昔?)。

つまり、「どうせPowerPCからIntelに移行したんだし、10年ぐらいたったら再びCPUの移行はあるだろう」と読んで、ものすごく時間をかけてアイコン候補の写真を撮影するような、凝ったことをしていたわけです。

ただ、いろいろダウンロード状況を分析するに、U.S.のユーザーが全然食いつかない(大統領選が終わっても変化なし)。不思議なぐらい食いつかない。無料のアプリケーションという「撒き餌」にまったく食いつかない。食い気が感じられない。

なぜだろう? と、首をひねっていたのですが、われわれには美味しい食材にしか見えない海鮮丼の写真が、海外のユーザーにはグロい写真で嫌がらせをしているようにしか見えないのでは? という仮説に至りました。

その仮説をもとにSNS上で意見を募ってみたところ、

  「Dock上に置きたくないデザイン」
  「ハイコンテクストすぎてApp Store向けアプリには不向き」
  「そういうのは趣味でやれ」

という散々な結果に。

タイミングをねらって、必要な道具をピンポイントでリリース。ユーザーへの知名度の向上と、各種ソフトウェアの宣伝を意図した戦略的なソフトウェアが、アイコンというきわめて重要度の低い構成要素のために本来の役割を果たしていないものと判断。ここに、苦渋の決断をもってアイコンを無難なものに変更することといたしました。


▲新旧アイコン。右側が新しいアイコン(Appleにリジェクトされなければ)

Posted in news PRODUCTS | Tagged 10.13savvy 10.14savvy 10.15savvy 11.0savvy | Leave a comment

Uni Detector v1.1をMac App Storeで配布開始

Posted on 11月 14, 2020 by Takaaki Naganoya

Universal Binary判定ツール「Uni Detector」のv1.1をMac App Storeで配布開始しました。対象OSは、macOS 10.13以降です。ただし、macOS 10.13だと(ツールバーボタンのクリックからは)グラフ表示が行えない(メニューからはできる)ので、10.14と言いたいところです。


▲初代「うにばーさる」。久しぶりに引っ張り出してきたら動作して驚き。そして、Finder経由でファイル情報を取得しているので現行環境だと目が回るほど遅い(64bit化されたCocoa Finderでファイル処理を行うと劇遅)

v1.1では、主にmacOS 11.0, Big SurおよびApple Siliconへの言及を追加しました。

新規追加機能は、

・アプリケーションのフィルタリング機能:書類形式(ファイル拡張子)、カスタムURLプロトコルでフィルタ表示できます。HEIFをサポートしているアプリケーションの一覧を表示する、という絞り込み(フィルタ)表示や、URLプロトコル「http://」をサポートしているアプリケーションの一覧を表示することが可能です。

・選択中のアプリケーション情報表示機能:書類タイプ、ローカライズ言語一覧、サポートURLスキーム一覧表示

・各アプリケーションの情報表示機能:ターゲットプラットフォーム名表示(Apple Silicon Mac上にiOSアプリケーションをインストールした場合の識別用に)

・Scriptableなアプリケーション判定機能を強化:「えせScriptable」なアプリケーションの一覧データを保持し、AppleのiBooks Authorなどの「えせScriptable」なアプリケーションをAppleScript対応アプリケーションから除外する機能です。データリストを固定で保持して、「えせScriptable」なアプリケーションの除外を行っています

Posted in PRODUCTS | Tagged 10.13savvy 10.14savvy 10.15savvy 11.0savvy | Leave a comment

えせScriptable App

Posted on 11月 6, 2020 by Takaaki Naganoya

Macのアプリケーションの中には、Info.plistに「NSAppleScriptEnabled = true」の表記があっても、実際にsdefファイルが入っていなかったり、sdefが入っていても、まったくアプリケーションの機能と関係ないダミー辞書が入っているものがたまにあります。

これを、個人的に「えせScriptable」と呼んでいます。英語に翻訳しづらいですが、Fake Scriptable AppとかDummy Scriptable Appなどと呼ぶところでしょうか。

最悪の「えせScriptable」なアプリケーションはAppleのiBooks Authorでしょうか。電子書籍市場を立ち上げるためには、既存のInDesignなどの他のアプリケーションのデータをiBooks形式にScriptで変換できる必要があると思っていたところに「カス」なAppleScript用語辞書しか入っておらず、「プログラムで変換できないのかー」という落胆をもたらしました。

辞書内容がアプリケーションの機能とぜんぜん合っていない「えせScritable」。実際に、これらの用語を使っても、起動や終了ぐらいはできるものの、アプリケーション本来の機能は1つも呼び出せません。

GUI Scripting経由で無理やりメニュー操作やボタンのクリックは行えますが、これをもって「AppleScriptに対応している」とは言ってはいけないレベルです。

Chipmunk Basicの現行バージョンがScriptableで、本来はAppleScript用語辞書がバンドル中に入っているはずなのですが、確認してみたら入っていないことに気づきました。早速、作者のRon Nicholsonにレポート。さて、どうなりますやら。

現行のUni Detectorでは、これらの「えせScriptable」なアプリケーションも一律「Scriptable」として表示してしまうため、これらをScriptableではないものとして表示を抑止するために専用のデータをバンドル内に格納してチェックするかというところでしょうか。

Microsoft officeの補助アプリケーション類がScriptableな表示になっていますが、単独で起動ができないためにScriptableなアプリケーションの範疇に入れてはいけないところでしょう。ちょっと古めのアプリケーションで、AppleScript Studioで作られているものが存在しており、AppleScript用語辞書が入っているものも見られます。これも、外部からコントロールするための辞書ではないので、正確な意味では「Scriptable」ではありませんが、意外と多いのと古いものが中心なので放置しておいています。

com.nicholson.chipmunkbasic3co		1.368.21
com.kapeli.dashdoc	4.6.7
com.apple.Maps	*
com.apple.iBooksAuthor	*
com.peterborgapapps.Lingon3	*
com.peterborgapapps.LingonX7	*
com.adobe.devicecentral.application	*
com.readpixel.wakeonlan	*
com.bombich.ccc	*
com.microsoft.OrgChart	*
com.microsoft.myday	*
com.microsoft.office_pg	*
com.microsoft.Graph	*
com.microsoft.entourage.database_utility	*
com.microsoft.entourage.database_daemon	*
com.microsoft.outlook.databaseutility	*
com.microsoft.entourage.databasedaemon	*
com.microsoft.entourage.ClipGallery	*
com.microsoft.openxml.chart.app	*
com.microsoft.openxml.excel.app	*
com.microsoft.office.uploadcenter	*
com.microsoft.office.uploadcenter	*
com.tinyspeck.slackmacgap	*
org.mozilla.firefox	*
com.twitter.teitter-mac	*
com.nchsoftware.wavepod	*
com.nchsoftware.expressjp	*
com.digitalspokes.AppKiDo	*
com.parallels.mobile	*
com.epson.East-Photo-Scan	*
Posted in Bug sdef | Tagged 10.13savvy 10.14savvy 10.15savvy 11.0savvy | Leave a comment

ステータスバーアイテムの点滅

Posted on 11月 4, 2020 by Takaaki Naganoya

自分で作成したNSStatusItemを点滅させるAppleScriptです。

ステータスバーアイテムを動的に作成して、メニューを表示して簡易メニュー的なユーザーインタフェースをAppleScriptで作成することは、割とあります。

Xcode上で作成したCocoa AppleScriptアプリケーションでも、プログラムでステータスアイテムを作成することはあります。

とくに、Window表示とステータスバーのメニュー表示を切り替えた場合など、ステータスバーアイテムを点滅させて「表示を切り替えた」ことを表現したいケースがあります。

本件は、例によって前例が見つからず、自前でいろいろ調べていたのですが、わかってしまえば簡単でした。AppleScriptで前例が見つからないのは別にそんなもんですが、Objective-Cでも見つからないのはどうかと思います。

NSStatusItemからbuttonを取得でき、これにsetWantsLayer:trueを実行すると普通にCoreAnimationでアニメーション表示させることができました。

本Scriptはスクリプトエディタ、Script Debuggerなど動作環境をとくに選ぶことなく動作します。たぶん、Switch Controlから呼び出したAppleScriptでも動作するはずです。

自分は点滅させるぐらいで満足していますが、その他のアニメーションエフェクトもいろいろ試してみました。みましたが……メニューバーという狭い領域に表示する関係上、「表示させても目立たないアニメーション」(拡大縮小など)や、「そもそも指定してもアニメーションしないアニメーション」なども見られます。

本サンプルは絵文字を表示していますが、これはあくまで「タイトル」を点滅させているものです。別途、ステータスバーアイテムに「アイコン」を指定している場合でも問題なく点滅アニメーションの表示を行えています。

AppleScript名:ステータスバーアイテムの点滅.scptd
— Created 2017-03-03 by Takaaki Naganoya
— Modified 2018-02-15 by Shane Stanley–Thanks!!
— Modified 2018-02-15 by Takaaki Naganoya
— Modified 2020-11-04 by Takaaki Naganoya
use AppleScript version "2.5"
use scripting additions
use framework "Foundation"
use framework "AppKit"

property aStatusItem : missing value

on run
  my performSelectorOnMainThread:"init:" withObject:(missing value) waitUntilDone:true
end run

on init:aSender
  set aList to {"Piyomaru", "Software", "", "Takaaki", {"Yes", "No"}, "", "Machine", {"MacBook Pro", "MacBook Air", "Mac mini"}, "", "Quit"}
  
  
set aStatusItem to current application’s NSStatusBar’s systemStatusBar()’s statusItemWithLength:(current application’s NSVariableStatusItemLength)
  
  
aStatusItem’s setTitle:"🍎"
  
aStatusItem’s setHighlightMode:true
  
aStatusItem’s setMenu:(createMenu(aList) of me)
  
  
–Blink Status Bar Item
  
set aButton to aStatusItem’s button()
  
aButton’s setWantsLayer:true
  
my blinkObject:aButton withRepeat:10 withDuration:1.0 –OK
  
–my scaleObject:aButton withRepeat:10 withDuration:0.5 –OK
  
–my rotateObject:aButton forAxis:90 withRepeat:10 withDuration:0.5 –NG
  
–my moveObject:aButton withRepeat:10 withDuration:0.5–NG
end init:

on createMenu(aList)
  set aMenu to current application’s NSMenu’s alloc()’s init()
  
set aCount to 10
  
  
set prevMenuItem to ""
  
  
repeat with i in aList
    set j to contents of i
    
set aClass to (class of j) as string
    
    
if j is equal to "" then
      set aMenuItem to (current application’s NSMenuItem’s separatorItem())
      (
aMenu’s addItem:aMenuItem)
    else
      if (aClass = "text") or (aClass = "string") then
        
        
if j = "Quit" then
          set aMenuItem to (current application’s NSMenuItem’s alloc()’s initWithTitle:j action:"actionHandler:" keyEquivalent:"")
        else
          set aMenuItem to (current application’s NSMenuItem’s alloc()’s initWithTitle:j action:"actionHandler:" keyEquivalent:"")
        end if
        
        (
aMenuItem’s setTag:aCount)
        (
aMenuItem’s setTarget:me)
        (
aMenu’s addItem:aMenuItem)
        
        
set aCount to aCount + 10
        
copy aMenuItem to prevMenuItem
        
        
      else if aClass = "list" then
        –Generate Submenu
        
set subMenu to current application’s NSMenu’s new()
        (
aMenuItem’s setSubmenu:subMenu)
        
        
set subCounter to 1
        
        
repeat with ii in j
          set jj to contents of ii
          
          
set subMenuItem1 to (current application’s NSMenuItem’s alloc()’s initWithTitle:jj action:"actionHandler:" keyEquivalent:"")
          (
subMenuItem1’s setTarget:me)
          (
subMenuItem1’s setTag:(aCount + subCounter))
          (
subMenu’s addItem:subMenuItem1)
          
          
set subCounter to subCounter + 1
        end repeat
        
      end if
      
    end if
    
  end repeat
  
  
return aMenu
end createMenu

on actionHandler:sender
  set aTag to tag of sender as string
  
set aTitle to title of sender as string
  
  
if aTitle is equal to "Quit" then
    current application’s NSStatusBar’s systemStatusBar()’s removeStatusItem:aStatusItem
  else
    display notification (aTag as string)
  end if
end actionHandler:

on blinkObject:aObject withRepeat:aTimes withDuration:durationSec
  set animation to current application’s CABasicAnimation’s animationWithKeyPath:"opacity"
  
animation’s setDuration:durationSec –0.1
  
animation’s setAutoreverses:true
  
animation’s setRepeatCount:aTimes
  
animation’s setFromValue:(current application’s NSNumber’s numberWithFloat:1.0)
  
animation’s setToValue:(current application’s NSNumber’s numberWithFloat:0.0)
  
aObject’s layer()’s addAnimation:animation forKey:"blink"
end blinkObject:withRepeat:withDuration:

on scaleObject:aObject withRepeat:aTimes withDuration:durationSec
  set animation to current application’s CABasicAnimation’s animationWithKeyPath:"transform.scale"
  
animation’s setDuration:durationSec
  
animation’s setAutoreverses:true
  
animation’s setRepeatCount:aTimes
  
animation’s setFromValue:(current application’s NSNumber’s numberWithFloat:1.0)
  
animation’s setToValue:(current application’s NSNumber’s numberWithFloat:2.0)
  
aObject’s layer()’s addAnimation:animation forKey:"scale-layer"
end scaleObject:withRepeat:withDuration:

on rotateObject:aObject forAxis:anAxis withRepeat:aTimes withDuration:durationSec
  set animation to current application’s CABasicAnimation’s animationWithKeyPath:("transform.rotation." & anAxis)
  
animation’s setDuration:durationSec
  
animation’s setAutoreverses:true
  
animation’s setRepeatCount:aTimes
  
animation’s setFromValue:(current application’s NSNumber’s numberWithFloat:0.0)
  
animation’s setToValue:(current application’s NSNumber’s numberWithFloat:4.0 * 3.1415926)
  
aObject’s layer()’s addAnimation:animation forKey:"rotate-layer"
end rotateObject:forAxis:withRepeat:withDuration:

on moveObject:aObject withRepeat:aTimes withDuration:durationSec
  set animation to current application’s CABasicAnimation’s animationWithKeyPath:"position"
  
animation’s setDuration:durationSec
  
animation’s setAutoreverses:false
  
animation’s setRepeatCount:aTimes
  
animation’s setFromValue:(current application’s NSValue’s valueWithCGPoint:(aObject’s layer()’s position()))
  
animation’s setToValue:(current application’s NSValue’s valueWithCGPoint:(current application’s CGPointMake(320, 480)))
  
aObject’s layer()’s addAnimation:animation forKey:"move-layer"
end moveObject:withRepeat:withDuration:

★Click Here to Open This Script 

Posted in Animation GUI | Tagged 10.13savvy 10.14savvy 10.15savvy 11.0savvy CABasicAnimation NSMenu NSMenuItem NSNumber NSStatusBar NSValue | Leave a comment

アプリケーションが扱えるデータ拡張子を取得

Posted on 10月 28, 2020 by Takaaki Naganoya

指定のアプリケーションが扱えるデータ拡張子を取得するAppleScriptです。

アプリケーションバンドル内のInfo.plistの、CFBundleDocumentTypesエントリの中のCFBundleTypeExtensionsを拾ってリストで返します。用途は、このアプリケーションに表示させるためのものです。

ただ、この標準的といいますか一般的な処理でこのデータを拾ってこれないアプリケーション(凝った処理をしているもよう)がかなりの数存在し、それらについては個別に対応処理を書かないとダメっぽいです。

だいたい、AppleのiWork Appsが全滅。BBEditも独自の記述をしているらしく、Pixelmator Proも少し凝った書き方をしているもよう(Pixelmator Proが「凝っていない」部分なんてないみたいですが)。個別にInfo.plistからエントリをたどって拡張子リストを作るしかなさそうです。

OS内、具体的に言えばNSApplicationとかNSBundleにそういうInfo.plistをあさってこなくても対応ドキュメントデータ型を渡してくれるようなサービスがありそうな気がとてもするのですが、なかなか見つかりそうにありません。

あまりに対応が大変だった場合には、機能を盛り込むことを断念するかもしれません。メタデータから拾ってこれたりすると楽でよいのですが……。


▲結局、できた模様

AppleScript名:アプリケーションが扱えるデータ拡張子を取得.scptd
—
–  Created by: Takaaki Naganoya
–  Created on: 2020/10/28
—
–  Copyright © 2020 Piyomaru Software, All Rights Reserved
—

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

set aPath to POSIX path of (choose file of type {"com.apple.application-bundle"})
set aURL to (current application’s |NSURL|’s fileURLWithPath:aPath)
set exResList to getDocumentTypesExtensionsFromPath(aURL) of me

return exResList
–> {".INDD", ".INX", ".IDMS", ".INCD", ".INCX", ".ICML", ".INCA", ".ICMA", ".P65", ".T65", ".PMD", ".PMT", ".QXD", ".QXT", ".INDT", ".INDB", ".INDL", ".INLX", ".FLST", ".PRST", ".PDFS", ".joboptions", ".DCST", ".LNST", ".UDC", ".InDesignPlugin", ".PSET", ".SMRD", ".SMWT", ".IDML", ".IDPP", ".INDK", ".INLK", ".CSF", ".ASE", ".ACB", ".ACBL", ".IDPK", ".INJB", ".INRS", ".INCP", ".INDP", ".ICAP", ".IDAP", ".INMS", ".epub"}

on getDocumentTypesExtensionsFromPath(aURL)
  set aRes to getDocumentTypesFromAppURL(aURL) of me
  
  
set exRes to {}
  
repeat with i in (aRes as list)
    set j to (current application’s NSDictionary’s dictionaryWithDictionary:(contents of i))
    
set tmpExt to (j’s valueForKey:"CFBundleTypeExtensions")
    
    
if tmpExt is not equal to missing value then
      set tmpExt to tmpExt as list
      
repeat with ii in tmpExt
        set jj to "." & (contents of ii)
        
if (jj is not in exRes) and (jj is not equal to ".*") and (jj is not equal to ".???") then
          set the end of exRes to jj
        end if
      end repeat
    end if
  end repeat
  
  
return exRes
end getDocumentTypesExtensionsFromPath

on getDocumentTypesFromAppURL(aURL)
  set aBundle to current application’s NSBundle’s bundleWithURL:aURL
  
if aBundle = missing value then return {}
  
set aInfo to aBundle’s infoDictionary()
  
if aInfo = missing value then return {}
  
set aRes to aInfo’s objectForKey:"CFBundleDocumentTypes" –Document Types
  
if aRes = missing value then return {}
  
return aRes
end getDocumentTypesFromAppURL

★Click Here to Open This Script 

Posted in file File path | Tagged 10.13savvy 10.14savvy 10.15savvy 11.0savvy NSBundle NSDictionary NSURL | Leave a comment

Window表示とMenu表示を切り替える

Posted on 10月 26, 2020 by Takaaki Naganoya

Xcode上で記述するCocoa AppleScriptアプリケーションで、通常のWindow表示とステータスバーから呼び出すメニュー内に表示するスタイルの切り替えテストプログラムです。

macOS 10.14.6上でXcode 11.3.1を動かして確認しています。

–> Download toggleWindow.zip (Xcode Project Archive)

この機能は実際に使いたいと思っていたものの、なかなかうまく実装できていませんでした。

個人的に、GUIベースのアプリケーションを作っていると、環境設定まわりの機能を実際に組む段階でやたらと時間がかかって大変でした。

アプリケーションのメインウィンドウ上に表示している部品を環境設定ウィンドウにも同様に出す必要が出てくるわけで、その場合同じものを2度作ることは避けたいところです。通常表示している部品と、環境設定ウィンドウで表示する部品は同じものを使いまわしたいところです。

それをどのように共通化してGUI部品のかたまりを「使い回す」かについては、頭の痛い問題でした。なかなか過去形で表現するのがはばかられる状況ですが(未解決)、ここをクリアしないことには話になりません。

本テストプログラムでは、Window上に表示するビュー(NSView)とメニュー内に表示するビューに同じものを指定しています。これで、複数の場所に同じビューを使いまわしやすくなるだろうか、というところです。

NeXTstepにティアオフ・メニューという、メニューをドラッグ&ドロップするとメニューから切り離してフローティングパレットのように運用できる機能がありました。Macのアプリケーションでもこれを実装したものを見たことはありますが、使い勝手がいいかと言われると「それほどでも」といった印象でした

途中、NSMenuを閉じる処理で行き詰まっていたところ、Twitter上で@masakihoriさんに解決策を教えていただきました(aMenu’s cancelTracking())。ありがとうございます。

実際に、Window表示されているViewをメニューに入れてみたところ、いろいろ挙動が変わってくることを確認できました。ポップアップメニューについては操作できず、NSTabViewを配置して切り替えてみても、切り替えたことが内部のビューに通知されない様子。メニューに入れて使うべきではないと思われました。

テキストビューも、一応入力はできるもののコピー&ペーストなどの操作は行えません。もともと、メニューにテキストビューが入っていると違和感がすごいので、するべきではないでしょう。

セグメントビューについてはまともに使えますし、スライダーもまともに動作します。試してはいませんが、Date Picker(カレンダー表示)あたりが限界ではないでしょうか。WebViewもメニューに入れられると思いますが、どの程度インタラクティブに操作できるかについては未確認です。

本サンプルについて、当初はステータスバー上のステータスアイテムからPopoverを表示させようかと考えたのですが、menu bar extra(ステータスアイテム)からPopoverは表示できないんですね(Uni Detectorのときに実験してうまく行かず、github上で公開している人のコードも眺めてみましたが……上から下まで全部自前で作っているようでした)。

そのうえ、Appleからも「menu bar extra(ステータスアイテム)からPopoverを表示するんじゃねえ」と釘を刺されているとのことで、ステータスアイテムからメニューを表示、その中にカスタムビューを入れてみた次第です。

AppleScript名:AppDelegate.applescript
—
— AppDelegate.applescript
— Toggle Window test
—
— Created by Takaaki Naganoya on 2020/10/26.
— Copyright © 2020 Takaaki Naganoya. All rights reserved.
—

script AppDelegate
  property parent : class "NSObject"
  
  
— IBOutlets
  
property theWindow : missing value
  
property theView : missing value
  
property aButton : missing value
  
  
property aFlag : true
  
property aStatusItem : missing value
  
  
property aMenu : missing value
  
property bMenuItem : missing value
  
  
on applicationWillFinishLaunching:aNotification
    aButton’s setTitle:"–> Status Menu"
    
set aFlag to true
    
theWindow’s setContentView:theView
  end applicationWillFinishLaunching:
  
  
on applicationShouldTerminate:sender
    — Insert code here to do any housekeeping before your application quits
    
return current application’s NSTerminateNow
  end applicationShouldTerminate:
  
  
  
on clicked:aSender
    set aTag to (tag of aSender) as integer
    
    
if aTag = 100 then
      if aFlag = true then
        –通常Window表示→Menu表示
        
my makeStatusItem()
        
theWindow’s performClose:aSender
        
aButton’s setTitle:"–> Window"
      else
        –Popup表示→通常Window表示
        
        
bMenuItem’s setHidden:true
        
theView’s setHidden:true
        
aMenu’s cancelTracking()
        
        
theWindow’s setContentView:theView
        
theView’s setHidden:false
        
theWindow’s makeKeyAndOrderFront:aSender
        
        
current application’s NSStatusBar’s systemStatusBar()’s removeStatusItem:aStatusItem
        
        
aButton’s setTitle:"–> Status Menu"
        
        
–自分を最前面に
        
current application’s NSApp’s activateIgnoringOtherApps:true
      end if
      
      
set aFlag to not aFlag –Flip Flap
      
    else if aTag = 110 then
      display notification "Clicked 1"
      
    else if aTag = 120 then
      display notification "Clicked 2"
      
    else if aTag = 130 then
      display notification "Clicked 3"
      
    end if
    
    
  end clicked:
  
  
on actionHandler:aSender
    –Do nothing
  end actionHandler:
  
  
  
on makeStatusItem()
    –if aStatusItem = missing value then return
    
    
set aStatusItem to current application’s NSStatusBar’s systemStatusBar()’s statusItemWithLength:(current application’s NSVariableStatusItemLength)
    
    
aStatusItem’s setTitle:"🍎"
    
aStatusItem’s setHighlightMode:true
    
aStatusItem’s setDelegate:me
    
aStatusItem’s setAction:"statusclicked:"
    
    
set aMenu to current application’s NSMenu’s alloc()’s init()
    
    
set bMenuItem to (current application’s NSMenuItem’s alloc()’s initWithTitle:"" action:"actionHandler:" keyEquivalent:"")
    
bMenuItem’s setView:theView
    (
bMenuItem’s setTarget:me)
    (
aMenu’s addItem:bMenuItem)
    
    
aStatusItem’s setMenu:aMenu
  end makeStatusItem
  
  
end script

★Click Here to Open This Script 

Posted in AppleScript Application on Xcode | Tagged 10.13savvy 10.14savvy 10.15savvy 11.0savvy | 2 Comments

Finderファイルタグの設定、取得、クリア

Posted on 10月 23, 2020 by Takaaki Naganoya

Finderタグの削除(クリア)を行うAppleScriptです。

AppleScript名:Finderファイルタグの設定、取得、クリア
–Created By Shane Stanley
–Modified By Takaaki Naganoya
use AppleScript version "2.4"
use scripting additions
use framework "Foundation"

property |NSURL| : a reference to current application’s |NSURL|
property NSOrderedSet : a reference to current application’s NSOrderedSet
property NSURLTagNamesKey : a reference to current application’s NSURLTagNamesKey

set anAlias to (choose file)
clearTagsForPath(anAlias) of me –delete tags
set aRes to getTagsForPath(anAlias) of me –check

— clear all tags
on clearTagsForPath(anAlias)
  set aURL to |NSURL|’s fileURLWithPath:(POSIX path of anAlias)
  
aURL’s setResourceValue:{} forKey:(NSURLTagNamesKey) |error|:(missing value)
end clearTagsForPath

— get the tags
on getTagsForPath(anAlias)
  set aURL to |NSURL|’s fileURLWithPath:(POSIX path of anAlias)
  
set {theResult, theTags} to aURL’s getResourceValue:(reference) forKey:(NSURLTagNamesKey) |error|:(missing value)
  
if theTags = missing value then return {} — because when there are none, it returns missing value
  
return theTags as list
end getTagsForPath

— set the tags, replacing any existing
on setTagsForPath(tagList, anAlias)
  set aURL to |NSURL|’s fileURLWithPath:(POSIX path of anAlias)
  
aURL’s setResourceValue:tagList forKey:(NSURLTagNamesKey) |error|:(missing value)
end setTagsForPath

— add to existing tags
on addTagsForPath(tagList, anAlias)
  set aURL to |NSURL|’s fileURLWithPath:(POSIX path of anAlias)
  
— get existing tags
  
set {theResult, theTags} to aURL’s getResourceValue:(reference) forKey:(NSURLTagNamesKey) |error|:(missing value)
  
if theTags ≠ missing value then — add new tags
    set tagList to (theTags as list) & tagList
    
set tagList to (NSOrderedSet’s orderedSetWithArray:tagList)’s allObjects() — delete any duplicates
  end if
  
aURL’s setResourceValue:tagList forKey:(NSURLTagNamesKey) |error|:(missing value)
end addTagsForPath

★Click Here to Open This Script 

Posted in file Tag | Tagged 10.13savvy 10.14savvy 10.15savvy 11.0savvy | Leave a comment

Universal Binaryチェックツール「Uni Detector」をMac App Storeでリリース

Posted on 10月 21, 2020 by Takaaki Naganoya

Universal Binaryチェックツール「Uni Detector」をMac App Storeで無料リリースしました。macOS 10.13以降用です。私の作るものなので、すべてAppleScriptで記述してあります。

前作「うにばーさる」はPowerPCからIntelへの切り替え時に、AppleScript Studioで作りました。

「Uni Detector」はAppleScriptObjCで作成。いろいろこなれてきているのですが、商品にはなりそうにもなかったので(そんなにひんぱんにバイナリアーキテクチャを調べたい人はいない)宣伝用にフリー配布です。

# Macの販売店の店頭でデモするのには向いているかも?

バイナリ対応度を調べるだけのソフトウェアでは、一度試したらおしまいです。日常的にこのソフトウェアを使うと便利なよう、自分で使い込んでさまざまな機能を実装しました。アプリケーションのメタデータを読み込んで、しぼり込み検索してカテゴリごとのバイナリアーキテクチャ分布を調べられるようにしました。

また、Universalバイナリ対応のほかに「AppleScript対応度」の調査もこのアプリケーションの1つの大きなテーマにすえました。AppleScript対応度もカテゴリごとに調査できます。「Microsoft」や「Adobe」をキーワードに絞り込んで、アーキテクチャやAppleScript対応度を調査することも可能です。

Scriptableなアプリケーションの一覧を表示したり、選択中のアプリケーションのAppleScript用語辞書を表示させたり、とくに本Blog上のサンプルScriptを表示させる機能がよそには真似できないところでしょう。

一覧で選択したアプリケーション名をキーとして本Blogの記事を検索・表示させる「サンプルScript表示機能」。これだけのためにポップアップするミニWebブラウザを実装しています。

「Universal Binary」は、NeXT時代のMAB(Multi Architecture Binary)、FATバイナリを引き継いだもので、NEXTSTEP(正確には後継のOPENSTEP)時代にはx86(Intel)、68K(NeXT)、SPARC(Sun)、PA-RISC(HP)などの複数アーキテクチャ向けバイナリをまとめてパッケージ内に格納できていました。

当時は複数アーキテクチャ、複数環境をサポートするための技術と受け取っていましたが、Mac OS X上での使われ方は自社プラットフォームのCPU切り替えを円滑に行うためのもので……MAB/FATバイナリとはモノが同じでありながら運用の仕方が全然違いますね。

技術的には、ツールバー上のSegmented Controlで作ったボタンがmacOS 11.0上でどう見えるか、きちんと見えるのか、Betaのたびにコロコロ見え方が変わるので、そのあたりを回避したらどうなるのかとか、そういう実証試験を行なっています。

また、macOS 10.15以降でアプリケーションフォルダ(/Applications)の内容が、/Applicationsと/System/Applications/に分かれ、フォルダの内容をScriptから取得できないあたりで悩まされました。アプリケーションのアイコンをInfo.plist経由で取得できないケースも見られ(とくに、Apple純正アプリケーション)、そのあたりの対処も悩まされたところです(フリー配布なのに手間がかかりまくっていて大変です)。

Terminal.appのコントロールを行なったら一発リジェクトでしたが、スクリプトエディタのコントロールはいいんだ、へーという発見はありました(macOS 10.14で「execute」コマンドが削除されたので無害?)。アプリケーションのAppleScript用語辞書を表示させているだけなので、コントロールというレベルではありませんけれども。

Posted in news PRODUCTS | Tagged 10.13savvy 10.14savvy 10.15savvy 11.0savvy | Leave a comment

Pixelmator Proでアイコン書き出しv2

Posted on 10月 19, 2020 by Takaaki Naganoya

Pixelmator Proで1024×1024 pixelの画像をmacOSのアプリケーションアイコン素材用に各サイズにリサイズして連続書き出しするAppleScriptです。

Pixelmator ProのAppleScriptプログラミングコンテスト優勝賞品Pixelmator Pro。非破壊画像処理を行い、GPUベースの高速な処理を行うPixelmator Proを実務的な画像処理に使うとどんな感じなのか、いろいろ調べていたらアイコン書き出し用の複数同時解像度書き出し機能などはついていなかったので、さくっと作ってみました。

Photoshopを操作して各種解像度書き出しを行うよりも高速に感じます(厳密にベンチマークを計測したわけではないんですけれども)。

AppleScript名:Pixelmator Proでアイコン書き出しv2.scptd
—
–  Created by: Takaaki Naganoya
–  Created on: 2020/10/19
—
–  Copyright © 2020 Piyomaru Software, All Rights Reserved
—

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

set resolList to {1024, 512, 256, 128, 64, 32, 16}
set aTargFileBase to (choose file name with prompt "Select Export base name") as string

tell application "Pixelmator Pro"
  if (exists of document 1) = false then
    display dialog "There is no document" buttons {"OK"} default button 1 with icon 1
    
return
  end if
  
  
tell the front document
    set aWidth to width
    
set aHeight to height
    
    
if {aWidth, aHeight} is not equal to {1024.0, 1024.0} then
      display dialog "Wrong Image Size (1024×1024 required)" buttons {"OK"} default button 1 with icon 2 with title "Size Error"
      
return
    end if
    
    
repeat with i in resolList
      resize image width i height i resolution 72 algorithm bilinear
      
export to file (aTargFileBase & "_" & (i as string) & "x" & (i as string) & ".png") as PNG
      
undo
    end repeat
  end tell
end tell

★Click Here to Open This Script 

Posted in file Image | Tagged 10.14savvy 10.15savvy 11.0savvy Pixelmator Pro | 1 Comment

Unicode Checker

Posted on 10月 16, 2020 by Takaaki Naganoya

Unicode Checkerはアップデートを定期的にチェックして、文字のUnicode上の詳細な仕様を確認するためによく使っています。記事作成時のバージョンは1.22です。

一度、Unicode CheckerのAppleScript対応度については紹介したことがあったような気がしましたが、いま探してみたら見つかりません。2018年初頭にBlogが吹き飛んだときに一緒にお星様になってしまったものと思われます。

Unicode Checker自体の機能は文字情報のデータベース的なものなので、AppleScriptから操作してまとまった処理(大量のデータ処理)を行わせる必要はあまりなさそうですが、単に1つの文字のデータを別のアプリケーションから取り出して、それをUnicode Checkerに情報表示させるなどの「ドミノ倒し」的な処理を行わせるような用途に使う感じでしょうか。

おそらく開発側も、「こういう(AppleScript対応の)機能もウチは作れるよ」というデモとしてこの機能を実装したものと思われます。

AppleScript名:current code pointを指定して文字表示
tell application "UnicodeChecker"
  set current code point to "あ"
end tell

★Click Here to Open This Script 

AppleScript名:findコマンドのじっけん
tell application "UnicodeChecker"
  set aRes to find codepoint "200B" with including unihan definitions –UTF-16
end tell

★Click Here to Open This Script 

AppleScript名:現在表示中の文字(code point)を取得する
tell application "UnicodeChecker"
  properties of current code point
  
–> {bidi mirrored:false, containing plane:plane id 0 of application "UnicodeChecker", id:12354, line break:"ID", assigned:true, canonical combining class description:"Not_Reordered", unicode name:"HIRAGANA LETTER A", assigned to abstract character:true, code point type:Graphic, class:code point, bidi class description:"Left_To_Right", script name:"Hiragana", general category description:"Other_Letter", bidi class:"L", containing block:block "Hiragana" of application "UnicodeChecker", general category:"Lo", name:"あ", canonical combining class:0}
end tell

★Click Here to Open This Script 

AppleScript名:UnicodeCheckerでUTF-8の文字コードを得る
tell application "UnicodeChecker"
  get escaped representation of (deXHTMLized representation of "あ")
  
–> "%E3%81%82"
end tell

★Click Here to Open This Script 

AppleScript名:IDNA representationのテスト
tell application "UnicodeChecker"
  set aRes to IDNA representation of "愛" using IDNA 2008
  
–> "xn--vgu"
  
  
set aRes to IDNA representation of "愛" using IDNA 2003
  
–> "xn--vgu"
end tell

★Click Here to Open This Script 

AppleScript名:deIDNAized representationのじっけん
set aStr to "愛"

tell application "UnicodeChecker"
  set aRes to IDNA representation of aStr using IDNA 2008
  
–> "愛"
  
  
set bRes to deIDNAized representation of aRes
  
–> "愛"
end tell

★Click Here to Open This Script 

AppleScript名:deXHTMLized representationのじっけん
set aStr to "愛"

tell application "UnicodeChecker"
  set aRes to XHTML representation of aStr
  
–> "愛"
  
  
set bRes to deXHTMLized representation of aRes
  
–> "愛"
end tell

★Click Here to Open This Script 

AppleScript名:XHTML representation ofのサンプル v2
set aStr to "愛"

tell application "UnicodeChecker"
  set aRes to XHTML representation of aStr
  
–> "愛"
  
  
set bRes to XHTML representation of aStr with use decimal entities
  
–> "愛"
  
  
set cRes to XHTML representation of aStr without use decimal entities
  
–> "愛"
  
  
set dRes to XHTML representation of aStr with named entities
  
–> "愛"
  
  
set eRes to XHTML representation of aStr with converting low ASCII
  
–> "愛"
  
  
set fRes to XHTML representation of aStr without converting low ASCII
  
–> "愛"
end tell

★Click Here to Open This Script 


▲自分の作ったツール(Uni Detector)の中から、指定アプリケーションのサンプルScriptを表示させる機能を実装したので、ツールのためにひととおりサンプルを掲載してみる予定

Posted in Text | Tagged 10.14savvy 10.15savvy 11.0savvy Unicode Checker | Leave a comment

OSADictionaryViewの情報がない

Posted on 10月 12, 2020 by Takaaki Naganoya

macOS 10.10以降、通常のAppleScriptでもCocoaオブジェクトへのアクセスが許可されたため、macOSの中に存在するAppleScript系の機能への理解が深まりました。

正確にいえばOS X 10.6でXcode上のCocoa AppleScriptアプリケーション内でCocoaの機能が利用できたわけですが、やはり通常のAppleScriptの中で利用できると理解の度合いが違います。

そうしたCocoaなどのmacOSのAPIは数多くあり、今日ではPDF関連の処理など専用のアプリケーションを使わずにたいていの処理ができるようになり、Web上のREST APIを自在に呼び出せるようになり、各種画像フィルタ処理や機械学習までAppleScriptから呼び出せるようになりました。Cocoaの機能が呼べなかった時代に戻れと言われたら途方に暮れてしまうレベルで日常的な風景になりました。

そんなmacOS側の機能に、AppleScript系の機能が用意されています。

大きく分けると、

①Cocoa系のOSAKit。AppleScriptを実行したりOSAコンポーネント情報を取得するなどの機能。AppleScriptから日常的によく使っています。

②AppKit内のNSAppleScript。AppleScriptの実行を行うための部品と、プロセス間通信のAppleEventsまわりの機能です。このあたりはAppleScriptからは手が出ません。

③Carbon系のOpenScripting。AppleScript言語処理系そのものといってよいでしょう。まったく手が出ません。

などの機能の所在がわかっています。Xcode上から調べるとヘッダーファイルも調査できて、どのようなメソッドが揃っているかも確認できます。

これらの他に、割とメジャーそうな機能なのにヘッダーファイルも何も一切公開されていないオブジェクトがあります。

それが、AppleScript用語辞書の表示関連のOSADictionaryViewとOSADictionaryControllerです。

これについては、不思議と情報が何もありません。あたりをつけて、「おそらくPathかURLをコントローラーに渡して初期化するとViewに表示するんだろう」と試しているのですが、まったく歯が立ちません。


▲macOS 10.14.6+Xcode 11.3.1の組み合わせで、OSADictionaryViewをドラッグ&ドロップで部品配置すると、その瞬間にXcodeがクラッシュ(事前にプロジェクトにOSAKit.frameworkをinclude)。この環境にはNSBrowserなど同様の瞬間クラッシュを引き起こす部品がある。macOS 10.15上では修正されているため、10.14上での対処は行わないとAppleから明言されました

とりあえずは、いつものアラートダイアログ上でOSADictionaryViewを表示して、指定のsdefファイルを表示するレベルからはじまって、GUIアプリケーション上でSDEF表示機能を実装するところがゴール地点でしょうか。失敗を重ねながら何度も調査やテストを行うことになります。

OSADictionaryView/OSADictionaryControllerの情報があったところで、これが使い物になるのかどうかという疑問があります。

OSADictionaryViewが使えたとして、それはsdefファイルのパスなりURLを渡して表示させるようなものになると想像されますが、このsdefに外部のファイルをincludeするような記述ができるようになったことで、「対象アプリケーションが実際に起動しないとAppleScript用語辞書全体を取得することができない」という状況に。

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE dictionary SYSTEM "file://localhost/System/Library/DTDs/sdef.dtd">
<dictionary xmlns:xi="http://www.w3.org/2003/XInclude">
	<!-- We override some standard commands to add several optional properties. -->
	<suite name="Standard Suite" code="????" description="Common classes and commands for all applications.">
		<xi:include href="file://localhost/System/Library/ScriptingDefinitions/CocoaStandard.sdef" xpointer="xpointer(/dictionary/suite/node()[not((self::command and (@name = 'open')) or (self::class and (@name = 'window')))])"/>

▲最近のMicrosoft Officeアプリケーションでは、sdefのサイズ縮小のためかxi:includeの記述が見られる

Adobeのアプリケーションには、sdefファイルを起動後にプログラムで生成しているものもあるため、起動前の状態でsdefファイル単独でブラウズできてもあまり意味がないケースが生じてしまいます。

つまり、Viewを単体で利用できても不十分かつ部分的なAppleScript用語辞書しか表示できないのではないか? という疑問を持つわけです。


▲1:17秒あたりでToolbar上のコマンドからAppleScript用語辞書の表示を行わせています。これは、Script Editorに辞書の表示を行わせる処理です

実際、スクリプトエディタに指定アプリケーションのAppleScript用語辞書を表示するような命令は行えるので、結局はそちらを使うことになるのではないかと考えるものです。苦労して使い方を突き止めたとしても、実用性がなかったら残念なことです。そして、その可能性がきわめて高そうな気配がしているのです。

Posted in GUI OSA | Tagged 10.14savvy 10.15savvy 11.0savvy | Leave a comment

LAN上の別のMacでYouTubeムービー再生をハンズオーバー v2

Posted on 10月 8, 2020 by Takaaki Naganoya

Safariの最前面のウィンドウで再生中のYouTubeムービーの情報を取得し、LAN上の別のMacで再生を引き継ぐ(ハンズオーバーする)AppleScriptです。

macOS 10.13以降、リモートAppleEvents経由でGUIアプリケーションを直接操作する機能が復活しました(Mac OS X 10.7〜10.12ぐらいまでAppleScriptアプレット間のみリモート通信が許可されていた状態)。

メインマシンで再生中のYouTubeムービーを、LAN上の他のマシンに引き継がせてみました。再生を引き継がれる方のマシンでは、システム環境設定の「共有」で「リモートApple Events」の項目をオンにしています(自分のマシンではすべてこの項目をオンにしています)。

(1)リモートマシン上のユーザーのパスワード

AppleScript書類のコメント(Finderコメント)にパスワードを書いておくと、それを読み取って使用するようにしてみました。

(2)リモートマシン上のSafariの起動

リモートマシン上のアプリケーションの操作は、ただリモートマシン上のアプリケーションを指定すればOKなのですが、操作対象のアプリケーションが起動していない場合にはエラーになります。これは、とても困る仕様です。

そこで、リモートマシンのFinder経由でアプリケーションファイルをオープンすることで、リモートマシン上でSafariを起動します。オープン対象をapplication file “Safari”と指定するとエラーになりますが、application file id “com.apple.Safari”と指定するとエラーになりません。

(3)YouTubeで再生中の情報取得

以前調査しておいた内容をそのまま使っています。再生中ならPauseし、再生中の位置(時間)情報を取得し、文字列で指定するために加工してYouTubeのURLに追加しています。URLの加工部分は少々手抜きをしています。

とくに問題なく、メインマシンから他のマシン(macOS 10.15.7/macOS 11.0beta9)にLAN経由で再生をハンズオーバーできました。

実際に、コントロール先のマシン名(Bonjour名)をremoteMachineNameに、ユーザー名をremoteUserNameに、パスワードを実行するAppleScript書類のFinderコメントに書き込んで実行してください。スクリプトエディタ上でもスクリプトメニューからでも問題なく実行できています。

あとは、Safari上のYouTube再生をフルスクリーンで行えるとよいのですが、少し試した範囲ではできなかったので、また地道に調べておく感じでしょうか。

AppleScript名:LAN上の別のMacでYouTubeムービー再生をハンズオーバー v2.scpt
—
–  Created by: Takaaki Naganoya
–  Created on: 2020/10/08
—
–  Copyright © 2020 Piyomaru Software, All Rights Reserved
—

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

property |NSURL| : a reference to current application’s |NSURL|
property NSMetadataItem : a reference to current application’s NSMetadataItem

set remoteMachineName to "MacMini2014.local"
set remoteUserName to "maro"

–ScriptのCommentに書いておいたパスワードを拾って使う
set mePath to (path to me)

–FinderからCommentは拾えるが、メタデータ経由で取得する処理も試してみた
set remoteUserPass to getFinderComment(POSIX path of mePath) of me

tell application "Safari"
  if running then
    tell front document
      set aURL to URL
      
–最前面のウィンドウがYouTubeの場合のみ処理
      
if aURL does not start with "https://www.youtube.com/" then
        display notification "エラー: YouTubeを再生していないため、ハンズオーバーしませんでした"
        
return
      end if
      
      
–再生中のポジションを取得
      
set tRes to (do JavaScript "document.querySelector(’#movie_player video’).currentTime;")
      
      
–再生状況を取得
      
set pRes to (do JavaScript "document.querySelector(’#movie_player video’).paused;")
      
      
if pRes = false then
        –再生中であればPauseする
        
set aRes to (do JavaScript "document.querySelector(’#movie_player .ytp-play-button’).click();")
      end if
      
      
openYouTubeOnRemoteMachine(remoteUserName, remoteUserPass, remoteMachineName, tRes, aURL) of me
    end tell
  end if
end tell

–指定のリモートマシン上のSafariでYouTubeの指定ムービーの指定箇所からの再生を行う
on openYouTubeOnRemoteMachine(remoteUser, remotePass, remoteMachineLocal, newDuration, newURL)
  set remoteMachineName to "eppc://" & remoteUser & ":" & remotePass & "@" & remoteMachineLocal
  
  
–URLの加工。ちょっと手抜きをした
  
if newDuration is not 0 then
    set tText to retTimeText(newDuration) of me
    
if newURL contains "&" then
      set sepChar to "?"
    else
      set sepChar to "&"
    end if
    
    
set newURL to newURL & sepChar & "t=" & tText
  end if
  
  
using terms from application "Safari"
    tell application "Safari" of machine remoteMachineName
      if not running then
        –起動していなかったらあらためてSafariを起動
        
launchRemoteSafari(remoteMachineName) of me
      end if
      
      
try
        close every document
      end try
      
      
set aWin to make new document
      
      
tell aWin
        set URL to newURL
        
–フルスクリーン再生をためしてみたが、こういう書き方ではなかった模様(URLオープンを待つ必要もある)
        
–set aRes to (do JavaScript "document.querySelector(’#movie_player playFullscreen’).click();")
      end tell
      
    end tell
  end using terms from
end openYouTubeOnRemoteMachine

–リモートマシン上でSafariを起動する
on launchRemoteSafari(aMachine)
  using terms from application "Finder"
    tell application "Finder" of machine aMachine
      open application file id "com.apple.Safari"
    end tell
  end using terms from
end launchRemoteSafari

–数値を「h」「m」「s」でフォーマットして返す
on retTimeText(aTime)
  set aHour to aTime div 3600
  
set aMinute to (aTime – (aHour * 3600)) div 60
  
set aSeconds to (aTime mod 60)
  
  
set aString to ""
  
  
if aHour > 0 then
    set aString to aHour & "h"
  end if
  
  
if aMinute > 0 then
    set aString to aString & (aMinute as integer) & "m"
  end if
  
  
if aSeconds > 0 then
    set aString to aString & (aSeconds as integer as string) & "s"
  end if
  
  
return (aString as string)
end retTimeText

–Finderコメントをメタデータ経由で取得
on getFinderComment(aPOSIX)
  set aURL to |NSURL|’s fileURLWithPath:aPOSIX
  
set aMetaInfo to NSMetadataItem’s alloc()’s initWithURL:aURL
  
set metaDict to (aMetaInfo’s valuesForAttributes:{"kMDItemFinderComment"}) as record
  
if metaDict = {} then return ""
  
set aComment to kMDItemFinderComment of (metaDict)
  
return aComment
end getFinderComment

★Click Here to Open This Script 

Posted in Internet JavaScript Remote Control | Tagged 10.13savvy 10.14savvy 10.15savvy 11.0savvy Finder NSMetadataItem NSURL Safari | 14 Comments

AppleScriptによるクリップボード処理

Posted on 10月 6, 2020 by Takaaki Naganoya

Classic Mac OSの頃は「しかたなく」クリップボードを使って行う処理がありましたが、最近(Mac OS X移行後)では極力使わないようにしています。文字コード変換、スタイル付きテキストのプレーンテキスト化などクリップボードを経由しないとできない処理がたくさんありました。画像の形式変換ですらクリップボードを経由して処理していた記憶があります。

仕方なく使っていましたが、「なんでこれしきの処理でクリップボードを経由しないといけない?」と不満だらけでした。クリップボードを経由する処理があるということは、人間がGUI経由で作業をしている裏で動かすScriptを作りにくくなるということです。クリップボード処理を多用していた頃のAppleScriptのプログラムは、絶対に人がマシンに手を触れないようにして動かす必要がありました(最前面のアプリケーションを変更してしまうと処理が破綻するなど)。

クリップボード経由の処理は確実さという意味で100%といえませんし、挙動が非同期っぽくて、値が反映されるまでに時間差があるため、クリップボードの内容変更をAppleScript側から監視して反映されるまでループで待つなどのケアが必要になります。

また、クリップボードを利用する方法によって100倍以上も差が出ます。遅い方法を選択すると、遅いばかりではなく信頼性もいまひとつです。

(1)Cocoa Scripting

Cocoaの機能を呼び出して、クリップボード(ペーストボード)の操作を行います。多彩な機能を呼び出すことができ、スピードも最速です。ただし、初回実行時のみ遅くなる傾向があるのと、HDD搭載機では極端に遅くなる場合がある(SSD必須)ので注意が必要です。

(2)AppleScript内蔵標準コマンドを利用

クリップボードにデータを入れる「set the clipboad」、クリップボードからデータを取り出す「the clipboard」、クリップボードの情報を取得する「clioboard info」などがあります。スピードも遅くないのですが、本コマンドでクリップボード内容を捕捉できるまでに(クリップボードの内容が反映されるまでに)若干時間がかかります。

(3)do shell scriptコマンド経由でpbcopyコマンドを実行

shell commandの「pbcopy」「pbpaste」を呼び出して実行します。可もなく不可もなく。スピードは(1)(2)にくらべると10倍以上遅いですが、問題にはなりにくいでしょう。ただ、これをあえて使う状況が考えられません。

(4)GUI Scripting経由でメニュー操作してコピー/ペースト

もっとも遅くて信頼性のない方法です。最速の①や②にくらべると、100倍以上も遅くなります。信頼性もなく、あまり多用できないため、本当に最後の最後に部分的に使うぐらいです。AppleScriptからは生成できないオブジェクトをアプリケーションの書類上で移動させる場合などに、仕方なくGUIを操作してコピー&目的の場所(別のページなど)でペーストを行うような感じでしょうか。それでも、各オブジェクトを逐一コピー&ペーストするのではなく、まとめてコピー&まとめてペーストすべきでしょう。コピー&ペーストの回数を減らすことが安全動作につながります。

その他、クリップボードを用いた処理を行う場合には、処理の最初にクリップボード内容を退避しておき、処理後に退避内容を戻すなどのケアも必要になります。


▲(c)秋本治、集英社

注:AppleScriptの書類形式が通常形式かバンドル書類形式かで実行速度に差が出ることはありません。ただし、アプリケーション内部のメニューやフォルダアクション、SwitchControlなどの各実行環境において「通常形式のみ。バンドル形式は受け付けない」といった制約が生じることはあります。実行速度については、Automatorやショートカット上のAppleScript実行アクションで動かすと、とりわけ遅くなります

AppleScript名:①ASOCでクリップボード操作.scpt
–Created 2015-08-03 by Shane Stanley
use AppleScript version "2.4"
use scripting additions
use framework "Foundation"
use framework "AppKit" — for NSPasteboard

my restoreClipboard:{"ABC"}

–クリップボードに内容を設定する
on restoreClipboard:theArray
  — get pasteboard
  
set thePasteboard to current application’s NSPasteboard’s generalPasteboard()
  
  
— clear it, then write new contents
  
thePasteboard’s clearContents()
  
thePasteboard’s writeObjects:theArray
end restoreClipboard:

★Click Here to Open This Script 

AppleScript名:②set the clipboardコマンド.scptd
—
–  Created by: Takaaki Naganoya
–  Created on: 2020/10/06
—
–  Copyright © 2020 Piyomaru Software, All Rights Reserved
—

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

set the clipboard to "ABC"

★Click Here to Open This Script 

AppleScript名:③do shell script経由でpbcopy.scptd
—
–  Created by: Takaaki Naganoya
–  Created on: 2020/10/06
—
–  Copyright © 2020 Piyomaru Software, All Rights Reserved
—

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

do shell script "echo ’ABC’ | pbcopy"

★Click Here to Open This Script 

AppleScript名:④GUI Scripting経由でメニュー操作.scptd
—
–  Created by: Takaaki Naganoya
–  Created on: 2020/10/06
—
–  Copyright © 2020 Piyomaru Software, All Rights Reserved
—

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

activate application "Safari"
tell application "System Events"
  tell process "Safari"
    click menu item "コピー" of menu 1 of menu bar item "編集" of menu bar 1
  end tell
end tell

★Click Here to Open This Script 

Posted in Clipboard | Tagged 10.13savvy 10.14savvy 10.15savvy 11.0savvy | Leave a comment

Post navigation

  • Older posts
  • Newer posts

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

Google Search

Popular posts

  • 開発機としてM2 Mac miniが来たのでガチレビュー
  • macOS 15, Sequoia
  • 指定のWordファイルをPDFに書き出す
  • Pages本執筆中に、2つの書類モード切り替えに気がついた
  • Numbersで選択範囲のセルの前後の空白を削除
  • メキシカンハットの描画
  • Pixelmator Pro v3.6.4でAppleScriptからの操作時の挙動に違和感が
  • AdobeがInDesign v19.4からPOSIX pathを採用
  • AppleScriptによる並列処理
  • Safariで「プロファイル」機能を使うとAppleScriptの処理に影響
  • Cocoa Scripting Course 続刊計画
  • macOS 14.xでScript Menuの実行速度が大幅に下がるバグ
  • AppleScript入門③AppleScriptを使った「自動化」とは?
  • Keynote/Pagesで選択中の表カラムの幅を均等割
  • デフォルトインストールされたフォント名を取得するAppleScript
  • macOS 15 リモートApple Eventsにバグ?
  • Keynote、Pages、Numbers Ver.14.0が登場
  • macOS 15でも変化したText to Speech環境
  • AppleScript入門① AppleScriptってなんだろう?
  • macOS 14で変更になったOSバージョン取得APIの返り値

Tags

10.11savvy (1101) 10.12savvy (1242) 10.13savvy (1391) 10.14savvy (587) 10.15savvy (438) 11.0savvy (283) 12.0savvy (212) 13.0savvy (194) 14.0savvy (147) 15.0savvy (132) CotEditor (66) Finder (51) iTunes (19) Keynote (117) 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) 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
  • 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年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