Codelogy

2008年07月03日

VertexDeclarationとFVF

私がよく見ている掲示板で気になる書き込みがありました。 プログラマ独自のシェーダを使うときFVFは使えないので VertexDeclaration で頂点宣言を行わないといけない、といったものです。 さすがにそれはないだろう・・・といった声もあるかと思われますが、シェーダプログラムがスキップされる等といった反論がありましたので実証してみました。

ここ数週間プログラマブルシェーダばかり扱っていたため、ほとんど VertexDeclaration を使用していたのでFVFの宣言方法を確認しておきます。 MSDNにある情報を元に定義しました。

>> 続きを読む...

2008年06月16日

Ruby でも型チェック

動的型付け (スクリプト) 言語では、データ型のチェックが実行時にしか行われないため、プログラムの妥当性検証・デバッグといった作業が困難になります。
例えば、Ruby でプログラムを書いていて、次のようなバグに悩まされたことのある人は多いのではないでしょうか。

  • Integer オブジェクトを参照しているべき変数が、他の型のオブジェクトを参照している。
  • そのオブジェクトが「いつ」「どこで」代入されたものなのか分からない。

この手のバグは、問題の発生 (不正な型の代入) と発覚 (エラーの発生) の位置が離れてしまうので、非常に厄介。 発生箇所を絞り込むのが難しいため、プログラムを広範囲に渡って見直すハメになります。

>> 続きを読む...

2008年06月05日

Medical show and Business expo 2008 レポート

5月28日から31日にかけまして、東京国際フォーラムにてMedical show and Business Expo 2008に参加してきました。今回はそのレポートと学んだことについてご報告します。

参加しました医療系展示会では主にハードウェアの展示が多く、ソフトウェアを公開されていブースは私たちを除いては一社しかありませんでした。
ですので、今回のコラムは技術的な内容ではなく、展示会におけるプレゼンテーションでの成功点と失敗点を私なりにまとめてみました。

これらの点を次回以降の改善点、また対策としてみていただければ幸いです。

>> 続きを読む...

2008年05月08日

Office OpenXMLの解説

GPUで並列処理の続きの記事がまだできていませんので、今回は別の記事を用意しました。

OpenXMLはMicrosoft Office2007で新たに採用された文章フォーマットです。
Microsoft独自のバイナリデータではなく、新たにXMLで記述された規格を採用したことで、外部アプリケーションから
データ内容を操作しやすくなりました。
しかしながら、データ操作の際ECMAのOpenXML仕様書(Part 4: Markup Language Reference)を参照するわけですが、5千ページを超えているpdfですので ファイルを開くだけでマシンがカクカクする私にとっては大問題です。

よって今回Microsoft Excelのセル内容、レイアウトを変更するにあたって特に必要な部分についてまとめました。

>> 続きを読む...

2008年05月06日

GPUでレイトレーシング (補足)

前回のGPUレイトレーシングについてもう少し補足したほうがよさそうでしたので、補足します。
今回はGPUのジョブの単位、メモリの扱い、画面分割の割り当てを図を用いて説明します。

>> 続きを読む...

2008年05月02日

GPUでレイトレーシングを並列処理

以前やったGPUで並列処理の続きとして今回はGPUでレイトレーシングを行いたいと思います。
レイトレーシングはリアルな画像を作り出す反面、計算に大変時間がかかることはよく知られています。
その処理をいかに高速化できるか?というのが今回のコラムの目的です。

>> 続きを読む...

2008年05月01日

XMLライブラリの紹介 (2)

前のエントリからかなり間が空いてしまいましたが、XML ライブラリの紹介の続きです。

読み込んだXML文書のツリー構造をたどって各要素に対する処理を行うのは、手間がかかります。
今回は、フレームワークを利用して XML 文書を解釈 (interpret) する方法について説明します。

>> 続きを読む...

2008年04月06日

Haskell でバグの出にくいプログラミング (4) ローカルスコープによる変数代入の模倣

前回は、副作用である変数代入という概念が純粋関数型言語である Haskell には存在しないということを書きました。 今回と次回は、そのような変数という概念を純粋関数的に模倣した Haskell の State モナドについて書こうと思います。

今回は、State モナドの説明の前段階として、ローカルスコープを用いた変数代入の模倣についてです。

>> 続きを読む...

2008年04月05日

宣言の位置

C言語では、ローカル変数の宣言を関数の始めに宣言する必要がありました。
これを習慣としているのか、C++ でもローカル変数・オブジェクトの宣言を関数の開始位置で行う人がいます。

//分散を求める関数 (C++スタイル宣言)
int variance(const Array<double>& ad){
    assert(ad);

    double dSum =0;

    int i;
    for (i=0; i<ad.size; ++i) dSum +=ad[i];

    double dAvr   =dSum/ad.size;
    double dSumSq =0;

    for (i=0; i<ad.size; ++i){

        double dTmp =ad[i] - dAvr;

        dSumSq +=dTmp*dTmp;
    }

    return dSumSq/ad.size;
}
//分散を求める関数 (Cスタイル宣言)
int variance(const Array<double>& ad){
    assert(ad);

    double dSum   =0;
    double dSumSq =0;
    double dAvr;
    double dTmp;
    int i;

    for (i=0; i<ad.size; ++i) dSum +=ad[i];

    dAvr =dSum/ad.size;

    for (i=0; i<ad.size; ++i){

        dTmp =ad[i] - dAvr;

        dSumSq +=dTmp*dTmp;
    }

    return dSumSq/ad.size;
}

それでも動作には何の支障もありませんが、変数の「宣言」と「実際に使われ始める位置」が離れてしまうため、プログラムがやや読みづらくなります。 また、上例のCスタイルの方では、2番目のループ内でのみ使われる変数 dTmp のスコープが関数全体に及んでしまうのも、あまり良い状況ではないでしょう。
しかし、C++ が変数・オブジェクトの宣言を関数の任意の位置で行えるようになっているのは、このような可読性に関する (些末な) 問題のためだけではありません。 これには、C にはなかった「クラス」「オブジェクト」が大きく関係しています。

>> 続きを読む...

2008年03月08日

0からはじめる計算幾何学 第04回 過去のプログラムの有効活用

昔書いたプログラムをもう一度使えないかと考えることは、多くのプログラマにとって(そしてエントリのネタを探す私にとっても)重要なことです。 今日は、過去の遺産を有効活用して楽に問題を解いた事例を紹介しましょう。UVa Online Judge の 10012番、How Big Is It? です。

>> 続きを読む...