DirectX SDK (March 2009) ?

Microsoft Download Centerに6月3日付けで新しいDirectX SDKがリリースされている……と思ったら、「DirectX SDK (March 2009)」??? 試しにダウンロードしてみたけれども、本当にMarch 2009みたい(サイズを比較しただけだけれども)。

新しいDirectX SDK(June 2009?)の登録間違いなのだろうか…。

| | トラックバック (0)

C++ Builder Update 3, Update 4, boost Update

久しぶりにC++Builderがアップデートしたと思ったら、「Update 3」「Update 4」「boost Update」と、同時に3つのアップデートとは、ちょっと驚きました。「利用できるすべてのアップデートを必ずインストールすることをお勧めします。」と言うくらいだし、一度にリリースするなら1つにまとめても良さそうなものだけれども、3つに分けた理由はなんだろう。

とりあえず、3つとも適用してみましたが、以前、

C++Builder 2009 Update 1
C++Builder 2009でCodeGuardを使うと、fstreamでエラーが発生

で書いた問題に変化はありませんでした。やっぱり、wcstombs関数で「不正なメモリのアクセス」が発生します。

ちょっと使ってみた限り、それ以外に気がついたはなし。というか、どう変わったのだろうか。

(下書きから公開に変更するのを忘れていた…)

| | トラックバック (0)

DataLab.の払戻データ

年末から作り始めた、JRA-VAN DataLab.のデータをSQLiteのデータベースに格納するスクリプトの修正作業が終わりません…。
便利かも、と思って始めましたが、ちょっと失敗だったかな…。

しかし、今まで気がつかなかった、DataLab.提供データの特性(?)に気がついたのは収穫でした。特に、払戻(HR)における「特払、不成立」データの扱いは、謎です。

以下、払戻(HR)データに関するメモ。

まず、DataLab.提供データはレコード長が固定なので、同着を考慮して予めデータ領域が多めに確保されています。そのため、SQLiteでデータベース化するために、未使用のデータ領域がどのように処理されているかを把握しておく必要がありました。(というか、エラーが出て、そうする羽目になりました。)

未使用領域は単純にデフォルト値(半角スペース)を入れておくのがシンプルで間違いもないと思います。手元のデータを見る限り、DataLab.でも2003年12月6日よりも前のレースのデータでは、そのようになっています。ところが、2003年12月6日以降のデータに関しては、状況に応じてデフォルト値以外の値が格納されることが分かりました。

私が調べた限りでは、2003年12月6日以降における未使用領域の扱いは、次の2通りに分かれます。

(1) 同着を考慮して多めに用意されているデータ領域(予備領域)。
  →『デフォルト値(半角スペース)』で埋められる。

(2) 通常より当たり馬券の数が少なかった場合の空き領域。
  →『馬番・組番が「00…」で「払戻金」「人気順」がデフォルト値』のデータで埋められる。

(2)は、(a)複勝で出走頭数が7頭以下の場合(通常は3着までだが、この場合2着まで)や、(b)該当種類の馬券が発売されなかった場合--が該当します。

そのため、2003年12月6日以降のレースでは、該当種類の馬券が発売されなかった場合、たとえば「ワイド払戻」なら、最初の3つが(2)型のデータで埋められた後、残り4つの予備領域が(1)型のデータで埋められるという、必要性のよく分からない複雑なフォーマットになっています。

これまで普段の分析には「成立したレースの意味のあるデータ」だけを使い、それ以外は読み飛ばしていたので、このようなフォーマットになっていることには全く気がつきませんでした。

しかし、このようなフォーマットだとすると、問題が1つあります。それは、馬番・組番が「00…」なのは、「発売なし」の場合だけでなく、「特払、不成立」の場合もあるということです。
JV-Data仕様書によると、「特払、不成立」の場合は払戻金に「特払、不成立の金額が入る」となっています。この場合、具体的にどのようなデータが提供されるのか知りたいところですが、私の手元にある払戻(HR)には、該当するデータがありませんでした。

まず、そもそも「特払」は、昭和46年の福島競馬以来ないようです。これは、DataLab.でデータが提供されている1986年よりも前のレースです。

≪お問い合わせ≫ http://jra.jp/faq/faq02.html#q1_10
(Q) すべての投票券が的中してしまった場合、払戻金はどうなるのですか?
逆にすべての投票券が不的中になってしまったときはどうなるのですか?

(A) (略)これを「特払い」と呼んでいますが、中央競馬においては昭和46年の福島競馬で単勝式の的中者がなく特払いとなって以来、こうした事例はありません。(略)
(JRAのホームページより引用)

「不成立」も珍しいですが、検索してみると、ときどきあるようです。たとえば、以下のような記事が見付かりました。

≪札幌の2歳500万条件戦不成立に 2007/08/16(木)≫ http://keiba.radionikkei.jp/keiba/news/20070816K11.html
18日(土)の札幌競馬第5レースに予定されていた2歳の500万条件戦(混合、特指、芝1200)は、出馬投票締め切りの結果、出走申し込みがわずか2頭であったためにレースが取りやめとなった。
(ラジオNIKKEIより引用)

このニュースは2007年に馬インフルエンザが流行ったときのものですが、この日のレースは手元のDataLab.のデータ上では、レース詳細(RA)のデータは「0:該当レコード削除(提供ミスなどの理由による)」で、払戻(HR)には該当レースのデータが存在しません。まあ、木曜にレース取りやめなので馬券は発売されていないわけですし、「不成立」と「取りやめ」の違いもよく分からないわけですが。

いずれにしても、手元には『馬番・組番が「00…」で「払戻金」が金額』というデータがありませんでした。

そのため、「特払、不成立」データの格納形式は想像するしかないのですが、たとえば「ワイド払戻」なら、

(a)「特払、不成立」を表わす同じデータ3つ、デフォルト値のデータ4つ。
(b)「特払、不成立」を表わすデータ1つ、「発売なし」のデータ2つ、デフォルト値のデータ4つ
(c)「特払、不成立」を表わすデータ1つ、デフォルト値のデータ6つ。

といったパターンがありそうです。(c)がいちばんスマートだと思いますが、2003年12月6日以降のフォーマットを考えると、(a)か(b)のような気もします。

とりあえず、現状のスクリプトでは、払戻金がデフォルト値でないデータを有効なデータとして格納することにしました。これだと、(2)型のような「発売なし」が複数並んだときにも対応できますし、「特払、不成立」の(b)型と(c)型にも対応できます。
ただし、これだと(a)型のデータが来た場合、複数の同じデータをテーブルに書き込もうとしてエラーになります。要は、読み込んだデータを処理する前に正規化してやればいいのだけれど……問題が出たら考えよう。

それにしても、なんでこんなフォーマットになっているのかな…。

| | トラックバック (0)

RubyとRで競馬分析をひさびさに更新

放置状態だった「RubyとRで競馬分析」をひさびさに更新して、DataLab.のデータをSQLiteで管理する簡単なRubyスクリプトを追加しました。

(2009年1月2日追記:バグがありました。最後にちょっとしたことでコードをいじったら、灯台もと暗しだったという…。データベース作り直し…凹む。)

I-PAD側の仕様が変更されて使えなくなっているI-PAD自動投票スクリプトは、更新していません。対応しようと思えばできないことはないと思いますが、私はあまり馬券を買わないので意欲が沸かない…。そういえば、今年は結局、有馬記念しか買わなかったなぁ…。

そもそも、I-PADへの投票機能はJRA-VAN側で何らかの機能として用意して欲しいところです。要望自体は昔からあるのに、ここまで慎重な理由は何なのでしょう。組織的な理由なのでしょうか。DataLabの会社部署とI-PADの会社部署が違うとか。

少なくとも、各ソフト開発者が、I-PADのインターフェイスを独自にハックして利用している現在の形態は、利用者側にとってもJRA側にとっても望ましい状況とは思えません。

I-PADを直接利用させたくないのなら、JRA-VANの公式アプリ「NEXT」との連携機能という形でもいいので、何とかして欲しいものです。自作アプリからNEXTに投票を予約し、実際の投票はNEXTを操作して行なうとか。

| | トラックバック (0)

DirectX 10 3Dプログラミングのサンプルを、Visual C++ 2008 Express Edition SP1+DirectX SDK (November 2008)でビルド

Direct3D 11をいじるついでに、DirectX 10 3Dプログラミングのサンプルが、現在のVisual C++ 2008 Express Edition SP1DirectX SDK (November 2008)でビルドできるか確認しました。

※公式にサポートしているのは、書籍で直接扱っている環境だけです。

以下、変更箇所の備忘録です。

【備忘録】
DirectX 10 3Dプログラミングのサンプルを、Visual C++ 2008 Express Edition SP1DirectX SDK (November 2008)でビルドするのに必要な変更。

  • 本書サンプル プログラムはVisual Studio 2005で作られているが、Visual C++ 2008 Express Edition SP1で問題なくそのまま開ける。(ソリューション ファイルやプロジェクト ファイルは、開くときに変換される。)
  • すべての*.rcファイルで、10行目の「#include "afxres.h"」を「#include "WinNT.rh"」に変更する。
  • すべての*.fxファイルと「D3D10Sample12.sh」ファイルで、ピクセル シェーダ関数内で定義している「length」変数が、組み込み関数「length関数」と名前が衝突しているので、変数名を「leng」などに変更する。(以前にも書きましたが、これは厳密に言えばサンプルのバグでしょうね。でもApril 2007ではエラーにならないんだよな…。)
  • コンパイラ オプション「/Wp64」で警告(warning)が出て鬱陶しいので、削除する。
    ≪参考≫/Wp64 (64 ビット移植性の問題の検出)
    http://msdn.microsoft.com/ja-jp/library/yt4xw8fh.aspx

以上の変更で一通り動作することを、VAIO type Z(GeForce 9300M GS)上で確認しました。

※なお「D3D10Sample11」は、執筆時に使用していたSDKのリファレンス ラスタライザとGeForce 8800で確認していた動作と違った動作をしているような気がします。ちょっと前のSDKから気がついていましたが、いつのSDKからそのような動作をするようになったのかは確認していません。

| | トラックバック (0)

DirectX SDK (November 2008)

DirectX SDK (November 2008)が出ていました。

ダウンロードページのWhat's newがなぜかAugust 2008のもので最初混乱しましたが、予告通り、Direct3D 11のtechnical previewが収録されています。というか、ヘルプのWhat's newを見る限り、Direct3D 11のtechnical preview以外の変更はないも同然ですね。

Direct3D 11に関連して、Direct3D 10周りにもいろいろ変化があるみたい。テキトーに英語を斜め読みした限りでは、気になったのは次の2点かな。

・Windows Advanced Rasterizer (WARP)
Direct3D 10.1完全準拠(?)の、高速なマルチコア スケーリング ラスタライザ。D3D11CreateDeviceでデバイスを作るときにD3D_DRIVER_TYPE_WARPフラグを渡すだけで使える。

・Direct3D 10 and Direct3D 11 on Direct3D 9 Hardware (D3D10 Level 9)
Direct3D 9のハードで、Direct3D 10、Direct3D 11が動く。そのために、6つの機能レベルが用意される(9_1, 9_2, 9_3, 10_0, 10_1, 11_0)。予想外のパフォーマンス障害に遭遇しないように、機能は最小限だけエミュレートされる。そのため、Direct3D 9レベル ターゲットでは、ジオメトリ シェーダのような機能は使用できない。

実際に使っていないからよく分からないけれども、WARPは、「Direct3D 10.1やDirect3D 11が、高速なソフトウェア ラスタライザ上で動作する」という理解でいいのだろうか(D3D9のハードは必要なのだろうか?)。だとすると、これはけっこう重要な気がする。ひょっとして、Direct3Dで下位互換性が実現するのははじめてなのかな?

これでWindows XPでもDirect3D 10/11が使えるようになれば、Direct3D 10/11の利用も大きく進むと思うのだけれども、そんなことはしないんだろうなぁ。

※ときどき、WDDMとかVista以降に依存しているからXPでサポートできない、といった意見を目にするけれども、それは“Vista以降でしかサポートしない”理由ではあっても、“XPでサポートできない”理由ではないよね。XPにWDDM的な拡張をするとか、Direct3D 10/11に“XP互換”のFeature Levelを導入するとか、やりようはいろいろあるだろうし。

| | トラックバック (0)

C++Builder 2009 Update 1の問題解決…というか回避

Update1を当ててから、ifstreamでファイルを開こうとするだけで、CodeGuardがfstreamで「不正なメモリのアクセス」(アクセス オーバーラン)を検出するようになった問題ですが、CodeGuardを外してメデタシメデタシ…という訳にはいきませんでした。(というか、よく考えれば、本当にUpdate1から始まった問題なのかも不明な気がする)。

CodeGuardを外したら、こんどは普通に、ofstreamとかでファイルを開くときにエラーが出ます。どうやらCodeGuardの問題ではなく、コンパイラかライブラリのどっちかに問題があるようです(たぶん)。というわけで、CodeGuardの出力とCPUウインドウをまじめに見てみました。というか、これは最初にやるべきことでした。ちょっと反省。

CodeGuardが出しているメッセージはこんな感じ。

2008/11/05 3:22:00 CodeGuard(tm) プロセスを開始しました: PatternMaker.exe(5624)
アクセス オーバーラン 処理中: PatternMaker.exe(5624)  - c:\program files\codegear\rad studio\6.0\include\../include/dinkumware/fstream#157
  アドレス 0x02085D1C から 520 バイトを参照しました。 これは 160 バイトの長さしか確保されていない ヒープブロック 0x02085D10のオフセット 12  に当たります。
  0x004D68A0 呼び出し先:  wcstombs(0x0012F978 ["��\f��"], 0x02085D1C, 0x104 [260])
    0x004C8B7A
    0x00422143 - c:\program files\codegear\rad studio\6.0\include\../include/dinkumware/fstream#157
    0x0041701B - c:\program files\codegear\rad studio\6.0\include\../include/dinkumware/fstream#647
    0x0041684E - Unit1.cpp#526
    0x00411699 - Unit1.cpp#231
    0x0040F5DB - Unit1.cpp#46
  メモリブロック(0x02085D10) [長さ: 160 バイト] は SysGetMem によって確保されました。
    0x0045B9EE - System.pas#3413
    0x0041167A - Unit1.cpp#231
    0x0040F5DB - Unit1.cpp#46
    0x00495DD3 - Forms.pas#3260
    0x00495A1B - Forms.pas#3144
    0x0049F641 - Forms.pas#9732

