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

月: 2020年11月

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

個人的に嫉妬をおぼえるほどナイスアイデアのソフトウェア

Posted on 11月 20, 2020 by Takaaki Naganoya

「やられた!」と、感じるソフトウェアに出会うことはたまにあります。なんで自分では思いつかなかったんだろう、くやしい、これは自分が作るべきだったソフトウェアだ。でも技術力と発想力で勝てていない。素直に賞賛するしかない。

そういう目で見てしまうソフトウェアが何本かあります。それが、ものすごいヒットを叩き出してセールスをあげた、というわけでもないんですが、それでも羨ましいという気持ちはあります。

# この項目、あとから追記するかもしれません。

UI Action

PFiddlesoftの旧称「Prefab UI Action」といったか……GUI版のFolder Actionみたいなソフトなんですが、所定のアプリケーションのメニューなどのGUI部品を監視・実行するAppleScriptを設定できるツールです。つまり、各アプリケーションのGUI操作を横取りして、AppleScriptを実行させるというものです。

同様のことができないかと考えていたので、「やられた!」と、叫んでしまいました。

ただ、これができたらできたで、セキュリティ的にとても問題になりそう(知らないうちにアプリケーションの挙動が変えられてしまう)なのと、どのマシンにも同じソフトウェアとScriptをインストールしておけるわけでもないので、運用性がいまひとつだと感じました。

これは過去最大の「一本とられた!」と感じる嫉妬のスマッシュヒットでした。完敗です。

Siri

2000年代前半にはAppleScriptで同様のプログラムを実現していたので、とても「やられた!」と感じましたが、けっこうみんな同じようなことを考えていろいろ作っていたので、出し抜かれても仕方ないといえば仕方ないですね。予想どおりサーバー側で音声認識を行うなど、しかるべき努力をまっとうに行ったシステムという印象です。

さらに、自分たちで試作したソフトウェアでは住所録データやスケジュールデータが充実していないと、ほとんど意味がないし使っていても面白くないことがわかっていました。それがまさか、SNSなどの発達により個人データがネットを通じて住所録にたまっていく環境が出来上がっていくなど、普及の前提条件がクリアされていたことには気づきませんでした。外部環境が変わりつつあることを敏感にキャッチできていなかったというべきでしょうか。

ただ、実際に使ってみると「日常的にこれといって便利な用途がない」とも感じます。とんがっていないマイルドな味付けなので、(自分には)ささらない感じです(激辛希望)。

Retrobatch

Flying Meat SoftwareのRetrobatch。画像処理専門に特化したAutomatorという感じです。

Automatorのダメダメさ加減に業を煮やして作ろうと思ったのか、自分ならもっとすごいものが作れるぜ! と、思ったのかAutomatorを反面教師としたアプリケーションはいくつも存在します。

Cocoa APIの仕様を眺めていると、だいたいこういう感じのものが作れることはわかります。でも、それを実際に形にするのはまったく別の話。個人的にものすごく羨ましく妬ましいソフトウェアです。

とくに、CoreMLのパワーを利用して「なんとなくこんな感じの処理」をバッチ中に組み込めるというのが、うらやましすぎるポイントですね。それ、自分もいろいろ研究している部分なので。この方面の処理は、実際に作ってみると思い通りに動かないし、実現できたからといって評価されるわけでもないという微妙な位置付けと難易度なので、ついついそんなに真剣に考えないものなんですが、きちんと動いて役立つレベルに仕上げて売っているのはすごいと思います。尊敬します。

手元にあるアプリケーションのうち、CoreMLのモデルをアプリケーション内に格納してあるのは、Pixelmator ProとこのRetrobatchだけでした。

Posted in How To | Leave a comment

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

macOS 11.0, Big Sur AppleScript関連の変更点

Posted on 11月 13, 2020 by Takaaki Naganoya

ついにmacOS 11.0, Big Surが正式リリースされました。これほどリリースが待ち遠しく、リリースを恐れていたOSバージョンもありません。機能的にはいいのに、見た目がアレな、ある意味「次世代のmacOSのPublic Beta」みたいな位置付けです。バージョン0.xから始まるのも初めてですし。1.0未満だと受け取っておきましょう。

→ その後、マイナーアップデート版が「11.1」であることが判明し、今後は「12.x」「13.x」とiOSライクなナンバリングが施されることがうかがわれます。

ハードウェア面では「M1搭載のファンレスのMacBook AirがCore i9のCPUを蹂躙する図」が展開されているなど絶好調ですが、ソフトウェア面ではいろいろ(見た目に)問題があります。

