2013年6月29日土曜日

「Boost.勉強会 #12 大阪」に参加してきました

Boost.勉強会 #12 大阪」に参加しました。
今回は、会社の同僚が何人か参加するらしいのでぼっち飯しなくて済みそうです。

それでは行ってきます。


というわけで行ってきました。
各セッションの資料は Boost.勉強会のページにまとまっていますので、そちらからご覧ください。
簡単ではありますが、感想を書きました。

C++で作るWEBアプリケーション
C++で作るWEBアプリケーション: @fadis_

Emscriptien を使うと C++ から JavaScript に変換できるとのこと。
OpenGL (ES) や OpenAL が使えて、ファイルシステムもあるそうで、Unreal Engine が動いたとか。
普通にゲーム作れそうですね。

自分が(仕事で)で使うことはないかと思うが、
自作プログラムでも変換してみますか。

C++初心者のためのBoost.MPL入門
C++初心者のためのBoost.MPL入門: @suibaka

高校生ですごいなってのが一番の感想。
Boost をほとんど使ったことなく、当然 MPL も知らないので、参考になりました。
ただ、ちょっと説明が分かりにくかったかなぁ。

boost::multiprecisionと適応型無誤差演算
boost::multiprecisionと適応型無誤差演算: @oniprog

これまた自分とは関わりの薄い分野でしたが、勉強になりました。
無誤差演算がこの先いつか必要になるかもしれないので覚えておきたいです。

constexpr中3女子テクニック―実践と濫用そしてC++14へ
constexpr中3女子テクニック―実践と濫用そしてC++14へ : @bolero_MURAKAMI

