RubyMonkをのぞいてみたよ

RubyMonkなるもの

さて、ADKの記事が中途半端に止まっているけど、今ADKで作ろうとしてるものがあるので、そっちがなんとなく形になったら続きを書くとして、別な話をポチポチ差し挟むということで。
 
RubyMonkなるブラウザ上でポチポチRubyのコードを書きながら修行ができるというビギナー向けサイトがあることを、10月くらいに知ったのだけど、どんなものか試してみていなかったので、ちょろっとのぞいてみた。
 

でどうだった?

初心者向けにRubyのコードの書き方が自習できるように52問(今のところなのかなぁ?)問題が用意されていて、ブラウザ上に出現する問題を実際にフォームにコードを入力してRunさせながら学べるようになっている。最初は配列についての問題が5問ほど。
 

 
説明と問題が短く書かれていて、とにかくその説明を読み、簡単な問題を解いていくと基礎的なことがわかるようになっている。やってみた感想として、リズムよく学習できるようになっている一問一問の長さが初心者には調度よいと思う。
 
「monk」は修道士、修道僧のことを指すことばだけど、その言葉通り、一問解く毎にmaster(師匠)がありがたい?お言葉をくれる。ちなみに配列の最後の5問目を解いたら「More ramen to you!」と言われたけど、これがありがたいかは謎(^_^;)

もしかして意外な効果かも

やってみてちょっと思ったのは、問題自体は初心者以外には至極簡単なものが多いのだけど、その英語の説明が、こういうコードを説明するときはこういう英語表現すればよいのかという参考にできそうで、初心者以外でもちょっと世界を意識してみている人には、そういう面で勉強になるかもということ。

とりあえず公式Dev Guideの通りやってみる?

さて、ADKの互換ボードを手に入れたはよいが、何をするかをあんまり考えていない。ので、それはそれで考えつつ、まずは公式のAndroid Open Accessory Development Kitのサイトの手順通り環境構築をしていこうかと。
 
一つ前の投稿でArduino IDEをインストールするところまでは終わっているのでその続きから。引き続きUbuntu 10.10 64bit上で構築する。
 

ADKの設定

まずはADKのパッケージをダウンロードしてくる。ダウンロードはここから。ダウンロードしたパッケージを適当なディレクトリに解凍する。解凍したディレクトリの中にapp、firmware、hardwareの3つのディレクトリがあるはず。
 
解凍してできたディレクトリのうちfirmware/arduino_libs以下のAndroidAccessoryディレクトリとUSB_Host_Shieldディレクトリを、Arduino IDE環境を構築した際にインストールされたライブラリに追加する。具体的には<arduinoのインストールディレクトリ>/libraries化にコピーすることになる。前回の投稿と同じ方法でインストールした場合は

$ dpkg -L arduino | grep libraries
/usr/share/arduino/libraries
/usr/share/arduino/libraries/SD
/usr/share/arduino/libraries/SD/README.txt
/usr/share/arduino/libraries/SD/utility
/usr/share/arduino/libraries/SD/utility/Sd2Card.h
/usr/share/arduino/libraries/SD/utility/FatStructs.h
                      ・
           ・
           ・

ということで、/usr/share/arduino/libraries以下にコピーする。

$ sudo cp -rf AndroidAccessory /usr/share/arduino/libraries/
$ sudo cp -rf USB_Host_Shield /usr/share/arduino/libraries/

 
次に同じlibrariesディレクトリ以下にCapSenseディレクトリを作成し、ここからダウンロードしたCapacitiveSenseライブラリのCapSense.cppとCapSense.hをコピーする。
 

$ cd /usr/share/arduino/libraries
$ sudo mkdir CapSense
$ sudo cp /path/to/CapacitiveSense/CapSense.cpp /path/to/CapacitiveSense/CapSense.h CapSense

この後、公式ドキュメント的にはavr-libcをaptでインストールしろ、になっている。自分の環境はすでに導入済だったのでスキップしたけど、一応入れてあるかどうかをdpkgコマンドなどで確認して、なければ入れる。
 

firmwareADK Main Boardに入れる

ADKのMain Boardにfirmwareをインストールする。今回使うMain BoardはSeeed Studioが出しているADK互換ボードであるSeeeduino ADK Main Board
 
