東京Node学園 15時限目

io.jsロゴ

東京Node学園 15時限目に参加してきました。

今回はio.jsが登場して初めての東京Node学園だったので、その話を目的に参加しました。

「io.jsについて」 by @yosuke_furukawa

  • io.jsとは
    • Node.jsのfriendly fork
  • Node.jsとの違い
    • オープンガバナンスモデル
    • ハングアウトの録画と議事録の公開
    • 合議制でissue/featureを処理する
    • 新しくCommitterが6人追加
    • アクティブな良い状況になっている
  • Node.jsとの機能面の違い
    • v8 v4.1.0.14
      • ES6の機能の一部がデフォルトで使える。
        • koaがそのままで使える
      • --es_stagingオプションで使える機能もある
      • それ以外は個別にフラグが必要
    • 新API追加 V8
      • GCのheap統計を取ることが出来る
    • その他
      • Streamを簡単に作ることが出来る
      • assertにdeepStrictEqualの追加
      • util.debuglogの追加
  • Node.jsとの性能面の違い
    • httpだけではあまり変化はない
    • 全体的には10%程度向上
  • Node.jsユーザグループはどうするか
    • 積極的に進めていく
    • 皆で議論をして混乱を防ぎたい
    • 具体的にはio.jsの翻訳と議論

「extensible web」 by @Jxck_

  • Extensible Webとは
    • 「つべこべ言わずにコードを書け!」ってこと
  • 現状は仕様が決まり、ベンダーが採用してから、初めて開発者が使える
    • 先に仕様を決めるため、標準化は時間がかかる
      • 開発者に降りてきた時にはこれじゃない感がある
    • ベンダーが採用するまで開発者は使えない
    • 開発者のところにくるまでに時間がかかる
    • このループは限界がある
  • 開発者がもっと主導出来るようにしよう!
    • 開発者が実装してみる
    • 標準化団体が仕様化
    • ベンダーが改善
    • このループを回したい
  • そのためにはそれを実現出来るための Low Level API を用意しよう!
    • 開発者がそのAPIを使っていいものを作ろう!

詳しくはWebで Extensible Web を支える低レベル API 群

「ws の permessage deflateを実装した話とそれによりsocket.ioがどう変わるか」 by @nkzawa

  • permessage-deflate とは
    • メッセージデータをdeflate圧縮する
    • HTTPでいうとgzip圧縮のようなもの
  • permessage-deflate と http compression の違い
    • httpはレスポンスにのみ適用
    • websocketは双方向
    • httpは圧縮データのheaderに圧縮パラメータを含める
    • websocketはハンドシェイク時に圧縮パラメータを交換する
  • Context Takeover
  • 現状はChromeのみサポート
  • ブラウザでは設定変更が出来ない
    • 常に有効かつデフォルト値で動作する
  • socket.ioではv1.4でサポートする
    • 圧縮がデフォルト有効
    • ポーリング時はHTTP圧縮
    • メッセージ毎にon/offを切り替え可能
      • ブラウザでは処理が呼ばれるが切り替えられない。
  • 地味だけどパフォーマンス改善にインパクトは大きいはず!

「CodeOnMobile」 by @dai_shi

  • CodeOnMobile
    • GitHubのコードをブラウザ上で編集するWebアプリ
  • 何が出来るか
    • GitHub連携してログイン
    • リポジトリのファイルを編集
    • diff確認
    • コード編集
    • コミット
  • 今後
    • JSの自動フォーマット機能を入れたい

「今できる通信高速化にトライしてみた」 by @shibu_jp

  • 今できるとは?
    • Service Worker、Fetch APIはチャレンジすぎる
    • 枯れている機能で頑張ってみる
  • LZ4コマンドで遊んでいたとある日の発見
    • JSパーサでJSON(63MB)を生成
    • gzip圧縮 → 2.8MB
    • lz4圧縮 → 3.0MB
    • lz4で圧縮後にgzip → 1.7MB
  • LZ4とは?
    • 圧縮展開速度重視のアルゴリズム
  • gzipとの組み合わせでファイルサイズがgzip以下に減る
    • 繰り返しの多いJSONやテキストでこの現象が起きる
    • gzipはウェブのスタンダード
    • lz4の高速性の秘訣はシンプルな展開コード
    • ユーザにも嬉しいはず
      • ファイルサイズ削減
      • 通信高速化
  • 実装してみた
  • 速度のための工夫
    • JSX(DeNA製の速度重視のaltJS)
    • WebWorker
      • 通信と展開コードは別スレッド
      • ArrayBufferではコスト0でWorker間のやりとり
  • ベンチマーク
    • expressでcompressionでgzipエンコード
    • AppleのNetwork Link Conditionerで3G/LTEの通信環境を再現
    • ダウンロードは確かに早い
    • デコードのコストが毎回かかる
  • メリット・デメリット
    • メリット
      • 通信料削減は達成
      • WebWorker側で通信しているので、クライアントコード外でService Workerのようにフックがかけられる
      • サイズが小さいのでローカルストレージにやさしい
    • デメリット
      • 発熱が多少あった
      • トータルのスループットは大幅には変わらない
      • そもそもある程度大きいJSONでないと小さくならない
  • 改善の余地はまだまだありそう
    • ブラウザ上で
    • 展開コードの高速化
    • ネイティブアプリではネイティブ側で展開出来る

「Socket.IOを使ってライフゲームで遊ぶ」 by @tako_black_

  • ライフゲームとは?
    • 詳しくはニコ動で
  • ライフゲームのルール
    • ある決まったルールにしたがって生死の情報が決まっていく
  • socket.io楽しい!

懇親会

  • SUSHI!!
  • MongoDBJPの窪田さんがいた!
MeetupNode.jsio.js