「 2013年09月 」一覧

メールサーバーにSPF設定

メールサーバーを構築して、いざ gmail のアカウントに到着するか?!と試したところ、迷惑メール扱いされたので対策してみました。これから記すのは OpenDKIMをインストールして SPF の設定を行った流れです。

続きを読む


関数プロファイラーライブラリを更新

以前作成した関数プロファイラーライブラリを更新しました。
友人に使ってもらったのですが、「マルチスレッド対応してない!」と指摘されました。確かに未対応だったのですが、プログラムが落ちてしまうくらいにダメダメだったようで。今回はその対応をしたものとなります。

使い方等は以前と変わらずです。1つ問題があって、本ライブラリではマルチスレッド時のスレッド関数の終了で正しく終了している場合(endthread,endthreadex)に、スレッド関数の実行時間が計測できないという点です。スレッド関数から呼び出される関数自体には問題ないのですが・・・。
本問題はスレッドが該当関数の中で終了されてしまうことで、関数フックが機能しないためです。仕方ないので、ライブラリの仕様ということでお願いします。DLL化して正式対応してもよいのですが、依存等増やすのはあまり好きではないですし・・・。

それ以外の詳しい説明は、以前の記事(関数プロファイラーライブラリを公開です)を参考下さい。

ダウンロード

関数プロファイラーライブラリ funcprof ver 0.02


移転しました

サーバーを移転して、ドメインをきちんと取得しました。
これからはこちらでやっていきたいと思います。

検索エンジンの反映がこちらに切り替わるまでには、時間がかかるだろうなぁ・・・。


OpenGL 1.1で気をつけること

OpenGL 1.1 のバージョンであれば、今ならどこでも動くだろうと思ってやむなく使うこともあるかと思います。
そんなときに意外と嵌まってしまうポイントがあるようだったので、ここに記録&公開しておきたいと思います。もしも○○も気をつけなきゃいけないポイントだよね!ということがあればコメントにでもいただけると嬉しいです。

・ちゃんと初期化処理を行う。
ドライバ等の規定値を信用せずに、使用する値や期待しているステートは自分で再セットを行うこと。
ビューポートの指定を忘れると妙な挙動に悩まされることも。(例:RADEONの一部ドライバにて)

・テクスチャの解像度について。
実はOpenGL 1.1ではテクスチャは2ベキである必要があります。
最近のハードウェアだと非2ベキで問題なく動作するため、この問題に気づきにくいです。
また1.1でコンテキストをデフォルトで作成するということが OpenGLでできないためやっぱり発見が遅れます。

・拡張の取得について。
フレームレート制御のために glSwapIntervalを使いたいことがあります。
定番なのはこれのサポートチェックのために wglGetExtensionsString を使いますが、
意外とこの関数ポインタが取り出せないことがあるので注意が必要です。またこの関数がとれなくても glGetString(GL_EXTENSIONS)で、WGL_EXT_swap_control の有無をチェックするというコードも必要です。

・GLのデバイスについて
ドライバが正常に入っていても実はOpenGLはエミュレーションで動くとか平気であり得る。
レンダラーが GDI Generic とか返ってきたらエミュレーション。

・SwapBuffers実行の前にglFlush()を呼ぶ
これをやらないと描画できないデバイス(ドライバ)がいる模様。もしくは glFinish() でもいいのかも。


LinuxをクライアントでOpenVPN

結局OpenVPNに戻ってきました。
L2TPより遙かに自分には扱いやすいです・・・。また以前はWindowsをクライアントとしてLinuxサーバーにOpenVPNを入れていたのですが、今回はLinuxをクライアントとして設定する方法にチャレンジしてみました。

続きを読む


LinuxクライアントでL2TP

L2TPについてLinuxをクライアントとして用いて接続を行ってみました。Windowsをクライアントとする場合、OS標準でサポートしているため単なる設定を行えばつながるようなので。