このボードの場合、まずPCに接続する前にVCCのスイッチを5Vの方に切替えておく。その後、USBケーブルでPCに接続する。給電されると本体のLEDが点灯するはず。ということで、接続後おもむろにArduino IDEを立ち上げる。
 
Arduino IDEが立ち上がったらBoard TypeをMega 2560に設定する。設定はTools→Board→でArduino Mega 2560を選択。次に接続ポート指定する。Tools→Serial Portから接続可能なポートを選択する。
 
が、ちょっとここで問題発生。選択可能なポートが表示されない。どうもBoardが認識されていない模様。dmesgで見てみても、lsusbで見ても確かに認識されていない。
 

Bus 007 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
Bus 006 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
Bus 005 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
Bus 004 Device 004: ID 0472:0068 Chicony Electronics Co., Ltd 
Bus 004 Device 003: ID 093a:2510 Pixart Imaging, Inc. Optical Mouse
Bus 004 Device 002: ID 0472:0068 Chicony Electronics Co., Ltd 
Bus 004 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
Bus 003 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
Bus 002 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub

 
/dev/ttyUSB*ができるはずが、それもできていない。カーネルのバージョン(2.6.35-30-generic)からすると、FTDIのドライバは組込み済みのものなのだけどなぁ。
 
ということで、lsmodで調べてみたところ、ftdi_sioのモジュールが読み込まれていない。なので、とりあえず
 

$ sudo modprobe stdi_sio

 
を実行してモジュールを有効にしてみた。で再度つないでみたが、またもや認識されない。あれこれ切り分けてみた結果、USBケーブルにも問題があったことが判明。たまたま手元にあって使ってしまったマイクロUSBのケーブルが、給電はできてもデータ転送できないものだったようだ。ケーブルを変えてみて無事認識された。
 

Bus 007 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
Bus 006 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
Bus 005 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
Bus 004 Device 004: ID 0472:0068 Chicony Electronics Co., Ltd 
Bus 004 Device 003: ID 093a:2510 Pixart Imaging, Inc. Optical Mouse
Bus 004 Device 002: ID 0472:0068 Chicony Electronics Co., Ltd 
Bus 004 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
Bus 003 Device 002: ID 0403:6001 Future Technology Devices International, Ltd FT232 USB-Serial (UART) IC ←これ
Bus 003 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
Bus 002 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub

 
認識できたら、先程の手順通り、Arduino IDEで転送ポートを選択する。環境によって異なるはずだけど、ここで試してみている環境と同様なら/dev/ttyUSB0になるはず。
 

 
ここまで設定して最後にdemokitをBoardにアップロードする。File→OpenからADKの展開ディレクトリ下のfirmware/demokit/demokit.pdeを選択する。選択して開いたファイルをSketch→Verify/Compileを選択してコンパイルを実行する。
 

 
無事コンパイルが成功して「Done Compiling」のメッセージが表示されたら、File→Upload to I/O Boardでアップロードする。「Done Upload」のメッセージが表示されたら、ファームウェアまでの準備は終了。今日はここまでということで。

The TERMINALさんに行ってきました

仕事場を探してます

この8月中は、ちょっと働き方を変えてみる試みをしよう、ということで、
僕達のチームは「ノマド」的な働き方を導入してみています。ノマドワークと
言い切れないのは、本来の意味でノマドワークというと、ほんとに成果のみに対して
責任持って、それの対価としての報酬を得ているような人達が、多様な環境で
多様なワークスタイルを取ることを言うと思うのですが、いかんせん、
僕らはある意味普通の会社員。なので、正直在宅勤務の変形版くらいの感じな
ものとなってます。
 
まぁ、そこの細かい話はまた機会があれば書きますが、今回はせっかくそういう働き方が
多少なりともできる期間なので、そういうワークスタイルな人達が集まりそうなところにも
行ってみようと思って、つい最近オープンした原宿にあるThe TERMINALさんに
お邪魔しました。
 

いざTERMINAL

