2014年1月27日月曜日

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

iutest v1.8.0 をリリースしました。
今回の変更点は以下のとおりです。

  • 追加
    • IUTEST_*_EQ_RANGE を追加
    • IUTEST_*_STRIN,IUTEST_*_STRNOTIN を追加
    • IUTEST_FLAG(output) に対応
    • IUTEST_*_NO_FAILURE の gtest モード対応
    • Visual Studio Type Visualizer 用 .natvis ファイルを追加
    • AVR 対応
  • 変更
    • IUTEST_USE_THROW_ON_ASSERT_FAILURE を IUTEST_USE_THROW_ON_ASSERTION_FAILURE に変更
    • IUTEST_USE_THROW_ON_ASSERTION_FAILURE を指定した場合 SKIP や ASSUME も例外を投げるように変更
    • IUTEST_*_NO_FAILURE が警告やスキップを失敗と判断しないように変更
    • リスナーのセットアップ関数を変更
    • パッケージ内の値のパラメータ化テストのテストケース名が pkg.prefix/testcase となるように変更
    • IUTEST_SCOPED_PEEP,IUTEST_MAKE_SCOPED_PEEP を廃止
    • ソースコードのエンコーディングを UTF8 BOM 有りに変更
  • 修正
    • IUTEST_*_TRUE/FALSE を可変長対応
    • フィクスチャークラス名を IUTEST_TEST マクロのテストケース名に使用した場合にエラーになるように修正(MSVC拡張)
    • Visual C++ Compiler November 2013 CTP 対応
    • バグ修正

追加
EQ_RANGE などの新しい utilty アサーション追加、
未対応だった IUTEST_FLAG(output) と IUTEST_*_NO_FAILURE の gtest モードに対応しました。

あとは、VS Type Visualizer 用の .natvis ファイルを追加しています。
.natvis は Visual Studio のウォッチ式の表示を制御するファイルで、よりわかりやすい評価結果を表示します。
(追加した .natvis では テスト関数中に this からテストケース/テスト名が表示されるようにしてあります。便利かどうかはわかりません。)

Type Viualizer についてはこちらを参考にしてください。
[Visual Studio] デバッガー変数表示のカスタマイズ

変更
今回のバージョンでは少し大きめの変更があります。
まず、IUTEST_SCOPED_PEEP,IUTEST_MAKE_SCOPED_PEEP を廃止しました。
SCOPED のついたマクロは過去のバージョンの互換性のため残してありましたが、今回 IUTEST_MAKE_PEEP のバグ修正を機に廃止しました。

次に、ソースコードの文字コードを「UTF8 BOM あり」に変更しました。
この変更が一番大きいかもしれません。
iutest には日本語テスト名機能がありますが、そのテストコードが SJIS の場合に日本語名を不正な文字コードとしてエラーとなってしまうコンパイラがあったため、UTF8 に変更しました。
テストコードだけ変えれば良い話ですが、複数の文字コードが入り混じるのはよくないと考え「UTF8 BOM あり」に統一しました。
逆に SJIS でないとエラーになってしまうコンパイラもありますが、 iutest のメインターゲットではないので非対応としています。文字コード変換ツールなどで一度変換してからお使いください。
(※ 私は文字コードについて詳しくないのでアドバイス・ダメ出しなどドシドシください。)

次に、IUTEST_PACKAGE を利用した際のテストケース名を変更しています。
具体的には、これまではパッケージ化された値のパラメータテストのテストケース名は「prefix/package.testcase」となっていましたが、「package.prefix/testcase」になりました。
これは Jenkins でのテストケース名表示を考慮しての変更になります。


最後は、SKIP や ASSUME フレーバーに対する挙動で不自然だった部分を変更しました。
制御用マクロも若干変わっていますのでご注意ください。(旧マクロ名も一応まだ使えます。)

修正
修正はバグ修正が主ですが、2点だけとりあげておきます。

1つ目は、IUTEST_*_TRUE,IUTEST_*_FALSE で可変長マクロ引数対応をしました。
これにより、template 引数を複数指定するような記述で () で囲う必要がなくなりました。
template<int A, int B>
bool f() { return A == B; }
IUTEST_ASSERT_TRUE( f<1, 1>::value ); // OK

