24
Node Updates IIJ 大津 繁樹 Node学園 19時限目 2016年2月9日

Node最新トピックス

Embed Size (px)

Citation preview

Node UpdatesIIJ 大津 繁樹

Node学園 19時限目 2016年2月9日

自己紹介

• 株式会社 インターネットイニシアティブ(IIJ)

• Nodeの中の人(CTC: Core Technology Committee)

内容• 明日朝のセキュリティリリースについて

• Nodeのバージョン おさらいとおすすめ

• 最近のNodeの開発について(体制や環境)

• 最近の開発トピックス

1. Chakra Node

2. Buffer APIのセキュリティ強化

3. Promise APIの導入議論

セキュリテイ リリース• 日本時間2月10日(水)朝8時にリリース予定です。

• Disclose前のため詳細は話せないですが、HTTP処理に関連する脆弱性です。

• Low Severity, node-v0.10~node-v5.xまで全バージョンが対象です。

• https://nodejs.org/en/blog/にアナウンス予定

Nodeのバージョンおさらい• Sem-Verに従います。http://semver.org/

• major.minor.patch (例:Node-4.2.6)

• patch: バグフィックスのみAPI変更なし。

• minor: API機能追加のみ。後方互換性維持。

• major: 非互換の変更が入る。

• LTS(30ヶ月サポート)には元素名がつきます(Argon)

偶数・奇数はたまたま

どのバージョンを使えば良い?• Node-v0.10, Node-v0.12は2016年12月31日でサポート終了。今年中に移行してください。

• Node-v4.x(LTS)は2018年3月31日までサポート

• Node-v5(Stable):機能追加・バグフィックスはがんがんやります。ただし後方互換は維持。Node-v6が出たら非サポート

• 2016年4月にNode-v6のリリース予定。10月に次期LTSへ長く安定して利用したいならその時の最新LTSを選んでください。

最近のNodeの 開発について

(体制や環境)

Nodeの開発体制Core Technical Committee

• Technical Direction

Node.js Foundation

• Business Direction • マーケティング

Collaborator

• コードレビュー、コミット • Issue/PRの処理

Working Groups

• いろいろ(*1)

エスカレーション

(*1) https://github.com/nodejs/node/blob/master/WORKING_GROUPS.md

test・CIの改善 https://ci.nodejs.org/

• NodeがサポートするCPU/OSは多種多様

• CPU: arm, arm64, ia32, mips, mipsel, ppc, ppc64, x32, x64, x86

• OS: win, mac, solaris,freebsd, openbsd, linux, android, aix

• テスト(1000近く)も非同期タイミングでエラーになるものも多かった。

Merge前に必ず実施

CITGM• Canary In The Gold Mine(いわゆるsmokeテスト)

• これまでバグ修正やAPI追加・変更でユーザモジュールにどういう影響があるのかリリースしないとわからなかった。

• expess, lodash, glup等利用者が多いユーザモジュールのテストをCIとして実施。リリース前にその影響を把握し対応する。

開発中

https://github.com/nodejs/citgm

Node Enhancement Proposals(EPs)

• https://github.com/nodejs/node-eps

• 比較的大きなAPI機能の追加・変更を起案するrepo

現在の提案状況

1 C++ Stream Rejected

2 Websocket 議論中

3 ES6 module 議論中

4 Buffer API 議論中

Express• IBMによるStrongLoopの買収に伴い Express の開発もIBM配下で行われるようになった。

• Expressの開発をより充実したものにするため Node.js Foundation の incubator projectに移すことが話し合われている。

• 具体的にどのような形になるのか以下でアナウンス

• https://github.com/nodejs/TSC/issues/44

最近の開発トピックス注意:現在議論・検討中のトピックスなので

今後変更される可能性があります。

Chakra Node• 大きく2つの機能追加

1. ビルド時の指定によるJSEngine追加(V8ShimによるChakraCoreのサポート)、 defaultはV8

