東京Node学園祭2012に行ってきたよ

一昨日、東京Node学園祭2012に行ってきました。
いろいろ書いてるけど、微妙に間違ってるところとかもあるかもしれません。


Togetterでツイートをまとめてくれてる人がいるので、見ると雰囲気がわかって良いかも。
http://togetter.com/li/408747
説明のところにスライドへのリンクやらいろいろ書いてある!スバラシイ!


出発・到着

6:55発の新幹線で出発!LL Decadeの時と同じ新幹線だったみたい。
東京駅に着くまでほとんど記憶がないので、ぐっすり眠っていた模様w
東京駅に着いた後は中央線で市ヶ谷まで移動しました。微妙な乗り換えが面倒だったなあ。


電車に乗っていたときに法政大学が見えたので、そっちの方を向かっていたつもりが、川を挟んで逆だったりしたw
Galaxy Sにナビしてもらって逆だってことに気がついたからよかったけど。
会場の法政大学に到着するが、入り口がわからなくて適当に近くの建物に入ったらそれだったりとか。
恥ずかしい事に自動ドアに気がつかないで、非常用ドアから入ろうとした……w
そういえば、そのとき同じ参加者の人に話しかけられたのだけど、誰だったのだろう。何かしら聞いておけばよかったかも。


とまあ、なんとか到着。
なんかいろいろもらって適当な席に着いて、あとは待機してました。
1席に電源が1つ付いてるのすごいなあと思った。

イントロダクション

@mesoさんによるイントロダクション。まあ注意事項とか。
Twitterハッシュタグは#nodefest, #nodefestA, #nodefestBでした。

基調講演 / New Readable Stream in Node 0.10 : @izs

続いて二代目node.jsゲートキーパーisaacの基調講演。
今までのストリームの歴史と、問題店、次のバージョンでのストリームについてのお話。
http://dl.dropbox.com/u/3685/presentations/streams2/streams2-nodefest.key
http://dl.dropbox.com/u/3685/presentations/streams2/streams2-nodefest.pdf

ストリームの歴史
  • util.pump()
    • 既に非推奨
streams1 / stream badness
  • cryptoがstreamを継承していない
    • 0.10.0でstreamを継承するみたい -> V(^_^)V
  • バッファリングが難しい
    • 使うのは楽だけど、作るのは難しい
streams2

readメソッドを呼んだタイミングでデータを取得できる

  • Readable
    • r.read(size) -> buffer or null
    • r.emit('readable') -> time to read()
      • わかりやすい
  • バッファリングを簡単に設定
    • highWaterMark(default = 1024)
    • lowWaterMark(default = 0)

メソッドが対照的になる

read() wtite()
readable drain
end event end()
old-mode streams1 shim

ただまあ、streams1をstreams2で置き換えちゃうと既存のコードが動かなくなるので、
古いインターフェースを使っていたらstreams1を使うようにする後方互換性を入れるみたい。

1.0はいつ?という質問に対して

libuvが安定したら。1年くらい?という解答だったような。
安定するまでなので0.12とかも出るかも、とか言っていたような。

Track A / Nodeコアの歩き方 - 大津さん : @jovi0608

IIJ大津さんからのNodeのコア全般についてのお話。
https://speakerdeck.com/shigeki/nodekoafalsebu-kifang-nodefalsekai-fa-nican-jia-siyou-node-dot-js
以前のスライドはこっち。
http://www.slideshare.net/shigeki_ohtsu/processnext-tick-nodejs

0.9.3での変更点

昔、libeioとかで非同期だから〜的な記事をよく見たのに、libeio, libev削除しちゃうのかよ!と思ったw

process.nextTickの再帰はダメよ

仕様が変わって、process.nextTickをで再帰するとprocess.maxDepthを超えた時点で警告がでるようになるみたい。
再帰をしたい場合はsetImmediateを使いましょう、とのこと。IE9とかがrequestAnimationFrameより速いとかって実装してるやつだったかな?


などなど。Nodeのコードはたまにlib/を見るくらいであとは全然知らないので、内部についてちょっとだけ詳しくなった気分。

Track A / Running Node.js in Production - Charlie Robbins : @indexzero

node.js PaaSであるnodejitsuのCEOによるプロダクション環境でのNode.jsのノウハウ的なお話。
https://github.com/indexzero/presentations/tree/master/2012/nodefest.jp

node.jsはバイナリからインストールしよう

ここ最近のソースコードは安定性が低いので、バイナリからインストールしましょう、とのこと。(HEAD/開発版の意味に取ったけど合ってるのかな)
もしソースコードからインストールしたいなら、stableブランチからインストールしましょう。
皆さんご存知の通り、偶数が安定板/stableで奇数が開発版/unstableです。
unstableはWindowsサポートで問題になる事が多いそうな。

