技術探し

JavaScriptを中心に記事を書いていきます :;(∩´﹏`∩);:

util.callbackify()というのがそろそろNodeへ入りそう

github.com

util.promisify() に関連して提案されました。

abouthiroppy.hatenablog.jp

github.com

名前の通り、非同期関数をコールバック関数に変換する関数です。
つまり、util.promisify()の反対版です。

const util = require('util');

async function fn() {
 return await Promise.resolve('hello world');
}

// or
// function fn() {
//   return new Promise((resolve, reject) => {
//     resolve('hello world');
//   });
// }

const callbackFunction = util.callbackify(fn);

callbackFunction((err, ret) => {
 if (err) throw err;
 console.log(ret);
});

引数にAsyncFunctionをとり、戻り値にコールバックが入った関数が返ります。

semver-minorとして入り、早ければ次のNode8.2.0に入るかもしれません。

babelへOptional Chainingが追加される

Optional Chaining

github.com

// before
const fooInput = myForm.querySelector('input[name=foo]');
const fooValue = fooInput ? fooInput.value : undefined;

// after
const fooValue = myForm.querySelector('input[name=foo]')?.value;

const obj = {
  foo: {
    bar: {
      baz: 42
    }
  }
};

obj?.foo?.bar?.baz; // 42
obj?.qux?.baz; // undefined
obj?.foo.bar.qux?.(); // undefined

function test() {
   return 42;
}

test?.(); // 42  
exists?.(); // undefined

class Test {
}

new Test?.(); // test instance
new exists?.(); // undefined

?.演算子の左の式の評価がundefined または nullのときに右の式が評価されず、undefinedを返します。

現在のステータスはstage-1です。

Babylon

babylonへOptional Chainingの追加と?.トークンタイプが追加されました。 babylonとは、Babelのために作られたJSのパーサで、acornがベースで作られています。 github.com

Babel

github.com 現在レビュー中です。
またこのPRのマージ先は 7.0.0 なので少し待たないといけないかもです。(現在 alpha.12)
このPRでできるbabel-plugin-syntax-optional-chaining というパッケージが後ほど babel-preset-stage-1 へ入ると思います。

ドワンゴを退職してメルカリに入社した

2年ちょっと働いたドワンゴを昨日退職して、今日からメルカリに入社します。

誰?

今年のニコニコ超会議で25歳になったエンジニアです。
JavaScriptが好きです。

ドワンゴという会社

本当に自由です。
こんな会社あるのかなって思うぐらい自由でした。
もちろん、仕事はするのですが会議とかに遅れなければ何時に出社してもいいという印象です。(チームによるかもですが)
また、エンジニア主体で企画を出しやすいです。 例えば最近だとマストドンの件とか。
ドワンゴのslackは日本で一番すごいと思うのですが、自分が見える範囲で2962チャンネル、絵文字が大量にあり見てて飽きなかったです。
技術的には、ドワンゴScalaErlangの印象が強いかもしれないですがフロントエンドも強いと自分は思います。
あまり外にコミットしている印象は無いのでそういう印象はないかもしれないですが。。
自分が所属していた部署は特殊で、自分が入社した時にできた部で2015年に入社した早期配属の人が所属する部署でした。
なので、同期が多く(10人ぐらい?)大変楽しく刺激的でした。
社内全体的に本当にみんなフレンドリーで風通りがすごいいいです。
また、自分の大学で仲のいい人がたまたま(?)たくさん入ってきていて大学と同じ生活ができてましたのもすごい好きでした。
今振り返ると、ドワンゴは理系の研究室と変わらない生活ができる会社だと思います。

ドワンゴでやったこと

自分はフロントエンドエンジニアとして働いていました。
ドワンゴでは3年で2回のサービスインを経験させて頂きました。

ニコナレは2つ目の仕事で、N予備校は3つ目の仕事でした。

転職理由

メルカリは今もっとも急成長している企業です。
その開発に参加してみたかったです。
それと英語力不足。
OSSでメンバーになったりするとハングアウトで通話をしたりサミットに出たりが多くなります。
例えば、Nodeだったら毎年最低一回はcore collaboratorが集まって議論し合うサミットだったり別プロジェクトだと月1で電話したりとか。。
そういう状況のときに会話ができない自分がいました。
メルカリでは日本だけではなく、アメリカやイギリスにスコープを向けています。
自分は必要にならないと勉強しないダメな性格なので仕事で英語を喋れる環境が欲しかったです。


メルカリではもちろんJSを書いていくつもりです。
自分はまだ、JSにコミットし続けたいと思っています。
また、今年は日本での活動を積極的にがんばれたらいいなと思います。
GitHubの活動はもちろん今まで通りですが、Node.js 日本ユーザーグループでの活動をもっと積極的にしていきたいです。

これからもどうぞよろしくお願いします!!

amzn.asia

Node8の注目的変更まとめ

そろそろNodeのv8.0.0が出ます。😆

github.com

注目するべき変更

Node8のリリースが4月から今回に変わった影響として、V8のバージョンをv5.8へ上げるためというのがあります。
何故かと言うと、TurboFanとIgnitionがv5.8で試験的に入り、v5.9でデフォルトになるのでLTS(v8.0.0はLTS)へのバックポートを楽にするためです。
TF-Iの詳しい資料

V8 javascript engine for フロントエンドデベロッパー

5月以降に入った注目的な変更はasync_hooksとpromisifyとnpm5.0.0が大きいです。

N-API(Node-API)

ネイティブモジュールのAPI安定抽象化レイヤー
異なるVM間、Nodeのバージョン間でABI(Application Binary Interface)互換性を保証します。

async_hooks

async_hooks initial implementation by trevnorris · Pull Request #11883 · nodejs/node · GitHub

新しいasync_hooksモジュールはNode内で作られた非同期なリソースの生存期間に対して追跡するコールバックを登録します。
非同期操作の全体の監視、追跡を行います。

以下が対象です。

FSEVENTWRAP, FSREQWRAP, GETADDRINFOREQWRAP, GETNAMEINFOREQWRAP, HTTPPARSER,
JSSTREAM, PIPECONNECTWRAP, PIPEWRAP, PROCESSWRAP, QUERYWRAP, SHUTDOWNWRAP,
SIGNALWRAP, STATWATCHER, TCPCONNECTWRAP, TCPWRAP, TIMERWRAP, TTYWRAP,
UDPSENDWRAP, UDPWRAP, WRITEWRAP, ZLIB, SSLCONNECTION, PBKDF2REQUEST,
RANDOMBYTESREQUEST, TLSWRAP

別記事で詳しく書きます

promisify

setTimeoutとかをcallbackではなくpromiseと同じ書き方ができるようになります。

Nodeへutil.promisify()の追加 - 技術探し

zero-filling Buffers

buffer: zero fill Buffer(num) by default by jasnell · Pull Request #12141 · nodejs/node · GitHub

デフォルトでBufferコンストラクタが0をセットすることにより、セキュリティ問題になるのを防ぎNodeを安全化させます。

inspector

node/inspector.md at master · nodejs/node · GitHub

新しいinspectorモジュールはv8のインスペクタで使用されるデバッグプロトコルを使うために作られました。

WHATWG URL

doc: graduate WHATWG URL from Experimental by jasnell · Pull Request #12710 · nodejs/node · GitHub

ステータスが実験から安定へ

–debugがなくなった

--inspect を今後使ってください。

streamにdestroyが追加された

stream: add destroy and _destroy methods. by mcollina · Pull Request #12925 · nodejs/node · GitHub

npmが5.0.0へ

The npm Blog — v5.0.0

他ので詳しく知りたい方はこちらもどうぞ

abouthiroppy.github.io

入りそうで入らなさそうなもの

すでにsemver-majorは凍結済みなのでおそらく入らないと思えます。 github.com

whatwg-consoleに準拠した実装の導入 github.com

さいごに

ざっとでしたが、今現在リリースノートの草稿段階なので公式で出たらもう一度まとめたいなと思います。

Open Source Maintainers on GitHubへ参加した

github.com

今日の17時ぐらいに急にメールを頂いて参加することになりました。

Hi @abouthiroppy!
You’re receiving this because we think that you have a lot of experience to share with other open source maintainers.

GitHubOSSの問題点は多くて、例えばずっと放置されているPRの処理やissueのトラッキングの難しさ、コントリビュータ、コラボレータの獲得など色々あると思います。

そのような身近で感じるような問題点をここで議論し、GitHubをよりよいものにしていくことが目的です。

自分がどれぐらい力になれるかはわからないですが、参加したからには頑張りたいと思います;)

Nodeへutil.promisify()の追加

ということで久しぶりに記事を書くことにした。

4/24のNode学園でも少し話したが、自分がとても注目している追加です。
Node8への変更点を見たい方はスライド見てください。

abouthiroppy.github.io

本題

github.com github.com

簡単に話すと、今までコールバックだったのがこのutil.promisify()を使うことによりPromiseと同じように扱えるということ。

これだけでかなりすごい。今までコールバック内でresolveしていたのだからそこのPromise用の関数を作らなくてもよくなるのはとても楽だ。 child_process, dns, fs, timers に対応している。

util.promisify()のリファレンス
node/util.md at aab71bd565662446622f36a011ce956a451b7be5 · addaleax/node · GitHub
まだマージされていないのでmasterではなく個人へ向けられています

さて、このPRは承認規定数を越したのでそろそろ着陸され、次の8.0.0への凍結前(5/9)にmasterへ入ると思われる。

const util = require('util');
const exec = require('child_process').exec;

/**
 * CallBack
 */
exec('ls', (err, stdout, stderr) => {
  if (err) console.error(err);
  console.log('stdout:', stdout);
  console.log('stderr:', stderr);
});

/**
 * Promise
 */
function execLS() {
  return new Promise((resolve, reject) => {
    exec('ls', (err, stdout, stderr) =>
      !err ? resolve(stdout, stderr) : reject(err)
    );
  })
}

execLS().then((stdout, stderr) => {
    console.log('stdout:', stdout);
    console.log('stderr:', stderr);
  }).catch((err) => {
    console.error(err);
  });

/**
 * util.promisify()
 */
const execPromise = util.promisify(exec); // ここでexecをPromiseにする

// async/await Node7.6.0 ~
(async () => {
  const {
    stdout,
    stderr
  } = await execPromise('ls');

  console.log('stdout:', stdout);
  console.log('stderr:', stderr);
})();

const setImmediatePromise = util.promisify(setImmediate);

setImmediatePromise('foobar').then((value) => {
  console.log(value)
});

このようにPromiseになるので、async/awaitのようにも使えるし今までのようにthen()でつなげることもできるようになった。

また今、whatwg-consoleの実装が着実に進んでいるのでこちらも注目すると良さそう。
6時間前に console.count(), console.clear() の実装がでた。
github.com github.com