2. Windows ARM のサポート

• 現在はWindows OSのみサポート

• Windows用に最適化された chakra.dll(非公開)とのリンクも想定しているもよう。

• Windows Azure, Windows 10 IOT, XBox, Windows Phone 等での利用を想定しているのかも(個人的な予想)

議論中

Chakra NodeNodeコアの変更はわずか

• process.jsEngineの追加

• Symbol.species, デバッガは未サポート

• ARM対応のため gyp/node-gypにも要変更

ShimやChakraCoreの中はまだよく見てません。

議論中

Chakra Nodeの行方• 「Node.jsはVMに対して中立であるべきか?」で議論中

https://github.com/nodejs/roadmap/issues/54

• V8,Chakra,Nodeの3チームが集まって統一APIを作ることができるか3月頭にF2Fで話し合う予定。

• 時間がかかるので、当面Chakraは別レポジトリで管理してもらうことに。(issueが混ざると面倒なため)

https://github.com/orgs/nodejs/teams/chakra

議論中

Buffer• Nodeでバイナリーデータ(バイト列)を扱うクラス

• Node-v0.1の時代から導入されていた。

• 昔 Buffer vs Typed Arrayの議論があったらしい。

• Typed Arrayの標準化の行方がはっきりせず、エンコードの指定も必要との判断からNode独自のBufferで進めることに(要出典 *1)

• V8 APIの廃止に伴い現在はUInt8Arrayにprototypeを付与したものに変更されています。

(*1) 昔どっかのブログで読んだ記憶があるが、見つかりませんでした。

Bufferの問題1. データが初期化されていない。Heapデータが入る

$ node -e 'console.log(new Buffer(8))'

<Buffer b8 a7 03 c7 71 7f 00 00>

2. 初期化引数を間違えるとHeapデータが漏洩?

new Buffer(value): valueをstringを前提としてしまうと、numberだったらどうなる?

これまでどうしてた?• Cのmalloc(3)と同じだからみんなわかるよね。

• ArrayBufferは0で初期化するけどBufferは違うから気をつけましょうってAPI Docにも書いてある。

• 0で初期化すると初期化する分だけ性能に影響する。DoS Vectorにもなりうる。

• これまで律儀にちゃんと new Buffer(n).fill(0)している人はどうなるの?

• 新旧のバージョンで初期化の挙動が変わるのも問題

うーん、どうしましょう• Buffer() コンストラクタの廃止(soft deprecation)

• Buffer.allocUnsafe(size)

• Buffer.alloc(size[, fill])

• Buffer.from(data[, encoding)

• --zero-fill-buffersオプションの導入

(注意:API名・機能は変わる可能性があります。)

議論中

新APIの導入

議論中

Promise• JavaScript の非同期処理のためのクラス

• 当初Nodeで独自実装されていたが、Node-v0.1.30で完全削除された。

• Promiseがまだ仕様化されておらず、ユーザからの要求が多種多様でまとまらないと判断し、単純なコールバック方式のみサポートすることに。

• ES2015で標準化。前倒しでV8で実装されNode-v0.11.13より復活した。

Promise API• Node Core APIでPromiseのサポート

• コールバック方式は維持し、コールバックを指定しないとPromiseが返る

fs.readFile(‘hoge.txt', 'utf8').then((words) => {

console.log(`a picture is worth ${words.split('\n').length} words.`);

}, (err) => {

console.error('there are no words.');

});

議論中

Promise API

• http.getAsync()など一部APIはPromise用にAPIを新設する

http.getAsync(‘http://example.com/').then((res) => {

res.pipe(process.stdout);

});

議論中

Promise API• 3rd partyのPromiseも使えるようにする

• process.setPromiseImplementation(require('bluebird'));

• エラー処理(Domain, unhandledRejection, post-mortem debug)について要検討

• 当初はオプションフラグで有効化

議論中

今後どうなるのかまだわかりません。