JR原宿駅の竹下口を出て、そのまま竹下通りを抜け、明治通りに突き当たったところで、竹下口の
信号を渡り、明治通りと並走している路地を新宿方向に少し行ったところにThe TERMINALさんはあります。
 

 
当日は同じチームの先輩、後輩2人と現地で合流するということで、僕自身は13時半過ぎくらいに入ったのですが、僕が入店したときは先に着いていたチームの2人と、その他数人の人達がいらっしゃる感じでした。あと、何かの取材だと思うのですが、僕らがいた間に2〜3組みほど、それっぽい人達がスタッフの方とお話していました。
 
まず初めての利用の場合、会員登録をすることになるのですが、Webから仮登録をしておくととてもスムーズに利用が開始できます。メールで送られてくる仮番号と身分証明書(免許書とか)をスタッフさんに見せると会員カードを発行してくれます。仮登録してくると、だったと思うのですが30分無料で利用できるサービスが付いて来ます。
 
フリードリンク制のドリンクサービスがあるので、好きな飲み物を持って席を探します。ドリンクは冷たいのと温かいのが用意されていて、コーヒーやコーク、ジンジャーエール爽健美茶などなどありました。ということで、あとは空いている席を見つけてイソイソと仕事を始めるわけです。
 

店内の感じは?

席は利用フリーのMacがあるハイテーブルが中央に置かれていて、入って一番奥の窓際にも窓向きに座るハイテーブルがあります。あとは普通のテーブルありの席に、たしかもう少しリラックスして座れるような形になってる席もあったはず。あと、受付の後ろ側にミーティングスペースがあります。
(痛恨の写真撮り忘れにより、ここらあたりが文字だけになっててすんません(^_^;))
 
照明は明る過ぎもせず、暗過ぎもせずで僕には調度良い感じでした。あとBGMがずっと流れています。
 
ハイテーブルや壁際にある本棚にはBookMeという企画で、毎回ある特定の方が選んだテーマ性のある本が並んでいます。今は柳本浩市さんという方の選んだ本が並んでいるようです。
(ガチで仕事をしてしまったため、手に取ることができず、、、どんな本があったかは覚えてないっす。今度行ったときは読んでみます。)
 

使ってみた感想は

使ってみた感想です。まずは僕達のようなPC持ち込んで仕事をする人達には嬉しいことなのですが、電源がかなりしっかりした数確保されていることは好印象。各座席で確実に電源にありつけます。あと無線LANのAPも準備されてます。僕は自分のWiMAXを使ってしまったのですが、後輩がこちらの
環境を使わせてもらっていましたが、速度もそれなりに出ていたようです(セキュリティはスカスカなようなので、この点は使う人は自分でがんばりましょう)。ということで、持ち込んだPCでプログラム書いたり原稿書いたりには全く不自由しません。
 
店内はBGMがずっとかかっていますが、それなりの音量なので、僕は特に気になりませんでしたが、気になる人は気になるかも。まぁ、集中してしまえば、大丈夫なレベルだと思います。BGMだけでなく、周囲の環境的には、そもそもオープスペースなので、いろんな人達が居ることを感じながら仕事することを楽しむくらいの気持ちでいるのがよいですよね。
 
誰かと話し合いながら進める仕事などをやる時には、たぶん3人以上なら、30分500円の使用料がかかりますが、ミーティングスペースを利用するのがよいかもしれません。今回も途中から3人でミーティングスペースを1時間ほど借りてミーティングしました。ミーティングスペースは、扉とかは
ないですが、一応他のスペースとは区切られた場所ですし、周りの音なんかにも影響も小さくなるのでお互いの声も聞き取りやすくてよいと思います。ミーティングスペースにもしっかり電源は確保されてます。
 
あと細かい話ですが、ハイテーブルのイスではちょっと長時間の作業とかは疲れるかもしれません。僕らも最初は普通のテーブル席を利用してましたが、ミーティングスペースから帰ってきたあとはもといた席は他の方達が使っていたので、ハイテーブルを使ってみまいた。1時間半くらいハイテーブルにいましたが、人によってはちょっと姿勢を維持するのに疲れるかもしれません。
 

その他どうでもいいこと

TERMINALさんにたどり着くのに竹下通りを抜けてきたのですが、30代2人と20代後半1人というグループは、完全に浮いてました。着いてからはよいのですが、着くまでは完全アウェーな感じです(^_^;)
 