fstreamの157行目でエラーが出ていますが、ここには、コードに「open a wide-named C stream -- EXTENSION」とコメントがあって、wchar_t *で渡されたファイル名のファイルを開くopenメンバ関数の中です。

で、CodeGuardによると、ここのwcstombs関数に問題があると。wcstombs関数は、第2引数で渡されたwchar_t配列をマルチバイト文字列に変換して、第1引数に渡したchar配列に格納する関数です。変換される最大文字数は、最後の第3引数で渡します。

CPUウインドウで第2引数に渡されたwchar_t配列を見ると、ファイル名が73文字+ヌル文字で格納されています。また、第1引数の配列には、それが変換された73文字+ヌル文字が格納されていました。

CodeGuardによると、第3引数には260が指定されています。どこで指定している数字か知りませんが、260ということは、おそらくMAX_PATHの値か何かでしょう。

で、CodeGuardによると、第2引数に渡した配列があるメモリ ブロックは160バイトしかメモリが確保されていないのに、第2引数に渡したアドレスから520バイトを参照した、と。そりゃーアクセス オーバーランになるよねぇ…って、なんでだよ。

520バイトってのは、wchar_tが260文字分ってことでしょうね。しかし、渡した文字列は73文字+ヌル文字。第3引数の値は、変換元の文字数ではなくて、変換先の最大文字数じゃないの??なんでヌル文字を超えて260文字もアクセスするの?

原因は不明ですが、とりあえず、fstreamにファイル名をUnicodeString(wchar_t*)で渡すのは、EXTENSIONでサポートはされているみたいだけれども、なにやら問題がありそう。

ということで、UnicodeStringのファイル名をいったんAnsiStringに代入して、char*で渡すようにしたところ、「不正なメモリのアクセス」(アクセス オーバーラン)は発生しなくなりました。メデタシメデタシ。

…でも、本当にこんなことでいいのかな。何か見落としている気がする…。ひょっとすると、C++Builder 2009ではUnicodeString周りは鬼門なのかもしれん…。不安だ。

| | トラックバック (0)

C++Builder 2009 Update 1

C++Builder 2009 Update 1が出ていたようなので、当ててみました。
とりあえず、問題が1個増えたようです。

Update1を当ててから、ifstreamでファイルを開こうとするだけで、CodeGuardがfstreamで「不正なメモリのアクセス」を検出するようになりました。このエラーは動的RTLをfalseにしても回避できませんでした。(実行時パッケージのOn/Offは、CodeGuardのメッセージが微妙に変わるだけで、関係ありませんでした)。

何でかなー、といろいろやっているうちに、次のコードで再現できることが分かりました。新しいVCLアプリを作り、<vector>と<fstream>をincludeして、TForm1のコンストラクタに、次のコードを書きます。

__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
  std::vector<std::vector<int> > data;
  for (int row = 0; row < 100; ++row) {
    std::vector<int> line;
    for (int col = 0; col < 100; ++col) {
      line.push_back(100);
    }
    data.push_back(line);
  }


  UnicodeString filename = "test.txt";
  std::ifstream smfile(filename.c_str(), std::ios::in | std::ios::binary);
  if (!smfile)
    ShowMessage("ERROR");
}

最初に、vector<int>に100回数値を追加し、それを、vector<vector<int> >に100回追加しています。エラーを再現するための、基本的に意味のない処理です。

で、この後に、std::ifstream smfile(filename.c_str(), std::ios::in | std::ios::binary);でファイルを開いているのだけれども、ここで「不正なメモリのアクセス」がfstream内で発生します。

