宇宙船ペペペペラン

私が小さい頃、家に「ドレミファブック」という音楽絵本がありまして、毎日のようにレコードをかけ、絵を眺めていました。

その中で私が好きだったのは、「ちびくろサンボ」「ないたあかおに」「はくちょうのみずうみ」「ほらふきヤーノシュ」そして「宇宙船ペペペペラン」です。

宇宙船ペペペペランは、抽象絵画のような挿絵でしたが、私は今でも明確に、その時感じたイメージを思い出す事ができます。こずるくて小器用な処世術を身につける前の、無防備かつ、ある種残酷な子供時代のほうが、抽象絵画を感じとる能力は高いのかも知れません。

筋立ては、おじいさんが街にやってきて、子供たちに「昔話のような、未来の話」を聞かせるというものです。話は、地球上が1つの国になった未来に、子供たちだけを乗せた宇宙船ペペペペランが新天地アンドロメダを目指して、宇宙を航行する‥‥と言う内容です。

宇宙船には男女同数の子供が乗っているはずだったが、実は(何かのミスで)男の子が1人多くのっており、男女が思春期を経て結婚するようになると、「弱虫ロン」が1人取り残された。ある時宇宙船に彗星が衝突し、独身で妻帯者ではないロンが船外での危険な修理を引き受ける事になった。修理が済むとすぐにロケットは発進し、ロンは宇宙に取り残され、気が狂れた‥‥という、子供の私には(今思うと)強過ぎるほどの刺激の絵本でした。


‥‥で、最近、エスペラント語の事を人から聞いて、ふと、この「ペペペペラン」の事を思い出したのです。全くエスペラント語の事を知らなかった私(古文書か何かだと思ってた)が、その成り立ちを聞いた後、ふと「ペペペペラン」はエス「ペラン」トのもじりだと言う事に気がつきました。そして、子供の頃に呼んだ「創作絵本」が何を言わんとしてたかが、瞬時にクリアになったのです。

世界に国の境がなくなり、言葉も共通になっても、全ての人間が解り合えて愛し合い幸せになるわけではない‥‥という理不尽などではなく淡々とした現実を、そっと語りかけているのでしょう。これはもっと遡って思いを巡らせれば、自己の「こっち側とむこう側の垣根」は、あらゆる個性に取り憑かれたカラダからは、取り払う事はできない‥‥と言う事ですネ。

ロンがなぜ大勢の女の子の誰ひとりからも愛されなかったのか。作中では、「弱虫」「しし鼻」という理由を上げています。おじいさんの話を聞いてた女の子が「私だったらロンと結婚するのに」とか言うと、他の子が「そしたら、また誰か他の子が余っちゃう」と言います。

恐るべし。ドレミファブック。

子供に何を語ろうとしたのか。何をインプリントしようとしたのか。

今になってしみじみ思うのは、6000万人とも言われる死者を出した未曾有の惨劇とも言えるWWIIを経た人類、その若い世代が自由や友愛に理想を掲げ(例えばヒッピームーブメントのような)、内輪でもめ混乱し、やがて挫折していく様を、この絵本の筋立てに見るのでした。

「子供たちだけで未来の新天地を目指す」というのも、確信的、示唆的です。理想を託された子供たちが、大人になって、どうなったか?‥‥という事ですネ。

この創作絵本の作者は、何か世相から、挫折感を感じとっていたのでしょうかネ。ドレミファブックは、1970年前後の出版なはずですから、例の全共闘絡みの「終盤」です。

創作絵本の中に、自由や友愛の「阿鼻叫喚」が磁気転写されたとしても、何ら不思議ではありませんし、むしろ「大いにありそう」です。

およげたいやきくんも、そんな歌でしたネ。「やっぱり、ぼくはたいやきさ。すこし、焦げある、たいやきさ。オジサン、つばをのみこんで、ぼくをうまそうに食べたのさ。」

レシピにそって、日々、大量に製造される、たいやき。ある日、たいやきは自由を求めて海に逃げ込む。しかし、海は海で、いじわるなサメはいるし、お腹も空く。ふと美味しそうな餌が漂っているのを見て、おもわずパクつく。そしたら、釣り上げられ、もとの世界へと戻されてしまう。結局は、他のたいやきの運命と同様に、オジサンに食べられて一生を終えた。チャンチャン。

なんだろう。この頃の創作家は、大人の社会での無念を、子供に訴えかけようとしてたんでしょうかネ? ‥‥で、私はその子供のなかの1人です。うーむ。

