Sinatra+mongoDB

11th Jan, 2010 | mongodb sinatra ruby

このブログシステムは Sinatra とKVS(とりあえず最初は mongoDB )で遊ぶために作った。

ここ数カ月、RoRを使って開発してみてるけど(その前はphp)、やっぱり色々と重厚すぎるので、ちょっとしたWebアプリには向いてない気がしている。

で、Sinatraを試してみたんだけどなかなかいい感じ。後発だけあってRoRをかなり意識した上で無駄を削ぎ落した感じ。「無駄」というと怒られるか。

今回はSinatraとMongoDBの繋ぎの部分に MongoMapper を使ってみた。ruby + mongoDBで、rubyからmongoDBを使う場合、まだまだ「デファクト」と呼べるような物はないみたい。いくつか同じような物が開発中のよう。その中からMongoMapperを選んだのは最低限の機能ありそう+開発が活発ってぐらい。ただ、最近twitterでmongoidってのがあるというのを知って、少し試してみたけどそっちの方がいいかもしれない。MongoMapperはヘタにActiveRecordを意識しすぎている感じがする。

SinatraからMongoMapperを使うのに特に難しいところはない。gemで両方インストールして後はドキュメントにある使い方をするだけ。たとえば、このブログで使ってる一番シンプルなクラスだと、

class User
  include MongoMapper::Document
  
  key :login, String, :required => true, :unique => true
  key :name, String, :required => true
  timestamps!
end

これだけで、後はActiveRecordっぽく使える。

例:

% irb19 -r app.rb
>> u = User.create!(:login=>'masatomo', :name=>'Masatomo Nakano')
=> #<User _id: 4b4b9e89a90e088f03000001, login: "masatomo", name: "Masatomo Nakano", created_at: 2010-01-11 21:56:25 UTC, updated_at: 2010-01-11 21:56:25 UTC>
>> u.name = 'Masatomo, updated'
=> "Masatomo, updated"
>> u.save!
=> true
=> 

% irb19 -r app.rb
>> u = User.find_by_login('masatomo')
=> #<User _id: 4b4b9e89a90e088f03000001, login: "masatomo", name: "Masatomo, updated", created_at: 2010-01-11 21:56:25 UTC, updated_at: 2010-01-11 21:56:40 UTC>
>>

みたいな感じでMongoDBを特に意識せずに使える。

mongoDBに限ったことではないけど、RDBMSを使う場合と違って新しいフィールドを追加した場合にもUserクラスだけ拡張すればいい。特に開発序盤ではこれがすごく楽。



ブログシステム作った

9th Jan, 2010 | evernote mongodb sinatra ruby

2010年にもなって自分でブログシステム作るとかあり得ないと思うんだけど、なんとなく作った。完全俺用。

Evernoteと連携

最近すっかりEvernoteどっぷり生活になってる。Webクリップとかはしてなくて、ほとんどがテキストの落書き。で、その中で技術的なメモとかは公開できそうな気がしてるのだけど、どうも公開用に書きなおすのはだるくて放置されてた。で、そのまま公開しちゃえばいいんじゃない?ってのがそもそもの発想。Evernote公式にもそれっぽい機能があるんだけど、どうもいまいちだったんでEvernote APIを使って自分で作ってみた。

それと、過去にも自分の作業ログ的なのを公開していたことがあるんだけど、いくつか問題点があって「一度公開したものを更新しづらい」「自分の手元のバージョンと公開してるバージョン差異」「公開したものを、自分のために見返すときにWeb上の検索はいまいち(ローカル検索には勝てない)」とかがあってだんだん更新しなくなってしまっていた。

Evernoteを使えば、その辺を解決できるかな、と思ったのもきっかけ。(裏の理由としては、SinatraとかMongoDBとかを実際のアプリの上で試してみたかった、というのがある。)

ブログとしての最低限の機能、もない

ブログとWikiの中間ぐらいのイメージで作ったので、色々と中途半端ではある。あるのはAtomフィード / Permanent Llink / Tag (Category) くらいかな。コメントくらいつけてもいいかなとは思ってるけどspam対策とかめんどくさ。 とりあえず、http://disqus.com/ つけてみた。

フレームワークはSinatra 

最近、会社でRuby on Railsをやっていて、それなりに楽しいんだけど、ちょっとしたアプリを作るにはいちいち重厚すぎるのでSinatraを使ってみた。結果は良好。ちょっとした社内のシステムとかはSinatraでいけそう。Sinatraについては別にメモを残す予定。

データベースはMongoDB

最近のNoSQLブームに乗っかってしばらくCouchDBで遊んでいたんだけど、どうもまだまだ実システムでは色々きついな、ってところがあって今回はMongoDBで実装してみた。データ量が少ないし、データ構造も単純なんで何とも言えないけど、なかなかいい感じ。

その他

後は普段使いのHaml/rspec/FactoryGirlあたりを使って手早く作った。それと、Ruby 1.9 専用。

それにしても、いまどきのフレームワークやらライブラリやら言語やらのおかげでこれくらいの物なら数時間で作れることに驚いた。一番めんどくさそうな記述部分が完全Evernote任せってのはある。一番時間がかかったのEvernote APIが提供するXMLからhtmlへ変換だったりするわけだけど。XSLTって数年に一度しか必要にならないから毎回1から調べさせられてめんどくさいけど、それなりに便利だからなー。

ブログあちこちに作っても書かねーじゃないか、は禁句。