Mac OS X で mongoDB

1st Jul, 2010 | mongodb

出張とか旅行で家を空ける機会が多かったので久しぶりになってしまった。

普段はFreeBSDをサーバ用途で使っているのだけど、Macでも手軽に実行できるので紹介してみる。ダウンロードして展開する以外、特にインストール作業いらない。もろもろなパッケージ管理ツールみたいなものを使ってもいいけど、遊ぶぐらいならこれで十分かな。

とりあえず、 ここ から適当にダウンロード。(OS X 64-bit の 1.5.X とか)

次に、mongoDBのデータを入れるディレクトリを作成。

$ mkdir /somewhere/mongodb_data

後は、ダウンロードして展開したmongodを実行するだけ。

$ /foo/bar/mongodb-osx-x86_64-1.5.3/bin/mongod --dbpath=/somewhere/mongodb_data

オプションを何もつけないとフロントエンドで実行される。バックグランドで実行したい場合には、 --fork --logpath=/somewhere/mongodb.log とか付ける。

接続できるか、mongoコマンドで確認

$ /foo/bar/mongodb-osx-x86_64-1.5.3/bin/mongo
MongoDB shell version: 1.5.3
connecting to: test
type "help" for help
> 

エラーが出ないでプロンプトが出たら完了。

後は チュートリアル をやってみるもよし、お好みの言語でいじるもよし、mongoライフを楽しみましょう。



今週のMongoDB翻訳

27th Mar, 2010 | mongodb

日本滞在中でいまいち調子が狂う。今週は更新のみ。



今週のMongoDB翻訳

20th Mar, 2010 | mognodb

地道にやってます。

新規

更新

aboutの下とcontributorsの下をやりたいんだけど、手が回らない。



TDDを真面目にやってみて気付いたこと

18th Mar, 2010 | development tdd

何を今更、なことかもしれないないのだけど、もしかしたらこれを知ることでTDD(Test-driven development)をやることのハードルが一気に下がる人がいるかな、と思ってメモ。 特に、ある程度プログラマとして経験があるけど、どうもTDDは慣れないという人向き。


“TDDとは、TDD以前に脳内や機上でやっていたことをコードに落とすことに過ぎない”

このことが解ってから、TDDをするのが一気に苦痛ではなくなり、むしろ楽しくなった。

TDDでなくても、コーディングをするとき、temporaryなテストコードを書いたり、目視でのチェックはしたりするものだろう。たとえば、一時的に変数の値をハードコードして挙動を変えてみて、それを目視で確認したり、printデバッグとかもその一部だ。

つまり、このtemporaryなコードや目視している部分をpermanentにするのがTDDで書くテストコードだということがわかった。

TDDであろうが、なかろうが、考えないといけないこと、やらないといけないことはたいして変わらない。たいして変わらないなら、テストコード書いておいた方が得。

テストコードがあれば、チーム内で技術や知識の共有もテストコードを通じてしやすくなるし、コードレビューだって、コードとテストがセットの方がやりやすいだとやりやすい。

単純に、テストファーストでやらないのは色々と損だよね。って感じ。


後は、おまけみたいなものなんだけど、自分でTDDしたり、人のTDDでしたコードを見たりして、いくつか思ったことをメモ。

1. TDDでコードや設計がきれいになるのは、プログラマをさぼらせないから

いいコードでないとテストが書きにいので、「いいコードを書くのをさぼれない」ってことになって、結果的にきれいなコードにはなりやすい。人はさぼるものなので、これ重要。

2. TDDのUnit Testは自作自演

TDDでは、テストコードを書く人と実際のコードを書く人は通常同じなので、どうしても自分の都合のよいテストコードを書いてしまいがち。また、仕様を誤解してても、その誤解したままのテストコードになって、テストは通る。もちろん、自作自演だからこそ、1.の恩恵を得れる。

3. ある程度の範囲に影響するリファクタリング時の動作の保証は微妙

Unit Testは、どちらかというとホワイトボックス的なテストなので、リファクタリング時にもあわせて変えないといけないことも多い。そのため、ある程度の範囲を直す場合、Unit Testだけでは不十分。動作の保証という意味ではブラックボックス的なcucumberみたいなテストも組み合わせないと厳しい。(もちろん自動化以外のテストも必要だけど、これは別の話)

これはTDDってよりUnit Testの話か。

4. テスト自体の知識も大切

当然なんだけど、TDDをするようなツールの知識だけではなくて、ある程度のテストの知識がないと良いテストは書けない=良いTDDはできない。テストの知識ってのはCOBOLの時代(もっと前かな)から変わってないような知識。境界値チェックとか(ちなみに、こういうの勉強するのに情報処理試験の勉強ってなかなか侮れない)。

単純な例を挙げると、ある条件での平均値を求める、と言ったコードに対するテストで、テストコードで使うテストデータがその「ある条件」のものしか用意してなく、「ある条件」以外のものを用意してないといったケース。この場合実際のコードの方に「ある条件」が抜けていてもテストは通ってしまう。超基本なんだけど、それすらできてないテストを見かける。

単体テスト仕様書を何百枚も手書きしていた世代のノウハウをゲットすべき(関係ないけど、Key-Value Storeな方面でもあの世代のノウハウって役に立ちそう)。

ちょっと逸れるけども、知識どうこうではなくて、手を抜いてしまっているダメなテストももちろんダメ。

たとえば、Rubyとrspecでの例になってしまうが、 foo.should_not be_nil を安易に使いすぎるとか。foo.should == something とちゃんと書けるようなケースなのに、should_not be_nil で手を抜く。

他にも、Mock/Stubを使いすぎて、何もテストしてない状態になっている、とか。笑い話みたいだけどたまにある。

こういうのは「自分が何をテストしているのか」というのをしっかり意識しないと陥りがち。

そういえば、「TDDは品質のためじゃない!」 と、でかい声で言ってる人でも、多分このぐらいのことは当然やってる人たちなんだろうけど、なんか誤解は与えそうだね。とは思った。



MongoDBが起動しなくなった場合

16th Mar, 2010 | mongodb

なんだか、「MongoDB強制終了したら二度と起動しなくなった。もう使わない!」的なのを今日二ヶ所で見かけて、せつなくなったので今後ググられて目に止まることを願って書いておく。っていうか、ログぐらい見ようよ!

まず、正常に終了処理をしなかった場合、そのままでは、MongoDBは次回に起動しません。仕様です。ドキュメント的には、Durability and Repair (日本語) がそれにあたる。

このときログファイルを見ると、こんな感じになってるはず。

**************
old lock file: /var/db/mongodb/mongod.lock.  probably means unclean shutdown
reccomend removing file and running --repair
see: http://dochub.mongodb.org/core/repair for more information
*************

lockファイルはrepairコマンドが消してくれるので、自分で削除する必要ないので、--repairを実行しておけば大丈夫。

> mongod --dbpath=/var/db/mongodb --repair 

みたいな、感じで実行する。 dbpathはデータベースがある場所。これはFreeBSDのパッケージでの標準の場所なので各自の環境にあわせること。

このコマンドはデータを直した後、そのまま終了してしまうので、その後で通常の方法でmongodを起動し直せばok。