1時間半超…ぶっちぎりの constexpr でした。
長いなぁとは思ってましたが、そんなにオーバーしていたとは(^^
constexpr は使ってみた程度にしかやってないのですが、
C++14 で constexpr の制限も緩くなるので、楽しみです。

iutest でも新しい C++ の機能は積極的に取り込んでいるので、
constexpr でも何かできないかなぁと考えてます。
まぁ、14 も 1y も気になりますが、個人的には VC++ が気になります。VS2013…

Allocators@C++11
Allocators@C++11: @Cryolite

ネタが満載でとてもおもしろかったですw
以上!

…ではなく、色々なテクニックが紹介されていてとても勉強になりました。
特に、pointer 型のカスタマイズや Scoped Allocator Model が気になりました。

実は一番実践的なセッションだったのではないでしょうか。
しかし、これが C++03 でできないのは残念です。。。

君はまだ、本当のプリプロセスを知らない
君はまだ、本当のプリプロセスを知らない: @decimalbloat

去年の Boost.勉強会 #8 大阪 ではついていくのがやっとな感じでしたが、
去年のスライドを読み、 魔クロ 力を上げたおかげか、
今回は話がちゃんと理解できました。

私の魔クロ力はともかく、今回はとても分かりやすい発表だったと思います。
ちょっと難しいなぁと思った方は、こちらのスライドを合わせて読むことをオススメします。
[Boost.勉強会 #8 大阪 - プリプロセッサこわい]

C++コミュニティを作る
C++コミュニティを作る: @cpp_akira

最後は @cpp_akira 氏のセッション。
今まで Twitter やブログ経由でしか知らない、よく分からないけどスゴイ人という認識でしたが、
今回のお話でどのような経歴を経て、どのような考え方を持っているのか分かり、改めてスゴイ人だなと思いました。

今の自分にできること
とりあえず、できるところからということで、Google Test の Google Group に「[gtest] ASSERT_* マクロで void 以外を return できるようにする」のバッチを送ってみました。
(送ってみたけど反応なくて、チンプンカンなことしてないかとても不安…)

また、このブログは週1回は更新していますので、こちらは継続していきたいです。

最後に
今回も充実した一日でした!
(遠方の会場だと厳しいですが)また、Boost.勉強会に参加したいです。

2013年6月28日金曜日

[gtest] Visual Studio 2013 Preview で Google Test を使う

Visual Studio 2013 Preview が公開されました!
さっそくインストールして使ってみました。

気になる C++11 対応は Visual C++ Compiler November 2012 CTP + α といった感じのようです。
その辺はこちらを参照してください。

Google Test をビルドしてみた
さて、表題の件ですが、
VS2013 Preview で Google Test を使う場合、特にすることはありません!
プロジェクトの変換をして、ビルドするだけです。

Visual Studio 2012 で Google Test を使う
Visual Sutido 2012 のときには _VARIADIC_MAX を定義する必要がありましたが、
VS2013 Preview では、_VARIADIC_MAX の定義は不要になりました!!

標準ライブラリの C++11 対応が進んだようで、これは嬉しいですね。

以上です。(Boost.勉強会参加報告は今週中には書きあげます…)

2013年6月21日金曜日

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

iutest v1.6.0 をリリースしました。

今回の変更点は以下のとおりです。
  • stream result 対応
  • gtest モードで AssertionReturn が使えるように対応
  • :iutest::RandomGenerator を追加
  • ASSERT_*, EXPECT_*, INFORM_* マクロのストリームに iomanip が使用できなかった問題を修正
  • --iutest_filter にマッチしたテスト数が取得できるように修正
  • XML 出力の skipped にメッセージを出力するように修正
  • ::iutest::RandomValues で乱数シードを指定できるように修正
  • AssertionReturn の仕様変更
  • spi で TestPartResult 数をチェックするように変更
  • spi で substr でメッセージをチェックするように変更
  • --iutest_filter でマッチしなかったテストは XML に出力しないように変更
  • デフォルトログ出力を --iutest_filter の結果を考慮した出力に変更

stream result 対応
gtest 相当の stream result が使用できるようになりました。
socket 通信を利用して外部に結果を送れるようになります。

乱数パラメータ生成周りの修正
乱数パラメータ生成をより使いやすく修正をしました。

AssertionReturn の gtest モードサポート
AssertionReturn を gtest モードでも使用できるようにしました。
それに合わせて、AssertionReturn を template クラスから template 関数に変更しました。

gtest 対応
gtest 1.7.0 が出そうなので、それに関する動作変更を行いました。

不具合修正
iomanip や spi マクロの不具合修正をしました。

次回更新予定
Google Test 1.7.0 がリリースされた頃に更新したいですね。

2013年6月18日火曜日

CppNcss を使ってみた (+Jenkins)

CppNcss というコードメトリクスツールを知ったので試してみました。
CppNcss のダウンロードはこちらからしました。

セットアップ
ダウンロードしたファイルを解凍すると、バイナリなどが入っているフォルダが展開されるので適当な場所に保存します。
このとき、パスに "空白" が含まれていると動作しないので気をつけてください。

cppncss\bin にパスを通します。
コマンドプロンプトを開いて、cppncss -h[ENTER] と打ちます。
>cppncss -h

Usage: cppncss [options] [file [file2 [directory [directory2] ...]]]
Version: 1.0.3

Options:
  -h                      print this message
  -d                      print debugging information
  -v                      be extra verbose
  -k                      keep going on parsing errors
  -r                      process directories recursively
  -x                      output result as xml
  -m=<measurements>       output the <measurements> sorted in given order, defau
lt is equivalent to -m=NCSS,CCN,function
  -n=<number>             output only the top <number> results
  -f=<file>               output result to <file>
  -D<symbol>[=[<value>]]  replace define <symbol> with <value>
  -M<symbol>[=[<value>]]  replace macro <symbol> with <value>
  -p=<path>               remove <path> prefix when displaying file names

See http://cppncss.sourceforge.net for more information.
上記のようにヘルプが表示されれば OK です。

使ってみる
試しに使ってみました。解析対象は iutest を使用しました。
include フォルダ以下すべてを解析させるので、 -r オプションをつけています。
>cppncss -r include
---- 省略 ----
Average Function NCSS: 4.86
Average Function CCN: 2.14

Nr. NCSS CCN Functions File
  1  106  45        21 include\gtest\iutest_assertion_only.hpp
  2    0   0         0 include\gtest\iutest_gtest_ver.hpp
  3    0   0         0 include\gtest\iutest_spi_switch.hpp
Average File NCSS: 35.33
Average File CCN: 15.00
Average File Functions: 7.00

Project NCSS: 106
Project CCN: 45
Project Functions: 21
全部のファイルが解析されていないようです。
-k オプションをつけてパーサーエラーが発生しても続行するようにします。
>cppncss -k -r include
---- 省略 ----
Average Function NCSS: 3.75
Average Function CCN: 1.61

Nr. NCSS CCN Functions File
  1  228  81        38 include\internal\iutest_list.hpp
  2  120  42        30 include\iutest_core.hpp
  3  112  56        10 include\util\iutest_util_tests.hpp
  4  106  45        21 include\gtest\iutest_assertion_only.hpp
  5   98  39        30 include\iutest_result.hpp
  6   83  24        11 include\internal\iutest_console.hpp
  7   76  26        22 include\internal\iutest_message.hpp
  8   70  21        14 include\internal\iutest_params_util.hpp
  9   67  23        21 include\iutest_body.hpp
 10   62  16        15 include\internal\iutest_filepath.hpp
 11   46   3         3 include\internal\iutest_option_message.hpp
 12   44  22        18 include\util\iutest_util_quiet_result_printer.hpp
 13   36  12        11 include\internal\iutest_random.hpp
 14   35  10         9 include\internal\iutest_result_reporter.hpp
 15   31  10        10 include\internal\iutest_factory.hpp
 16   30   9         5 include\internal\iutest_exception.hpp
 17   25   1         1 include\internal\iutest_stdlib.hpp
 18   24   4         4 include\internal\iutest_mediator.hpp
 19   18   4         3 include\internal\iutest_pool.hpp
 20   13   2         2 include\iutest_static_assertion.hpp
 21   11   4         2 include\gtest\switch\iutest_switch_inform.hpp
 22   10   4         4 include\gtest\switch\iutest_switch_filepath.hpp
 23    5   0         0 include\internal\iutest_regex.hpp
 24    2   0         0 include\util\iutest_util_output.hpp
 25    1   0         0 include\internal\iutest_tuple.hpp
 26    1   0         0 include\iutest_util.hpp
 27    0   0         0 include\gtest\iutest_gtest_ver.hpp
 28    0   0         0 include\gtest\iutest_spi_switch.hpp
 29    0   0         0 include\gtest\switch\iutest_switch_assert.hpp
 30    0   0         0 include\gtest\switch\iutest_switch_core.hpp
 31    0   0         0 include\gtest\switch\iutest_switch_expect.hpp
 32    0   0         0 include\gtest\switch\iutest_switch_no_failure.hpp
 33    0   0         0 include\gtest\switch\iutest_switch_package.hpp
 34    0   0         0 include\gtest\switch\iutest_switch_peep.hpp
 35    0   0         0 include\gtest\switch\iutest_switch_pmz.hpp
 36    0   0         0 include\gtest\switch\iutest_switch_pred.hpp
 37    0   0         0 include\gtest\switch\iutest_switch_skip.hpp
 38    0   0         0 include\gtest\switch\iutest_switch_throw_value.hpp
 39    0   0         0 include\internal\iutest_compiler.hpp
 40    0   0         0 include\internal\iutest_internal.hpp
 41    0   0         0 include\internal\iutest_pp.hpp
 42    0   0         0 include\internal\iutest_pragma.hpp
 43    0   0         0 include\iutest_config.hpp
 44    0   0         0 include\iutest_ignore.hpp
 45    0   0         0 include\iutest_ver.hpp
Average File NCSS: 30.09
Average File CCN: 10.18
Average File Functions: 6.31

Project NCSS: 1354
Project CCN: 458
Project Functions: 284

できました。

NCSS と CCN
NCSS は "Non Commenting Source Statements"
CCN は "Cyclomatic Complexity Number"
の略です。計測できるのはこの2つだけのようです。

Jenkins との連携
CPPNCSS Plugin があるのでインストールします。

適当に CppNcss を行うプロジェクトを作成したら、
[ビルド後の処理の処理の追加] から [Publish Cpp NCSS Report] を選択します。

xml ファイルのパスと、関数単位でのステートメント数と複雑度の閾値を設定します。

こんな感じで集計、グラフ化できました。


CCCC との比較
C/C++ のコードメトリクスツールには他にも SourceMonitorCCCC などがあります。
個人的に CCCC を使っているので比較をしてみたいと思います。
(※ CCCC についてはこちらも参考にしてください)

計測できる項目
CppNcssCCCC概要
Number of Modulexoモジュール(クラス)数
Line of Codexoコード行数
Non Commenting Source Statementsoxステートメント数
Cyclomatic Numberoo複雑度
Line of Commentxoコメント行数
LOC/COMxo1コメントあたりのコード行数
MVG/COMxo1コメントあたりの複雑度
Information Flow measure (inclusive)xoモジュール間結合
Information Flow measure (visible)xoモジュール間結合
Information Flow measure (concrete)xoモジュール間結合
Weight Methods per Class (unity)xo関数の重み(重み=1)
Weight Methods per Class (visible)xo関数の重み(重み=外部アクセスの可否)
Depth of Inheritance Treexo継承の深さ
Number of Childrenxo子クラスの数
Coupling between objectsxoクラスが依存する外部クラスの数
Lines of Code rejected by parserxo解析に失敗した行数

ステートメント数
CppNcss で計測できるのは、ステートメント数(NCSS)です。
一方 CCCC で計測できるのは、コード行数(LOC)です。

以下のコードで比較してみました。
class X
{
    int value;
public:
    int getValue() { return value; }
    void setValue(int v)
    {
        value = v;
    }
};

int f()
{
    int a=0;
    int b=0, c=0;
    
    // loop
    for( int i=0; i < 10; ++i )
    {
        do
        {
            while(1)
            {
                ++a;
                break;
            }
        } while(0);
    }
    
    if( a != b )
    {
        if( a != c ) {
            X x;
            x.SetValue(a);
            c = x.
                GetValue();
        } else {
        }
    }
    else
    {
    }
    
    a = b; b = c; c = a;
    return b;
}

int main(int, char**)
{
    f();
    return 0;
}

CppNcss の結果
Nr. NCSS CCN Function
1 19 6 f() at main.cpp:14
2 3 1 main( int, char** ) at main.cpp:50
3 2 1 X::getValue() at main.cpp:7
4 2 1 X::setValue( int ) at main.cpp:8
Average Function NCSS: 6.50
Average Function CCN: 2.25

CCCC の結果

全く別物であることがわかりますね。


さて、ステートメント数の計算についてもう少し調べてみたいと思います。
今度はこちらのコードを CppNcss にかけます。

int a=0;

void for_()
{
    for( int i=0; i < 10; ++i )
    {
        ++a;
    }
}

void do_()
{
    do
    {
        ++a;
    } while(1);
}

void while_()
{
    while(1)
    {
        ++a;
    }
}

void if_()
{
    if(1)
    {
        ++a;
    }
    else
    {
    }
}

void elseif_()
{
    if(0)
    {
    }
    else if(1)
    {
        ++a;
    }
    else
    {
    }
}

void switch_()
{
    switch(a)
    {
    case 0:
        ++a;
        break;
    }
}

void switch2_()
{
    switch(a)
    {
    case 0:
        ++a;
        break;
    case 1:
        break;
    }
}

void switchdefault_()
{
    switch(a)
    {
    case 0:
        ++a;
        break;
    default:
        break;
    }
}

void cond_()
{
    a > 0 ? --a : ++a;
}

class A
{
public:
    int get() const { return 1; }
};
class B
{
    A a;
public:
    const A* get() const { return &a; } 
};

B b;
void call_()
{
    b.get();
}
void call2_()
{
    b.get()->get();
}

こちらのコードを解析した結果がこちら。
Nr. NCSS CCN Function
1 7 3 switch2_() at main.cpp:62
2 7 2 switchdefault_() at main.cpp:74
3 6 3 elseif_() at main.cpp:38
4 5 2 switch_() at main.cpp:52
5 4 2 if_() at main.cpp:27
6 3 2 for_() at main.cpp:3
7 3 2 do_() at main.cpp:11
8 3 2 while_() at main.cpp:19
9 2 2 cond_() at main.cpp:86
10 2 1 A::get() at main.cpp:94
11 2 1 B::get() at main.cpp:100
12 2 1 call_() at main.cpp:104
13 2 1 call2_() at main.cpp:108
Average Function NCSS: 3.69
Average Function CCN: 1.85

想定した結果になりました。とくに言うことはありませんね。
(switchdefault_ と switch2_ で CCN が違うのはこういうもん?)

複雑度
CppNcss の複雑度の計算方法がわかりませんが(CCCC は McCabe)、
こちらも上記の最初のコードで比較してみました。

CppNcssCCCC
f67
main11

これだけではわかりにくいので、Visual Studio 2012 の Win32 プロジェクトのテンプレートコードで比較してみました。
計測できなかったので、スルー。
iutest の結果で比較しようと思いましたが、どちらか片方が計測できていないものばかりで、良いサンプルがなかったので割愛させてもらいます。m(__)m

c++ ファイル以外の計測
CppNcss では、.cpp や .c など標準的な拡張子のファイルしか計測してくれません。
なので、.ipp など独自拡張子を計測することができません。

CCCC の場合は、コマンドライン引数に --lang=c++ とすることで、独自ファイルの計測も可能です。

Jenkins との連携
CCCC の Jenkins との連携はちょっと残念なかんじです。
プロジェクトやモジュール単位の結果をみることができるのですが、関数単位での結果が見れません。
この関数単位での結果が一番みたいところなんですが…


CCCC の結果 xml/html ファイルには関数単位の結果も書き込まれているので、
Jenkins でそれらを見たい場合は HTML Publisher Plugin を使うとよいでしょう。
また、独自に xml を解析して Jenkins で集計可能な xml にするのも手です。
そのへんについては、
ブログズミ: CCCC + Jenkins + HTML Publisher Plugin
ブログズミ: CCCC + Jenkins
を参考にしてください。

CppNcss の方は関数単位の結果を表示してくれます。
Jenkins プラグインは CppNcss の方がイイ感じです。

総評
CppNcss は CCCC と比べて、解析出来る内容は少ないですが手軽に使えそうです。
また、ステートメント数が計測できるのと、CCCC では計測失敗する箇所でも CppNcss なら計測できる場合もあるので、CppNcss と CCCC を両方使うのもありだと思いました。

あとは、集めた情報をどう活かすかになりますが、それはまた今度の機会にでも…(できたら…

2013年6月12日水曜日

[gtest][VS] Google Test Adapter の紹介

Visual Studio 2012 には C++ Unit Test Framework が標準で付いてきます。
こちらのフレームワークは IDE と統合されており、テストエクスプローラーを使って実行やテスト結果の閲覧などができます。

Google Test Adapter は、Google Test をテストエクスプローラーで使うための拡張機能です。
残念ながら、Express では使えません。。。
(あとは、自作フレームワークの iutest でもテストエクスプローラー使えるようにしたいなぁ)

2013年6月5日水曜日

iutest を使って tddbc の課題をやりはじめた

TDDBC でやった課題を iutest を使って書き始めました。
リポジトリは Aessembla で用意しました。https://subversion.assembla.com/svn/iutest_tddbc/
(perforce 使おうと思ったのですが、使いこなすのに時間がかかりそうだったので SVN にしました。)

TDDBC の課題は 大阪3.0 の自販機課題を使い、Red,Green,Refactoring ごとにコミットします。
テストは CloudBees の Jenkins を無料で借りてやります。

のんびりペースになると思いますが、ちょこちょこやっていきたいと思います。

2013年6月3日月曜日

PC が戻ってきた

修理に出していたノートPCが返ってきました。そのまま。
保障限度額超えたので代替保障になるそうです。

まあ、壊れていたノートPCはディスプレイがあれば使えるので、
このまま使い続けるとして、代替品はもうちょっと持ち運びしやすいやつにしようかと思います。
(代替といっても保障額との差分は払う必要があるのでそんな高いのは買えないけど…)

というわけで、趣味プロも再開していきます。
(ネカフェいってやってたけど…)