Repeat with...は言うほど遅くない

AppleScriptは、よく「遅い」「のろい」と言われます。まあ、確かに。

でも、耐えられない遅さかと言えば、そうでもありません。フォルダ・ファイル操作関連で、4〜5,000項目をRepeat文で処理しても、数秒で終わる事もあります。

他の言語だと、数秒が2〜3秒に短縮されるわけですが、AppleScript5〜6秒で、その差3秒。‥‥キリキリと時間に余裕のない現場でも、5,000項目につき3秒前後の差ですから、特に問題にはなりません。

もちろん、1項目につき3秒の差がでてしまったら、重大な問題ですけども。

思うに、「遅い遅い」言われるのは、(前回からも言っているように)Finder絡みの処理時の印象なのでしょう。たしかに、5,000項目を「tell app "Finder"」なんかで処理すると、遅いどころか、レインボーカーソルが回って、応答がなくなります。

でも実は、Finderを避ければ、「repeat with i from 1 to 5000」なんていう地道な5,000回の処理も、高速に処理できるのです。

Finderの遅さが、AppleScriptの速度として誤認されがち‥‥なんでしょうネ。

試しに、以下のスクリプトを動かしてみましたが、5秒くらいで5,040個のファイルを作れました。「dpx」とありますが、テスト用のダミーファイルですので、偽ものです。

set folderName to do shell script "date +%y%m%d-%H%M%S" --日付&時間の文字列を生成
tell application "Finder" --Finderに命令を開始
    activate --Finderを最前面にする
    set theFolder to make new folder at desktop with properties {name:folderName} --先ほど生成した文字列を名前にしてフォルダ(=テストの作業場所)をデスクトップに作る
    open theFolder --作ったテスト用フォルダのウィンドウを開く
end tell --Finderへの命令終了

set folderPath to theFolder as Unicode text --フォルダをパス文字列に変換する
set countOfFiles to 720 --カット毎の連番ファイル数を指定
set dummyCutNames to {"dummy_02_165", "dummy_01_014", "dummy_03_254a", "dummy_02_098", "test_a_211", "test_b_022b", "anime_13_067b"} --架空のカット名を生成

repeat with dummyCut in dummyCutNames --ダミーのカットで繰り返し処理
    repeat with i from 10001 to (10000 + countOfFiles) --10001から数え始めて指定ファイル数へ繰り返し処理
        set ofa to open for access file ((folderPath & dummyCut & "_" & ((characters 2 thru -1 of (i as text))) as Unicode text) & ".dpx") with write permission --テスト用フォルダ内にカット番号+4桁連番+拡張子の名前のダミーファイルを作ってアクセス開始
        write "dummyだよん" to ofa --dummyという文字列を書き込む(テキトーな文字)
        close access ofa --ファイルへのアクセスを終了する
    end repeat --繰り返し処理終了
end repeat --繰り返し処理終了

--テストフォルダの中には、5秒前後で5,040個のファイル(自動処理のテスト用の偽ファイル)が生成された、はずです.
--このスクリプトを動かした環境は、Moutain Lion, Mac mini i7 2.6GHz, 16GBメモリです.


コメントを入れたのでちょっとごちゃごちゃしてますが、構造は特に難解ではありません。典型的なリピート文です。文の内容に関する細かい説明は、またいずれ。

720個のファイルを、7回繰り返して、生成しています。なので、5,040ファイルです。

5,040回、「ファイルアクセス」をしている割には、5秒で完結します。1ファイルのアクセス開始&終了で、「1/1000」秒という速さです。

もちろん、ファイルの中身をあれこれ弄るのであれば、こんな秒数では済みませんが、「ファイルやフォルダへのアクセス自体が、まず遅い」わけではない事は証明されます。

ちなみに、この5,040個のファイルを、Finderで「カット名ごとに分別」したら、即、レインボーカーソルです。Finderが、5,040個のリストを「バッファ的なもの」へと入れる段階で、固まるような感じです。

さらには、上記スクリプトの「5〜6秒の処理」も、「実態は怪しい」ものです。単に、Finderの表示更新が追っ付いてないだけのようにも感じられます。ホントは、もう少し高速なのかも。

