2008/7/30 (水)
MobileMe、30日間無料延長のメール
‥‥が届いておりました。随分前に。
何故、そんなメールが届いているかと言うと、MobileMeが絶不調で、ユーザに多大な迷惑をかけてしまった故、そのお詫びと言う事らしいです。
「MobileMe」‥‥。「つまるところ、Appleは何を目指しているんだろうか」‥‥と思う今回の騒動です。
風呂敷を広げたのが、悪い方向に進まなければ良いんだけれど‥‥。
作成者
ezura
2008/7/27 (日)
今度はオーバークール
金魚水槽の温度を下げる為に購入したファンですが、状況によっては水温を下げすぎてしまう「冷却過多」が発生する事あります。「これ以上は下げなくて良い」というリミッターは、水槽用ファンにはついていないのです。
‥‥ので、前回利用したチャームと言う通販ショップで、サーモスタットを買い足しました。一般的なヒーター用サーモスタットではなく、設定温度を下回ったら電力供給を中止する「オーバークール対策」用のものです。
ヒーターで底上げして、ファンで頭打ちする‥‥と言う「挟み撃ち水温管理」で、きんととらは、快適な25.5〜26.5度あたりの環境で毎日を過ごせます。
作成者
ezura
2008/7/24 (木)
DURALEXのコップ
コップの多くはガラス製であり、ゆえに「割れる」宿命を背負っております。「人間に割られる」宿命‥‥と言うべきか。
ふと振り返ると、色々なコップを割り続けて現在に至っております。‥‥なので、組みのコップがどんどん減ってしまって、コップ置き場は多種多様な「ワールドアパート」的な状態に陥っております。
そんな事から、ネット通販でDURALEXのコップを、ひと揃え購入しました。
実はリンクを張ってあるショップではなくて、違う店で買ったんですが、これがまあ、何とも遅い。。。銀行振込で入金して「入金確認できました」のメールが届いた後、うんともすんとも動きが無い。まあ、いつも「極端な速さのショップ」ばかり使っている私ではありますが、6日経っても何の連絡も来ないので、こちらから催促のメールを2度送信して(実は1度目はノーリアクションだった‥‥)、入金から数えて1週間後、注文日からカウントすると10日後に、ようやく届いたのでした。こんなショップ、久々だなあ‥‥。
まあ、顧客へのサービスはともかくとして、商品そのものはGoo。形ばかりの「おしゃれ」とはほど遠い「耐久性・実用性重視」の質感です。日々使う事を考えれば、デザインも「実用性」に含まれます(使っていてイヤになるようなデザインじゃダメです)が、その点でも問題無し。
聞くところによると、ガラスの強度は5倍!‥‥らしいですが、私が日々どのくらいガラス製品に負荷をかけているのか解らないので、「5倍以上と以下の境界線」など実感できません。割れる時は割れるだろうし。‥‥ただ、「5倍‥‥と言われりゃ、そんな気も‥‥」と優柔不断チックに、商品から感じ取れる部分はあります。
DURALEXはそのデザインと耐久性ゆえの稼働率の高さから、よく飲食店で使われているらしいです。そう言えば「ピカルディ」なんかは、コーヒースタンドや洋食屋でよく見かけますネ。
でもなんか、MacだFisslerだDURALEXだなんて書くと「洋品かぶれ」みたいな印象になってしまいますが、私にとっては「外国のブランド」なんてどうでも良いんです。目的に応じた品質の高いモノが欲しいだけです。バイクやクルマは国産以外買うつもり無いですしネ。「Appleブランド」にしても、要は「MacOSXのような使い心地」のOSと周辺アプリーケションがあれば、どんなブランドだって構わない訳です。
DURALEXの良いところは、デザイン・耐久性に加えて、「それなりに安く購入できる」点です。「ナイアガラ」の330ccなんて、201円ですし、「ゼノ」も安いです。100円ショップで2〜3個買うんだったら、耐久性のあるDURALEXを2〜3倍の寿命で使った方が良い‥‥と思うんですよネ。
作成者
ezura
RAネタ、その8a「コンポジションの尺を変更」
今回はコンポジションの長さ/尺を変えるスクリプトです。‥‥が、簡単そうに見えて、実は結構厄介なのが、コンポジションの尺の変更です。何が厄介かと言うと、‥‥まあ、やってみれば解ります。
コンポジションの尺を変える事自体は、とても簡単です。
任意のコンポジション.duration=任意の秒数;
‥‥たった、これだけです。どこにも難しい点はありません。
プロジェクト内のコンポジションの尺を全変更するのも、for構文でパパパのチョイナ(ちょっと古すぎるか‥‥)です。
main();
function main(){
var fps=24;
var modDur=getSeconds(prompt("0+0書式で入力してください","","変更後の尺を入力"),fps);
if(!modDur){return;}
var p=app.project;
for(var i=1;i<=p.numItems;i++){
var itm=p.item(i);
if(itm instanceof CompItem){itm.duration=modDur;}
}
}
function getSeconds(str,fps){
if(!str){return false;}
var arr=str.split("+");
while(arr.length<3){arr.unshift("0");}
var res=(Number(arr[0])*60)+(Number(arr[1]))+(Number(arr[2])/fps);
if(!res){alert("入力した値が不正です\r[ "+str+" ]\r上記入力にてエラーが発生しました");}
return res;
}
全てのコンポジションに尺変更を適用するスクリプトを作り、これで「完成!」と喜びたいところですが、‥‥時期尚早です。何故、尚早かと言うと、このスクリプトには、大きく欠けている部分があるからです。
上記スクリプトでうまくいくのは、「尺を短くする時だけ」です。長くした場合は、寸足らずのレイヤーだらけになります。
変更前の尺は、10+0
10+0を9+18に変更

