domxml周りのめんどくささ



お久しぶりです。
ただ今仕事でphpを始めております。Web系統の処理が非常に楽チンなのでMMORPGもこれで作っちゃおうかしらと気持ちが傾いています(というか最近のブラウザMMORPGはこういうスクリプト言語で作られてんじゃないかしら?)
まあ、サーバー側の負担が半端ではないので、1万人同時接続とか無理でしょうけどね。


さて!急いでphpに携わらなければならなかったので、即席でphp使いになるために

を読みました。簡単である上に、いきなり使えるコードが出ているので嬉しい。
しかしやはりそこには落とし穴が!


phpでは変数には頭に半角の「$」を付ける。うむ、それはBASICでもそうなので違和感は無い。
phpでは定数には頭に半角の「$」を付けない。ほほう、そうやって区別するのね。識別子を見ただけで定数か変数か分かるのはいいね。


さーて参考ソースをもらったので、それを手本にお仕事しますかね。どれどれ?phpではオブジェクトのフィールドを$obj->fldmnberと呼び出すようだな。うむうむ、これはCと同じだね。
じゃあ早速オブジェクトのフィールドで

$var1 = 1;

と設定した変数を

echo $obj->$var1;

と呼び出すかな。


↓実行後

Object

・・・
なんじゃあコリャぁ!


散々調べて気がついた。正しくは

echo $obj->var1;

と呼び出すべきだったのだ!
おかしいだろ!半日潰れたわ!これじゃオブジェクトの定数を呼び出すことになるだろ?
しかしオブジェクトの定数はなんと

echo $obj::var1;

と呼び出すらしい。
どうもphpの設計者は変数の識別子を「$var1」じゃなくて「$」「var1」と考えているらしい。
だからオブジェクトを呼び出すときは「$」「obj->var1」となるのだろう。命令解析のときもその方が楽そうだしな。


教訓:一応ちゃんとした文法書も読もう。


上記の本には定数・オブジェクトという概念そのものが紹介されていなかったので、こういう違いに気付かなかった。まあ、参考ソースをちゃんと読んでればよかったんだがな。どうも俺は思い込みで書いたりしゃべったりが多くてイカン。恥ずかしい。

DirectXの怪



なぜ最近更新をしないのかというと、就職活動をしているからである。まあ、Xith3Dの実験をするほど忙しいのかというとそうでもないのだが、なにしろ実験は同時並行でブログ記事を書かないといけないので心理的お疲れ感が大きくなかなか手が出ない。(実際は実験記録を取るのとブログ更新が同時に出来るのでお得なのだが。)そもそもそんな実験をしている暇があったら企業へ提出用の企画書書けと思ってしまうので実験やらないで一日が過ぎてゆく。


で、今日の話はDirectXの奇怪なお話。納涼として怪談代わりにでも聞いて欲しい。




昨夜のことだ。
夜遅くひと気の無くなった研究室でゲームの企画書を書いていたら、携帯が振動した。
就職サイトからのメールだった。
就活先の会社のブログが更新されたというので見てみると、画像処理についての解説で、デモプログラムも付いていた。
実はそれまでもデモプログラムがついてた記事はあったんだが、実例が表示された画像が同時に公開されていたので手を付けていなかったのだ。
しかし、昨夜はなぜかプログラムを実行してみる気になった。その気になった理由は自分でもよく分らない。
デモプログラムを圧縮したZIPファイルをダウンロードして、解凍。exeファイルとdllファイルが入っている。どうやらWindowsで動きそうだ。


ダブルクリックして実行してみた。




すると

グラフィックハードウェアがShaderModel3.0に対応していません。
現在お使いの”MobileIntel(R)945GM ”Express Chipset Family"はShaderModel0.0までの対応です。
このデモプログラムの実行にはShaderModel3.0以降対応の環境が必要です。

Render初期化エラー

とメッセージが出てきた。
斜め読みするとどうもShaderModelのバージョンが足りないようだ。
そもそもShaderModelとは何なのか知らないのでググる