macOS 11.0.1について、AppleScript的には大きな違いはありません。大きな違いというのは、macOS 10.15からの大きな違いということです。10.15のあまりの不具合の多さに、β段階で「毒の沼」認定してメイン環境で利用することを放棄したため、個人的には11.0にすぐ移行したいところです(検証用のMac mini 2014しか対応ハードウェアがない問題)。

macOS 11.0搭載のAppleScriptはあいかわらずバージョン2.7。スクリプトエディタもビルドが少し変わったぐらいでバージョンは同じです。

スクリプトエディタのヘルプが、macOS 10.13、10.14、10.15と毎回更新されていましたが、今回はその余裕がなかったのか10.15, Catalinaのままです(あとでオンライン更新されるのかも???)。

毎回、OSのアップデートがあるたびに書き換えの必要があるScriptが出てきます。すべてのScriptが必要というわけではないはずですが、理由は大きく分けると以下のとおりです。

(1)Script専用補助アプリケーションやOS標準装備のアプリケーションの機能に変化が生じたり、名前が変わったり、統廃合されたりした
(2)AppleScriptの言語処理系、標準装備のScripting Additionsや標準命令に新たなバグが発生した
(3)OS自体の仕様変更、未知のバグが発生した
(4)GUI ScriptingでメニューなどのGUI部品を指定している箇所が、GUI修正などの理由によりそのままでは動かなくなった
(5)Cocoaの仕様変更により動かなくなったり修正が必要になった

スクリプトエディタのsdefの差分をチェックしてみたところ、macOS 10.14/10.15から変化はありません。つまり、今回は(1)(2)由来の発生の可能性は低いことが期待されます。(4)は当然そうなるものなので(些細な変更で発生するものなので)、必要最低限の箇所に使うべきものです。(5)は、Cocoa自体の仕様変更は割とひんぱんに発生しているので、なんともいえませんが、Cocoa自体に仕様変更やバグがなくてもScripting Bridge定義ファイルのバグや理不尽な変更(主にmacOS 10.13で発生した件。一切説明なし)によって影響を受ける可能性はあります。

カレンダー.appのバンドル内に同梱された大量のAppleScriptもβ時からそのままです。

(何か発見があったら追記)

アプレットのプロパティが保持されない件:理由=(3)

LateNight Software Blogに掲載された「BIG SUR: LOST PROPERTIES」をGoogle翻訳で読んでみました(ちょっと時間がないので)。

macOS 11.0, Big SurではスクリプトエディタでAppleScriptアプレット書き出しを行うと、

Arm 64/Intel 64のUniversal Binaryで書き出されます。

そして、アプレット書き出し時にCode Signが自動的に行われ(Run Localy)、Apple Developer IDを持っていなくても実行バイナリにCode Signされることになります(Notalizationはまた別)Code Signされるということは、アプレットの情報書き換えが保持されなくなるということであり、property文で設定値を維持しようとしても、実行ごとに内容がフラッシュされる(保持されない)ことになります。

このことはmacOS 10.10ごろから「そういう風になるんだろう」とわかっていたので、property文で設定値を保持するような書き方は一切してきませんでした。設定保存の必要があればUser Defaultsへ書き込み。

サードパーティのOSAX(Scripting Additions)が廃止されることはOS X 10.6の頃からわかっていましたし、OS X 10.10の頃からpropertyで値を保持してはいけないことはわかっていました。

AppleScript Studioランタイムがdeprecated扱いに:理由=(3)(5)

最新の「兆し」は、PowerPC→Intel→Apple Siliconと3世代にわたってメンテナンスされてきた「AppleScript Studioランタイム」(Automatorアクションでこれを使っているものがある)が、いよいよdeprecated扱いになったことです。

もともと、OS X 10.6のときにXcode上から開発用のテンプレートが削除されたためにAutomator Action作成時に積極的にAppleScript Studioの機能を使おうとも思わないのですが、これまで維持され続けてきたというわけです。あれだけの規模のものを、OSのGUI部品が変更され続けていく中メンテナンスしてARM対応まで行なって破棄するとは……自分がその仕事に携わっているならやり切れないものがありますが、既定路線ではあります。

今後、macOS上で実行できるAutomator ActionはAppleScriptObjCベースのものに一本化される、ということです。

ファイル共有のプロトコルがsmbに一本化:理由=(3)

この話が出てきたのが何回目だか覚えていませんが、ファイル共有のプロトコル「afp」が使えないようになりました。「smb」のみです。

