15 Oct 2013, 14:44

C++での文字列の使い方まとめ(string)

C++での文字列(string)の使い方についてまとめます

文字列(string)

宣言と初期化

#include<string>
using namespace std;

// 宣言
string c;

// 初期化をともなう宣言
string str( "abcdefghijk" );

文字列操作

サイズ

size()を使う。

str.size();

空の場合は、emptyで調べる。

if (str.empty());
連結

‘+’ を使う

// str1にstr2を連結
str1 += str2
比較

‘==’ を使う

// str1 と str2 を比較
str1 == str2
分割

substr( 取り出す初めの文字の番号 ) を使う

string str3( "abcdefghijk" );
str3.substr( 5 );    // "fghijk"
str3.substr( 5, 3 ); // "fgh"
文字の取り出し

str[取り出したい文字の番号] を使う

//strの1文字目取り出し
char c = str[1] ;
挿入

insertを使う。開始位置を指定する。

  //先頭に挿入
  string str( "abcdefghijk" );
  str.insert(0,"123"); // 123abcdefghijk

  //3文字目に挿入
  string str( "abcdefghijk" );
  str.insert(3,"123"); // abc123defghijk
削除

eraseを使う。

インデックスだけを指定した場合にはそこから最後の文字までが削除される。

str.erase( 3 );    // "abc"

指定した場所から指定した文字数を削除するには、erase(インデックス,文字数)で呼ぶ。

str.erase( 3, 3 );    // "abcghijk"

1文字を削除するためには、イテレータの先頭からの文字列を指定する。

str.erase(str.begin()+3);    // "abcefghijk"
検索

単純に for 文を回す方法

  bool rslt = 0;
  string str( "abcdefghijk" );
  char key = 'h';

  for (int i=0; i < str.size(); i++) {
    char target = str[i];
    if ( key == target ) {rslt = 1; break;}
  }

findを利用する。もし検索で求める文字があると、その文字位置を返す。

  string str( "abcdefghijk" );
  char key = 'h';
  cout << str.find(key) << endl; // 7

検索に失敗すると、string::npos という値が返される。(-1)

string str( "abcdefghijk" );
char key = 'z';

if( str.find(key) == string::npos ) {
  cout << "Not Found" << endl;
}

文字配列

文字列配列が与えられた時の、(i,j)要素へのアクセスは以下

str[i][j];

文字列配列が与えられた場合の表のサイズの求め方

vector<string> table 
= { "ABC",
    "DEF",
    "GHI",
    "JKL"}
int width  = table.size();
int height = table[0].length();

コピーは直接代入。与えられた配列をメソッド間で共有するときなどに利用する。

str1 = str2;

15 Oct 2013, 14:42

C++での配列の使い方まとめ(array,vector)

C++での配列(array, vector)の使い方についてまとめます。

配列(array)

宣言と初期化

//宣言
int a[50];

// 0初期化
int a[50] ={0};

// memsetを利用
memset(a, 0, size(a));

// メモリ獲得で宣言
int* a = new int[50];

// newで0初期化までするには、()をつける
int* a = new int[50]();

代入

要素番号を指定して、代入。

a[1] = 1;

サイズを調べる

a.length();

動的配列(vector)

宣言と初期化

vector は std という名前空間に含まれる。

using namespace std;

vector<int> a;      // int型で宣言
vector<Class>   a;    // クラスで宣言

// 領域獲得
a.reserve( 100 ); 

代入

// 末尾に追加
a.push_back( 1 );

参照

a[4];

サイズ獲得

size()を使う

a.size()

空の場合は、emptyで調べる。

if (a.empty())

削除

eraseを利用する。

  //先頭を削除
  a.erase(a.begin());
  // i番目を削除
  a.erase(a.begin()+i);

すべてを消すときは、clearで

  a.clear()

イテレータ

// 宣言
vector<data>::iterator it;

// 参照
*it;        

// サーチ
for(it = data.begin(); it != data.end(); it++ ) {}
</data>

その他

移動ベクトルを定義する

