おいふぉりーのぶろぐ

きっと趣味のブログに違いないです!!

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。
  1. --/--/--(--) --:--:--|
  2. スポンサー広告

TortoiseSVNのCOMインターフェースを使ってみる

TortoiseSVN というバージョン管理ソフトには SubWCRev というプログラムが付属していて, バージョン管理下のファイルのリビジョンや更新日時を取得することができます.今回は SubWCRev の COM インターフェースを使って,自作プログラムから SubWCRev を介してバージョン管理下のファイルの情報を取得してみたというお話.

ここでは,COM インターフェースを使って SubWCRev の機能を呼び出すために,IDL ファイルからインターフェースを定義するヘッダー ファイルを作成してみます.次のように MIDL コンパイラを呼び出します.

midl SubWCRevCOM.idl /notlb /h SubWCRevCOM_h.h

上記のコマンドを実行すると,SubWCRevCOM_h.h と SubWCRevCOM_i.c が作成されます.SubWCRevCOM_h.h にはインターフェースの定義が,SubWCRevCOM_i.c にはクラス ID やインターフェース ID が含まれています.

で,後はプログラムを書くだけ.詳細は続きに載せておきます. 書いたプログラム tsvn_com.cpp と SubWCRevCOM_i.c を Visual C++ でビルドすれば完成です. このプログラムでは,コンパイラ COM サポートを利用してます. _COM_SMARTPTR_TYPEDEF マクロを使って ISubWCRevPtr というスマート ポインタ(侵入型参照カウント方式)を定義してます.スマート ポインタなので,参照カウントの増減を自動でやってくれてとても便利です.

プログラムの動作ですが,第一引数にバージョン管理下のファイル名を渡すと, リビジョンと更新日時が標準出力に表示されます.

[TortoiseSVNのCOMインターフェースを使ってみる]の続きを読む
スポンサーサイト
  1. 2011/05/11(水) 19:02:39|
  2. ソフトウェア開発
  3. | トラックバック:0
  4. | コメント:0

Hotfix の確認をしませう

とある C++ のプログラムを組んでいて,STL の TR1 を使って正規分布の乱数を発生させているコードに問題が・・・.どんな問題かというと,あるマシンではコンパイルすると正常に動作するが,別のマシンでコンパイルし直すと,無限ループに陥ると言う問題.

2, 3 時間試行錯誤し,さらにふて寝した結果,最終的にそれぞれのマシンのヘッダーファイル "random" を diff したら,1 行違っていることを発見.

違っている部分をキーワードに検索かけてみたら,こんなのが出てきた↓

VC9 SP1 Hotfix For The vector> Crash

自分がはまった問題は 5 番目のこれ↓

5. Random distributions were broken, triggering infinite loops and emitting bogus results.

この Hotfix を適応してるマシンと,適応してないマシンで動いたり,動かなかったりというわけでした.

あ゛ー,俺の 2, 3 時間+ふて寝に費やした時間を返せー.と思いつつ,どのマシンにもちゃんと Hotfix 入れないと駄目だなとちょっと痛感.


しばらくして・・・

ん Hotfix KB962219 のインストールがうまくいかない.どーなってるの?特にエラーは出ないけど,random ヘッダの内容が変わってない.仕方なく,正しい random ヘッダをうまく動作してるマシンからコピー.なんか,しっくりしないけど.

  1. 2010/12/12(日) 14:59:41|
  2. ソフトウェア開発
  3. | トラックバック:0
  4. | コメント:0

ロジテックのUVCカメラドライバのプロパティに直接アクセスするには?

ロジテックの UVC (USB Video Class) カメラをより詳細に制御する方法を見つけたので,メモメモ.ちなみに,まだ試してないです.

DirectShow を使って UVC カメラからの取り込みをするとき,露出の設定とかをするとき,通常は DirectShow で用意されている IAMCameraControl インターフェイスIAMVideoProcAmp インターフェイスを使います.ただし,あらかじめ定義されている項目に long 型(整数型)で値を取得・設定できるだけです.(あと,経験上,カメラによっては思い通りに動作しなかったり…)

そこで,DirectShow では直接ドライバ固有ののプロパティにアクセスでするための IKsPropertySet インターフェイスというのが用意されています.このインターフェースを使うと GUID で識別されるドライバ固有のプロパティにアクセスできます.

必要となる GUID ですが,こんなページを発見しました↓あ゛ーあ,もっと早く知ってれば色々と使い道が…カメラに付いてるLEDも制御できるのね☆

http://www.quickcamteam.net/documentation/how-to/logitech-uvc-driver-public-property-set

てゆーか,RAWデータのストリーミングなんてできちゃうんだwktk.QuickCam Pro 9000, QuickCam Pro for Notebooks, または QuickCam Orbit/Sphere AF でしか使えない雰囲気ではあるけど.

ということで,時間があるとき試してみよ~っと.

  1. 2010/10/18(月) 23:46:28|
  2. ソフトウェア開発
  3. | トラックバック:0
  4. | コメント:0

