平凡なエンジニアの独り言 はてなブログ出張所

ピアノをこよなく愛するエセRubyistが適当に書き綴ります

MongoDBにRubyからアクセスできるMongoRecordを使ってみている

ゲームを作れるウェブサービス - Rmakeでは、MongoDB : C++ で書かれた高速なドキュメント指向DB (ヽ( ・∀・)ノくまくまー(2009-07-02))にて紹介されているMongoDBとMongoDBにRubyからアクセスできるMongoRecordを使ってみています。使った感じが良かったので、簡単な使用例と適用方法を紹介します。

元記事を読んでMongoDBとMongoRecordのセットアップが終わっている人向けです。ただ、MongoRecordのインストールは以下のInstallationを読んでおく方が良いかもしれません。

検索関係

NoSQLなDBを使う場合、どれくらい検索機能が充実しているかが一番気になります。MongoDBはトランザクションを扱うことには向いていませんが、検索機能は充実しています。

まずは基本的な値から検索する方法について。

@hoges = HogeModel.find(:all, :conditions => {
  :foo_id => foofoo_id
})

範囲検索も以下のような書き方ができます。

# 以下のケースはnanika_value1 < nanika < nanika_value2 になります。
# また、$gteのようにeを付けると、<= になります。
@hoges = HogeModel.find(:all, :conditions => {
  :nanika => {"$gt" => nanika_value1, "$lt" => nanika_value2}
})

時間を使う場合は以下の通り。

# fugafuga.day.ago < created_atになります。
@hoges = HogeModel.find(:all, :conditions => {
  :created_at => {"$gt" => fugafuga.day.ago}
})

配列を使う場合は以下の通り。

@hoges = HogeModel.find(:all, :conditions => {
  :foo_id => {"$in" => id_array}
})

正規表現は以下の通り。

@hoges = HogeModel.find(:all, :conditions => {
  :var_name => /hogenonamae/
})

where句も使えます。JavaScriptで書くんですね。なんだかとても便利です。

_js = <<-EOS
function() {
  return this.hoge_id == 123 && this.fuga_id == 456;
}
EOS

@hoges = HogeModel.find(:all, :conditions => {"$where" => _js})

:orderやlimitも使えます。

@hoges = HogeModel.find(:all, :order => "name desc", :limit => 10)

他にも、find_by_*とかfind_or_create_by_*とか便利な機能があるようです。その他の検索方法を知りたい場合は以下を参照してください。

また、MongoRecordでは物足りない場合は、MongoRecordのベースになっているMongo-Ruby-Driverを直接さわっても良いでしょう。意外と(?)難しくありません。

生成、更新、削除

これはActiveRecordとあまり変わりありません。

@hoge = HogeModel.new({:hogehoge => hogehoge_data})
@hoge.name = "nanika"
@hoge.save

# 削除
@hoge.delete

どこに適用するか

範囲検索ができるとはいえ、NoSQLなMongoDBであることと、今のところActiveRecordのようにリッチな機能を備えているわけでもないMongoRecordを使うことを考慮に入れる必要はあります。たとえば結合を使いまくるようなリッチなモデルには適用せずに、アクセスの頻度が多くて、しかし結合をそれほど使わないモデルを置き換えるのが良いかなと考えています。

また、スキーマレスですが、JSONチックなデータ構造で保存するMongoDBでは、カラム名も行に保存されることになりますから、ファイルサイズが大きくなることが予想されます。カラム名を短く保存するように作っても良いですが、データ構造が単純な物を選択することも一つのアイディアです。元記事に書かれているとおり、Rubyオブジェクトをそのまま放り込む(もしくは圧縮してから放り込む)のも一つの手です。

これだけ見ると、複雑なモデルを利用する場合に使えなさそうに見えます。ただ、モデルが「子から見て親が一つに定まるツリー構造」で表現でき、かつ、親子をまとめて取る場合が多いのなら(つまり、子だけを取り出す必要があまりないのなら)、Ruby上のオブジェクトモデルをそのままDBに放り込めばいいのですから、複雑なモデルをMongoDBに格納してもこれといったデメリットはありません。

ちなみに、Rmakeではゲームのセーブデータなどに使っています(この機能はまだリリースしていませんが)。セーブデータへのアクセスは、ゲームIDとプレイヤーキャラクタIDから検索する単純な利用ケースしか無く、データ構造はテキスト形式でひとまとまりになっているだけなので、カラムの構造もシンプルです。他にも使っていますが、同じような要件です。最悪、すぐにMySQLに逃げられそうかつ、消滅してもそれほど問題にならなさそうなデータを対象にしています。運用実績が増えてくれば、もっといろいろなところに気兼ねなく使えるようになるでしょう。

結論

