VC2008でCppUTest

http://cpputest.github.io/ からzipをダウンロード。

Releaseバージョンは3.4


解凍して、CppUTest_VS2008.slnを開く。


AllTestsとCppUTestというプロジェクトがあるので、CppUTestをビルドすると、CppUTest.libができる。これと、includeフォルダを自分のプロジェクトフォルダに丸々コピーした。(いや、パスが通っていればいいだけだとは思うが…)

このCppUTest.libを使うと、「関数定義が被ってるぜ!」ってエラーが出るので、とりあえずCPPUTEST_USE_STD_CPP_LIB=0を定義してビルドしなおした。

再定義エラーはでなくなったので試してみる。

#include "CppUtest/CommandLineTestRunner.h"

int _tmain(int argc, _TCHAR* argv[])
{
	return CommandLineTestRunner::RunAllTests(argc, argv);
}

この状態で、[Unicode文字セットを使用する]でビルドすると、エラーが出た。wcharバージョンはないらしい。

もしかして、文字列比較(STRCMP_EQUAL)とかもwchar版は無いのかな…?よくは調べなかったがとりあえず不便なので以下のマクロで対処。

std::string widechar_to_multibyte(const wchar_t * wide)
{
	std::string multi_byte;
	int size = (wcslen(wide) + 1) * 2;

	char * buf = new char[size];
	if (buf) {
		int ret = ::WideCharToMultiByte(CP_ACP, 0,
			wide, -1, buf, size, NULL, NULL)
		if (ret > 0) {
			multi_byte = buf;
		}
		delete [] buf;
	}
	return multi_byte;
}

#define WSTRCMP_EQUAL(expected, actual) STRCMP_EQUAL(\
	widechar_to_multibyte(expected).c_str(),\
	widechar_to_multibyte(actual).c_str())

これで、

TEST_GROUP(MyTestGroup)
{
};

TEST(MyTestGroup, wide_char_comp)
{
	std::wstring a = L"a", b = L"b";
	WSTRCMP_EQUAL(L"ab", (a + b).c_str());
}

うん、良さそう。

ある文字列が含まれていたらコミットを中断する hook

以下を参考に、Windowsのコマンドで使えるものを書いてみた。

http://mercurial.selenic.com/wiki/UsefulHooks

[hooks]
pretxncommit.nocommit = hg export tip | findstr /R "^+.*NOCOMMIT" & if errorlevel 1 (exit /b 0) else (exit /b 1)

findstr が文字列が見つかった時に0を返すので、戻り値を反転してやる。

研究報告書が書けない私へ

"研究"開発部に所属しているのだが、今年度の研究報告書を提出しろと言われた。えっ?開発しかしてないけど…IT土方やもん。ってか、そんなもの去年もあったっけ?年度初めに研究テーマのようなものを提出した記憶はうっすらあるが。悶々としつつも、見て見ぬふりをしていたら締切が間際。

「開発業務が忙しくて、研究とかできてないんスよ〜」と一応言ってみる。「決まりですから」と一蹴。 私のメンター(制度ではなく勝手に思ってる、ってそのまんまだけど)は、今年書いた論文をそのまま提出したとのこと。「卒業論文と同じような構成で短くまとめればよい」とのアドバイスをいただいた。

ふむ。卒業論文か。今年度やったことを組み合わせてでっちあげるしかあるまい。ということで、本やらブログやらを当たってみる。