なお、サーバーは手軽にSoftEtherのオープンソース版で実験してみました。

続きを読む


久しぶりにVPN

ずいぶんと久しぶりにVPNの勉強(補強)をしています。以前はIPSecサーバーを立てて、自分で拠点間接続をしたところで満足して、その先に進むことをしませんでした。

あれからずいぶんと経って、今はL2TPやSSTPといったものが出現しています。これらについて、ちょっと勉強をしてみようと思っています。ひとまずは L2TP が良さそうな感じです。何より現時点においてはAndroidやiPhoneでも使用することができるようになっていると聞きます。


関数プロファイラーライブラリを公開です

ちょっと前から作成していた関数プロファイラーをライブラリの形にしたので、これを公開します。

使い方

プログラムの頭で、ProfilerInit() を実行し、終了直前で ProfilerExit() を呼び出します。
付属のライブラリをリンクするようにして、コンパイル時のオプションで”/Gh /GH”を指定します。

  1. 追加のインクルードディレクトリに DIAのインクルードを追加する。(VSインストールフォルダ/DIA SDK/include)
  2. 追加のライブラリディレクトリに DIAのライブラリフォルダを追加する。(VSインストールフォルダ/DIA SDK/lib)
  3. プロジェクトのC/C++コンパイル設定で、コマンドラインオプションとして、”/Gh /GH” を指定する
  4. funcprof.h をインクルードして、ProfilerInit(),ProfilerExit()を呼び出します
  5. funcprof.libをリンクします

結果

実行結果はVisualStudioの出力ウィンドウに表示されます。Exeの場所に同様の内容でログを出力します。

testSort                       ,(  1),  253.857, [ms], 
std::vector >::resize ,(  1),    0.344, [ms], 
std::vector >::_Reserve ,(  1),    0.132, [ms], 
std::vector >::_Reallocate ,(  1),    0.000, [ms], 
std::_Sort          ,( 44),    1.619, [ms], 
std::_Random_shuffle,int> ,(  1),    0.043, [ms], 
std::_Unguarded_partition ,( 43),    0.316, [ms], 
std::_Median            ,( 43),    0.005, [ms], 
std::_Insertion_sort1 ,( 44),    0.026, [ms], 

カンマ区切りで出力されますので、加工はそれなりにやりやすいかと思います。

ダウンロード

まだアルファ版的なシロモノですが、よろしければご利用下さい。
関数プロファイラライブラリ funcprof ver 0.01

より新しいバージョンを公開したため、そちらをご利用下さい。



関数フック入れてのプロファイラ作成 (1)

前回の /Gh,/GH で関数にフックを入れられることがわかったので、これを利用して関数プロファイラを作成してみようと思います。

ただしここで1つ注意点があります。確かに呼ばれた関数のアドレスがわかりますが、そのアドレスがどの関数なのかを知る必要があります。アドレスから関数への対応を知るためには、いくつか方法があります。

  • mapファイルを参照する
  • pdbファイルを参照する

VCであればexeの生成時にmapファイルを作成することもできます。これをパースして対応表を作るのもあり、だと思います。でもせっかくVCなら、PDBファイル(Program Database File)を参照してデバッグ情報を得たいところです。
 このPDBですがファイルの仕様が全くわかりません。そのため何らかの方法経由で情報を取り出すことになります。調べてみると Dbghelp.dll が機能を持っているようです。詳しくは、デバッグテクニック徹底解説という黄色い本に書かれています。なにやら使うのが大変そう(にみえる)なので、別の方法でチャレンジしたいと思います。

調べてみると、DIAというDebug Interface Access という API が用意されています。これを用いるとpdbファイルから情報をいろいろと参照できるような感じです。今は Dia2となっているようですが、VisualStudioがインストールされている環境なら標準で使えるようにみえます。Dia が Debug Information API かと思ったら違う略だったので、危うく間違えて人に紹介するところでした・・・(汗