2013年2月27日水曜日

[Jenkins] ノードやラベルを指定して実行する

標準的な Jenkins の設定ページでは、
「実行するノードを制限」にチェックを入れて、ラベル式を指定することでノード制限をかけれました。

しかし、同じラベルがついているノードでも、
特定のノードでしか発生しない失敗が出ることがあります。

その場合、設定画面で逐一設定を変更する必要がありました。

NodeLabel Parameter Plugin という選択
NodeLabel Parameter Plugin を使うことで、ノードやラベルをパラメータとして扱うことができるようになります。

設定方法

プロジェクトの設定ページを開き、「ビルドのパラメータ化」をチェックします。
NodeLabel Parameter Plugin をインストールしたことで、「パラメータの追加」に「Node」と「Label」が追加されています。


こちらを選択して各々設定をします。

Node の場合
デフォルトノードと実行を許可するノードを設定します。
(許可ノードを飛び飛びで複数選択する方法がわからない・・・)


設定を保存し、プロジェクトを実行すると以下のような選択ページが出ます。


ここで、実行させたいノードを選択し「ビルド」ボタンを押すだけです。

Label の場合

ラベルの場合は、デフォルトのラベル式を設定します。

プロジェクトを実行すると、以下のようなテキストボックスが出るので


デフォルト以外で実行したい場合は、ここを編集して「ビルド」ボタンを押します。

注意点
どちらも「実行するノードを制限」を上書き動作するみたいです。(試してみた感じ)
あとは、「Node」と「Label」両方設定した場合に、「Label」設定が優先されるっぽい。(そんな気がする)




何はともあれ、jenkins がどんどん便利になりますね。

2013年2月22日金曜日

[Visual Studio]コードを修正せずに変数の値をログ出力する方法

ふとした時に変数の値がどのようになっているか、確認したいことってありますよね。

おそらく皆さんブレークポイントを設置して、
停止した状態でローカルウィンドウやウォッチウィンドウを見て確認するのではないでしょうか。


だけど、止めずに確認したい時もありませんか?
一時的な値ではなく変化を知りたい時はありませんか?

そんな時は printf 追加してプリントデバッグ!
という方法もありますが、再ビルドが必要なので時間がかかってメンドクサイです。

そこで、Visual Studio でソースを変更せずブレークポイントで停止させることもなく(※)、変数の値を出力させる方法を紹介します。(※ 内部的には停止している)

サンプルプログラム
int factorial(int n)
{
    if( n == 0 ) return 1;
    n = n * factorial(n-1);
    return n;
}
int main(int, char**)
{
    return factorial(10);
}
今回はこのコードの
return n;
のとこでの変数 n の値を出力します。

設定
まずは、ブレークポイントを設置します。

次に、ブレークポイントの赤いマークを右クリックすると、
コンテキストメニューに「ヒット時(W)...」メニューがでるので選択します。


クリックするとダイアログが出るので、そちらの「メッセージを表示する(P)」にチェックを入れます。
下のエディットボックスに、ブレークポイントにヒットしたときに出力する文字列を入力します。


こちらには、通常の文字列以外に
{x}式評価(中括弧の中に式)
$ADDRESS現在の命令アドレス
$CALLER呼び出し元関数名
$CALLSTACK呼び出し履歴
$FUNCTION現在の関数名
$PIDプロセスID
$PNAMEプロセス名
$TIDスレッドID
$TNAMEスレッド名
が使用できるようです。

今回は変数 n の値が知りたいので、
{n}
と入力しました。

「続けて実行する(C)」にはチェックを入れておいてください。
これにチェックを入れておくと、ブレークポイントにヒットしても停止せずそのまま継続してくれます。

設定は以上です。
実行した結果がこちらになります。


ブレークポイントには他にも色々設定できるので試してみてください。
それでは!


2013年2月18日月曜日

[Jenkins] DNS MultiCast を停止する方法

なぜかJenkinsを起動させたらパケットロスが多発しまくったのを無理やり直した話

きっかけはこちらの記事。
(Jenkins には Auto-discovering という機能があるそうです。)

Jenkins が原因で社内ネットワークが重たくなるという現象が起こっていたため対応することになり、
色々手こずったのでメモを残しておきます。
(※結論だけ知りたい方は下のほうだけ見れば OK です。)