とまあ、何だかFinderを「悪者扱い」ですが、Finderの本分はどちらかというと、ユーザに対する快適なUIの提供だと思いますので、大量項目を処理できない事をあまり責めるのは「大人げない」ように思います。‥‥私は責めてるんじゃなくて、「Finderの使う場面をミスると、すごく遅くなる」というノウハウを書き綴りたいわけです。

次回は、5,040個のファイルを、やはり数秒で「カット名ごとのフォルダに分別処理する」スクリプトを書こうと思います。

AppleScriptはホントに、使い方次第、‥‥なんです。





市販書との違い

アプレットAppleScriptを手軽に使って、プロアマ問わず映像制作の一助とする‥‥という目的の「今さらのAppleScript」。昔に出版されてたAppleScript解説本と、のっけから違う事に気付いた方もいるかも知れませんネ。

私はAppleScriptの基礎を市販解説本で学んだのですが、実際の現場の運用と解説本が「相性が良いか」と聞かれれば、NOです。市販解説本はあくまで「基礎を学ぶ用途」で用いて、現場では発想を少なからず変えなければなりません。

普通、AppleScript解説本では、ファイルやフォルダを扱う時、「file "名前" of folder "名前" of folder "名前" of disk "名前"」という「AppleScriptらしい」英語的な記述を解説します。しかし、実際にそんな記述は現場では「まどろっこしくて」使ってられません。

なので、このブログでは、いきなり割愛しております。

AdobeのESTKで扱う際に、事前にAppleScriptで「:」区切りのパス、「/」区切りのパスで運用しておけば、何のストレスもなく、スッと「協同スクリプト」が書けます。

JavaScriptの文字列処理も即座に使えます。

"MacHD:Library:QuickTime:".split(':');

とか、

"/Volumes/HD2TB/Render/".split('/')[1];

など。

また、解説本では基本となるやり方、例えばFinderに対する繰り返し文とかも、やっぱり現場では使えないルーチンの代表格なので、他の方法で説明する予定です。

解説本は、100〜200くらいの項目を処理するレベルを想定していると思われますが、映像制作では、桁が1つ、2つ、変わってきますので、Finderの「Repeat with」などは「項目数が少ないと断定できる場面のみ」でないと「使っちゃ絶対にダメ」なのです。4,000個のファイルを律儀にFinder上で処理しようものなら、レインボーカーソルが回って、Finderが死にます。

う〜ん。……こうして書いてて思ったけど、「AppleScriptが使えない」とか言われる所以て、案外、「その辺」かも知れませんネ。項目が大量の時には、スッパリと方針を変えて、Finderは入り口と出口くらいにしか使わないのが「鉄則」なんですが、ちまたでは「映像制作」的なスタンスではなく一般的なスタンスで説明しますから、「使えないと誤解」されるのかも。

基本的には、Finderを通さずに(通したとしてもリスト取得時のみ)、項目の情報を文字列に格納しちゃって、(たとえ何万文字でも)文字列処理した方が「比べ物にならないほど」格段に高速ですし、リネームなどはShellに頼るに限ります。Finderで、「set name of file "パス" to "newName"」 なんてノンビリやってたら、納品に間に合わないス。

私の今までの仕事の中、責任を問われる場面で、タフに応えてきたAppleScript。

使い方次第では、雲泥の「性能差」が出てしまうのです。

フォルダの扱い

今さらAppleScriptを解説するこのカテゴリ。日常英会話ならぬ、通常業務スクリプト会話の主旨にて、映像制作に必要な要素だけをピックアップして紹介します。

ファイルとフォルダは、日々の制作に必ず現れる要素です。静止画コンテンツと違って、映像コンテンツは、とにかく扱うファイルやフォルダの量がはんぱないです。連番ファイルをあまり扱わなくなった昨今でも、「バージョン管理」のため、QTファイルをフォルダで分別する事はよくある事です。しかもそれは、手でやるととても煩雑な上に、「ミスると大変」な、神経の擦り減る(私はとくに)作業でもあります。