70年代は、そんな風味が数多い時代‥‥ですネ。

ファイルの分別(後)

AppleScriptでファイルの分別をする後半です。ポイントは、

  • 大量処理の場面ではFinderを使わず、高速化する
  • カット名らしき文字列を含むファイルだけを対象とする
  • 特定のファイル形式(今回はDPX)だけを対象とする

‥‥です。つまり、PSDやQT、JPEGは対象から自動的に外し、さらにはDPXファイルと言えどもカット名を含まないものも自動的に対象外とします。

そこそこ長いスクリプト文なので、まずは下記に記します。

(*

まず、手始めに‥‥

本番のファイルを使うのはマズいし、テスト用にAfter Effectsで連番ファイルをレンダリングするのもバカらしいので、「ニセの画像ファイルの連番」を作ってしまいます.

*)

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_t1", "dummy_01_014_t2", "anime_12_254a_t1", "dummy_02_098_t3", "test_a_211_t3", "test_a_211_t4"} --架空のカット名を生成

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秒前後で数千個のファイル(自動処理のテスト用の偽ファイル)が生成された、はずです.

--故意に他の拡張子のファイルも数種類混ぜてみましょう
--名前でソートした際にごちゃごちゃになるよう、わざとイジワルな名前をつけて、スクリプトの耐久性を見ましょう
repeat with dummyFile in {"A-関係ないPhotoshopファイル.psd", "B-関係ないQuickTimeファイル.mov", "s_全く関係ないJPEGファイル.jpg", "Y_消し忘れたPNGファイル.png", "0-素材のイラレファイル.ai", "testで書き出したDPX.dpx"}
    set ofa to open for access file (folderPath & dummyFile) with write permission --偽ファイル
    write "dummyだよん" to ofa --dummyという文字列を書き込む(テキトーな文字)
    close access ofa --ファイルへのアクセスを終了する
end repeat



activate --このスクリプトを最前面にして
set theResult to display dialog ((length of dummyCutNames) as text) & "カットの合計" & ((countOfFiles * (length of dummyCutNames)) as text) & "ファイルを生成しました" with icon note buttons {"ここで止めとく", "分別を処理してみる"} default button 1 giving up after 20 --処理の続行を尋ねる
tell application "Finder" to activate --Finderを最前面にする(処理の様子を見せる)
if button returned of theResult is "ここで止めとく" then return --ユーザが中止を選択した場合は処理を中止


(*


これより以下がフォルダごとの分別処理です.
回りくどいトリッキーな事をしているように見えますが、「できるだけFinderを大量のファイルに関与させない」工夫ゆえです.

*)

set cutNameSliceStart to 1 --カット名を抜き出す開始番号(アンダースコアで区切った配列のスタート)
set cutNameSliceEnd to 4 --カット名を抜き出す終了番号(アンダースコアで区切った配列のエンド)
set nameExtension to ".dpx" as Unicode text --収拾するファイルの拡張子を設定
set AppleScript's text item delimiters to "_" as Unicode text --ファイル名のリスト分解に備える

set tryCount to 0 --検索ファイルのカウント
repeat --無限の繰り返し
    set tryCount to tryCount + 1 --検索ファイルのカウントを1つ増やす
    try --エラー発生を見越して(故意にエラーを発生させる)
        tell application "Finder" --Finderに命令
            set theFile to file tryCount of theFolder --分別のきっかけとなるファイルを指定
            set theFileName to (name of theFile) as Unicode text --ファイルの名前を取得
        end tell --Finderへの命令終了
    on error --ファイルを検索し終えた場合にエラーが出る
        activate --このスクリプトを最前面に呼び出して
        display dialog "処理が終了したようです.
       
ちゃんと分別されたか、Finderのウィンドウで確認してみてください.

分別対象以外のファイルはそのまま残っています." with icon note buttons {"OK"} default button 1 giving up after 15 --処理終了を報告する
        exit repeat --無限ループから脱出
    end try --故意エラーへの対応終了
   
    if theFileName ends with nameExtension then --もしファイルが対象ファイル形式だったら
        set nameArray to text items of theFileName --ファイル名をリスト(配列)分解
        set fileNameCheckIsOK to length of nameArray > cutNameSliceEnd --ファイル名が規定を満たすかをチェック
        if fileNameCheckIsOK then --もしファイル名が規定を満たす場合
            set tryCount to tryCount - 1 --検索ファイルのカウントを1つ戻す(カウントの空滑りを防止)
            set cutName to (items cutNameSliceStart thru cutNameSliceEnd of nameArray) as Unicode text --カット名をファイル名から抽出する
            do shell script "mkdir " & quoted form of POSIX path of (folderPath & cutName) --フォルダをシェルで作る
            do shell script "mv " & (quoted form of POSIX path of (folderPath & cutName)) & "_*" & nameExtension & " " & quoted form of POSIX path of (folderPath & cutName) --対象ファイルをカット名フォルダに移動する
        end if --ファイル名チェックの「もし」の範囲、ここまで
    end if --対象ファイル形式の「もし」の範囲、ここまで
