東京Node学園祭 2012に行ってきました。

f:id:yosuke_furukawa:20121123173313j:plain
Node本にサインもらったよ!!

東京Node学園祭 2012に行ってきました。今回も非常に盛り上がった、学園祭でした。

今回は特に以下のポイントが大きかったかと思います。

  • Nodeの日本語の本が出たこと
  • Isaacs, mikeal, substack, indexzeroといったNode会のスーパースターを多く揃えてもらえたこと。
  • Node勉強会の回数を重ねたことで、知見が結構付いたためか、スピーカーのレベルも上がったこと。

ほとんどAホールにいたので、Bホール側の面白そうなスピーチは聞けていないのですが、Aホール側のスピーチの中で面白かったものを抜粋して紹介します。

■Stream2の話 by Isaacs


資料:Streams2について

Isaacsの説明は、新しいNode.jsで採用される予定のStreams2の話でした。

Streamという概念はNodeの根幹。これを極めるものはNodeを極めるといっても過言ではないくらい。
Nodeはこれまでも知られている通り、非同期IOのため、データの流れを如何に処理するかにかかっている。

NodeのStreamはそのデータの流れを効率的に扱えるようにするためのAPIが揃っています。
pipe, resume, pauseなどなど。
こんな便利なStreamですが、いくつか現段階では欠点があります。
・即時に'data'イベントをonできないとdataの読み込みをlostする事がある。
・pause()を使えば、IOを一時停止しておいて、自分のアプリケーションの状態に
応じてIOを再開できるけど、やっぱりIOを止めることになる。それにバッファ中にpauseすると(メモリ中とfilesystemの間で整合性が取りづらいから?)バグが生まれやすい。
・cryptoモジュールがまだstreamに対応していない。 => これはv0.10で解消。

そんなこんなで、v0.10にはstreams2を作る予定。
これは内部のbufferがいっぱいになると、pauseとかresumeとかしなくても、自動的にpush backしてくれる機能がつく予定。
しかも後方互換性あり!(たぶん)

との事でした。
最近盛り上がっているStreamがどんどん進化していく様子ですね。

■Nodeのコアの歩き方〜Nodeの開発に参加しよう by 大津さん


資料:Nodeコアの歩き方 ~Nodeの開発に参加しよう~ [Node.js] // Speaker Deck

Nodeのコア部分を紹介してもらえる素晴らしい資料。
Nodeのクラス図を紹介し、そこから土地勘を得た上で、JavaScriptC++がどうやって連携しているか、Nodeの起動までの流れ等。
普通にNodeを使っているだけでは見落としがちな所に焦点を当てて紹介してくれた良スライド。

この他にもNodeのコミッターとして、コード規約や知的財産権の譲渡等、非常にためになる内容が詰まってました。
11/20にNode本の勉強会があり、講師として活躍していたので、その時の様子も後でブログにします。

ちなみに個人的に一番良かったのはNodeの土地勘を持とう、という話で、そこでコアAPIのクラス図が出てきます。
これがすごく便利で、壁紙とかにしてもいいんじゃないかと思うくらい。是非見ておきましょう。

コアAPIのクラス図

■Nodeをproductionで動かすときの注意点について by charie (indexzero)


資料:presentations/2012/nodefest.jp/nodefest-slides.key at master · indexzero/presentations · GitHub

このスライドの中にもEffective Node.jsな事が書かれていました。スピーカーはNodejitsuのCEOであるindexzeroさん。

  • node.jsは最新のAPIは不安定なので、ソースで入れるよりもバイナリで入れたほうが良い時がある。
  • 偶数バージョンはstableだが、奇数バージョンはunstable。あまりproductionでは奇数バージョンは使うべきではない。
  • process.on('uncaughtException')で、キャッチされなかった例外を捕捉することが可能。しかし、本来はちゃんとエラーハンドリングをするべき。特にuncaughtExceptionでプロセスをexitしない場合、本来死ぬべきなのに死なないゾンビみたいなプロセスになる可能性がある。
  • ちゃんとon('error')でエラーイベントをキャッチしよう。ちなみにdomainsはまだstableじゃないからあまりproductionでは使わないほうがいいよ。
  • 一回しかやられないイベントはonでキャッチするんじゃなくて、onceでキャッチしよう、そうしないとメモリーリークを生む危険性がある。
  • なるべくprocess monitorを使おう。Monit, upstart, foreverでプロセスを監視できるよ。forever listとかやるとforever中で実行されているプロセス監視できる。
  • npm内の依存関係にワイルドカード使うといつか動かなくなることもあるよ。だから、基本的にはちゃんとバージョン番号を書こう。
  • clusterもまだまだ実験的。http-proxyでサーバー分散させた方がいい時もあると思う。企業とかでよく使われているし、APIもstableになっている。

→こんな事言われてもやることたくさんあるよね!
だからNodejitsuを使おう!!

■layering distributed systems by substack


資料:substack/nodefest-2012 · GitHub

Streamを制するものはNodeを制する、と先程述べましたが、まさにStreamを制しているお方の一人。非常に未来を見せるスライドでした。

主に紹介してたのは以下の4点。

  • secure-peer => streamを公開がき暗号を使って暗号化する。
  • dnode => 非同期プロセス間通信
  • scuttlebutt => 分散環境で動作させるデータレプリケーション
  • crdt => 順序に依存しない処理を実現する。分散、協調処理向け。


scuttlebuttを使ってリアルタイムアプリケーションのデモもやっていました。Streamの可能性と未来を見せる、そんな話でした。


■untitled by mikeal


資料:不明
Nodeの構文的な話から入って、Node.jsの歴史を振り返る、という話でした。

Nodeはすごくシンプルなパターンの構文を使っている。
そのパターンを知っていると他のモジュールをうまく使える。

function(err , result) {}

っていうcallbackが一番シンプル。

こんなかんじで使える。

request (url, function(error , response) {
  if(error) throw error
  console.log(response.body)
})

引数の最初がerrなので無視することは出来ない。
これと違う構文を使う人は信用出来ない。

また、初期のNode.jsではプロキシサーバーを作ろうとしたら数十行になってしまった。それが今では、数行で実現できる。

var request = require('request')
   , http = require('http');

http.createServer(function(req, res) {
    req.pipe(request('http://www.google.com/')).pipe(res);
}).listen(3000);

進化の速さ、それこそが最大のNodeが成功した秘訣。という話でした。

あと面白かったのは、フレームワーク反対派だったこと。Noderはexpressとか使うの嫌う人多いな。

■LT大会
どれも面白かった。
ひどかったのはおっぱいのやつ。面白かったけど。
一番面白かったのは話しかけるとミクさんが反応してくれる奴。
ハードウェアハックの話はデモ映えする、と思った。

■まとめ
すばらしい文化祭だったと思います。スタッフの方々、スピーカーの方々は疲労困憊だと思いますが、非常に楽しかったです。
本当にお疲れ様でした。
後夜祭でもIsaacsと肩を組んで写真をとれたし、いろんな人たちと話せたので、個人的には大満足です。
また来年があれば行きたい!!