ある一定の法則が見いだせれば、「間違ってはいけない作業」はMac/PCの自動処理が適しています。もしフローで本格的にサポートさえすれば、カット袋のバーコードからカット名を読み出して分別する事も可能ですし、チェック表の表計算上のセルの内容からQTファイルを分別する事も充分可能です。「そんな夢みたいな事が‥‥」とか言わんで下さい‥‥。スーパーマーケットの「大量の物品を管理して捌く」ソリューションを、買い物のたびに、我々は目にしてますよネ。

話を戻して。

フォルダは基本的にはFinder管轄、つまりシステムの要素なので、AppleScriptではFinderやSystem Events、shellなどで扱う事になります。

フォルダを扱う場合は、Finder上で「folder "フォルダのパス"」で指定するのが一番簡単で親しみやすい方法です。

MacHDのLibraryのApplication Supportというフォルダは、

folder "MacHD:Library:Application Support:"

‥‥という指定方法になります。Macの場合、フォルダのパスは、「:」で階層を区切って記述し、最後は「:」で閉じるのがお約束です。

実はファイルも、基本的には同じで、

file "MacHD:sample.psd"

‥‥のように指定して扱います。「フォルダかファイルか」の違いは、末尾が「:」か否か、です。
*実はフォルダでも「末尾の : 」無しで認識されはしますが、習慣として、フォルダのMacパスは、 : で閉じる」と覚えたほうが間違いが起こりにくいですネ。

フォルダの扱い、具体的には、

tell app "Finder"

open folder "MacHD:Library:Application Support:"

end


‥‥などのようにして、何らかの命令と一緒に記述します。これを実行すると、フォルダのウィンドウがopenします。ファイルの場合は、ファイルがopenする〜つまり、担当のアプリケーションに受け継がれてファイルが開きます。psdならPhotoshop(=インストールされていれば)が起動するはずです。

ちなみに、上記のスクリプトを「そのまま実行」したら、以下のようなエラーメッセージが表示される人が多いと思います。



これは当然と言えば、当然。「起動ディスクがMacHDという名前じゃない場合」は、folder "MacHD:Library:Application Support:"というフォルダは存在しませんよネ。なので、エラーなのです。

「オレの起動ディスク名は違う」「私も」という状況に備えて、以下のように工夫する事で「誰でも」特定フォルダがopenできます。

tell application "Finder"
   
open folder ((startup disk as Unicode text) & "Library:Application Support:")
   
end tell


これは、「MacHD」なんていう固有すぎる書き方をやめて、「起動ディスク」つまり「startup disk」というFinderで予約された単語を用いる事で、「Macの普遍的なパス」を得ているのです。

startup diskは、Finder上で起動ディスクを表す言葉ですが、フォルダパスの文字ではありません。‥‥なので、startup diskをパス文字列に変換するために、as unicode textという書き方で変換します。日本語で表現すると、「ユニコードテキストとしての起動ディスク」ですネ。

人によってはas strings、as textと記述する人もいます。私は、文字コードを明確にして文字列変換したいので、あえてas unicode textという書き方を好んで使用しています。


スクリプト習得の初期段階といえど、フォルダを新作したいニーズはありますよネ。AppleScriptの場合、何かを作る際は、

make new 何か

‥‥と記述します。例えば、以下のスクリプトを実行すると、デスクトップに「いまさら作ったフォルダ」と言う名前のフォルダが自動で作成されます。

tell app "Finder"

make new folder at desktop with properties {name:"いまさら作ったフォルダ"}

end





ここでちょっと疑問。

さっきの指定方法を応用して、「make new folder "フォルダのパス"」という書き方じゃダメなの?‥‥と思う人もいるかも知れません。しかし、



‥‥となってエラーになります。

新しく何かを作る時は、「make new 新作するものの種別 at 作る場所 with ....」の段取りを踏む必要があります。

店で品物を買う時に、レジに並ぶのと同じように、Finder上で何かする時には、Finderの流儀に従う必要があります。