2つ目は、テストフィクスチャを定義したのにそれを使わないでテストを書いた場合にコンパイルエラーにする仕組みを入れました。
(※ ただし、__if_exists が使えるコンパイラに限ります。)
これは、自分自身がはまったから導入した機能で、
static int a=0;
class Hoge : public iutest::Test
{
protected:
    static void SetUpTestCase() { a = 1; }
};

IUTEST(Hoge,Test)
{
    IUTEST_ASSERT_EQ(1, a);
}
上記のように、本来ならば IUTEST_F(Hoge, Test) と書くべきところを、誤って IUTEST(Hoge, Test) と書いてしまったため、このテストでは Hoge::SetUpTestCase が呼ばれずテストが失敗してしまいます。
今回入れた機能により、上記コードがエラーになるようにしました。


すぐ気づきそうなミスですが、自分は結構悩んだので…
(ライブラリの初期化を SetUpTestCase で呼ぶようにしていて、テストで使用した API のエラーコードが「** は見つかりません」的なエラーコードが返るから、初期化されてないことに気付かなかった…(「初期化されてません」ってエラーコードだったらすぐわかったのになぁ…))

最後に
v1.8.0 については以上です。
iutest のご意見・バグ報告など頂けると、私がとても喜びます。
Google GroupSourceForgegithub または、このブログや twitter などでも構いません。よろしくお願います。

2014年1月22日水曜日

Windows で clang のビルド

Windows でも clang が使えるようにビルドしてみたので、個人用備忘録として残しておきます。
※ 完全に自分用の記事です。自分がした手順をまとめているだけです。
※ この手の情報は検索すればよく出てくるので、そちらを参考にしてもらったほうが良いです。

参照:
clang/LLVMをWindowsでビルドする - 原色奈良阪
LLVM を Windows で使う(clang 編) - 電脳スピーチ blog

準備したもの
MinGW
http://www.mingw.org/ からインストーラーをダウンロードしてセットアップ
※ 筆者環境は Windows 8 のためか、64bit 版の MinGW が必要になった。途中でダメなことに気づき 64bit 版のセットアップをしました。

CMake
cygwin の cmake は MinGW の Generator がなかったので、http://www.cmake.org/ から Windows インストーラーをダウンロードしてパスを通しました。

LLVM/clang
http://llvm.org/ のダウンロードページから LLVM source code と Clang source code をダウンロードし、
任意の場所に展開しました。
Clang は展開した後 clang にリネームして、llvm-3.3.src\tools に移動しました。


ビルド
パスを通す
MinGW のパスを環境変数に設定していないので、コマンドプロンプトを開いた後パスを通しました。
set path=C:\MinGW\bin;%PATH%
cmake
cmake のワーキングディレクトリとして、適当にフォルダを作成します。
今回は、build として作成しました。作成後、build ディレクトリに移動し cmake を実行します。
llvm-3.3.src>mkdir build
llvm-3.3.src>cd build
llvm-3.3.src>cmake -G "MinGW Makefiles" -D CMAKE_INSTALL_PREFIX=C:\usr\LLVM ..

libiconv-2.dll
cmake を実行したら libiconv-2.dll がないと言われて失敗してしまいました。
検索してもいまいちわからなかったので、msys の bin にあった msys-iconv-2.dll を C:\MinGW\bin にリネームしてコピーしました。
(今思えば コマンドプロンプトからではなく msys でやるべきだったのかも)