万事うまくいった‥‥ように見えますが‥‥
今度は10+18に変更

あれまあ、寸足らずのレイヤーだらけ
作業者が手作業で全てのコンポジションの尺を変更する場合、単に「コンポジション設定」の尺を変更するだけではなく、レイヤーの長さも適宜調整して作業を完結しています。上記スクリプトには、その「適宜調整」のルーチンがポッカリ欠落している‥‥と言う訳です。
つまり、コンポジションの尺を変更すると言う事は、暗黙のうちに「レイヤーの面倒も見る」と言う事なのです。
こうした状況を前にして、「スクリプトによる操作は、人が状況を判断して、臨機応変に対処するようにはいかない」‥‥と考えてしまうのだとしたら、それは単に「観察や認識の不足」からくる大雑把な物言い‥‥と言わざる得ません。
たしかにコンピュータは人間の持つ「直感」や「感情」などを持ち合わせていません。絵コンテを高解像度でスキャンする事は出来ても、熟読し演出意図を汲み取る事はできません。お話を作ったり、美しい絵を描いたりするのは、人間がやれば良いのです。
‥‥しかし、寸足らずのレイヤーを伸ばす作業に、直感・美意識がどれだけ必要でしょうか‥‥?
少なくとも私は、レイヤーの尺/長さを調整する際に、「どこからともなくインスピレーションが湧き出て」調整しているのではなく、単に「状況をいくつかのケースにあてはめて、そのケースごとの対処をしている」だけです。まさか、レイヤーの尺調整に「神頼み」する人など、居まい‥‥。
「状況をいくつかのケースにあてはめて、そのケースごとの対処をする」‥‥ごく普通に考えて、プログラム化できそうな内容ですネ。あくまで「いくつかのケース」であって、「何千、何万、何億種類の、混沌とした組み合わせ」ではないのですから。
そこで単純に、「そうか。つまり、レイヤーのout点をコンポジションのend点に合わせれば良いんだ。」と考えがちですが、‥‥そんな簡単な話ではありません。自分自身が手作業で修正する際に、そんな安易なルーチンで、レイヤーのout点を調整しているのか、自分の脳内のルーチンを観察すれば解ってきます。
この「コンポジションの尺を変更」の話題は、結構長引きそうですので、「その8b」に続けます。バイビー。
作成者
ezura
2008/7/23 (水)
RAネタ、その7「After Effectsの操作・手始めに」
RAネタ‥‥とか書いておきながら、今まではAfter Effectsを直接操作するスクリプトはあまり紹介してきませんでした。何故かと言えば、After Effectsを操作する前に、Adobe拡張スクリプトの原型のJavaScriptに慣れておく必要があったからです。
でもまあ実際、「習うより慣れろ」「必要は発明の母」とも言います。キッチリとJavaScriptを覚えてからAfter Effectsのスクリプトを始めるよりは、「とりあえず、RAでこんな事がしたいんだけど」と言うニーズに合わせて、「必要なところから覚えていく」のが現実的かと思います。
かと言って、「スクリプトを覚え始めて間もない」段階で、いきなり以前紹介した様なxtools(=コンポジットの半自動ツール)のような大規模なスクリプトを書くのは、無謀です。まずは、簡単なスクリプトから始めて「手応えを得る」のが良いと思います。
例えば、「シャイレイヤー」の表示状態をON/OFFするスクリプトなどは、とても簡単です。
任意のコンポジション.hideShyLayers=true;//シャイレイヤースイッチをON
任意のコンポジション.hideShyLayers=false;//シャイレイヤースイッチをOFF
現在表示中(アクティブ)のコンポジションのシャイレイヤースイッチをONにしたい場合は、 app.project.activeItem.hideShyLayers=true; とします。
‥‥こんな操作、手動でマウスクリックしても何も変わらないじゃん‥‥と思うのは、ごもっとも。
しかし、「プロジェクト内の全コンポジションのシャイレイヤースイッチをONにする」場合は、歴然と差が出ます。手動の場合は、各コンポジションを開いてマウスクリックして回らなければなりませんが、下記の1行スクリプトならば一瞬です。 for(var i=1;i<=app.project.numItems;i++){if(app.project.item(i) instanceof CompItem){app.project.item(i).hideShyLayers=true;}}
スクリプトの内容は、「プロジェクトの項目を総当たりで検索して、もし項目がコンポジションだった場合は、シャイレイヤースイッチをONにする」‥‥と言う内容です。
‥‥総当たり。手動だったら、これほどイヤな操作はありませんが、スクリプトでAfter Effectsプロジェクト内の全項目を検査するなど、大した事ではありません。
もし何らかの理由で、「全てのシャイレイヤースイッチをON/OFFにしなければならない」作業が発生した場合、たった1行のスクリプトが書けるか否かで、その作業者の作業負担が左右されてしまう訳です。
今回はシャイレイヤーのスイッチのON/OFFという内容でしたが、RAにはまだまだ沢山の操作可能項目があります。現在の作業において「憂鬱な作業」を、もしかしたらRAにてスッキリと払拭できるかも‥‥知れませんネ。
作成者
ezura
RAネタ、その6「レンダリングの予測時間」〜補足
「RAネタ・その6」のblog記事は、ソースに文字数をとられてしまった為、動作の様子しか紹介できませんでしたので、少々補足です。 var fps=Number(prompt("フレームレート(24か30)を入力",24,"フレームレート"));
if(!fps){return false;} ユーザ入力ダイアログの次に return false; しているのは、もしユーザがキャンセルした場合に、処理を中止する為です。これをやっておかないと、キャンセルボタンをクリックしても、どんどん次に進んでしまいます。
var d=new Date(); 日時の計算をする為に、Dateオブジェクトを生成しています。JavaScriptはミリ秒(1/1000秒)に変換した上で計算した後、Dateに戻す段取りのようです。私はAppleScriptに慣れているので、この辺は面倒に感じます。(他の多くの部分は、JavaScriptの方が楽だったりしますけど)
下図はAppleScriptでの日時計算の様子
また、今まで紹介したスクリプトと大きく違う点は、functionを使っている事です。 function getFrameCount(str,fps){} functionはユーザ独自の処理ルーチンのようにも使えますし、オブジェクトの原型作りにも使えます。ちなみに今回の例は、処理ルーチンとしての使い方しかしていません。
「getFrameCount」とかは一度しか使ってないので、functionで括らずにmain本文にそのまま書き込んじゃっても良いのですが、‥‥私の癖で「もしかしたら何度も使い回すかもしれない処理は、モジュール化しておく」書き方となっています。‥‥まあ、1回しか使わなかったのは、たまたま‥‥と言う事で。。。
ひとまとまりの処理をモジュール化・コンポーネント化して本文と分けておくと、後で修正が容易になりますし、他のスクリプトへの再利用も簡単になります。
ちなみに、スクリプトが複雑化してくると、最初の設計が肝心になってきます。このblogスペースに書ききれる内容のスクリプトならば、まだ収拾も容易ですが、「データベースと通信し、素材を検索し、タイムシートファイルを解析し、新規プロジェクトを生成し、云々...」のような長大なスクリプトは、スクリプトを書く前の「設計」が非常に重要になってきます。
特に、セルやフレーム、カメラなどの要素は、扱いが煩雑になりやすいので、コードを書く以前から、JavaScriptがプロトタイプベースである事を活かして、オブジェクトとして扱う設計にしても良いでしょうネ。
//サンプル
var a_cell=new Cell("A",12,true);
alert(a_cell.name+"("+a_cell.typeName+")のセル枚数は"+a_cell.length+"枚です");
function Cell(name,length,isMask){
this.name=name;
this.length=length;
this.isMask=isMask;
this.typeName="通常セル";
if(isMask){this.typeName="マスクセル";}
this.timing=[];
}
//まだ、色々と要素はありますが‥‥
アニメ制作の様々な要素を、どのようにオブジェクトとして定義するか?‥‥などの基本設計は、従来の要素の定義だけでなく、未来の映像制作を見据えた上での「拡張性」を併せ持たなければならないので、大変です。‥‥が、折角コンピュータを使って仕事をしているのですから、コンピュータの能力をふんだんに取り入れた質実剛健なワークグループを構築したいものですネ。
作成者
ezura
2008/7/22 (火)
mobile me。大不調
‥‥のようです。私もご多分に漏れず、本日不調の真っ直中です。
3時間前のメールが今頃受信できる始末。不安だなあ‥‥。
‥‥う〜ん、円滑に移行できないくらいなら、わたし的には、今までのmac.comの体裁で全然構わないんですけどネ。。。
作成者
ezura
RAネタ、その6「レンダリングの予測時間」
今までいくつかのRAネタを紹介してきた訳ですが、中にはRAと言いながらAfter Effectsが無くても動作するスクリプトも含まれていました。
今回のRAネタもその類いで、After Effects無しでも動く、「任意の尺のレンダリング時間を計算する」スクリプトです。
映像制作をしていると、「スケジュールの残り日数でレンダリングが間に合うか?」とか、「xx日後にレンダリングを終了させる為には、どれだけマシンの増強が必要か?」などの計算が必要になる時があります。クオリティ優先型にしろ、速度優先型にしろ、「レンダリングの見通し」は重要な管理項目です。
「レンダリングの見通し」には、色々と考慮すべきファクタが存在しますが、今回はシンプルに、「マシン台数」のみを考慮したスクリプトを作ってみます。基本的な計算ルーチンは、「フレーム数xレンダリング時間平均値/計算端末数」なので、数行のスクリプトでもこなせる内容ではありますが、計算結果の可読性を向上させるため、少々スクリプト文が長くなっています。
//ソース
if(!main()){alert("処理を中止しました\rもしOKボタンをクリックしたにも関わらず、このアラートが表示された場合は、直前の入力データを確認してください");}
function main(){
var fps=Number(prompt("フレームレート(24か30)を入力",24,"フレームレート"));
if(!fps){return false;}
var rndrAvSec=Number(prompt("1フレームあたりのレンダリング所要時間(秒数)を入力",5,"レンダリング平均値"));
if(!rndrAvSec){return false;}
var frCount=prompt("ムービーの尺を入力\r\r分+秒+コマ\r秒+コマ\rコマ\r\r上記3種類いずれかの書式で入力","3+0","尺");
if(!frCount){return false;}
frCount=getFrameCount(frCount,fps);
if(!frCount){return false;}
var dur=Math.round(frCount/fps*100)/100;
var macCount=Number(prompt("レンダリングに使用するマシンの台数を入力\r\r*マシンの処理速度や使用状況に応じて、小数点入力も可能です\r例:標準マシンの1.2倍の処理速度のマシン→1.2\r例:1日あたり12時間しか使えない場合→0.5",2,"マシンの台数"));
if(!macCount){return false;}
var res=rndrAvSec*frCount/macCount;
var d=new Date();
d.setTime(Math.ceil(d.getTime()/(3600*1000))*3600*1000);
var date1=d.toLocaleString();
d.setTime(d.getTime()+(Math.ceil(res)*1000));
var date2=d.toLocaleString();
prompt("[計算内容]\rフレームレート:"+fps+"fps\rフレーム数:"+frCount+"\rデュレーション:"+dur+"秒 == "+secToDate(dur,false)+"\rマシン台数:"+macCount+"台\rレンダリング平均値:"+rndrAvSec+"秒/フレーム\r\r[レンダリングスケジュール試算]\rレンダリング開始日時:"+date1+"\rレンダリング終了日時:"+date2,"試算結果:"+Math.ceil(res)+"秒 == "+secToDate(res,true),"計算結果");
return true;
}
function getFrameCount(str,fps){
var arr=str.split("+");
while(arr.length<3){arr.unshift("0");}
return (Number(arr[0])*fps*60)+(Number(arr[1])*fps)+Number(arr[2]);
}
function secToDate(sec,isdate){
if(isdate){
return Math.floor(sec/(3600*24))+"日"+Math.floor(sec%(3600*24)/3600)+"時間"+Math.floor(sec%3600/60)+"分"+Math.ceil(sec%60)+"秒";
}else{
return Math.floor(sec/60)+"分"+(Math.round(sec%60*100)/100)+"秒";
}
}
//ここまで
‥‥う〜む、blogで書くには長いソースですネ。。。
早速実行してみます。例えば、10分のムービーをマシン2台でレンダリングした場合、以下の様になります。