「めんどくせーなー」とか思うかも知れませんが、実際のお店だって、商品棚に代金を置いたからって、レジを通らず商品を外に持ち出してはヤバい、ですよネ。最低の段取りは必要です。

逆に段取りさえ覚えてしまえば、Finderは(無茶な命令でなければ)文句を言わず、何度でも処理を実行してくれます。

ちなみに‥‥ですが、「do shell script」命令を使って、AppleScript上のshellコマンドラインでフォルダ作成すると、存在しないパスでも一気に階層を掘って新作してくれます。それはまた、いつか、後ほど。


make newは、実は色んなところで使うようになります。例えばPhotoshopなら、

tell application "Adobe Photoshop CS6"
    make new document at the end with properties {name:"作ってみたドキュメント", width:1280, height:720}
    make new art layer at the end of result with properties {name:"作ってみたアートレイヤー"}
end tell


‥‥のような感じです。上記の内容は、ドキュメントを新作して、そのドキュメントにレイヤーを新作する‥‥というものです。

Photoshopは、アクションでの自動制御の他に、スクリプトからの自動制御もあるのです。今まで、アクションでしかレイヤーを自動生成した事のない人も、結構いるんじゃないでしょうか。スクリプトでは、基本的な自動制御が出来るほか、何と、アクション自体も呼び出せるので、「スクリプト+アクション」の組み合わせは、Photoshopにおいてはもはや無敵の自動処理と言っても過言ではありません。これもまた、後ほど。


Finderのフォルダの話題に戻って‥‥。フォルダを自由に作れるようになれば、夥しい量のファイルをまとめて整理する事も可能になりそう‥‥なのは、想像できるんじゃないでしょうか。



AppleScriptの役割

ドロップレットプログラム言語などを習得する際、市販の書籍を買うと、色々な作例をステップアップに合わせて消化する筋立てが多いのですが、これは目的が「言語の習得」だからでしょう。ゆえに、自分の目的(=ここでの場合、映像制作)とはあまり一致しない内容も含まれています。

私の成そうとしているこのコンテンツ(の草稿)の目的は「アニメーション映像制作の補助」なので、フォーカスははっきりしています。逆に、映像制作目的以外では、ほとんど役にたたないかも‥‥です。

「映像制作の補助」と言っても、じゃあ、AppleScriptは何ができるの?‥‥と言われると、AppleScriptそれそのものは、画像処理が出来る訳でもないし、ムービーファイルを変換できる訳でもありません。

「それじゃあ、何もできないんじゃん」と早合点してしまいそうになりますが‥‥。

昔、中学生の頃、自主アニメを作ろう!‥‥なんて考えて、「腕に覚えのある」(といっても中学生レベルでしたが)みんなで集まってみたものの、「何も事が起きなかった」という、今ではそのまま笑い話となるような事を経験した事があります。

何がその「集い」に足りなかったか。‥‥運用を仕切る人、段取って物事を進める人、です。

AppleScriptは、PhotoshopやAfterEffects、QuickTime Player、Numbers、Compressorなど、「才能豊かな」ソフトウェアを、「段取って仕切って、物事を目的地へと導く」ものです。運用を司る何かがなければ、コンピュータの中にあるのは、単なるスタンドアロンのアプリケーションに過ぎません。逆に、ソフトウェア単体はスタンドアロンであっても、AppleScriptで橋渡しをおこなえば、ソフトウェア単体では不可能だった事が可能になります。

「受け取ったQTファイルを、変換して、リネームして、サーバにアップして、連絡メールを送りたい」

‥‥こうした一連の作業は、もしAppleScriptがなかったら、その都度、人間が手作業でPCを操作しておこなう事になるでしょう。しかし、AppleScriptの「仲立ち」「段取り」があれば、人間が作業するのは、最初にQTファイルをAppleScriptアイコンにドロップする事だけです。

AppleScriptは「切り盛り役」です。段取りの善し悪しで状況がどれほど激変するか、想像してみてください。リアルな話ですと、帰宅の時刻を数時間前後させるほどの差が生じます。AppleScriptが「段取りをうまく捌いてくれる否か」で、人間の疲労度も大きく変わります。