二次元配列が与えられてサーチが必要な場合、移動ベクトルを定義すると、処理か綺麗にかける。

  • 4方向 int dx[] = {1, 1, 1, 0}; int dy[] = {-1, 0, 1, -1};

  • 8方向 int dx[] = {1, 1, 1, 0, 0, -1, -1, -1}; int dy[] = {-1, 0, 1, -1, 1, -1, 0, 1};

配列の領域外でないかチェック

#define IS_IN2(x, n) ((x)>=0) && ((x)<n) )

二次元配列の領域外でないかチェック

#define IS_IN2(x, n, y, m) ( (x)>=0) && ((x)<n) && ((y)>=0) && ((y)<m) )

14 Oct 2013, 13:28

『Modern C++ with TDD』学習メモ(Chapter2-5)

Modern C++ Programming with Test-Driven Development: Code Better, Sleep

Better

体育の日の祝日なので、図書館とカフェにこもってベンキョしてました。そんな体育の日もオツだよね。というわけで、今日勉強した記録を淡々とメモします。

今日は、『Modern C++ Programming with Test-Driven Development』の前半を読みました。これからあんまし時間がとれなくなる気がするので、後半はお正月休みあたりか。

各章の概略

  • Chapter1・・・ツールの準備について。
  • Chapter2・・・TDDの実践方法をsampleとともに、解説される。ここでは、GoogleMockをつかうものの、中身としてはGoogleTestの使い方解説。TDDを知らない初心者向けに丁寧に書いてある。リファクタリングの方法なども、sampleとともに、体験できる。けっこう優しめで丁寧。
  • Chapter3・・・『レッド・グリーン・リファクタリング』にはじまるTDDの思想や原則、規律について書いてある。Webや書籍ですでにいろいろと言われていることをまとめているだけなので、とりわけ目新しいことはない。
  • Chapter4・・・GoogleMockの細かい使い方など。テスト。フィクスチャ、テストのフィルターやパラメタライズドテストの方法が解説される。HamcrestやASSERT_THATがmodernなのだ!と強調される。また、例外のテストや浮動小数点数のテストなど、細かいTipsとか。
  • Chapter5・・・テスト・ダブルの紹介。ここでついに、GoogleMockが登場。まずは、マニュアルでモックをつくらせて、そのあとにGoogleMockでモックをつくり『ほ~ら、コンナに簡単にできちゃうんだぞ~』とさとされる。cURL、JSONCPPなどのサードパーティをつかって、それらとの依存関係を取り除く方法が紹介される。

Study Memo

以下、新しく知ったことを忘れないためのStudy Memo。なので、自分が知っていることは省略。

ASSERT_EQと ASSERT_THAT

いままで、テスト結果の検証には『ASSERT_EQ』しか利用してこなかったけれども、この本では 『ASSERT_THAT』を利用している。理由は、テストコードの可読性が高まるから。

比較してみる。 『1+1=2』( (1+1) equals to 2 )。

ASSERT_EQ( 2, (1+1) );

これを、ASSERT_THATで書きなおすと以下のようになる。

ASSERT_THAT( (1+1), Eq(2) );

なるほど、英語の文の並びと同じになる。 Assert that 1+1 equals to 2.

ASSERT_EQからASSERT_THATを利用しているところが、まずモダン。

Test Fixtureでのクラス生成はポインタで

クラスをフィクスチャ間で共有するには、どうすればいいか、いままでワカラなかった。こうすればよい。

#include "gmock/gmock.h"
#include "RetweetCollection.h"
#include "Tweet.h"

#include 

using namespace ::testing;
using namespace std

class ARetweetCollectionWithOneTweet: public Test {
public:
   RetweetCollection collection;
   shared_ptr tweet;

   void SetUp() override {
      tweet = shared_ptr(new Tweet("msg", "@user"));
      collection.add(*tweet);
   }
};

TEST_F(ARetweetCollectionWithOneTweet, IgnoresDuplicateTweetAdded) {
   Tweet duplicate(*tweet);
   collection.add(duplicate);

   ASSERT_THAT(collection.size(), Eq(1u));
}

Classの宣言に、shared_ptrを利用して、SetUp()でメモリを動的に獲得する。