Railsで違和感なく使えることと、インストールが容易であることを考えると、MySQLの補助的な利用にとどまらず、もっと積極的な利用を検討しても良いかもしれません。元記事にあったとおり、通常の使い方をする限りではパフォーマンス的にはかなり有利なようです。また、以下の通り、MongoDBの事例は海外ではまずまず出てきているようです。

バッチ系もMapReduce機能を使えば大規模な物も処理できそう(まだ使ったことがありませんが・・・)です。運用系は抑え切れていないのですが、Auto-Sharding(サーバを追加すれば勝手にスケールしてくれる仕組み。ここは期待しているところなのですが。)などは将来に期待と言わざるを得ないようです。レプリケーション機能はあるので、それなりにはスケールするようです。この辺はもう少し具体例を聞いてみたいところです。

そういえば、Windows Vistaでも問題なく使えています。Vistaで、NetBeans+Rails+MongoDB+MySQLって感じで開発しています。結構快適です。

MongoDBが「来る」かどうかはともかく、パフォーマンスやスケーラビリティ上の理由から、NoSQLの重要性は高まっていくことでしょう。幸い、Rubyの世界では生産性をほとんど落とさずに(この容易さなら他の言語でも同様の状態だと思いますが)導入することができます。どんどん試して今のうちに試行錯誤しておく方が賢明でしょう。

ブラウザ上でゲームが作れるウェブサービスを調べてみた

Rmakeを開発している関係で、そろそろ競合するウェブサービスにどのようなものがあるのか調べておく必要があるかなと感じたので、調べてみました。(とはいえ、なかなか検索エンジンから見つけるのが難しいので、定番サービスとか見落としているかもしれません。。。もしありましたら、教えてください。m(_~_)m)

RPG系

RPGツクールがあるせいか、制作ツール系の開発が活発なジャンルです。ただ、ブラウザやFlashの性能の問題もあってなかなか開発ツールは無いようです。

ノベルゲーム系

ノベルゲーム自体は昔からあるジャンルですが、ブラウザと相性が良いせいか昔からこのようなサービスは多いようです。

その他

まとめ

確かアクションゲームツクールがFlashに出力できたり、World Wide Adventureのように作ったゲームをブラウザ上に載せられるツールもあります。(多分そういった系統のツールは他にもあると思います。)

こうやってみると、ゲーム作成系サイトはそれほど流行っているとは言えないので、全体として低調な印象を受けますね。流行っているジャンルだったら「競合を追い落とさなくては!」とか思うのですが、現状は「まずはみんなでこのジャンルを盛り上げていかないとね!」という感じでしょうか。。。

アクションやシューティング系はないのかなぁ・・・。

mitaka.rbに行ってきた

昨日は超おいしいRubyコミュニティ「mitaka.rb」に行ってきました。mitaka.rbというのは、三鷹近郊のRuby関係者及びWebサービス関係者が集まる勉強会のような飲み会(食べるもの重視ですが)のような会です。

10/22(木)の20:00から開始、2時間雑談したあと、1時間ほど、時間制限のゆるめなLTという感じでした。場所は三鷹駅(三鷹産業プラザすぐ近く)のモダンタイムス*1でした。この日は直前までプログラマーズカフェが行われていたため、そこから流れてくる人も数人いたようです。

ライトニングトークの内容

興味を引いたのはやはりRXbyakです。Xbyakは動的にマシン語を生成することができるC++クラスライブラリです。記法はほとんど同じようですが、インラインアセンブラと異なり、動的にマシン語を生成することができるというのがポイントです。

で、RXbyakはRubyコード中にアセンブリ言語をDSLで書けるというものです。Rubyのコード中にCを埋め込めるRubyInlineは私も使ったことがありますが、アセンブリ言語を書けるということでSSEのようなSIMDRubyから叩けることになります。

過去にレコメンデーションエンジンを書いたときに、Ruby(1.8)で書いたら処理に1300分とかギャグみたいなことになり、RubyInlineで部分的にCに置き換えたところ7分くらいに短縮されたという経験があったので、こういう需要も結構あるんだろうなと感心していました。

その他いろいろ

雑談中は・・・あまりRubyの話はしていませんでした。座った席のせいなのか、CobolJavaの仕事をしている人であるとか、boostの話をしたりとか、三鷹・調布ローカルネタを話したりしていました。そういえばこれ、Rubyの会なんだっけ? ついでに、ちょろっとRmakeの紹介をしたりもしていました。

さて、私は三鷹近郊と言っても調布に住んでいるので、この日はバス*3で会場に向かいました。「三鷹近郊と言い張るなら、徒歩で会場にアクセスできなくてはなるまい!」と思い、帰りは徒歩を試してみました。会場をあとにしたのは23:20過ぎですが、電車で普通に帰る(三鷹 → 吉祥寺 → 明大前 → 調布)と0:40頃に家に着く(夜の電車は遅いのと、駅から家までかなり歩くため)と見積もりました。

