CouchDBのデータはYAMLでつっこめるよ、と思ったら空の配列の表記
CouchDB用のUnitTestをかけるようにしておこうと思って、fixtureもどきを作っているんだけれど。
YAMLとJSONはそのまま互換です、と思いきや、YAMLで長さ0の配列ってどうやって表現するんだ、という罠があって試してみた。
>> {:a => 1, :b => 2, :c => 3, :d => [], :e => [1,2,3]}.to_yaml => "--- \n:e: \n- 1\n- 2\n- 3\n:c: 3\n:a: 1\n:d: []\n\n:b: 2\n"
ふむ。name: [] でいいんだ。
>> YAML.load({:a => 1, :b => 2, :c => 3, :d => [], :e => [1,2,3]}.to_yaml)[:d] => []
Yes, sir.
CouchDBでRuby/RailsのTestUnitを使う
必要なデータは test/fixtures/couchdb/**/*.yml にいれておきます。以下のスクリプトをRAILS_ROOT/lib あたりにおいときます。
class CouchFixture def self.load(basedir = File.join(RAILS_ROOT, "test/fixtures/couchdb/")) Dir.glob("#{basedir}/**/*.yml") do |f| # resolve class file = f.gsub(/^#{basedir}\//, '').gsub(/\.yml$/, '') klass = file.singularize.camelize.constantize # load yaml file content = YAML.load(ERB.new(File.read(f)).result) if content content.each do |key, value| value.symbolize_keys! value[:_id] = key unless value[:_id] obj = klass.find(value[:_id]) rescue nil obj.destroy if obj obj = klass.new(value) obj.save! end end end end end
RAILS_ROOT/test/test_helper.rb で fixture :all というところがあるはずなので、こんな感じでCouchFixture.load を追加しておきます。
# -- they do not yet inherit this setting fixtures :all # Add more helper methods to be used by all tests here... CouchFixture.load end
なお、ActiveRecord の Fixture との違いは、、、テーブルという概念がないので、DELETE FROM table_name 相当のクリア処理が発行されないことです。データベース管理でなんとかしましょうか、ということで次のエントリ。
CouchDBでrake couchdb:create:all, couchdb:drop:all
うーん、書くのが面倒なので、ソースへのりんく。
http://www.webjourney.org/svn/trunk/lib/tasks/couchdb.rake
ActiveRecord とちがって、マルチデータベース対応です(そうしないとCouchDBの意味がないから)
作ったものの整理
そのうち正式にWebJourneyのサブプロジェクトとして公開しますが、とりあえずは、、
- CouchResource : ActiveRecord::Base と似たような機能を提供するCouchDB用ObjectMapper
- CouchConfig : Rails 環境で使うためのライブラリ。config/couchdb.yml にデータベース定義を書いておくと幸せになれるかもしれません。
- CouchFixture : CouchResourceのFixture 用ライブラリ。
- CouchDB Tasks : CouchDB用create/dropのできるrakeタスク。
後者3つは最初のやつに統合すべきなんだろうけど、うまく設計がまとまっていないので外だしです。おそらくレプリケーションとかビューとかそのあたりをどう活かすかによって変わるんだと思います。
http://jchris.mfdz.com/posts/122 とか参考になりそう。考えていることがひじょーに似ている。
が、まずは自分のアプリでうまく使えるモデルで実装して、それを汎化する方法でいこうかと。。
MacBookのスロットローディングドライブの問題判別...?
開発中は、特にCPUリソースを食わないので、自宅にあるCDやDVDなどのコンテンツをひたすらリッピングしてiPhoneにつっこむ作業を平行しております。特に今はデザイン
作業というかjQueryとCSSをいじくり倒しているので右脳を活発にするために、音とか映像とかをバックグラウンドで常に流し続け...
おかげでiPhone 3Gのデータ領域が見事に14GBに到達して、もうアドレス帳も追加がほぼ不可能なぐらいまで使い果たしています。
それはともかく、せっかくの機会なのであらゆるCD/DVDをHDDの中に取り込もうとしていますが、少しだけ解せない状況が生まれています。
- DVD は普通に読み込むことができる
- CD のうち、Macのドライブで読み込むことができずに、マウントが失敗して勝手に排出されるものがある
- そのCDはDell製のマシンのWindows上では読み込み,マウントすることができる
- すべてのCDがMacで読み込めないわけではなく、一部のCDだけである。
DVDが読めて、CDが読めない、という話はなんとなくわかるのですが、CDのなかでも読めるのと読めないのがあって困ってしまいます。もしかしたらそれぞれのCDのTOCの位置の問題?っていう話かもしれません。これは修理にだすべき症状なんですかね。
とりあえずは、USB外付けのCD/DVDドライブをMacBookにくっつけた場合は、問題のあるCDでもマウントできているので問題ないんですが。