2008年02月26日 zio-rossolabo VRM, SCRIPT 「名前解決」というとどうしてもDNSを思い起こすが、(中略)、DHCPに何でもお任せという感じが楽でイイなぁ。/↓DOMAINとIPでは階層が違うということですか?/宜しくお願い致します。m(__)m
2008年02月26日 ghost-vrmovies ↑そのDHCPの比喩、おかしいですよ。 /解説が必要ですか?(ここには量的に書けないのでweblogで書くことになりますよ)
について。
まず、お断り。以下は“比喩”としてのDNS、DHCPに関して述べるものなので、DNSとは何ぞや?DHCPとは?の解説として読まないように。必然的に概説はしますが、正しい知識を得たい人は然るべく書籍等で学ぶべきです。
* * *
DNSは、ドメイン名(例:www.imagic.co.jp)から、一意に対応するIPアドレス(例:203.174.67.168)を調べるための仕組みです。IPアドレスは、人間から見ると意味のない数字の羅列です。これではインターネット上のサーバを指し示すのに不便なので、人間から見て意味のある言葉に見える“ドメイン名”に置き換えて利用するのが一般的です。ドメイン名からIPアドレスを調べることを(名前の)「解決」と言い、これは英語のresolveの訳です。
より広義には、扱いたい何らかの集合の写像となる便宜上の名前の集まりを「名前空間」と呼び、この名前を使って元の集合の要素を特定することを「名前解決」と呼びます。
対してDHCPは、ネットワーク内で原則として重複が許されないIPアドレスを、手間をかけずにユニークに保つための仕組みです。DHCPがないと、ネットワーク上のすべてのノード(コンピュータその他、IPアドレスを有するもの、の意)に対し、それぞれに確実にユニークになるIPアドレスを調べて設定する必要があり、その確実性は保障されません。DHCPを使うと、自動的にある範囲の中からユニークなIPアドレスがノードに与えられ、かつ、そのユニークさが保障されます。
元エントリの主題は、VRMビュワーが起動する際の部品名の“名前解決”に関するものでした。より厳密に言うと、VRMビュワーは、スクリプトをコンパイルする際、スクリプト中のcall命令等に連ねて書かれた部品名から、VRMレイアウトデータ上の部品番号(レイヤーパレット上で配置された部品名の左に表示される[n])を調べます。さらに厳密に言えば、その部品番号と対応するVRMビュワーバーチャルマシン内の、オブジェクトを管理するデータ構造の先頭(またはオフセット)アドレスを、です。
上記はVRM4の挙動のブラックボックス的な解析と、一般論としてそれしかあり得ない、という予断によるものであり、実際の実装とは相違があるかも知れません。REなんかしてません、してないんだったら。
これは、zio氏が「DNSを思い起こす」と書いておられるように、本質的にDNSと同じ目的をもった仕組みです。ユーザーがスクリプトで「この部品に〜させたい」と思ったときに、レイヤーパレットの部品番号を指定するのは、Webサイトを参照するのにIPアドレスで指定すること以上に非現実的です。なので、各部品の設定メニューから「名前」をつけて(ドメイン名に相当)これをスクリプトのコンパイル時に「解決」します。同時にこれが、参照される名前がユニークでなければならない理由でもあります。インターネット上のドメイン名を勝手に名乗ることが許されない(名乗ってもネット全体で解決しないので意味がない)のと同じことです。
ちなみに、レイアウター上で部品をクリックして選択する行為も、広い意味では名前解決の一種です。重なった部品をクリックすると、候補がポップアップしその中からの選択を要求されますが、これは、レイアウター座標上の名前にあたる部品の位置が重複していて、ワンクリックでは名前解決しないからです。ビュワー起動時のコンパイルについては、このような手法でユーザーの判断を仰ぐことが出来ない(というか、それは現実的ではない)ので(是非はともかく)ビュワーは起動を中止してしまいます。
さて、VRMにおいてIPアドレスに相当するものは何でしょうか。実は「部品番号」がそれに当たります。部品番号は、2から始まって
(1はおそらくレイアウトオブジェクト自身を指しています)以降、増えることはあっても減ることがありません。部品を削除しても、欠番は再利用されず、部品をコピー&貼り付けしても「名前」は重複しますが部品番号は決して重複せずに、確実にユニークなものが割り振られます。
実は、これこそがVRMの世界の「DHCP」に相当する機能です。DHCPとは異なり、欠番の再利用がおこなわれませんが、ユニークな番号を維持する仕組み、という意味でまったく同じです。VRMでは、同じ仕組みがリソースIDやイベントIDの採番でも利用されています。スクリプト組み込み可能な部品をパーツパレットからドロップした際のデフォルトの「名前」もそうですよね。
以上が、前提知識です。
ボクが「おかしいですよ」と申し上げた理由は、zio氏が「DNSは複雑だからDHCPの方が楽でいい(趣意)」とおっしゃったからです。DNSとDHCPは、ここまで述べたように、比較するものではなく、まったく異なる目的をもった仕組みであり、かつ、どちらも相当するものがVRMに実装済みです。そういう意味でおかしい。
そして、敢えてそれを公に指摘した理由は、VRMユーザーに限って言えば「DHCP」は家庭用のブロードバンドルータの「PCのIPアドレス設定をしなくてもよくしてくれる機能(これはDHCPの一面であり、本質ではない)」を指しており、zio氏の(不適切な)比喩を真に受けて「そういう簡単な仕組みを提供してくれないI.MAGiCは駄目だ」という誤った印象を持って欲しくなかったからです。
ちなみに、元エントリもCaldia氏の発言を受けて、ほぼ同じような意図で書いています。いや、どちらかというとこれは、彼がコンピュータ系の学生さんだということを知っているので、彼(また同様のお立場のVRMユーザー)の向学のために、という意識の方が強かったかも知れません。
なお、実際のDHCPは(一定規模以上のネットワークを管理する立場から見れば)決して簡単な仕組みではなく、その管理はDNSと比べて決して簡単なものではありません。
* * *
強いて好意的に解釈して、zio氏の発言を「(家庭のDHCPクライアントのように)ユーザーが意識しなくてもうまく動いてくれるもの」という意味だとすると、これは最早、現行のVRM4とは相容れないパラダイム(枠組み)であり、「DHCP」などと本質的にVRMとは無関係なモノを比喩として使って片付けるのは、より不適切です。
VRM4では(スクリプトに限らず)、ユーザーが部品(オブジェクト)単位で「これを〜したい」と明示的に指示すること、がすべてに共通する原則になっています。例外的なのは、高度の自動設定と近接するジョイント付き部品間の連結です。それ以外は、GUIで選択するにせよ、スクリプトで名前を手打ちするにせよ、必ず一意に「この部品を〜するのだ」とユーザーが決めるのが基本的な設計思想です。
「ユーザーが意識しなくてもうまく動く」というのは、たとえば、信号部品を配置すると、VRMシステムが勝手に近くの線路を担当するものと割り当て、それがユーザーの望む動作であろうがあるまいが、勝手に閉塞し、勝手に編成を停車させる、そういうノリです(他にもいろいろあり得るでしょう)。そのノリの是非はともかく、少なくとも現行VRM4はそういうモノではありません。「そういうモノでないのがけしからん!」という言説は一理ありますが、それについては既にボクとしては述べつくして来たので繰り返しません。
* * *
ボクは、I.MAGiCからすれば単なる一顧客であり、彼らを擁護する義務を負っていません。また、諸兄も同じくVRMユーザーであり、ボクには諸兄の発言の是非を裁く義務も権利もありません。なので、以上の解説の目的は、I.MAGiCを不適切な批判から守るためでも、zio氏が不見識であると非難するためでもありません。
ボクは親愛なるネットVRMユーザー諸兄に、聡明であって欲しいと願っています。聡明というのは、頭がいいとか、優秀だ、物知りだ、ということではなく、健全に面白おかしい、ということです。健全に面白おかしくあり続けるためには、こういう一見「どーでもいいこと」を細かくゴニョゴニョ言う偏執狂が一人くらいは必要だ、と勝手に確信しています。
なので、今後も似たようなことをし続けます。が、親愛なるVRMユーザー諸兄におかれては、どうか「ghostに突っ込まれるのが嫌だから沈黙しよう」とは思わないでください。これ以上は言葉で書いても多分伝わらない人には伝わらないので、後は適当に察してください。