配列の placement new にハマる

C++では配置 new (placement new) という, すでに確保したメモリから new する方法があるのですが, 配列の placement new がちょっと予想外の挙動をしたのでメモ.

class my_item { my_item(); ~my_item(); ... };

typedef unsigned char byte;
byte data[1024];

my_item *p = new (data) my_item[10];

というコードで, ポインタ data より p の値が 4 バイト分大きくなる. という現象が発生.

C++ ラビリンスさんによると, 配列の割り当てではこのようなオーバーヘッドがあるそうです. で, 今組んでるプログラムのコードを次のように書き換えです.

書き換え前

template <class Value>
inline void construct_array(Value *data, size_t size)
{
  new (data) Value[size]; //  placement new を使用
}

書き換え後

template <class Value>
inline void construct_array(Value *data, size_t size)
{
  for (size_t i = 0; i < size; ++i)
  {
    new (data) Value; //  placement new を使用
    ++data;
  }
}
  1. 2010/10/10(日) 18:55:05|
  2. ソフトウェア開発
  3. | トラックバック:0
  4. | コメント:0

[ODE]ODE を Visual Studio 2010 で使う

前に買っていた "簡単!実践!ロボットシミュレーション - Open Dynamics Engineによるロボットプログラミング" を久々に手にしてみました.

ということで,まずは ODE (Open Dynamics Engine) の開発環境を整える必要がありますね. ODE はソースで配布されているので, 自前でライブラリを用意しましょう. (公式サイトには ODE-bin パッケージという Windows 用のバイナリがあるよ的なことが書かれているんですが, 見つけられませんでした) 今回は ode-0.11.1.zip をダウンロードして, D:\lib\ode-0.11.1 に展開して作業を進めます.

1. ODE 本体のビルド

D:\lib\ode-0.11.1\build の中にある premake4 を実行して,ODE のライブラリ ビルドのソリューション ファイルを作成します. コマンドラインから次のコマンドを実行します.

> premake4 vs2008

premake4 は Visual Studio 2008 までしか対応してないので, 引数は上記の通りで OK です. ちなみに, premake4 の使い方は premake4 --help で見られます.

コマンドの実行の結果 D:\lib\ode-0.11.1\build\vs2008 の中に ode.sln というソリューション ファイルが出来上がるので, Visual Studio 2010 で開きます. このとき, プロジェクトの変換ウィザードが自動的に起動するので, Visual Studio 2010 用に変換します.

ode.sln では, 下記のような構成でビルドを実行することが出来るようになっています.
  DebugDoubleDLL
  DebugDoubleLib ← デバッグ, dReal は double 型, スタティックリンク
  DebugSingleDLL
  DebugSingleLib
  ReleaseDoubleDLL
  ReleaseDoubleLib ← リリース, dReal は double 型, スタティックリンク
  ReleaseSingleDLL
  ReleaseSingleLib

dReal というのは, ODE で演算に使われる型のようです. どの構成を使うかは好みですが, 私は dReal を double 型, スタティックリンクのデバック構成とリリース構成を選択して, それぞれビルドしました.

いくつか警告が出ますが, 次の 2 つのライブラリ ファイルが出力されます.
  D:\lib\ode-0.11.1\lib\DebugDoubleLib\ode_doubled.lib
  D:\lib\ode-0.11.1\lib\ReleaseDoubleLib\ode_double.lib

2. DrawStuff のビルド

ODE には OpenGL を使った, DrawStuff と呼ばれる簡単な描画用のライブラリが含まれています. このライブラリのビルド用のプロジェクトは用意されていないようなので, 自分で用意します. ode.sln に, 新しくプロジェクトを追加することにします. 追加時の設定は次のようにします. ここでは, ODE のビルドと同じようにスタティック リンクすることにします.
  プロジェクトの種類: Win32プロジェクト
  名前: drawstuff
  場所: D:\lib\ode-0.11.1\build\vs2008
  アプリケーションの種類: スタティック ライブラリ
  プリコンパイル済みヘッダー: チェックを外す

作成したプロジェクトに次のファイルを追加します.
  D:\lib\ode-0.11.1\drawstuff\src\drawstuff.cpp
  D:\lib\ode-0.11.1\drawstuff\src\internal.h
  D:\lib\ode-0.11.1\drawstuff\src\resource.h
  D:\lib\ode-0.11.1\drawstuff\src\resources.rc
  D:\lib\ode-0.11.1\drawstuff\src\windows.cpp

次に, プロジェクトのプロパティを編集します. Debug 構成と Release 構成をそれぞれ次のように設定します.

●Debug 構成
  [全般][文字セット]: マルチ バイト文字セットを使用する
  [全般][出力ディレクトリ]: ../../../lib/DebugDoubleLib/
  [全般][中間ディレクトリ]: obj/Debug/
  [全般][ターゲット名]: drawstuffd
  [C/C++][全般][追加のインクルード ディレクトリ]: .../../../include;../../../ode/src
  [C/C++][プリプロセッサ][プリプロセッサの定義]: WIN32;_DEBUG;_LIB;dDOUBLE;%(PreprocessorDefinitions) ← dDOUBLE を追加する (なくても大丈夫かも)

