27 Aug 2013, 13:00

TopCoder SRM : 587 Div2 Level1 Level2

TopCoder参戦!今日は、定時退社をしようとおもったけれども結局できずに、会社近くのカフェからTopCoder参戦した。

今週から、CourseraのAlgorithms PartⅠを受講中。本格的に、アルゴリズムの勉強に力を淹れている。


Algorithms, Part I | Coursera



Level1は、過去問で似たような問題を解いたことがあるので、mapを利用して難なくクリア。

Level2は、問題の意味を理解するのに苦戦。最後は、やっつけで条件を追加したらテストをパスしたのでそのまま提出。案の定、システムテストで落とされた。

25 Aug 2013, 11:59

タイムストレッチをC++で実装する方法を調べてみました

タイムストレッチ(TimeStretch)をC++で実装する方法を調べてみました。

調べただけで、結局いい方法が見つかりません。誰か教えてください。

そもそもタイムストレッチとは

タイムストレッチとは、音程(ピッチ)を変えずに速度(テンポ)だけを変更する、音声処理。

アルゴリズム的にはフーリエ変換とかするらしいけれども、大学生の時、その大学の授業は抜け出してフランス映画を見に行った思い出しかないので、自分では無理。便利な変換ライブラリを探してみた。

VLC Player

はじめにとったのがこの方法。VLC Playerをサーバモードで起動しして、C++のソースからソケット通信してコマンドを送りつけた。

これはこれでうまくいったのだが、サーバへの通信を実施するので、微妙なタイムラグが入った。

DirectShow

DirectShowのサンプルがあったので、真似するとタイムストレッチができた。

ほか、参考リンク。

ただ、この方法だと音程も高くなってしまった。実現したいのは、音程はそのままで速度だけ可変にしたい。

このページによると、DirectShow用のフィルタは自分で作りなさいと書いてある。えっ!

Windows Media Player SDK

Windows Media Player SDKの IWMPSettings::put_rate を使用すると再生速度変換ができるらしい。これも、上のリンクに書いてあった方法。

Media player Classic

Media player Classicにフィルタを設定するとタイムストレッチできるみたいだけれども、それがコードからいじれるかは不明。

そして困ったときのStackoverflow

最後にたどり着くのは、やっぱりStackoverflow

ここでは、以下のライブラリが紹介されている。

商用だと以下。

とりあえず、SoundTouchがシンプルでつかえそうなので、これに挑戦してみることにした。

タイムストレッチ(TimeStretch)をC++で実装する方法を調べてみました。

調べただけで、結局いい方法が見つかりません。誰か教えてください。

そもそもタイムストレッチとは

タイムストレッチとは、音程(ピッチ)を変えずに速度(テンポ)だけを変更する、音声処理。

アルゴリズム的にはフーリエ変換とかするらしいけれども、大学生の時、その大学の授業は抜け出してフランス映画を見に行った思い出しかないので、自分では無理。便利な変換ライブラリを探してみた。

VLC Player

はじめにとったのがこの方法。VLC Playerをサーバモードで起動しして、C++のソースからソケット通信してコマンドを送りつけた。

これはこれでうまくいったのだが、サーバへの通信を実施するので、微妙なタイムラグが入った。

DirectShow

DirectShowのサンプルがあったので、真似するとタイムストレッチができた。

ほか、参考リンク。

ただ、この方法だと音程も高くなってしまった。実現したいのは、音程はそのままで速度だけ可変にしたい。

このページによると、DirectShow用のフィルタは自分で作りなさいと書いてある。えっ!

Windows Media Player SDK

Windows Media Player SDKの IWMPSettings::put_rate を使用すると再生速度変換ができるらしい。これも、上のリンクに書いてあった方法。

Media player Classic

Media player Classicにフィルタを設定するとタイムストレッチできるみたいだけれども、それがコードからいじれるかは不明。

25 Aug 2013, 02:06

gccよりも高速な次世代コンパイラClangをCygwinでつかってみた

最近流行のコンパイラ、Clangを試してみました。

Clangとは

Clangとは、gcc,iccのような、コンパイラの一種です。プログラミング言語C、C++、Objective-C、Objective-C++用。

Clangの最終目標は、GNU gccの置き換えらしい。

静的解析能力やリファクタリング機能などももつため、IDEとの結合も目標らしい。

以下は、setreduceという、Googleのエンジニアが開発しているリファクタリングツールのデモ動画。