1フレームあたりのレンダリング時間平均値を秒数で入力します。


計算結果は以下の通り。

計算結果は「単純にレンダリング時間を計算しただけ」のものであり、この結果を実際の現場の状況に即して読み替えるには、それなりの作業経験が必要です。
私自身、近作のSkyやGIS2.0でも、こうした計算を定期的におこない、作業見通しを占う情報として役立てています。この計算式にさらに、作業供給率やリテークによる損失率、カットの難易度の分布、マシンの性能比などを組み込んで、より「使い物になる情報」を算出する訳です。
今回はコードに文字数をとられてしまったので、ここで完。
作成者
ezura
Ubunto, その後
唐突な思いつきから使い始めたUbuntoですが、結構気に入っています。日頃、MacOSXで事足りてしまっているので、頻繁に使う事は無いですが、日本語のIMと言い、Fontの見やすさといい、ストレス無く使うことができます。実際、自宅での使用率はOSXについで2番目となり、WinXPよりも使うようになってしまいました。
インストールしてすぐにあれやこれや使える事自体が、(Linuxとしての観点において)非常に新鮮な感じです。従来のLinuxのイメージが良い意味で壊れます。私はパソコンでゲームをするわけでもなく、雑誌の付録のソフトを使う事も無いので、絵や映像の仕事をしようとさえ考えなければ、かなりの部分をUbuntoでこなせそうです。Open OfficeやGimp、音楽や映像プレイヤーがプリインストールされているので、環境を整える段取りを大幅に省略できます。実際、インストールしてから現在まで、「アップデートマネージャ」が全て面倒を見てくれています。以前のLinuxでは(少なくとも私が使って来たいくつものディストリビューションでは)無かったことです。
実はこのブログ記事も、UbuntoからFireFox3を用いて書き込んでいますが、何の不都合も発生していません。(ちょっとだけ、入力ページのレイアウトが崩れていましたが、許容範囲です。それに、レイアウト崩れは、Ubuntoそのものの不具合ではないですし。)
企業払い下げ・リース流れのそこそこ高性能な中古PC(1万円台で買える)だったら、Ubuntoは快適に動作するんじゃないでしょうか。
作成者
ezura
2008/7/21 (月)
金魚の水温
ここのところの熱さで、クーラーをつけていても室内の温度がなかなか下がらず、連鎖で金魚水槽の水温まで28度を超す状況となってしまいました。
金魚が28度??‥‥かなり、ヤバい水温です。せめて、25度程度には落とさないと、色々な病気が出易くなります。‥‥というか、必ず病気になる!‥‥と言っても言い過ぎではありません。
‥‥で、よく見たら、既にヒレに異常のある子が2匹ほどいます。病状はさほど大きくはないものの、放っておいたら悪化する事は明白なので、病気治療用の小型水槽に移して薬浴です。困った事に、この小型水槽の水温もどんどん上昇してしまい、ここ数年の猛暑の破壊力を思い知らされます。クーラーがふがいなく感じる程、外気温が高すぎるのでしょうネ。
空気循環用の小型扇風機(1,480円くらいのよく見かけるタイプ)を設置し、小型水槽側面をなでる様に風をあててみたら、水温がグングン下降し、24〜25度に落ち着きました。
冷ます対象に扇風機を当てる‥‥何ともプリミティブな対処ですが、効果絶大。
さらに通販(Charmと言うショップ。注文受付日の翌日に届くスピーディーな通販がgood。)で購入した「水槽用冷却ファン」を、メイン水槽に設置してみたところ、28度だった水温が、2時間程度で25.5度まで下がりました。‥‥実は「ほんとにそんなんで、水温が下がるのか?」と半信半疑でしたが、こんなに確実に効果として表れるとは‥‥、見くびってしまって、申し訳なかった‥‥。
ちなみにファンはコトブキの「スポットファン202」というヤツです。
水面に風を当てるのは、水を冷やすのではなくて、水を気化させるためのようです。気化熱を用いた原理らしいです。
でも小型水槽に風を当てた私の対処法は、どう考えても「マシンを冷却する際のソレ」です。風は水面に「びたひと吹き」足りとも供給されておりませんし、気化による水の減少もありません。
‥‥水温を扇風機(ファン)で下げる方法は、色々あるようですネ。
いやはや、近年の夏は熱さ爆発の日々が続きます。子供の頃は、こんなに熱く無かった様に思うんだけど?? ‥‥金魚だけでなく人間も「本気で熱さに対処」しないと、身が保ちませんネ。
作成者
ezura
RAネタ、その5「ツールっぽいスクリプト」
レンダーオートメーション/Adobe拡張スクリプトを紹介する「RAネタ」シリーズの第5弾は、「ツールっぽいスクリプトを作る」内容です。
今まで紹介したスクリプトは、どれも「状況に合わせてソースを書き換える」内容のものでした。
スクリプトを実行する際にAfter Effectsの「ファイル>スクリプト」メニューから呼び出す場合、いちいちソースを書き換えてから呼び出すのは少々遠回りです。そこで、「ダイアログ画面で、ユーザの入力を受け入れる」仕様のスクリプトを作ってみましょう。
「尺をフレーム数に、フレーム数を尺に」変換するスクリプトを作ってみます。
var fps=24;
do{
var res=prompt ("コマ(フレーム)数または尺を入力", "","24FPS換算");
if(!res){break;}
var arr=res.split("+");
if(arr.length==1){
res=prompt(fps+"fpsによる計算結果",Math.floor(Number(res)/fps)+"+"+Number(res)%24,res+"コマ(フレーム)の尺");
}else if(arr.length==2){
res=prompt(fps+"fpsによる計算結果",Number(arr[0])*fps+Number(arr[1]),res+"のコマ(フレーム)数");
}else{
alert("入力が無効です\r入力した文字列:"+res+"\r\r入力書式を確認してください");
}
}while(res);
今回のスクリプトは、「続けて計算したい」場合に備えて、連続で入力&処理できる仕様にしています。do{ } while( )‥‥を使ってループする事により、キャンセルボタンをクリックするまでウィンドウが出てきます。
また、「尺表記を入力した場合はフレーム数に、フレーム数を入力した場合は尺表記に」という「状況に応じて結果を変える」スクリプトにするため、if分岐で処理を変えています。こうする事で、「尺表記を入力した場合のツール」「フレーム数を入力した場合のツール」‥‥みたいに、わざわざ2つのスクリプトを使い分けなくて済みます。
ちなみに、計算結果を入力欄に表示する仕様にしたのは、計算結果をクリップボードにコピー可能にする為です。計算結果を「コピペ」できるようにした訳です。
実際に実行してみると、