DirectX 9.0cに搭載されているグラフィックス機能。

とあった。なるほど。じゃあDirectX 9.0c以降に更新すれば解決だな。最新バージョンがいくつかは知らないが。
おっと、その前に自分のバージョンを知っておいた方がいいだろう。
・・・どうやるんだっけ?
またググる

DirectXのバージョンの確認方法
http://www.microsoft.com/japan/security/bulletins/ver_directx.mspx

1.[スタート] メニューから [ファイル名を指定して実行]
2.dxdiag と入力し [OK]

とあったので実行してみた。




そこで・・・


俺は、戦慄の事実を知った・・・!




「そんな・・・バカな・・・」


顔に噴き出た脂汗を両手でぬぐいながら俺はつぶやいた。


「既にバージョン9.0cだとっ・・・!?」






ハイ、怖いですねぇ〜恐ろしいですねぇ〜!
しかし、どういう事なんでしょうね?
DirectX 9.0cに搭載されている」っていう事はShaderModelはソフトウェア的なものだと思うんだが違うのか?
一方、最初のエラーメッセージをよく読むと、ハードウェア的なモノみたいなので、ソフトはあってもグラフィックスカードにその機能が物理的に存在しないってことなのかな?これだとカード交換しない限り無理だけど。


どっちなんだよ!?


ソフトウェアなのか、ハードウェアなのか


ハッキリしろ!!


俺の怒りは1ギガHzだぞコラ!!

URLエンコードとメール文字化け



 ある会社の求人に応募しようとして、そのサイトの応募ボタンを押したら、メールソフトが自動で起動した。それはリンク先のアドレスに”xxxx@xxx.com?subject=%xx%xx&body=%xx%xx”と書いてあれば良くある事なのだが、題名も本文も文字化けしていた。
 その会社はIT系だったので、「うーむもしかしたらこれくらいのハードルは突破してきてね、というメッセージなのか?」などと深読みしてしまった。なにしろメーラーの文字エンコードをどのような日本語を含む文字セットにしてもさっぱり読めるようにならなかったからだ。ブラウザの文字エンコードを変更してもダメで、通常のFirefoxからIEに切り替えても全く同じ症状。尋常な文字化けではないと思った。

件名:
�������������������������������������
本文:(本当は全部一行)
���������������������������������
���������������������������������
���������������������������������
���������������������������������
���������������������������������
���������������������������������
���������������������������������
���������������������������������
��������������������������������



 さて、解決法を探るにも、初め私はURLエンコードという言葉すら知らなかった。手探りで「エンコード 変換」でググってみる。
 すると、

Web便利ツール/URLエンコード・デコードフォーム - TAG index Webサイト


URLエンコードとデコードが行えるフォームです。
URLエンコード、またはデコードのフォームに文字列を入力して、変換用のボタンを押してください。

という便利な変換サイトが最初に来た。ここでURLエンコードという用語を知る。そこでリンク先のURLのコピーを取る(Firefoxではメールアドレスしか採れないが、IEでは「ショートカットのコピー」でmailto:〜body=%xx%xxを採ることができる。)

デコード後 (392バイト)

xxxx@xxx.com?subject=【件名】&body=【本文一行目】
【本文一行目】
【本文二行目】
【本文三行目】
【本文四行目】
【本文五行目】
【本文六行目】
【本文七行目】
【本文八行目】
【本文九行目】

デコード前 (956バイト)

xxxx@xxx.com?subject=%xx%xx&body=%xx%xx
(実際は千文字程度あります)

 と、きれいに内容を得る事が出来た。これで会社に応募できる!


 ・・・が、もしこれが試験の一環なら、「ハイ出来ました」だけでは芸がない。「これこれこういう状態なのでこうなりました。そこでこれこれこの様に変更すると良いでしょう。」と提案して見せて合格なのではないだろうか?
 そこで、
