cakephperの日記(CakePHP, Laravel, PHP)


継続的WebセキュリティテストサービスVAddyを始めました!

2011-05-25

NewYork MongoDB Meetup 動画のサマリ

NYのMongoDB Meetupに参加した @yando さんが、Nateさんの発表動画を公開しています。ありがとうございます!Nateさんは元CakePHPリードデベロッパーで、現在はLithiumフレームワークのリードデベロッパーを務めています。


今回はそのサマリをざっと書いておきます。詳細は、下記の記事からyoutube動画へ行って見てください。英語は聞き取りやすいと思います。

http://tech.a-listers.jp/2011/05/24/how-not-to-code-the-mongodb-edition/

ニューヨークで行われたMongoDB Meetupの様子」


「How Not To Code」 by Nate Abele
===========サマリ=========================
groupクエリは遅くてロックがかかりやすい

ReplicatoinしてセカンダリからReadするなどの工夫
 Mongo::setSlaveOkayを使って
 http://jp2.php.net/manual/en/mongo.setslaveokay.php

MongoでAutoIncrement
 コレクション単位にカウントするドキュメントを作成。 チケットコレクションの例
   {_id: "users", seq:11 }
   {_id: "posts", seq:22 }

   該当コレクションに書き込む前に、チケットコレクションの該当レコードを $incしてカウントアップ。
   カウントアップした数値をAutoIncrement代わりに使う
   例えばusersコレクションにInsertする前に、チケットコレクションの_id:usersのseqを$incして値を取得。
   それをAutoIncrementの値としてusersコレクションの_idにセットしてInsert
   

コレクション内の_idにObjectIDタイプと、文字列タイプが入り乱れている場合
 ソートがうまくいかない(例:日付のソートをしたのに、ObjectIDと文字列IDがばらばらにソートされる)
 プログラムが直接MongoDBを操作して何も考えずに値を保存すると文字保存になる
  抽象レイヤーを使って文字列をObjectIDに自動変換する仕組みを通してこういった問題をさける


1ドキュメント16Mの制約を恐れるな!
 でも深い階層のフィールドを検索するのは遅くなりやすいから気をつけて


コレクションを分割する方法もあるよ
 Joinはアプリケーションレベルでやる
 FWのモデルレベルでできるものがいくつかある(Lithiumもその一つ)

Indexは重要、ちゃんと解析してIndex張ること。予想だけではだめ。
 BackgroundIndexでIndex生成する


動画では質問者の声が聞き取りにくいですが、Nateさんの声は鮮明だしプレゼン資料の文字も見えるので快適に視聴できました。Nateさんがちょっとした小話とか入れてるので聞いてるのも飽きなかったです。

2011-05-07

開発合宿関西3に参加し、CakePHP-MongoDB Mapperを進化させました

f:id:cakephper:20110507141620j:image:w360

GW終盤に滋賀県琵琶湖近くで開催された開発合宿関西3に参加しました(この記事書いてる間はまだ参加中)。周りに何も無い宿に泊まって、みんなで開発するというスタイルで、2泊3日が基本構成。自分は1泊だけ参加。誰かと共同で開発というよりも、普段なかなか出来ない事や、まとまったタスクを消化するなど、各自もくもくと開発してました。

そういえば、電車でiMacを持ってきた人がいたw ボストンバックにiMac 20インチぐらいのやつを入れて持ってきたみたい。関西スゴイ。


合宿の雰囲気はこんな感じ(去年のmsngさんの記事)

http://www.msng.info/archives/2010/05/acty_plaza_biwa.php


こういった開発合宿は初参加だったのですが、良かった点がいくつかあって

  • 周りに何もないので集中できる
  • 金を払って参加してるのだから何かしら成果を出さないと、というプレッシャー
  • 周りの人の集中度に刺激されて開発がさくさく進む
  • 3食付いてるので外食しなくてよい(時間節約)
  • 雑談で技術的なトピックが多い

やはり、ここまできたら何かしら成果だすという勢いと、周りの環境で集中できました。時間はあり余ってるので、雑談もしやすいし、雑談も技術的な話があって面白かったです。


今回は、CakePHP-MongoDB MapperのIssueチケット消化と、kanael.netのリファクタリングを目標にしてましたが、Issueチケットが片付いた時にメールが来て、CakeMongo MapperでhasMany, blongsToとか出来ないの?っていう質問が来たので、急遽これの対応を行いました。

実は今までもhasManyなどのリレーションのリクエストは来てたのですが、MongoDBはサブドキュメントといった1レコードに複数の階層を管理できる機能があるため、あえてhasManyとか作る必要もないだろと思ってスルーしてました(MongoDBにはJoin機能も備わってないし)。ただ、要望が多くなってきたので、合宿の勢いで取り組みました。たぶん合宿じゃなかったらまたスルーしてたと思う。開発合宿++


やったことは、findの結果を元にリレーション設定があれば、他のテーブル(コレクション)にもfindを再帰的にかけていって手動で結果を結合していくという実装を行いました。これで複数テーブルにまたがるデータもfind一発で取得可能となりました。現在、hasMany,hasOne,belongsToに対応しています。詳細はコミットをご覧ください。

https://github.com/ichikaway/cakephp-mongodb/commit/9b3467fd7f6c024a800f29fe61679f57eab292d2

リレーションを考慮したデータの保存saveAll()のほうはどうなんだ?と思って試してたのですが、CakePHPのモデル側でうまくキーのセットなどをしてくれてすんなり保存できたので、特に新規で開発することはありませんでした。saveAll()やfindの方法などを確認したい場合は、下記の書いてる途中のテストケースをご覧ください。