ということで、今回は僕個人の仕事としては、プログラム書いたりではなく、とあるところに出す原稿をずっと書いてたのですが、会社の机に向かっているのとは全然雰囲気が違うところで、ちょっとした外からの刺激を受けながら仕事をするのはよいものだなぁと改めて感じました。
 
またタイミングが合えば、ちょっとした時間でも立ち寄らせてもらおうかなぁと思います。

Ubuntu 10.10(Maverick Meerkat)64bit上でArduino IDEを動かすまで

互換ボードが手に入ったので、AndroidADKを触り始めようとしている
のでついでにArduino方面のもろもろも色々覚えようかなぁということで、
まずはArduino IDEの設定から。
 
環境はUbuntu10.10(64bit)です。
 
本家の英語のGetting Startのページを参照すればさして難しくないかと思うけど、
一応自分の作業メモとして残しておこうかと。
 
ADKのボードがMega2560ベースなので、Mega2560に対応した環境を作りたい。
けど、標準のMaverickリポジトリから入れられるArduino IDEだとバージョン古いので
ArduinoがUnoやMega2560ベースのものなんかの新し目のボードだと、サポートしてない
と本家のサイトに書いてある。最新は0022らしいがMaverickリポジトリからだと
0018しかインストールできないらしい。一応2011/08/08の状態でも更新されてないか
確認してみた。

$ apt-cache show arduino | grep Version
Version: 0018+dfsg-4

 
ということで、やっぱり0018っぽいので、本家指定通りMaverickのバックポート
リポジトリから最新のやつを取れるようにする。デフォルトだとバックポート
リポジトリからはパッケージ取得されなくなっているはずなので、それを有効に
する。
 
Synapticからやるなら、Synaptic起動後に設定→リポジトリ→アップデートタブと
メニューをたどって、アップデートタブ内の「サポートされていないアップデート(maverick-backports)」
にチェックを付ける。その後、Synapticで再読込をかけるか、以下のようにaptコマンド
でアップデートをかけると0022がインストールできるようになる。
 

$ sudo apt-get update
$ apt-cache show arduino | grep Version
ersion: 0018+dfsg-4
Version: 0022+dfsg-1~maverick1

 
あとはSynaptic、aptコマンドどちらからでもよいがarduinoarduino-coreを
インストールする。Synapticの場合は検索からarduinoで探してチェックを入れて
適用ボタンを押下、aptコマンドを使う場合はいつもの通り以下の通り。

$ sudo apt-get install arduino arduino-core

 
無事インストールが終了すればアプリケーションメニューのプログラミングカテゴリ内
Arduino IDEが追加されているはずなので、そこからか、もしくはコマンドラインから
起動してみる。無事起動すればインストールは成功。
 

$ arduino &

 

 
バックポートリポジトリを有効にしたくない場合は、本家に書いてある通り、
必要な以下のパッケージを個々にdpkgコマンドでインストールすればOKなはず。

 
ということで、ボチボチいじり始めましょう。

ソーシャルの次ってなんだろう?

いろんなところでこの話が議論し始められてるんじゃないかと思う。
自分もなんとなく考えてみたりするわけだ。
 
様々なソーシャルネットワークサービスが提供されることで、
「つながり」という視点で見たときの広がりと多様性は、確かに
ソーシャル前より高まったし、深まったのは確かなはずだ。
 
それまでつながることがなかったような人達がつながって、
いろいろなコミュニティが群雲のように立ち上がってきているのは
普段のネット上での経験からも実感できると思う。さらに、キュレーション
というような視点から、人がつながることで生み出される価値を見つけ出し
新しい価値を意味付ける手法が様々な人達によって試されている。
 
ここまで見て、僕はつながりによって生み出されるその価値の、さらに
源泉になっているものってなんだろうと考えてみている。たぶんそれは
小さな個の力なんだと思う。
 
今までは、それこそその他大勢の中に埋もれて見出されることのなかった
小さくても強くて力のある個が力の源なんじゃないかと。小さな個が
浮かび上がることができる環境が整って来た、この5年くらいの間から、
この先の5年、10年は、そうした個の力を伸ばして強めるための仕組みが
求められるんじゃないだろうか。
 
今本人が気づいてなくても、ほんとはスゴい力を持った小さな個が
まだまだ世の中に埋れているはず。そういう個が気付きを得るための仕組み、
自分の力をさらに強められるようなものが必要なんじゃないか。
 
