Archive for the 'ASDictionary' Category

2015/01/09 Keynote, Pages, Numbersがアップデート。AppleScript用語辞書は変更なし

Keynote、Pages、Numbersがアップデートされ、それぞれ、

 Keynote:Version 6.5.2
 Pages:Version 5.5.2
 Numbers:Version 3.5.2

となりました。マイナーバージョンアップであり、セキュリティ関連のみのアップデートで、AppleScript用語辞書には変更はありません。

毎回、例によってAS Dictionary(Now, By MugginSoft)でAppleScript用語辞書をHTMLに(AppleScriptで)書き出しして、FileMergeでdiffをとって用語辞書の差分を検出しており、今回は変更が検出されませんでした。

keynote.png

pages.png

numbers.png

2014/10/29 ASDictionary v0.13.4がMuggin Softからリリース

appscriptプロジェクトの遺産とも呼ぶべき「ASDictionary」。AppleScript対応アプリケーションの用語辞書をHTML形式で書き出すツールとして日々利用しています。

どう利用しているかといえば、辞書をHTML書き出ししておいて、バージョンごとの差分を求める際に使っています。別にHTML書き出ししていなくても、sdefファイル同士で差分を求めてもよさそうなところですが・・・Webにすぐ掲載できるとかいったメリットから、HTMLで書き出して蓄積しています。

dicthtml.png

diff.png

公式に配布されているASDictionary v0.13.1は、最終更新日が2011年1月9日。
なんと、OS X 10.10, Yosemiteにアップデートするとうまく動きません(AppleScriptからコントロールしての辞書書き出しができなかった)。

少々困っていたところ、Muggin SoftからOS X 10.8上で動作するようにビルドし直したとおぼしき、ASDictinary v0.13.2が配布されているのを見つけました

mugginsoft.png

ダウンロードしてみたら、バージョン番号が若干あがってv0.13.4。

asdictionary.png

おそらく、オープンソースで開発されてきたASDictionaryのv0.13.2がOS X 10.8対応、v0.13.3が10.9対応、v0.13.4で10.10対応ぐらいの・・・ビルドし直しぐらいの手直しを行われたものと思われます。

Muggin Softが管理しているASDictionaryもオープンソースで、ソースが公開されています。

とりあえず、OS X 10.10上で起動して、AppleScriptから操作できるASDictionaryが存在しているということです。

追記:いろいろ使ってみたところ、OS X 10.10上でASDictionaryでASDictionary自体のAppleScript用語辞書をHTML書き出しすることはできないようです。

2012/06/20 Sandbox対応したiTunes 10.6.3の挙動の変化

iTunes 10.6.3はこれまでにリリースされたiTunesとは若干挙動が変わっていることを確認していました。どこが違うのかといえば、Mac OS X 10.6.8および10.7.4上でASDictionaryを使ってAppleScript用語辞書をHTMLに書き出すことができないという点です。

もともとASDictionaryは、「appscript」ベースのscript開発のために、AppleScript用語辞書を異なる言語(RubyとかPythonとか)のフォーマットでHTML書き出しすることを目的として作成されたものでした。OSやアプリケーションのバージョン間のAppleScript用語辞書差分検出のために使うというのは、本来のASDictionaryの目的とは異なる用途といえます(すごく役立っています)。

asdic.png

appscriptとは、アプリケーションの操作をRubyやPythonなどの言語処理系に提供するためのもので、AppleScriptの枠組みとは異なる仕組みでAppleScriptと同様の機能を他の言語処理系に提供するためのもの。同じ処理を行うにしても「AppleScript上で処理するよりも速い」といった評判がありました。また、AppleScript自体を習得しなくても、RubyやPythonの知識があればアプリケーションのコントロールが行えるという、RubyやPython系開発者にとってのメリットも存在しました。

appscript自体の将来性について多角的に考察・検討した時期もあったのですが、これがApple純正の枠組みではないため、「将来のOSアップデート時に動かなくなる可能性が高い」と考えられたのと、あくまで極地的な動きでありApple内部やアプリ開発者全体に波及するものではない、という結論に。