Jenkins システムの設定
とりあえず、システムの設定画面にはなさそう…
PC の設定でブロックするようにできないか試してみることにしました。

パケットフィルター
iptables
Windows で Jenkins を動かしているので、iptables は使えない。

netsh routing ip
netsh routing ip add filter ~で、フィルターかけられるという情報を見つけたが、
Windows 7 では使えなかった…
(XP ならできるみたいだけど…)

ファイアーウォール
ファイアーウォールの「送信の規則」を設定したらできると思って試すもうまくいかず…

設定の仕方が悪いのだろうけど、調べる時間もあまりないので
原点に戻って Jenkins 側で制御できないか再調査することにしました。

Class DNSMultiCast
Jenkins の API ドキュメントを探してたら、まさに!なクラスを発見! DNSMultiCast

"DNSMultiCast Jenkins" で検索したらそれらしい情報がいっぱい出てきた!

日本Jenkinsユーザー会 | Google Groups
Jenkins users - How to use -dhudson.DNSMultiCast.disable and ...

DNS MultiCast を停止する方法
DNS マルチキャストを無効にするには、Jenkins の起動時に
-Dhudson.DNSMultiCast.disabled=true
を指定するようです。
詳しくは Jenkins 公式の Features controlled by system properties を見てください。

実際に試して見ました。

もちろん、見た目に変化はありません。
設定が反映されているかスクリプトコンソールを使って確認します。
スクリプトコンソールを開いたら
println(hudson.DNSMultiCast.disabled)
と入力し、実行します。

ちゃんと disabled が true になりました。

これで、UDP マルチキャストが停止するはずです。

2013年2月13日水曜日

[VS2012][gtest]コード分析警告に対応させる

Visual Studio 2012 では express でもコード分析が使えます。
NULL ポインタ参照とか検出してくれて非常にありがたいのですが、
こちらのコードでも警告が出てしまいます。

#include <gtest/gtest.h>

TEST(NullCheck, Sample)
{
    int* p = (int*)malloc(4);
    ASSERT_TRUE(p != NULL);
    *p = 1;
    ASSERT_EQ(1, *p);
}


p が NULL の場合、ASSERT_TRUE(p != NULL) に失敗し return します。
従って以降の処理が走る場合、p が NULL でないことは決定しています。

こんなことも分からないとは・・・

NULL でないことを教える
C6011 の対処をするために __analysis_assume を使います。
これはコード分析ツールのためのコードの追加情報を与えます。

上記コードはこのようになります。
#include <gtest/gtest.h>

TEST(NullCheck, Sample)
{
    int* p = (int*)malloc(4);
    ASSERT_TRUE(p != NULL);
    __analysis_assume(p != NULL);
    *p = 1;
    ASSERT_EQ(1, *p);
}

結果

警告消えました!

あーでも、ASSERT_TRUE(p != NULL); で分かりきってることを、もう一度書くのはダサいですよね・・・
ASSERT_TRUE にやらせる
#undef ASSERT_TRUE
#define ASSERT_TRUE(condition) \
    GTEST_AMBIGUOUS_ELSE_BLOCKER_ \
    if( bool b = true ) { \
        __analysis_assume(condition); \
        goto GTEST_CONCAT_TOKEN_(gtest_label_analysis_assume, __LINE__); \
    } else \
        GTEST_CONCAT_TOKEN_(gtest_label_analysis_assume, __LINE__): \
        GTEST_TEST_BOOLEAN_(condition, #condition, false, true, \
                GTEST_FATAL_FAILURE_)

ちょっと変わった書き方ですが、Google Test の機能である
if( int x = 1 ) // { 省略しても OK
    ASSERT_TRUE(x==1) << "message"; // << で失敗時のメッセージを追加できる
を潰さないようするためです。

これを使って最初のコードを分析させます。

結果


うまくいきました。
コード分析、便利なんで積極的に使いたいですね。
(あれ?でも解放してないのは警告されないのか。。。)

2013年2月11日月曜日

「勉強会勉強会」に参加して来ました

DevLOVE関西「勉強会勉強会」に参加して来ました。

勉強会勉強会は勉強会についての勉強会でございます。

