東京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%程度向上
  • io.js の最新ニュース

  • Node.js ユーザグループはどうするか

    • 積極的に進めていく
    • 皆で議論をして混乱を防ぎたい
    • 具体的には io.js の翻訳と議論

「extensible web」 by @Jxck_

  • The Extensible Web Manifesto

  • 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

  • JavaScript で goto

  • 今できるとは?

    • 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_

  • ライフゲームとは?

    • 詳しくはニコ動で
  • ライフゲームのルール

    • ある決まったルールにしたがって生死の情報が決まっていく
  • https://glacial-mountain-4867.herokuapp.com

  • socket.io 楽しい!

懇親会