end repeat --無限ループの範囲、ここまで

set AppleScript's text item delimiters to "" --リスト分解の設定を初期値に戻す

tell application "Finder" to activate --Finderを最前面にする

return tryCount --検索ファイルの最終カウントを結果として戻す


コメントを入れたおかげで、余計、長く感じられますが、まだシンプルなほうだとは思います。やっている事が、単にファイルの分別ですからネ。テスト用の偽物ファイルを作るところからやっているので、長くなっているのですネ。

動作中のスクリーンショットは、こんな感じ。

スクリプトを実行すると、デスクトップに日付のフォルダが自動生成され、その中に数秒後、テスト用のダミーファイルが大量生成されます。

5040個の連番ファイルと、故意に混ぜた関係のないファイル6個。変更日でソート表示されてるので、並びはバラバラですが、ウィンドウ下部の項目数に注目してください。





…実際に作ったのは、上記の通り、5040+6で5046ファイル。

「分別を処理してみる」ボタンをクリックすると、数秒後‥‥

‥‥のような感じで、思惑通り、カット名を持つ連番ファイルだけが、分別されました。イジワルな名前の混在にもメゲず、ちゃんとカット名連番だけを見分けて、新規フォルダを作って格納しています。

種類でソートすると、こんな感じ。

めでたく、終了。5046項目のごちゃまぜファイルが、数秒で、スッキリ、13項目に整理されました。


たとえ、以前にレンダリングしたQTファイルや、とりあえず置いといたJPEGファイルがあっても、「カット名を含む、DPX」以外は処理対象から外すので大丈夫なのです。

また、作品や話数がごっちゃになっていても、「カット名の命名規則に準じて」ファイルを選別するので、問題無いのです。

スクリプトの文中に目を通すと、AppleScript独特の表現もちらほら見えます。「AppleScript's text item delimiters」なんてのは、その最たるもので、私はこれが面倒でイヤなんですが、要は「テキストの要素を分解する文字」の事です。これを操作すると、文字列を任意の文字で分解できるようになります。

ファイルを分別するくだりは、目の前にあるものを処理して、もし対象外のものだったら、一歩進む‥‥という、何とも可愛い動作にしてあります。一歩進む‥‥とは、「自分のいる位置のカウントを1つ足す」という事ですが、AppleScriptには「++」なんてシャレたものはないので、set その変数 to その変数+1 みたいにして、地道に書きます。

Finderは言わば窓口。そこに大量の物品を持ち込んでもパニックになるだけです。窓口で簡単な手続きを済ませたら、後は頼りになるバックヤードでドカンと大量処理するのです。

しかし、AppleScriptに馴れていない人が、上記スクリプト文を読んでも、理解できないかも知れません。コメントだけ読んで、流れを汲んでもらえればと思います。文中の細かい説明はまたいずれ。

今回はダミーファイルまでも作るデモ的なスクリプトですが、文中後半の「ファイル分別ルーチン」を抜き出してちょっと手直しすれば、汎用性があって何度でも使い回しのできる、連番分別アプリケーションに育てる事ができます。

次回は、似たようなスクリプトを使って、「作業者にツッコミをいれる」スクリプトを作ってみます。データベースを使わなくても、スクリプト自身が判断して、「ほんとに、その尺で合ってる?」とユーザに確認してくるのです。

ではまた。

ずっと欲しかったプラモ

子供の頃、「畏怖の念」を持って眺めた箱絵のハセガワのプラモデルを、ようやく入手できました。F-4Eの「シャークティース」のパッケージのプラモデルで、たしか当時の価格は400円だったと思います。私が小学校3〜4年の頃、ですネ。

そのプラモデルは3つ離れた兄が買ってきたもので、逆ガルで鋸翼の主翼、機首のバルカン砲、ベトナム迷彩、爆弾をしこたま翼下に搭載し、トドメは機首の恐ろしげな顔。戦闘爆撃機の凶暴で粗野なイメージを体現する箱絵、そしてキットでした。

