解説

2008/2/26 | 投稿者: ghost

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に突っ込まれるのが嫌だから沈黙しよう」とは思わないでください。これ以上は言葉で書いても多分伝わらない人には伝わらないので、後は適当に察してください。
0



2008/2/28  0:05

投稿者:ghost

大丈夫だとは思いますが、ボクがあなたの全人格を見下しているとは受け取らないでください。

I.MAGiC Blogでカント実装の報が流れましたが、即座に思い出したのは http://red.ap.teacup.com/rossolab/66.html の予言です。

それ以上は、ボクも何も申し上げることはありません。

2008/2/27  23:29

投稿者:zio

貴兄から見れば私の知識はただの知ったかぶりに見えるというのも当然の話だろうと思いますし、これをしっかりと指摘される貴兄には敬意を表しております。しかしながら知識の程度や考え方は人によって様々であり、「知ったかぶりはイカン」としてこれを廃することは、なるべく擦り寄って考えようという者にとっては障害となるのではないかと危惧しております。新たな意見やアイデアというものは、何かしらにインスピレーションを受けて生ずる場合が多い気がしますので、インスピレーションを受けたものの本質がどうこうという事にまで言及してしまうと意見は集まりにくくなるのではないでしょうか。

当人は知ったかぶりのつもりじゃないんですよ。なるべく近そうと思われるものに擦り寄らせようというだけなんです。まぁ無知故に背伸びしているように見えるということは確かだろうと思いますが。

それが自分のスタイル故に今から変えるのも難しいので、邪魔しないようにこの分野(将来的にスクリプトや動作はかくあるべきというような議論)から退くというだけです。

表現力が稚拙故に書けば書くほどドロ沼化するのでこれにて。

2008/2/27  16:04

投稿者:ghost

私は「機械設計の世界では自分勝手に機構を考えて1から作ります」というトンデモ発言も含めて、知ったかぶりを止めて欲しいだけです。「異端なる者は退け」なんてお願いした覚えはありませんし、貴兄は異端ではなく、普通のVRMユーザーです。

2008/2/27  14:33

投稿者:zio

>自分でもよくわからない概念を使ってアイデアを説明する意図がわかりません。
「なるほど」と思いました。これは私の職業上の癖でしょうね。

プログラミングの世界では、既に存在する命令のみを駆使して新たな機能を作るので、不適切な喩えは混乱を招くもとになるだけと言ったところでしょうか。論理こそが唯一無二の存在であり、それが全てを構築していく世界に見えます。


一方、機械設計の世界(すべての設計がこうである訳ではありませんが)では、無いものは自分勝手に機構を考えて1から作ります。とは言っても実際の製作には協力者が必要ですから、例え不適切であろうと何でもいいから何かしらのものに喩えてイメージを共有する必要がある。こじつけであってもその「何か」がないと何も始まらないので。

今までに存在しなかった形や機構を追い求め、それが作れてしまう世界なので、その「不健全」で曖昧な行為が新たなモノを創り出す源であったりもします。喩えとするものの本質がどうこうということは問題ではなく、それがどういったことをもたらしてくれるかという表面的な結果のみが議論となる世界に居るので、こういう感じになるのでしょう。あとで苦労するハメにはなりますが(笑)。

勿論失敗も多いです。もとになるものが無いので理論よりも発想重視で突っ走ったりしているのですから。効率的でないと思われるでしょうが、そうやって突っ走って失敗して試行錯誤して、ようやく形になっていくという世界です。


まぁココはプログラミングという土俵上ですから、異端なる者は退くのみです。
仰る通り、考え方の違いとかを議論しても意味がないでしょう。


>テクニカルな補足
私も「部品番号1はレイアウトオブジェクトではないか」と思っていましたが、部品リスト出力で見ると確かにレイヤーやグループにもIDがついていました。ID以外にもパレット上の順番を示すNoが付いており、レイヤやグループというのはこのNoの領域情報を保持して部品をまとめているオブジェクトに見えますね。であれば確かにグループによる名前空間の階層化というのも有り得るのかも。

2008/2/27  8:10

投稿者:ghost

テクニカルな補足:

http://suchacool.seesaa.net/article/11697456.html#comment で○○な初心者氏が述べている知見によれば、どうやらVRM4は内部的に(レイヤー)グループに対しても部品とフラットなID体系を持っているようです。本稿とリンク先に書いた「部品番号1はレイアウトオブジェクトではないか」というボクの仮説は間違いです、おそらく。

考えてみれば、グループに対しても別途高さを設定できたりしますから、グループは複数の部品を束ねる特殊な部品として位置づけられていると考えるのが妥当でしょう。とすると、名前空間の階層化の準備工事は済んでいて、スクリプト体系とコンパイラが追従していないだけなのかも知れません。