https://github.com/ichikaway/cakephp-mongodb/commit/923a3bbb9e1692f7d560ca92f49e84927fb5a6bb


今はrelationブランチを作って開発してますが、テストケースを書き上げたらmasterにマージする予定です。

2011-01-28

MognoDBカンファレンス東京が開催されます

世界各地で開催されているMongoDBカンファレンスですが、東京でも開催決定!

http://www.10gen.com/conferences/mongotokyo2011

2011年03月01日(火)13:00から、楽天タワーにて。


目玉はなんと、10gen(MongoDB作ってる会社)の人が3人も来日して発表すること。

今のところ、Mongoの基本的な紹介と、Schema Design、Replication and Shardingというセッションが予定されてます。

RDBを普段使ってるけど、NoSQLにも興味ある、テーブル設計とかどうすればいいんだっけ?という人は必見。複数台運用になった際に必須のReplicationや、データを分散させるShardingなど、MongoDBの魅力が半日で分かるセッション満載!

この他に、国内事例紹介もあります。これは日本語で発表されるはず。


英語が分からなくても楽しめる内容だと思います。MongoDBの中の人と気軽に話せるとか素敵すぎる!

国内の事例発表の人にも、具体的な運用とか突っ込んで聞けるかもしれません。


このカンファレンスは有料です。2月9日までに買えばディスカウントで$50です。それ以降は$100。興味のある方はお早めに!


※ちなみに私もMongoDB with PHP/CakePHPというセッションで発表します。PHPerの皆様、ぜひ参加を! 発表やめました。スタッフで参加します。

2010-09-17

MongoDB for CakePHPのgithubリポジトリを変更

mongoDB-Datasourceなんていう名前をつけてしまい、いまいち何のリポジトリか分からなかったのでリポジトリ名を変更しました。

新リポジトリは下記になります。

http://github.com/ichikaway/cakephp-mongodb


フォークされたリストやウォッチリストなどを保持しておきたく、また404NotFoundにはしたくなかったので、旧リポジトリも下記に残してあります。こっちはリポジトリの説明の箇所で歴史的に残してあるだけで、新しいリポジトリ使ってよ、と書いてあります。wikiにも書いておいた。

http://github.com/ichikaway/mongoDB-Datasource

githubのwebからリポジトリのrenameをやってしまうと、旧URLは404NotFoundになってしまうので、このような形にしました。

古い方を利用してくださっている方は、新しいリポジトリをgit remote addで加えてoriginにしておいて頂けると嬉しいです。

旧リポジトリは放置はせず、定期的に同期をかけます。同期は下記のコマンドで一発!

git push --mirror 旧リポジトリURL

2010-02-01

第49回PHP勉強会でMongoDBとCakeに関する発表をしてきた

第49回PHP勉強会@関東にて、「MongoDB + PHP + CakePHP」というタイトルで発表してきました。

MongoDBはRDB脳を持ったまま突入すると理解に苦しむケースがあり、僕も1週間ぐらい消化不良のまま色々な資料を見てました。

今回の発表では、その消化不良が起こらないように、またMongoDBが面白そう!と思ってもらえるような発表を心がけました。Twitterの反応を見てると、ある程度それが達成できたようなので良かったです。

スライドと動画を見てもらえれば、MongoDBの触りの部分と、PHPで操作するのがお手軽という感じを持ってもらえると思います。Pecl Mongoがmongodb.orgから公式にサポートされているので安心できます。スライドは、海外の人から発表を見てみたいというリクエストがあったので、英語で作りました。何人かのCakeやLithiumの人たちが海外から見てくれてたようです。

MongoDBは、本当に基本的なことを発表しただけで、実はかなり奥が深く、Map/Reduceを含めて色々と面白そうなことができます。また機会があればそいう発表をしたいと思います。


スライドはここから。


動画はここから。


イベント全体の感想。

安藤さんのSkypeを僕のマシンで受けて表示していた関係で、画面が近くてよくコードも見えて、理解ができました。LithiumのapplyFilterは感動しました。フィルタでどこでも差し込めるというのは前から聞いてたんだけど、実際にどうなっているかが、今回の発表でよく分かりました。

Kaz_29さんの発表まで、WindowsからUbuntuに切り替えて、僕の発表の準備(シェル立ち上げるとか、デモが問題ないかのチェック)をしていて、他の方の発表はほとんど聞けませんでした、ごめんなさい。

Kaz_29さんのCakeのデータソースの話は、今は漠然と聞いてた人も、いざDatasource作ろうということになったら、すごく助かる資料だと思う。Datasourceを作ると、Cakeの内部も良く分かるし、かなり色々なことが出来るようになるのでオススメです。といっても、敷居が高い印象があって、自分も最近まで手を出してなかったんだけど。。。自分の発表でもMongoDBデータソースの話をしたので、事前にCakeのデータソースとは何かという発表をしてもらえて助かりました^^

懇親会は、土曜日なので18時ぐらいから始まった。遠くから来ている僕なんかは、これぐらい早い時間から始まるとすごく助かる。懇親会でもデータソースの話したり、Cakeの話したり、楽しかったです。2次会ではgusagiさんのはっちゃけぶりが見れて、さすがだなぁと関心しました。

会場提供をしてくれたコンテンツワンさん、幹事のGusagiさん、配信してくれたNekogetさん、デモ中にマイク持ってくれたyuchimiriさん、参加した皆様、ありがとうございました。すごく楽しい時間が過ごせました。