2012年5月28日月曜日

リソース(.rc) で単語の共通化

リソースを書いていて、後々変更するかもしれないけど暫定の名前を使うことありますよね?
それがたくさんあると、後で変更するときに少しメンドクサイですよね?

置換すれば一瞬だって?

そうだね!

でも、ここでは別のアプローチをしてみたいと思います。

プリプロセッサがあるじゃない
リソースファイル(.rc) でもマクロが使えます。
マクロで単語を共通化しちゃいましょう。

Win32 アプリケーションのテンプレートプロジェクトで実験してみましょう。
//Microsoft Visual C++ で生成されたリソース スクリプトです。
//
#include "resource.h"

#include <boost/preprocessor/cat.hpp>
#include <boost/preprocessor/stringize.hpp>

#define SOFTWARE_NAME ソフト名

// ~~~~~~ 略 ~~~~~~~~

IDC_RESTEST MENU
BEGIN
    POPUP "ファイル(&F)"
    BEGIN
        MENUITEM BOOST_PP_STRINGIZE(BOOST_PP_CAT(SOFTWARE_NAME,の終了(&X))), IDM_EXIT
    END
    POPUP "ヘルプ(&H)"
    BEGIN
        MENUITEM BOOST_PP_STRINGIZE(BOOST_PP_CAT(SOFTWARE_NAME,のバージョン情報(&A)...)), IDM_ABOUT
    END
END


※[プロジェクトのプロパティ] - [リソース] - [追加のインクルード ディレクトリ] にパスを追加しましょう

これをビルドし、実行するとこうなります。

おわり。

追記
半角スペースを入れるには、 「\x20」とする必要があります。
ちょっと不恰好ですね…

2012年5月20日日曜日

Jenkins + Persona Plugin 使ってみた

うちの Jenkins も 痛Jenkins にしようと思ったので、試してみました。

参考サイトはこちら:
http://d.hatena.ne.jp/cactusman/20110227/p1
https://wiki.jenkins-ci.org/display/JENKINS/Persona+Plugin

設定はそれほど難しくないのですが、自分は少しハマったので備忘録的にブログに残しておきます。

設定
まずは、Persona Plugin をインストールします。

インストールしたら、Wiki の手順に従って設定します。

JENKINS_HOME フォルダ直下に persona フォルダを作成し、そこに任意の名前でフォルダを作成します。
このフォルダが Persona に対する設定を置く場所になります。
複数の Persona を作りたい場合は、 persona フォルダに別のフォルダを作成します。


続いて、設定フォルダの中を揃えていきます。
Wiki に従って、成功・失敗・その他の画像ファイルとアイコンを用意します。
アイコンのサイズは 48x48 です。

次に、persona.xml ファイルを作成します。
内容は Wiki からコピペして、自分の好きなようにカスタマイズします。

<persona id='djb' displayName='Daniel J. Bernstein'>
  <quote>Just because it's automatic doesn't mean it works.</quote>
  <quote>Be careful what you wish for you just might get it.</quote>
  <quote>I do engineering, not religion.</quote>
  <quote type="success">This is only for stable builds.</quote>
  <quote type="failure">This is only for unstable builds.</quote>
  <quote type="other">This is only for failed builds.</quote>  ...
</persona>

displayName に Persona の名前を設定します。
あとは、アイコンがしゃべる内容を書き込みます。


以上で設定は終わりです。
Jenkins を起動すると Persona が使えるようになります。

ハマった!
このあと Jenkins での設定を説明をするのですが、自分はここでハマりました。
先程作った Persona が認識されないのです。


数時間悩みました。。。


原因は簡単でした。persona.xml に日本語が含まれていたのが原因だったようです。
Wiki に載っている設定をそのまま使ったら、ちゃんと認識されました。
最初に全部カスタマイズしたのがいけなかった。。。最初にサンプルで動作確認すべきでした。

しかし、実際に使っている方のブログなどを拝見すると日本語もちゃんと出てます。
これも簡単、persona.xml ファイルを "UTF8" で保存するだけでした。


Jenkins の設定
さて、Jenkins の設定です。

Jenkins で Persona を適応したいプロジェクトの設定画面まで行き、ビルド後の処理の "Associate Persona" を選択します。

設定が正しくできていれば、Persona のドロップダウンリストに displayName に指定した名前の Persona があるはずです。
Location は表示される場所ですので、お好みで設定してください。

これで 痛Jenkins の完成です!!




2012年5月8日火曜日

DISABLED テストの小技(Google Test)

まずは、こちらのテストコードをご覧下さい。
#define DISABLED_MacroTest  EnabledTest
#define MacroTest           DISABLED_Test

TEST(DISABLED_MacroTest, Enable)
{
    ASSERT_EQ(0, 0);
}

TEST(MacroTest, NotRun)
{
    ASSERT_EQ(2, 3);
}
#define したマクロ名をテストケースの名前として指定しています。
さて、こちらのテストを実行するとどうなると思いますか?


EnabledTest が実行され、MacroTest が実行されていないのがわかると思います。
実は、TEST マクロに指定したトークンは展開されます。
試しに、--gtest_also_run_disabled_tests で実行するとこうなります。


MacroTest が DISABLED_Test として評価されているのがわかりますね。

同様に TEST_F でも展開されます。
class EnabledTestFixed : public testing::Test {};

typedef EnabledTestFixed    DISABLED_TestFixed;

#define MacroTestF  DISABLED_TestFixed
#define DISABLED_MacroTestF EnabledTestFixed

TEST_F(MacroTestF, NotRun)
{
    ASSERT_EQ(2, 3);
}

TEST_F(DISABLED_MacroTestF, Run)
{
    ASSERT_EQ(0, 0);
}



この動作を利用してこのような、使い方ができます。
#ifdef USER_ZUMIX
#  define MYTESTCASE_NAME  MyTest
#else
#  define MYTESTCASE_NAME  DISABLED_MyTest
#endif

TEST(MYTESTCASE_NAME, Test1)
{
}



それじゃ、TEST_P も…と思いますが、
残念ながら、TEST_P や TYPED_TEST ではこの手法は使えません。
(iutestならできます!)

今回は、Google Test のちょっとしたテクニックを紹介しました。
それでは。