(1)今使っているメーラーで文字化けが起こらないようにする方法が本当にないのか?
(2)原因は何か?既知の現象か?
(3)最善の対策は何か?
を探してみる事にした。
 まずは「%xx%xx」の文字列がどの文字セットで書かれていたのかを調べねばなるまい。掲載ページの文字エンコードはSHIFT-JISだったが、だからと言ってURLエンコードの文字までそうとは限らない。
 幸い、「エンコード 変換」でググった9件目に

URLエンコード・デコード 変換できます

でデコードするとSHIFT-JISで日本語で表示されたのでSHIFT-JISでエンコードされている事が分かった。
 ここまでで、そもそもURLエンコードとは何か?が良く分からなかったので

http://URLエンコード - Wikipedia
7bit jis

日本語、半角、Shift-JIS - インターネットの言葉と技術 (6)
メール送信の 7bit-jis だと機種依存文字文字化けする対策
JIS X 0201の7ビットと8ビットの区別 - BIGLOBEなんでも相談室

シフトJIS

シフトJIS-はてなキーワード
シフトJIS-通信用語の基礎知識

などなど、色々調べた。(上記のリンク先は必ずしも見る必要はない。)しかし求める情報は得られない。が、最後の二つのリンク先に

US-ASCIIの変種であるJIS X0201を含むShift_JISはインターネット上で用いるべきではない。
JIS X 0201を用いているシフトJISは、インターネットメールで使用すべきではない

と書かれていたりして、「ふーむ、やはりシフトJISでURLエンコードするのはダメそうだな!よし、この事を会社の人に教えてあげよう!」などと思ったものだった。
 しかし、念のためもうちょっと調べてみたところ

指定したURLをブラウザで開く、電子メールソフトを開く-DOBON.NET
この例では、シフトJISでURLエンコードをしていますが、そのような決まりはありません。むしろ、UTF-8エンコードするほうが推奨されているようです。しかし、ほとんどのメーラーシフトJISしか使えず、UTF-8では文字化けします。ところが逆に、Mozilla Thunderbirdでは、シフトJISで文字化けし、UTF-8では正しく認識されるようです(バージョン1.5で確認)。


このような状況を考えると、むやみにURLエンコードするのは逆に危険と言えます。

な、なんだってぇーー!!?
 つまりサンダーバードのバージョンが1.5である限り、どっちの文字コードエンコードしようとも、どうしても文字化けするメーラーが存在してしまうのか!
 ということは、「ほとんどのメーラーシフトJISしか使えず」と言う状況ではURLエンコードシフトJISでするのが正解っぽいな・・・。サンダーバードユーザーには涙をのんでもらうという事で。つまりあのページはあれで正しかったのだ。
 よかった・・・したり顔で「UTF−8でエンコードした方が良いと思われます」なんて意見しなくて。

最終動作報告



 前回までのコメントまで含めて判明した事により、JARへのライブラリ付加の自動化は無理だと分かったので、ダブルクリックと黒窓でのコマンドライン実行での動作検証を行う。


 ダブルクリックだと、フリーズなのかエラーなのか分からないので、黒窓で実行する。
 まず、JARファイルが作られているdistフォルダに移動する。JARを実行する。

C:\Documents and Settings\java1rou\My Documents
\NetBeansProjects\MyFirstShape\dist java -jar MyFirstShape.jar
Exception in thread "main" java.lang.
IllegalArgumentException: Resource not found "resources/"
【以下省略】

これは簡単だ。セッティングの解説にあった症状だ。そして以前有った症状と同じで、NetBeans上で実行する時とJARファイルから直接実行する時で画像等のファイルを置くべき場所が異なるために起こるのだ。resourcesフォルダをdistフォルダ内にコピーしてやる。

C:\Documents and Settings\java1rou\My Documents
\NetBeansProjects\MyFirstShape\dist java -jar MyFirstShape.jar
Exception in thread "main" java.lang.
UnsatisfiedLinkError: no jogl in java.library.path

 うむ、これもかつてNetBeans上で発生したエラーだな。java.library.pathにネイティブライブラリを設定すればいいのだ・・・どうやって?
 5月29日のたけチン氏のコメントに