LAN上の他のマシンやファイルサーバー、NASのボリウムをマウントする処理は割とありふれたものですが、そのためのサーバーの指定方式がsmbに一本化されたという「変化」があったということです。

ファイルサーバーのマウント処理を記述してあるScriptについては、macOS 11.x以降では書き換えの必要があります。

AppleScript書類(.scpt)アイコンがプレーンテキストを示すアイコンに変更:理由=(3)

なんなんでしょうね? これは、、、ミスなのか、意図があるのか。

System Eventsの機能変更:理由=(2)

これだけ機能が変わっていたらバージョン番号を変更してほしいところです。
→ 同じバージョン番号のまま大幅に機能が変更されたSystem Events

System Eventsの動作状態の変更:理由=(3)

OSが起動して他のGUIアプリケーションを操作可能な状態になって久しい状態だというのに、System Eventsに対する操作を行おうとしたら、プロセスが起動していないといったエラーが表示されました(macOS 11.3 beta3)。

launchコマンドでSystem Eventsの起動を明示的に行うことで、問題なく操作できましたが、System Eventsに明示的にlaunch操作を行わなくてはならなくなったようです。リリースノートに記載すべきレベルの変更が加わっているように感じます。

NSStringのstringWithFormat:を呼び出すとクラッシュ:理由=(3)

こんな基礎的な箇所でバグを作られるとウンザリします。また、使っている箇所が多過ぎてウンザリします。このバグのせいで、Mac App Storeで配布しているUni DetectorのCPUアーキテクチャ別のグラフ表示機能を実行すると(macOS 11.x台、11.5より前では)クラッシュしていました。
–> macOS 11.5で修正されました。macOS 11.0〜11.4の間、この機能がまともに動いていなかったわけです。AppleScriptのプログラムは、macOS 11に対しては最新のバージョン以外はサポートしないということになるでしょう。

AppleScript名:stringWithFormatのじっけん.scptd
—
–  Created by: Takaaki Naganoya
–  Created on: 2021/06/19
—
–  Copyright © 2021 Piyomaru Software, All Rights Reserved
–  本Scriptを実行すると、Intel Mac/Apple Silicon Macの両方でクラッシュします

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

set dTemp to "chart.data = [{
\"label\": \"Apple Silicon\",
\"value\": %@,
\"color\": chart.colors.next()
}, {
\"label\": \"Intel 64 bit\",
\"value\": %@,
\"color\": chart.colors.next()
}, {
\"label\": \"Intel 32 bit\",
\"value\": %@,
\"color\": chart.colors.next()
}, {
\"label\": \"PowerPC 64 bit\",
\"value\": %@,
\"color\": chart.colors.next()
}, {
\"label\": \"PowerPC 32 bit\",
\"value\": %@,
\"color\": chart.colors.next()
}];"

set ppc32Count to 1
set ppc64Count to 2
set intel32Count to 3
set intel64Count to 4
set arm64Count to 5

set aDataStr to current application’s NSString’s stringWithFormat_(dTemp, arm64Count, intel64Count, intel32Count, ppc64Count, ppc32Count) as string

★Click Here to Open This Script 

NSString’s StringWithFormat:をmacOS 11で実行すると100%クラッシュ

Posted in Bug news | Tagged 11.0savvy | 2 Comments

Apple iWork Appsがv10.3.5にアップデート

Posted on 11月 13, 2020 by Takaaki Naganoya

AppleのiWork Appsがv10.3.5にアップデートしました。対象OSはmacOS 10.15以降です。

Keynote v10.3.5のAppleScript用語辞書のexport optionのmovie codecに「H.264」を指定するための定数が前バージョンから引き続き「h.264」になっています。バグ未修正状態です。

これでは、AppleScriptの構文確認をパスできません。AppleScriptの予約語としてこのような記号を途中に入れられないのですが、まるっきり動作確認もバグの所在も認識していない様子です。

みんながUIのお手本にしてきたKeynoteも、今回の10.3.5でこの体たらく。とくにツールバーアイコン。いきなり無色アイコンに変えられて(しかも小さい)、とても使いにくいというか、見えません。

まるでAppleから嫌がらせをされているかのようです。KeynoteのUIをまともにした互換アプリケーションでも誰か出さないだろうかと考えてしまいます。

Posted in Bug | Tagged 10.15savvy 11.0savvy Keynote | Leave a comment

システム負荷の小さなAppleScript記法

Posted on 11月 12, 2020 by Takaaki Naganoya

主に、AppleScript Studioの時代に起こったことですが、巨大なプログラムを書いていると、原因不明の異常事態に直面することがよくありました(PowerPCの時代)。

