怒りのJava学習 このページをアンテナに追加 RSSフィード

Java初心者が
Java学習の途中で感じた怒りを
叩きつけるブログ

 このブログでは
※コンパイルエラーの99%は入力ミスで出来ています
※コンパイルエラーの1%は故意の省略で出来ています

現在皆様のエラー例を募集中



↓このブログの執筆方針
はじめに

↓ブログランキングへのリンク

クリックでランキングのポイントが加算される
今のところどうでもいい

2011-01-24 ただ今浮気中

[]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」となるのだろう。命令解析のときもその方が楽そうだしな。


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


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

2009-07-18

[]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だぞコラ!!

2009-06-13 相性というかなんというか

[][]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://:title=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

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


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

な、なんだってぇーー!!?

 つまりサンダーバードのバージョンが1.5である限り、どっちの文字コードエンコードしようとも、どうしても文字化けするメーラーが存在してしまうのか!

 ということは、「ほとんどのメーラーシフトJISしか使えず」と言う状況ではURLエンコードシフトJISでするのが正解っぽいな・・・。サンダーバードユーザーには涙をのんでもらうという事で。つまりあのページはあれで正しかったのだ。

 よかった・・・したり顔で「UTF−8でエンコードした方が良いと思われます」なんて意見しなくて。

2009-06-12 よーしよし!

[]最終動作報告


 前回までのコメントまで含めて判明した事により、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フォルダにコピーして、黒窓で実行してみる。

f:id:java1rou:20090612213856p:image

うむ!成功!×ボタンを押しても終了しない所もNetBeansでの実行と同じだ。他のネイティブライブラリは使われなかったのだろう。だが、他のプロジェクトでは必要になるかもしれない。

 なお、distフォルダの中にはlibフォルダがあり、ここにはプロジェクトに追加されたJARライブラリが収められている。もしかしてここにネイティブライブラリを放り込んでもうまく行くのでないか?と思って試してみた。メインクラスのあるフォルダはスッキリさせたいからね。

 しかし失敗。joglが無いというエラーが出た。どうも同じライブラリとは言っても扱いが異なるらしい。何とかならないものか。まあ何にせよ、NetBeans無しでも動かせるとは分かった。


 さあ、これで実験の環境は整った。あとはXith3Dの言語仕様を覚えて、レイヤー内に3D表示をさせられるか検証するのみだ。そしてうまく行けばXith3Dでゲーム開発を開始することになる。

 Xith3Dのホームページに3DRPGや、戦艦を操るゲームがサンプルとして置かれていたので、それらを参考にすれば大幅に開発期間を短縮できるはずだ。これは非常に嬉しい。


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

2009-06-07 いまだ謎は残るわけだが

[][]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ファイルを作る時のネイティブライブラリの付け加え方なのだが・・・まさか、</project>の直前に「TODO」を加えてもうまく行くとは思えない。(試しました。「主プロジェクトを実行」すら出来なくなりました。)

 では何を加えればいいのだろうか?


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

----------------------------------------------

6月12日追記

 何を加えればよいかについては、6月4日のたけチンさんのコメントによって

「単純に書きかけのテキストなので、この部分を完成させよという意味で「TODO」というコメントを付けている」

という衝撃の事実が判明。よってXMLの知識がない俺には現時点では自動化処理は不可能ということが分かった。手動で頑張りましょう。