10 Aug 2013, 23:26

C/C++のAPIレベルのテストを直叩きできるFitNesse用フレームワーク ‘CSlim’

FitNesseをC/C++で利用するためのslimフレームワークではcslimがあります。これを試してみました。

前回の続きです。

CSlimを使うと、APIレベルのテストを直接実行できます。ほかのテストツールとの役割分担はこんな感じ?

  Web I/F   ... Selenium
  -----------------------------
  API       ... CSlim
  -----------------------------
  Function  ... xUnit(CppUTest)

Authors は Robert Martin, James Grenning, and Doug Bradburyです。James Gremmingさんといえば ‘Test-Driven Development for Embedded C’の著者ですね。

cslimは内部でCppUTestを使ってます。CppUTestもこの本が詳しいです。

Webのドキュメントは、githubのwikiにある、以下の2つのリンクが詳しい。

cslimを動かす

以下の記事を参考にして、自分も動かしてみました。

まずは、CSlimを実行するディレクトリを作成

$ mkdir cpp_fitnesse
$ cd cpp_fitnesse

cslimはCppUTestに依存しているので先に、CppUTestをダウンロードしてコンパイル。

git clone git@github.com:cpputest/cpputest.git
mv cpputest CppUTest
./configure
make

cslimをダウンロードしてコンパイル。

git clone git@github.com:dougbradbury/cslim.git
cd cslim
make

cslimとcpputestは同じディレクトリにある必要がある。

<path>/cslim
<path>/cpputest

ブラウザに、以下のURLにブラウザからアクセス。

http://localhost/CslimFirstExamples

編集画面がでるので、以下のように修正。(pathは自分の環境に合わせて)

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

!define TEST_SYSTEM {slim}
!define TEST_RUNNER {/home/tsu-nera/src/cpp_fitnesse/cslim/CSlim_cslim}
!define COMMAND_PATTERN {%m}
!define SLIM_VERSION {0.0}

次に、以下のURLにブラウザからアクセスして、同じようにテストのサブページを作成する。

http://localhost/CslimFirstExamples.DecisionTableExample

wiki形式でテストケースを書く。

|Modulus                 |
|value|divisor|remainder?|
|6    |2      |0         |
|13   |27     |13        |
|5    |2      |1         |

テストを実行すると、失敗する。

気を取り直して、テストケースを書く。コードはこのサイトを参照。

<path>/fixture/Modulus.cpp
<path>/fixture/Fixture.c

Pointは、テスト対象ファイルの下に、以下の様な記述をすること。これで、自分の関数をfixtureから呼び出すための登録ができる。

SLIM_CREATE_FIXTURE(Modulus) 
    SLIM_FUNCTION(setValue)
    SLIM_FUNCTION(setDivisor)
    SLIM_FUNCTION(remainder)
SLIM_END

また、Fixture.cにModulesフィクスチャを登録すること。

    SLIM_FIXTURE(Modulus)

再度makeしてテストを実行すると、今度は成功した。

for cygwin memo

Cygwin環境では、うまく動作させることができなかった。makefileに細工が必要なようだが、以下の記事を参考に編集すると、コンパイルはできるものの、Slim serverにアクセスできない。

my environment

  • FitNesse 20130530
  • CentOS 6.4

10 Aug 2013, 12:55

受け入れテスト用フレームワーク「Fitnesse」導入手順のまとめ

受け入れテスト用のテスト管理ツール、「Fitnesse」を使ってみました。

[toc]

Fitnesseとは

Fitnesseとは、wiki形式でフリーのテスト管理用ツールです。

以下のような特徴があります。

  • 簡単なセットアップ
  • 簡単に使えるwikiサーバ
  • 仕様書や要求がinputとして使える
  • 豊富な言語サボート

最近読み始めた、「実践アジャイルテスト」で頻繁に紹介されていました。

作者は、「ボブおじさん」こと、ロバート・マーチンさんです。以前、「CleanCoder」を読んだときにも、紹介されていました。

Fitnesseを導入する

環境

  • Windows 7 64bit
  • Java 1.6.0_2

Fitnesse の Download

正式版のダウンロードは、公式サイトの以下のリンクから。

また、開発版はgithubから。

Fitnesse の 起動

以下をコマンドラインから叩くだけ。