Hamcrest Assertion

従来のAssertion(expect_eqとか)では、一つの宣言で一つのことしか検証できなかった。

しかし、モダンなHamcrest Assertionだと、Matcherを利用し、一つの宣言で複数のことを検証できる。

ASSERT_THAT(actual,
    AllOf(StartsWith("al"), EndsWith("ha"), Ne("aloha")));

GoogleMockはC++でHamcrestが利用できるxUnitなので、こういう方法も紹介されている。

Parameterized Test

複数のテストケースをまとめて実行できるというもの。TDDというよりは、スプレッドシートにかかれた仕様を検証するようなときに必要そうなテストの書き方。

#include "gmock/gmock.h"
using namespace ::testing;

struct Sumcase {
  int a, b, expected;
  Sumcase(int anA, int aB, int anExpected)
    : a(anA), b(aB), expected(anExpected) {}
};

class AnAdder: public TestWithParam {
};

class Adder {
public:
  static int sum(int a, int b) {
    return a + b;
  }
};

TEST(AnAdder, GenerateASumFromTwoNumbers) {
  ASSERT_THAT(Adder::sum(1, 1), Eq(2));
}

TEST_P(AnAdder, GenerateLotsOfSumsFromTwoNumbers) {
  Sumcase input = GetParam();
  ASSERT_THAT(Adder::sum(input.a, input.b), Eq(input.expected));
}

Sumcase sums[] = {
  Sumcase(1,1,2),
  Sumcase(1,2,3),
  Sumcase(2,2,4)
};

INSTANTIATE_TEST_CASE_P(BulkTest, AnAdder, ValuesIn(sums));

Test Double、Mock、Stub、Spy、Fake

これは、この本の本題ではないけれども、メモしとく。

  • Test Double・・・テストのために本番用コードと置き換わり、本番用コードをエミュレートするもの
  • Stub・・・ハードコーディングされた値を返すTest Double
  • Spy・・・テストの後の検証のために、オブジェクトに送られた情報をキャッチするTest Double
  • Mock・・・自分で検証機能をもつTest Double
  • Fake・・・本番用クラスを簡易版実装したTestDouble

14 Oct 2013, 01:48

CentOS 6.4でC++11対応のg++ 4.7.2を使うためのメモ

c++11対応のg++をCentOSに入れてみた作業メモ。

yum installで取れるCentOSのデフォルトg++のバージョンは4.4.7(2013/10現在)。

% g++ --version
g++ (GCC) 4.4.7 20120313 (Red Hat 4.4.7-3)

なので、別のリポジトリからg++4.7.2を持ってきて、CentOSにインストールしてみた。

以下のコマンドで取得。

cd /etc/yum.repos.d
wget http://people.centos.org/tru/devtools-1.1/devtools-1.1.repo 
yum --enablerepo=testing-1.1-devtools-6 install devtoolset-1.1-gcc devtoolset-1.1-gcc-c++

以下のパス配下にインストールされます。

 /opt/centos/devtoolset-1.1/root/usr/bin/

インストール完了です。

# /opt/centos/devtoolset-1.1/root/usr/bin/g++ --version
g++ (GCC) 4.7.2 20121015 (Red Hat 4.7.2-5)

パスを通します。

export CC=/opt/centos/devtoolset-1.1/root/usr/bin/gcc
export CXX=/opt/centos/devtoolset-1.1/root/usr/bin/g++

Trouble Shooting

[Errno 14] PYCURL ERROR 6 – “Couldn’t resolve host ‘people.centos.org’“

PYCURL ERROR 6 – “Couldn’t resolve host ‘people.centos.org’“というエラー発生。

# yum --enablerepo=testing-1.1-devtools-6 install devtoolset-1.1-gcc devtoolset-1.1-gcc-c++
Loaded plugins: fastestmirror
Loading mirror speeds from cached hostfile
 * base: ftp.tsukuba.wide.ad.jp
 * extras: ftp.tsukuba.wide.ad.jp
 * updates: ftp.tsukuba.wide.ad.jp