当時の特撮やアニメヒーローの「かっこいい」とは、全く別次元の強烈な印象を、ハセガワのいち商品から受けたのです。

実機のプラモデルは、「子供に人気がでるように」デザインはされていません。プラモデルが売れるように、マクドネルダグラス社がF-4を作ったわけじゃないですもんネ。

しかし、なんでまた、子供に「飛行機や戦車が人気があるのか」。「ロボットやヒーローが敵を討ち果たすストーリーを見て、歓喜するのか」。

カッコいいと思わせる要素って、何なの?

大げさに言えば、そんなような部分を、子供ながらに感づいて意識するようになったキッカケが、このプラモの箱絵かも知れません。だって、このF-4ファントムの攻撃して殺傷する相手は、絵に描いたような悪人顔の秘密結社の戦闘員じゃないですからネ。

私の母系の家系は昔から浅草にあって、祖父母が結婚した時に高円寺に居を構えたのですが、母は子供ながらに東京大空襲で空が真赤になっているのを見たと言っております。私は「その頃はもう群馬に疎開して、高崎の大空襲と記憶違いなんじゃないの?」と聞いたのですが、「よくわからない」らしいです。高円寺の住所もわかっているので、今度、「その地域が無事に焼け残ったのか」を調べるつもりですが、何とも壮絶な話です。

飛行機が大挙して飛来して、こともあろうに、爆弾(というか焼夷弾)を落としていく‥‥んですから、よく考えてみれば、凄い事です。「公然と人間を殺しにやってくる」のですから。

なのに、なぜ、カッコいい? そう感じる?

子供時代の無垢な部分と残忍な部分。大人も、子供に対して友愛や平和を説く一方で、小さな事から大きな事まで争い事を止める事はない。

子供心に、「自分は、人間の呪いの中に、居る」という事を、うすうす、感じさせた「思い出深い」キットなのです。

F-4Eのパッケージ。シャークティースの口の中が真赤で、陰惨な印象すら受けます。思い出すのは、ゴヤのこの絵。

子供の頃、怖過ぎてイヤだったなぁ。。。いや、今見ても、充分、怖いですワ。



ルーズリーフ、万年筆

久々にルーズリーフや大学ノートを買いました。何年ぶりだろうか。おそらく、10年以上は買ってなかったはず。

文字を書かなければならないので、必要に迫られて買ったのです。文というよりは、文字、です。

さらに、万年筆も買いました。ペリカンとラミーの2本。ペリカンのは、前から気にいっている廉価モデルを買い足し。ラミーのは実は初めて注文したので、楽しみです。

今の私は、何だか両極端な性質があります。かたや、紙と黒鉛を吟味し、万年筆で字を書き、一方でコンピュータで絵を動かしキーフレームの山をかきわけ、現行のマシンが遅くてじれったい衝動にかられる‥‥という。

多分、今の私は「中途半端な踏み込みで、『デジタル』をやりたくない」のでしょうネ。ごまかすような使い方をしたくないんだと思います。「アナログ」も「デジタル」も。



ファイルの分別(中)

ドロップレットAfter Effectsで出力した連番やQTを整理するスクリプト。実は、運用やワークフローがどれだけ考え抜かれているかを示す「試金石」のようなものです。

スクリプトでうまく処理できない運用ルールやワークフローは、未発達で穴が多い、もしくは、理路整然としてなくて複雑である証拠です。複雑怪奇な運用ルールは、コンピュータだけでなく、人間も往々にしてミスを連発します。「IF分岐が多過ぎる」と言いますか。

誰もが短時間でルールを理解できる運用方針は、その運用の過程で働く人間に優しいのはもちろんの事、コンピュータでも処理しやすいのです。

複雑で大風呂敷を広げたフローは、素人さんは「すげー」とか関心しがちですが、多様な現場に接してきたプロの目からすると、「メンテが大変そう。もっとシンプルにできなかったんだろうか‥‥」と気の毒になるフローです。複雑なフローはそれだけで、時間やお金、体力とメンタルに、負荷を及ぼすからです。
*納得ずくで背負い込む覚悟の作品もあるでしょう。その場合は金と人と時間に対して覚悟する‥‥という事ですネ。