$ java -jar fitnesse-standalone.jar

こんなメッセージが表示されれば、起動完了。

FitNesse (v20130530) Started...
        port:              80
        root page:         fitnesse.wiki.FileSystemPage at ./FitNesseRoot
        logger:            none
        authenticator:     fitnesse.authentication.PromiscuousAuthenticator
        page factory:      fitnesse.responders.PageFactory
        page theme:        fitnesse_straight
        page version expiration set to 14 days.

http://localhost/にアクセスすると、Fitnesseが現れる。わぉ、簡単(・∀・)

Port指定の起動もできる。

$ java -jar fitnesse-standalone.jar -p 8080

Fitnesseの使い方

公式ドキュメントは以下。

Sample Test を動かす

起動したら、http://localhost/FitNesse.UserGuide.TwoMinuteExampleに移動。

右上に TEST とかかれたボタンがあるので押す。テストが走る。

あらら・・失敗orz.

次に TOOL ボタンの Propertyをクリック。続いて Action:というところにある Editにチェックを入れる。すると、 EDIT というボタンができるので、クリックする。編集画面が出るのて、表の部分を以下のように修正。

# before
| 100 | 4 | 25.0 |
# after
| 100 | 4 | 25.0 |

再びテストを実行すると、テストがすべてパスする。wikiで編集できる気軽さをまずは実感(・∀・)

Fitnesseの仕組み

Fitnesseの仕組みは、以下のページの図を参照。

FitNesse.UserGuide.OneMinuteDescription

オレンジの部分を自分で用意する必要がある。

  • TestCases
  • Custom Fixture
  • SUT

緑の部分は、FitNesseで用意されている。CustomFixtureを実行するためには、2つの手段がある。

FIT

HTMLでかかれたテスト管理用ツール。

FitnesseはこのFITのHTMLをwikiで実行できるようにしたもの、という言い方ができる。

SLIM

Fitnesseのwikiを解析して、CostomFixutreを実行するためのフレームワーク。

様々な言語に対応しているのが特徴。そのため、FITよりも拡張性がある。

ここからがいいところだけれども、続きはまた次回!

04 Aug 2013, 13:55

teratermマクロで自由自在にエンドツーエンドを書く!TTLのためのxUnitフレームワーク「TTLUnit」

Teratermマクロを利用してテスト自動化ができたらいいのになと思っていたのだけれども、いくらさがしても良いツールが見つからなかったので、つくてみました。

名づけて、 

TTLUnit

じゃじゃ~ん!githubにあげました。

本当ならば、Rubyでエンドツーエンドを書きたいところだが、Rubyだと、多段telnetをする方法がいつになっても、わからなかった。

しかし、Rubyはたいていの仕事で利用するPCにはインストールされていないので、どうしても多段telnetは必要。そして、teratermマクロならば多段telnetが可能だ。

これは、以下の記事のリベンジ、というか続編です。

[toc]

これはなに

TTLUnit とは、Tera Term Language(TTL)のためのxUnitフレームワーク。

使い方

フォルダパスの設定

テストをはじめる前に、フォルダパスの設定をする。 lib/config.ttl を修正。

  • BASE_DIR : TTLUnit デフォルトフォルダパス
  • LIB_DIR : TTLUnit ライブラリパス
  • TEST_DIR : テストフォルダパス
  • LOG_DIR : ログフォルダパス

以下のオブションもチェック。

  • TEST_PREFIX : テストケースのブレフィックスを指定
  • LOG_MODE : ログモード 1:有効 0:無効

テストスイートフォルダの作成

TTLUnitでは、テストスイートをフォルダで管理します。フォルダパスで指定したフォルダにテストスイートのフォルダを作成。

また、テストスイートのリストファイルをつくる必要がある。 ts_lit.ttl をテストフォルダに作成して、テストスイートを追加する。

; Pleas Modify Test Suite Max 
TEST_SUITE_MAX = 2
strdim test_suite TEST_SUITE_MAX

; Add your test suite folder
test_suite[0] = 'ts_mkdir'
test_suite[1] = 'ts_pwd'
test_suite[2] = ...

テストケースファイルの作成

テストケースファイルをテストスイートフォルダに作成する。テストファイルの名前は、決められたものを指定する(lib/config.ttlのTEST_PREfiX で指定したもの)

