Diary?

2008-01-06
Sun

(13:18)

それにしても JavaScript とか ActionScript を使った開発はバカげている。何がバカげているかというと、要するにこれらを使った開発では全く違った言語同士が密結合していて、その部分がさらに文脈上では明示的になっていないというのがふざけている。

昨日書いたコードを例に出してみるけど、例えば JavaScript から ActionScript を制御するには次の用なやり方がある。

<object id="sample" width=128 height=64>
	<param name="movie" value="sample.swf">
	<embed play="false" swliveconnect="true" name="sample" src="sample.swf" quality="high" width=128 height=64 type="application/x-shockwave-flash"></embed>
</object>
<script language="JavaScript">
function setFoo() {
  if(window.sample) window.document["sample"].SetVariable("foo", "bar");
	if(document.sample) document.sample.SetVariable("foo", "bar");
}
</script>

人によっては既に俺が何にムカついているのかわかってしまっていると思う。一応解説しておくと、このコードは "sample" という識別子の SWF オブジェクトの "foo" という変数に "bar" を代入するコードなのだけど、何で別の言語のプロパティを直接書き換えられるんだよ! SWF オブジェクトの取得方法が極めて格好悪いのは JavaScript だから不問にするとしても、これは非常にいただけない。こういうのは signal/slot 方式っぽく次のようにした方がはるかにマシだ。

<script language="JavaScript">
function setFoo() {
  document.sample.send("foo", "bar");
}
</script>

一応、 SWF オブジェクトに "foo" というシグナルなりメッセージなりを引数 "bar" で渡しているつもり。たとえやっていることが実質変わらない (ActionScript 側に単なる setter のコードが書かれているとか) としても、こっちの方がより疎結合な感じになっている。

ちなみに ActionScript 側では次のようなコードが最初の例に対応してる。

filename = "";
this.getUrl('javascript: setFileName()');

これは javascript スキームがもろに出てきているのが嫌だ。実は fscommand という関数もあって、それだと次のように書く事が出来る。

fscommand("JSFunctionName", "Argument");

ところがこれだと JavaScript 側では次のようなコードを書く羽目になる。

<script language="JavaScript">
function sample_DoFSCommand(name, arg) {
  if (name == "...") { ... }
}
</script>

俺はこのコードを見た瞬間アホだと思ったし、何よりこのコードは VBScript まで一緒に起動され、思わぬ事故を起こしかねない。それをいったらまあ getUrl の例もそうなんだけど、危険性は少なければ少ない方が良い。

これらは ActionScript 3.0 以降では ExternalInterface という仕組みがあって、見た感じこれはかなりの改善といえる。が、 SWFC が ActionScript の仕様すべてを実装しているわけではないので使えずにいるのが現状である (あ、これは Adobe のせいじゃねえな)。もっともブラウザの実装の非互換性による混乱は相変わらずで、俺が Web 開発で一番ムカついている部分は全然改善されていないのだが。

本題とはずれるけど、こういう事をやっていると静的型システムの方が安全という意見をやっぱり疑いたくなる。確かにコンパイル時に型チェックが出来た方がエラーが発見しやすくはなるだろうが、こうやって全く別の言語同士を繋ぐケースではそこまで役に立つとは思えない。実際かなりのアプリケーションは全然別の言語と通信したり DSL を活用してるので、結局一番重要な部分の整合性は人間がとらにゃならんのだよ。それに RPC の類をつかうと、同じ言語間でも型の不整合がありえるしな。確か Joel Spolski は JavaScript と ASP なんかにコンパイル可能な独自言語を開発して、この言語間のギャップを可能な限り軽減している。これはまったくもって正しいとしか言いようがない。

(16:50)

明日からまた仕事だと思うと大変憂鬱。この連休でだいぶ回復はしているけど、この一ヶ月間テンションを保てるかどうかは微妙。

(23:14)

いくらなんでも弦がヘタれすぎだと思えて来たので張替え。俺は Elixir の弦を愛用していて、その理由は弦の寿命が長いから。弦の張替えがたるくて仕方のない俺にとっては本当にありがたい。

ところでいままでは 0.10 〜 0.52 のいわゆるヘヴィボトムを使っていたのだけど、試しに 0.11 〜 0.49 のレギュラーゲージに変えてみた。トレモロユニットの調整しないといけないんであんまり弦のゲージは変えたくないんだけど、もうちょっと弦にコシがあった方がプレイしやすいんじゃないかと思って。で、流石にヘヴィゲージは俺の指にはキツいだろうと思ってレギュラーゲージにしたわけだ。当然高音弦でのベンドに力がいるようになって、もうちょっと指と手首を鍛えないと 1.5 音ベンド (最近練習してる曲に出てくる) は難しそうだ。

まあ最大の問題は、今月からまたろくすっぽ練習時間のとれそうもない日々が続きそうだってことなんだが。

Creative Commons
この怪文書はクリエイティブ・コモンズ・ライセンスの元でライセンスされています。引用した文章など Kuwata Chikara に著作権のないものについては、それらの著作権保持者に帰属します。