変奏現実

パソコンやMMORPGのことなどを思いつくまま・・・記載されている会社名・製品名・システム名などは、各社の商標、または登録商標です。

この画面は、簡易表示です

2017 / 12月

3次元空間

CGで何かの物体の座標を表現する時はXYZの3座標軸で表現するのも、空間は3次元で表現することが多いからだ。
平面の地図は緯度・経度を使うけど、これに高度(高度1000mでも地上5階でもいい)を足せばちゃんと3次元になる。
ところが、太陽から見れば地球は自転している上に太陽の周りを回ってもいるので、地上の緯度・経度・高度で表現するだけでは不十分で、地球の公転や自転の状態も追加しないと正確ではない。
しかし、太陽系の外から見れば太陽も自転しているし上にどこかに向かって移動してるので、太陽の自転や移動の状態も追加しないと正確ではない。
さらに、銀河系の外から見れば銀河も自転しているし上にどこかに向かって移動していので、銀河の公転や移動の状態も追加しないと正確ではない。
その上、銀河集団の外から見れば銀河集団も自転しているし上にどこかに向かって移動していので、銀河集団の公転や移動の状態も追加しないと正確ではない。
・・・と、もっとこの先もあるのかもしれない。
これらを纏めると、宇宙の構造は複雑で、地球上の何かの位置を特定する次元(地上の緯度・経度・高度+地球の公転や自転の状態+銀河の公転や移動の状態+銀河集団の公転や移動の状態)の数はとても多い。
宇宙の構造に新たな発見が増えていくなら、次元(地上の緯度・経度・高度+地球の公転や自転の状態+銀河の公転や移動の状態+銀河集団の公転や移動の状態+・・・)となって切りがない。
有体に表現するなら、宇宙の中の地球だけでも、次元数はとんでもなく多い。
しかし、時間を使い
地上の緯度・経度・高度+地球の公転や自転の状態(時刻)+銀河の公転や移動の状態(時刻)+銀河集団の公転や移動の状態(時刻)+・・・(時刻)
=地上の緯度・経度・高度+地球の状態(時刻)
と纏めることは可能な気がするし、CGも動画なら次元にタイムスケールが必要なので、ほぼ一致する。
ここから、時間の概念の無い3次元空間とは時間が固定された一瞬または時間を一般に自動的に進むのでノーカンする考えであることが判る。
さらにとっても微視的な状況を考えると、地上という概念は無意味であり、空間上の何かの2つの関係だけになってしまうので、空間上の何かの2つの距離+空間上の何かの2つの進行方向の差(角度)の2次元で表現できてしまう。
巨視的な状況では空間上の何かの3つ以上の関係となるため、空間上の何かの2つと他の関係を表す次元が加わり3次元に落ち着く。
しかし、それも高エネルギー状態では、空間上の何かの2つと他の関係はキニナラナイくらいどうでもいいことなので、再び2次元にたどり着いてしまう。
以上から、宇宙は複雑な次元で表現されるものの、それは比較的低エネルギーで安定している状態を巨視的に俯瞰する状況つまり人間が普通に生活する場面であり、人間が普通に生活できる場所がかなり限られている宇宙はおおむね2次元で十分ということが言える。
 



起動する度にWindos10のタスクバーに登録したアイコンが表示されない

最近の大型のWindowsUpdateの後、パソコンを起動すると画面下のタスクバーにアプリのアイコンが1つも表示しなくなってしまった。
何かアプリを起動すると、タスクバーにアイコンが1つ表示されるので、それを右クリックして「タスクバーからピン留めを外す」か「タスクバーにピン留めする」を選択すると、登録済みのアイコンが一斉に表示される。
最後に、「タスクバーからピン留めを外す」したアイコンをもう一度右クリックして「タスクバーにピン留めする」することを忘れずに・・・
ググってみた結果では、タクスバーの初期表示に関わる部分で「タスクバーにピン留めする」したアイコンを初期表示するための情報が欠落したせいのようだ。
しかし、そんな目に合っていない人もいるので、何がきっかけでタスクバーにアイコンが表示されなくなるのかは全く不明なので、闇雲に高速起動をON・OFFしてみたり、クリーンブートしようが解決できるものではない。
※よく使うアプリなので「タスクバーにアプリを登録している」のに、その「アイコンを表示しないWindows10の評価は★☆☆☆☆☆」と、させていただきます。
 
 



Web SQLデータベースの今

ブラウザにSQLデータベースエンジンが載っている。
と聞いた。
月報とかを月末にまとめてWEBで送信するのに便利そうだし、WEB化せずに放置してたMDBでデータを操作してサーバーにアップするVB6アプリの安易なWEB化に使えそうなので探してみた。
サンプルを見つけたがブラウザで開くもピクリともせず、デバッガのコンソールには
ReferenceError: openDatabase is not defined
と表示されるだけだった。
とあるサイトによれば、
実装がSQLiteに余りにも寄り過ぎていて、皆からソッポを向かれてしまったらしい。
今は触らない方がよさそうだが、とりあえず実装チェッカーを作ってみた。
手元のブラウザで動くのはChromeだけだったが、

  • Opera 10.6
  • Safari 5