勉強会の参加はいつも「行こうかなどうしようかな~」と悩みがちなのですが、
今回は反射的に参加ボタン押してました。

というのも、以前から「社内勉強会があまりうまくいっていない」「社内でもっと勉強会をしたい」と思っていました。
勉強会のことで悩んでいるときに、「勉強会勉強会」なんて知って迷っている暇はありません。しかも、関西。

参加ボタンはいつ押すか?
今でしょ!

社外勉強会にも・・・
セッションの内容については、他の方々の参加報告などを見ていただくとして、
(※こちら にリンクがまとまってます。)
ここでは、私個人のことについて書かせて頂きます。

当初、社内勉強会の悩み解決が主な目的でしたが、
ちょっとしたハプニングで皆さんの前で自己紹介することに。
お酒も入っていたのと突然のことで、何言ったのかハッキリ覚えてないのですが、
「ゲーム業界向けに Jenkins の勉強会やってみたい」的なことを口走ってしまいました。

正直、社外の勉強会はやったことがないし、会場探しどうすんの?とか、人が集まるの?とか、
分からないことだらけで自分にはまだ早いと思ってました。

しかし、
会場「じゃあやろうか」

って感じで、じゃあどうしようかって話し合い(個別相談会)がスタート。

「興味がある人は結構いるんじゃないかな?」
「Jenkins じゃなくて、 CI/CD にして範囲を広げるのがいいかも」
「会場なら貸せますよ~」
「お手伝いしますよ」
そんな感じで色々ご意見頂いて、いやホントありがとうございましたm(__)m

まとまったのかまとまってないのかわからないけど、
とりあえず、Doorkeeper でイベント作ります。(作ったらブログや twitter で報告します。)

2人いれば勉強会
社内勉強会の悩みは、勉強会勉強会に参加して
「こういうやり方もあったのか」「やってみよう」という気持ちに変わりました。
皆さんの話の中にたくさんヒントがあり、とても参考になりました。

特に、中村さんの発表にあった「1人でやるのは勉強。2人でやれば勉強会。」ってのはなるほどと思いました。
同じことに興味のある人を見つけて2人で勉強会ってのもありですね。

KPT
今回は KPT でまとめます。

Keep
  • 勉強会に出た。
  • 前で話せた。(たまたまだけど)
  • 色々な話が聞けてやる気が出た。

Problem
  • 個別相談中に他の話が聞けなかった。
  • あまり自分からしゃべれなかった。

Try
社外勉強会
  • 社外勉強会開く。
  • Doorkeeper 使ってみる。
社内勉強会
  • 2人でも勉強会やってみる。
  • 飲み会 + 勉強会。(プロジェクタとかある飲み屋探す)
  • スライドを借りて発表。

最後に
最後に、
スタッフ・参加者の皆さん、そして会場提供をして頂いた楽天さん、ありがとうございました。

2013年2月9日土曜日

[Jenkins][VS2012 UTF] VSTestRunner Plugin を使って実行

ちょっと前に、「Visual Studio 2012 C++ Unit Test Framework をコマンドライン実行 + Jenkins」というタイトルで、
テストの実行と Jenkins との連携について投稿をしたのですが、
ちょうど同じに日に「VsTestRunner Plugin」という、vstest の実行をするプラグインが公開されていました!

というわけで、使ってみました。

設定
Wiki にある通りに設定していきます。

まずは、システム設定で vstest.console.exe のパスを設定します。


次に、実際に実行したいプロジェクトの設定で、「VSTest実行」を選択します。


実行したいテストのパスを設定し、


あとは適当に設定します。
trx の結果ファイルが欲しいので「高度な設定」を開いて trx にチェックを付けてます。



テスト結果の収集は「Visual Studio 2012 C++ Unit Test Framework をコマンドライン実行 + Jenkins」で紹介したとおり、MSTest plugin を使います。
設定などはリンク先を見てください。
実行
あとは実行するだけです。
バッチファイル書くよりは幾分楽に実行できました。


自分でもプラグインを作ってみたいですね。(いつかやる、きっと)

2013年2月6日水曜日

iutest v1.3.1 をリリースしました

この間 v1.3.0 をリリースしたばかりですが、 v1.3.1 をリリースしました。