会場のモダンタイムスから自宅まで5kmくらいのはずなので、歩いて帰れば酔っぱらっていることを差し引いても、電車よりは早く帰れるに違いないと推測しました。酔っていることを考慮し、距離を短くするよりは、道を間違えないように道を曲がる回数が最小(4回かな)になるようにコースを決めました。家に着いたのは0:30頃、しかも途中コンビニによる余裕もありました。

「徒歩すげぇ!」・・・というよりは、不便すぎる我が家を嘆くべきかもしれませんが。

*1:なかなかおいしいイタリアンでした。写真撮ってくれば良かった。

*2:rake:moneyのMLに流れてきたので、私もお世話になっています。

*3:会場から自宅までバスだと20分ちょい。悪くても30分程度。

クックパッドの商用サイト向け無断リンク禁止は法的根拠があるんだろうか

recipe growlerに送られてきたというメールから、クックパッドのクックパッドのレシピへのリンクポリシーが話題になっているようです。

ちょっと気になったのは、ウェブサービスが外部のサービスに対してリンクを抑制することができるのか気になったので、以下のあたりをつらつらと考えてみました。そのうち、専門家の方が書くとは思いますが。

クックパッドのリンクポリシー概観

以下のページを見て、クックパッドのリンクポリシーについて理解してみることにしました。

気になる項目は以下のあたりでしょうか。

営利を目的としたサイトでのご利用の際はかならずこちらへご連絡をお願いいたします。
リンクの仕方やページの内容によってはお断りする場合がございます。

http://cookpad.com/info/link

クックパッドにリンクしていること自体をサイト運営や営業の手段としないでください。

http://cookpad.com/info/link

商用サイトによるクックパッドへのリンクをクックパッドがコントロールしたいということなのでしょう。クックパッドというサービスにただ乗りされたくないという気分が伝わってきます。

どの辺の法律を検討すればいいのか

無断リンクを禁止する法律は存在しないので、どの辺を攻めればいいのか悩みました。

元々問題になったのは横断検索サイトですから、最初に思いつくのは著作権と検索エンジンの問題です。検索エンジンは、データを蓄積・加工・表示することから、複製権、翻案権、送信可能化権あたりが疑われるという話ですね。

アメリカではフェアユースで解決されていますが、日本でも著作権法の改正で解決する方向性なので、クックパッドがこの線で戦えるとしてもあと少しになりそうです。今年いっぱいくらいですかね。

次に考えたのが、不正競争防止法です。クックパッドは有料サービスで検索機能の強化(人気順検索)を提供していますから、この種のサービスはクックパッドの利益を侵害していると言えるかもしれません。

この辺は検索エンジンの公共利益とのバランスと思われますが、これが通るとなると、ありとあらゆるウェブサービスが有料検索機能を提供していることを理由に競合する横断型の検索サービスを閉め出せることになります。何となく別の法律を違反している気もしますし、消費者に多様な選択肢を提供することができなくなってしまい、社会全体ではものすごいマイナスになるという気もします。

最後に考えたのは契約による縛りです。クロールするためには利用規約を受け入れなければならないという・・・まぁ、ロボットでアクセスしたとたんにサイトのどこかで書かれている利用規約を受け入れろというのはどんなワンクリック詐欺だよって話ですが。

まとめ

クックパッドは上場企業です。法務部隊もあるでしょうから、こうしたルールには法的根拠があるのが普通だとは思うのですが・・・ちょっと素人にはわかりかねます。*1

とはいえ、競合するかもしれないウェブサービス(それも個人レベルの・・・)を探し出して自社サービスへのリンクを削除するように要請して一種の締め出し行為を行う・・・より大きな社会貢献が求められる上場企業の姿としてはあまりに切ない話です。勝てる勝てないに限らず、「訴えてやる!!」とか言われたら、労力の面から弱小サービスは引くしかないわけですから、連絡が来ただけでびくびくものです。相当の抑制効果があるのではないでしょうか。

少なからずウェブサービスの運営会社というものは大規模なサービスの寡占状況を作りたいと考えるものです。もしそうした意図がこのようなウェブを根底から覆しかねないリンクに対する制約という形で表れているとしたら、ウェブ業界に絶望したくなりますね。