でも、動くらしい。
SQLiteを載せている(載せていた)FireFoxで使えないのは謎。
と云うか、ブラウザがSQLiteのデータベースとして管理しているデータを
勝手に書き換えられては困るのは容易く想像できる様な気もする。
今は Indexed Database API が推奨されているようだ。
とりあえず実装してみた程度の範囲らしいけど・・・

  • Firefox 4.0
  • Google Chrome 11

で動くそうなのでコッチの方が使えそう。
そのサンプルを見つけるも何故か動かない。
ToDOアプリのサンプルと見比べて、手を加えてみました
さて、SQLデータベースがNO SQLデータベースなキー・バリュー形式になってしまうと、ほとんどLocalStrageのキーがテーブル名でバリューがレコード一式のJSONに例えてしまえば、これを使っても若干コードを書く手間が減る程度であり、見つけたサンプルが動作しないくらい仕様がブレているなら、これを直接使う意味があるのかどうかは微妙な気がした。
 



EclipseでNode.jsを使ってみる

EclipseでNode.jsを使うには、ココにも書いてある通り
1.メニューの「ヘルプ」から 「新規ソフトウェアのインストール」を選択。
2.「作業対象」に http://www.nodeclipse.org/updates/ を入力する。
3.「1st Nodeclipse Core」と「Enide Tool Collection」にチェックを入れ、次へをクリックする。
という方法だったと思ってたけど、今は「見つかりません」と出るだけ。
あらためてhttp://www.nodeclipse.org/updates/を覗いてみると、
今風のインスト方法が書いてあった。
ページの中の    をEclipseのメニューバーへドロップしてみるといいらしい。
ただ、そのまま「実行」ボタンを押すと・・・
コマンド行の実行中に例外が発生しました。
Cannot run program “node” (in directory “C:\pleiades”): CreateProcess error=2, 指定されたファイルが見つかりません。
と出て終了してしまうダケ。(笑
Eclipse マーケットプレスで nodeclipse を検索すると・・・

  • Nodeclipse PhantonJS 0.12+
  • Nodeclipse CoffeeScript Viewer (Editor before Eclipse 4.3.1) 0.3.0
  • Nodeclipse Java 8 Nashorn JJS 0.12+
  • NodeclipseCLI Installer 0.17
  • Nodeclipse Git Addon 最終
  • Nodeclipse 1.0.2
  • Nodeclipse Vert.x 0.15.1
  • Nodeclipse EditBox – background colors themes to highlight code blocks for C++,Java,JavaScript,Python,Ruby and others 0.70.0
  • Nodeclipse/Enide Gradle for Eclipse 0.17
  • Nodeclipse/Enide Maven for Eclipse 0.17

・・・な感じにいっぱい出てきた。(大笑
インストール記事を見つけたNodeclipse 1.0.2をインストして「ノード」プロジェクトを作るとサンプルのJSファイル付きだった。「実行」させてみると、ポート3000を使ったサンプルをすぐ動かせる。ただ、期待していた「デバッグ」は、やり方が悪かったのかな???
コンソールに
(node:9736) [DEP0062] DeprecationWarning: `node –debug` and `node –debug-brk` are invalid. Please use `node –inspect` or `node –inspect-brk` instead.
暫くすると・・・
Failed to connect to Standalone V8 VM
connect timed out
で終了。
JDK9とnode-v9.3.0-x64.msiを入れたせいかもしれない。
JDK8とnode-v8.9.3-x64.msiの組み合わせにかえてみようか・・・



ややこしいインヘリタンス

プログラムを書くときに使う変数はざっくりとインスタンス変数とクラス変数に分かれるらしい。
安易なネーミングではあるが、インスタンス変数はクラスから作ったインスタンスにくっ付いているのでインスタンスが異なれば違う内容になるが、クラス変数はクラスにベッタリな変数で同じクラスならどのインスタンスでも同じ内容になるので、判りやすいネーミングである。
しかし、これで雰囲気をつかむと厄介なことが起こる。
(インスタンスに似ている)インヘリタンス(継承関係)にあるクラスのクラス変数だ。親のクラスでAを1としても派生したクラスでAを2にすれば、いつまでも親のクラスのAは1で派生したクラスのAは2とインスタンス変数の様な振る舞いをする。いやいや、それぞれのクラスにベッタリな変数だからクラス変数じゃないか!やっぱりしっくりくるネーミングだと思うかもしれない。しかし親のクラスのみに宣言されているBについては派生したクラスのBは親のクラスのBを参照することになり全面的にクラスにベッタリな変数ではないのだ。だから、うっかり派生したクラスでAを宣言しわすれた場合も親のクラスのAも2になってしまうのだ。それは「うっかりした奴が悪いダケ」と思うかもしれないが、自分がうっかりしたら「仕様が悪い」と怒り出す奴の思考形態でしかないのだ。現実で「知らない他人が後付けした派生したクラスがクラス変数Aを2と変更していた」場合はまず気が付かないので、public static final String などと書かないと安心できない。

  • たった一種類のクラスとたくさんのインスタンス(あるいはオブジェクト)。
  • たった一種類の親クラスとたくさんのインスタンスされたクラス。

現実のコードは、上記2行の組み合わせで出来ているので、非常に煩雑だ。
だから、インスタンス変数とクラス変数なんてことは、たった1つのインスタンスされたクラスの中の記述の事柄でしかなく、これによってどんな違いが起きるのかは予想できない。
無用な混乱を避けるため、インヘリタンス(継承)するクラスではクラス変数を宣言しなかったり親クラスと同じ変数名を使わないようにすると思うが、そんなことは一切キニシナイ人間は相当数居るよう(ソースの中にstatic int MAX=10などと・・・)で、1行でも短くしたいWEB上のサンプルのソースコーソを除けば、クラス変数専用のクラスを作ることが多い様だ。
この様に、とりあえずイメージをつかんでもらうには便利なインスタンス変数とクラス変数も、クラスの変数の色々な宣言の仕方を使い込んでくるとインヘリタンス(継承)の仕組みのごく一面を表現したジャーゴン( 仲間うちにだけ通じる特殊用語。 専門用語。)であることに気が付くだろう。
インヘリタンスを使い込むには、画面系のエディタを作るのが一番。ちょっとでも指定を誤れば画面に変な動きとしてミスにすぐ気が付くからだ。しかもお手軽にブラウザ上でJavaScriptのIDEIDE(開発環境)を使うよりも、Eclipseの様なを使う方がデバッグはしやすかったりする。
うまくいったら、ついでにUNDOやREDOも実装してみよう。2~3種類の機能を作り込むだけで、ガンガンとググってコピペしてコードをスクラッチするだけでは解決できないことがあるのだと気が付くはずだから。(笑
 
 
それにしても堅実的なソースコードは、うっかりミスなどの被害に堅牢に作ってある。それだけトラブルが絶えないという現実の傍証なのである。



やさしいインスタンス

よく耳にするようになったのが、インスタンスやサブクラス。
前者は、一時はダサすぎる語彙なので消えていたが、いつの間にか復活し、しかも一般用語化していた。主な理由はやはりjavascriptのinstanceofのせいだと思う。
インスタンスの意味は「実例」、クラスのままではソース上ではあまり使い道が無く(*1)、new でオブジェクトを作らないといけないので、クラス定義されたオブジェクト・タイプの変数に入れるオブジェクト自体を意味するようになっていた。
しかしながら、A instanceof Bの云わんとするところのinstanceは、Bのクラスを型紙(extends)にしてAのクラスを実装したのかを問うているのであり、変数自体は全く眼中にないが、大抵は、A(変数名)  instanceof B(クラス名)  と書くので、勢いA変数のことをinstanceと直結してしまったのは、致し方ないとは思う。勘違いは設計者の語彙の問題であり利用者に問うものではない。
とは云うものの、当初は「オブジェクト」の方が「見た目がダサい」ので「インスタンス」と云い始めていた程度でしかなく、早々に廃れたので余りのくやしさに必死で復権を試みた人の成果なのかもしれない。
もっとも、何かの言語系の実装を作ってみたことがあるなら、何かのクラスをnewする時はオブジェクトぐらいで十分で、何かの処理系をnewするならインスタンスと区別したくなると思う。と云うのも普通にクラス定義する際のnewの実装はほとんど皆無(0行)だが、処理系ともなると半端無い量のソースを書くことになるし、staticなスタートアップコードも遅延処理させれば、new自体の処理時間も長いからだ。newをコードしないクラスなんて、お手軽すぎる。
しかし最近のJavaScriptではprototypeを強引に使って処理系に近い作り方をするもの(身近な例ではjQuery)もあるので、その場合はインスタンスと呼ぶことにはやぶさかではない。だって、マニュアルが無いと、使えないからね。(大笑)
後者は、派生元のクラスをスーパー・クラス(Javaでsuperって書くから)と呼ぶ反動で、スーパー・クラスから派生したクラスを亜綱 という意味でサブクラスといっているようだ。
実際、派生元のクラスをスーパー・クラスに、ちょこっとだけコードを付け足して作るクラスのソースは短いから、サブ(=プチ)クラスというのは意味が通っていそうな気がする。
しかも、Javaのクラスの派生は一子相伝の場合はほとんど無く、大方のスーパー・クラスには派生したクラスがいっぱいある(大家族、子沢山)ので、亜綱なイメージともピッタリ。
但し、「サブ(何とか)」という命名は「プチ(何とか)」とか「ナンチャッテ(何とか)」と同様に現実世界で「乱用されまくり」、その結果、多様されすぎて、サブには多様な意味を持ってしまい、すぐには意味が読み取れない状況にあることから、一般的には「イミフな用語」と化している。
注*1:一般的にはマジック・ナンバー対策として、const あるいはenumとして乱用されている。 例:ソースに2とは書かず、nnnDefinded.mmmType   の様に書く。
 
 




top