●Release 構成
  [全般][文字セット]: マルチ バイト文字セットを使用する
  [全般][出力ディレクトリ]: ../../../lib/ReleaseDoubleLib/
  [全般][中間ディレクトリ]: obj/Release/
  [全般][ターゲット名]: drawstuff
  [C/C++][全般][追加のインクルード ディレクトリ]: .../../../include;../../../ode/src
  [C/C++][プリプロセッサ][プリプロセッサの定義]: WIN32;_LIB;dDOUBLE;%(PreprocessorDefinitions) ← dDOUBLE を追加する (なくても大丈夫かも)

設定したら, Debug 構成と Release 構成でそれぞれビルドします.

いくつか警告が出ますが, 次の 2 つのライブラリ ファイルが出力されます.
  D:\lib\ode-0.11.1\lib\DebugDoubleLib\drawstuffd.lib
  D:\lib\ode-0.11.1\lib\ReleaseDoubleLib\drawstuff.lib

なお, DrawStuff にはリソースが含まれていますが, スタティック ライブラリにはリソースを含むことはできないので, 次の 2 つのコンパイル済みリソースを D:\lib\ode-0.11.1\lib の方にコピーしておいて, こっちもリンクすることにします.

  D:\lib\ode-0.11.1\build\vs2008\drawstuff\obj\Debug\resources.res → D:\lib\ode-0.11.1\lib\DebugDoubleLib\drawstuffd.res
  D:\lib\ode-0.11.1\build\vs2008\drawstuff\obj\Release\resources.res → D:\lib\ode-0.11.1\lib\ReleaseDoubleLib\drawstuff.res

3. 自分のプロジェクトの設定

以上で ODE のビルドが完了したので, 次はビルドしたライブラリの使い方についてです.

まず, 環境変数 ODE_BASE を追加し, その値を D:\lib\ode-0.11.1 とします. プロジェクトの設定で直接 ODE のパスを打ち込むこともできますが, 開発環境のお引越しでパスが変わること等を想定すると, 環境変数にパスを設定し, プロジェクトの設定で環境変数を使ったほうが良いでしょう.

それでは, 新しくプロジェクトを作成します.

ODE のライブラリの設定は, プロパティ シートに設定します. 一度, プロパティ シートを作ってしまえば, 次にプロジェクトを作るときに, プロパティ シートを読み込むだけで済みます. プロパティ シートを Debug 構成と Release 構成にそれぞれ追加します. ファイル名は適当に決めてください.

●プロパティシート (Debug 構成)
  [C/C++][全般][追加のインクルード ディレクトリ]: $(ODE_BASE)/include;%(AdditionalIncludeDirectories)
  [C/C++][プリプロセッサ][プリプロセッサの定義]: dDOUBLE;%(PreprocessorDefinitions)
  [リンカ][全般][追加のライブラリ ディレクトリ]: $(ODE_BASE)/lib/DebugDoubleLib;%(AdditionalLibraryDirectories)
  [リンカ][入力][追加の依存ファイル]: ode_doubled.lib;drawstuffd.res;drawstuffd.lib;opengl32.lib;glu32.lib;winmm.lib;%(AdditionalDependencies)

●プロパティシート (Release 構成)
  [C/C++][全般][追加のインクルード ディレクトリ]: $(ODE_BASE)/include;%(AdditionalIncludeDirectories)
[C/C++][プリプロセッサ][プリプロセッサの定義]: dDOUBLE;%(PreprocessorDefinitions)
[リンカ][全般][追加のライブラリ ディレクトリ]: $(ODE_BASE)/lib/ReleaseDoubleLib;%(AdditionalLibraryDirectories)
[リンカ][入力][追加の依存ファイル]: ode_double.lib;drawstuff.res;drawstuff.lib;opengl32.lib;glu32.lib;winmm.lib;%(AdditionalDependencies)

以上で, ODE のプログラムをビルドする準備ができました. 後は ODE の適当なサンプル ソースを打ち込んで, ビルドしてみて, うまくいけば OK です.


追記

ODE をビルドするとき,リリースの構成 (ReleaseDoubleLib) で,プリプロセッサ dNODEBUG も追加したほうが良いようです.追加すると,実効速度が向上します.元々付属しているビルド用のプロジェクトには,この指定がないようです.

  1. 2010/07/19(月) 16:48:53|
  2. ソフトウェア開発
  3. | トラックバック:0
  4. | コメント:0
次のページ

来客数

プロフィール

Euphorie

Author:Euphorie
"おいふぉりー"って呼んでくださいな☆
ハードウェアとかソフトウェアとかの開発に興味があったり。。。
連絡先は上の画像。

最近の記事

最近のコメント

最近のトラックバック

月別アーカイブ

カテゴリー

ブロとも申請フォーム

この人とブロともになる

ブログ内検索

RSSフィード

リンク

このブログをリンクに追加する

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。