環境変数「libs.xith3d.natives.classpath」が未定義なら、直接的に書いてらどうでしょうか?
Djava.library.path="C:\usr\lib\xith3d\native"

とあった、ので、環境変数をそのように追加してやろうかと思ったのだが、Windows環境変数(スタート→マイコンピューターを右クリック→プロパティ→詳細設定タブ→環境変数)のPathは

%SystemRoot%\system32;%SystemRoot%;%SystemRoot%\System32\Wbem;c:\tex\bin;C:\gs\gs8.61\bin;C:\gs\gs8.61\lib;C:\Program Files\Java\jdk1.6.0_07\bin;C:\Program Files\QuickTime\QTSystem\

といった感じで書かれていて、とてもたけチン氏のコメントのような書式ではない。ユーザーの環境変数もそうだ。「java.library.path」でググってみても設定を解説したそれらしいページがヒットしない。どういうことなのだろう?
 しかしここでハタと気がついた。環境変数をいじるって事は逆に言えば、それをしなければ動かない配布物を作ってしまうという事だ。それはイカン。なるべく基本的なJRE(Java環境プログラム=VM=バーチャルマシンのこと)のみで動く配布物でなければならない。と言う訳で、環境変数いじりは早々にあきらめて、ネイティブライブラリをdistフォルダにコピーしよう。
 まずは要求されているjoglのライブラリを持ってくる。設定ページの図にあった、\third-party\jogl\windows-i586\の場所にあるファイルを全てdistフォルダにコピーして、黒窓で実行してみる。

うむ!成功!×ボタンを押しても終了しない所もNetBeansでの実行と同じだ。他のネイティブライブラリは使われなかったのだろう。だが、他のプロジェクトでは必要になるかもしれない。
 なお、distフォルダの中にはlibフォルダがあり、ここにはプロジェクトに追加されたJARライブラリが収められている。もしかしてここにネイティブライブラリを放り込んでもうまく行くのでないか?と思って試してみた。メインクラスのあるフォルダはスッキリさせたいからね。
 しかし失敗。joglが無いというエラーが出た。どうも同じライブラリとは言っても扱いが異なるらしい。何とかならないものか。まあ何にせよ、NetBeans無しでも動かせるとは分かった。


 さあ、これで実験の環境は整った。あとはXith3Dの言語仕様を覚えて、レイヤー内に3D表示をさせられるか検証するのみだ。そしてうまく行けばXith3Dでゲーム開発を開始することになる。
 Xith3Dのホームページに3DRPGや、戦艦を操るゲームがサンプルとして置かれていたので、それらを参考にすれば大幅に開発期間を短縮できるはずだ。これは非常に嬉しい。


 少々疑問は残るが、うまく行ったので怒らないで終わる。

jarが無い!



 さて、昨日なぜjarファイルへの操作の途中で実験せず「つづく」としたかと言えば、
jarが無い!
 からに他ならない。
 あれ〜?コンパイルしたら自動的にjarファイルがプロジェクトフォルダ直下のdistフォルダに入ってるんじゃないのか?jarどころかdistファルダすら見当たらないんだけど・・・。おっかしいなぁ。以前(NetBeans6.0.1)は何もしなくてもjarファイルが生成されていたのに・・・。NetBeans6.5だと仕様が変わったのかなぁ?


 NetBeansのヘルプで「jar」を検索っと・・・。

JAR ファイルの構築
では、「構築」コマンドまたは「生成物を削除して構築」コマンドを実行するたびに、IDE はプロジェクトのソースから JAR ファイルを構築します。JAR ファイルは、プロジェクトフォルダの dist ディレクトリに生成されます。

ええ〜!?じゃあ実行してみよう。・・・やっぱりdist無いよ!

(上のつづき)
「構築」コマンドは、プロジェクトの「保存時にコンパイル」コマンドが有効な場合には無効になります。ファイルの保存時にファイルはコンパイルされますが、JAR ファイルはクラスファイルの新しいバージョンを使用して再パッケージ化されません。プロジェクト全体の生成物を削除して構築せずに JAR ファイルを再構築できるようにする場合、プロジェクトの「保存時にコンパイル」を無効にし、「構築」コマンドを使用します。