そういう個がもっともっと社会に浮かび上がれば、もっとステキな社会に
なるんじゃないかと漠然と思っていたりする。
 
抽象的な言葉しかまだ出てこない程度の浅い考えなので、これからもっと
具体的な「なにか」が出せるようにしてみたい。
 

 

[MongoDB] [MongoTokyo] MongoTokyoに行ってきた

あまりにほったらかしなブログなので、心を入れ替えて、そろそろちゃんと書こうと思います。
(遅いって)
 

ということで、開催から一週間も経ってしまいましたが、参加報告書いてみます。
聞くばっかりで、当日メモがあんましちゃんとしてなかったのと、変なこととか
間違ったこと書いてたらゴメンナサイ。あと一部社内向けの報告からの転載なので
改行が見にくかったりするのは直します。あとで。たぶん。。。

『Welcome to Mongo Tokyo and Introduction to MongoDB』/『Replication and Sharding』/『Schema Design』

最初のセッションは3つ続けてMongoDB Projectの立ち上げ元で、サポートを行っている
10gen社のエンジニアの方のお話でした。英語のセッションだったので、聞く方に注力していて、
あんまりメモとかとれていませんが、以下印象に残った話。

  • 月間ダウンロード数は12000ダウンロードを越えていて、今も順調に増えている
  • 1000以上のプロダクション利用がされている
  • NoSQL意味するところは?
    • No Relational
    • Next Generation
    • New Data Models ...
  • Mongoでスケーリングして性能を出すには、データモデルの考慮必要
    • 一つのdocumentに埋め込むのかリンクするのか?
    • documentの部分的な更新をするのか置き換えるのか?
  • indexの作りすぎ注意
    • あまり多数の値にindex作りすぎるとランダムアクセスが発生してパフォーマンス下がる
    • 等価な値が複数ある場合は、そのうち一つにしておくこと
    • そうすればワーキングセットを小さく保てるよ!!
  • 書き込み面でのスケーリングはAuto Sharding、読み込み面でのスケーリングはreplicationの機能を利用すること
  • ドキュメントのスキーマデザイン考えるときは以下のパターンなんかがある
    • One-Many
    • Many-Many
    • Tree
    • Queue

NoSQLの意味するところにNo Relationalはよく言われるところですが、Next Generation
という意味を含めているところが印象的でした。そこまでのパラダイムシフトが果たして
見えてくるのか、今後もNoSQLには注目しておくべきでしょう。あと、よくMongoの説明を
するときにスキーマレスが使われるし、自分も使ってしまうのですが、正確には
Semi-Structuredが正しそうです。

『You're Happy When You Choose Ruby and MongoDB』

Ruby(Rails)でMongoDBを利用した場合のお話。レセプト(医療明細)を扱うシステムを
作成したときの例でのお話でした。

  • Rubyで作るときにドライバやMapperの選択をどうするか?
    • MongoMapper
      • すでにあんまり開発進められてない
      • Rails3には対応してない?
      • pluginとか特徴的な機能があるので、それを使いたい人は使う?
    • Mongoid
      • 日本語での情報は一番多い
      • Rails3もサポート
      • 逆にRails2系は弱いかも?
    • Mongomatic
      • MongoMapperが機能ありすぎるからシンプル路線に行ったもの
      • パフォーマンスも上がるように作られた(けど、それほど大きくは変わらない)
      • Railsとか使わないなら選択肢
  • Ruby以外の言語からのアクセスとも比較してみた
    • パフォーマンス的にはRubyのドライバはあんまり早くない
    • PHPの方が圧倒的に速かったりする(特に更新を大量にかけるような場合)
    • Cネイティブのドライバ(C系のドライバを使う言語のドライバ)がやっぱり圧倒的に速い
  • レセプトでの例
    • レセプトのフォーマットがとにかくヒドい
    • ダメダメCSV(値があったりなかったり、変な可変長が混ざってたり)
    • ただ、ヒドいCSVを入れるのにMapperでの事前のスキーマ定義とかやりにくく、いろいろ試行錯誤
    • 黒魔術全開でMongoidのクラスをデータから自動生成とかやってみた、できた
    • けど、結局CSVの左からkey値として番号を降ってしまって、value指定するJSONにして、Mapper使わず直ドライバで扱うのが一番パフォーマンスが出た
    • Mongo+Railsでも必ずしもMapperを利用するという選択肢取らなくてもよいかも
    • CSV→Mongoへデータ格納→Hadoopでデータの解析→Rで出力な流れ