国内のScripterとの間で議論も行ったのですが、やはり「すべてを置き換えるためのコストが大きすぎる」点が懸念されました。日本国内はともかく、海外ではAppleScriptに慣れ親しんでいるユーザーやソリューションデベロッパーが大量に存在しているため、いまさらゼロから教育を行うための膨大なコストをAppleが支払うことはしないだろうというのが理由の1つ。

また、アプリケーションを外部からコントロールするタイプの一般的なAppleScriptは言うに及ばず、アプリケーション内に埋め込んで使っているAppleScriptや、アプリケーション独自のScript Menu内から呼び出すタイプのAppleScriptなどなど、OS・アプリケーション内のいたるところに存在しているために、それらをすべて移行させるのは無理(コストに見合わない)だろうという話になりました。

実際、appscriptの仕組み自体がCarbon Apple Event Managerという古いOSのAPIを利用したものであったため、Carbon Apple Event ManagerがMac OS X 10.6以降でサポートされないことがAppleによって表明されると、appscriptの開発およびサポートは中止となりました

appscript1.png

先日、「iTunes 10.6.3 changes AppleScript interface?」と題した海外のBBSの投稿があり、appscript経由でiTunes 10.6.3上の選択状態にあるトラックの情報(AppleScriptでいうところのselection)の取得が行えないという話が出ていました(iTunes 10.6.3上のselectionの取得はAppleScriptからは問題なく行えます)。

このケースでは、すでにサポート外になったCarbon Apple Event Managerを呼んでいるappscriptを利用していること自体が問題ですし、そういう問題が発生しても文句を言えた種類のものではないでしょう。

一方で、ASDictionaryがCarbon Apple Event Managerを用いてAppleScript用語辞書にアクセスしているのか、あるいはSandboxの仕組み上、アプリケーションファイルへのアクセスが限定されたためにHTML書き出しが(Mac OS X 10.6および10.7上で)できないのか、そのあたりははっきりとはしませんが……これから登場してくる「Sandbox化されたアプリケーション」の挙動が、ターゲットOS(Mac OS X 10.8, Mountain Lion)上とそれ以前のOS(10.7, 10.6)上で異なってくる可能性があることを意識する必要があることでしょう。

2012/03/24 インストールされているアプリのAS辞書を書き出すv2

2011/05/02 AS辞書ぜんぶHTMLに書き出し v3

AS Dictionaryで、Apple純正のデフォルトインストールされているアプリケーションの用語辞書をHTML書き出しするAppleScriptです。

Mac OS Xの新バージョンなど、内容や動作確認を行っておく必要がある場合に、インストール直後のOSに対してデフォルトでインストールされているアプリケーションやOSAXのAppleScript用語辞書を一括でHTML書き出ししておきます。

書き出したHTML書類は、FileMergeを使ってdiff表示を行い、機能の変更点を割り出すのに使います。とくにβ段階のOSでは個別の機能変更について詳細なガイダンスが出ているわけではないため、こうしたツールで変更点を推測することが重要です(こうした方法論が確立できていなかった頃は、OSのバージョンアップのたびにひどい目に遭っていました)。

Apple純正アプリ/OSAXの辞書書き出し……といっていますが、書き出し対象としてとくにApple純正アプリに限っているわけではないため、すでに実運用段階で(Apple純正以外の)アプリが大量に入っている環境においては、何かの対策を講じておく必要がありそうです。

スクリプト名:AS辞書ぜんぶHTMLに書き出し v3

set outPath to choose folder with prompt “AS辞書HTML書き出し先フォルダを選択”

tell application “ASDictionary” to launch

set apList to getScriptableAppPathList() of me

set ngList to {} –処理実行時にエラーになったアプリケーション/OSAXのパスが入る

–メインループ
repeat with i in apList
  set j to contents of i
  
if j is not equal to {} or j is not equal to “” then
    
    
–アプリケーションファイルの情報を取得
    
tell application “Finder”
      set aInfo to info for j
      
set sVer to short version of aInfo
      
set sVer2 to prepareShortVersionStringNum(sVer) of me
      
set sVerStr to replaceText(sVer2 as string, “.”, “”) of me
      
set prodName to displayed name of aInfo
    end tell
    
    
set outPathStr to (outPath as string) & prodName & ” “ & sVerStr & “.html”
    
    
    