ほほう、そうだったのか。しかしこれおかしくないか?保存時にコンパイルするか否かとjarファイルにパッケージ化するかどうかは別の事じゃないか?とにかく早速無効にしてみよう。・・・やっぱりdist無いよ!
 おかしいなぁ・・・最近はいつも「ファイルを実行」ボタンで実行してたからかなぁ?じゃあ、「主プロジェクトを構築」してみるか。(「主プロジェクトを実行」では出ません。)
 おお!出たっ!


 ・・・これおかしくないか?「ファイルを実行」もコンパイル(つまり構築)してから実行してるはずだよな?じゃあ「構築」するのとおんなじだと思うんだが。・・・いや、いつも使ってるボタンはフォーカスが合ってるファイルのみを単独実行っていうボタンだからプロジェクト全体のコンパイルはしてないんだよな。(以前似たような事があったような。)なるほど”プロジェクト”を対象にしないと駄目なんだな。


 さて、問題は、jarファイルを作る時のネイティブライブラリの付け加え方なのだが・・・まさか、の直前に「TODO」を加えてもうまく行くとは思えない。(試しました。「主プロジェクトを実行」すら出来なくなりました。)
 では何を加えればいいのだろうか?


 というところで本日は寝る。

                                                                                          • -

6月12日追記
 何を加えればよいかについては、6月4日のたけチンさんのコメントによって
「単純に書きかけのテキストなので、この部分を完成させよという意味で「TODO」というコメントを付けている」
という衝撃の事実が判明。よってXMLの知識がない俺には現時点では自動化処理は不可能ということが分かった。手動で頑張りましょう。

セッティング完訳



 二度も同じ理由で詰まったので、ほとほと懲りた。だから残りの説明文も横着せずに全て訳すことにした。


 ネイティブライブラリjoglが無いというエラーの処理の続きから。

This time if you try to run this code you will get an Error like this:

Exception in thread 'main' java.lang.IllegalArgumentException: Resource not found 'resources/'

But this error is much clearer - just examine the source: we want to display a textured cube with a texture named "stone.png". Xith3D uses Texture(Stream)Locators to find textures in the global context of the application, so in line 70 we set up the global resources to reside in the directory "resources/, which should contain a "textures" folder to hold the globally available textures. To correct the project, switch to the "Files" panel, add a "resources" folder to your project and create a "textures" folder inside. Populate this folder with a "stone.png" image. If you don't have one, you can download this:
【figure】
Stone Texture

                                                                                                  • -

今度は、あなたがこのコードを走らせようとするならば、あなたはこのようにErrorを得ます:

Exception in thread 'main' java.lang.IllegalArgumentException: Resource not found 'resources/'

しかし、このエラーは、非常により明白です - ちょっとソースを調べてください:我々は、「stone.png」という名前をつけたテクスチャーできめのある立方体を示したいです。Xith3Dはアプリケーションの世界的な前後関係グローバルコンテキストでテクスチャーを発見するためにTexture(Stream)Locatorsを使うので、第70行において、我々はディレクトリ「resources/」に住むため存在するように世界的な資源グローバルリソースを組み立て設定しました。『このディレクトリは』グローバルに利用できるテクスチャーを持つために「テクスチャー」フォルダを含まなければならない。プロジェクトを修正するために、「ファイル」パネルに変わって切り替えて、「資源」フォルダをあなたのプロジェクトに加えて、「テクスチャー」フォルダを中で作製してください。「stone.png」イメージを持ったこのフォルダに住んでを装着して下さい。あなたが1それを持たないならば、あなたはこれをダウンロードすることができます:
【図は省略】
石のテクスチャー

 グローバル・コンテキストとはここを読めば分かるが、