理系のための「即効!」卒業論文術(ブルーバックス

問題設定 ⇒ 問題解決方法の選定 ⇒ 解決方法の実行可能性を検証

この流れは普段触れている仕様書とまったく同じかもしれない。続いて

証拠の提示 ⇒ 結論

“実験の説明がもっとも書きやすいパート”とあったが、これが中々難しい。「あ...ありのまま 今 起こった事を話すぜ!」ってことなんだろうけど、いや「書くぜ!」だけど、使ったデータの説明はどこに入れればいいんだろう、ここだと文章がつながらないし、などとウダウダ悩む。あと、言葉の意味をネットで調べていると、いつの間にかネットサーフィンしている自分がいる。

ブログ

これは決定版!!

卒業論文第0稿を1日ででっち上げる法 - 発声練習
締切前に「ヴァァァーーーー」となってしまったとき - 発声練習

実は、ヴァァァーーーーのほうは以前に別件でお世話になっているので効果は実証ずみだ。・・・。反省しろ私。

徹夜の末なんとか第0稿が完成。0稿だけど、第1稿にすら満たないけど、出します。時間がないので。

さて、徹夜明けで眠い眠い言っている私へ、上のブログよりの引用で次の言葉を送ります。

「じゃあ、もっと余裕をもって始めろよ。このクズ野郎!」

Windows7でUSBプリンタが共有できない

USBで接続したプリンタを共有しようとしたら、

プリンター設定を保存できませんでした。操作を完了できませんでした(エラー 0x000006d9)

というエラーがでた。ググってみるとWindowsファイアーウォールのサービスが無効だとこんなエラーが出るらしい。確かに標準のファイアーウォールは止めてある。
試しに、サービスを動かしてみると無事共有できた。

プリンタの設定とファイアーウォールは直接は関係ないのにエラーで設定できないってどうなんだ。そんなテストはされてないのだろうか…

『ガベージコレクションのアルゴリズムと実装』読了

1年以上積読になっていた『ガベージコレクションアルゴリズムと実装』を読んだ。前半は要素技術が並べてある「アルゴリズム編」、後半が実際にPythonVMなどに使われているGCが紹介される「実践編」に分かれている。

前半のアルゴリズム編では、「マークスイープGC」から始まり、基本的なアルゴリズムが紹介されていくわけだが、アルゴリズムも明快で順序良く説明されているので、読みやすい。GCのプログラムというと複雑怪奇なイメージがあったが、要素に分解するとシンプルで、種類も大したことないのだと感じる。どちらかというと、組み合わせ方の妙とか、ちょっとした工夫により効率を上げることが難しいのかもしれない。

後半は実用されているGCがいくつか紹介されている。この「実践編」、前半部分よりもページ数が多い。これは実例を出してページ数を稼ぐ作戦(ry ざっと流し読みしてしまったが、それぞれのGCに工夫や黒魔術があって楽しかった。

大学時代にGCを研究している友人がいて、「世代別GC」だとか「マークスイープGC」という言葉は聞いたことがあったし、語感から何となくイメージは持っていたのだけれど、実際のアルゴリズムを調べてみたことはなかった。そんなGC初心者の私にとって、この本はGCの基礎知識を学ぶのにちょうど良い内容だったと思う。本格的なGCを組むことはこれからもきっとないだろうけど、ちょっとしたメモリ管理を作るときなどにも参考になりそう。

単に読み物として読むにもおすすめです。

さくらVPSを使ってみる2

sudo の設定

XXXXはsudoを使うユーザー名

# usermod -G wheel XXXX

sudoの設定ファイルを編集

# visudo

コメントアウトされている次の1行を解除

%wheel  ALL=(ALL)       ALL

Ruby をインストール

# wget ftp://ftp.ruby-lang.org/pub/ruby/1.9/ruby-1.9.3-p194.tar.gz
# tar zxvf ruby-1.9.3-p194.tar.gz
# cd ruby-1.9.3-p194
# ./configure
# make
# make install
# cd ext/zlib
# ruby extconf.rb --with-zlib-include=/usr/include --with-zlib-lib=/usr/lib
# make
# make install

gemを実行するとlibyamlがないと言われる。

wget http://pyyaml.org/download/libyaml/yaml-0.1.4.tar.gz
tar zxvf yaml-0.1.4.tar.gz
cd yaml-0.1.4
./configure --prefix=/usr/local
make
sudo make install

Rubyディレクトリでもう一度 make & make install

さくら VPSを使ってみる

LINUXの勉強がてら自宅にサーバーを作ったりもしたが、いつも3日坊主で終わっている。そもそも、自宅のLANの中からしかアクセスできないので実用性はほとんどなくモチベーションもあがらない。

少なくとも、どこからでもアクセスできるとあれば触る回数も増えるし、少しでも便利だと感じられれば続くに違いないと思い立ち、VPSを利用してみることにした。プロバイダはとくに吟味せず最初に目に付いたさくらインターネットを利用することにした。情報も多いみたいだし。

登録

さくらインターネットのサイトから、VPSを選び「さくらのVPS 2G」に申し込みをした。月額1480円でメモリ2G、HD200G、仮想3コアのサーバーが利用できる。
 ユーザー情報を入力し会員登録とサーバーの申し込みをおこなうと、すぐに申し込み完了メールが来る。ただ、ここにはrootのパスワードなどは書いていない。登録は完了していないようだ。
 30分程後、仮登録完了のメールが来た。こちらにIPやルートのパスワードが書いてある。

初期設定

初期状態のままでSSHにて接続できるので、アクセスしてセキュリティ的に危ないところの設定を変えていく。

以下おこなった操作の簡単なメモとコマンド

  • root のパスワードを変更 [passwd]
  • 接続用のユーザーを作成 [useradd]
  • SSHの鍵を生成。(TeraTermで生成)
  • 公開鍵をサーバーにコピー
  • 公開鍵を $HOME/.ssh/authorized_keysに配置(デフォルトのパス)
  • SSHの設定ファイル /etc/ssh/sshd_config を編集
    • PermitRootLogin no
    • PasswordAuthentication no
    • Port 22 -> Port xxxxx (別のポートに変更)
  • sshdを再起動 [/etc/rc.d/init.d/sshd restart]
  • iptablesでパケットフィルタを設定
  • 接続用に作ったユーザーで公開鍵認証のSSHでログインできることを確認
  • 他の設定(パスワードやrootや22番ポート)でログインできないことを確認
  • ログオフ

今日はここまで。