Archive for 6月, 2015

2015/06/27 MacJournalで選択中のエントリのタイトル冒頭から日付を取得して作成日付とタイトルに反映

MacJournal 6.1.5で、選択中のエントリからタイトルを取得し、その先頭に存在する「YYYY年MM月DD日[space]」のデータを取得して日付として評価し、該当するエントリの作成日付として適用。そして、タイトルから冒頭の日付部分を削除して設定するAppleScriptです。

ab9159b6-ed35-4f68-be14-656667b191e6.jpg

mj1.jpg

▲実行前

c08d18f1-a9fd-456e-abaf-4f0438e0358a.jpg

mj2.jpg

▲実行後

AppleScript名:MacJournalで選択中のエントリの冒頭から日付を取得して作成日付とタイトルに反映
tell application “MacJournal”
  set aSel to selected entries
  
  
repeat with i in aSel
    set j to contents of i
    
set aName to name of j
    
set aDate to date of j
    
    
set aDelim to ” “ –半角スペース
    
set {bDate, aText} to getDateAndNewTitleFromStr(aName, aDelim) of me
    
    
if {bDate, aText} = {0, 0} then –半角スペースが見当たらなかった場合にリトライ
      set aDelim to “ ” –全角スペース
      
set {bDate, aText} to getDateAndNewTitleFromStr(aName, aDelim) of me
    end if
    
    
if {bDate, aText} is not equal to {0, 0} and {bDate, aText} is not equal to {false, false} then
      try
        set date of j to bDate
        
set name of j to aText
      end try
    end if
    
  end repeat
end tell

on getDateAndNewTitleFromStr(a, aDelim)
  try
    set aOffset to offset of aDelim in a
    
if aOffset = 0 then return {0, 0}
    
set aDate to text 1 thru (aOffset - (length of aDelim)) of a
    
set newTitle to text (aOffset + 1) thru -1 of a
    
set aDateO to date aDate
    
return {aDateO, newTitle}
  on error
    return {false, false}
  end try
end getDateAndNewTitleFromStr

★Click Here to Open This Script 

2015/06/17 Adobe CC 2015がリリース、InDesign 11でpropertiesが取得できない致命的なバグが修正される

毎年機能アップされ、Adobeアプリケーションも使い放題・・・というふれこみのAdobe Creative Cloudでしたが、「新しいバグが追加され、まったく直らない」という傾向が観測されていました。

id151.png

InDesign CC 2014では「AppleScriptからオブジェクトのプロパティ値が取得できない」という致命的なバグがあり(これでプログラムを組めといわれても無理、、、)、Adobeのフォーラムに英語でバグの報告をしてもリアクションも何もなく、「直す気がない」ものと判断。

Adobeの対応がこんなにダメな状況では、2年しばりの契約が終わったらAdobe CCの契約終了が妥当と判断していました

本日CC 2015のアップデートが来ていたので、ためしに(前バージョンを削除せずに)アップデートしてみました。すると、InDesignの上記のバグが発生していないことが確認できました。つまり、普通にオブジェクトのプロパティが取得できる、と。

id152.png

これによって、「運がよければ翌年に修正される可能性がある」という経験則が得られました。cc2015で新たなバグが発見された場合には、cc2015では修正されずcc2016を待つ必要があるのでしょう。

AppleScript名:InDesign CC 2015のバグ修正確認
tell application “Adobe InDesign CC 2015″
  tell document 1
    set aSel to selection
    
set aaSel to first item of aSel
    
properties of aaSel
  end tell
end tell