Xcode上でAppleScriptで書いたプログラムのコンパイルが通らず、Xcodeがクラッシュ。1行追加しただけでクラッシュするほどで、その追加した内容に文法的な間違いはありません。AppleScript Studioには本当に煮え湯を飲まされました。

Mac OS X 10.5の時代に「ようやく安定したか、デバッグ機能は使えないけど」と思っていたら廃止されて、Mac OS X 10.6でAppleScriptObjCに入れ替え。できることが増えたのであまり文句は言いませんでしたが、今度はドキュメントやサンプルが1つもない状況。自分がGUIアプリケーションをXcode上で書いて、Mac App Storeにアプリケーションを出せる(審査でいちゃもんがついてもかわすことができる)のも、Shane Stanleyをはじめとする先人の積み重ねがあったからこそです。

AppleScript Studioの時代に原因不明のトラブルのすえプロジェクトが瓦解した苦い経験をもとに、AppleScriptの処理系に負荷をかけない(たぶん)プログラミングを心がけるようになりました。

1行に記述する構文要素を最低限に

1行に多くの内容を詰め込むと、クラッシュやコンパイルエラーなどの原因になりやすいと感じています。本Blogに掲載しているプログラムは、1行に複数の処理を詰め込むことを極力避けています。可読性を高めるためにこう書いている、という側面もありますが……本来の目的は構文解析時のシステム負荷を最小限に抑えることにあります。

逆に、システム負荷の小さい書き方をしないと、巨大なAppleScriptのプログラムは開発途中でクラッシュを頻発する可能性があります。

構文解釈上、問題のある文字を使わない

行を書き分けする継続記号(Continuation Mark)が入っていると、行数が増えたときに謎のコンパイルエラーが発生するケースがあります。とくに、プログラムの行数が少ない場合にはエラーにならないのに、行数が増えるとエラーを引き起こします(何度も経験しました)。自分のプログラムに極力、継続記号(Continuation Mark)が入っていない理由はこれです。不等号もやや怪しいので、問題が出たら大小比較の不等号は英単語に展開しています。

if文などのネスティングの段数を減らす

つい、if文の条件を何段もネスティングして表記することがありますが、これをやると大規模なプログラムを記述したときに原因不明のクラッシュを引き起こします。

1ファイルに記述する行数を減らす

このあたりから普通のプログラミング言語っぽい話になりますが、1本で1万行といった巨大なAppleScriptを書かず、複数のScriptに分けて構文確認を通せるようにしています。目安は1,000行ぐらいなんですが、GUIをつけたプログラムだとイベントハンドラ処理部分とかGUI部品とバインディングしているプロパティ宣言部分などを外せないので、ついつい巨大になってしまいがちです。

ほかにも、言語処理系的にマイナーな仕様の表現を書かないとか(as anythingあたり)いったところでしょうか。

そうした書き方をフィードバックしてあるのが本Blog掲載のプログラムリストです。日本語環境で動作確認してあるので、中国語や韓国語の環境でも問題を引き起こす危険性が低くなっています。当然、英語などの言語圏で問題が出る可能性はさらに低いものとなります。

Posted in How To | Leave a comment

macOS 11.0.x Big Surが11/13にリリース、ARM Mac発表

Posted on 11月 11, 2020 by Takaaki Naganoya

予告されていたとおり、Apple Silicon(M1)搭載のMacが紹介され、macOS 11.0.1 Big Surの正式リリースが11/13(日本時間)と発表されました。11.0.1 Release Candidate 2が開発者向けにリリースされています。

Apple SiliconのMac版である「M1」を搭載したMacBook Air(ファンレス)、MacBook Pro 13インチ(USB x2の下位モデル)、Mac miniです。見た目や名前は変更されていません。

これまでのCPU移行と異なり、MacBook Air/MacBook Pro 13インチ/Mac miniともにIntel版を併売。

メモリが8GB/16GBとなっており、これはRAMをCPUに内蔵して高速処理させる(Unified Memory)ためにある程度「大容量メモリは搭載できないだろう」と予想されてきました。逆に、Intel Macよりも搭載メモリーが少なめでも効率的に動作することも予想していました(実際に動かさないとわからないですが)。


▲事前に予想していたARM Mac移行の概要

今回発表されたモデルの中にMac miniが入ってきたことは驚きでしたが、ほかは事前のリーク情報どおりです。