だったら嬉しいですけど。

2008/2/27  8:02

投稿者:ghost

自分でもよくわからない、とおっしゃっている概念(先はDHCP、今度はカプセル化)を使って、ご自身のアイデアを説明される意図がわかりません。なお、その考え方は(それ自体は1つの考え方ですが)「カプセル化」とも「クラス化」とも呼びません、少なくとも狭義のオブジェクト指向の範疇では。

そういう意味で「また変なこと」をおっしゃっています。

部品(オブジェクト参照)の名前空間に階層を設けて名前の衝突を回避する、自体は一考に価するものです。が、VRMシステムの在り方にメスを入れ、場合によっては過去資産も放棄しかねないそのような新しい考え方を導入せずとも、

・解決しなかった名前を含む行はコンパイルしない(http://silver.ap.teacup.com/ghost/1272.html
・部品をレイアウター上でコピー&貼り付けした際、貼り付けられた部品に含まれる外部オブジェクト参照名を自動的に修正する。

という、インターフェイス(開発環境)の改善だけでほとんどの問題は解決するはずです。但し、後者は言葉で言うほど簡単ではないですけれども。

Caldia氏のディレクティブ案(はボクが勝手に付けた呼称ですが)もそうですが、自分自身が必ずしもきちんと理解しきれていないもの(この場合、VRMスクリプトとその処理系)の改善を求めるに際し、さらに自分が理解できない概念を以って表現するという行為は、ボクの感覚としては「不健全」なものです。

そして、ボクがその類の話にことごとく噛みつくのは、いわゆる「都市伝説」同様に、そういう不健全な話に限って無批判に鵜呑みにする人の方が多数派だからであって(これは、拙作スクロールによるVRM界隈制圧を目指すボクの身勝手な利益に反するからであって、VRMユーザーの利益を必ずしも考えているわけではありません)不健全な発言をしている人に対する他意も、有り体に言えばその個人の考え方に対する関心すらないです。

・・・それとも、それをご理解された上での「釣り」ですか?

2008/2/27  0:15

投稿者:zio

名前解決が問題となるなるならば、それを隠してしまうという手法はどうでしょうか。単純に書くと「連動する部品をまるごと大きな括弧で括ってしまう」という考え方です。オブジェクト指向ではカプセル化という用語を見かけますが、この考え方で連動する部品を一体のものにしてカプセル化(これをクラス化と言うのでしょうか?C++もそんなに知らないので)し、名前解決しなくてはいけない部分はプライベートとして処理する。こうすればコピーによる部品名の重複があっても問題が出ないということにはならないでしょうか? 素人考えなので的を外している可能性は高いですし、実現性という面でもさっぱりわかりませんが(カプセル化されている部品群を更にカプセル化するという階層構造ができるのかどうかもよくわからない部分です)。このカプセル内に例外処理を加え、パッケージによる部品の不足があった場合にはこのカプセル毎動作不可にすれば部品不足問題も回避出来るかもしれないと思っていたりいなかったり。

結局のところ、 http://silver.ap.teacup.com/ghost/838.html やこの前の「リレーショナルレール」と同じように、VRM側が対応しなければ意味のないことだろうと思いますが如何なものでしょう? また変なことを言い出しているだけかもしれませんが。

2008/2/27  0:14

投稿者:zio

解説有難う御座いました。

「部品IDと部品名を関連づける部分こそがDNSである」という話の段階で納得です。

私はNTS4.0でスタンドアローンのプライマリドメインサーバーを立ち上げたことぐらいしかない程度のネットワークの知識しか持っておりませんので、DNSだとかWINSだとかLMHOSTSだとかになると「何がなんだかよくわかんねぇ」となります。サーバ構築者レベルではなく使用者レベルですので、それに比べてDHCPは手軽でイイなぁというイメージが先行しておりました。DNSとDHCPが全く違う段階の話というのも大雑把にはわかっていましたので、これを比較するのは確かによくなかったですね。

全くもって言葉足らずでしたが、どちらかと言えば、DHCPサーバで静的IPでなく動的IPのようにスクリプトが使える部品をユニーク化して認識すれば楽かなぁと思っていましたが、結局のところスクリプト内で名前参照しているので、どこかしらで解決してやらなければいけない。また、確かに部品IDというものはユニークなものとして存在しているから、StaticであろうとDynamicであろうと関係ないということですね。

やはり、専門分野外のことはなかなかに難しく、少々混乱していましたが、暫く考えていて1つ思いついたことがあります。

DNSやDHCPとは関係のない話になりますが、
(字数制限のため分割)

コメントを書く

この記事にはコメントを投稿できません





AutoPage最新お知らせ