–> {absolute rotation angle:0.0, absolute horizontal scale:100.0, absolute shear angle:0.0, absolute vertical scale:100.0, baseline frame grid options:baseline frame grid options of text frame id 268 of spread id 227 of document id 1 of application “Adobe InDesign CC 2015″, horizontal layout constraints:{flexible dimension, fixed dimension, flexible dimension}, id:268, grid data:grid data of text frame id 268 of spread id 227 of document id 1 of application “Adobe InDesign CC 2015″, overflows:false, overridden:false, parent page:page id 232 of spread id 227 of document id 1 of application “Adobe InDesign CC 2015″, flip:none, vertical layout constraints:{flexible dimension, fixed dimension, flexible dimension}, associated XML element:nothing, all graphics:{}, all page items:{}, applied object style:object style id 152 of document id 1 of application “Adobe InDesign CC 2015″, content type:text type, end cap:butt end cap, end join:miter end join, fill tint:-1.0, fill color:swatch id 14 of document id 1 of application “Adobe InDesign CC 2015″, absolute flip:none, start text frame:text frame id 268 of spread id 227 of document id 1 of application “Adobe InDesign CC 2015″, gap color:swatch id 14 of document id 1 of application “Adobe InDesign CC 2015″, gap tint:-1.0, geometric bounds:{37.49999999973, 50.999999999936, 68.166666666397, 135.333333333269}, text frame index:1, rotation angle:0.0, stroke tint:-1.0, left line end:none, stroke color:swatch id 14 of document id 1 of application “Adobe InDesign CC 2015″, stroke weight:0.0, linked Page Item options:linked Page Item options of text frame id 268 of spread id 227 of document id 1 of application “Adobe InDesign CC 2015″, end text frame:text frame id 268 of spread id 227 of document id 1 of application “Adobe InDesign CC 2015″, miter limit:4.0, nonprinting:false, next text frame:nothing, object export options:object export options of text frame id 268 of spread id 227 of document id 1 of application “Adobe InDesign CC 2015″, overridden master page item:nothing, anchored object settings:anchored object settings of text frame id 268 of spread id 227 of document id 1 of application “Adobe InDesign CC 2015″, animation settings:animation settings of text frame id 268 of spread id 227 of document id 1 of application “Adobe InDesign CC 2015″, all articles:{}, local display setting:default, shear angle:0.0, text frame preferences:text frame preferences of text frame id 268 of spread id 227 of document id 1 of application “Adobe InDesign CC 2015″, timing settings:timing settings of text frame id 268 of spread id 227 of document id 1 of application “Adobe InDesign CC 2015″, parent:spread id 227 of document id 1 of application “Adobe InDesign CC 2015″, top left corner option:none, top right corner option:none, bottom left corner option:none, bottom right corner option:none, contents:”aaaaaaaaaaaaaaaa”, top left corner radius:5.0, top right corner radius:5.0, bottom left corner radius:5.0, bottom right corner radius:5.0, gradient fill angle:0.0, gradient fill length:0.0, gradient stroke angle:0.0, gradient stroke length:0.0, gradient stroke start:{93.166666666603, 52.833333333064}, gradient fill start:{93.166666666603, 52.833333333064}, horizontal scale:100.0, index:1, item layer:layer id 224 of document id 1 of application “Adobe InDesign CC 2015″, locked:false, name:”", object reference:text frame id 268 of spread id 227 of document id 1 of application “Adobe InDesign CC 2015″, label:”", previous text frame:nothing, visible:true, vertical scale:100.0, right line end:none, stroke alignment:center alignment, parent story:text flow id 250 of document id 1 of application “Adobe InDesign CC 2015″, stroke type:stroke style id 23081 of document id 1 of application “Adobe InDesign CC 2015″, text wrap preferences:text wrap preferences of text frame id 268 of spread id 227 of document id 1 of application “Adobe InDesign CC 2015″, visible bounds:{37.49999999973, 50.999999999936, 68.166666666397, 135.333333333269}, content transparency settings:content transparency settings of text frame id 268 of spread id 227 of document id 1 of application “Adobe InDesign CC 2015″, fill transparency settings:fill transparency settings of text frame id 268 of spread id 227 of document id 1 of application “Adobe InDesign CC 2015″, transparency settings:transparency settings of text frame id 268 of spread id 227 of document id 1 of application “Adobe InDesign CC 2015″, stroke transparency settings:stroke transparency settings of text frame id 268 of spread id 227 of document id 1 of application “Adobe InDesign CC 2015″}

★Click Here to Open This Script 

▲InDesign上でドキュメントを作成し、何らかのオブジェクトを配置・選択した状態で実行

2015/06/12 シンプル音楽プレイヤーVOXをコントロール

シンプルなUIを持つ音楽プレイヤー「VOX」がAppleScriptに対応しているというので、調べてみました。

vox1.png

voxのAppleScript用語辞書を調べてみると、再生コントロールができる程度。

vox9.png