Mapperはいろいろあって選択に迷うところですが、必ずしもMapper使わなくてもよい
のかなぁと。というか、ならRailsじゃなくてもよいかもとか。やることによりますが。
あと、Railsと組み合わせて使う場合に、MySQLの置き換えとして利用するのは
パフォーマンス的にも十分現実的な選択肢としてすでに入れてよさそうとのこと。
RDBが向いてることに無理に摘要する必要はないですが、特に非定型なデータを
扱うものには選択肢になるかと。

『Social Data and Log Analysis Using MongoDB』

日本のMongoDBユーザグループの主催者でもある井上さんのお話。この3月まで
(つまり今現在)学生さんな方で、自分でユーザグループ立ち上げしてみるなど
なかなか行動力のある人です。ソーシャルゲームを展開している
芸者東京エンターテインメントでのログ解析事例のお話でした。

  • Accss Logを解析
  • Hadoop→MongoDBという流れ
    • HadoopAccess LogをJSON形式の解析向けの形式に変換
    • MongoでMRを実効して、望んだデータを件索的に出力する
    • PV、UU、UVを出力
  • 見せ方の部分
    • ソーシャルの関係性とかはNeo4j(グラフDB)にデータを移してグラフ言語のGremlinでグラフ化
    • 数値データとしてのPVなどの表示
      • MongoにPython実装のREST Interfaceであるsleepy.mongooseを利用してRESTでアクセス
      • jQuery.tableやjQuery.chartsなどのjQuery系のライブラリを利用して表示
      • さらに統計的解析が必要な場合はRと連携させる(RESTで)

グラフDBも組み合わせて利用するなど、実践面でAcces Logの解析を行う上で、
いろいろ面白い事例でした。ソーシャルゲームの裏側ということで、今後は
もっとリアルタイム性のある解析もやりたいとのこと。Hadoopが挟まると、
どうしてもバッチ的になるので、そこをどうするかHadoopクラスタ
データフローを扱うFlumeなどをからめつつ念頭におきつつ検討中とのこと。

『MongoDB as a Search Engine Document Repository』

実際の製品に組み込んだ例です。プリファードインフラストラクチャー
統合検索プラットフォームであるSedueでのMongoDBの組み込み事例で、
Sedueは日経系の各メディアなどで利用されていたりします。お話されたのは
CTOの太田一樹さんです(1985年生まれ、若い!!(><))。

  • Sedueとはエンプラ向けの分散検索エンジン
    • 分散してインデックス作って、分散したそれらに対して検索を実行していくようなもの
    • 5000万件くらいまでの対象を検索することに向けられて作られている
  • どんなデータが検索対象に含まれているかスキーマ定義のようなものが必要
  • 対応が必要になったこと
    • 顧客毎(とくにメディア関係のようなところでは)どんどん検索対象のスキーマが変わっていく
    • 扱うデータのフォーマットも様々
    • 先週言われた対象が、今週はいらないと言われたり、いると言われたものが使われなかったり
    • いちいちRDBのようなものでそれらをもっていていはシステム止めずにメンテとかできない
  • といくことでMongoを利用
  • Sedueでは裏で動くFile SystemやらStorageやらDBやらをプラガブルに利用できる構造になっている
  • その機構を利用してMongoを組み込み
  • MongoでサポートしているFile SystemであるGridFSにパフォーマンス面での難がややあるものの、問題になるほどではない(というか問題にならないような部分で使っている)
  • 実際に組み込んでみて分かったいくつかの問題点
    • ディスク容量を大量に必要とする(アペンドオンリーにありがちだけど)
    • アペンドオンリーなんでバキュームも用意されているけど、ロックしてしまう
    • データの圧縮にも今のところ対応してない
    • Fire-and-Forgetなので、実行後すぐに成功の返答あるけど、サーバ側失敗している可能性もある
      • getLastError関数を呼び出してみるまでは実は分からない(し、これを呼ぶとパフォーマンスが落ちる)
    • Shardingもまだパフォーマンス問題ありかも
      • 特にドキュメント増えていくほど
  • その他
    • 10genの人達はすごく反応が速い
    • バグフィックスのパッチとか送るとCTOから3分後にメールが来たり、そしてすぐ取り入れてもらえたり
    • あと協力するとマグカップがもらえるので、みんなで協力しよう!!