–HTML書き出し
    
set htmlRes to false
    
tell application “ASDictionary”
      set exRes to export j to outPath using file formats {single file HTML} using styles {AppleScript} with showing hidden items without compacting classes
      
      
if success of (first item of exRes) = false then
        –Export失敗時
        
set the end of ngList to j
      else
        
        
–Export成功時
        
set htmlRes to true
        
set outFile to destination of (first item of exRes)
      end if
      
    end tell
    
    
    
–書き出したHTMLのリネーム
    
if htmlRes = true then
      tell application “Finder”
        tell file outFile
          set aName to name
          
          
–書き出したHTMLファイルにバージョン番号を反映させる
          
set bName to replaceText(aName, “-AS.html”, (” “ & sVerStr & “.html”)) of me
          
set name to bName
        end tell
      end tell
    end if
  end if
end repeat

ngList –書き出せなかったアプリの一覧

–デフォルトでインストールされているAS対応アプリケーションのリストを取得する
on getScriptableAppPathList()
  set apFol to path to applications folder
  
set utilFol to path to utilities folder
  
set sysFol to ((path to system folder) as string) & “Library:CoreServices:”
  
set sysLibFol to ((path to system folder) as string) & “Library:ScriptingAdditions:”
  
set devFol to ((path to startup disk) as string) & “Developer:Applications:”
  
set libPath to (path to library folder) & “ScriptingAdditins:”
  
  
tell application “Finder”
    –一般アプリケーション
    
tell folder apFol
      set ap1List to (every application file whose accepts high level events is true and has scripting terminology of it is true) as alias list
    end tell
    
    
–ユーティリティーフォルダー
    
tell folder utilFol
      set ap2List to (every application file whose accepts high level events is true and has scripting terminology of it is true) as alias list
    end tell
    
    
–SystemのCoreServicesフォルダ
    
tell folder sysFol
      set ap3List to (every application file whose has scripting terminology is true) as alias list
    end tell
    
    
–Developerフォルダ
    
try
      tell folder devFol
        set ap4List to (every application file whose has scripting terminology is true) as alias list
      end tell
    on error
      set ap4List to {}
    end try
    
    
–/System/Library/ScriptingAdditions フォルダのOSAX
    
try
      tell folder sysLibFol
        set osax1List to (every file whose name ends with “.osax”) as alias list
      end tell
    on error
      set osax1List to {}
    end try
    
    
    
–/Library/ScriptingAdditions フォルダのOSAX
    
try
      tell folder libPath
        set osax2List to (every file whose name ends with “.osax”) as alias list
      end tell
    on error
      set osax2List to {}
    end try
    
    
    
set appList to ap1List & ap2List & ap3List & ap4List & osax1List & osax2List
    
  end tell
  
  
return appList
  
end getScriptableAppPathList

–任意のデータから特定の文字列を置換
on replaceText(origData, origText, repText)
  set curDelim to AppleScript’s text item delimiters
  
set AppleScript’s text item delimiters to {origText}
  
set origData to text items of origData
  
set AppleScript’s text item delimiters to {repText}
  
set origData to origData as text
  
set AppleScript’s text item delimiters to curDelim
  
–set b to origData as text
  
return origData
end replaceText

–short version文字列をよろしく処理する(major.minor1.minor2)
–short versionに英語や日本語の文字をズラズラ並べていた場合には所期の動作を行えない
on prepareShortVersionStringNum(sVer)
  set curDelim to AppleScript’s text item delimiters
  
set AppleScript’s text item delimiters to {“.”}
  
set sList to text items of sVer
  
set AppleScript’s text item delimiters to curDelim
  
  
set sLen to length of sList
  
if sLen = 2 then
    set sVer to sVer & “.0″
  else if sLen = 1 then
    set sVer to sVer & “.0.0″
  end if
  
  
return sVer
end prepareShortVersionStringNum

▼新規書類に ▼カーソル位置に ▼ドキュメント末尾に

2009/06/02 AS Dictionaryで指定アプリケーションのファイルのAS辞書をHTMLに書き出す