まずはフレーム数「160」を入力。。。

尺表記の「6+16」がちゃんと返りました。

次に尺表記の「12+18」を入力。。。

ちゃんとフレーム数が返りました。
スクリプトは、これにて完成しました。動作も思った通りの内容です。
ちなみに、自分で作っておきながら、イジワルな「想定しない入力」をしてみると、以下の様になります。

フレーム数か尺を入力せよ‥‥なのに、「あいうえお」の入力をする事は無いとは思いますが、とりあえずは実験。

「NaN」つまり、「Not a Number」が表示されました。つまり、「計算不可」と言う事ですネ。

今度は、尺表記を「自分なりに拡張してみた」入力をしてみます。

これに関しては、既にスクリプト文中で「想定内の状況」だったので、警告ウィンドウが出る様に仕掛けてあります。
「想定しない使われ方」。‥‥実は、今まで紹介したスクリプトは、こうした「想定しない使われ方に対する対処」を全くと言って良い程、施していません。なぜエラーへの対処を組み込んでないかと言うと、当初から「エラーハンドリングまみれ」のスクリプトを紹介していては、内容が解り辛いと思ったからです。
また、この手の「専門作業用ツール」は、想定ユーザを特定しやすいので、「After Effectsをさわった事も無い」ユーザは最初から対象から除外できます。もっと極端な例では、「自分しか使わない」事もあります。ゆえに、必要以上のエラーハンドリングは不要‥‥となり、スクリプト作成期間が大きく短縮できます。でもまあ、自分でも簡単にハマる「落とし穴」は、未然に塞いでおいた方が良いですネ。
あくまで自分が使う時の利便性を考えて、ちょっとしたGUIをスクリプトに付けてみた作例でした。
作成者
ezura
2008/7/19 (土)
RAネタ、その3「独自の設定ファイルを読み込む」
RA(レンダーオートメーション)を紹介する「RAネタ」シリーズですが、今回は前回の「外部のテキストファイルから、テキストレイヤーの内容文を読み込む」スクリプトを一歩進めて、「外部の設定ファイルから、設定を読み込んで適用する」スクリプトを紹介したいと思います。
今回の作例はとっかかりとしては非常に簡単。コンポジションの仕様を記したテキストファイルを設定ファイルとし、それを読み込んで新規コンポジションを作る内容です。
設定ファイルは以下の様に、ShiftJIS/LF改行で作りました。