実際の製品組み込みで、運用されている事例なので貴重です。Shardingの話などは特に。
SlideShareに上がっている資料も見るべき(ってリンクどこいった。後で更新します。)

Kiosk: The Schema Layer for MongoDB and PHP - Schema is Not Your Enemy』

PHPActiveRecord的なMongoDBにアクセスできるMapperを作ってみたよというお話。
すみません、けしてPHPだからではないですがあんまりメモが残っていない(^_^;)

  • やっぱりスキーマレスとはいえ、アプリ作るときにはスキーマ的なものがないと作りにくい
  • PHPのドライバ直が実はパフォーマンスなんかはよいかもだけど、アプリ側で扱うオブジェクトとデータがシームレスに扱える状態にしておきたい
  • PHPActiveRecord的なものでMongoDBと接続するMapperとしてKioskを作った
  • 使い方的にはActiveRecordと同等

ということで、実際のコードを示した実演もありました。

『Node.js and MongoDB』

日本のザッカーバーグと呼ばれているとかいないとかのサイバーエージェント
アメーバピグやピグの米国サービスで、facebook platform上で作られている
アメーバピコを作っている名村卓さんのお話。これは非常に面白かった。

  • まだ市場公開はしていないPC向けソーシャルゲームのお話
  • 利用している技術は以下な感じ
    • MongoDB 1.8
    • node.js 0.4
    • WebSocket
    • flash
  • なんでMongoか
    • スキーマの自由度(ゲームなんでいろいろ追加とか変わってくし)
    • インデックスも柔軟につけられる
    • スケールする機能を持ってる
    • ドキュメント毎のatomic性を確保する仕組みもある
  • なんでJavaScriptのnode.jsにしたかの理由は
    • Javaの静的型付けなドライバに絶望した
      • だってスキーマの自由度も理由でMongo採用したのにそれって。。。
    • Rubyは社内の勢力が弱かった
    • Pythonianが多いんだけど、Python+twistedは同僚エンジニアに拒否された
    • なんかnode.jsが流行ってるし
  • Mongoの構成
    • 3台でのreplica setを3つのsharding構成(3x3
    • 数万ユーザの同時接続をまかなえる
  • MongoDB+node.js
    • 『鼻血が出るほど相性がよい!!』
    • そもそもMongoのデータの持ち方はJSONをバイナリ化したBSON
    • MongoのクエリエンジンもJavaScript
    • クエリもJSON、データもJSONで扱える
    • プログラムとデータがシームレス
    • Mapperなんていらない!!
  • node.jsの特徴
    • 完全非同期
    • DBアクセスも全部コールバック
    • エラーハンドリングもコールバック
    • ネストが深くなりがちなので工夫必要
  • 工夫したこと
    • メソッドチェーンで連続した処理をかけるようにした
    • getLastErrorも裏で処理しておくようにした
  • 運用管理ツールを自作!!
    • ソーシャルゲームは運用が命
    • 裏で使う社内ツールなので、最新技術をバリバリ使える
    • 技術者の腕の見せ所
    • 最新技術使った良いツールを作ってチームのテンションとモチベーションを上げる→売上アップ
    • ということでピグのリアルタイムレポートツール
      • 注:デモを見ましたがほんとにリアルタイムにサクサクとアクセスやユーザの購買データなんかのレポートが流れてきます
      • データ定義をそのままフォームに利用できるので、利用している
      • WebSocketで通信
  • まとめ
    • 仕様やデータの構成が複雑で変更されるようなソーシャルゲームの裏側でMongoを利用するのは相性がよい
    • node.jsはMongoと相性がとてもよい
    • テストがすごく重要
      • スペルミスしちゃっても普通に動いてしまう
    • 厳格なシステムには柔らかすぎるから向かないかも
    • Shardingとかも普通には問題ないけど、たまに手動でチャンクの移動をしてあげないと偏りが出たり、まだまだな部分もある

アメーバでMongo使ってても大して驚かないのですが、共感したのは、
運用ツールのところで、社内で使うツールなんだから最新技術を
どんどん使って技術者のモチベーションも上げていくというところですね。
我々のようなSIとは運用と一口に言っても、異なる面が多いのは
置いておくとしても、社内で使うものに、どんどん最新の技術を
試していくというのはよい文化ですね。

その他

印象に残ったこと雑感

  • スーツな人はほとんどいませんでした。懇親会にも出ましたけど、だいたいがサービサーの中の人。
  • 登壇者、参加者の平均年齢が若い。たぶん1985年生まれから80年生まれくらいが一番多かったのじゃないか。
  • 10genの方がお子さんを連れて来られていた。米国らしいですね。
  • 英語はやっぱできたほうがよいなぁ。。。

以上、雑な報告ですんません。

[Ruby] [RubyKaigi2010]RubyKaigi2010に行ってきました

 
またまたエラい久しぶりの投稿です。
というか、すでにイベント参加した時にしか書かなくなってますが。
マズいなこの状況は。
 
というのは置いておいて、RubyKaigi2010に参加してきました。2008、2009に続いて3年連続参加です。
 
過去2回は、やや仕事よりな関係もあって、半ば公的に参加してた感じなのですが、今回は完全自腹で楽しみに行ってきました。
 
本当は3日間全てに参加したかった(しかも泊まりがけでがっつりで懇親会も行きたかった)のですが、休みの日はちびっ子対応も必要だったり、3日目の日曜日は嫁さんから与えられた任務があったりで、もしも3日間行ったなら家庭内のフォースが乱れる要因満載だったため、やむなく断念した次第。
 
という個人的なことはどうでもよいのですが、今回は細かいセッションの内容云々ではなく、RubyKaigi全般の感想、感じたこと、そして感謝を書こうと思います。
 
毎度参加するたびに思うのですが、このRubyKaigiというイベントは人で成り立っていると思います。スタッフのみなさん、おそらく企画段階から当日の運営まで、とても大変なはずなのですが、みなさん楽しそうにやっているのがとても印象的です。一つ一つの企画が個性的で楽しげなのは、そういうスタッフのみなさんの「人」が反映されてるからなんだろうなぁと。
 
RubyKaigiのスタッフのみなさんを見ていてもそうですし、今回セッションでお話を聞いたRubyのコミッタのみなさんを見ていても感じるのですが、RubyKaigiのみならずRubyを構成している世界っていうのは「人」で成り立ってるし、その人柄っていうのが、単に利用されるというだけでなく、世界中にファンのいるものとして成り立たせているのではないか、とも思ったりしました。
 
会場には海外からの参加者の方も、大勢いらしていました。ふと自分自身を顧みてもそうなのですが、やっぱ僕等ももっと英語をがんばってもよいのかなぁと。お互いにお互いの言語を教えあって、両方でコミュニケーション取れるようになるのが一番だと思うのですが、少しでも話せれば、もっと世界が広がると思いました(というところで、僕自身も英語力がかなり残念な感じなので、今回も海外の方と話す機会はなかったのですが)。
 
あと、海外からきた方達を見ていて見習うべきだなぁと思ったのは、彼らの議論力。人の質問のタイミングでも、考えがあれば割り込んで話す。文化も環境も違うので、全部が全部彼らと同じようにしようとは思いませんが。
 
ということで、なんとなくバクッとした感想を書いてしまってますが、とにかく伝えたいことは、まだ参加したことがない人は来年はがんばってチケット取ってぜひ参加してみるべきということです。まぁ、イベントっていうのは自分自身で課題やら目的持って参加するのがよいのかもしれませんが、それはそれで置いておいても、とにかく面白いですから。
 
最後にスタッフのみなさん、スピーカー、トーカーのみなさん、そしてRubyに関わる全てのみなさんに感謝!!
 
おまけ:
今回驚いたこと リアル厨二Rubyistがいたこと!!
 
末おそろし。というか、少しまじめな話、彼らが成長したときに海外流出しないように、日本の開発現場とかちゃんとしとかないとなぁなんて。ま、そんな狭い話じゃなくて、世界を見ないとダメだな。