uncaughtExceptionでエラーを補足したらプロセスを終了しよう

プロセスを終了せずに起動したままだと、意図しない副作用を起こす事があるらしい。

process.on('uncaughtException', function (err) {
  console.error(err);
});

でなく

process.on('uncaughtException', function (err) {
  console.error(err);
  process.exit(1);
});

って事です。ドメインの場合もそうなのかな?

エラーハンドラを書こう
var req = http.request(...);

でエラーが発生した場合、スタックトレースがわけわからないので、

var req = http.request(...);

req.on('error', function (err) {
});

とちゃんとエラー処理を書きましょう。

イベントリスナの登録に注意してメモリリークをなくしましょう

イベントリスナの登録はするけども、外すのはよく忘れるので忘れないように。
1度しか使わないリスナならon()でなくonce()で登録しましょう。

domainはまだおあずけ

エラーハンドリングがまとまって便利だけど、Experimentalなのでまだ変更される可能性がある。
プロダクション環境ではまだ使うべきではない。

プロセスモニタを使おう

forever, upstartUbuntuのやつ?それともLearnBoostのupを聞き間違えた?)などを使って、常に起動状態に保ちましょう。

依存性は厳格に

package.jsonのdependenciesなどに、ワイルドカードなどでバージョンを指定できますが、それはやめて直にバージョンを指定しましょう。

分散に関して?

clusterを使うとUNIX/Windows間でのポータビリティが落ちる。
沢山の企業によって使用され、大変安定しているnode-http-proxyを使おう。

nodejitsuを使おう

こういう面倒なことは

$ npm install -g jitsu

でnodejitsu使うようにすれば考えなくていいよ!とのことw

ローカルnpmリポジトリを使おう

自社開発のモジュールをオープンソースで公開する必要がない。
.npmrcのregistryでリポジトリを切り替えて使う。


手順のスライドはここにあるみたい。
https://github.com/indexzero/presentations/tree/master/2011/couchconf-nyc
@hide_o_55さんの構築記事はこちら。
http://d.hatena.ne.jp/hide_o_55/20120725/1343213351

ネイティブアドオンは使わない

ネイティブアドオンの運用は面倒なので、できるだけ使わないようにしよう。


などなど。参考になることが多く、一番お気に入りの発表でした。

Track A / layering distributed systems : @substack

mkdirpなどの多くのnpmモジュールを開発・公開しているsubstackのお話。
https://github.com/substack/nodefest-2012
browserlingというサービスを公開してますね。


理解力が足りなくてあんまりよくわかってなかったけど、すごかったのは覚えてる。


うーんと、UNIX哲学的に1つの事をうまくやるモジュールを作って組み合わせて行くと、
地層みたいな層に分かれたものができて、それぞれのモジュールは付けたり外したりができて良い、
って話だったような気がするけどなんか微妙に違う気がする。


で、

  • secure-peer
  • d-node
  • scuttlebutt
  • crdt.seq
  • ecstatic

とかを使ったりしてた。
あとゴシッププロトコルで分散レプリケーション?をやっててそれがすごかった!

Track A / "Untitled" : @mikeal

reqeustモジュールで有名なmikealのお話。NodeConfの主催者ってのは知らなかった。
アンタイトルドって名前のタイトルだそうでw
内容はNodeは何故成功したのかというのと、それに合わせてNodeの良いところの紹介かな。

なぜNodeは成功したのか

「シンプルなパターンを用意しているから」
で、これは

function (error, result) {}

とか、Nodeを使ってる人なら見慣れたシンプルなパターンで書けるから、とのこと。
あとasync(caolan/asyncかな?)良いよね的な話もちょっとしてたような。

substackパターン

substackが書くモジュールは大抵

module.exports = function () {}

となっていて、substackパターンと呼ばれるようになったそうな。初めて聞いたw
これもまたシンプルでわかりやすい。単純に関数を返すものがシンプルで良いって。

早く終わったので別のスライド : Myfirst node.js program

2009年12月にTwitterで(?)
「node.jsでプロキシ書いた事ある人いる?」
みたいなツイートを見かけて書いたのが始まり。


Pythonでwindmillというプロキシを書いた事があったので、node.jsで書いてみる事にしたらしい。
書いてみたら2時間で出来た上に、3年かけて書いたPythonのものよりも速くてメモリ消費量も少なかった。
この出来事以来Pythonを書くのをやめたとかw
そのあとは年々機能が追加されていくnode.jsに合わせて、どんどんシンプルになっていくプロキシのソースコードを見たりとか。
最後には本当に数行程度になってました。


node.jsはコードを簡潔に書ける事を重要視している、とのこと。自分も書いててそう思う。