コンテキストは, 簡単に言えば変数・関数の名前とその実体(オブジェクト)を関連付けた「表」である. コンテキストはスタック構造になっており(コンテキスト・スタック), コンテキストが作成されるとのスタックに順に上からプッシュされ, 破棄されるときはスタックの上から順に破棄される.
【中略】
インタープリターが起動したときに, 自動的にグローバル・コンテキストが作成される. グローバル・コンテキストはコンテキスト・スタックの最下部に常に存在し
【後略】

 なるほど。そしてまた、変数・関数の他に今どのクラス・メソッドに居るかを表すものなのだろう。グラフィックコンテキストも似たような概念だと思われる。というかこの説明読んで初めてグラフィックコンテキストの意味が分かったよ。・・・こういう概念はもっと初心者の内に教えて欲しいなぁ。ん?この情報「CueMol」ってソフトのマニュアルかよ!Java技術者は何やってんだ!?「Java コンテキストとは」でググったら

コンテキストとは、プログラムの実行に必要な各種情報のことである。


「context」(コンテキスト)は、「文脈」、「前後関係」などと訳されるが、IT用語としては意味がイメージしづらく、単にコンテキストとある場合は、何らかの制御情報と考える方がわかりやすいことが多い。


コンテキストは、コンテキストメニューコンテキストスイッチなど、複合語として使用されることが多い。コンテキストメニューとは、操作の場面に応じてメニューを表示することである。また、コンテキストスイッチとは、CPUのレジスタの情報をコンテキストとして保持して、プログラムの実行に応じてコンテキストを切り替えることである。

 などと、自分で「意味がイメージしづらく」とかぬかしやがって!そんな用語(グラフィックコンテキスト)を初心者向けの本に何の説明もなく使うんじゃねーよ、参考書どもめ!!(どのくらいひどい有様かは2007年6月13日の記事を見てくれ!)


 しかし最近やっと、この辺のおかしな状況を認識する人も現れてきたようで

JAVA技術の処方箋、毎日プログラミングテクニック
2008/05/01 JAVA技術の処方箋10回目:コンテキストって何だ?

初心者は、コンテキストってなんだ?!
って言いたくなりますよね。ほんと。


全くこういう言葉がいきなり出てくるから、
つまづく人が多い。


いいでしょう。サーチマンがわかりやすく説明しておきましょう。

という記事が出てたりする。しかしその説明は

Tomcatで管理される一まとまりのディレクトリのことです。

などと、ひどくローカルな話に落ち込んでしまっていて、IT技術者の視野の狭さをまざまざと見せつけてくれる好例になっているというオチが付いているのだが。(TomcatとはJakartaプロジェクトのサブプロジェクトとして開発されているオープンソースのソフトウェアで、JavaサーブレットJSPを処理するアプリケーションサーバのこと。つまりサーバープログラムという非常にローカルな話題に限定された答えになっている。)このメルマガがサーバー技術者を対象にしているのだとしても、なんという近視眼。グラフィクスコンテキストもstaticコンテキストも視野に入っていない。






 すまん、脱線した。訳の続きに戻る。

Now you should be ready to go and if everything went well, you should see a window similar to this:
【figure】
My First Shape




Generating a distribution


Since Xith3d needs native libraries, you can't simply double click on the generated jar like you normally would do. To overcome these shortcumming, you have to copy the natives to the dist-folder and start the application with the "java.libraries.path" property set. To save you from this tedious work, just switch to the "Files" tab in your project explorer, look for the "build.xml" and open it. Now copy the following target right into this file, just before the closing tag.

TODO

Hope you enjoyed this article and also have "Your First Shape" up and running!


Have Fun!

                                                                                                              • -

現在、あなたは行くことができるはずです、そして、すべてがうまくいくならば、あなたはウインドウがこれと類似しているのを見なければなりません見るべきだ:


My First Shape




配布『物』を引き起こす生成すること