TTL の知識も必要。TTLコマンドリファレンスをチェック。

For Example: Test_mkdir_test_dir.ttl

;Test
sendln 'mkdir testdir'

;Assert
sendln 'ls'
Wait 'testdir'

;tearDown
sendln 'rmdir testdir'

exit

最終行は exit である必要がある。Wait commant 以降では、resultを返すTTLコマンドは使えません(苦し紛れの仕様です)

テスト実行

テストの実行方法は3つ

すべてのテストを実行

.ttlファイルをttpmacro.exeに関連付ける(これでクリックひとつで.ttlファイルがttpmacro.exeで開ける)

lib/RunAlltests.ttlを開く。すべてのテストスイート(ts_list.ttlに登録したもの)が実行される。

一つのテストスイートを実行

一つのテストスイートを選択すくこともできる。 lib/RunTestSuite.ttlを

開く。メッセージボックスがボップアップするので、テストスイートフォルダを入力する。

 ドラッグ & ドロップで実行

テストスイートフォルダを.batファイルにドラッグするだけで、テストが実行する。

example/RunTestSuite.batをご覧されたし。ttpmacro.exeとテストフォルダを指定する必要がある。

@echo off

set file=%*

rem Call TestSuite
"C:\Program Files (x86)\teraterm\ttpmacro.exe" "C:\cygwin\home\TSUNEMICHI\src\ttlunit\lib\RunTestSuite.ttl" %file%

テスト結果

テストが実行され、結果がポップアップする。

Tips

Setup と TaerDown

テストスイートフォルダに ‘setup.ttl’ , ‘teardown.ttl’があると、 SetUp と tearDownがテストケースの前、後ろで実行される。

テストフォルダに、’setup.ttl’ , ‘teardown.ttl’があると、 SetUp がすべてのテストの開始前に実行される。 TearDownが全てのテストの実行後に実行される。

Expect の表示

デフォルトのテスト結果では、Expectの値が表示されない。もし、どのWaitコマンドでテストが失敗したかをチェックしたい場合は、こんなふうにかく。

expect_str = 'hogehoge'
Wait expect_str
タイムアウト

デフォルトのタイムアウト値は 5秒にしている。もし、値を変えたい場合は、この行はどこでも書いて変更できる。

timeout = (your favorite value)
ログモード

ログモードをOnにすると、テストケース実行ごとに、ログフォルダにテスト結果をログすることができる。 lib/config.ttlを編集。

LOG_MODE = 1

動画