http://people.centos.org/tru/devtools/6/i386/RPMS/repodata/repomd.xml: [Errno 14] PYCURL ERROR 6 - "Couldn't resolve host 'people.centos.org'"
Trying other mirror.
Error: Cannot retrieve repository metadata (repomd.xml) for repository: testing-devtools-6. Please verify its path and try again

これは、ipv6が有効になっていることによる問題のようだ。

以下を参考にした。

ipv6を無効にする。

% emacs /etc/sysconfig/network
=> NETWORKING_IPV6=noを追加
% emacs /etc/modprobe.conf
=> 以下を追加
   alias ipv6 off
   alias net-pf-10 off
% /sbin/chkconfig ip6tables off
% shutdown -r 0

[Errno 14] PYCURL ERROR 22 – “The requested URL returned error: 404 Not Found”

“The requested URL returned error: 404 Not Found”というエラー。

% sudo yum --enablerepo=testing-1.1-devtools-6 install devtoolset-1.1-gcc devtoolset-1.1-gcc-c++
Loaded plugins: fastestmirror
Loading mirror speeds from cached hostfile
 * base: ftp.tsukuba.wide.ad.jp
 * extras: ftp.tsukuba.wide.ad.jp
 * updates: ftp.tsukuba.wide.ad.jp
http://people.centos.org/tru/devtools/6/i386/RPMS/repodata/repomd.xml: [Errno 14] PYCURL ERROR 22 - "The requested URL returned error: 404 Not Found"
Trying other mirror.
Error: Cannot retrieve repository metadata (repomd.xml) for repository: testing-devtools-6. Please verify its path and try again

これは、ftp.tsukuba.wide.ad.jpのミラーサイトには、testing-1.1-devtools-6のリポジトリが存在しないということ。

というわけで、ミラーサイトを変更してみます。理化学研究所に変更しました。以下にまとめました。

Reference

14 Oct 2013, 01:45

yum updateのミラーサイトを理化学研究所(理研)に変更したメモ

yum updateのミラーサイトを、いままでは筑波大学(ftp.tsukuba.wide.ad.jp)としていたのだが、ある不具合のため理化学研究所(ftp.riken.jp)をデフォルトのミラーサイトに変更してみた。理研のほうが、早いらしいといううわさも。

変更はCentOS-Base.repoを修正

変更は、/etc/yum.repos.d/CentOS-Base.repoを修正する。

  • mirrorlistをコメントアウト
  • baseurlを mirror.centos.orgからftp.riken.jpに変更。これをすべてのカテゴリで実施。

/etc/yum.repos.d/CentOS-Base.repo

/etc/yum.repos.d/CentOS-Base.repoの設定。そのままコピペでOk.

[tsu-nera]% cat /etc/yum.repos.d/CentOS-Base.repo

13 Oct 2013, 12:23

git pushで『You can’t push to …』でエラーする場合の対処方法メモ

久しぶりに、git pushをしてみたところ、以下のエラーがでて利用できなかった。

% git push
fatal: remote error:
  You can't push to git://github.com/tsu-nera/dotfiles.git
  Use https://github.com/tsu-nera/dotfiles.git

う~ん、なんでだろう。日頃pushしてないからかな・・・。

調べてみたところ、.git/configの設定が間違っているようだった。

%cat .git/config

[remote "origin"]
    url = git@github.com:tsu-nera/dotfiles.git

このurlの部分を以下のように変更する。

(変更前)url = git://github/com:tsu-nera/dotfiles.git
(変更後)url = git@github.com:tsu-nera/dotfiles.git

これで、git pushが成功するようになった。

06 Oct 2013, 05:35

Coursera Algorithms PartⅠを受講しました

アルゴリズムの知識を強化するために、Coursera Algorithms PartⅠを受講しました


Algorithms, Part I | Coursera


TopCoder対策の方法を探していたら、オンライン大学 Courseraの存在を知り、アルゴリズムのコースを受講してみた。初の受講ということで、感想を書いてみようと思います。

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

2つの壁

2つの言語の壁があっだ。EnglishとJavaだ。

英語はできないので、そもそもLectureを聞き取れるのかという疑問はあったものの、意外に大丈夫だった。たぶん、Sedgewick先生の英語がゆっくりでわかりやすかったからだと思う。これはけっこう自信がついた。