AppleScript名:voxtest1
tell application “VOX”
  properties
end tell

–> {artwork image:missing value, repeat state:0, album:missing value, class:application, trackUrl:”file:/Users/maro/Desktop/%E3%82%AA%E3%83%BC%E3%83%86%E3%82%99%E3%82%A3%E3%82%AA%E5%8F%8E%E9%8C%B2%2037.m4a”, total time:7357.0, player volume:50.0, current time:212.200210571289, player state:1, track:”オーディオ収録 37.m4a”, unique ID:”x-coredata://0365FE07-D0C2-4A43-8459-8E7B70316374/VXCustomTrack/p2″, album artist:missing value, artist:missing value, tiff artwork data:missing value}

★Click Here to Open This Script 

アプリケーションのpropertiesを取得すると、だいたい常識的なデータが返ってきます。

AppleScript名:voxtest2
tell application “VOX”
  showHidePlaylist
end tell

★Click Here to Open This Script 

UIのコントロール。プレイリストの表示/非表示きりかえ。

vox3.png

vox2.png

AppleScript名:voxtest3
tell application “VOX”
  playpause
end tell

★Click Here to Open This Script 

再生/停止のトグル切り替えのほか、再生や停止の専用コマンドもある。ただ、だいたいはこの程度。

プレイリストのファイルをオープンして再生できる、とあるので・・・AppleScriptで自力でプレイリストを別途作成してみると、まとめてオーディオファイルを渡せる可能性があります。あるいは、addUrlでプレイリストに追加する感じでしょうか(でも、「プレイリスト」自体を明示的に新規作成する命令はないですね)。

2015/06/11 OS X 10.11, El Capitanの感想

WWDC 2015でOS X 10.11, El Capitanが発表され、Keynote Speechを中心にいろいろな情報が入ってきました。

おおかた事前の予想通りの発表内容といったところ。

OS全体の処理速度の向上は、Metal for Macの導入と、Swiftの処理系でAppleが導入したランタイムエンジンの効率化(がObjective-Cの処理系にも同様に施されたこと)によって実現したものでしょう(Objective-Cの処理系自体にもスピードアップの余地があることを聞いていたので)。

OS X 10.10で報告されているOSのバグについては、この機会に修正されることを期待したいところです。

OS X 10.10のAppleScriptObjCで有名な不具合点〜「as」によるcastingでrealを変換すると変換誤差が発生する〜が、ようやく修正されることに(ただし、OS X 10.10.xを使っているかぎりは逃れられません)。

まだ実際にOS X 10.11 Betaをインストールしていないので(10.10の環境をつぶすのはまだ、、、)、まだ実際に試せてはいませんが・・・

こうした問題点を解消することにASObjC ExtrasやBridge Plusのようなものの開発意図があったわけですが、OS X 10.11で本当にASObjC ExtrasやBridge PlusのCocoaifyやASifyと同じレベルの変換機能が実現されているかを確認する必要があります。また、Beta段階で不具合が認められた場合でも、Appleに報告してそれが修正されるのか? という疑念があります。

ただ、Bridge Plusの機能追加の方向として、

 OS X 10.11でサポートされていないScripting Bridgeの機能をサポート(例:Objective-Cのブロック構文)

 通常のAppleScriptから呼び出して便利な高速処理ルーチンの提供

といったものが考えられるのではないでしょうか? ,麓分の考えですが、Shaneは△魄柄阿ら検討しています。

とりあえず、現状(OS X 10.10)より悪くなることは考えにくいので、OS X 10.11はおすすめできるアップデートになりそうです。 

もうちょっと様子を見たいです(汗) 新しいバグは勘弁してほしいです、、、10.10で失った信頼をぜひ10.11で取り戻してほしいところですが、前途多難といった印象を受けています。

ただ、悪い話だけでもありません。冒頭に述べたようにOS全体のパフォーマンス向上は、AppleScriptの処理速度向上も意味しています。OS X 10.10はバグだらけでしたが、AppleScript処理系のマルチコアCPU環境への適合度がアップし、処理速度が向上していました。その延長線上にあるOS X 10.11でも同様のブラッシュアップを期待したいものです。

このところのOS Xの機能追加とAppleScriptのサポートについては、1・2バージョン遅れてAppleScript側がキャッチアップしてきましたが、さすがにOS X 10.11の新機能「Rootless」にAppleScriptの「do shell script」コマンドが対応していなくて実行時に問題が起こるとかいうことはないようにしてほしいところです。

2015/06/09 OS X 10.11, El Capitanが発表に

WWDC 2015にて、OS X 10.11「El Capitan」が発表されました。バグ修正とパフォーマンス向上などが主な内容とされています。

elcapitan.jpg
▲PowerMac G3の筐体もEl Capitanと呼ばれていましたが・・・

それと同時に、Beta版のRelease NotesがUS AppleのWebサイトに掲載され、10.11におけるAppleScriptの変更点が明らかになりました。

→ AppleScript Release Notes, 10.11 Changes

Beta版のリリースノートであるため、現時点で掲載されている内容が今秋(10月ごろ?)正式リリース時においても変わらない、ということはありません(増えたりする)。

全体的に、不具合点(バグ)の修正が主な変更内容です(2015/6/9現在)。

Folder Action機能(の書き直し)

OS X 10.10でユーザー環境によっては「Folder Actionが機能しない」というケースに直面していました。有効な解決策は「別途ユーザーアカウントを作成して、そちらで実行する(ユーザーアカウントごと引っ越す)」というもの。「信頼性を向上させる」と書いてありますが、OS X 10.10の実装では「信頼性がない」ことを認めたわけで、10.10での実装方法自体が間違っていたんでしょう(10.10上で直してほしいが、それはやんない or できないんだ、ということがわかる内容)。事実上のバグフィックス。まぎらわしいのでバグフィックスの項目に載せるべき。自慢する内容じゃない。

Script Libraryの置き場所追加

AppleScriptの処理系がScript Librariesを検索する機構を2つ追加。従来からある「/Library/Script Libraries」「/Netowork/Library/Script Libraries」「~/Library/Script Libraries」に加えて、(AppleScriptアプレットに限らず)アプリケーションバンドル内の「/Contents/Library/Script Libraries」を追加。

これによって、アプリケーションと連携するAppleScript Librariesをアプリごと配布したり、ライブラリの提供を目的とした単体のアプリケーションの配布が可能となる(Mac App Store上での配布を言っているのか、文章が短すぎてわからない。いずれにしても、かつてのOSAXっぽい運用を意図しているもよう。けっこう重要なことを言っている気がする)。

環境変数「OSA_LIBRARY_PATH」でScript Librariesの追加検索対象パスを指し示すことが可能に。これによって、通常の場所ではないディレクトリにもScript Librariesが置けることに。追加検索対象パスはコロンで区切って複数宣言可能。

OSA_LIBRARY_PATH=’/opt/local/Script Libraries:/usr/local/Script Libraries’

と設定した場合には、

/opt/local/Script Libraries
/usr/local/Script Libraries

の2箇所が追加検索対象パスになる。

AppleScriptObjC(の機能向上)

AppleScriptObjCは、さらに多くのデータ型をブリッジするように。AppleScriptObjCで通常行うように、AppleScriptのオブジェクトとObjective-C(Cocoa)のmethodの変換/逆変換は「as」を用いて行う。

・struct型はAppleScriptのrecord型にブリッジされる(逆もしかり)。AppleScriptのlistはstructsにブリッジされる(dateを含むリストとか、アプリケーションのオブジェクトを含むrecordとかはどーなんだか。このあたり、随所に「罠」(trap/bug)が存在していそうな、、、、)。

・AppleScriptのfileオブジェクト(file, alias, POSIX file)はNSURLにブリッジされる(フォルダとかバンドル内のパスも大丈夫なのか、実験してみないと怖い)。NSURLはfileやaliasにブリッジされる。

・AppleScriptのdateオブジェクトはNSDateにブリッジされる(逆も真なり)。

バグフィックス

・AppleScriptはObjective-C(Cocoa)のconstantやenumeration valuesを認識するようになった
→ これができていなかったせいで、Scripterが自前でconstantやenumeration valuesをCocoaドキュメントで調べてpropertyで定義していたので、バグ修正というより機能向上では? 

・NSNumberをrealに変換した際に、倍精度→単精度数値変換時の変換誤差を切り捨てるようになった

・NSStringのstringへの変換は、textやUnicode textへの変換と等しくなり、すべてのキャラクターを維持する

その他のバグ修正

applet中でのdelayコマンドは指定時間を正しく時間待ちするようになった
→ マウスカーソルを動かしても大丈夫なのか? 本当か???

Developer Notes

OSACopyScriptingDefinitionFromURLは正しく動作するようになった
→ 各アプリケーションのScript用語辞書を確認するのに、アプリケーションアイコンをScript Editorへのドラッグ&ドロップで表示させる機能がOS X 10.10では正常に動作していなかったが、それを修正した、の意味。これもバグフィックス

2015/06/04 在来型のAppleScriptからAppleScriptObjCへの移行でハマるポイント(バンドル内のScriptの読み込み)

従来のAppleScriptを、OS X 10.10, Yosemiteで導入された(普通にScript Editor上で記述できる)AppleScriptObjC(Cocoa-Bridged AppleScript)に書き換えを行なった際にハマったポイントをひとつ紹介します。

bundle_script.png

このような(↑)単なるバンドル形式のAppleScriptがあって、バンドル内の「Scripts」フォルダ内に「A1.scpt」という別Scriptが存在している状態を想定しています。

このように、機能別にScriptを分割して「A1.scpt」単体で実行テストが行えるような形式にしておくことは、よくあることです。メイン側はただパラメータを各Scriptに渡して呼び出すようにしておく、というのもよくあることです。

こうすることで、どこかで問題が発生したときに問題の切り分けと対策が行いやすくなるので、よくこのような構造にしています。ただ、OS X 10.10のScript Editorの出来が悪くて、上図(↑)のような状態で、ウィンドウ右側に表示されているサブScript(A1.scpt)を編集するとScript Editorが無反応に(ーー;;

# そういう場合には、Finder上でScriptバンドルの内部をこじあけて、Finder上に表示させたサブScriptを個別にScript Editorで編集することに。以前のバージョンではできていたことが10.10でできなくなるのは勘弁してほしいです

AppleScript名:load_script_test_1
set mePath to (path to me) as string
set extScript to (mePath & “Contents:Resources:Scripts:A1.scpt”) as string

set extO to load script file extScript
–> «script» –OK!

★Click Here to Open This Script 

(↑)最初の段階です。きちんと、バンドル内の「A1.scpt」ファイルをload scriptで読み込めています。

AppleScript名:load_script_test_2
use AppleScript version “2.4″
use scripting additions

set mePath to (path to me) as string
set extScript to (mePath & “Contents:Resources:Scripts:A1.scpt”) as string

set extO to load script file extScript
–> «script» –OK

★Click Here to Open This Script 

(↑)冒頭の部分にAppleScriptのversion宣言と、scripting additions(OSAX)の利用を宣言しています。ここまででは、とくに問題は発生しません。

AppleScript名:load_script_test_3
use AppleScript version “2.4″
use scripting additions
use framework “Foundation”

set mePath to (path to me) as string
set extScript to (mePath & “Contents:Resources:Scripts:A1.scpt”) as string

set extO to load script file extScript
–> error “current application のタイプを file に変換できません。” number -1700 from current application to file

★Click Here to Open This Script 

この段階(↑)で問題が出ます。use framework “Foundation”の1行を加えた瞬間、そのScriptはCocoaの機能を呼び出すAppleScriptObjCとして解釈されるため(?)、load script文に影響が出ました。

AppleScript名:load_script_test_4
use AppleScript version “2.4″
use scripting additions
use framework “Foundation”

set mePath to (path to me) as string
set extScript to (mePath & “Contents:Resources:Scripts:A1.scpt”) as string

tell current application
  set extO to load script file extScript
end tell
–> «script» –OK!

★Click Here to Open This Script 

(↑)問題の解決を行ったものです。load script文をcurrent applicationへのtellブロック内で実行しています。

ちなみに、AppleScriptObjCの代名詞ともいえる「Objective-Cっぽいハンドラ」は、現行バージョンのAppleScript v2.4では普通にサポートしています(Xcode上でないと書けない、とかいうことはない)。

AppleScript名:objCっぽいハンドラ
my setA:“test”

on setA:aParam
  display dialog aParam as string
end setA:

★Click Here to Open This Script