[//www.youtube.com/embed/mVbDzTM21BQ?rel=0]

Clangを利用すると、コンパイラ時間がgccに比べて短くなるらしい。今回の目的は、それを確かめるためです。Clangのパフォーマンスがgccよりも良かったら乗り換えてみる。

Cygwinへのインストール

setup.exeに用意されているようです。自分はapt-cygで取得。

$ apt-cyg install clang
$ apt-get install llvm
$ clang -v
clang version 3.1 (branches/release_31)
Target: i386-pc-cygwin
Thread model: posix

取得できたものは、3.1。現在の最新は、3.3なので、少し古い。

ベンチマーク

C言語でかかれたプロジェクトをベンチマークとしてコンパイルしてみます。Clangのコンパイラオプションはgccと互換性があるので、makefileのCCオプションを変えるだけで行ける。

tree project

curl -LO http://mama.indstate.edu/users/ice/tree/src/tree-1.6.0.tgz
  • gcc 7.8s
  • clang 9.5s

なんと、gccの勝利。あれ(・・?

screen project

git clone git://git.sv.gnu.org/screen.git
  • gcc 1:34
  • clang 1:02

おお、30秒も速かった!Clangの圧倒的勝利。

Warningメッセージもカラー付きでわかりやすく表示してくれる。

process.c:6272:35: warning: operator '?:' has lower precedence than '+'; '+' will be evaluated first [-Wparentheses]
strncpy(p, buf, 1 + (l < len) ? l : len);
                ~~~~~~~~~~~~~ ^

eclipseからClangでコンパイルする(4.3ではバグってた)

LLVM Tool Chain for Eclipse CDTプラグインをインストールする。

プロジェクトを右クリックして C/C++ビルド > ツールチェーン・エディタ を選択。

互換ツールチェーンのみ表示のチェックを外すと、ツールチェーンにLLVM Clang(cygwin)が選択できるので、選択。

ただし、Eclipse最新版4.3で試したところ、2度めに設定画面を開くとNullPointerExceptionが発生する。つまり、まだバグっているから使わないほうがいいということ。

最後に、ウィンドウ -> 設定 -> LLVM を選択。Library path libstdc++ がある場所のパスを通す。自分の環境では、C:\cygwin\lib\gcc\i686-pc-cygwin\4.5.3

これで、EclipseからClangでコンパイルできた。

24 Aug 2013, 20:55

ボクの相棒ノートPC『VAIO』の容量を増やすために実施したことのメモ(Windows,SSD)

掲題の通り、いつも使っているノートPC VAIOの容量が残り10GBを切ってしまい、イタイイタイ思いをしているため、容量拡大のためにやったことをメモします。

20130824110807.jpg

メディアファイルの削除

ノートPCにはメディアファイルは不要です。必要ならば、自宅のHDDに保存しておけばいいので。ということで、必要最低限を残してすべて削除。

不要なファイル・プログラムの精査

いらないファイルやプログラムはないかどうか精査します。

プログラム

スタートメニューのコントロールパネル > プログラムのアンインストールから、インストールされているプログラム一覧を見て、不要なものを片端から削除。

ファイル

マイドキュメントを見て、いらないファイルを削除

巨大ファイルの削除

巨大なファイルのなかで、不要なものを削除しました。

巨大ファイルの検索方法は、エクスプローラの検索を利用します。検索フィルタのサイズで巨大を選択。これで、129MBより大きなファイルを検索することができます。

自分の場合は、virtualboxのファイルが大きかったので、すべて削除!

ディスククリーンアップの実行

これは、王道ですね。

スタートメニューの コンピュータを選択。次にドライブを選択し、ディスクのクリーンアップを選択。あとは、実行して不要な一時ファイルをすべて削除するのみです。

SSD固有の設定を削除

これは、SSD固有の容量の増やし方。以下のページを参考にしました。


最低限これだけはやっておくべきSSDの書き込み対策と空き容量を増やす方法! – 裏技shop DD


  • hibernate
    ページングファイル
    システムの復元
    RAMディスクとTEMP&キャッシュ移動
    ファイルインデックス

hibernateというのは、休止モード。ノートPCだと、バッテリー充電率が10%を切ると休止モードになるので、これは有効のままにしておいた。これを無効にすると、3GBの容量が手に入る。

あとは、再起動だ!

結果

こうなりました。

SnapCrab_NoName_2013-8-25_5-54-3_No-00

10GBの削減。まあ、sosoのできです。

その他、所感

ほかにも、DropboxやSugerSyncなどのオンラインストレージサービスを利用すると容量増えるかなとおもっていろいろサービスを契約したけど、結果的にはあれらはローカルドライブの容量も食いつぶしていることがわかったorz。

こういう小手先テクニックではなくて、SSDやメモリ増強をしてしまったほうが圧倒的に効果的なキがしますが。それはもう少しこのスペックで頑張ったあとで。

そろそろ、バッテリもヘタってきたのであと1年もつかな(・・?

21 Aug 2013, 15:46

レガシーコードをC言語のTDD用フレームワーク『Fake Function Framework (fff)』ですっぽんぽんにする

以前、こんな記事を書きました。

CMockは素晴らしいツールで、正直これがないとこの3ヶ月で心がへし折られていたと思う。しかし今日は、CMockに対向できるような素晴らしいツールを発見したので紹介。その名も、

FFF

ファイナルファンタジーではないが、魔法のようなツールだ。

FFFってなに

Fake Function Framework。ダミー関数を自動生成してくれる、『C言語』のためのツール。フェイク関数のフレームワークといいつつも、実際はスタブ関数やスパイ関数などなど、いろいろ生成するツールだ。

githubからダウンロードできる。

基本編

一番くわしいリファレンスは、githubのReadme.mdを以下はそれを参考に、いろいろと実験。

git clone git@github.com:meekrosoft/fff.git

xUnitフレームワークは、Unityを利用します。

はじめの一歩

定形の宣言。fff.hのなかに、すべてが集約されている。テストコードに以下を追記。

// Test_uhauha.c
#include "fff.h"
#include 
DEFINE_FFF_GLOBALS;

fff.hのなかで、memsetを利用しているようなので、string.hかが必要。

FFFでDummyする

まずは、ダミー関数を。hogehogeの実体をコンパイルすることなく、uhauha関数からhogehogeを呼び出す。

// uhauha.c
#include "uhauha.h"
#include "hogehoge.h"

void uhauha(void)
{
  hogehoge();
}

// hogehoge.h
int hogehoge(void)

void hogehoge(void)型を置き換えるには、テストコードに以下を追加する。

// Testuhauha.c
FAKE_VOID_FUNC(hogehoge);

これで、ダミー関数が宣言されて、コンパイルが通る。

これだけなのです!!魔法みたい!ウッハウハですね。

FFFでスタプする

hogehoge()をスタブ関数にします。必ず1を返すようにする。。

// uhauha.c
int uhauha2(void)
{
  return hogehoge2();
}

// hogehoge.h
int hogehoge2(void)

テストコードに以下を宣言。

// Testuhauha.c
FAKE_VALUE_FUNC(int, hogehoge2);

そして、実際のテストでは、1を返すようにhogehoge2_fake.return_valに値を入れる。

void test_uhauha2(void)
{
  hogehoge2_fake.return_val = 1;
  TEST_ASSERT_EQUAL(1, uhauha2() );
}

これで、hogehoge2は必ず1を返すフェイク関数ができる。

これだけなのです!!魔法みたい!ウッハウハですね。

FFFでスパイする

Spy関数も生成できるようです。

hogehoge3()に渡された値をスパイして、あとで結果をAssertします。

// uhauha.c
void uhauha3(int x)
{
  x++;
  hogehoge3(x);
}

// hogehoge.h
void hogehoge3(int);

テストコードはこちら。hogehoge3_fake.call_countで呼ばれた回数を、hogehoge3_fake.arg0_valで呼ばれた値を検証している。

// Testuhaha.c
FAKE_VOID_FUNC(hogehoge3,int);

void test_uhauha3(void)
{
  uhauha3(1);

  // check how many times hogehoge3 called.
  TEST_ASSERT_EQUAL(hogehoge3_fake.call_count, 1);
  // chech what value was given
  TEST_ASSERT_EQUAL(hogehoge3_fake.arg0_val, 2);
}

これで、hogehoge3をスパイできる。

これだけなのです!!魔法みたい!ウッハウハですね。

応用編

 スタブとスパイの合わせ技

スタブしつつ、スパイの検証もできる。以下のように宣言。たとえば、

int hogehoge4(int);

をスパイしつつフェイクするには、以下を書く。

FAKE_VALUE_FUNC(int, hogehoge4,int);

シーケンス制御の検証

ほかにも、シーケンスの検証も可能。シーケンスのチェックこそがモッキングフレームワークなのだよ!詳細は省略。

カスタム関数を利用してフェイク、スパイする

登録した関数がコールされた時に、自分で作成した関数に飛ばすことができる。

 hogehoge5_fake.custom_fake = hogehoge_custom_fake;

のように宣言して

void hogehoge_custom_fake(){}

みたいに、自分が関数を用意する。プリプロセッサ接合部で置換するので、関数ポインタやリンク時の整合部を意識することなく、さくっと自前関数に飛ばせる。便利(・∀・)。

個人的最大の課題 データを渡す関数のモック

自分の扱っているコードは、メモリ獲得した構造体データを引数にして関数に渡すことがほとんど。こんな感じ。

//hogehoge.h
typedef struct hogehoge {
  int time;
  int status;
  int factor;
}HOGEHOGE;
void hogehoge5(HOGEHOGE *hogehoge);

//uhauha.c
void uhauha5(void)
{
  HOGEHOGE *hogehoge = (HOGEHOGE *)calloc(1,sizeof(HOGEHOGE));
  hogehoge->time   = 1;
  hogehoge->status = 2;
  hogehoge->factor = 3;

  hogehoge5(hogehoge);
}

こういうhogehoge5をチェックするには、自前のスパイ関数を作成して検証していた。fff.hを利用すれば検証がサクットできる。

HOGEHOGE last_hogehoge;
void hogehoge5_spy(HOGEHOGE *hogehoge)
{
  memcpy(&last_hogehoge,hogehoge,sizeof(HOGEHOGE));
  free(hogehoge);
}

void test_uhauha5(void)
{
  hogehoge5_fake.custom_fake = hogehoge5_spy;
  uhauha5();

  TEST_ASSERT_EQUAL( 1, last_hogehoge.time);
  TEST_ASSERT_EQUAL( 2, last_hogehoge.status);
  TEST_ASSERT_EQUAL( 3, last_hogehoge.factor);
}

感想

以前の記事で、『プリプロセッサ接合部』について書きました。

このfffは、『プリプロセッサスゲーΣ(゚Д゚ノ)』と思わせるツールでした。C言語のプリプロセッサの底力を垣間見たフレームワーク。レガシーC言語バンザイヽ(´ー`)ノ

CMockは便利だが、xUnitがUnityに限定されてしまう。それに対してこのfff.hは、移植性がとても高そうだ。評価してないけど、いろんなフレームワークでいっしょに利用できそう。C言語のフレームワークだが、extern “C”のテクニックをりようすることで、C++系のxUnitフレームワークでも利用可能。

CMockはRubyスクリプトでダミー関数を一気に生成することができる。

fffは必要なダミー関数を必要なだけ作成する点が異なる。自分の扱っているコードはテストがあるなんという金持ち環境ではなく、技術的負債で潰れかけているので、ねじ込むようにテストを書くにはCMockが必須う。

CMockだと、引数に構造体ポインタを渡す関数をうまくモックできなかった(やりかたがわからないだけかも)。そういう場合は、結局自分でモック関数を作成していた。しかし、fffを利用すればちょっと楽がデキそうた。

Reference

 

19 Aug 2013, 15:32

夏休みの自由研究 『Console Karajan』

夏休みが4日間あったので、なにか自由研究をしてみようと思いました。

Kinectを使ってクラシック音楽を操るソフトをつくろうとしたのだけれども、結局Kinectをつかいこなすまで開発が進まなかったorz。というわけで、コンソールバージョンの日記でも。

[//www.youtube.com/embed/-9tmgcL0V-Y?rel=0]

実は、もともとゴールデンウィークにつくってたものだけれども、ゴールデンウィークの3日間で完成せず、夏休みの4日間でも完成せず。もう1週間もかけてるのに、一向に開発はすすまず。はたして、次はお正月か?

音源の制御には、VLCのAPIを利用。

テンポの変更検出は、4拍子ごとに実施しているけど、これだと精度が悪すぎた。また、急激にテンポを変更すると、きいていて違和感が。今後の課題。

こっちが本物のカラヤン。カックイイ(・∀・)

[//www.youtube.com/embed/FJ96i-m6cBk?rel=0]

ちなみに、テストはGoogleTest/GoogleMockを使ってバリバリ実施。むしろ、こっちが大変だった。GoogleTestはファイル操作系のwindows APIと相性が悪くて、これだけで半日潰れて、そのままうつになって、一日潰れた。

[//www.youtube.com/embed/lzsrTv3UA-I?rel=0]

19 Aug 2013, 15:05

Kinectで指揮者になる!世界のKinectHackerたち

オーケストラを指揮者のように操りたい!

クラオタならば誰もが夢想することですね。

何の役にも立たない指揮棒を楽器屋さんで購入して、真夜中の草木も眠る丑三つ時に、ブルックナーなんかをイヤホンで聞きながら暗闇に向かって指揮をするなんて、至福のひとときです。

そんな夢を叶えてくれる魔法のデバイス、それがKinect。

世界には、そんなクラオタたちのKinectハックが溢れかえっています。

今日は、そんなKinect Hackをまとめてみます。

Kinect conductor

はじめてみつけた動画がこれ。イタク感動した。

[//www.youtube.com/embed/uABuEIU-aNE?rel=0]

Virtual Conducting with the Microsoft Kinect

おんなじテンポをKinectで操る。

[//www.youtube.com/embed/WW8dYOhGYKg?rel=0]

kinectを使用した指揮者体験アプリケーションの開発

これは大学生が研究のテーマにしたもの。

[//www.youtube.com/embed/BURiyCYoCdA?rel=0]

Kinect Fun Labs Election: Virtual Conductor

ダンスすると、いろんな音色がひろがる。楽しそう。

[//www.youtube.com/embed/E98_XKlo934?rel=0]

Wii Conductor Hero

これはKinectではなくて、wiiを使ったもの。

[//www.youtube.com/embed/rX-bQR4bkqY?rel=0]

Carpe Zythum – Kinect controlled pipe organ (full performance)

オルガンをKinectで操ります。パフォーマンスとしても感動的です。

[//www.youtube.com/embed/fuZpSPUtya4?rel=0]

AdMaestro

CDを音源として、自由自在にテンポを変更できるみたい。Made in Japan の 商用ソフトで値段は15000円。高い!

[//www.youtube.com/embed/Bia_m6aigow?rel=0]

16 Aug 2013, 10:43

C++でCSVファイルの読み込み、書き込みをする方法メモ

C++でCSVファイルを扱う方法を調べてみましたので、メモします。

ヘッダファイルには、以下のインクルードが必要。

#include<fstream>
#include<iostream>

using namespace std;

出力

ofstreamを使います。

ofstreamでファイルを出力ストリームとして開き、<<演算子で書き出します。

書き出すときに、カンマを入れます。

開くときは、ofs(ファイル名)で開ける。ofs.close()処理はなくてもOK.

入力

ifstreamでファイルを入力ストリームとして開き、>>演算子で読み込みます。

カンマで区切るのが少しテクニックが必要!getlineをつかって、カンマをウマク検出します。getlineのために、

#include<string>

も必要となる。

getline関数は、文字列として読み込むので、文字列から数値に変換が必要な場合は、sstreamを使って変換します。

#include<ssteam>

string token;
int    hoge;
stringstream ss;

ss << token; //数値に変換
ss >> hoge; 

開くときは、ifs(ファイル名)で開ける。ifs.close()処理はなくてもOK.

11 Aug 2013, 13:56

レガシーコード改善ガイドを読了しました!心に響いた考え方の覚書

レガシーコード改善ガイドを読了したので、読書メモです。

20130811215651.jpg

分厚い本だけれども、とても良書だった。挫けそうだった時に読んだので、心に染み入るように文章が心に響いた。

もっとも、自分は仕事ではC言語のレガシーコードと戦っているのて、オブジェクト思考的な手法は使えない。そういう部分は読み飛ばした。

いろいろと心に残ったことはあるけれども、抜粋して書き出します。

整合部・形容点

以下、書籍から定義を引用します。

接合部

接合部(seam)とは、その場所を直接参照しなくても、プログラムの振る舞いを変えることのできる場所である。

許容点

どの接合部も許容点(enabling point)を持つ。許容点では、どの振る舞いを使うかを決定できる。

この2つの概念は大事。どんなコードも、依存関係を排除できる可能性があるということ。諦めてはいけいなということ。鋭い感性で、ズバッと許容点を探しだすスキルを磨くことが大事だ。

スプラウトメソッド

スプラウトメソッドとは、新規追加する機能は関数として抜き出して(スプラウトして)実装する方法。関数の呼び出しもとは、ドロドロの依存関係でテストがかけないれども、できたてホヤホヤの関数ならばテストがかけるはず。

if文のリファクタリングによく使う。こんなの。

if( (hogehoe && uhauha) ||
    (iyaiya) ||
    ((mouiya) && (dameda)) )

場合によっては、ファイル自体をテストハネースに組み入れることができない。そんなときは、新しいファイルを新規作成して、機能を独立させて実装する(これをしたら怒られたけどれも)

ラップメソッド

ラップメソッドはスプラウトメソッドの逆。既存の処理は、関数として独立させて追い出す。汚い部分は追い出す。SmelllCodeをラップする。臭いものには、クレラップ。

if(smell){
    /* 500 Step*/
}

ここに機能を追加しないといけないときは、ラップ関数を作成して、追い出す。

void lap(void) {
    if(smell){
        /* 500 Step*/
    }
    return 0;
}

あとは、きれいな関数たちでコードを書く。

seiketu();
lap();

プリプロセッサ接合部

このテクニックを知ったことは、一番の収穫かもしれない。プリプロセッサ接合部、便利すぎる!というか、すごいぞ!

例えば、コードの中にあるunko()が邪魔でしょうがない時は、プリプロセッサで消してしまえば良い。

#define unko{retrn 0}

スパイしたり、フェイクしたいときだって、置き換えは簡単。インクルードファイルを冒頭に書いてその先で後方置換してしまう。こんな風に、スパイだって自由自在だ。

hogehoge.c

#ifdef DEBUG
#include "Mock_unko.h"
#endif

Mock_unko.h

static int last_un;
static int last_ko;

void unko_Spy(int un, int ko)
{
    last_un = un;
    last ko = ko;
}
...

#define unko unko_Spy

多用し過ぎるとプロダクトコードがごっちゃになるとかで推奨されていないようだが、便利すぎるのでついつい使ってしまう。

仕様化テスト

振る舞いを維持するためには、テストが必要。しかし、その振る舞いすらよくわからないことがある。よく

いわれるのが

「仕様書を信じるナ!実機に聞け!」

実際の動作のみが唯一正しい真実なのだ。

この振る舞いを壊さないために、テストして明文化することでで、振る舞いを維持する。そのテストが仕様化テスト。

正直、今目の前にあるコードをテストで覆うのは無理!なので、既存処理に対する単体テストは諦めてる。とてもそんな工数はないし、コストパフォーマンスもない。そうではなくて、機能テストで覆うことに心の重点がシフトし始めている。それが、Fitnesseだったりする。

11 Aug 2013, 12:20

これぞテストの最終形態!FitNesseとRubySlimで実現するエンドツーエンドテスト

FitnesseとRubySlimを使ってでエンドツーエンドを書いてみました。

なんどもおんなじネタで恐縮だけれども、FitNesseとRubySlimを利用して、エンドツーエンドを実装してみました。

この記事は、以下の記事の延長になります。

FitNesse テストケースの用意

まずは、テストケースのページの作成です。

これは、前回の記事のまんま。

!contents -R2 -g -p -f -h

!define TEST_SYSTEM {slim}
!define TEST_RUNNER {/home/tsu-nera/src/ruby_fitnesse/rubyslim/bin/rubyslim}
!define COMMAND_PATTERN {ruby -I %p %m}
!define PATH_SEPARATOR { -I }
!path /home/tsu-nera/src/ruby_fitnesse/tests

こんな感じで、Decision Tableを作成しました。

|make directory                     |
|command       |expect  |get result?|
|mkdir testdir |testdir |0          |
|mkdir testdir2|testdir2|0          |
|mkdir testdir3|testdir4|0          |

Custom Fixturesの用意

ここからが本題。RubyでCustomFixtureを作成します。

/home/tsu-nera/src/ruby_fitnesse/testsに Test Fixtures作成。

なかなかウマクイカなかったので、こんな実験用コードも書いた。

require "./make_directory"
include Fixtures

@foo = MakeDirectory.new
@foo.set_command("mkdir testdir")
@foo.set_expect("/testdir/")
@foo.get_result
@foo = nil

これで、準備完了!Webからテストを実行します。

[//www.youtube.com/embed/3lGEuIW5LQc?rel=0]

テスト結果のログは、’Output Capture’というところをクリックすると見れる。障害調査も完璧。