アプリケーションのバージョンが単体で上がったり、OSのバージョンのついでにアプリケーションのバージョンが上がったときに、AppleScriptの用語辞書が変更されることがあります。とくに、OSのメジャーバージョンが変わった時には、AppleScript用語辞書の変更を確認するだけでてんやわんやです。

そのうえ……Beta版とRelease版で挙動が変わってしまったような場合には、非常に困るわけですが…………………それはさておき、Appleが好き勝手に行う辞書内容の変更から身を守ることができないとしても、その変更を容易に検出できるようにしておくことは重要です。

そこで登場するのが、アプリケーションのAppleScript用語辞書をHTMLに書き出す「ASDictionary」。数年前から愛用しているツールですが、国内ではあまりご存じの方はいないようで……さらにASDictionaryが最近AppleScriptからコントロールできるようになり、複数のアプリケーションからまとめて用語辞書を書き出すといったAppleScriptらしい自動処理ができるようになってきました。

diff2.jpg

HTMLに書き出せれば、単なるテキストなので(sdefファイルの状態でもいいような気もしますが)diff系のツールで差分検出が気軽に行えます。とくに、Xcode Toolsに標準添付されているApple謹製diffツール「FileMerge」の使い勝手は最高で、いにしえのCodeWarriorのdiffを上回るとかパクっただけじゃないかとか……諸説ありますが、まあとにかく便利なわけです。

diff3.jpg

本AppleScriptは、指定のアプリケーションからAppleScript用語辞書をHTMLで書き出して、アプリケーションのバージョン番号をHTMLファイルに反映させます。

OSのアップデートがあるたびにAppleScript用語辞書を書き出し、FileMergeで差分をとっては辞書内容に変更がないかを確認している今日このごろです。ちなみに、本日アップデートされたiTunes 8.2とQuickTime Player 7.6.2には辞書内容の変更はありません。

diff4.jpg

diff.jpg

スクリプト名:AS Dictionaryで指定アプリケーションのファイルのAS辞書をHTMLに書き出す
set a to choose file with prompt 辞書をHTML書き出しするアプリケーションを選択

tell application Finder
  set aInfo to info for a
  
set sVer to short version of aInfo
  
set sVer2 to prepareShortVersionStringNum(sVer) of me
  
set sVerStr to replaceText(sVer2 as string, .“, “”) of me
  
set prodName to displayed name of aInfo
end tell

set outPath to choose folder with prompt AS辞書HTML書き出し先フォルダを選択
set outPathStr to (outPath as string) & prodName & & sVerStr & .html

tell application ASDictionary
  set exRes to export a to outPath using file formats {single file HTML} using styles {AppleScript} with showing hidden items without compacting classes
  
  
if success of (first item of exRes) = false then
    Export失敗時
    
display dialog HTML書き出しが失敗しました with title エラー buttons {”OK“} default button 1
    
return
  end if
  
  
Export成功時
  
set outFile to destination of (first item of exRes)
end tell

tell application Finder
  tell file outFile
    set aName to name
    
書き出したHTMLファイルにバージョン番号を反映させる
    
set bName to replaceText(aName, -AS.html“, (” & sVerStr & .html“)) of me
    
set name to bName
  end tell
end tell

任意のデータから特定の文字列を置換
on replaceText(origData, origText, repText)
  set curDelim to AppleScript’s text item delimiters
  
set AppleScript’s text item delimiters to {origText}
  
set origData to text items of origData
  
set AppleScript’s text item delimiters to {repText}
  
set origData to origData as text
  
set AppleScript’s text item delimiters to curDelim
  
set b to origData as text
  
return origData
end replaceText

short version文字列をよろしく処理する(major.minor1.minor2)
short versionに英語や日本語の文字をズラズラ並べていた場合には所期の動作を行えない
on prepareShortVersionStringNum(sVer)
  set curDelim to AppleScript’s text item delimiters
  
set AppleScript’s text item delimiters to {”.“}
  
set sList to text items of sVer
  
set AppleScript’s text item delimiters to curDelim
  
  
set sLen to length of sList
  
if sLen = 2 then
    set sVer to sVer & .0
  else if sLen = 1 then
    set sVer to sVer & .0.0
  end if
  
  
return sVer
end prepareShortVersionStringNum

▼新規書類に ▼カーソル位置に ▼ドキュメント末尾に