「std::ifstream smfile("text.txt",」などど、ファイル名を直接渡すとエラーが出なかったので、最初はファイル名にUnicode(wchar_t *)を渡すのはダメなのかと思いましたが、それならコンパイル時にエラーになりそうなのでfstreamを調べてみたところ、ちゃんとwchar_t *の場合も定義されています。

ちなみにこのコードでは、lineの定義をループの外に出して、ループの頭でlineをclear()するとエラーが発生しなくなります。でもこれは、このコードでたまたまそうなるだけのようで、本番のコードではぜんぜん解決しませんでした。

とりあえず、コードを記述する順番をあれこれ変えることで回避できるようですが、そんな無意味なことに時間を割きたくないし、CodeGuardは使わないのが吉かな…。でも、誤検知ならともかく、本当にコンパイラなりSTLなり私のコードなりに問題があるなら、CodeGuardを切っても問題の解決にならないわけです。困った。

| | トラックバック (0)

C++Builder 2009でCodeGuardを使うと、fstreamでエラーが発生

C++Builder 2009でCodeGuardを使っていると、fstream内で「パラメータ不正 関数に不正なファイル/パイプ ストリーム(0xXXXXXXXX)が渡されました。」などといったエラーが発生します(ifstreamとか使っている場合)。

Codeguard_2

これって、だいぶ昔のC++Builderでも発生していたような気がするな…。というわけで、C++リンカ設定で動的RTLを無効にしてみたら、予想通り、エラーが出なくなりました。

C++Builder 2007では動的RTLを常に無効にしていたので、2007で同じ問題があったか分からないのですが、まさか、ずっと解決していない問題なんでしょうかね?それとも、C++Builder 2009で再発したのでしょうか。

動的RTLは無くても困らないから、問題ないといえば問題ないのだけれども…。

| | トラックバック (0)

C++Builder 2009のフォーム デザイナ

デザイナ ガイドライン機能が微妙に使い難い…。ガイドライン機能に期待するのは、コントロールに合わせて動的に追加設定されるグリッド ポイント、くらいの機能なのですが、現状では自己主張が強すぎますなぁ。細かな設定項目もなさそうだし、とりあえずデザイナ ガイドライン機能はオフにしました。

あと、フォーム デザイナの操作でUndoができないのは改善して欲しいかな。操作をミスって多数のコントロールが盛大にズレたときには、魂が抜けるような気がしました。

コード補完機能も、まだ微妙に動作がおかしい(?)ものがあるみたい。TStringListの場合、14個しか候補が出てきません(LoadFromFileとかも出てこない)。ほぼ上手く行っているだけに、補完する範囲がこれで正常なのかどうかもよく分かりません…。これも、後で出てくるようになるのかな?

ヘルプは相変わらずイマイチ…。改善されるような話を以前どこかで読んだような気がするけれども、気のせいだったかのな。個人的に不便なのは、VCLリファレンスで機能別の分類がないことなのだけれども、昔のヘルプには存在したのに、なんで削除したのだろう。VCLの解説でも、AnsiStringとUnicodeStringが混乱しているし、初心者お断わりの度合いがますます高くなってしまったような…。

| | トラックバック (0)

C++Builder 2009のオブジェクトインスペクタ

IDE自体の操作(と使い勝手)は、C++Builder 2007とほとんど変わっていないのですね。だんだん慣れてきました(というか、思い出してきました)。

コード補完機能も、なぜか出るようになりました。何が起こっているのかよく分からない…。

しかし、コード補完で引数のないメソッドを選んだときに、わざわざメソッドの「( )」の中にカーソルを引き戻す(しかも、少し遅れて引き戻す)のは止めて欲しいです。補完した直後は、「( )」の後にカーソルがある(少なくとも、あるように見える)ので、そのまま入力を継続して、たとえば「;」と入力すると、「( )」の中に入力されて「(;)」になってしまいます。しかも、わざわざ「<パラメータ不要>」とかメッセージまで出してくれたり…。パラメータ不要って分かってるならカーソル戻す必要ないじゃん。それとも、これ、オプションで切れるのかな?

あと、オブジェクトインスペクタの表示がバグるのも困りますね。
たとえば、プロパティのいちばん下に、次のように「SnapBuffer:10」が表示されていて、

Property01_3

SnapBufferの「10」をクリックすると、全体がスクロールして次のような表示になります。

Property02

SnapBufferの下にあるTagがダブって表示されて、SnapBufferが消えるわけですね。

で、最初、私は単にSnapBufferという表示が消えるだけという単純なバグなのだろう、と思っていたわけです。ひょっとして、VAIOのディスプレイドライバの不具合かも、とか思っていました。

そこで、たとえば、「10」を次のように「20」に書き換えて見ます。

Property03

しかし、この操作で実際に書き換わるのは、本当に、Tagなわけです。

Property04

このように、Tagが20になって、SnapBufferは10のままです。

これのおかけで、イベントの設定で混乱しました。ダブルクリックでイベントハンドラを追加していくと、ぜんぜん関係ないイベントが設定されているという…。

注意すれば避けられるバグなので、最悪というわけではありませんが、いちいち気にしていなければならないのはちょっといやですね。

IDEは同じようなものだけれども、慣れるのに時間が掛かるような気がしてきました。

| | トラックバック (0)

C++Builder 2009 Professional Edition購入

発売と同時に購入して放置状態でしたが、ぼちぼち、使い始めました。

で、バージョンアップ版でもユーザー登録が必要らしい、と。まあ、他社の例でも、会社が変わったら個人情報保護法がどうたらでユーザー登録し直しのケースが多いからそんなものかも…、と思ったのですが、ユーザー登録ってハガキでしかできないの?びっくりです。

で、ユーザー登録カードを書こうと思ったら、今度は新規登録するべきなのか追加登録するべきなのかで迷いました。そもそも、「ユーザーID」って、ボーランドのでしょうか、それともエンバカデロのでしょうか。でもって、買ったのはバージョンアップ版だけれども、新規登録でいいの?でも、バージョンアップ元の情報を書く欄がないのだけれども…。

で、面倒くさいから、ユーザー登録は放置して使い始めましたが、エディタのコード補完機能がおかしいような? たとえば、フォームにラベルを配置して「Label1->」と入力しても、ほんのちょっとしか候補が出てきません。

Cb2009

これだけ。最近C++Builderを使っていなかったのだけれども、C++Builder 2007もこんな感じでしたっけ?そんな記憶はないのですが…。ラベル以外も軒並みこんな感じで、正直、コード補完機能は使い物になりません。 何これ?

今回のバージョンアップでは、Unicode対応、C++ 0x対応、Boost標準対応と、興味のある機能がいくつかあったのでバージョンアップしましたけれども、正直、43,470円は高いと思いますね。

Windows 3.0の頃からBorlandの開発ツールを使い続けてきましたが、次のバージョンも値段機能共にこんな感じであれば、もうバージョンアップはしないかもしれません。

| | トラックバック (0)

Gamefest Japan 2008 2日目

「G2:DirectX11 グラフィックス パイプライン: イントロダクション」を聞いてきました。やはり、まだ開発中ということもあるのか、本当にイントロダクションという感じ。

テッセレータに関しては、昨日のセッションを超えるような内容はなし。Xbox 360は詳しくないので、11のテッセレータはXbox 360のスーパーセット(Xbox 360では、テッセレータ→頂点シェーダらしい)というのが面白かった。

Direct3DをGPGPU向けに拡張する演算シェーダは、ピクセル シェーダ←→データ構造(共有メモリ)←→演算シェーダ、といった流れになるらしい。用途に物理演算も上げていたけれども、Havokとかも提供されるのだろうか。手軽に使えるようになると面白いのだけれども。

Direct3D 11は、10/10.1のハード上でも実行可能。ただし、テッセレータなどの機能は11のハードが必要、ということだけれども、演算シェーダについては、可能な限り多くのグラフィック ボードをサポートしたい、みたいな言い方を(たしか)していて、曖昧な印象。でも、テッセレータと演算シェーダが動かなければ、それって、ほとんどDirect3D 10じゃないかな。素直に、11には11のハードが(事実上)必要、と理解しておいたほうがいいのかも。

マルチスレッド処理に関しても、具体的な話があまりなく、ピンとこなかった。Direct3D 10/10.1環境でDirect3D 11アプリを実行する場合、新しい10/10.1ドライバを使えばマルチスレッドに対応するらしい。

他には動的シェーダ リンケージ、新しいテクスチャ圧縮フォーマット、etc。

11月版SDKでプレビューが提供予定なので、具体的なことはそれで確認できるのだろうか。とりあえず、10の現行ハードでどこまで使えるのか、知りたい。正式版は2009年後期~2010年前期。対応ハードが出るのもそのくらいになるのだろうか。

そういえば、11月版SDKのドキュメントは英語だけれども、日本語も出すようなことを言っていたな…。

| | トラックバック (0)

Gamefest Japan 2008 1日目

今日は、Gamefest Japan 2008の1日目。T4:Adaptive Terrain Tessellation on the GPUだけ出席。

Direct3D 11のテセレーション周りの動作を、地形を例に簡単に解説。たしかに、地面って、足下から遠くの山まで連続して存在するものなので、テセレーションのような処理の代表例かもしれない。

機能としては、入力アセンブラにパッチ プリミティブが追加されていて、頂点シェーダ(VS)でパッチのコントロール頂点を処理→ハル シェーダ(HS)でテセレーション係数を出力→テセレーション ステージ(固定機能)でテセレーション座標出力→ドメイン シェーダ(DS)で頂点出力→ジオメトリ シェーダ(GS)、てな流れになるらしい。難しいことはなさそう。

個人的には、昔から丸(円)の不自然さというのがすごく気になっていて、ゲームなんかで丸いはずのパイプや窓、岩なんかがn角形になっているとガッカリするので、そのへんもなんとかするのが普通になって欲しい。

それ以前に、Vistaの普及を含めた対応環境が問題かもしれないけれども。

| | トラックバック (0)

初心者に、アプレットビューアの使い方はどう説明すべきか

JDKには、「Web ブラウザを使わずにアプレットを実行したりデバッグしたりする」(java.sun.com)ためのツールとして、「アプレットビューア(appletviewer)」(java.sun.com)というツールが提供されています。

このツール自体はずっと昔から提供されているツールであり、基本的な使い方も変わっていないはずですが、改めて、超初心者にアプレットビューアの使い方を説明する場合、また、アプレットビューアに限らず、初心者向けの解説の仕方について、ちょっと考えてしまいました。

要するに、「アプレットビューアには、(appletタグをコメントとして記述した)javaファイルを渡します(渡すことができます)」といった説明は、初心者向けの解説として適当かどうかという問題です。

まず、私の認識として、

  • appletviewerには、「実行するアプレットが記述されているhtmlファイル」を渡すのが本来の使い方である。
  • ただし、appletviewerは、「object」「embed」「applet」「app」タグ以外のHTMLコードを無視する(java.sun.com)
  • そのため、「object」「embed」「applet」「app」タグだけを記述した適当なテキスト・ファイルを渡しても、結果として動作する。

ものだと理解していました。

一応確認として、sunのドキュメント(java.sun.com)では、アプレットビューアの形式は、

appletviewer [ options ] urls ...

となっています。また、使用例として、

appletviewer -classic MyApplet.html

などとなっています。

つまり、「appletviewerに、appletタグをコメントとして記述したjavaファイルを渡す」というのは、上記のようなappletviewerの動作を理解している人が、htmlファイルの作成を省略したいときに行なう“工夫・応用”(というか、手抜き)だと思うわけです。

たしかに、「動作する」という意味では「javaファイルを渡す(ことができる)」という言い方は間違いではないのですが、初心者がこの文の真の意味を理解するのは困難でしょう。むしろ、間違った理解へと導いてしまうのではないでしょうか。

実際、たとえば「教えて!goo」を検索すると、

  • 「appletviewerが起動しません。」(goo.ne.jp)
    →なんでappletviewerの場合は引数にソースファイルを指定するんでしょうかね?
  • 「appletviewerについて」(goo.ne.jp)
    →appletviewerで指定するファイルはどうしてclassではなくjavaなのですか?

などと、勘違いしていると思われる(たぶん)初心者の質問がいくつか見つかります。

htmlファイルを作らずに、javaファイルにappletタグをコメントとして記述する方法は、確かに説明する分量は1ステップ少なくなりますし、読者の負担も少なくなるのかも知れません。初心者向けの解説というのは難しいもので、正確ならいいというものではないし、場合によっては大胆に省略・簡略化してウソをつくことが適当である場合もあります。しかし、それでも初心者の理解の方向性を間違わせるような解説というのは、まずいと思うわけです。初心者向けの解説で、htmlファイルを渡す方法には一切触れずに、特別な加工をしたjavaファイルを渡す方法だけを解説するのは、一見、分かりやすい親切な解説に思えても、逆に初心者のためにならないと思います。

……と、いうようなことを、今日、考えたりしました(理由は省略)。

| | トラックバック (0)

DirectX SDK June 2008

6月6日付でDirectX SDK June 2008がリリースされていました。

主な変更点は、

  • PIX for Windowsの改良
  • xWMA Audio Compressionで新しいビットレート オプションをサポート。デフォルトのエンコーダ ビットレートを96000から48000bpsに変更
  • xAPO Effects Libraryの提供
  • 新しい記事(Direct3D 10 FAQ, DXGI Best Practices)
  • 新しいサンプル(XAudio2CustomAPO sample, Autorun sample)
  • XACTEngine, XAudio2, X3DAudio, XAPOFXのデバッグ用DLLのインストール先が変更

といったところかな。あと、XAudio2にバグがあるらしいけど、あまり興味ないしなぁ。

March 2008で破壊的変更(Breaking Changes)のあったHLSL Compilerには、特に変更はない模様。

よく見たら、March 2008ではXAPOでもBreaking Changesがあったのね。他にもMarch 2008ではいろいろ微妙な変更があった模様。XAudioとかあまり興味がないので気がつかなかった。March 2008は1つの区切りになるリリースだったのかな。

| | トラックバック (0)

DirectX SDK (March 2008)

3月7日付でリリースされていました。

http://www.microsoft.com/downloads/details.aspx?FamilyID=572be8a6-263a-4424-a7fe-69cff1a5b180&DisplayLang=en

大きなポイントは、

  • Direct3D 10.1、XAudio2、XACT3のリリース版が提供。
  • Visual Studio 2008に正式対応。対応バージョンは、2008と2005。

といったところでしょうか。

ヘルプには、Direct3D 10.1でサポートされるシェーダ・モデル4.1に関するまとまった情報はないみたい……。もちろん、リファレンス ページには、4.1に関する情報が追加されているけれども、4.1に関する変更点だけまとめて欲しかったです。

リリース情報を見ると、リファレンス ラスタライザでのDirect3D 10.1サポートは、このバージョンからっぽい。とりあえず、Direct3D 10.1周りは、Vista SP1が正式リリースされてからテストしてみよう。

個人的には、Visual Studio 2008の正式サポートがいちばん嬉しいです。今までは、Visual Studio 2005 Standard Editionを使っていましたが、HDDの空き容量が少なくて困っていたので、DirectX SDK (March 2008)がVisual Studio 2008をサポートしたのに合わせて、Visual C++ 2008 Express Editionに乗り換えました。ローカルのMSDNも削除したので、5GB近く空いて、ハッピー。

とりあえず、動作確認として、「DirectX10 3Dプログラミング」のサンプルをビルドしてみることに。すんなり行くかな、と思っていたのですが、問題が2つ発生しました。

「VS2005 Standard + DX SDK Novemver 2007」から「VC++2008 Express + DX SDK March 2008」へと、コンパイラとDirectX SDKの両方を同時に変更したので、どちらが原因かはちょっと不明。これはちょっと失敗だった。

まず、リソースのコンパイルでエラーが発生。これは、rcファイルでエラーが発生する行をコメントアウト(削除)することで対処可能。原因は、なんとなく、VC++2008 Express版だから、という気がするけれども、どうなのだろうか……。VS2008のStandard版でどうなるかは、そのうち、会社で購入することがあれば、試してみよう。機能的にはExpress版で充分だし、もう個人でVisual Studioは購入したくない。

もう1つの問題は、HLSLで書かれているシェーダ コードのコンパイルに失敗します。これはちょっとショックだったので、fxcでエラーを見てみたら、なんと、HLSLの組み込み関数と同名のローカル変数を定義していました。ひぃ。Novemver 2007までのシェーダ・コンパイラは、エラーを出さなかったので、気がつかなかったのです……。「float length = length(light);」とか、自分でもよくこんなコード書いたな、という感じ……。とりあえず、変数名を「leng」に変更して解決。

Vista用に買ったノートのローンが終わったので、そろそろ、Direct3D 10に対応したノートが欲しいところだけれども、無駄遣いかな……。以前は、IntelのD3D10サポートに期待していたのだけれども、「G35のD3D10サポートはG45と同時」とか、遅れすぎだよね。

| | トラックバック (0)

Vista SP1 RCとDirect3D 10.1

Vista SP1 RCが一般でもダウンロードできるようになったので、以前ちょっと試したDirect3D 10.1周りをちょっとテスト。

まず、以前「DirectX SDK (August 2007)」でビルドしていたサンプルは、そのままでは起動しなかった。そこで、「DirectX SDK (November 2007)」で単純にビルドしなおした。

このサンプルは、「DirectX10 3Dプログラミング」の「D3D10Sample21サンプル」をベースに、

  1. ヘッダ・ファイルとライブラリを10.1のものに追加変更。
  2. デバイスのインターフェイスを「ID3D10Device1インターフェイス」に変更。
  3. 「D3D10CreateDeviceAndSwapChain関数」から「D3D10CreateDeviceAndSwapChain1関数」に変更し、「D3D10_FEATURE_LEVEL_10_1」と「D3D10_1_SDK_VERSION」を渡す。

ようにしただけのサンプルなのだけれども、「D3D10CreateDeviceAndSwapChain1関数」に「D3D10_FEATURE_LEVEL_10_1」を渡すと、「D3D10_DRIVER_TYPE_HARDWARE」でも「D3D10_DRIVER_TYPE_REFERENCE」でも、「E_NOTIMPL (0x80004001)」エラーが発生して起動しない。試しに、「D3D10_FEATURE_LEVEL_10_0」を渡すと「D3D10_DRIVER_TYPE_REFERENCE」で起動する。

テストしたマシンは「Direct3D 9」にしか対応していないノートPCなので、「D3D10_FEATURE_LEVEL_10_0」でも「D3D10_FEATURE_LEVEL_10_1」でも、「D3D10_DRIVER_TYPE_REFERENCE」で起動するかと思ったけれども、意外だった。

「E_NOTIMPL (0x80004001)」エラーが返るってことは、「Direct3D 10.1」のリファレンス デバイスは、「Vista SP1 RC」or「DirectX SDK (November 2007)」では、まだ実装されていないor実行できないのだろうか。それとも、何か足りていないor間違っているのか……。

| | トラックバック (0)

DirectX SDK (November 2007)

DirectX Redist (November 2007)だけ出ている…。SDKはもうすぐかな?

DirectX SDK - (Novemeber 2007)もリリースされました。以下、気になる点をメモ。

・最大の変更点は、DirectX Audio関連。DirectX Graphics(Direct3D)関連はほとんど変更なし。DirectX Audioは、X3DAudio、XACT、XACT3、XAudio2、XAPO、DirectSoundと、かなり賑やかな感じになっている。というか、混乱気味だと思う。そろそろXAudio2あたりは使ってみるかな…。

・DDSファイルフォーマットで、Direct3D 10がサポートされている。

・ドキュメントにはDirect3D 10.1やシェーダモデル4.1に関する新しい情報なし。

・ドキュメントでDXUTの解説が、DirectX Graphics内から、The DirectX Software Development Kitの下に移動している。これ、いつからだろう? DXUTのサポートは安定したと考えて良いのだろうか…。

・各種SDK付属ツール(DirectX Texture Toolとか)は、相変わらず、Direct3D 10をサポートせず。このようなツールをSDKで提供するのは止める方向なのだろうか。

・March 2008のDirectX SDKでVisual Studio 2008のサポートが追加される。同時に、Visual Studio 2003がサポートから外される。2005のサポートは維持。

そういえば、隔月リリースでなくなる最初のDirectX SDKですね。

| | トラックバック (0)

C++Builder 2007 Update 3

Update2から1ヶ月くらいでUpdate3が出たのにはビックリ。細かくアップデートする方針なのだろうか?現在の私のC++Builderの利用状況は、Delphiで作られた古いコンポーネントを1つインストールして業務用に細かなツールを作ったりしているだけなので、あまり困った問題はないのだけれども。とりあえず、いちばん改善して欲しいのはアップデートに掛かる時間かな。

そういえば、CodeGear RAD Studio 2007への特別アップデートの案内も来ていた。Pro版の通常アップデートが67200円、C++Builder 2007からの特別アップデートが29400円(期間限定)。ということは、BDS 2006→C++Builder 2007→RAD Studio 2007でも、BDS 2006→RAD Studio 2007でも、アップデートの費用はほぼ同じ(後者のほうが少し高い?)ということか。

もう少し安ければRAD Studioが欲しいのだけれども、まあ、仕方がないのかな。

(追記)
Update3からかどうかはっきり覚えていないけれども、不揃いだったツールバーの太さが揃ってるっぽい。

よく考えると、統合製品を直接バージョンアップ(BDS2006→RAD Studio2007)するよりも、いったんC++ BuilderやDelphiの単体製品にバージョンアップ(?)してから改めて統合製品(RAD Studio)にバージョンアップしたほうが安いって言うのは、ちょっと納得いかないかもしれない。少なくとも、そんな価格体系になるなんて、想像もしていなかった。それなら、統合製品ユーザーも、不要でも単体製品を買っておけってことになるけれども、無駄というか、価格体系の意味が分からん。

まさか、次の単体製品へのバージョンアップは、統合製品(RAD Studio 2007)からバージョンアップしたほうが安くて、単体製品(C++ Builder 2007)からバージョンアップすると2倍近い値段がする、とかじゃないだろうな?

| | トラックバック (0)

ID3D10Device1インターフェイス

よく考えてみれば、D3D10CreateDevice1関数とかにHardwareLevel引数なんてものがあるわけだし、ID3D10Device1::GetFeatureLevelなんてメソッドもあるわけだから、Direct3D 10.1用のデバイス(ID3D10Device1インターフェイス)って、10.0のハードウェアでも利用できるのよね?単に10.1の新機能が使えないだけで。

だとすると、10.0レベルのプログラムを作る際も、新しい流儀でいい(望ましい?)わけか…(SP1以降は)。NVIDIAの人は「現行のGeForce 8シリーズでは10.1に対応しない」と明言しているし、「~1」じゃない関数/インターフェイスも残るかと思ったけれども、単純に乗り換えて良いみたいね(たぶん)。

なんか、昔のCapsビットを思い出して嫌な感じもするけれども、そこまでバージョンが細分化することはない…だろう。

| | トラックバック (0)

Direct3D 10.1についてのメモ

「Direct3D 10.1」についてのメモ。さすがに、出たばかりの本に全面改定の必要があるとするとシャレにならないので、実態をちょっと調べてみた。

主な情報源は、DirectX SDKとMicrosoftのIntroduction to Direct3D 10 (SIGGRAPH 2007)

●「Direct3D 10.1」とは
「Direct3D 10.1」は、「Direct3D 10」の拡張シリーズ。「完全な(Complete)Direct3D 10」と「レンダリング品質の改善」を目的としており、「やがてやってくる(Upcoming)世代のハードウェア」と「Windows Vista SP1」においてサポートされる。なお、SDKのリファレンス・デバイスは「10.0」と「10.1」の両方をサポートする。

「Direct3D 10.1」で追加されたAPIは5つ。「Direct3D 10.0」とAPIレベルでの大きな違いはない。シェーダ・モデルは「4.0」から「4.1」に。「4.1」の詳細は不明(?)。

●インクルード・ファイル、ライブラリ・ファイル
「Direct3D 10.1」を使うには、「D3D10_1.h」をインクルードして、「d3d10_1.lib」(または「d3d10_1d.lib」)をリンクする。
なお、「D3D10.h」もインクルードする場合、「D3D10_1.h」よりも後でインクルードされるようにしなければならない。そのため、「d3dx10.h」の前でインクルードする必要がある。

●ID3D10Device1インターフェイス
「Direct3D 10.1」の新機能を使うために、新しく「ID3D10Device1インターフェイス」が提供される。このインターフェイスは従来の「ID3D10Deviceインターフェイス」を継承している。
 「ID3D10Device1インターフェイス」を作成するために、新しく「D3D10CreateDevice1関数」と「D3D10CreateDeviceAndSwapChain1関数」が提供される。これらの関数は、「10.0」(D3D10_FEATURE_LEVEL_10_0)と「10.1」(D3D10_FEATURE_LEVEL_10_1)の両方に対応する。SDKバージョンには、「D3D10_1_SDK_VERSIONマクロ」を使う。

●基本機能
かつてオプションだった、「FP32のフィルタリング」と「4x MSAA」が必須(required)になる。

ハードウェア・デバイスの機能レベルを取得する「ID3D10Device1::GetFeatureLevelメソッド」がサポートされる。

●テクスチャ
「キューブ・テクスチャ配列」がサポートされる。従来は、キューブ・テクスチャだけ配列がサポートされていなかった。
そのために、新しく「ID3D10ShaderResourceView1インターフェイス」と「D3D10_TEXCUBE_ARRAY_SRV1構造体」が提供される。このインターフェイスは従来の「ID3D10ShaderResourceViewインターフェイス」を継承している。「ID3D10ShaderResourceView1インターフェイス」を取得するには、「ID3D10Device1::CreateShaderResourceView1メソッド」を使う。

非圧縮フォーマットから、ブロック圧縮フォーマットにbitwiseコピー可能。
また、オン・ザ・フライ(その場)でBC/RGBEに圧縮できる。

より多くのアンチエイリアシング制御が可能。

●ブレンド
ブレンド可能SNORMフォーマットがサポートされる。

描画ターゲットごとに合成方法を設定可能になる。従来は共通。
そのために、新しく「ID3D10BlendState1インターフェイス」と「D3D10_BLEND_DESC1構造体」が提供される。このインターフェイスは従来の「ID3D10BlendStateインターフェイス」を継承している。「ID3D10BlendState1インターフェイス」を取得するには、「ID3D10Device1::CreateBlendState1メソッド」を使う。

●Direct3D 10.0用サンプルの変更
「DirectX10 3Dプログラミング」のサンプルを、「10.1」を使うように変更してみた。
とりあえず、ヘッダ・ファイルとライブラリを10.1のものに追加変更し、デバイスのインターフェイスを「ID3D10Device1インターフェイス」に変更、「D3D10CreateDeviceAndSwapChain関数」から「D3D10CreateDeviceAndSwapChain1関数」に変更して「D3D10_FEATURE_LEVEL_10_1」と「D3D10_1_SDK_VERSION」を渡す。
以上でビルドはできたが、実行すると「d3d10_1core.dll」がないと怒られて終了する。やはり、SP1待ちか。

(2007/12/14)Vista SP1 RCで試してみた→Vista SP1 RCとDirect3D 10.1

やはり、それほど大きな変更はないようで一安心(少なくとも、アプリ側では)。
気になるのはSP1の登場時期とGPU側の対応だけれども、既存のGPUが対応できないとすると、ビデオカードや、特にノートPCの購入は考えてしまうよなぁ。SM4.1の詳細が分からないけれども、アプリ側から見ると全体として10.0からジャンプアップしているわけではないので、10.1は普及しない、と考えることもできるし、そもそも現行の10.0が普及していないので10.1が主流になると考えることもできる。Vista専用の10系は普及しないという可能性も大きいけれども。

そろそろDirect3D 10対応ノートが出てきたので買い換えも考えていたけれども、やっぱり新しいノートに買い換えるのはSP1&10.1対応GPUが出てからにするのが賢いか。

| | トラックバック (0)

C++Builder 2007 Update 2…はどこ?

C++Builder 2007 Update 2が公開されたらしいけれども、自動/手動アップデートはもちろん、CodeGearのWebサイトにも見あたらないのはなぜだろう?。リリースノートの解決された問題点を見ると、cg32.libとか結構深刻な問題が解決しているらしいので、早く当てたいのだけれども。

それにしても、しばらくVC++とJavaばっかり使ってたらすっかりVCLの使い方を忘れてしまっていた。VCLのコンポーネントを作るのってこんなに面倒くさかったかな?Borland系の解説書はほとんど捨ててしまったので、ヘルプの分かり難さが辛い。

(追記)
ようやく公開されたみたい。
しかし、インストーラキャッシュを削除しているとUpdateできないとは恐れ入った。てっきり、CCB2007のDVDを用意しておけばOKかと思っていたよ。Visual StudioのUpdateもHDDに10GB近くの空き容量を要求するし、開発ツールのメーカーはユーザーのHDDの空き容量は無限だとでも思っているのかね。私のPCは常に数GBしか空きがないというのに…。

…解説にあるように、修復セットアップしたらCCB2007の起動時にエラーが出るようになった。Update2のダウンロードもぜんぜんできないし(ダウンロードのリンク生きてんの?)、ブチギレそうだ。

| | トラックバック (0)

Microsoft DirectX SDK (August 2007)

Microsoft DirectX SDK (August 2007)が7月27日付でリリースされていました。

今回のアップデートでは結構大きな変更と変更予定があるようですね。
とりあえず、このSDKで「DirectX10 3Dプログラミング」のサンプルプログラムをビルドできることだけ確認しました。

以下、個人的に気になる点をメモ。

○SDKのリリースが隔月から年4回に。August 2007 → November 2007 (OctoberとDecemberの代わり) → March 2008 (FebruaryとAprilの代わり) → June 2008 → August 2008。

○Direct3D 10.1のTech Preview版が登場。これで現行のSDKで提供されるDirect3Dは「Direct3D 9」「Direct3D 10.0」「Direct3D 10.1」の3系統に。「Direct3D 9Ex」も入れると4系統か。そもそも、Vista関連では不景気な話か聞こえてこないのだけれども、MSはその点をどう考えているのだろう。次々にVista向け新機能をリリースしても誰も使ってないなんて状況になるだけなのでは。Direct3D 10.1そのものはともかく、Windows Vista SP1 Betaを必要とするってことは、やはりSP1も近いのでしょうね。こちらのほうが楽しみ。

○XAudio2 Beta1が登場。やはり低水準オーディオ機能は、DirectSoundからXAudio2に移行するようですね。VistaでDirectSoundは半分死んでるようなものだし、ちょっとテンポが遅いくらい。こちらはXPとVistaでサポートされるので、普通に使えそう。デバイスのサポート次第だけれども…。

○古いDirectXコンポーネントの削除予定。次のDirectX SDK(November 2007)では、盲腸というか、事実上終わっているDirectXコンポーネントの収録が終了するようです。収録されなくなるのは、「Direct3D8以前のすべてのバージョン」「Direct3D RM」「DirectAnimation」「DirectMusic」「DirectInput7以前のすべてのバージョン」「DirectPlay」「DirectPlayVoice」「Managed DirectX」。

| | トラックバック (0)

『DirectX10 3Dプログラミング』発売

Direct3D 10のプログラミング入門書「DirectX10 3Dプログラミング」(ISBN978-4-7775-1298-0)が7月19日に発売されます。

内容的には、C++とWin32 APIを使ったアプリの作成経験がある人を対象に、Direct3D 10を使ったプログラムの作成方法の基礎を解説しています。使用しているSDKは、「Microsoft DirectX SDK (April 2007)」です。書名が紛らわしいかもしれませんが、あくまでも「Direct3D 10.0」の解説書です。既刊「DirectX9 DirectX Graphics」の後継のような位置づけになります。ちなみに、私が執筆しています。

リンク先の書籍紹介ページには、なぜか10章までの目次しか載っていませんが、実際には、以下の24章から構成されています。(8月9日追記。その後、全章の目次が掲載されるようになったようです)。

1章 「Direct3D 10」の基礎知識
 特徴/構成/リソース/APIのレイヤー構成/Direct3Dのヘルパー・ライブラリ/実行環境

2章 基本的なプログラム
 プロジェクトの作成/DirectXのエラー表示機能/アプリケーションの基本構造/デバイスとスワップ・チェインの作成/バック・バッファの設定/画面の描画/デバイスの消失/終了処理/サンプル・プログラム

3章 DXGI
 DXGIについて/グラフィックス環境の調査/ウインドウ・サイズ変更時の処理/ウインドウ・サイズの変更/無駄な画面描画の抑制/画面モードの切り替え/トーンカーブによる階調補正

4章 テクスチャの作成
 テクスチャ/画像ファイルからシェーダ・リソース・ビューを作る/画像ファイルからテクスチャ・リソースを作る/描画ターゲットになるテクスチャ・リソースを作る/CPUから書き込むテクスチャ・リソースを作る/テクスチャを画像ファイルに保存する

5章 スプライトとフォントの描画
 スプライト描画機能/フォント描画機能/深度/ステンシル・バッファの使用

6章 3Dグラフィックスの数学
 ベクトルの変換操作 ~行列と同次座標~/左手座標系と右手座標系/三角形ポリゴンと向き/3Dグラフィックスの座標系と座標変換/照明(光源と反射)/16ビット浮動小数点数/ベクトルの構造体/クオータ二オンの構造体/行列の構造体/平面の構造体/色の構造体/マクロ

7章 3Dグラフィックスの基本的な描画手順
 概要/ステート・オブジェクト/描画パイプラインで行なう処理

8章 描画データの用意
 プリミティブの種類/頂点バッファとインデックス・バッファの用意

9章 シェーダ・ステージ
 概要/シェーダで実行するコード/HLSLコードのコンパイル/シェーダ・オブジェクト/定数バッファ

10章 入力アセンブラ
 概要/「頂点バッファ」と「入力スロット」/入力レイアウト・オブジェクト/プリミティブの種類

11章 ラスタライザ
 概要/ラスタライザ・ステート・オブジェクト/ビューポート/シザー矩形

12章 出力マージャー
 概要/描画ターゲット/ブレンド・ステート/深度/ステンシル・ステート

13章 基本的な3D描画
 概要/定数バッファへの書き込み/描画パイプラインを構成/描画/サンプル・プログラム

14章 エフェクト
 概要/fxファイル/エフェクトの作成/テクニックの取得/パスの取得/入力レイアウトの作成/グローバル変数の設定/エフェクトを使った描画/サンプル・プログラム

15章 HLSLの文法
 HLSLの基本的な文法/HLSLの組み込み関数

16章 シェーダ関数
 概要/頂点シェーダ関数/ジオメトリ・シェーダ関数/ピクセル・シェーダ関数/システム生成値/サンプル・プログラム

17章 テクスチャ描画
 テクスチャの定義/シェーダ・リソース・ビューの設定/サンプラを使わないテクスチャ読み込み/サンプラを使ったテクスチャ読み込み/サンプル・プログラム

18章 3Dデータの読み込み
 概要/Wavefront OBJファイル形式/Wavefront OBJファイル読み込み関数/境界球と境界ボックス/描画用データの作成/サンプル・プログラム

19章 複数インスタンスの同時描画
 概要/インスタンス描画メソッド/各インスタンスの描画設定/サンプル・プログラム

20章 キューブ・テクスチャ
 概要/キューブ・テクスチャへの描画/キューブ・テクスチャへのアクセス/サンプル・プログラム

21章 ストリーム出力
 概要/バッファ・リソースの作成/ジオメトリ・シェーダの作成/ストリーム出力を使った描画パイプラインの実行/サンプル・プログラム

22章 影の描画
 影について/シャドウ・ボリュームを使った影/シャドウ・マッピングによる影

23章 PIX for Windows
 PIXの基本的な使い方/レンダリングの確認/描画するメッシュの確認/シェーダの動作確認

24章 NVIDIA GeForce 8シリーズ
 GeForce 8シリーズのスペック/インタビュー

今回の本では、DXUTを使いませんでした。Direct3D 9のDXUTは、Direct3D 9の面倒な部分をシンプルな構造でうまく包み込んでくれていたと思いますが、Direct3D 10のDXUTはDirect3D 9と共用になってしまい、複雑になってしまいました。Direct3D 10の実行環境がVistaに限定されることもあり、Direct3D 9とDirect3D 10の両対応アプリケーションを開発する必要がある場合には便利なのでしょうが、Direct3D 10自体がDirect3D 9よりも使いやすくなったこともあり、Direct3D 10だけを使う場合にはDXUTのメリットがあまり感じられなかったので、ページの都合もあり、DXUTの解説は省略しました。

今回は、本書の最後で、エヌビディア コーポレーション デベロッパーテクノロジ エンジニアリングのブライアン デューダーシュさんに、GeForce 8シリーズについて、Direct3D 10初心者が思い浮かべそうな素朴な疑問をいくつかお聞きしました。
私の執筆作業が遅れたこともあり、インタービューはメールで質問を送って回答を返信してもらう形式で行なっており、回答文もNVIDIAから頂いた文章をほぼそのまま掲載しています。私の質問が悪いせいもあって、話がすれ違っている部分もありますが、ご容赦ください。
個人的には、質問5の回答の「より多くのプリマティブを実行すればするほど、パフォーマンスの低下が早くなるため、われわれはGSを実装したプリマティブを多数用いた制作はディベロッパーの方々へは推奨しません。」という部分が参考になりました。

本書がDirect3D 10のプログラミングを始めようと思っている方の参考になれば幸いです。

| | トラックバック (1)

C++Builder 2007

CodeGear C++Builder 2007 Pro版が届きました。Borland Developer Studio 2006からのバージョンアップですが、製品名からBorlandが消えているのはさみしいですね。Windows 3.0の頃からBorlandを使っているので、今さらCodeGearとか言われてもピンと来ません。

新しいC++Builderの第一印象は、悪くないです。といってもちょっと動かしただけですが。
思わずツールパレットがない?とか思ってしまいましたが、なんかごく普通のツールになったなという感じ。従来と同じことができて、安定して動いてくれれば文句はないです。

とりあえず、プロジェクトのパス(フォルダ名)に、「+」文字が含まれているとリンクに失敗([ILINK32 エラー] Fatal: ファイル '' を開けません)するのは仕様なんですかね?最初、デフォルト プロジェクトに「~\C++Builder2007」とか入れていたらエラーになってちょっとガッカリしました。昔はともかく、いまどきこの手の制限はなくすべきだと思うな。

それと、メニューの項目がやけに離れて並んでいるのはなぜ?ツールバーの太さもバラバラだし、こういうのが最近の流行なのかな?

Image1

| | トラックバック (0)

もう朝か

ようやくゴールが見えた。ドキュメントに書かれているようなことを理解するのは難しくない。本当に難しいのは書いていないことを理解することだと再認識。

以下、メモ。

・リファレンス ラスタライザとGeForce 8800 GTXで描画結果が違う。→GeForce 8800 GTXのドライバを更新したら解決したっぽい?

・GeForce 8800 GTX上でHLSLのforループが期待通りの動作をしない。→ループを単純に展開して解決したことにする。

・PIX for Windowsがデバッグしようとすると落ちることがある。→落ちないプログラムでキャプチャして解決。

疲れた。
結局、本当の原因が何かはよく分からないケースが多い。だが、真実だけを探し求めていたらいつまでたっても終わらない。どこかで結果を求めなければ。

Shade 9からWavefront OBJ形式でエクスポートしたデータを使っていたのだけれども、三角形が4頂点をもつ面として出力されていた。エクスポート時の「面の最大頂点数」設定を「4」にしていたのだけれども、「最大」っていうくらいだから三角形は当然3点で出力するものと思いこんでいた。しかもわざわざ同じ値の座標に別のIDをふる念の入れよう。おかしいおかしいと思ってプログラムを見直していたのだけれども、まさが、こんな変態データを出力していたとは…。やられた。

これがいちばん疲れた。

| | トラックバック (0)

DirectX SDK (June 2007)

6月5日付けでDirectX SDK (June 2007)がリリース。

私が興味がある範囲で新しいと言えるような機能はPIXの新機能と新サンプルくらいか。
あとは、Direct3D9専用DXUT廃止、Autodesk 3ds MaxとAlias Maya用DirectXエクステンション廃止。なんか空気みたいなリリースだなぁ。隔月で出しているから出しました、みたいな。無視しても何の問題もなさそうなのは助かるけど。

それにしても、いまさらDirectDrawに関する話が出てくるなんて思わなかった。驚いた。

| | トラックバック (0)

C++Builder2007

バージョンアップの案内が到着。出荷予定は6月下旬。

Vistaで動くC++Builderが欲しいので1も2もなく注文したのだけれども、よく考えると今の段階ではC++Builder2007の具体的な機能に関するボーランドからの解説がほとんどないのね。http://www.codegear.com/jp/article/36469くらい?

それに、BDS2006Proからのバージョンアップが31500円と言われてもピンとこない。バージョン番号は2006から2007に上がるけれども、機能は減るんじゃないの?何が新しいのかもよく分からないし、正直、高いと思う。もう少し詳しい説明があってもいいと思うのだが…。

待望の製品なのだけれども、ぜんぜんワクワクしないのはなぜだ。

| | トラックバック (0)

隠しコマンド

Direct3D 10のHLSLには、現在のピクセルを破棄する(と思われる)「discardコマンド」がある。きっとある。だって、SDKサンプルで使ってるんだもの。試しに自作コードで使ってみてもちゃんと想像通りの動作をするもの。でもなぜ、SDKのドキュメントを検索しても載ってないの?(キーワード一覧にはあるけれど、それだけじゃ…)正確(公式)な動作を知りたいのに。それとも、このコマンドは公式には未定義なの?

このレベルの問題が出始めると作業がさっぱり進まなくて困る困る。

| | トラックバック (0)

Direct3D 10でいろいろ困る

DirectX SDK (April 2007)に含まれるDirect3D 10のドキュメント不完全すぎ。情報古いし間違ってるし足りないし。同じ関数名で引数の定義を変更したりするなら、せめてリファレンスだけでも正しい&完全なものを入れて欲しい…。いちいちヘッダファイルと突き合わせて動作チェックしていたのではぜんぜん進まないよ。

にしても、Direct3D 10でとうとうXファイルのサポートがなくなってしまったらしいのはショック。全部調べたわけじゃなけれども、たぶんなくなっている。D3DXのサポートはもちろん、DXUTもXファイルに代わって「The DXUT Mesh format」(.sdkmesh)をサポートするようになっているし。ヘルプのチュートリアル9では「CDXUTMesh10」なるクラスでXファイルを扱っているけれども、現在のSDKには「CDXUTSDKMesh」しかなくて、これは.sdkmeshファイル用だ。

Xファイルは古いフォーマットで実用的じゃないと言われればその通りなのだけれども、サポートしているツールも多いし、最低限の基盤として重宝していたのに。これはちょっと困ったことになった。

その上、DXUT自体が微妙な存在になってしまった。Direct3D 9ではDXUTは便利だった。Direct3D 9の動作が複雑な上、DXUTがシンプルだったからね。でもDirect3D 10のDXUTはDirect3D 9と共用になって必要以上に複雑になってしまった。Direct3D 10自体が充分シンプルなので、DXUTを使わないほうが断然分かりやすい。でも、SDKサンプルを理解するにはDXUTの知識が必要なんだよなぁ。

| | トラックバック (0)

DXGIのガンマコントロール

ハマりました…。

DXGIのIDXGIOutputインターフェイスにあるガンマ補正機能を試していたのですが、当初、REFデバイスでテストしていて、どうやっても意図通りの動作を実現できなかったのです。

コード自体は次のようにごくシンプルなものです(エラー処理を省略)。

// スワップ・チェインのIDXGIOutputインターフェイスを取得
IDXGIOutput* pOutput;
g_pSwapChain->GetContainingOutput(&pOutput);

// トーンカーブの設定を取得
DXGI_GAMMA_CONTROL_CAPABILITIES gammacap;
pOutput->GetGammaControlCapabilities(&gammacap);

// トーンカーブを設定
float g = 1.0f / gamma;
DXGI_GAMMA_CONTROL gammacontrol;
gammacontrol.Scale.Red   = 1.0f;
gammacontrol.Scale.Green = 1.0f;
gammacontrol.Scale.Blue  = 1.0f;
gammacontrol.Offset.Red   = 0.0f;
gammacontrol.Offset.Green = 0.0f;
gammacontrol.Offset.Blue  = 0.0f;
for (UINT i = 0; i < gammacap.NumGammaControlPoints; ++i) {
    float L0 = gammacap.ControlPointPositions[i];
    float L1 = pow(L0, g); // ガンマカーブを計算
    gammacontrol.GammaCurve[i].Red   = L1;
    gammacontrol.GammaCurve[i].Green = L1;
    gammacontrol.GammaCurve[i].Blue  = L1;
}
pOutput->SetGammaControl(&gammacontrol);
pOutput->Release();

スケールやオフセットを変えたり、計算する値の範囲を変えたり、どーやってもうまくいきません。

DXGI_GAMMA_CONTROL_CAPABILITIES構造体のNumGammaControlPointsメンバが「17」、つまり制御点(精度)が17段階しかないのは、REFデバイスだから理解できるとしても、MaxConvertedValueメンバが「0.0」、MinConvertedValueメンバが「1.0」というのも意味不明です。

で、数日悩んだ後、あっさり解決しました。

・「GeForce 8800 GTX」なら上のコードで何の問題もなく動作する。Max(Min)ConvertedValueメンバの値も正常。

もう、REFデバイスのバグってことで納得することにしました。もしかすると違うかもしれないけれども…。
普段ノートPC(GeForce Go 7300)を使っているので、こういうの困るなぁ。

| | トラックバック (0)

DirectX SDK April 2007…登場? 登場!

さっきからMicrosoft Download Centerを見ていると、2007年4月6日付けで「DirectX Redist April 2007」と「DirectX SDK - Symbol Files」だけリンクが出たり消えたりで“?”なことに。リンク先もあったりなかったりで、何をやっているので御座いましょ?

どうもSDK本体も(4日に?)いったん出たあと消えたらしいし、MSのサーバがおかしいのか、不具合でも見つかっているのか、社内的な手続きが混乱しているのか…。

いずれにしても恒例の隔月アップデートがもうすぐあるのは確か。
今ちょうどFebruary 2007でDirect3D 10をいろいろやり始めた段階なので、このタイミングでApril 2007に変更すると混乱しそうで怖い。Fun with GPUとか見ると、D3D10周りが微妙に変更されているし。
最終的にはApril 2007に移らないという選択肢はないと思うけれども、それでもやっぱりFebruary 2007で一通り終えてからApril 2007に移った方が無難だよね。でも、借りてるD3D10マシンは今月末までなんだよな。

隔月アップデートは追いかけるのが大変すぎ。

(追記)
SDKがダウンロードできるようになっている。
ダウンロードページのAdditional Informationを斜め読みした限りでは、次の点が気になった。

  1. シェーダコンパイラが新しくなって、D3DX10CompileFromFile関数、D3DX10CompileFromResource関数、D3DX10CompileFromMemory関数が追加。
  2. Direct3D9専用のDXUTがJune 2007で取り除かれる。今後はD3D9サンプルもD3D9 & D3D10共用版のDXUTを使用。

(1.)は、関連していろいろな機能が追加になっているはずなので、けっこう大きな変更だなぁ。どうしよう…。

(2.)のDirect3D9専用のDXUTは、DirectX9実践プログラミング[Vista対応版]でも使ったのでちょっとショック。でも、どうしようか少し悩んだ点でもあった。仕方がないか。

あとは、そういう話もあります的な事項で、私にはあまり関係なさそうかな。とりあえず、SDKをダウンロードだけしておこう。

| | トラックバック (0)

『DirectX9実践プログラミング [Windows Vista対応版]』発売

[書籍版]DirectX9実践プログラミング」と「DirectX9 DirectX Graphics」の続編として、「DirectX9実践プログラミング [Windows Vista対応版]」が3月20日に発売されました。基本的なコンセプトはこれまでの本と同様で、「DirectX SDK (February 2007)」を使ったDirectXプログラミングの入門書となっています。1章を大川善邦さんが執筆されており、2章以降を私が担当しています。

DirectX SDKは隔月で更新されているわけで、2003年発行の別冊版を書籍化した「[書籍版]DirectX9実践プログラミング」だけでなく、2005年発行の「DirectX9 DirectX Graphics」も現行のDirectX SDKとかなりズレてしまっていますので、Vista登場という節目に合わせてリファンしたというところです。

ちょっとタイトルが紛らわしいかもしれないのですが、「[書籍版]DirectX9実践プログラミング」の原稿をVista対応に単純に修正したわけではありません。

タイトルの[Windows Vista対応]とは、Vistaでの実行を考慮しているという意味です。内容的には、「DirectX SDK (February2007)対応」の新しい「DirectX実践プログラミング」シリーズだと思っていただいたほうが実態に近いのではないでしょうか。もちろん、Vistaの話がゼロではありませんが、「Direct3D 9Ex」や「Direct3D 10」などのVista独特のプログラミング解説があるわけではありません。

本書で解説している機能は、「DirectX SDK (February 2007)」の「Direct3D 9」「DirectSound」「DirectInput」です。「DirectX SDK(February 2007)」の機能でも「Direct3D 10」「XACT」「XInput」については解説していません。
また、「[書籍版]DirectX9実践プログラミング」で解説していた「DirectMusic」「DirectPlay」「DirectShow」についても解説していません。これは、「DirectX SDK (February 2007)」で、これらの機能が古い機能として事実上廃止されたか、またはDirectXの範囲から外されていると判断したからです。「Win32API」の超基礎的解説も読者層的に不要と考え外されています。

構成的には、Direct3Dの章が「DirectX9 DirectX Graphics」の内容に多少加筆の上「DirectX SDK (February 2007)」対応に修正、DirectSoundとDirectInputの章が「[書籍版]DirectX9実践プログラミング」の内容を「DirectX SDK (February 2007)」対応に加筆修正、といった感じになっています。

そのため、Direct3Dの解説では、最初の基本的な解説を「Direct3D」+「D3DX」で行ない、それ以降の解説を「Direct3D」+「D3DX」+「DXUT」で行なっています。

また、DirectSoundの章でもWaveファイルの読み込みなどDXUTのDirectSoundサポート機能を使っています。これはSDKのサンプル構成が変更になっていることに関係します。ただし、内容的には「[書籍版]DirectX9実践プログラミング」と基本的に同じなので、DirectSoundの章を読むのにDirect3Dや3D向けDXUTの知識は必要ありません。

対象としている環境は「Windows Vista/XP/2000」(2000は実行のみ)+「Visual Studio 2005 Standard」+「DirectX SDK (February 2007)」です。

これからDirectXを使ってみようとお考えの方のお役に立てれば幸いです。

| | トラックバック (0)

Delphi 2007 for Win32

Delphi 2007 for Win32のダイレクトメールが届きました。BDS2006からのバージョンアップが31500円ですか…。Vista対応のVCL開発環境が欲しいのですが、本命はDelphiじゃなくてC++なのよね。つなぎの環境に31500円はちょっと出せないな…。
Vista&C++&VCL for Win32&Unicodeな環境はいつ出るんだろう。とりあえず新機能は要らないので、BDS2006をVistaで使えるようにしてくれるだけでもいいのだけれども。製品ロードマップを見ると、今後も.NET Frameworkを中心に進行するみたいだけれども、そうなると絶望的なのだろうか。正直、.NET Frameworkを使うならJavaを使いたいのよね。.NETFrameworkの上でVCLを使うのって屋上屋を架すようで興味が沸かない。

| | トラックバック (0)

Microsoft DirectX SDK - February 2007

日本のページではまだのようですが、2月2日付でMicrosoft DirectX SDK - February 2007がリリースされていました。December 2006で作ったサンプルや原稿はどうしよう…。時間的にはまだまにあうかな?
大した変更がなければDecember 2006でいいや…と思ったら、けっこう重要な変更が。

Vistaのスピーカコンフィグに合わせてDirectSoundのヘッダがアップデート。まさか、DirectSoundに変更があるとは予想外。

VistaのDirect3D 9Exのドキュメント(だけ?)がDirect SDKにも用意された。ヘッダやライブラリなんかは従来通りWindowsSDKということ?。

あと、
New features in this release include HLSL shader debugging within PIX,…
って書いてあるけれども、Release Notesには書いていない?PIXでのシェーダコードのデバッグはアセンブリ言語レベルだったはずで、これが事実だとうれしい。

いずれにしても、すぐインストールする訳にいかないのがもどかしい。

| | トラックバック (0)

Microsoft DirectX SDK (December 2006)

気が付いたら、22日にMicrosoft DirectX SDK (December 2006)がリリースされていた。

重要な点は、このバージョンからDirect3D 10の正式版がリリースされたことと、Windows 95/98/MEがサポート対象外になったこと、という理解でいいのかな。

どうも、Visual Studio 2005でのDirectX Extensions for Visual Studioのサポートは今後もなさそうだな。手軽で良かったのだけれども。

…ぐあ。d3d9types.hで、「warning C4819: ファイルは、現在のコード ページ (932) で表示できない文字を含んでいます。データの損失を防ぐために、ファイルをUnicode 形式で保存してください。」という警告が出るのは相変わらずだった。
とりあえず、1802行目、
DWORD Pattern; /* bit pattern, return value must be FOUR_CC(舛・ 羨・ 舛・ 践・*/
の最後にある文字化けしているUNICODE文字を削除して、
DWORD Pattern; /* bit pattern, return value must be FOUR_CC */
に変更して対処。しかしこれ、今後もこういう“仕様”になるのだろうか。

| | トラックバック (0)

Direct3D 10世代GPU登場

NVIDIAからDirect3D 10世代GPUのGeForce 8800が発表(PC Watch)が発表されたみたい。1.35GHzや1.2GHzで動く統合型シェーダユニットが96個とか128個とか、すごいですな。

即日出荷開始なので、日本でももう入手できるのだろうか。欲しい、っていうか必要なんだけれども、上位モデルのGeForce 8800 GTXが599ドル、下位モデルのGeForce8800 GTSが449ドルですか……。多和田新也のニューアイテム診断室(PC Watch)の記事によると、NVIDIAの推奨電源は最低でも750W以上の電源らしいので、ビデオカードだけ入れ替えってわけにはいかない。ビデオカードだけの値段でもきついけど、全費用を考えると自宅用にはとても買えません。Vistaも必要だし。

ATIのDirect3D 10世代GPUは、安くて低消費電力……だったりはしないんだろうな。やっぱり。

手頃な値段とスペックになるのはいつ頃だろう。スペックはそこそこでいいのだが。やはり1年くらいかかるのかな。

| | トラックバック (0)

Microsoft DirectX SDK (October 2006)

Microsoft DirectX SDK (October 2006) がリリースされていました(1週間前?)。

このバージョンでもVisual Studio 2005でのシェーダ デバッグ機能は動作しないのね……。これ、対応する予定はあるのかな?現在SDKは2ヶ月ごとのリリースだから、年末か来年の頭には次のSDKが出る計算ですな。今、2冊のDirectX9本を、WindowsVista & Visual Studio 2005 Standard & 現在のDirectX9 SDK対応に書き直しているのだけれども、使用SDKをOctober2006で固定すべきか悩むな……。

| | トラックバック (0)

RubyとRで競馬分析

私の趣味ページ「RubyとRで競馬分析(http://www31.ocn.ne.jp/~narita/)」を作りました。

Rubyを使って、JVLinkでJRA-VANのDataLab.からデータをダウンロードしたり、I-PADの自動投票をしたりしています。

JRA-VAN利用規約のおかげですっかりやる気が削がれた&書けることがガッツリ減ったけれど、書ける範囲で書いていこう…。(飽きなければ。)

それにしても、公開する文章に「使用できない」ってのは厳しいね。たとえば予想や計算結果なんかを●●とかの伏せ字にしたって書くことに「使用」していることに変わりはないわけだし、直接関係ない文章を書いてからDataLab.で検証して公開することもできない……。

| | トラックバック (0)

Eclipse 3.2

気が付いたらEclipse 3.2のLanguage Packが出ていたので、3.1から3.2に移行。Build Dateが12 Jul 2006だからもう2ヶ月近く前からあったのね…。Eclipse自体は3.1自体で特に不自由していなかったこともあってあまり変わった気がしないのだけれども、SWTは3.2になって、Javaアプリのjarファイルを普通に起動するだけでXPスタイルで起動するようになっていた。3.1のランタイムで起動すると相変わらずクラシックスタイルで起動するから、これは3.2の新機能なのだろう。SWT 3.1で作っていたJavaアプリのjarでもXPスタイルで普通に起動してくれるし、これでもう余計なexeを作る必要はない。めでたしめでたし。

| | トラックバック (0)

fillRectangleとdrawRectangleの引数

SWTのGC.fillRectangleとGC.drawRectangleでは、引数の解釈が異なる。

Rectangle r = new Rectangle(…);
gc.fillRectangle(r);
gc.drawRectangle(r);

では、fillRectangleで塗り潰される矩形の幅と高さがr.width、r.heightなのに対して、drawRectangleで描かれる矩形の幅と高さは、r.width+1、r.height+1だ。drawRectangleの方が右下に1ドットぶん大きな矩形が書かれる。
これは、APIドキュメントや解説にも書かれていることで、バグでもなんでもないが、上のようなコードを書いても見た目上問題になることがほとんどないので、ときどき忘れてしまう。
というか、最近忘れていて、fillRectangleだけだったコードにdrawRectangleを単純に追加した結果、場合によっては後から表示がおかしくなるバグが出て混乱してしまった。なんでこんな仕様になっているんだろう……。

| | トラックバック (0)

Javaの総称配列

Java 5.0になって導入された「総称」はとても便利で基本的に使うようにしているのだけれども、この「総称」は、配列と組み合わせるとえらく不便なことになるらしい。

たとえば、
Vector<Integer>[] v = new Vector<Integer>[16];
と、やりたいのだけれども、これはエラーになる。出てくるエラーは、「Vector<Integer> の総称配列を作成できません。」なのだけれども、最初は意味が分からず困ってしまった。

ちょっと調べてみたら、Java5.0の「総称」は、Javaの言語仕様にだけ導入されたシンタックス シュガーみたいなもので、コンパイルした後のバイト コードには総称に関する型情報はまったく残らない。(これはバイト コードの互換性を保つためらしい。つまり、実行時にはどのような総称が使われていたか知る方法はない)。そのため、「Vector<Integer>型」なんて型はないのだけれども、配列は実行時にも型情報を必要とするから「そんな型の配列は作れない」ということのようだった。(たぶん……。自信はない)。

では、どうするかと言うと、次のようにするらしい。
Vector<Integer>[] v1 = new Vector[16];

要するに、総称を使う新しい形式と古い形式(raw型)は互換性がある(バイト コードになってしまえば同じ)ということだと思うけれども、これだと次のような警告が出る。

「型の安全性: 型 Vector[] の式は、未検査の型変換を使用して Vector<Integer>[] に準拠するようにする必要があります。」

これまた意味不明、というか初めて見た警告だけれども、要するに、「@SuppressWarnings("unchecked")アノテーション」を使って無理矢理警告が出ないようにしろ、ということらしい。(たぶん……。これまた自信がない)。

結果として、コードは次のようになった。
@SuppressWarnings("unchecked")
void Hoge() {
    Vector<Integer>[] v1 = new Vector[16];
    ……
}

めでたし、めでたし……。でも、@SuppressWarnings("unchecked")で無理矢理警告を殺すのは気持ち悪い……。

ちなみに、
Vector[] v2 = { new Vector<Integer>(), new Vector<Integer>() };
とやると、ここではエラーも警告も出ないみたいだけれども、当然、
v2[0].add("String");
みたいなコードがエラーとして検出されないという致命的な欠点がある。(総称の意味なし)。

また、このaddは、@SuppressWarnings("unchecked")アノテーションを使わないと、次のような警告が出る。

「型の安全性: メソッド add(Object) は raw 型 Vector に属しています。 総称型 Vector<E> への参照はパラメーター化される必要があります。」

じゃあ、
Vector<Integer> v3 = (Vector<Integer>)v2[0];
などとキャストしてやればいいのかというと、これも警告が出た。

「型の安全性: Vector から Vector<Integer> へのキャストは、実際には消去された型 Vector に対してチェックを行います。」

ようするに、総称を配列として警告なしで使うには、@SuppressWarnings("unchecked")アノテーションが必須ってことらしい。なんか釈然としないのだけれども、本当かな……。

| | トラックバック (0)

自動解決機能付き15パズルゲーム「Puzzle 15」

4月5日に作ったPuzzle 15に手を加えて、普通の15パズルとして遊べるようにしました。
パズルが解けなくて困ったときには、自動的に15パズルを解いてくれます。

実行ファイル:「puzzle15_1.1(exe_update).zip」をダウンロード
ソースファイル:「puzzle15_1.1(source).zip」をダウンロード
※exeのランタイムをDLLなしでビルドしたものに差し替え(2006/4/11)

Puzzle15_03

Java 2 SE 5.0+SWTで作っているので、実行にはJRE 5.0とSWTの実行環境が必要です。

Windows環境で実行する場合は、SWTのswt.jarとネイティブ ライブラリ(swt-win32-3139.dllなど)、Puzzle15.jar、Puzzle15.exeをすべて同じフォルダに置いて、Puzzle15.exeを実行してください。Puzzle15.jarを直接起動することもできますが、Puzzle15.exeを使うとSWTコントロールをXPスタイルで表示できます。ちなみに、Windows XPでしかテストしていません。

シャッフル ボタンをクリックするとパネルがシャッフルされて、ゲームがはじまります。

パズルを自動的に解く にチェックを入れると、ユーザーに代わってPuzzle15が15パズルを解いてくれます。必ず解けますが、賢くはないので、最小手数で解くわけではありません。

画像読み込み ボタンをクリックすることで、絵柄を好きな画像に変えられます。ただし、透明色のある画像は正しく表示されません。

Puzzle15_04

| | トラックバック (0)

15パズルが解けていく過程を見守るアプリ

コツが分からないと永遠に解ける気がしないこともある15パズルですが、普通の15パズルとは逆に、15パズルが解けていく過程を見守るアプリを作ってみました。

実行ファイル:「puzzle15exe.zip」をダウンロード
ソースファイル:「puzzle15source.zip」をダウンロード

Puzzle15_01

Java 2 SE 5.0+SWTで作っているので、実行にはJRE 5.0とSWTの実行環境が必要です。

Windows環境で実行する場合は、SWTのswt.jarとネイティブ ライブラリ(swt-win32-3139.dllなど)、Puzzle15.jar、Puzzle15.exeをすべて同じフォルダに置いて、Puzzle15.exeを実行してください。Puzzle15.jarを直接起動することもできますが、Puzzle15.exeを使うとSWTコントロールをXPスタイルで表示できます(もっとも、このアプリではほとんど見た目が変わりませんが)。ちなみに、Windows XPでしかテストしていません。

シャッフル ボタンをクリックすると、パネルがシャッフルされて、自動的に15パズルが解けていきます。

画像読み込み ボタンをクリックすることで、絵柄を好きな画像に変えられます。ただし、透明色のある画像は正しく表示されません。

Puzzle15_02

アルゴリズム的には、すべてのパネルをぐるっと一巡する経路を考えて、空白パネルをこの経路上をぐるぐる巡回させながら、パネルを順番に並べていきます。より完成型に近づくタイミングでパネルを順列上で偶数個ジャンプさせるわけです。非常に単純なアルゴリズムで、もちろん最短手数でパズルが完成するわけではありません。実際、見ているとかなりアホですが、15パズルはこの程度のアルゴリズムでもそれほど手数をかけずに解けることが実感できました。

| | コメント (0) | トラックバック (0)

内部でJavaVMを立ち上げてjarファイルを実行するexeを作る

SWTはWindowsの標準コントロールの外見を持っていて大変よろしいのだけれども、標準ではWindows2000のようなクラシック スタイルの外見になってしまいます。そこで、自分で作ったJavaアプリだけをXPスタイルで表示するために、JNIを使って内部でJava VMを立ち上げてjarファイルを実行するexeを作ってみました。

続きを読む "内部でJavaVMを立ち上げてjarファイルを実行するexeを作る"

| | トラックバック (0)

Eclipse+Visual EditorにおけるSlider(SWT)のプロパティ操作

BorlandのIDEが先行き不安ということもあり、久々にJavaに取り組んでいます。Javaで遊ぶのは数年ぶりなので、忘れてること忘れてること。昔のSwingは檄重で、Windowsアプリ作るならやっぱりC++だね、といった感じだったのですが、改めて使ってみるとそれほど重いとは感じませんでした。Java自体の進歩とマシン性能の向上がダブルで効いているのだと思いますが、これなら特別に処理速度が問題になるようなケースを除いてJavaアプリケーションでも大丈夫そうです。

ただ、Swingは見た目が“Java”なのが気に入らないのよね。見た目が普通のWindowsアプリだったらいいのに、と思ったら、いつの間にやらSWTなどというものが主流(?)になっていたのね。ピュアJavaではないけれども、私的にはWindows、Linux、MacをサポートしていればピュアJavaと同じようなもの。

ということで、買ったばかりのC++Builderは一休みして、Eclipse+Visual Editor+SWTでカスタムウィジェットとか作りながら遊んでおります。ちなみに、SWTはSwingより速いことが最大の売りらしいのだけれども、そんなに違いを感じないのよね。使い方によるのだろうか。まあ、カスタムウィジェットにはSWTもSwingも大して関係ないし、私にとってSWTを使う最大の利点は“見た目”です。

そんなEclipse+Visual Editor+SWTという環境には、とりあえずかなり満足しているのだけれども、RADとしてはまだ発展途上でもあるようで、なにやら不可解な動作も経験しています。

たとえば、Eclipse+Visual EditorでSWTのSliderのプロパティを操作すると、不思議な動作をします。

まず、Sliderの主なプロパティとデフォルト値は、次のようになっているようです。
・minimum 最小値 0
・maximum 最大値 100
・thumb  抓みの幅 10
・selection 選択値 0~90(= maximum - thumb)

SliderProperty

ここで、最大値(maximum)が1000、抓みの幅(thumb)が300、のSliderを作るとします。
このとき、Eclipse(Visual Editor)のプロパティで、maximumとthumbのどちらを先に操作するかで、Visual Editor上の表示とプログラムの実行結果に違いが出てきました。

VisualEditor

上の図は、Visual Editorのデザイン画面です。
上側のSliderでは、maximum→thumbの順にプロパティを設定しました。
下側のSliderでは、逆のthumb→maximumの順に設定しています。
理想的には、上下のSliderはどちらも同じ結果になって欲しいところですが、正しい表示になっているのは、maximumを先に設定した上のSliderだけです。

ところが、これを実行すると次のようになります。

jikkou

Visual Editorのデザイン画面とは正反対の結果になっており、正しく動作しているのは、下のSliderだけです。
この原因は、Visual Editorが生成したコードにあります。

slider1 = new Slider(sShell, SWT.NONE);
slider1.setBounds(new org.eclipse.swt.graphics.Rectangle(27,39,238,17)); // Generated
slider1.setThumb(300); // Generated
slider1.setMaximum(1000); // Generated
slider2 = new Slider(sShell, SWT.NONE);
slider2.setBounds(new org.eclipse.swt.graphics.Rectangle(27,109,238,17)); // Generated
slider2.setMaximum(1000); // Generated
slider2.setThumb(300); // Generated

slider1が上側のSlider、slider2が下側のSliderなのですが、不思議なことに、maximum→thumbの順にプロパティを設定したslider1では、setThumb(300)→setMaximum(1000)の順にコードが挿入されています。slider2はその逆です。
setThumb(300)を先に実行してしまうと、maximun=100の状態で範囲から外れた値を設定することになってしまうので、この場合は、先にsetMaximum(1000)を実行しておかなければならないはずです。

Visual Editorがなぜこのようなコードを生成するのか分からないのですが、とりあえず、Visual Editorは各コントロール固有の事情まで考慮した動作はしないようです。おまけに、コードの挿入順もプロパティの操作順と同じではないわけです。生成されたコードを自分で編集して順序を変えてしまえば問題ないのですが、気が付くまではSliderのデタラメな動作にかなり混乱してしまいました。

| | トラックバック (0)

VAIO type Tのパフォーマンス

私が購入したVAIO type Tは、Pentium M 1.2GHz, RAM 1GBと最低より1ランク上の仕様なのですが、特にクロックの遅さは実際にどのくらい影響があるのか購入前から気になっていました。最近のデスクトップマシンでは、Celeronを積んだビジネス向けのマシンでも2GHz以下なんてありませんしね。Pentium MはPentium4系よりもクロック当たりの性能が高いといわれていますが、それでも倍も違う訳ではありません。

で、実際のところ使ってみた感想はというと、ネットを見たり原稿を書いたり図を書いたりプログラミングしたり、そんな人間の操作に反応する処理がメインのアプリを使っている分にはまったく遅さを感じないのですが、コンピュータらしく自動でガシガシ何かをやらせるととたんに遅いマシンであることを実感しました。

たとえば、私の趣味であるRとRubyを使った競馬分析で使っているRubyスクリプトのうち、比較的時間のかかるスクリプトの実行速度を比較したところ、次のようになりました。

・VAIO type T(Pentium M 1.2GHz, RAM 1GB, Intel 915)
 [1300.984, 200.594, 21.296]
・自作PC(AthlonXP2500+, 1GB, NVIDIA nForce2, Windows 2000 Pro)
 [863.454, 143.516, 10.75]

ちなみに、次のようなRubyスクリプトで処理時間を測っています。

t0 = Time.now
tms0 = Process.times
require 'Kyori_Time.rb'
t1 = Time.now
tms1 = Process.times
p [t1 - t0, tms1.utime - tms0.utime, tms1.stime - tms0.stime]

かなり差があります。このスクリプトは703MBのデータファイルを検索し、必要なデータを抜き出して、最終的に6MBのデータファイルを出力するものです。複雑な計算などはほとんどないので、これはHDD周りの遅さが主因なのかもしれません。

しかし、逆に言えば、時間がかかるといってもこの程度の話であり、持ち歩いていつでも作業できるメリットを考えると、VAIOをメインに使うのに問題はなさそうです。

| | トラックバック (0)

DirectX SDK February 2006

気が付いたら、DirectX SDK February 2006がリリースされていた。
Direct3D 9レベルではほとんど変更ない模様。

私はようやくWindows 2000からWindows XP(それもHome)へ移行するところなのだけれども、DirectX SDKはもう完全にDirect3D 10つまり、Windows Vistaへの移行モードになっているね。開発環境だから当たり前といえば当たり前なのだけれども、もういいかげんついていけないし、ついて行きたい気もしないのよね。

Direct3D 10自体は、非常にシンプルで好感が持てるのだけれども、Windows Vistaに移行するメリットがまったく見当たらないからなぁ。

| | トラックバック (0)

BorlandがIDE事業を売却する方針

Borlandは、「アプリケーションライフサイクル管理(ALM)推進の一環として、統合開発環境(IDE)に関連した事業の一部を売却する計画」だそうな……。

(ITmedia)Borlandが開発ツールを売却、Segue Software買収
http://www.itmedia.co.jp/news/articles/0602/09/news010.html

(Enterprise Watch)米BorlandがDelphiなどIDE事業を売却、アプリライフサイクル管理分野に注力
http://enterprise.watch.impress.co.jp/cda/foreign/2006/02/09/7187.html

(BDN News)Borland to Acquire Software Quality Company, Segue Software; Announces Plan to Divest IDE Product Lines
http://www.borland.com/us/company/news/press_releases/2006/02_08_06_borland_acquires_segue_software.html

とりあえず、BDSというかC++Builderの行く末が心配になってしまいますが、前向きに考えると、IDE事業に関心のあるところに買われることによって今よりも良くなる可能性も無きにしも非ず、かな。C++BuilderはDelphiより冷遇されているし。もっとも、Eclipseの存在とかを考えると、Delphi以外は消滅したりする可能性もあるのかな。その場合もDelphiは、言語の特徴からまともにぶつかる相手がいないので、細々と続くような気がするけれども。
そう考えると、昨年末というギリギリのタイミングでバージョンアップされたのは、不幸中の幸いだったかな。

日本では3月3日に「Borland Developer Conference Tokyo 2006」が開催される予定なのだけれども、予定通り開催できるのかな?午後のテクニカルセッションなんて、ほとんど意味ないんじゃ……。売ってしまう事業なのに「今あるDelphi資産を未来につなぐ」とか「C++開発者必見!」とか言われてもね。まあ、予定通り開催されるなら、逆の意味で必見ではあるかも。メディアスポンサーに3月18日発売の4月号で休刊する「C MAGAZINE」が入っているのも何か暗示的ですな。ていうか、「C MAGAZINE」休刊なんだよね……。これも時代の流れか。

(Borland)ボーランド、開発者のための「Borland Developer Conference Tokyo 2006」開催
http://www.borland.co.jp/news/20060206_devcon_mediaalert.html

| | トラックバック (0)

Borland Developer Studio 2006 Update1

去年のうちに英語版が公開されていた「Borland Developer Studio 2006 Update1」の日本語版が公開されていました。思ったほど遅れずにすんで、めでたい。

(Borland) Borland Developer Studio 2006 アップデート1のご案内
http://www.borland.co.jp/bds/devsupport/bds2006update1.html

英独仏の各版のサイズが18~19MBなのに、日本語版は148MBもある。最初見たときは誤植かと思いましたが、本当にこのサイズあった。去年、英語版のパッチを無理やり当ててえらい事になったりしたのですが(表示が英語になるくらいの副作用ですむかなーという期待がちょっとあった)、パッチのサイズだけ見ても日本語版だけは他とまったく違っていたのですな。

とりあえず、C++Builderのデフォルト プロジェクトの設定を変えるとIDEが起動しなくなるという致命的な問題は発生しないことを確認して、一安心。でも、Update1のドキュメントを見ると、C++Builder周りは制限がいっぱいの模様。事前にある程度分かっていたとはいえ、C++Builderしか使わない身としては、やはり悲しい。

ところで、継承プロパティの公開って、「__published」にプロパティを再宣言するだけでいいんじゃないのかな?ヘルプにはそう書いてあるのだけれども…。よく考えたら、昔作ったコンポーネントで継承プロパティの公開をしたことが無かった気がするのだけれども、今回BDS2006の学習をかねて作っているコンポーネントでは、「__published」に再宣言してもオブジェクト インスペクタに出てこないのよね。まあ、それ以外の不具合は今のところまったくないので、困っているわけじゃないけれども、気持ち悪いなぁ。

| | トラックバック (0)

Borland Developer Studio 2006 Update 1の日本語版は来年…

がっくし。C++Builderが目的で使っているので、ちょっとショックかも。

[Borland] Borland Developer Studioのアップデートに関するお知らせ
http://www.borland.co.jp/whatsnew/notice20051227.html

もっとも、プロジェクトのデフォルト オプションを変更できなくて、エディタの支援機能がなんかおかしくて(改行したとき、無効な「}」が追加されることがある)、相変わらずヘルプの内容に不満がある(むしろ水準は下がった気が…)以外はおおむね平和に使っているので、実質的には大きな影響はないのかな。

ただし、ヘルプはUpdate1で内容が更新されるらしいので、多少は改善されるのかな。

[Borland] Borland Developer Studio 2006 Update 1のご案内
http://www.borland.co.jp/bds/devsupport/bds2006update1.html

どうやらイメージ エディタは本当になくなったみたいだね。ただ、そうなるとBorlandはBorland独自形式(と思われる)DCR形式ファイルのサポートはどう考えているのだろう。すでに自作コンポーネント用に作ったのがたくさんあるのだけれども…。サードパーティのツールを勝手に探せってこと? ヘルプでも相変わらずDCRファイルを使う方法しか解説していないのに、それを扱う方法がない(?)ってのは問題じゃないのかな。

そういえば、無料のVisual C++ 2005 Express Editionでは、リソース エディタがサポートされていないのね。Win32のプログラムを作るなら、リソース エディタの類は必須だと思うのだけれども、MicrosoftもBorlandも完全に.NET Frameworkシフトなんだろうね。でも私がちょっと調べた限りでは、マルチメディア系機能の標準サポートが.NET FrameworkはWin32より弱いのよね。MIDI系とか、動画系とか。.NET FrameworkがWin32のマルチメディア系機能を完全に取り込んでくれないと移行は難しいんだけれどもなぁ。

| | トラックバック (0)

イメージ エディタはいずこ…

ようやくC++Builderも動くようになったし、簡単なグラフィック コンポーネントから作っていこうかと思っていたのですが、疑問が1つ。BDS 2006のC++Builderでは、IDEに表示する自作コンポーネントのビットマップはどうやって作るんだろ?

C++Builder6では(たしか)付属のイメージ エディタで「DCRファイル」を作っていました。
BDS 2006では、必ずパッケージが必要らしいので、とりあえず新しくパッケージを作ってコンポーネントを追加しコードを記述…するまではよかったのですが、最後にDCRファイルを作るツールが見当たりません(Delphi側でも見付けられなかった)。ヘルプの「新しいコンポーネントの作成」にはDCRファイルを使うようなことが書いてあるのに。

それじゃあ、パッケージに登録済みのRESファイルに追加するのかと思うと、今度はRESファイルを編集できるIDEの機能やリソース エディタの類も見当たらない。

もしかして、RCファイルを使うのかな?と思っても、IDEにはRCファイルを新規作成する機能はないのよね。
とりあえず、テキスト エディタで作ったファイルをRCファイルとして保存してプロジェクトに追加することはできるし、コンパイルもできた。IDEにも登録したコンポーネントのアイコンが表示される。結果的に問題はなかった。
しかし、これは統合環境の操作として何かおかしい気がする。

おまけの「Partner DVD」にはフリーソフトウェアとシェアウェアのリソース エディタが収録されているみたいだけれども釈然としない。これは標準で提供されていなければおかしい機能じゃないのかな。そもそも、コンポーネント用ビットマップ画像の用意の仕方がどこにも解説されていない気がする。

この機能もUpdate1で追加されるのか、それとも私が見付けられていないだけなのか。
この分だとツールを理解するまでかなり苦戦しそうな予感がするよ…。

| | トラックバック (0)

C++Builder再起動。プロジェクトのデフォルト オプションは変更不可?

最初から動かないならともかく、最初は動いていたのに終了して再起動したら動かないって言うのは、システムの問題というより設定で回避できる問題じゃないかと思って、設定ファイルらしきものを消してみたら、ビンゴでした。

C:\Documents and Settings\<ユーザー名>\Local Settings\Application Data\Borland\BDS\4.0\DefProject.bdsproj

こんなファイルいつのまに出来たんだろう。と思って調べたら、これはどうやらプロジェクトのデフォルト オプションを変更すると作られるファイルみたい。
基本的に、
[リンカ]→[リンク] 「動的RTLを使う」→OFF
[パッケージ]→[パッケージ再構築] 「実行時パッケージを使って構築」→OFF
しか変更していなかったのだけれども、他のオプションでも変更するとやっぱりC++Builderが起動しなくなるので、ようするに、少なくともテクノロジー プレビュー版のC++ Builderではプロジェクトのデフォルト オプションを変更することは事実上不可能ということのよう。
不便この上ないけれども、とりあえずめでたしめでたし。
しかし疲れた…。

| | トラックバック (0)

C++Builder起動せず……

……ショック……。いったんDeveloper StudioのIDEを終了して、しばらくしてから起動し直したら、C++Builderの環境が起動しなくなっていた(Delphiとかでは起動する)。
起動時に、何とかとかいうIDEパッケージを読み込み中に「coreide.bpl」(たしかこんな名前)で例外が出た、とかいうエラーが出て、そのまま起動してもC++Builderの環境がまったく使えない状態に…。
何回起動しても、マシンを再起動しても同じなので、エラーが出たIDEパッケージを読み込まないように指示すると、こんどはツールバーとかも消えてしまって、本格的にC++ Builderの環境が消えてしまった…。しょうがないのでいったんアンインストールして再インストール開始…。

たしかに、現状のC++Builderはテクノロジ プレビューでサポートもないとはいえ、これでは「プレビュー」もできないよ。12月末って、もうすぐだけれども、これまでのBorlandのC++Builderの扱いを考えると、まともなパッチが間に合うのか非常に心配です。ていうか、今ダウンロード ページを見たら英語版のUpdate1はすでに完成しているのね。

再インストール完了…。ダメ。やっぱりエラーが出る。ちなみに、こんな↓エラー。

続きを読む "C++Builder起動せず……"

| | トラックバック (0)

「Borland Developer Studio 2006 Professional」到着

「C++ Builder 6」からのアップデートとして申し込んでいた「Borland Developer Studio 2006 Professional」が届きました。届いたパッケージは、今までの私のボーランドのイメージとはかなり違う、洒落た感じのする物で、第一印象はかなり良いです。分厚いマニュアルがないのも、マル。本体CD4枚+PARTNER DVD1枚というのはちょっと驚きました。この枚数なら本体のDVDも用意して欲しかったですね(というか、1枚にまとめて欲しい)。
3言語製品の統合という今までとは違う節目のリリースだからなのかもしれませんが、ダンボールの箱に1度も使うことのない分厚い紙の束とCDが入っているだけだった前回のアップデートとはかなり違う感じです。

もっとも、インストールにはかなり時間が掛かる上、推定残り時間が0秒になってから、本体以外のツールを延々とインストールするのはどうかと思います。

まだほとんど使っていませんが、第一印象は「Visual Studio 2005風C++ Builder(Delphi)」でした。IDEの見た目や機能もそうですし、私の環境では動作が普段から少し重くて、ときどきすごく重くなるのも同じです。それを除けは、私はVisual StudioのIDEが好きなので、悪い気はしません。コンパイルが遅い気はしますが…。

ただし、「cpp」「h」ファイルのアイコンが「DLL」?とかになるんだけれども、これはどういうこと?
とりあえず、アイコンの関連付けを手動で変更したけれども、12月末に予定されている正式版へのアップデートで直るのかしら。

| | トラックバック (0)

「Visual C++ 2005 Express Edition日本語版」で「DirectX9」本のサンプルをビルド

12月16日に、「Visual C++ 2005 Express Edition 日本語版」の正式版が一般公開されました。
とりあえず、今後1年は無償でダウンロードできるらしいです。
DELLの「CPU:Celeron 2.6GHz」「RAM:512MB」のマシンでさらっと使った感想では、普段は少し処理が重くて、ときどきメチャクチャ重いことがある感じ。使い勝手自体は悪くなさそう…。

とりあえず、今年の3月に出版された「DirectX9 DirectX Graphics」(工学社)の添付サンプル「DXGSample28」をコンパイルできるかどうか試してみました。

続きを読む "「Visual C++ 2005 Express Edition日本語版」で「DirectX9」本のサンプルをビルド"

| | トラックバック (0)

DirectX SDK - December 2005

12日付けで「DirectX SDK - December 2005」がリリースされていました。
「Features Added in the December 2005 DirectX SDK」を見ると、最近のDirectX SDKとしては大きなアップデートみたいですね。特に「Direct3D 10 Technology Preview」には非常に興味があります。しかし、「Windows Vista December 2005 CTP」が必要らしいのだけれども、MSDNにはもう入っていないんだよなぁ…。

それにしても、そろそろWindows 2000からXPにアップデートしようか、とか考えていたら、もうVistaが必要とは…。

| | トラックバック (0)

Borland Developer Studio 2006

ようやくC++ Builderからのバージョンアップ案内がきた。Delphiと差をつけられないかと心配していた料金も、C++ Builder 6 Proからのバージョンアップが29400円と、Delphi 2005 Proからのバージョンアップと同額で一安心。

バージョンアップといえば、「Reason Drum Kits 2.0」へのアップグレードはまだかな…。

| | トラックバック (0)

Borland Developer Studio 2006

ボーランドから届いたダイレクトメールによるバージョンアップ案内によると、「Delphi」「C++ Builder」「C# Builder」を統合した「Borland Developer Studio 2006」が12月末に出荷されるらしい。

とりあえず、DirectX関連以外のプログラム作成では「C++ Builder」をメインに使っているので、待望のバージョンアップだ。Visual Studioくらい使いやすいIDEになってくれればいいのだけれども…。

Professional版へのバージョンアップ価格は、「Delphi 2005」からは29400円だけれども、私は「Delphi」からだから37800円か。ちょっと高いな。
…っていうか、なんでDelphiからのバージョンアップ案内しかきていないのだろう?12月末出荷予定のバージョンに含まれる「C++ Builder」は「テクノロジー・プレビュー版」とかで、年末提供予定のアップデートを適用するまでサポートの対象外らしいけれども、それまで「C++ Builder 6」からのバージョンアップはできないとか?価格表にもDelphi系からのバージョンアップ価格しか書いてないけれども、まさか、「C++ Builder」系ユーザーは切り捨て?それはちょっと勘弁して欲しい。

カタログ(というかチラシ)をパラパラと読んでみた限りでは、「Borland Developer Studio 2006」も「Microsoft Visual Studio 2005」と同様に、「.NETプラットフォーム」を中心に考えられているみたいね。今みたいに個人的なツールをシコシコ作ってる範囲では、Win32から.NETに移行する理由がないのだけれども、これからは.NETのほうが何かと幸せだったりするのかな。でもそう考えると、「Developer Studio 2006」に統合された「C++ Builder」が.NETアプリケーションの開発に対応していないらしいってのはちょっとショックかも。

| | トラックバック (0)

Visual Studio 2005の価格

Visual Studio 2005の価格が発表されたみたいですね。
Visual Studio 2005の製品ラインナップは結構複雑ですが、私が興味がある製品を新規購入した場合の推定小売価格は次のようになるようです。

●Visual Studio 2005 Professional Edition
  パッケージ: 128,000円
●Visual Studio 2005 Standard Edition
  パッケージ: 29,800円
●Visual Studio 2005 Express Edition
  パッケージ: 4,800円

今までVSはずっとProfessional版を使ってきたので、今回もProfessional版を中心にアップデートを考えていたのですが、Express版の4800円という安さにはちょっと驚きました。
これまでのVS2002/2003では、Professional版の下には各言語単体のStandard版だけがあったわけですが、これらのStandard版は(標準では)最適化もない、本当に学習向けでちょっと考慮の対象外でした。しかし、VS2005ではExpress版でもコンパイラの最適化機能が(新しい最適化機能の一部を除いて)他のEditionと同じように提供されています。.NET Frameworkだけじゃなくてネイティブ・アプリの開発も可能だし、正直言ってExpress版でもいいかなぁという気がしています。4800円なら後からStandard版やProfessional版を買い直しても惜しくないしね。Standard版はアップデート版の価格次第かな。Webアプリとか関係ないからちょっとオーバースペックなのだよなぁ。今回のProfessional版は他の人とのデータのやり取りで問題でもない限り買わないな、たぶん。
いずれにしても予想していたよりも予算を節約できそうで大変うれしい。

| | トラックバック (0)

CEDEC2005 XNAの変身にびっくり

CEDEC2005は私の聞いたセッションに限っていえば、抽象的な話や前から知られている話が多く、あまり新鮮味のない内容だった。ただし、今日行なわれたマイクロソフトのXNAのセッションには驚いた。どうやら、いつの間にやらXNAは昔聞いたものとはまるで違うものになっていたようだ。

昔、XNAの名前が出てきたころは、私の記憶ではたしか、これからのゲームに必要となる物理エンジンの共通APIとかを整備してゲームを開発しやすくするような、一種のライブラリやフレームワークの規格といった内容だったと思う。しかし、これから実際に出てくる「XNA」の最初のもの(XNA Studio)は、Visual Studio 2005 Team Systemを拡張(?)して、従来のプログラマだけでなく、コンテンツ・クリエイタ(アーティスト)やプロデューサまで対象とするゲーム・スタジオ向けの管理ツールのようなもののようだ。「物理エンジンの共通API」みたいな話が完全にチャラになったわけではないようだったが、あまりの違いに驚いた。たしかに、そういう需要はVS Team Systemを買うようなところにはあるのかもしれないが、もともと具体的な話のなかったXNAは、もう完全に私の興味の範囲外に去っていってしまったようだ。

| | トラックバック (0)

CEDEC2005

CEDEC2005」が8月29~31日に開催されるようです(http://cedec.cesa.or.jp/headline/press_release.html)。
今年も協賛セッションとして、「Microsoft Game Developers Day」とNVIDIAの「開発の鉄人」が予定されています。アメリカのカンファレンスでは、すでにWGF関連の情報がかなり公開されていますが(「WGF 1.0」が「DirectX 9+α」ってことでいいのかな?)、「CEDEC2005」(Microsoft Game Developers Day)でどのくらい新しい話があるのか楽しみ。
過去最大の規模らしいですけれでも、同時に7セッションくらい行なわれるので、受講したいセッションが被るケースも多そう。資料はもらえますが(CD-ROM。一般へは有料)、セッションのビデオとかも販売して欲しい。

| | トラックバック (0)

DirectX SDK Update (June 2005)公開

DirectX Developer Center」に「DirectX SDK Update (June 2005)」が載りましたね。「June 2005 Update の新機能」を見た限り、基本的にはツールやD3DXの改良がメインで大きな変更はなさそう。

続きを読む "DirectX SDK Update (June 2005)公開"

| | トラックバック (0)

DirectX 9.0 SDK Update - (June 2005)

が6月6日に出ていたらしいです。
http://www.microsoft.com/downloads/details.aspx?FamilyID=69bf704d-cd35-40c4-91a5-aa0e27c8f410&DisplayLang=en
Search for a download」に「DirectX SDK」って入れて「Date」でソートするとトップに出てきますが、今のところ「Microsoft DirectX Developer Center」からのリンクや発表はまだのようです。そんなわけで何が変わったのか分かりませんが、例によって「Supported Operating Systems: Windows Server 2003, Windows XP, Windows XP 64-bit」なので、当分「パス」ですな…。

| | トラックバック (0)

RubyでJVLinkを使う

「Ruby」と「R」を使ってJRAの競馬データを分析するのが趣味なのですが、これまでは「JRA-VAN Data Lab.」からデータをダウンロードするのにだけは、専用ツールをC++で作って使っていました。
しかし、これだけC++で作ったexeを使うというのも美しくないなぁーということで、Rubyでダウンロードツールを作り直したのですが、当初、パッパと終わるかと思っていたら、これが一筋縄では行かず、1日潰してしまいました。
問題は、RubyのWIN32OLE経由で「JVLink」を使ったとき、JVOpenメソッドの引数に返される値をARGVで受け取ることができないというものでした。

続きを読む "RubyでJVLinkを使う"

| | トラックバック (0)

DirectX9 SDK April 2005 Update登場

恒例ですが、DirectX9 SDKが「DirectX9 SDK April 2005 Update」にアップデートされていました。

Microsoft DirectX 9.0 ダウンロード
http://www.asia.microsoft.com/japan/msdn/directx/downloads.asp

ざっと見るとDXUTの更新が気になるなぁ。コールバック関数にアプリ側からコンテキストを渡せるようになったことと、 GUIがコア・フレームワークから分割されてオプションになったあたりが大きいのかな?PRT周りはSDKごとの更新状況を見ると、使うのは少し躊躇われる気がするけれども、意外とそうでもないのかな?よく分からん。あと、DirectShowコンポーネントが削除されたようですね。
とりあえず、Windows XPの購入計画を考えなければ…。

| | トラックバック (0)

「DirectX9 DirectX Graphics」発売

Visual Studio .NET(C++言語)とWin32 APIを使ったDirectX Graphicsプログラミングの解説書「DirectX9 DirectX Graphics」(工学社)がもうすぐ発売されます。店頭には19日ごろ並ぶみたいです。ちなみに、私が執筆しています(^^)。

目次などの詳しい内容は、工学社の紹介ページを見てください。
書籍情報―DirectX9 DirectX Graphics(工学社)

続きを読む "「DirectX9 DirectX Graphics」発売"

| | トラックバック (0)