5/23 Node International Day

5/23にサイバーエージェント様を会場にしたNodeSchoolに参加してきました.100人超とかすごい.

International Day

当日は「International Day」という催しのようで世界各地で同時に開催されていた.大阪やドイツなどと映像つないだりした. 大阪の巨大スクリーンがNodeでいじってるらしく(詳しく分からない)すごかった.

Node

だいぶ久しぶりのNodeでいろいろ作法に戸惑った. でもメンターの方々のとはあまり触れ合えなかった.いろいろレベルダウン.

カリキュラム

当日に提示されていたカリキュラム(ワークショップ)Nodeの基礎についての「learnyounode」を選択しました. これがよく出来ている.

npm install -g learnyounode

カリキュラムはいろいろ選択ができる. Node School TokyoのGitHubページにリストされているのは以下のとおり. (当日にリストされていたのものより数が多いと思います)

https://github.com/nodeschool/tokyo/blob/gh-pages/README.ja.md
https://github.com/nodeschool/tokyo/blob/gh-pages/README.ja.md

  • learnyounode
  • levelmeup-jp
  • javascripting-jp
  • how-to-npm-jp
  • browserify-adventure-jp
  • tower-of-babel
  • learnyoureact

当日は自分のNode力が残念だったので半分くらいしか進まなかった. ようやくすべて終えた.一番苦労した「ASYNCジャグリング」の問題についてメモっとく.

ASYNCジャグリング(JUGGLING ASYNC)

この問題の詳細は現物を見てもらうとして. 簡単に要点を書くと,

  • HTTPサーバをつくる
  • 3つの異なるGETリクエストがくる
  • 処理時間はそれぞれ違う.
  • レスポンスはリクエストが来た順に返す

というところで,むずかしいのが最後に書いたことだった.

ここがNodeのキモだと思う.非同期のコールバックというのでしょうか. 前にNodeを書いていた時もだいぶ苦労したのに,やはりすっかりコツは忘れていた.

ワークショップの解答はここには写しません. 自分の解答を書きます.

var http = require('http');

var urls = [];
urls.push(process.argv[2]);
urls.push(process.argv[3]);
urls.push(process.argv[4]);

var counter = 0;
var results = new Array(urls.length);

function getCallbackClosure(index) {
  return function(response) {
    var buf = '';
    response.on('data', function(data) {
      buf += data.toString();
    });

    response.on('end', function() {
      results[index] = buf;
      counter++;
      if (counter === results.length) {
        results.forEach(function(elm) {
          console.log(elm);
        });
      }
    });
  };
}

for (var i = 0; i < urls.length; i++) {
  http.get(urls[i], getCallbackClosure(i));
};