コンピュータを使い始めると、最初は、単体アプリケーション〜自分の扱うツールの機能ばかりに目がいきがちです。しかし、ある程度の段階に到達したら、自分の手の延長線上のツールとしてだけでなく、作業のシステムまで視野に入れて、コンピュータを用いてみたらどうでしょうか。

作品上の断片的な個人技能レベルではなく、作品全体の戦術レベルをアップさせる「第一歩」が、まずは簡単なAppleScriptによる自動化ソフトの開発なのです。

AppleScriptの使い始め方

映像制作に用いる場面に特化したAppleScript使用法は、ほとんど紹介例がない‥‥というか、少なくとも私は見た事がない。‥‥ので、作ってみる事にしたのですが、最初っからコンテンツとして書き始めると、心が折れる事は必至ですので、ブログで草稿的に書き留める事にしたのです。

で、まず何よりも、AppleScriptの始め方‥‥です。

MacOSX10.8以降を対象にして書きます。

アプリケーションフォルダの「ユーティリティ」の中に、AppleScriptのエディタ「AppleScript エディタ.app」があります。

これを起動すると、スクリプトの文章が記述できるウィンドウが1つ現れます。他のアプリと同様、ウィンドウは、2つ、3つと同時に開く事もできます。

AppleScriptエディタ


そこにスクリプトを書いて、「実行」ボタンをクリックすれば、スクリプトは動きます。Adobeのスクリプトエディタ(Expand Script Tool Kit.app〜ESTK)も同じような手順ですネ。


display dialog "Hello, World."



実行すると‥‥





普通は、すぐに実行せずに、「コンパイル」ボタンをクリックして構文チェック(スクリプトの書き方に間違いがないかチェック)してから実行します。


AdobeのESTKと違うのは、エディタに書いて実行するだけでなく、アプレットとドロップレットという「アプリケーション」形式でも書き出せる点です。

アプレットはダブルクリックすると起動して、スクリプトを実行するもの、一方ドロップレットは、ダブルクリック起動の他に、処理したいファイルやフォルダをアプリアイコンにドロップ(アイテムをアイコンに重ねて離す)事でも起動しスクリプトを実行する事ができます。

アプレット

アプレットの場合は、特定条件で動くスクリプトに適しています。例えば、特定のフォルダの中身を検索して、対話式で処理が進行するものとか。

ドロップレット

ドロップレットの場合は、任意のアイテムを処理する場面に適しています。受け取ったQTファイルを他のコーデックのQTファイルへ書き出し直すとか。アイコンのデザインがいかにも「放り込め」的なデザインへと変わってますネ。

その他、AppleScriptの便利な起動方法としては、スクリプトメニュー(Finderのメニュー内にある)から実行する方法とか、Finderのウィンドウ(要はフォルダのウィンドウですね)のツールバーに配置して実行する方法などがあります。頻繁に使うスクリプトなどは、ウィンドウのツールバーに置いとくと、すぐに使えて便利です。


*検索欄の左に、AppleScript


‥‥というわけで、使い方は、特に難しくありません。

プログラムって、何から始めればいいんだ?‥‥と初心者の頃は思います。私もそうでした。AppleScriptは、他の開発環境に比べて、極めて敷居が低く設計されています。プログラムの知識がなくても(というか、誰でも最初は知識など無い)、すっと入っていける親しみやすさがウリなのです。これはもちろん、AppleScriptを開発したAppleの開発テーマでもあったのです。

AppleScriptで、日々の些細な処理アプリから、コンポジット業務の生産性までを揺るがす大規模アプリまで、目的に応じた幅広いアプリケーションを作る事が可能です。

じゃ、なんでAppleScriptが映像制作で「定番として」活用されないか? ただ単に、機材管理の省力化であまりMacが使われない事、さらには、AppleScriptの使い方を、皆が知らないから‥‥です。

管理の都合でなく、実際の現場のニーズに合わせて機材をチョイスし、さらにはAppleScriptを始めとした各種自動化のソリューションをふんだんに盛り込めば、現場は徐々に、そして結果的には大きく改善される‥‥はずですが、まあ、そうはいかないのが世の常。