M1搭載機種のスピードについては実際に試してみないとなんとも言えません。Appleに自信はあると思われますが、今回の機種については初心者やよくわかっていない人が手を出すと「こんなはずじゃなかった」ということに。

初物M1 Macの注意点は、プリンタドライバや周辺機器(オーディオインタフェースなど)のデバイスドライバです。現状でIntel Mac用のドライバしか公開されていないため、少し古めのプリンタを利用している場合には工夫が必要になります(LAN上にプリンタをつないだ別のMacを用意し、フォルダアクションを用いて他のApple Silicon Macから書類をドラッグ&ドロップして印刷実行)。

macOS 11.0 Big Surについて、自分が確認している範囲ではおかしな動作が若干あります。iOSアプリケーションが動作するはじめての世代のmacOSなので、Mac OS Xでいえば「Public Beta」同然です(OSバージョンが0.x台ではじまるのはこれが初?)。

macOS 11.0 Big Surは、よくいえばmacOS 10.15 Catalinaの機能継続版。悪くいえばCatalinaで「なにこれ?」というおかしな仕様(PDFViewでPDF内のURLリンク処理が厳密すぎて使い勝手が落ちるなど)がそのままということです。

macOS 11.0から、AppleScriptは「iOSアプリケーションをコントロールする」という新たな課題を抱えることになります。現状ではGUI Scripting経由でしか操作できないはずなので、そのmacOS上の「異物」をどのように操作するか、そのノウハウの蓄積が必要です。

Posted in news | 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

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

Google Search

Popular posts

  • macOS 13, Ventura(継続更新)
  • アラートダイアログ上にWebViewで3Dコンテンツを表示(WebGL+three.js)v3
  • UI Browserがgithub上でソース公開され、オープンソースに
  • macOS 13 TTS Voice環境に変更
  • Xcode 14.2でAppleScript App Templateを復活させる
  • 2022年に書いた価値あるAppleScript
  • ChatGPTで文章のベクトル化(Embedding)
  • 新発売:AppleScriptからSiriを呼び出そう!
  • iWork 12.2がリリースされた
  • 従来と異なるmacOS 13の性格?
  • 新発売:CotEditor Scripting Book with AppleScript
  • macOS 13対応アップデート:AppleScript実践的テクニック集(1)GUI Scripting
  • AS関連データの取り扱いを容易にする(はずの)privateDataTypeLib
  • macOS 13でNSNotFoundバグふたたび
  • macOS 12.5.1、11.6.8でFinderのselectionでスクリーンショット画像をopenできない問題
  • ChatGPTでchatに対する応答文を取得
  • 新発売:iWork Scripting Book with AppleScript
  • Finderの隠し命令openVirtualLocationが発見される
  • macOS 13.1アップデートでスクリプトエディタの挙動がようやくまともに
  • あのコン過去ログビューワー(暫定版)

Tags

10.11savvy (1101) 10.12savvy (1242) 10.13savvy (1390) 10.14savvy (586) 10.15savvy (434) 11.0savvy (277) 12.0savvy (185) 13.0savvy (55) CotEditor (60) Finder (47) iTunes (19) Keynote (98) NSAlert (60) NSArray (51) NSBezierPath (18) NSBitmapImageRep (20) NSBundle (20) NSButton (34) NSColor (51) NSDictionary (27) NSFileManager (23) NSFont (18) NSImage (41) NSJSONSerialization (21) NSMutableArray (62) NSMutableDictionary (21) NSPredicate (36) NSRunningApplication (56) NSScreen (30) NSScrollView (22) NSString (117) NSURL (97) NSURLRequest (23) NSUTF8StringEncoding (30) NSView (33) NSWorkspace (20) Numbers (56) Pages (37) Safari (41) Script Editor (20) WKUserContentController (21) WKUserScript (20) WKUserScriptInjectionTimeAtDocumentEnd (18) WKWebView (23) WKWebViewConfiguration (22)

カテゴリー

  • 2D Bin Packing
  • 3D
  • AirDrop
  • AirPlay
  • Animation
  • AppleScript Application on Xcode
  • beta
  • Bluetooth
  • Books
  • boolean
  • bounds
  • Bug
  • Calendar
  • call by reference
  • Clipboard
  • Code Sign
  • Color
  • Custom Class
  • dialog
  • drive
  • 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
  • Machine Learning
  • Map
  • Markdown
  • Menu
  • Metadata
  • MIDI
  • MIME
  • Natural Language Processing
  • Network
  • news
  • Noification
  • Notarization
  • Number
  • Object control
  • OCR
  • OSA
  • 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)
  • 未分類

アーカイブ

  • 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