LT大会

続いてLT大会に。あまりメモできてない……

Node.js on Raspberry Pi : 河合さん

JavaScriptでハードウェア制御できるモジュールを使って実装したとか。
GitHub - EnotionZ/gpio: Talk to your Single Board Computer's gpio pins
あとJavaScriptなのでsetTimeoutなどが使えて良い感じみたい。
で、ブラウザから操作すると空気が入る装置を動作させるはずが……動かなかったw
これが後々活躍するのだけどw

はてなブックマークで振り返るNode.js : @cou929

はてなブックマークでNode.jsタグが付いたURLをdailyで表示するアプリを作って、歴史を振り返るというもの。
#Node.js on Hatena Bookmark - Speaker Deck
http://nodefest2012.cou929.nu/
発表では2011年あたりでドラがなってしまったので最後までは見れなかったのだけど、あーいろいろあったなー的な感じとかしました。

Node.jsで作る授業システム : @Blacks_G

Node.jsで作った授業システムの発表。九州から来たらしい……すごい……
発表に夢中でメモがあまり残っていないw
大学でぼっちというのと、node-webkitを使ったプレゼンシステムを作ったとか。


プレゼン中に#nodefestに反応してニコニコ動画風にツイートが横から流れてきてたのと、
それに反応した@mesoさんが

をツイートし、その後数人がRTしたせいで数回これが流れる事にw


ちなみにそのプレゼンシステムがLTで使用していたスライドそのものだったらしく、
「これからDEMOをします。これです」でした。

node-serialportがつなげるハードウェア : @niccolli

どこかで見た事あるような、と思ったらLL Decadeでお会いした、光るネクタイのnicolliさんでした。
発表の内容はnode.jsを使ったハードウェア制御的な。
Node.js ♡ Hardwares w/ node-serialport


LTのときはhttp://LED.local/というURLにアクセスすると上部にボタン?があって、
それをみんなで連打すると、ネクタイに取り付けられたLEDがきんちゃんの仮装大賞のような感じで上がって行くというものでしたw


node-serialportというモジュールでArduino(なのかな?)に対してシリアル通信をするとか、
シリアル通信間を無線でやりたかったのでnode-xbeeモジュールとZigBeeを使って無線化したとか、
自分的には組み込み懐かしー的なお話でした。はんだごて久しぶりに握りたい。

Node.jsを使った次世代2ch : Kunshiro Murayama

しゃべりハウスというサービスの発表。
えっと、部屋があってWebSocket(たぶん)でリアルタイムに更新されて……
チャットのような感じのサービス、で良いのかしら?
いつかは忘れたけれど、そのうち公開されるそうなので「しゃべりハウス」で検索してねとのこと。


デモをする際になかなかネットにつながらず、困っていたところに、河合さんの装置が動いて場をつないだりしたw

Node.jsで音声認識家電コントロール : @hecomi

node.jsと音声認識エンジンJuliusを使った発表。
Node.js で簡単に音声認識できるモジュールを作ってみた #nodefest - 凹みTips
技術的な概要は記事の通りというか。


音声認識でエアコンとか操作できたら良いよね、というところからこれを作ったとか。(だったと思う)
デモのときは操作できるエアコンとかないので、代わりに3Dのミクさんが音声に反応して反応した台詞を出力してた。
「エアコンを付けて」➡「エアコンを付けました」のような感じ。
微妙に行ってる事と違う認識をしていたりして、音声認識難しいなあと思ったり。

Server-sideで作るVisualization : @muddydixon

D3.jsというライブラリをモダンなブラウザでなくても動かす、という発表。
制限時間にならないように焦っていたらしく、相当早口だったので全然メモできていない!
http://muddydixon.hatenablog.com/entry/2012/11/18/131459
でもスライド見れば大体わかると思う!てか、はてなブログがそのままスライドになってるのすごい。

Nude Knock Out : @nazomikan

Node Knock Outで作ったおっぱいDouble Mountainの発表。
Nude Knock Out
やっている事はそこそこ高度なのだろうに……w
ちゃんと声が出たり、振動が伝わったりとかすごいなあと思ったw


デモをするときに「nodejitsuが落ちると怖いのでローカルで」という発言に対しての
@mesoさんの「nodejitsuのCEOが居る前でw」というツッコミが面白かったw

帰宅

東京駅で親子丼買って新幹線に乗って帰った。

感想のような

新たに得た知識で、今までとは違うコードが書けるようになりそうな感じ。
他には自分には思いつかなかったnode.jsの使い方があるなーとか、思ったり。
刺激を受けたし、自分もnode.js/JavaScriptがんばろーって気になった。


東京Node学園祭2013もあるならまた行きたいなあと思ったのでした。