Xith3dがネイティブライブラリを必要とするので、あなたが通常するだろうように、あなたが単に発生するされたジャーjarファイルをダブルクリックすることができなくては出来ない。Toはこれらの欠点を克服しますするため、あなたは土地の人ネイティブ『ファイル』をdist-フォルダへコピーしなければならなくて、「java.libraries.path」の資産をセットして属性セットで、アプリケーションを始めなければなりません。あなたをこの退屈な仕事から救うために、ちょっとあなたのプロジェクト探検家エクスプローラーで「ファイル」タブに変わって切り替えて、「build.xml」を探して、それを開けてください。すぐにそうしたら、ちょっと/プロジェクトタグを閉鎖閉じる前に、このファイルに以下の目標ターゲットの右(ここだけ意味不明)をコピーしてください。

ToDo

あなたが本稿を楽しんだことを望んで、そのうえ「My First Shape」を稼働可能にしてください!


楽しんでください!

 うーん。
 昨日のコメントで心配した通り、jarファイルを実行する時点で問題があるわけだ。方法が二つある様だが、両方ともよく分からない。


(1)distフォルダにネイティブライブラリをコピーする。java.libraries.pathのプロパティセットで。(←ここがよく分からない。)
(2)ファイルタブのbuild.xmlを開いて、の直前に「ToDo」をコピーペーストする。(←これでいいのかなぁ?target rightの意味が分からないままなのだが。)


・・・つづく。

セッティング完了



 結論から言うと、セッティングは完了、サンプルコードは3D表示を成功させた。
 以下にその顛末を述べる。





たけチン 『Djava.library.path="${libs.xith3d.natives.classpath}" は、NativeLibの場所を指定しているので、関連するDLLやSOのある場所を設定する必要があります。環境変数「libs.xith3d.natives.classpath」が未定義なら、直接的に書いてらどうでしょうか?
Djava.library.path="C:\usr\lib\xith3d\native"』(2009/06/01 11:34)

・・・NativeLibって何?


 と言う所で昨日は寝た訳だが、Libはライブラリだろうから「ネイティブライブラリとは」で早速ググってみる。
 ・・・が、30件見出しを見ても「ネイティブライブラリとは」という言い回しをしているページが無い。「ネイティブライブラリ」を使っているページはたくさんHITしたが、どれもこれも「ネイティブライブラリ」を既に定義済みの言葉として使っているようだった。ということは、「ネイティブ」という用語にIT的な意味があることをみんな知っている可能性がある。
 そこで研究室のJavaの初心者本を片っ端から見てみたが、そもそも索引に「native」も「ネイティブ」も載っていないものがほとんどだった。かろうじて”逆引き速引きリファレンスJava(2003年アスキー)”にメソッドの修飾詞として一行

nathive:Cなど他のプラットフォームに依存して実装されている

とあったが、いまいち理解できない。そこで「Java ネイティブとは」でググってみた。1・2件目はネイティブスピーカーの話だったが、3件目にそれらしい記事が

ms-help://MS.VSExpressCC.v80/MS.NETFramework.v20.ja/dv_vcmcpp/html/b200cfd1-0440-498f-90ee-7ecf92492dc0.htm
方法 : ネイティブの C++ プログラムをコマンドラインからコンパイルする
・・・にあるC++プログラムで、次に示すものは”ネイティブの C++ プログラム”と書かれていますが、
ここで”ネイティブのC++プログラム”とはどういう意味ですか?
【後略】

 ふむふむ、似たような悩みだな!そして、それに対する解答の中にひときわ分かりやすいものがあった。

渋木宏明
ここで言う「ネイティブ」は、「実行形式ファイルを OS がメモリに読み込み、CPU が直接的に解釈・実行を行う」スタイルを指しています。


「ネイティブ〜」は、このスタイルに対応した事物を指し示す場合の枕詞になっています。


古来、このスタイルが主流であり、これらの実行環境や方式をあえて「ネイティブ」と呼ぶことはありませんでした。


しかしながら近年、Java .NET のような、OS とは異なる層でアプリケーションプログラムの解釈・実行を行う「仮想実行環境」が登場し、混乱を避ける意味からも、両者を区別する語が必要となる場面がチラホラ見られはじめました。