今回の変更点はこちらになります。

  • IUTEST_SKIP() << "message" に対応
  • スキップ時のログ出力を修正
  • コンパイルの通らないテストコードを許可するテスト生成マクロ(*_IGNORE)を追加
スキップ機能周りの機能改善
これまでは、IUTEST_SKIP() したときに
・スキップしたのかどうか
・なぜスキップしたのか
これらがログから解りにくい状態でした。
今回の修正により、以下のようにスキップしたときにメッセージの表示、追加ができるようにしました。
IUTEST(SkipTest, CanSkip)
{
    IUTEST_SKIP() << "test";
    IUTEST_EXPECT_EQ(2, 3);
}

IUTEST(SkipTest, Failed)
{
    IUTEST_EXPECT_EQ(2, 3);
    IUTEST_SKIP();
    IUTEST_EXPECT_EQ(2, 3);
}




構文エラーも無視可能なテストの定義マクロを追加
まず、こちらのコードを御覧ください。
template<typename T>
void f()
{
    int a//; error
}
int main(int, char**)
{
    return 0;
}
あからさまに構文エラーがあるのがわかると思いますが、
こちらのコードは Visual Studio ではコンパイルエラーになりません!
 (C++ Compiler Farm でコンパイルしてみました。)

Visual Studio では使用されていないテンプレート関数はコンパイル対象にならない感じなのですが、 これのせいでいざ使おうと思ったら大量のエラーが・・・なんてことがあったり。

しかし
この挙動を逆手に取れば、なにを書いてもエラーにならない関数が書けるではないですか!
というわけで、IUTEST_TEST_IGNORE マクロを用意しました。
(※ IUTEST_F_IGNORE, IUTEST_P_IGNORE, IUTEST_TYPED_TEST_IGNORE, IUTEST_TYPED_TEST_P_IGNORE もあります。)

IUTEST_TEST_IGNORE(VedningMachineTest, TotalAmount)
{
    // VedningMachine 定義してないけど、こんな感じでテスト書くよ
    VedningMachine vm;
    vm.Insert(100);
    IUTEST_ASSERT_EQ(100, vm.GetTotalAmount());
}

このマクロを使うと、テスト関数にエラーがあってもコンパイルが通ります。
(※Visual Studio のみの機能になります。)

実用性があるのか?
わかりません。

ただ、この前参加した 「2013年はじめのTDD Boot Camp in 大阪」でのデモンストレーション(java)で、
@ignore
と付けただけで、テストが無視されたんですよ!
なんだってー(゚Д゚;)!!って思いました。
それ以外にも、java でのテストのコーディングが非常に軽快で羨ましかった。。。

だから、作りました。
gcc や clang でも同様のテクニックがあれば教えてください m(__)m

次はC言語バージョンの iutest_c v1.1.0 をリリースしたいところなのですが、
とある環境でテストが通っていないため、どうなるかわかりません。
プログラムは難しい~…それではまた~

2013年2月5日火曜日

Visual C++ 6.0 が欲しい

template の部分特殊化が使えない環境として、Visual C++ 6.0 が欲しい!

ただ数万円出してまで欲しいものでもなく、部分特殊化ができないコンパイラならなんでも良いのですが・・・

2013年2月4日月曜日

[Visual Studio] ツールバーにあるソリューション構成コンボボックスの幅を変更

Visual Studio 2012 Express 2012 for Windows Desktop を使い始めて、ツールバーのコンボボックスの幅を広げたいなぁと思ってました。

以前の Visual Studio では変更できたし、VS2012 でも変更できるだろうと思ったのですが、
そもそもカスタマイズをどこでしていたかサッパリ覚えてないし、
検索しても全然ヒットしないし(探し方が下手なだけ)
あーもー!!
って感じだったので、自分用の備忘録として記録しておきます。


手順
  1. 変更したいツールバーの右端にあるオプションから、
    [ボタンの追加または削除(A)] > [カスタマイズ(C)...]を選択すると、カスタマイズダイアログが開きます。
    ([ツール]メニューの[カスタマイズ(C)...]からもダイアログを開けます。)

  2. 変更したいコンボボックスを選択し、[選択したボタンの編集(M)]ボタンを押します。

  3. 編集メニューが出るので、そこで幅を編集します。


できたできた。