何とも単純なテキスト内容ですが、これでも立派な設定ファイルです。この手の「テキストによる設定ファイル」の良いところは、「可読」と言う点です。
スクリプトは以下のようになります。for構文など前回に比べてちょっとだけ難しくなっていますが、‥‥まあ、「慣れ」でしょうネ。
theFile=File.openDialog ("読み込む設定ファイルを選択");
if(theFile){
theFile.open("r");
var textContents=theFile.read().split("\n");
theFile.close();
var pref=new Array();
for(var i=0; i<textContents.length; i++){
var textValue=textContents[i].split("=");
if(textValue.length>1){pref[textValue[0]]=textValue.slice(1).join("=");}
}
pref["尺"]=Number(pref["尺"].split("+")[0]) + (Number(pref["尺"].split("+")[1])/Number(pref["フレームレート"]));
app.project.items.addComp(pref["名前"], Number(pref["寸法"].split(",")[0]), Number(pref["寸法"].split(",")[1]), Number(pref["ピクセル縦横比"]), pref["尺"], Number(pref["フレームレート"]));
}

スクリプトを実行し、コンポジションを作ってみた結果です。「コンポジション設定」を見ると、テキストファイルで記述した通りの内容に仕上がっています。
いくつか補足しますと、まず「split("文字")」は文字列を任意の文字で分割する役割を果たします。例えば "1,2,3".split(",") ならば、結果は [1,2,3] と言う配列(要素をひとまとめにしたもの)になります。逆にjoin("文字")は任意の文字による結合で、 [1,2,3].join("と") を実行すると、 "1と2と3" になります。例文では、改行文字による分割と、「=」による分割・結合などをおこなっています。
また「pref」と言う配列を形成する際に、「見出しと値」のペアで配列に格納しています。とある言語では「ラベル付きリスト」とか「キーとバリューによる連想配列」とか呼ばれる類いのもので、要は「検索を容易にする為に、連想しやすい見出しを付けて、値を配列の中にしまう」と言う事です。実は設定ファイルは、この「見出しと値」による配列を形成しやすくする為、「名前=xx_01_001_t1」などのように、「=」で繋げて記述してあります。
Number()は、テキスト内容を明示的に数値として宣言・定義する内容を持ちます。JavaScriptは「暗黙の型変換」、つまり「1080」と言う文字を1080と言う数値に自動で変換する機能を持っていますが、これがビミョーにうまく働かない事(自分の意図した通りにならない事)もあります。