シンプルで澱みがなく、INOUTが明確であるのが理想ですが、「一生懸命取り組むほどに、フローや運用を複雑にしてしまう」事も少なくありません。運用上の笑い話で「チェックが甘いからこのようなミスが出るのだ。ならば、ちゃんとチェックしたか、さらにチェックするようにしよう。」なんてのがあります。「なぜミスが出たか」を解消しようとはせず、チェックだけを何重にも上乗せしていく‥‥のは、誰もが「馬鹿っぽいやり方」だと感じるはずなんですが、結構、ありますよネ、そういうの。

さて‥‥。「地獄絵図のようなごちゃ混ぜのフォルダ」内から、連番ファイルを抜き出し、カットごとのフォルダにまとめるスクリプトですが、まずはファイル名から「カット名」(今回の場合「クリップ名」と呼んでも)を抜き出す方法から。

anime_01_123_t1_0001.dpx

上記のファイル名は、「anime」という作品略号の、「01」話、カット「123」、テイク「1」の、連番1フレーム目のDPXファイルです。

まず、ドットで分解すると、

anime_01_123_t1_0001 dpx

‥‥の2要素になり、さらに分解した1番目の要素を、アンダーバーで分解すると、

anime 01 123 t1

‥‥のように、カットの情報をカテゴリで分解できます。

今回の分別処理は、「作品、話数、カット番号、テイク」をひとかたまりとして扱い、分別しようと思います。つまり、

anime_01_123_t1_0001.dpx から anime_01_123_t1 を抽出したい

‥‥わけです。

何が入っているか特定できない状況において、ファイル名から「作品_話数_カット番号_テイク」を抽出し、その文字列をキッカケにしてファイルを収集する‥‥わけですネ。


さらに次。

何千項目入っているか数がわからないフォルダを相手に、Finderでファイル数を数えようとして「count of files」なんてやったら、またレインボーカーソルかも知れません。ここはひとつ、「ファイルの総数なんて数えないで、先頭のファイルからどんどん喰っていく」やりかたで処理します。「わんこそば」のように、「目の前にある項目を処理していく」やりかたです。

何度も書いてきた通り、大量の項目を処理しようとすると、Finderは破綻するわけですから、Finderには項目を1つだけ渡して順次処理するようにすれば、破綻せずに済みます。あくまで「使いよう」を考えます。

処理ルーチン上で、ファイルをひとつずつ処理し、条件に合った場合は、ファイルを収集して新規フォルダに移動します。これを、ファイルに全部目を通しきるまで、繰り返して処理します。

処理に適合する条件は、

  1. DPXファイルであること
  2. カット名を含んでいると予測できるもの

‥‥の2種です。もっと条件を増やしても良いでしょうが、カット名(らしき)を含んでいて、DPXファイルであれば、かなり特定できますから、今回はシンプルなこの2つの条件だけで処理します。

  • DPXファイル→ファイル名が「.dpx」で終わる
  • カット名を含んでいる→アンダーバーで文字列分解して要素数が5以上のもの

‥‥まあ、条件が甘いような気もしますが、運用とワークフローの前提が「そこそこ、要素を絞り込んでくれてる」ので、これでも充分上手くいきます。



‥‥と思ったら、またこんなに文がかさんでおる。なので、締めは次回に。



ファイルの分別(前)

AppleScriptは映像制作で役立てようとすると、結構、使い方に「コツ」が要ります。「コツ」なんていう言い方をするのは、「基本に忠実で、理屈にかなっていても、うまく動かない時がある」からです。

例えば、5,000項目を取り扱うような場合は、市販参考書に書いてあるやりかたではダメです。市販参考書は、まさか5,000項目なんて処理するとは想定していないのですから。

例えば。

「anime_01_065_t1_」で名前が始まるファイルを抽出せよ‥‥などの時は、普通は「フィルタ参照形式」という方法で抜き出すのが基本ですが、相手が5,000項目ともなると、レインボーカーソルが回ったまま、Finderが応答しなくります。ビジー状態による、事実上のフリーズですネ。

move files of folder "MacHD:testfolder:" whose name starts with "anime_01_065_t1_" to folder "MacHD:testfolder2:"

そんな時は、無理せず、do shell script。Finderは、数千項目などの処理には「全く向かない」と考えて、他の手段で抜き出します。

do shell script "mv " & (POSIX path of "MacHD:testfolder:anime_01_065_t1_*")& " " & (POSIX path of "MacHD:testfolder2:")

なんのヒネリもないmvコマンドですが、AppleScriptと組み合わす事によって、様々なアプリケーションと連携が可能です。

でもまあ、上記の例だと、AppleScriptのうまみはほとんどない‥‥ですネ。ターミナルでやりゃ良いんだもん。