*1:全く別の切り口になりますが、[http://d.hatena.ne.jp/lastline/20091020/1256018685:title=クックパッドの意図は無断リンク禁止ではない - 最終防衛ライン2]によると、件のサービスは画像の直接リンクをしているらしいので、その辺を禁止しようとしたら社内の意思疎通がうまくいかなかったという見方があるようです。もしそうだとしても、クックパッドのリンクポリシーは残るわけです。

Rmakeの歩き方(7) - サイドビュー型のターン制バトルをRmakeに実装しました

ゲームを作れるウェブサービス - Rmake」から新機能の紹介や近況をお知らせする「Rmakeの歩き方」です。今回は、10月に追加された新機能を中心に紹介します。

  • Rmakeの新機能の紹介
  • ゲームバランスの調整について
  • 素材の追加について
  • Rmakeの今後について

Rmakeの新機能の紹介 - ターン制バトルを採用した2DRPG作成機能

RmakeのRPG作成機能はアクションRPGをベースに開発しています。アクションRPGならではの使い方をされているのですが、その一方でアクションがあまり得意でない人でも気楽にプレーできるゲームを作りたいという要望も強くありました。

そこで、Rmakeにサイドビュー型のターン制バトルを採用した2DRPGを作成する機能を実装しました。どのような動作をするか気になる方は、以下のゲームで体験してみてください!

ゲームバランスの調整について

Rmakeの開発チームでは、ターン制バトルを採用した2DRPGの実現にあたり、ゲームバランスを調整することにしました。プレイヤーキャラクタのステータスは以下のように変更されています。

  • HPを+25
  • MPを+15
  • 力、耐久、器用、賢さ、精神を+5

素材の追加について

びたちー素材館様にて配布されているシルエットの立ち絵30個強を追加しました。以下から利用することができます。

素材を提供してくださったびたちー素材館様には御礼申し上げます。

Rmakeの今後について

これまで作成できるゲームの種類を増やすことに注力してきましたが、当面はゲームエディタのユーザビリティを改善したいと考えています。

まだまだ開発途上のサービスなのでどんどん機能拡張と完成度の向上を行っていきたいと思います。今後ともよろしくお願いいたします。

Rmakeでノベルゲームを作って共有できるようになりました(Rmakeの歩き方(6) - ノベルゲーム作成機能を開始しました)

Rmakeの中身を紹介する「Rmakeの歩き方」の第6回目です。今回は、8月に追加された新機能を中心に紹介します。

  • Rmakeの新機能のご紹介
  • 新着素材の紹介
  • バックナンバー

Rmakeの新機能のご紹介

ノベルゲーム作成機能

これまで、Rmakeでは2DアクションRPGを作る機能を提供してきました。ブラウザで作れるゲームとしては珍しいタイプですが、アクションが苦手な人にも気楽にプレーしてもらえるゲームを作りたいという要望もありました。

そこで、8/31にノベルゲームを作成する機能の提供を開始しました。

どのようなノベルゲームを作れるのかは以下を参照して下さい。

また、ノベルゲームの作り方は以下を参照して下さい。

スクリプト入力支援機能(2DアクションRPG/ノベル)

Rmakeでは、ノンプレイヤーキャラクタとの会話などはスクリプトを使って書きますが、スクリプトを記述するのは慣れていない人にとっては大変な作業です。

そこで、使いたい命令(文章表示など)を選択してダブルクリックするだけでスクリプトを入力できる機能を実装しました。詳細は以下を参照して下さい。

マップエディタの改善(2DアクションRPG

以下の二つの改善を行いました。

  • 複数(2つ)のマップチップを設定できるようになった
  • 複数(2つ)階層のマップを作れるようになった

マップエディタの詳細は以下のページを参照して下さい。

新着素材の紹介

REFMAP様配布のマップチップ(4個)と敦煌回廊のクリボー様配布のキャラクタ画像(130個強)を追加しました。以下から利用することができます。

素材を提供してくださった、REFMAP様、敦煌回廊のクリボー様には御礼申し上げます。

また、REFMAP様提供のマップチップにつきましては、通行設定を行ったマップチップデータも準備してあります。以下から利用することができます。

Rmakeの歩き方(5) - 掲示板を活用しよう!

Rmakeの中身を紹介する「Rmakeの歩き方」の第5回目です。今回は、Rmakeでゲームを作る際の助けになる掲示板を紹介します。

  • 掲示板を活用しよう!
  • 新着ゲームの紹介
  • バックナンバー

掲示板を活用しよう!

Rmakeのようなエディタがあっても、ゲームを作ることは中々大変ですし、難しいことでもあります。ツールに関するちょっとした疑問や、ゲーム作成に関する一般的な疑問を感じたら、掲示板で質問すると良いでしょう。

掲示板は以下のように3つに分かれています。

新着ゲームの紹介

Rmakeはまだまだこなれていないゲームエディタですが、ぼちぼちとゲームは作られているようです。(2009/8/17現在、作成中のゲームは100個以上です。)ここしばらくで公開されたゲームについて紹介しましょう。

その他のゲームを探したい場合は以下からどうぞ。