「JavaScriptが自動で変換してくれるかも知れない」みたいな曖昧な状態に委ねるよりは、最初から数値として定義してしまったほうが、明快で安全です。
その他、「秒+コマ」を「秒」に変換する部分などがあり、全13行のスクリプトとなっています。めでたく、「設定ファイルからコンポジションを自動生成」するスクリプトが完成しました。
以上のスクリプトを見て、「こんな簡単な内容、手作業でやっても変わらない」と感じる人は、「種を種としか受け取れない」人なのかも知れません。逆に、「これができるんだったら、さらに発展させて、あんな事も、こんな事もできるかも」と想像の膨らむ人は、「種の成長した姿を予見できる」人なのかも知れませんネ。
例えば、設定ファイルの持つ情報をオンラインで各端末に供給すれば、少なくとも設定に関する「ケアレスミス」は防ぐ事が出来ます。

各自がスタンドアロンで作業する場合

共通の基本設定をサーバから取得する場合
でもまあ、まずは「自分の作業をスクリプトが手助けしてくれる『快感』」を体験する事が先決かと思います。種を地中に埋めて、芽が出た時の喜びを体験すれば、その先の「姿」も見えてくるのではないでしょうか。
作成者
ezura
2008/7/18 (金)
RAネタ、その2「エクスプレッションだけではダメな理由」
エクスプレッションは、After Effectsの昔のバージョンに実装されていた「モーション計算」が進化したツール‥‥と言えるでしょう。「モーション計算」‥‥つまり、コンポジション内のレイヤーに関する色々な動作・モーションを計算にてコントロールする機能です。例えば、秒針や振り子の動き、パトライトや警告灯の点滅、マルチプレーンカメラ風のモーションコントロールなど、活用場所は多岐にわたります。
私にとってエクスプレッションは「After Effectsを使い続ける、大きな理由」の1つですが、だからといって「万能」な訳ではありません。
エクスプレッションは、あくまで「コンポジション内の要素」に対して働く、「作業時にすぐに手が届くツール」であり、武器に例えれば、刀やハンドガンに相当するものです。サッと取り出して、パッと使えるフットワークの良さが売りです。
故にエクスプレッションは、After Effects全域の要素を縦横無尽に扱う機能は有していません。有効範囲を限定する事で、エクスプレッションなりの使い易さを追求しているのでしょう。
ですから、エクスプレッションの有効範囲外の要素をスクリプト駆動する場合は、RA(レンダーオートメーション)を用いる事となります。最速だと数秒でスクリプトを書いて適用できるエクスプレッションに対して、RAは何だかんだとフットワークが重いのが難点ですが、重いは重いなりに、エクスプレッションとは違った働きをします。
例えば、エクスプレッションでは、「新規レイヤー」を作ることはできませんし、「新規コンポジション」「新規プロジェクト」を作ることもできません。しかしRAでは簡単に作成可能です。
var comp=app.project.items.addComp("test", 720, 540, 1.0, 3, 24);
comp.layers.addText(system.userName+"/"+system.osName);
上記のスクリプト例を要約すると、
「プロジェクトの項目に、新規コンポジションを、『名前:test、横:720px、縦:540、ピクセルレシオ:1.0、尺:3秒、フレームレート:24』にて、追加せよ」
「コンポジションにテキストレイヤーを、「ユーザ名/OS名」の内容にて、追加せよ」
‥‥となります。私の環境での結果は以下の通り。