どちらかというと、Javaのほうが初めはけっこうきつかった。コンパイルの方法がわからん。Assignmet以前に、開発環境をEclipseで整えるのにアタフタ。でも、慣れてくればC++と大して変わらないことに気づく。これも自信がついた。内容的には、Javaの実装に関することも取り上げられていて、勉強になる。たとえばイテレータの使い方とか、汎用的なインターフェースに対する考察(Comparable型)など。

TopCoder対策

TopCoderの対策になったかというと、これはなったとは言えるものの効果的な方法ではなかった。

  • TopCoderは道具を使っていかにして問題を解くかが求められる。
  • Lectureでは道具そのものがどういうふうにできているかが説明される

とはいえ、Lectureの中でもアルゴリズムの使われ方の事例だったり、Assignmentではアルゴリズムを応用して問題を解いたりするので、全く一辺倒ではない。大学のLectureということもあるのだろう、比重は基礎よりだ。

Assignmentの内容が充実していて面白かった。

学習のススメ方について

ブリンストン大学のSedgewick先生による講義。

Lectureの動画をみて、Excerciseの問題を解いて、Assignmentを解くという繰り返し。Lectureを見るためのiPhone/iPadアプリがあるが、これはバグってて使えなかった。Chromeからいつでもどこでも動画を見れた。これが、Online大学の素晴らしいところだ。地獄の満員電車のなかでさえ、ジムのランニングマシンの上でさえ、Lectureを聴くことができる。