そこで、特に Microsoft 社では、.NET の仮想実行環境(=.NET ランタイム = CLR)の管理下でプログラム実行を行うスタイルを「マネージ(ド)」と呼び、旧来の OS/CPU 手動でプログラム実行するスタイルを「ネイティブ」と呼ぶことにしたようです。

 おおーなるほど分かりやすい。さすがMVP!つまりJavaのようなインタプリタ向けのclassファイルじゃなくて、OSを本来動かしているマシン語の実行ファイル(exeとかdllとか?)のことをネイティブというんだね。それなら、上の修飾詞の説明もうなずける。つまりネイティブライブラリは、OS側にもともとあるマシン語のファイルか、もしくはOS向けに作られた非classファイル(つまりマシン語)のことを言うんだね。


 ・・・うーん。
 やっぱり分からないなぁ。どっちにせよネイティブライブラリがどこにあるか分からないから、直接であろうと間接であろうとパスを指定できないよ。
 うーん。
 うーん。


 そこに私の隣に座っている友人が登場。
「プロジェクトのライブラリにXith3D登録した?」
「プロジェクトのプロパティ→ライブラリ→実行時ライブラリにXith3D登録した?」
 やったよー。セッティングページの指示通りにね。
「どれどれ見せて。」
 ほら、新しいプロジェクトを準備してるだろ?で、次にorg.myorg.myfirstshape.Mainって名前をつけて、依存性を指定するためにライブラリに以下のリストを加える、と。そうそう、この相対パスにするって部分がダイアログに出て来ないんで絶対パスで設定しちゃったけど大丈夫だよね。


・・・あれ?その下の部分訳した覚えがないな・・・。

Since Xith3D uses native OpenGL calls to perform its rendering, we will also need to reference the native libraries somewhere. Unfortunately Netbeans has no support for native libraries in its project settings, so we need to abuse the Library feature a bit. Just create another Library called "xith3d.natives" and locate the folders containing the native libraries for your platform. On the right screenshot you see the configuration for a win32 system.

If you have sucessfully created the two libraries, select the "xith3d" library and click [Add Library] to apply the dependency to your project. Don't add the "xith3d.natives" library, since we will abuse this configuration later :)

                                                                                              • -

Xith3Dがその翻訳レンダリングを実行するという時に自国のネイティブのOpenGL要求コールを使うので、我々は自国ネイティブ蔵書をどこかで参照文に引用する必要もあります。残念なことに、Netbeansはそのプロジェクトセッティングでネイティブライブラリに対する支持サポートをしないので、我々は少し図書館機能を濫用する必要があります。ちょっと「xith3d.natives」と呼ばれているもう一つの図書館をつくって、あなたのプラットホームのためにネイティブライブラリを含んでいるフォルダを見つけてください。正常な右の画面ショットの上で、あなたはwin32システムについて構成を参照し見ます。

あなたが2つの図書館をsucessfullyにつくったならば、「xith3d」図書館を選んで、属国関係性をあなたのプロジェクトに適用するために、クリックしてください[図書館を加えます]。我々が後でこの構成を悪用する時からので、「xith3d.natives」図書館を加えないでください:)

 なにぃぃぃぃぃい!?ちゃんとネイティブライブラリについて書いてあるじゃないか!
 読み飛ばしてた・・・|||orz|||ズドーン


 で、指示通りツール→ライブラリ→クラスライブラリ→新規ライブラリ→xith3d.nativesと名前を付けて、スクリーンショットにあるパスを参考にxith3dライブラリに登録したjarファイルのあるフォルダの近辺を捜して、3つのdllファイルを登録した。


 で、早速サンプルコードを実行してみた。


 ・・・成功!










 成功しちゃったよ!!orz


 つまり・・・


 結局俺のミスかっ!


 ちくしょう!このやり場のない怒りをどうすればいいのだ!


 うぉぉ〜〜!俺の空回りする怒りは




秒速60回転だぁ〜〜!!

.......´´○``..../
´.....(ヽュ'.........シャカシャカシャシャカシャカシャカシャシャカ
▲◎ノ◎▲.\ _____________________________________[ただ今の発電量9W]







 また同じパターンで解決してしまった・・・。とほほ。