[//www.youtube.com/embed/h6iN5MiI3FI?list=UUT1w_8QIwJc5Ia67MjOWN1A]

03 Aug 2013, 23:10

最強ポモドーロアプリはコレだ!無料で使えるWindows用ポモドーロアプリ9選

Windows 7 で使える、最適なポモドーロタイマーを探してみました。


今回探した条件は、以下

  • オフラインで利用できること
  • トマトの見積もり機能があること

あとは、+ αの要素で

  • UIがオシャレなもの
  • 終了時にポップアップで知らせてくれるもの

ベストアプリだったもの

実は、すでにコレがベストだというものはありました。

「Pomodoro App」 が、自分の要件を満たす最高のAppだったのですが、これは最近になって、「TeamViz」というものに変わった。これは、オンライン前提のクラウド型アプリなので、条件から外れてしまった。(´・ω・`)

PomodorとGTDを組み合わせようという発想でできている。UIのオシャレさと、多機能さならば、これがベスト。

TeamViz | Unleash Your Team’s Productivity

カウント機能がないもの

ポモドーロ・テクニックは、基本形と発展形の2種類がある。

  • 基本形 ・・・ 25分集中して、5分休む。このインターバルを繰り返す。
  • 発展形 ・・・ 25分単位でタスク管理をする。一日のはじめに実行できるトマト数を見積もって、一日の終わりに評価する。Interupt task やUnexpected taskは 別タスクとして記録する。

今回探すのは、この発展系の方。といっても、細かくタスク管理するものがほしいわけではなく(それはOutlookでしているので)、単純にトマトの数を記録できればよい。

詳しくは、この本をどうぞ。

カウント機能がないけどオススメなものを以下に並べる。

いずれも、インストール不要で利用できる、とても軽量なアプリ。

focus booster

UIがとても、カッコイイ!しかし、これにはカウント機能が備わっていなかった。

focus booster – home; try the pomodoro technique

Pomodorium

なんと、ポモドーロ・テクニックとRPGゲームを組み合わせたもの。タスクをこなすごとにお金を手に入れて、旅をするゲーム。出オチっぽかったので、インストールだけしてやめた。

Pomodorium: best pomodoro timer windows

オフラインでは使えないもの

会社で利用したいので、オフラインというのが今回の条件だ。

オンラインで利用できるものは素晴らしいものがいくつもある。簡単に紹介。

Tomatoes

Webサービスでもっともオシャレなものは、これ。

githubとtwitterアカウントでログインして利用できる。簡単な統計機能もついている。

Tomatoes

TeamViz

冒頭でも紹介した、多機能なポモドーロアプリ。ポモドーロの枠をはみ出して、タスク管理アプリ。

TeamViz | Unleash Your Team’s Productivity

評価したもの

pomodario

そこそこ洗練されていて、タスク管理もあるのはこのアプリ。しかし、これはバグってた!トマトを7以上カウントできなかった。

pomodairo – An Air application for working with the Pomodoro technique – Google Project Hosting

AutoFocus

タスクをリストで箇条書きにして管理するもの。箇条書きにした結果が残るので、ある意味カウントあり。


XorTime

中国製のソフト。ハンドメイドなUIがとても気に入った。

Xoring

 まとめ

結論、Pomodoro Appに代わるベストアプリは見つからなかった。

アナログが一番よいのかもしれない?

02 Aug 2013, 03:41

TopCoder SRM : 587 Division : Div2 Level : Level1 InsertZ

TopCoderに参戦。

今日は、Level1が解けなかった・・・(´・ω・`)

3つくらい実装方法を考えたが、どれも失敗。頭に浮かんだ方法にすぐに飛びつかず、いくつかアプローチ方法を考えたあとにコーディングを始めたほうがよかったなと反省。

あとは、主にString型の知識不足。

問題

文字列 init と goalが与えられる。initに’z’を挿入をして、goalが作れれば”yes”を、そうでなければ”No”を返せ。

解答

initに文字列を挿入して、goalで比較するよりも、goalから”z”を削除してinitに一致するかどうかを調べるほうが簡単にかける。

Challenging TopCoder SRM 587!

Today, I could’t solv any problems

Question

Geven String init, goalYou can insert ‘z’ to init any times if init atch to goal return “yes”, else “No”

Answer

It’s easy to delete ‘z’ from goal rather than insert ‘z’ to init

29 Jul 2013, 07:48

jQueryでGoogleカスタム検索をさくっとカスタマイズ

jQueryを使って、Googleカスタム検索をカスタマイズしました。

検索窓にフォーカスしているときはメッセージは消す、フォーカスしていないときは、メッセージを表示するようにしました。

デフォルトのコードはこんな感じで取得できるると思います。

<form action="http://www.google.co.jp/cse" id="cse-search-box">
  <div>
    <input type="hidden" name="cx" value="*****" />
    <input type="hidden" name="ie" value="UTF-8" />
    <input type="text" name="q" size="20" />
    <input type="submit" name="sa" value="検索" />
  </div>
</form>

<script type="text/javascript" src="http://www.google.co.jp/coop/cse/brand?form=cse-search-box&amp;lang=ja"></script>

ここで、type=“text”に操作するためのclass を追加します。

<input type="text" class="focus" name="q" size="20" />

jQueryのコードはこんな感じで書きます。

$(function(){
     $(".focus").val("サイト内検索");
     $(".focus").focus(function(){
          if(this.value == "サイト内検索"){
               $(this).val("").css("color","#f39");
          }
     });
     $(".focus").blur(function(){
          if(this.value == ""){
               $(this).val("サイト内検索").css("color","#969696");
          }
     });
});

最後に、デフォルトでの表示を灰色にするために、CSSに色の宣言をします。

.focus{color: #969696}

jQueryでサクッとかけました。jQuery、便利ですねー。

完成!

28 Jul 2013, 13:17

WordPressで処理をファイル分割する方法を調べてみました

WordPressで処理をファイル分割する方法を調べてみました。

wordpressのコードをいじっていると、だんだん長くなってきた。

そこで、責務が独立できそうな部分を、別ファイルとして独立させる方法を調べてみた。

get_template_part()をつかう

header.phpやfooter.phpなどの、WordPressで決められた名前のファイルは、専用のinclude関数が用意されている。(get_header(),get_footer()など)

自前で作ったファイル(hogehoge.php)を読みこむには、get_template_part()を利用する。

get_template_part('hogehoge');

例えば、前回の記事で、固定メニューバーをheader.phpから独立させたい場合は,以下のようにすればよい。

  1. header-sticky.phpというファイルを新規作成
  2. 処理をファイルにカット & ペースト
  3. header.phpのカットした場所に以下の行を追加

.

<archives/hp get_template_part('header-sticky'); ?>

ファイル名は、.phpをつけないところがミソ。

28 Jul 2013, 07:15

WPプラグイン「qTranslate」で記事を新規投稿すると403 Error(wp-admin/post.php)

WordPressの多言語化プラグインqTranslateを入れて、記事を投稿しようとすると、403エラーとなり、記事が投稿できなくなったので、解決方法を調べました。

wp-admin/post.phpにはアクセス権がないと怒られます。

原因

ロリポップサーバで動作している、WAFが原因でした。

WAFとは 「Webアプリケーションファイヤーウォール」 ワフ: – IT用語辞典バイナリ

WAFとは、外部ネットワークからの不正アクセスを防ぐためのソフトウェア(あるいはハードウェア)であるファイアーウォールの中でも、Webアプリケーションのやり取りを把握・管理することによって不正侵入を防御することのできるファイアウォールのことである。

解決方法

ロリポップの管理ページから、Webツール -> WAF設定を選択。

WAF設定が有効になっているので、無効に設定。

5分から10分ほどすると、設定が反映されて、無事投稿できるようになりました。

Reference

28 Jul 2013, 06:45

ブログの上部に固定メニューバーを設置しました

ブログの上部に固定メニューバーを設置しました。

CSS と HTMLのカスタマイズ

コピペでいけるかと思いきや、全くそうはならなかった。

以下のサイトをベースにいろいろググりました。

ちょっとしたTips

スクロールしてもついてくるためには、 position: fixed を使います。

     position: fixed;

画像を重ねて表示するときは、最上位に表示される画像を指定しないと、期待した画像が見えない。z-indexを使って調整。

z-index: 999;
z-index: 900;

アイコンを表示させる場所は、1000pxに収めたいけれども、固定バーは画面全体に表示したい。

divとidで2段階に表示を分けることで実現。

.stickey_sns {
     width: 100%;
}

#stickey_footer {
     width: 1000px;
}

Googleカスタム検索の設置

Googleカスタマイズ検索は、デフォルトのままだとカッコ悪いのでCSSでスタイルを変更しました。

<form action="http://www.google.co.jp/cse" id="cse-search-box">
   <div>
      <input type="hidden" name="cx" value="******" />
      <input type="hidden" name="ie" value="UTF-8" />
      <input type="text" name="q" size="40"/>
      <input type="submit" name="sa" value="検索" />
   </div>
</form>
  • id: cse-serch-box 検索全体をカスタマイズするID
  • type: text 検索ポックス
  • type: submit 検索用アイコン

と要素が定義されているので、この値をいじるようにCSSを記述すればよいですね。

以下のサイトを参考に、自分でもいじってみました。

ソーシャルアイコンの設置 IcoMoon

ソーシャルアイコンは、無料で使えるものがたくさん配布されています。

今は、画像アイコンよりも、Webアイコンフォントが流行りらしいですね。

レスポンシブやらアイコンフォントやらフラットやら!2013年の気になる技術やデザインを試してみたリニューアル手順! | バンクーバーのうぇぶ屋

というわけで、IcoMoonというサイトを使ってアイコンフォントに挑戦!・・・とおもったけど、設置方法わかんなかったから、結局画像アイコンで妥協した。。。そのうち再挑戦します。

このサイトにアクセスして、ほしいアイコンをクリックして、ダウンロードするだけ。とってもカンタン。


Result

21 Jul 2013, 07:39

Codeforcesに初参戦しました!参加方法と感想について

Codeforcesに初参戦しました。

[toc]

Codeforcesってなに

いわゆる、プログラミングコンテスト。以下の特徴があります。

  • 2時間で5題問題を解く
  • ロシア発祥
  • 月に2、3度の頻度で開かれる
  • 利用できる言語が豊富

    • GNU C++ 4
    • GNU C 4
    • MS VS C++ 2005
    • Free Pascal 2
    • Delphi 7
    • C# Mono 2.6
    • Java 6
    • Ruby 1.9
    • Python 2.7
    • PHP 5.3
    • Haskell GHC 6.12
    • F# 2.0
    • OCaml
    • Scala

コンテストに参加するまで

Codeforcesの登録方法

まずは、Webページにアクセス

Gmailアカウントがあれば、それで認証して終了。わぁ、登録カンタン。

コンテストへの参加方法

コンテストが近くなると、トップページに開催案内がでる。クリックして登録完了。わぁ、登録カンタン。

コンテストに参加してみて

問題文は、すべてWebで公開されています。こんな感じ。

テスト画面でコーディングします。エディタがあり、ここでコードを作成します。Inputを与えて、「Run」を押して、テストを実施。Outputを確認します。

解答が完成したら、SUBMITタブを選択。解答を提出します。

標準入力、標準出力の扱い方について

初め、この入力と出力が意味不明だった。データが扱えないので、なにもできない!

Inputは標準入力, Outputは 標準出力なので、まずはこれを変数に格納することに一苦労。

C++ での Inputの扱い方

C++では、cinを使って、Inputを変数に格納します。

たとえば、Inputが

1 2

のときは、

cin >> a >> b;

のようにすると、値が変数に格納できます。スペースで区切られたものを、それぞれの変数に格納します。

cinは一回で1行を読みこむので、複数行にまたがるときは、cinを何度も書いて読みこむ。

C++ での Outputの扱い方。

coutを使って、標準出力に書き出します。

たとえば、rsltをOutputに書き出す場合は、

cout << rslt << endl;

当日の感想

問題のInputとOutputの扱い方がわからずに、それだけで30分おわってしまった。

エディタからの解答作成はちょっと面倒だっだ。TopCoderのようにEclipseのPluginがあればいいのたけれども、ないみたい。

関数の型も、テストも自分で考えるので、TopCoderよりも不親切にも感じた。

当日解いた問題

これは、システムテストで落とされました。。。初参戦にして、惨敗。。。(ノД`)

Codeforces Round #192 (Div. 2) A

[gist id=6045503]

I tried Codeforces for the first time

[toc]

What is Codeforces

It’s so called “Programming Contests”。 Special feature are follows.

  • Solve 5 problems within 2 houres
  • Russia origin
  • held three or four times per month
  • Lot’s of Langages supports
    • GNU C++ 4
    • GNU C 4
    • MS VS C++ 2005
    • Free Pascal 2
    • Delphi 7
    • C# Mono 2.6
    • Java 6
    • Ruby 1.9
    • Python 2.7
    • PHP 5.3
    • Haskell GHC 6.12
    • F# 2.0
    • OCaml
    • Scala

How to Enter Cotests

How to register Codeforces

At first access to the url

If you have a google account, authenticate with that。Wah, it’s easy.

How to Enter Contest

If the contest day comming, there shows a notice at the top page. Just click and is over. Wah, it’s easy

Start Contest!

You can see plobrems at the web, like that

Coding at test view. there is an editor, and you can make there. Give input date、 push the “Run” to run the test. Check the output

If your answer complete, move to SUBMIT tab, then submit your answer.

How to handle standard input and standard output

At first, I can’t understand this input and output。I can’t handle input and can’t do anything!

How to handle stdin with C++

In C++, you can put data to variable with cin

For example 、Input is

1 2


cin >> a >> b;

cin input date 1 line at once, so if you want to input another line, use multiple times

How to handle stdout with C++

In C++, you can put data to stdout with cout

For example、output rslt to stdout

cout << rslt << endl;

Impressions

I can7t figure it out stdin and stdout, so I spend 30min to research

Codinng with web edittor is not easy. It seems that there is no plugin to code from eclipse, like topcoder

My answer

My answer was failed with system test,..(ノД`)

Codeforces Round #192 (Div. 2) A

[gist id=6045503]