make
cmake が完了したら、build ディレクトリで make をします。
ビルドエラー
70% くらい進んだところでビルドエラーが発生
llvm-3.3.src\tools\clang\lib\Basic\FileManager.cpp:317:73: err
or: no matching function for call to 'clang::FileManager::getStatValue(const cha
r*&, _stat64i32&, bool, int)'
   if (getStatValue(InterndDirName, StatBuf, false, 0/*directory lookup*/)) {
検索したところ以下のサイトがヒットしました。
http://comments.gmane.org/gmane.comp.compilers.clang.devel/32242
そこから以下のサイトを参考にしたら解決したとのことなので、私も参考にしました。
https://github.com/KhronosGroup/webcl-validator#building-with-windows-mingw--msys
これによると、64bit 版の MinGW を使えってことのようです。
早速、MinGW 64bit 版をダウンロード、セットアップし、同様にビルドしました。
MinGW 64bit 版のセットアップはこちらを参考にしました。
PENGUINITIS - MinGW 64 bit 版 のセットアップ

ビルド(MinGW 64bit)
MinGW 64bit 版をセットアップし、 cmake からやり直しました。
(make.exe がなかったので mingw32-make.exe をコピー・リネームしました。)

これで無事ビルド完了。

最後に make install をします。
CMAKE_INSTALL_PREFIX で指定したパスにインストールされます。

Visual Studio でビルド
そもそもの目的が libclang 使ったツールを作ることだったので、Visual Studio でビルドしました。

LLVM と clang のソースを取得するとこまでは一緒で、cmake するときの -G オプションを "Visual Studio 10" にします。
cmake が無事に終わると Visual Studio のプロジェクト/ソリューションが出来上がるので、それを Visual Studio で開いてビルドするだけです。

特に問題なくビルドできました。
これで libclang が使えます。

Clang for Windows
先日リリースされた Clang for Windows には libclang が付いているので、libclang が使いたいだけならこれをインストールするだけで OK でした。。。

まぁ、ともあれ。
libclang のことは知らないことだらけなので、これから少しずつやっていこうかと思います。

2014年1月20日月曜日

[LLVM 3.4] Clang for Windows を使ってみた

clang 3.4 から Visual Sutdio 向けのツールセットが使えるようになりました。
これに関しては二、三番煎じもいいとこなので、説明を省きます。
Happy my life » Clang 3.4をVisualStudioから利用する

さて、早速 clang for windows をインストールして使ってみたのですが、
警告やらエラーだらけでビルドできませんでした。

その辺の解決方法を記しておきます。

warning : argument unused during compilation
warning : argument unused during compilation: '/Gm'

まず、コンパイラオプションに対して警告が出ます。
こちらは公式ドキュメントにも書いてあるとおりに、"-Qunused-arguments" オプションをつけると無視されます。

type_traits
type_traits ヘッダーでエラー
error : '_Ty' does not refer to a value
error : expected class name
__is_constructible などの builtin 機能がないためエラーになっているようです。
バグ報告もされています。
Bug 17926 – clang-cl: error compiling VC++12 type_traits header

type_traits ヘッダーは vector や tuple などから include されているので、単純に type_traits を include しないだけでは回避できませんでした。
ちょっと回避策もないので、次バージョンまで待とうと思います。。。

2014年1月17日金曜日

[Visual Studio] ウォッチをより便利に使う10の書式

Visual Studio のウォッチ式で使える便利な書式を紹介したいと思います。
(※ Visual Studio 2013 を対象としています。古いバージョンでは使えないものもあります。)

説明用サンプルコード
class B { 
    int a, b, c; 
    virtual void f() {}
};
class D : public B { int x, y, z; };

int main()
{
    D d;
    B* b = &d;

    ::std::vector<int> v{ 0, 1, 2 };

    int a[1024];
    for( int i=0; i < _countof(a); ++i ) a[i] = i;

    void* p = a;
    unsigned char* p8 = reinterpret_cast<unsigned char*>(a);

    char str[] = "Hello world.";
    void* pstr = str;

    DWORD dwWC = WS_CAPTION;
    DWORD dwMsg = WM_ACTIVATE;

    return 0;
}

1. 配列表示
「var, 4」
要素数を指定することで配列でない型でも配列表示できます。


2. 基数指定表示
基数
d10進数
u10進数(符号なし)
o8進数
x, h16進数(小文字)
X, H16進数(大文字)

右クリックメニューで 16進表示の ON/OFF が変更できますが、これはすべてのウォッチ式に適応されます。
1つだけ 16進で見たい場合などには上記書式を使うと便利です。
また、あまり使う機会は少ないかと思いますが 8進表示もできます。


3. 文字列指定表示
文字
c単一文字
s(b)ASCII文字列
su(b)UNICODE文字列
s8(b)UTF8文字列
bstrBSTR文字列

変数を文字列として表示します。
文字列型ではないが文字列が格納されている場合などに使います。
b を付けた場合「"」で囲まれずに表示されます


4. HRESULT表示
「var, hr」とすることで値を HRESULT名(define名)+メッセージで表示できます。
数値ではわかりにくいメッセージID もこれならすぐにわかります。


5. Windows メッセージ・クラスフラグ表示
「var, wm」とすることで HRESULT と同様に値を WM_*** のような define名で表示できます。
「var, wc」とすると値をクラスフラグ名(define名)で表示できます。


6. アドレス・派生クラス非表示
「ptr, na」とするとアドレスが非表示になります。
「ptr, nd」とすると派生クラスが非表示になります。


7. simple 表示
「var, view(simple)」
Visual Studio 2013 から追加された機能で、view(xxxx) とすることで表示非表示の選択ができるようになっています。
::std::vector の場合、view(simple) とすることで size と capacity を非表示にできます。


8. 組み合わせ
ここまで紹介してきた書式は組み合わせて使うことができます。
たとえば、アドレス・派生クラスの非表示で16進数表示する場合は、「var, nandx」と書きます。


9. カスタマイズ表示の無効化
「var, !」とするとカスタム表示ではなく、型そのままの表示がされます。


10. 擬似変数
ウォッチでは下記のような特殊な情報も表示できます。
$handlesアプリケーションに割り当てられているハンドル数
$vframe現在のスタックフレームのアドレス
$tid現在のスレッドID
$env環境変数
$cmdlineコマンドライン引数
$pidプロセスID
$(registername)レジスタの値
@(registername)レジスタの値
$clkクロック周期
$userアプリケーションの実行ユーザー情報を表示

通常なら関数呼び出しで取得するような情報ですが、
擬似変数を使えばコードに仕込まなくても閲覧できるので非常に便利です。


また、これらは式の一部としても使えるので、
ESP レジスタが指す場所の値を見たいときは「*(int*)@esp」とすると見れます。




最後に
いかがでしたでしょうか?
こちらで紹介した内容は MSDN にも載ってますのでそちらも参考にしてください。

また、今回はウォッチでの書式についてでしたが、Visual Studio ではカスタムビューという仕組みもあり、
それを利用することで vector のような見やすい表示にすることができます。
カスタムビューについてはこちらを参考にしてください。
ブログズミ: [Visual Studio] デバッガー変数表示のカスタマイズ

2014年1月14日火曜日

[Visual Studio] デバッガー変数表示のカスタマイズ

Visual Sutdio には「自動変数」や「ローカル」ウィンドウの変数表示をカスタマイズする機能があります。
例えば、std::vector が図のように表示されるのもこの機能のおかげです。


Visual Studio 2010 以前は autoexp.dat ファイルを編集していたのですが、
Visual Studio 2012 以降は xml形式の .natvis ファイルに変更になっています。

ここでは Visual Studio 2012 以降で説明したいと思います。
デフォルトの .natvis は "%VSINSTALLDIR%\Common7\Packages\Debugger\Visualizers" にあります。
ユーザーが定義した .natvis は "%USERPROFILE%\My Documents\Visual Studio 2012\Visualizers" に保存します。

書き方は MSDN に載っているので、こちらを参考にしてください。
http://msdn.microsoft.com/ja-jp/library/jj620914.aspx
デフォルトインストールされているファイルがあるので、それも参考になると思います。

また、Visual Studio 2013 から使える書式もあるようです。

.natvis ファイルはデバッグ実行する度にロードされるので、編集したら再実行する必要があります。
(Visual Studio 自体の再起動は不要)

.natvis を書くのがメンドクサイという方のために、すぐに使えるものを紹介しておきます。

2014年1月10日金曜日

Google Test を -std=c++11 でビルドするとエラーになっていたので修正した

たまたま、-std=c++11 でビルドしたらエラーが出たので対処してみました。

環境
・cygwin
・gcc 4.8.2
・Google Test 1.7.0

エラー出力
$ make CXXFLAGS="-std=c++11 -Wall -Wextra"
g++ -isystem ../include -std=c++11 -Wall -Wextra -c ../samples/sample1_unittest.
cc
In file included from ../include/gtest/internal/gtest-internal.h:40:0,
                 from ../include/gtest/gtest.h:58,
                 from ../samples/sample1_unittest.cc:48:
../include/gtest/internal/gtest-port.h: 関数 ‘int testing::internal::posix::Fil
eNo(FILE*)’ 内:
../include/gtest/internal/gtest-port.h:1741:51: エラー: ‘fileno’ was not decla
red in this scope
 inline int FileNo(FILE* file) { return fileno(file); }
                                                   ^
../include/gtest/internal/gtest-port.h: 関数 ‘char* testing::internal::posix::S
trDup(const char*)’ 内:
../include/gtest/internal/gtest-port.h:1747:57: エラー: ‘strdup’ was not decla
red in this scope
 inline char* StrDup(const char* src) { return strdup(src); }
                                                         ^
../include/gtest/internal/gtest-port.h: 関数 ‘FILE* testing::internal::posix::F
DOpen(int, const char*)’ 内:
../include/gtest/internal/gtest-port.h:1779:71: エラー: ‘fdopen’ was not decla
red in this scope
 inline FILE* FDOpen(int fd, const char* mode) { return fdopen(fd, mode); }
                                                                       ^
Makefile:79: recipe for target 'sample1_unittest.o' failed
make: *** [sample1_unittest.o] Error 1

-std=c++11 を指定すると、__STRICT_ANSI__ が定義されるため、strdup などの宣言がされなくなるため、ビルドエラーになってしまうようです。
strdup などは、Google Test の実装で実際に利用しているので、ダミーの空関数にするわけにもいきません。
strdup ならまだ自前実装できそうですが、fdopen などは大変そうです。

なので、良い方法なのかはさておき以下のように修正することで対応しました。

include/gtest/internal/gtest-port.h
// Environment variable utilities:
//   GetEnv()             - gets the value of an environment variable.
//   BoolFromGTestEnv()   - parses a bool environment variable.
//   Int32FromGTestEnv()  - parses an Int32 environment variable.
//   StringFromGTestEnv() - parses a string environment variable.

/**** ここから ****/
#ifdef __STRICT_ANSI__ 
#  undef __STRICT_ANSI__ 
#  include <cstdio>
#  include <string.h>
#  include <stdlib.h>
#  define __STRICT_ANSI__
#endif
/**** ここまで ****/
#include <ctype.h>   // for isspace, etc
#include <stddef.h>  // for ptrdiff_t
#include <stdlib.h>

src/gtest-main.cc
/**** ここから ****/
#ifdef __STRICT_ANSI__ 
#  undef __STRICT_ANSI__ 
#  include <stdio.h>
#  define __STRICT_ANSI__
#endif
/**** ここまで ****/

#include "gtest/gtest.h"

GTEST_API_ int main(int argc, char **argv) {

__STRICT_ANSI__ が定義されていたら、undef して必要なヘッダーを include しています。
これで -std=c++11 でもビルドが通るようになりました。

とりあえず、動作もしました。
$ ./sample1_unittest.exe
Running main() from gtest_main.cc
[==========] Running 6 tests from 2 test cases.
[----------] Global test environment set-up.
[----------] 3 tests from FactorialTest
[ RUN      ] FactorialTest.Negative
[       OK ] FactorialTest.Negative (0 ms)
[ RUN      ] FactorialTest.Zero
[       OK ] FactorialTest.Zero (0 ms)
[ RUN      ] FactorialTest.Positive
[       OK ] FactorialTest.Positive (0 ms)
[----------] 3 tests from FactorialTest (3 ms total)

[----------] 3 tests from IsPrimeTest
[ RUN      ] IsPrimeTest.Negative
[       OK ] IsPrimeTest.Negative (0 ms)
[ RUN      ] IsPrimeTest.Trivial
[       OK ] IsPrimeTest.Trivial (0 ms)
[ RUN      ] IsPrimeTest.Positive
[       OK ] IsPrimeTest.Positive (0 ms)
[----------] 3 tests from IsPrimeTest (11 ms total)

[----------] Global test environment tear-down
[==========] 6 tests from 2 test cases ran. (25 ms total)
[  PASSED  ] 6 tests.


github: https://github.com/srz-zumix/gtest_patch

2014年1月6日月曜日

SonarQube で C++ のコードを解析してみた

C++ の静的解析にはこれまで cppcheck を使ってきましたが、今回は SonarQube を使ってみたいと思います。
※ SonarQube で C++ の解析をする場合、プラグインのライセンス購入が必要になります。本記事ではトライアルキーを使用しています。

セットアップ~サンプルの解析
まずは環境をセットアップしたいと思います。
手順は公式ドキュメントを参考にしました。

サーバープログラムのセットアップ
ダウンロードページから sonarqube-X.X.zip をダウンロードします。X.X はバージョン番号です。
今回は 2013/11/21(検証したのが去年なの…) 時点での最新である、4.0 を使用しました。
ダウンロードしたら、解凍します。
保存先は C:\sonarqube か /etc/sonarqube にしましょうと書いてありますが、今回は D:\sonarqube\sonarqube に保存しました。

つづいて、プログラムを起動します。
sonarqube\bin\windows-x86-32\StartSonar.bat を実行すると以下のような画面が出ます。


クライアントのセットアップ
クライアント側をダウンロードします。
ダウンロードページの SonarQube Runner のところから sonar-runner-dist-X.X.zip をダウンロードしてください。(2013/11/21 時点での最新である、2.3 を使用しました。)
保存先は C:\sonar-runner か /etc/sonar-runner にしましょうと書いてありますが、今回は D:\sonarqube\sonar-runner に保存しました。

サンプルの解析
公式ドキュメントの手順 4. のダウンロードリンクからサンプルがダウンロードできるので取得し、解凍します。
保存先は C:\sonar-examples か /etc/sonar-examples にしましょうと書いてありますが、今回は D:\sonarqube\sonar-examples に保存しました。

展開したら、コマンドプロンプトで D:\sonarqube\sonar-examples-master\projects\languages\java\sonar-runner\java-sonar-runner-simple まで移動し、そこで sonar-runner.bat を実行します。
D:\sonarqube\sonar-runner\bin\sonar-runner.bat

INFO: ------------------------------------------------------------------------
INFO: EXECUTION SUCCESS
INFO: ------------------------------------------------------------------------
と、出力されたら成功です。
http://localhost:9000/ にアクセスすると以下のように結果が見れます。

プロジェクトページはこんな感じ。


C++ で試す
Java の解析ができたので、次は C++ を解析したいと思います。
SonarQube で C++ の解析をするためには、プラグインが必要になります。
こちらからプラグインがダウンロードできます。
sonar-cpp-plugin-X.X.jar(2013/11/21 時点での最新である、1.6 を使用しました。) がダウンロードされるので、そのファイルを
sonarqube\extensions\plugins にコピーします。

次にサーバーを再起動し、http://localhost:9000/ を開きます。
右上の Login ボタンをクリックし、administrator アカウントでログインします。
(デフォルトでは admin/admin)



ログイン後、右上の Setting ボタンをクリックします。
設定ページが開くので、General Settings > Licenses を開くと図のようなページが開きます。

C/C++ のライセンス入力ボックスにキーを入力します。(本記事ではトライアルキーを使用)

ライセンスキーの入力が完了したらプラグインを使用できるようになります。
まずは、サンプルを解析しました。
sonar-examples-master\projects\languages\cpp\cpp-sonar-runner で java の時と同様に sonar-runner.bat を実行します。
問題なく解析でき、以下のように結果が得られます。


サンプルの結果は公式ページからも見ることができるので、どんなものかすぐに見たい方はこちらからどうぞ。
http://nemo.sonarqube.org/dashboard/index/poco.net

iutest で試す
自作テスティングフレームワークの iutest を解析してみました。
結果がこんな感じ。

結構な数が出ました…ちまちま修正していきます…

Jenkins との連携
Jenkins との連携もできます。プラグインは Sonar plugin です。
その辺についてはこちらでは省きます。
詳しく知りたい人は、以下が参考になると思います。(セットアップも詳しく書かれています。)
SonarQubeをWindows環境で使ってC#コードを解析する - 亀岡的プログラマ日記
SonarとJenkinsを連携させる - 亀岡的プログラマ日記

感想
使ってみた感想。
検出数は多いのですが、コーディングルールに関するものが多くクリティカルな問題はあまり検出されないように感じました。(nullptr デリファレンスを検出できるか試したが、出なかった(※サンプルコードが悪かったのかもしれないが…))
複雑度やコード重複なども出力されるのでメトリクスツールとしては使えそうでした。

MIRSA や長い行・関数・引数、複雑度の高いものなどなど出ますが、自分のコーディングスタイルと合ってなかったり、直しようのないものもあったりしたので、これらの警告を無視/無効にする方法を調べないといけないと思いました。(トライアルライセンスの期限が切れてしまってるが…)

あとは、今回トライアルライセンスで検証しましたが、ライセンスが有料で € 7,000 するのがネックでしょうか・・・