AppleScriptを使う以上、汎用性の高い、「カットごとの分別はおまかせ」的なツールに仕立て上げたいですよネ。

で‥‥、今回(と次回)のテーマは、「ファイルの分別」です。

AppleScriptは、「大量のファイルを捌くのは苦手」‥‥とされてきました。Finderの挙動が、誤解を招いてきたのかも知れません。

しかし、使い方次第で、いくらでも高速化できる事を、実践してみたいと思います。UNIXが見方ダヨ。

「レンダリングフォルダの中に、何カットものDPX連番ファイルを出力した」「カットごとにフォルダを分別するのが面倒」「After Effectsでフォルダを毎回指定するのも面倒」「さらには、関係ないPSDファイルやJPEG、QTファイルもあり、ごちゃごちゃになっている」「しかも、数は5,000ファイルを超える」

‥‥まあ、こんな事になる前に、After EffectsでESTKスクリプトを実行して、「連番ファイルの親フォルダを作る」のを自動化すれば良いんでしょうが、それはまた別の機会に。

とにかく、地獄絵図のようなフォルダの中から、「アンダーバーで区切られたカット名を持つファイルを、それぞれカットごとにフォルダを新作して分別する」ミッションを、AppleScriptにてクリアしたいと思います。


まずは、事前の確認。。。

カット名の規則は‥‥

作品名_話数またはシーン_カット番号_tテイク番号_連番.ファイル拡張子

という運用がなされているものとします。別の命名方法でも良いんですが、今回はこの命名規則を用います。

ちなみに‥‥

「いや‥‥。カット名も実は、作業者毎、個人個人バラバラで‥‥」

‥‥とか言う場合は、「運用のところ」から見つめ直しましょう。決まった法則でファイル名を運用出来てないのは、すなわち、「私(私たち)は価値ある時間を、混乱の収拾のために、無駄に費やしたいのです」と宣言しているようなもんです。最低でも「各作業セクション内では統一した規則で運用」すべきで、「自動処理以前に、まず運用の基本を形成して楽になろう」‥‥ですネ。

ワークフローを軽視せず、命名規則もキチンと規定してあれば、AppleScriptは守護天使のように、作業者・クリエーターに力を授けてくれます。

では後半へ続く。

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はホントに、使い方次第、‥‥なんです。





もののねだん

私は資料用として、よくスケールモデル(実機のあるプラモデル)を購入しますが、「中古プラモデルまとめ売り割引」の時に、何とも言えないワビしいキモチになる事があります。

中古プラモ10点買うと、XXパーセントさらに割引‥‥とか言う時に、「あと一点あれば、対象になる」という場面があります。

その時に、私が買うのが、値崩れ商品です。値崩れ‥‥といっても、壮絶なヤツを、最近買いました。

まず、アマゾンでの値段。

古代ロボ「ゴダイガー」1390円なり。

一方、中古プラモの通販の定番、駿河屋。

古代ロボ「ゴダイガー」15円なり。


なんて言うか。‥‥‥15円とか、異常な値段です。しかも「新品」。ちなみに私が買ったのは、14円の中古。


しみじみ‥‥と、感慨にふけります。

総額での値引き目的で買うものの、そこはやはり、プロダクトとして可哀想なので、何かしらに役立てようとキットを眺めるのですが、しばし間の後、「アイデア保留」で棚の一番奥に収納されるのです。

ちなみに、箱の側面を見ると、「300円」が定価だった事がわかります。

私はごく稀に、資料目的以外に、「幼少の思い出」ノスタルジー目的でハセガワとかの中古プラモを買いますが、そっちは逆に値段に多少のプレミアが付いているのです。200円だったものが、600円とか。(ゴダイガーを15円で売る駿河屋でネ)

でもまあ、「ゴダイガー」もある種、ノスタルジーではあります。「あの頃の日本」の。

注)駿河屋の9円とか15円とかの商品、アマゾンでよくある「配送手数料でペイする」からくりではありません。もちろん、1500円以下だと送料がかかるとかは普通にありますが、「商品1つにつき必ず配送手数料」という仕掛けは無しです。

市販書との違い

アプレット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のフォルダの話題に戻って‥‥。フォルダを自由に作れるようになれば、夥しい量のファイルをまとめて整理する事も可能になりそう‥‥なのは、想像できるんじゃないでしょうか。




calendar

S M T W T F S
      1
2345678
9101112131415
16171819202122
23242526272829
<< February 2020 >>

selected entries

categories

archives

profile

search this site.

others

mobile

qrcode

powered

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