08 Sep 2012, 10:00

GoogleTestをC言語で使う方法をハックしてみた

頭文字だけでスゴイ!GoogleTestの特徴

GoogleTestとは、C++用の単体テスト用のツール。

このツールの優れているところは、

  • 日本語ドキュメントが充実しているところ
  • テストスイートをかかなくても、自動でテストスイートを作成してるれるところ
  • GUI 表示をするツールがある(Guiter)ので、楽しい。

    (http://code.google.com/p/gtest-gbar/)

image

なにより、

頭文字が “ Google”

なので、理由もなく愛用中。

ダウンロードはココから:http://code.google.com/p/googletest/

C++でのつかいかたはここから:Google Test ドキュメント日本語訳

GoogleTestはC言語でも使えます

C++用のツールなのだが、実はC言語でも使う裏ワザがあるのだ。

ポイントは、はテスト関数を.cppでつくり、

テストしたいC言語用のヘッダファイルをextern”C”{}で囲むこと。

実は、これだけで使えるようになる。

[c]

#include “gtest/gtest.h”

extern “C”

{

#include “sample.h”

}

TEST(AddTest, Test1)

{

ASSERT_EQ(2, add(2, 1));

}

[/c]

 

これであなたも C言語で「レッド」→ 「グリーン」→ 「リファクタリング」(゜ ▽ ゜)/

GoogleTestがC言語で使えるようになったら、

つぎは兄弟ツールのGoogleMockをC言語で使ってみよう。

GoogleMockをC言語で使う方法をハックしてみた

02 Sep 2012, 08:39

Selenium RCで自分のPCからテストケースを実行する

Selenium IDEでテストケースができたけれど、

これではいちいちブラウザから起動しないとテストを実行できない。

定期的に実行することを自動化するためには、Selenium RCを入れる。

Selenium RCでコマンドラインからテストを実行する

Selenium RCを使うことで、

Selenium IDEで作成したテストソースをコマンドラインから実行できる。

コマンドラインから実行できれば、あとはそれをJenkinsでスケジューリングすれば

よいというわけだ。というわけで、Selenium RCを導入する。

Selenium RCはServerとDriverの2つの部品からなる。

まずは、サイトからSelenium Serverをダウンロード。(日本語サイトは古い)

http://seleniumhq.org/download/

Selenium Serverは以下の形式で実行する

java -jar seleium-server.jar <テストスィートのURL> <テスト結果を出力するファイル>

前回作成した Selenium IDEのテストスイートを実行するには、

パラメータは以下をセット

*firefox
http://www.google.com
<テストスィートのURL> C:\Selenium\1day_post_pure.html
<テスト結果を出力するファイル> C:\Selenium\TestResult.html

コマンドプロンプトより、コマンド実行。

java -jar selenium-server-standalone-2.25.0.jar -htmlSuite “*firefox”

http://www.google.com&#8221; “C:\Selenium\1day_post_pure.html”

“C:\Selenium\TestResult.html”

02 Sep 2012, 03:12

JenkinsをWindowsPCにインストールする

 

サーバ選定

本来ならば、常時稼動のサーバ上にJenkinsを入れたい。

今は、さくらインターネットとロリポップのサーバを借りているが、どちらもJenkinsが動かないようなので、とりあえずは自宅PCに。

ちょうしに乗ってきたらサクラVPSを契約するかな。

まあ、今でもかなり常時可能なので、要件は満たしているけどね;(^.^);

JenkinsをWindowsPCにインストールする

  1. 公式サイト(http://jenkins-ci.org/)にアクセスする。
  2. 右のサイドバーにある [Or native package]からWindowsを選択する。image
  3. ダウンロードしたファイルを解凍し、インストーラを起動(setup.exeのほう)
  4. Webブラウザから「http://localhost:8080」にアクセス。
  5. Jenkins導入完了!

image

 

参考:Windows環境でもJenkins -執事さんとご対面-

25 Aug 2012, 22:26

そろそろ『test driven development for embedded c』について書いてみる

1年以上前からずっと読んでいる本について書いてみる。

『test driven development for embedded c』

はじめに

C言語を使った組込み開発でテスト駆動開発をどう実践するかについてかかれた本である。

この本は、印刷された本のみではなくて、電子書籍としても販売されているのが嬉しい。しかも、電子書籍上のURLをクリックすると、その部分のソースをダウンロードできるところが、またなんともいえなく感動的である。

自分は、はじめは通勤中に本をカバンにいれて読んでいたのだけれども、ある日上司に勝手にバックのなかを覗かれて、

『これはなんだ!』

と、エロ本を見つけた先生のようにニヤけながらいわれたのが嫌で、電子書籍を購入した。

(電子書籍はここから)

http://pragprog.com/book/jgade/test-driven-development-for-embedded-c

内容について

はじめはテスト駆動開発のことが述べられているのだが、だんだんと関係ない話題が出てきて、C言語でオブジェクト指向ライクに書くための方法だったりが混じってきて、最後のほうはTDDとはあまり関係なく、いかにして”Clean Code”をかくかということに主眼が移っていくことが、?と!で面白かった。

簡単な要約

  • 序章:TDDってなに?
  • 第1章:Unityを使ってTDDしてみる
  • 第2章:TDD応用編。テストダブル(Test Double)の紹介。ダミーファイルを使ってコンパイルする置換方法(Link-time substitution)、Test Spy、関数ポインタを使った置換方法(Function pointer substitution)、モックオブジェクトの使い方などなど。
  • 第3章いかにしてClean Codeを書くかの説明。そのための手段としてTDDを使いましょうということ。SOLIDの原則、オブジェクト指向ライクなCの書き方、リファクタリング、レガシーコードとの付き合い方などなど。

扱っているテストツールについて

  • Unity
  • CppUTest

の2つが紹介されている。

Unityは軽量なツールなので、結構良かった。

CppTestは、TestSuiteを作成しなくても、自分で作成してくれるところがいいところ。ほかにも、様々なサボートツールがついている(モックオブジェクト作成用のCppUMock、関数ポインタを置き換えるツールUT_PER_SET)ので、便利(これもすべて、書籍のなかでつかいかたは説明されている)

自分で作ったごみwikiのリンクもついでに貼っておこう。

http://www.wikihouse.com/fox10225fox/index.php?CppUTest

TDDの他のオススメ本についてのゴミlinkもついでに貼っておこう。

TDD テスト駆動開発 2012年 オススメ本ランキング

おわりに

仕事がC言語で組込み開発な自分にとっては最上のTDDバイブルだった。年甲斐もなく、ボロボロになるまで読んでいる。スルメイカのように、読めば読むほどに発見があるので、1年たった今でも新鮮だ。

(2013/10/22 追記)

日本語訳がでたようだ。

16 Jul 2012, 05:10

iRemoconでミクミクにしてやんよ。

はじめに

MMDAgentとiRemoconを組み合わせてみたらなかなか良かったので、まとめてみる。

[http://www.youtube.com/embed/kkcB4gB5A3o]

 

ミクさんに登場してもらうまで

こちらのサイトを参考にしました。

サクライロニガワライ雑記

まずは以下のサイトから、BinaryPackageをダウンロード。

http://www.mmdagent.jp/

MMDAgent.exeを起動すると、メイちゃんが現れるので「こんにちは」と声をかけてみる。

image

これが成功したら、初音ミクのモデルと声を設定する。

モデル

以下のサイトから選択。たくさんあるけど、自分は[初音ミク@七葉1052式]を落としてきた。

http://www6.atwiki.jp/vpvpwiki/pages/298.html

落としてきたモデルは、C:/xxx/MMDAgent/Model/配下にフォルダを作成して配置する。

MMDAgent.fstを開き、140行目あたりの # 0011-0020 Initialization からの

11から下を編集して、モデルファイル(xxx.pmd)を指定する。

ついでに、その下にある2行を消せば、キャラクターの周りのメニューも消えるので、

消したほうが良い。

[text]

11 14 MODEL_EVENT_ADD|bootscreen MODEL_ADD|mei|Model\miku\初音ミク@七葉1052式.pmd|0.0,0.0,-14.0

#12 13 MODEL_ADD|menu|Accessory\menu\menu.pmd|0.0,-4.5,0.0|0.0,0.0,0.0|mei

#13 14 MOTION_ADD|menu|rotate|Motion\menu_rotation\menu_rotation.vmd|FULL|LOOP|OFF

14 15 STAGE|Stage\building2\floor.bmp,Stage\building2\background.bmp

[/text]

再び、MMDAgent.exeを起動して、ミクちゃんにご対面。

image

以下のサイトから、音響モデル(TYPE-a/TYPE-bどちらでもよい)を落とす。

MMDAgent & Project-NAIP wiki

Voice配下にあるフォルダに、落としてきた音声データを上書きする。

コマンド実行をお願いするまで

こちらのサイトを参考にしました。

MMDAgentとPC-OP-RS1で実現するリモコンの音声操作-ナレッジエース

会話からコマンドを実行するには、MMDAgent.fstにシナリオを定義する。

たとえば、電卓を起動して欲しい場合は、こんな感じで記述する。

[text]

1 3 RECOG_EVENT_STOP|ミク SYNTH_START|mei|mei_voice_normal|はい。

232 260 SYNTH_START|mei|mei_voice_normal|電卓つけます。

260 2 SYNTH_EVENT_STOP|mei

[/text]

はじめに、[ミク]と呼びかけて、はいといってくれたら、次の命令を実行させることがミソ。

また、コマンドを実行するには、EXECUTEマクロをつかう。

EXECUTE|(実行したいコマンド)で任意のコマンドを実行できるので、

ここで、後述するTeraTerm用のTTLファイルを指定して、iRemoconへコマンドを送るのだ。

[text]

3 184 RECOG_EVENT_STOP|電気つけて EXECUTE|C:\MMDAgent\Macro\LightsOn.ttl

184 200 SYNTH_START|mei|mei_voice_normal|電気つけます。

[/text]

しかし、これだけでは、多分反応しないだろう。いろいろと言葉を知りすぎているために、

誤認識してしまう。なので、もっとおバカになってもらう。

Julius記述文法の設定

ミクの耳には、オープンソースである音声認識ソフト、Juliusが使われている。

なので、Juliusの記述文法にしたがって、言葉を定義して教える。

まずは、MMDAgent配下にgrammarフォルダをつくって、こんな感じで定義ファイルを作成。

call.grammar

[text]

S : NS_B CALL NS_E

[/text]

call.voca

[text]

% CALL ミク m i k u

こんにちは k o N n i ch i w a

ありがとう a r i g a t o u

なんでもない n a N d e m o n a i

かわいい k a w a i i

みくみくにして m i k u m i k u n i sh i t e

電卓つけて   d e N t a k u t u k e t e

電気つけて   d e N k i k u t u k e t e

電気消して   d e N k i k e sh i t e

% NOISE

sp

% NS_B silB

% NS_E silE

[/text]

作成した2つのファイルは、

Julius 3.5.2に付随しているmkdfa.plを落としてきてコンパイルする。

http://sourceforge.jp/projects/julius/downloads/21175/julius-3.5.2-win32bin.zip/

[text]./mkdfa.pl call[/text]

苦労したこのエントリも参考にしてください。

cygwin 環境で mkdfa.plが動作しない

最後に、/MMDAgent/AppData/Julius配下にjconf.txtというファイルがあるので、

文末に以下の行を追加。

[text]

-nogram

-gram “C:\MMDAgent\grammar\call”

[/text]

-nogramで、すでに登録されている単語をすべて忘れて、
次の行で、今回自分が用意した単語と文法を教えてあげる。
(詳しくはココ)JuliusBook 第7章 言語モデル

iRemoconの設定

まずはiRemoconの調達を。

 

iRemoconに通信するTTLファイルの作り方は以下を参照(結構たいへんなので、説明は割愛)iRemocon 音声操作設定

作成したTTLファイルを音声から実行すると、ミクさんが電気をつけてくれます。

まとめ

5月ごろに以下の動画をみて、自分も家のオートメーション化をしてみたけれど、

ようやく完成な気がした。

MMDAgentは、これからもまだまだ可能性が広がっていきそうだ。

日本製のオープンソースなので、Siriに負けずに頑張って欲しい。

08 Jul 2012, 22:07

初音ミクにiRemoconをつかわせてみた

前回の投稿で、Juliusとの連携はできたので、次はMMDAgentと組み合わせてみた。

以下のサイトのエントリを参考。

MMDAgentにミクさんを表示させるまで ~補足編その1~

サンプルのMMDAgent.fstに追加したい動作を記述。

実行コマンドは、Juliusで使っていたteratermマクロを指定。

[text]

# 0121-0130 AirControlOn

1 121 RECOG_EVENT_STOP|エアコン,つけて EXECUTE|C:\Users\xxx\Dropbox\src\MMDAgent\Macro\AirControlOn.ttl

121 122 SYNTH_START|mei|mei_voice_normal|エアコンつけます。

122 2 SYNTH_EVENT_STOP|mei

# 0131-0140 AirControlOff

1 131 RECOG_EVENT_STOP|エアコン,消して EXECUTE|C:\Users\xxx\Dropbox\src\MMDAgent\Macro\AirControlOff.ttl

131 132 SYNTH_START|mei|mei_voice_normal|エアコン消します。

132 2 SYNTH_EVENT_STOP|mei

[/text]

ただ、サンプルのままだと100発1中の認識率の悪さ・・・・。

なので、ここでもJuliusでつかっていた記述文法を流用。

MMDAgent\AppData\Julius配下にjconf.txtというファイルがあるので、

文末に以下の定義を追加した。

[text]

-nogram

-gram “C:\Users\xxx\Dropbox\src\HAL1000\grammar\please”

-gram “C:\Users\xxx\Dropbox\src\HAL1000\grammar\call”

-gram “C:\Users\xxxDropbox\src\HAL1000\grammar\mode”

[/text]

-nogramで、すでに登録されている単語をすべて忘れて、

次の行で、今回自分が用意した単語と文法を教えてあげる。

(詳しくはココ)JuliusBook 第7章 言語モデル

そうすると、

メイちゃんは今までの記憶をすべてわすれ、

再帰的に、ひたすらエアコンをつけようとする。(それしか単語を知らない)

きっと地球が滅びるその日まで、ひたすら彼女はエアコンをつけ続けるだろう。

MMDAgentで、初音ミクのモデルも試してみた。

メイちゃんよりもこっちのほうが頭がいいみたい。

08 Jul 2012, 21:36

JuliusとiRemoconを組み合わせて、部屋の音声認識システムをつくった

JuliusとiRemoconを組み合わせて、部屋の音声認識システムをつくった。

出来栄えは、こんな感じ。

[http://www.youtube.com/embed/N6uw2pMFC1s]

 

参考にしたのはこのサイト。

リモコンはオワコン。音声認識でお部屋の家電を操作してみた。

C++の知識のなさと、Boooooooooooooooooostなコンパイル時間と

戦いつつも、とりあえずの目標達成。

iRemoconを購入してから85時間の戦いだった。

定義した命令はこんな感じ。

テレビ(を|)つけて

エアコン(を|)つけて

エアコン(を|)消して

電気(を|)つけて

天井灯(を|)つけて

すべての電気(を|)つけて

電気(を|)消して

天井灯(を|)消して

すべての電気(を|)消して

MorningMode

SleepMode

RelaxMode

SexyMode

PartyMode

(うるさい|だまって)

ボリューム(を|)大きくして

ボリューム(を|)小さくして

アプリケ-ション起動

Chrome(を|)つけて

Ottava(を|)つけて

Twitter(を|)つけて

Toggl(を|)つけて

Gmail(を|)つけて

Youtube(を|)つけて

ニコニコ(を|)つけて

TVタックル(を|)つけて

こんにちは

おはよう

おやすみ

いってきます

ただいま

ありがとう

きこえてる

今日の天気(を|)教えて

明日の天気(を|)教えて

今何時

今日は何日

ライバルを教えて

今週の目標を読み上げて

 

あとは、Webカメラでモーションを捉えたらコマンド実行するようにして、

家のドアを開けると「おかえりなさい」をしてくれるようにした。

 

本当ならばここで、

「おかえりなさい、ご飯にする?お風呂にする?それとも・・・あたし?」

と、いわしめたいものぞ。悲しき独身生活・・・(´・ω・`)

08 Jul 2012, 02:37

Cygwin で新しいg++を使うためのメモ

Cygwin での g++ のオプションで -std=c++0xが使えないでハマった。

まず、boost ライブラリで libboost_system-mt.aをリンクさせようとしたところ、コンパイルエラーとなる。

__Unwind_Resume

どうやら、c++0x てないと、コンパイルが通らないようだ。
なので、-std=c++0x のコンパイルオプションをつけようとしたところ
コンパイラオプションが認識されなかった。

いろいろ調べたところ -std=c++0xはg++ 4.3以降でないと、
有効ではないらしい。
そして、 Cygwinではデフォルトの g++は3.4であった。

/usr/bin配下をよく見てみると、 g++.exeとともにg++4.exe というものがあった。

どうやら、この g++4というものが、g++4.5のようだ。

なので、 g++4.exeをg++.exeに名前を変えてみると、
コンパイルを通すことができた。

01 Jul 2012, 05:36

cygwin 環境で mkdfa.plが動作しない

Julius 4.2を利用して、記述文法ファイル(hoge.grammar, hoge.voca)を mkdfa.plを使ってコンパイルしたらエラ-した。

call.grammar has 1 rules
call.voca    has 5 categories and 5 words
---
Error:       Can't open grammar file "/tmp/g9356.grammar"
Error: cannot open "call.dfa.tmp"
---
no .dfa or .dict file generated

調べてみると、Juliusのバージョンが3.5.2ならばコンパイルが通るらしい。
(レベルダウンではないか!)

コンパイルのためだけに tempフォルダに旧バージョンのJuliusを落としてきてコンパイル。
Julius 3.5.2:
http://sourceforge.jp/projects/julius/downloads/21175/julius-3.5.2-win32bin.zip/

実行結果:

$ /cygdrive/c/temp/julius/bin/mkdfa.pl call call.grammar has 1 rules call.voca has 5 categories and 5 words --- Now parsing grammar file "rror: Lexical mistake " --- no .dfa or .dict file generated

 

エラ-の出方が変わった!
調べてみると、文法ファイルがShift-jisなのでエラ-している。
utf-8に変換してコンパイルすると、成功。

call.grammar has 1 rules
call.voca    has 5 categories and 5 words
---
Now parsing grammar file
Now modifying grammar to minimize states[-1]
Now parsing vocabulary file
Now making nondeterministic finite automaton[6/6]
Now making deterministic finite automaton[6/6]
Now making triplet list[6/6]
---
generated: call.dfa call.term call.dict

参考URL

30 Jun 2012, 09:37

C++で boost Lib と windows.hでの競合

結構ハマったので、メモしておく。

Cygwin環境で、Boost ライブラリの正規表現とwindows.hを両方使おうとすると
エラ-してしまう。

原因は #define max.minの競合。

なので、以下のようにインクルードして解決した。

#include <boost/regex.hpp>
#undef min
#undef max
#include <windows.h>