ただし、アマチュア、個人作家、小グループの映像制作集団などは、組織自体が軽量なので、相応に、軽いフットワークで柔軟に「有効と思われる要素」を取り入られると思います。

Macを使っているのなら、AppleScript。‥‥だって、すぐそこに、実質「タダ」で使える用意が整っているのですから。

Finderの自動操作

Appleユーザがここ数年増えているらしい気配を、ぽつぽつ、色々な場面で感じます。ひと昔前は、誰もがWindowsで、MacOSXなんて、CGフリークリエーターの人くらいしか使ってなかった雰囲気でしたが、学生やアマチュアでも、普通にMacを使って、自主制作をしている人が増えているようです。

じゃあ、AppleScript。

Appleに見捨てられたとか、ユーザに見限られたとか、足を半分墓石に突っ込んだまま、とか、色々ウワサされて、もう10年。なんだ、しぶといじゃないか。AppleScript。

MacOSを使うのなら、AppleScript。Adobe製品を使うなら、JavaScript。中途半端に開発環境に手を出すより、実りが速く、プログラムの洗礼も受けられるので、この2つの「Script」は人生の早期に押さえておいたほうが良いですネ。

私は、1997年に入った頃から、AppleScriptをイジりはじめました。半年前は、フォルダを作るショートカットすら知らなかった私が‥‥です。小さい頃からコンピュータをいじってないと無理だとか、工業系、理系でないとプログラムはできないとか、みんな、戸惑いからくる迷信です。文章を書く能力があれば、少なくとも、AppleScriptとJavaScriptは書けます(キッパリ)。

tell application "Finder" to display dialog "Hello world I'm your wild girl" with icon note buttons {"OK"} giving up after 6 default answer "I'm your ch ch ch ch ch cherry bomb"

ブログでは自動で改行されてますが、スクリプト文は1行のみです。これを実行すると、アイコン付きのダイログウィンドウが表示されます。そして、6秒後に自動で閉じます。

tell application "Finder"
    set cont to (current date) as Unicode text
    display dialog "現在の時間は下記の通りです." with icon note buttons {"OK"} default button 1 giving up after 10 default answer cont
end tell


上記の4行スクリプトは、時間をテキスト入力欄に自動で書き込んで、ダイアログを表示します。10秒後に自動で閉じるほか、既にボタンにフォーカスを入れてあるので、リターンキーでも閉じる事ができます。

スクリプト文そのものを、敬遠せずに、ちょっと目を通してみると、何やら、意味が分からなくもない‥‥ですネ。

今度は、デスクトップにフォルダを20個、いっきに作ります。迷惑だと思う人は、実行を控えてください。

tell application "Finder"
    repeat with i from 1 to 20
        make new folder at desktop with properties {name:"試しに作った-" & (i as text)}
    end repeat
end tell


デスクトップをみると、盛大に20個のフォルダが作成されてます。

試しにもう一度スクリプトを実行すると、エラーで止まります。既に同名のフォルダがあるので、2度目は、同じ命令文ではフォルダを作らせてもらえないのです。動作の確認が済んだら、実験で作ったフォルダは捨てちゃいましょう。

他愛のないスクリプトですが、これを習得し、発展させると、QuickTimeファイルの諸元を一覧表に書き出したり、コンポジットに必要なファイルを収拾してフォルダにまとめたり、収拾した素材から自動でAfter Effectsプロジェクト&コンポジションを作ったり、鬼のような自動処理が可能となります。

現在、AppleScriptは正直、下火もいいところで、いざ習得しようと思っても、中々文献が見つからないですよネ。そんなんじゃ、やる気も起きない。‥‥なんで、AppleScriptに恩のある私(私の参加した歴代の劇場映画は、AppleScript無しでは成立しません)が、ちょいちょい、ドキュメントを書き綴ってみようかと思います。




calendar

S M T W T F S
1234567
891011121314
15161718192021
22232425262728
293031    
<< October 2017 >>

selected entries

categories

archives

profile

search this site.

others

mobile

qrcode

powered

無料ブログ作成サービス JUGEM