さらに、RAは外部ファイルの読み書きも可能ですから、新規テキストレイヤーの内容文を外部ファイルから取得する事も可能です。例文は以下。
var theFile=File.openDialog ("読み込むテキストファイルを選択");//ファイルの選択画面
if(theFile){//もしユーザがファイル選択したら
theFile.open("r");//ファイルをreadモードでオープン
var textContents=theFile.read().replace(/\n/g,"\r");//ファイルを読み込んで改行文字を復帰文字へ変換
theFile.close();//ファイルをクローズ
var comp=app.project.items.addComp("test", 720, 540, 1.0, 3, 24);//新規コンポ作成
comp.layers.addText(textContents);//新規テキストレイヤー
}

ShiftJIS/LF改行のテキストファイル
*作例ではテキストエディタ「mi」を使用

スクリプトでテキストファイルの中身を読み込んで、新規テキストレイヤーを作成
もちろん、読み出すだけでなく、After Effectsの値をテキストファイルに書き出す事も可能です。この「ファイルの読み書き」を利用すれば、タイムシートのテキストファイルからタイムリマップデータ(キーフレーム)への変換処理や、タイムリマップデータからタイムシートを書き出す処理なども可能です。さらには、After Effectsから「伝票」を書き出す事もできます。どれもエクスプレッションでは不可能な領域のスクリプトです。
エクスプレッションとRAを、時と場所に応じて使い分ける事で、多様なニーズに対応できます。どちらか一方だけでは実現不可能で諦めざる得ない事でも、エクスプレッションとRAを併用する事でググんと可能性は広がる‥‥と言う事ですネ。
作成者
ezura
|