学習時間は、平均が週10時間とは書いてあったものの、自分の場合は週15時間(Lecture 5時間/Assignment 10時間)かかった。土日のうち、必ずどちらか1日はCourseraの勉強で潰れた。場合によっては、休日は土日の両方か潰れた(ノД`)

参考書籍は以下。買わなくても講義のスライドでなんとかなる。1000ページ!!

内容について

毎週の内容はこんな感じ。

  • week1 UnionFind いきなり知らないアルゴリズムがでてきたけれども、難しいことはなかかった。あとメモリと実行速度の計算。Assignmentはモンテカルロ・シミュレーションをつかった数値実験。
  • week2 スタックとキュー。それから、選択ソート、挿入ソート、シェルソートなどの簡単ソートアルゴリズムの紹介。このへんはまだ優しい。
  • week3 マージソートとクイックソート。そしてその発展形。再帰関数の紹介がマージソートでされる。このあたりから難しくなってきて追い詰められてくる。Assignmentは、パターン認識。
  • week4 ヒープ構造やヒープソートの紹介。BST。Assignmentは8puzzleというパズルをアルゴリズムで解く。キューを利用した幅優先探索。
  • week5 Sedgewick先生が考えた、Red-Black BSTが解説される。本人から解説されると、おおすげえとおもった。テクニックとしては、ここで深さ優先探索が出てくる。AssignmentはKd-treeの実装。
  • week6 ハッシュデータ構造と探索。あと、setをつかった検索方法も応用として紹介される。インデックス検索の仕組みが解説されていて、なるほどと思う。Assginmentはなくて、FinalExamがある。

全体として、自分にはレベルが高く、半分くらいしかワカラなかったし、問題も解けなかった。最後の方はなかなかグロッキー。

 終わりに

学生のころはあまりまじめに勉強しなかったし、頭も成績も悪くて院には進まずに就職した。学生のころに勉強していなかったのをとても後悔している。とくに、今の仕事では、ハードウェアに関する知識が必須だけれども、自分は情報系を専攻したのでまったくない。また、統計をしっかり勉強しなかったことにも後悔している。

Courseraは教育の格差をなくし、全ての学ぶ意欲のあるひとに機会を与えてくれる。社会人の自分にも、Courseraを通じて再び学問に触れることができることはとても嬉しいことだ。

理想的には、1度に2つのコースを受講したいが、勉強時間の確保が難しいかな。。週20~30時間。定時退社したい。とりあえず、生活と人格が破綻するまで頑張る。

次は、Algorithms PartⅡに挑戦!

29 Sep 2013, 04:23

『Modern C++ Programming with Test-Driven Development』写経環境をWindows上のCentOSに構築

C++ の TDD本、『Modern C++ Programming with Test-Driven Development』の写経環境を構築するためのメモです。

[toc]

ebookはここから購入できる。

各ツールの説明は、書籍の第1章に載っています。自分のPCはWindowsなのですが、Virtual Box 上に CentOSをインストールしてそこに開発環境を構築し、、Sambaを経由してWindows上のEclipse上から写経をしようと考えています。なので、ベースは CentOS。そのへんの導入方法は過去記事を参照のこと。

Windows環境だと、CygwinのgccやVisualStudioを利用するてもあるけれども、コンパイル時間が遅いので今回はやめた。

環境

  • CentOS 6.4(on VirtualBox on Windows 7 64bit)
  • Eclipse 4.3 kepler

ソースコードの取得

githubはこのリンクから。

コードはここからダウンロード可能。

g++

CentOSでは、C++11対応のg++4.7.2をインストールするには一工夫が必要。

cmake

サンプルコードのコンパイルには、cmakeを利用するので必要。

sudo yum -y install cmake
% cmake -version
cmake version 2.6-patch 4

Google Mock

この本の主人公、GoogleMockをインストールします。

まずは、gmockをサイトからダウンロードして解凍。最新版は1.7だが、現時点(201310)では、1.7だとサンプルテストがエラーしたので、1.6で入れる。

以下のサイトからダウンロード。

落としたら適当な場所におく。SampleSourseのcmakeでのビルドのために、パスを通す。

export GMOCK_HOME=/home/tsu-nera/tools/gmock

GMOCK_HOMEで、以下を実行。

mkdir mybuild
cd mybuild
cmake ..
make

続いて、gtestの方もビルドする。

cd $GMOCK_HOME/gtest
mkdir mybuild
cd mybuild
cmake ..
make

サンプルコードを動かて、テストが成功すればOK.

cd /home/tsu-nera/repo/modernCTDD/c2/2
cmake CMakeLists.txt
make
./test
[==========] Running 1 test from 1 test case.
[----------] Global test environment set-up.
[----------] 1 test from SoundexEncoding
[ RUN      ] SoundexEncoding.RetainsSoleLetterOfOneLetterWord
[       OK ] SoundexEncoding.RetainsSoleLetterOfOneLetterWord (0 ms)
[----------] 1 test from SoundexEncoding (1 ms total)

[----------] Global test environment tear-down
[==========] 1 test from 1 test case ran. (1 ms total)
[  PASSED  ] 1 test.

おまけ、VisualStudioへのGoogleMock導入方法は以前まとめた気がした。

Eclipseの設定

Windows上でのEclipseの設定。前述のとおり、ここでは、Sambaを経路してWindows上から使います。Sambaの設定は省略です。

プロジェクト・エクスプローラを右クリックして、

  • インポート -> C/C++ -> Existing Code as Makefile Project

次に、ヘッダファイルのパスを設定する。プロジェクトのプロパティから

  • C/C++一般 -> パスおよびシンボル

を選択する。インクルードでGMockとGTestのインクルードパスを追加。

Z:\tools\gmock\include
Z:\tools\gmock\gtest\include

リモートビルドの設定はめんどくさかったので、とりあえずビルドはコンソールからコマンドを叩きます。

とりあえず、ここまでで初めの章をすすめる準備が整った。あとはひたすら読み進めるのみだが。。。Keine Zeit!!!

libcurl

Chapter5で必要となる。サイトから最新版をダウンロード。

以下のコマンドでインストール。

tar zvxf curl-7.32.0.tar.gz
export CURL_HOME=/home/tsu-nera/tools/curl-7.32.0
cd $CURL_HOME
mkdir build
cd build
cmake ..
make

JsonCpp

Chapter5で必要となる。サイトから最新版をダウンロード。

インストールには、pythonで書かれたビルドツールsconsというものが必要らしい。(makeのようなもの)。以下から落とす。

適当なところに解凍する。setup.pyが中にあるので、sconsをインストール。

sudo python setup.py install

つづいて、jsonをビルドする。

tar zvxf jsoncpp-src-0.5.0.tar.gz
export JSONCPP_HOME=/home/tsu-nera/tools/jsoncpp-src-0.5.0
cd $JSONCPP_HOME
scons platform=linux-gcc
cd $JSONCPP_HOME/libs
cp linux-gcc-4.4.7/libjson_linux-gcc-4.4.7.so libjson_linux-gcc.so

環境変数のバージョン(gcc 4.4.7)でしか、ビルドできなかった。。。とりあえず動作する。

追記:ビルドのために以下も。

export LD_LIBRARY_PATH=$JSONCPP_HOME/libs:$LD_LIBRARY_PATH
export LD_LIBRARY_PATH=$CURL_HOME/build/lib:$LD_LIBRARY_PATH

Boost

C++をbotstさせるライブラリ群、Boostをインストールします。以下から、最新版を落とす。

任意のディレクトリに配置して、パスを通す。

tar zvxf boost_1_54_0.tar.gz
export BOOST_ROOT=/home/tsu-nera/tools/boost_1_54_0
export BOOST_VERSION=1.54.0

続いて、必要なライブラリをBuildする。

cd $BOOST_ROOT
./bootstrap.sh --with-libraries=filesystem,system
./b2

CppUTest

レガシーコードに対するモックはGoogleMockよりも、CppUTestのほうがモックしやすいという理由で、CppUTestも紹介されている。以下からダウンロード。

以下でインストール。

tar xvzf cpputest-3.3.tar.gz
export CPPUTEST_HOME=/home/tsu-nera/tools/cpputest-3.3
cd $CPPUTEST_HOME
make
make -f Makefile_CppUTestExt

※3.4,3.5はまだ動かない。

rlog

Chapter8でrlogが使われます。

rlog – C++ logging library – Google Project Hosting

以下でインストール。

tar xvzf rlog-1.4.tar.gz 
export RLOG_HOME=/home/tsu-nera/tools/rlog-1.4
cd $RLOG_HOME

27 Sep 2013, 14:45

潜在バグに苦しむ日々

バグにハマって辛い思いをしている。

if else文で、必ずelseになるというバカらしい単純バグ。

いろいろ怒られて謝る。バグの作り込み原因の分析をして、再現試験と類似の試験をたくさん実施して、報告資料も作成して、今週は精神的に参った。

自分でつくりこんだものならばしょうがないと思う。しかし、これが自分で作ったものでないから虚しい。4年前にバグは仕込まれ、自分は半年前に担当者になったが、正直、機能を全ては理解していない。

設計書に仕様は書いていないし、テストコードもない。というより、テストしていないらしい。!自分でテストコード書いたら、10分あればテストハネースに組み入れられたので、実施しないのは単なる怠慢。

設計書に仕様を書かない理由は、この処理はなにがおこるかわからないので、なにが起こっても大丈夫なようにいろいろと論理を入れている。だから設計書にはなにもかかないそうだ。

恐るべきレガシーコードだ。そうはいっても、なにも始まらないので、笑顔でレガシーコードに向きあおう。

22 Sep 2013, 15:24

重複コードを撃退!DRY原則をC言語で実践するためのCPDを調べた

はじめに

TDDが好きなので、コードの重複を計測するツール PMDについて調べてみた。

DRY原則とは

DRY原則とは、”Don’t Repeat YourSelf”の略。

簡単に言ってしまえば、コピペするな、ということだ。

重複なコードを書くならば、リファクタリングして、共通部分は共通化しようという考え方。

CPDで重複コードを計測する

このコードの重複さを計測するツールが PMDだ。PMD公式サイトから最新版をダウンロードする。

PMDはJAVA用のツールだが、それに付随するCPDというコマンドで、オプションにJAVA以外の言語を指定すると、他の言語でも使える。(C言語, C++, PHPとか)

Windowsの場合

<div class="outline-text-3" id="text-3-1">
  <p>
    zipファイルを解凍したら /bin配下に cpd.batというファイルがある。 これがコマンドラインから実行するためのコマンドになる。
  </p>

  <p>
    cpdの使い方は以下の通り。
  </p>

  <pre><code>cpd 

–minimum-tokens xxx 重複差を指定する。xxxを50にすれば50行以上の重複を報告 –files xxx ファイルのパス [–language xxx] 言語。自分はC言語を使いたいので –language c みたいな [–encoding xxx] エンコード指定 [–format (xml|text|csv|vs)] 出力フォーマット指定

  <p>
    例えば、重複度10でC言語でXML出力ならば、こんな感じ。
  </p>

  <pre><code>“C:\Program Files (x86)\pmd-bin-5.0-alpha\bin\cpd”

–minimum-tokens 10 –files src –language c –format xml>cpd_result.xml

  <p>
    最後にリダイレクトでファイルに出力してやる。
  </p>

  <p>
    現在の最新版 pmd 5.0だとエラーして苦労した。
  </p>

  <ul class="org-ul">
    <li>
      <i>CPDでsaxon9-dom.jarがないよと怒られ</i>
    </li>
  </ul>
</div>

Jenkins DRY Pluginを入れる

XML形式で出力した結果をJenkinsで表示してみる。

をJenkinsのプラグインで追加する。

プラグインをインストールすると、[ビルド後の処理の追加]で重複コード分析の集計が現れるので、さきほど出力したファイルを追加。

image

出力結果

image

 

はじめに

TDDが好きなので、コードの重複を計測するツール PMDについて調べてみた。

DRY原則とは

DRY原則とは、”Don’t Repeat YourSelf”の略。

簡単に言ってしまえば、コピペするな、ということだ。

重複なコードを書くならば、リファクタリングして、共通部分は共通化しようという考え方。

CPDで重複コードを計測する

このコードの重複さを計測するツールが PMDだ。PMD公式サイトから最新版をダウンロードする。

PMDはJAVA用のツールだが、それに付随するCPDというコマンドで、オプションにJAVA以外の言語を指定すると、他の言語でも使える。(C言語, C++, PHPとか)

Windowsの場合

<div class="outline-text-3" id="text-3-1">
  <p>
    zipファイルを解凍したら /bin配下に cpd.batというファイルがある。 これがコマンドラインから実行するためのコマンドになる。
  </p>

  <p>
    cpdの使い方は以下の通り。
  </p>

  <pre><code>cpd 

–minimum-tokens xxx 重複差を指定する。xxxを50にすれば50行以上の重複を報告 –files xxx ファイルのパス [–language xxx] 言語。自分はC言語を使いたいので –language c みたいな [–encoding xxx] エンコード指定 [–format (xml|text|csv|vs)] 出力フォーマット指定

  <p>
    例えば、重複度10でC言語でXML出力ならば、こんな感じ。
  </p>

  <pre><code>“C:\Program Files (x86)\pmd-bin-5.0-alpha\bin\cpd”

–minimum-tokens 10 –files src –language c –format xml>cpd_result.xml

  <p>
    最後にリダイレクトでファイルに出力してやる。
  </p>

  <p>
    現在の最新版 pmd 5.0だとエラーして苦労した。
  </p>

  <ul class="org-ul">
    <li>
      <i>CPDでsaxon9-dom.jarがないよと怒られ</i>
    </li>
  </ul>
</div></p>

Jenkins DRY Pluginを入れる

XML形式で出力した結果をJenkinsで表示してみる。

をJenkinsのプラグインで追加する。

プラグインをインストールすると、[ビルド後の処理の追加]で重複コード分析の集計が現れるので、さきほど出力したファイルを追加。

image

出力結果

<div class="outline-text-2" id="text-5">
  <a href="http://hmi-me.ciao.jp/wordpress/wp-content/uploads/image27.png"><img style="background-image: none; padding-left: 0px; padding-right: 0px; display: inline; padding-top: 0px; border: 0px;" title="image" src="http://hmi-me.ciao.jp/wordpress/wp-content/uploads/image_thumb27.png" alt="image" width="566" height="281" border="0" /></a> </p> 

  <p>
    Jenkinsさんと一緒に思わずニンマリ。
  </p></p>
</div></p>