tag:blogger.com,1999:blog-55757973188634022492024-03-13T20:03:57.127+09:00Node.js 日本ユーザグループ BlogNode.js 日本ユーザグループの公式ブログです。ユーザグループとしての活動の告知やNode.jsの技術ネタなどを掲載します。所長http://www.blogger.com/profile/10492210068622020537noreply@blogger.comBlogger25125tag:blogger.com,1999:blog-5575797318863402249.post-36974702081699638732013-09-18T12:01:00.000+09:002013-10-01T19:24:13.041+09:00東京Node学園祭2013開催のお知らせイベントの場ではアナウンスをしてきましたが、今年もNode.jsのカンファレンス「東京Node学園祭 2013」を10月26日に開催いたします。<br />
今年は海外からのスピーカーは招聘いたしません。その代わりに、日本国内のエンジニアの皆さんにできるだけ多くの発表の機会を設けたいと考えております。参加者が「聴講者」ではなく本当の「参加」者になれるようなプログラムを考えておりますので、是非皆さんにも積極的にご参加頂ければ幸いです。なお、場所や時間の詳細につきましては後日、東京Node学園祭サイトにて告知いたします。<br />
<br />
<span style="background-color: white; color: #6aa84f; font-size: large;">東京Node学園祭2013、セッションおよびライトニングトークの公募について</span><br />
来る10/26日に行われる東京Node学園祭2013、こちらでセッションおよびLTにてご登壇していただける方々を募集いたします。持ち時間は30分。ぜひ、規模に関わらずNode.jsを利用して開発を行っている方々に東京Node学園祭でのご登壇をお願いいたします。<br />
<br />
また、ライトニングトークの募集についてですが、今年はさらにライトニングに3分でのトークをお願いします。募集枠は5枠、こちらにつきましても皆様の溢れるパワーとみなぎるNode愛をお待ちしております。<br />
<br />
セッション、LTの応募方法については、こちらにフォームを用意いたしましたのでご記入をお願いします。募集の期日につきましては9月末日を予定しております。なお、応募多数の場合は学園祭実行委員会にて審査させて頂きますことをご了承ください。<br />
<br />
では皆様からのご応募、お待ち申し上げております。<br />
<br />
<span style="color: red;">追記(10/1)</span>:セッション、LTへの募集に関して一旦締め切らせていただきます。数多くのご応募、ありがとうございました。<br />
<br />Anonymoushttp://www.blogger.com/profile/17176653270564708907noreply@blogger.com21tag:blogger.com,1999:blog-5575797318863402249.post-76324534441095139102012-10-13T23:08:00.000+09:002012-10-14T00:37:57.588+09:00東京Node学園祭2012 アドベントカレンダーを開催します東京Node学園祭2012の開催まで、あと1ヶ月ほどになりました。<br />
<br />
そこで、Node.jsに関する話題のアドベントカレンダーを開催します!<br />
Node.jsでのサービス開発や非同期処理のハマりどころ、libuvやV8に関するハックネタなど、皆さんの経験から得られたNode.jsに関する知見などを共有/自慢して、東京Node学園祭2012を盛り上げてみませんか?<br />
期間は10月15日から学園祭開催直前の11月11日までを予定しています。<br />
<br />
<strong>参加方法</strong><br />
<ol><li>ATNDのイベントページ上でアドベントカレンダーに参加します(先着28名まで)</li>
<li>先着順に期間中の各日、午前0時から午後12時までの24時間の間にブログを書きます</li>
<li>告知のため、ブログを書いたらATNDのイベントページのコメント欄でURLをお知らせ下さい</li>
</ol><br />
参加表明は以下のATNDイベントページからお願いします!<br />
<br />
<strong style="font-size: 130%"><a href="http://atnd.org/events/33022">東京Node学園祭2012 アドベントカレンダー</a></strong><br />
<br />
なお、東京Node学園祭2012では、<a href="http://blog.nodejs.jp/2012/10/node2012-lt.html">LT発表者も募集</a>しています。<br />
イベントでも話すよ!という方はぜひ応募ください。<br />
<br />
最後に、すでにみなさんお気づきかもしれませんが、当ブログのデザインがリニューアルされました。<br />
リニューアルにあたっては<a href="https://twitter.com/uzu">@uzu</a>さんにご協力いただきました、どうもありがとうございました!summerwindhttp://www.blogger.com/profile/16882553976582690173noreply@blogger.com13tag:blogger.com,1999:blog-5575797318863402249.post-67462052755670966732012-10-10T20:58:00.000+09:002012-11-05T00:19:44.552+09:00東京Node学園祭2012 の LT 発表者の募集を開始します<br />
<span style="color: #444444; font-family: Arial, Tahoma, Helvetica, FreeSans, sans-serif;"><span style="line-height: 23px;">お待たせいたしました。</span></span><br />
<span style="color: #444444; font-family: Arial, Tahoma, Helvetica, FreeSans, sans-serif;"><span style="line-height: 23px;"><br />
</span></span> <span style="color: #444444; font-family: Arial, Tahoma, Helvetica, FreeSans, sans-serif;"><span style="line-height: 23px;">東京Node学園祭2012 の LT 発表者の募集を</span></span><span style="color: #444444; font-family: Arial, Tahoma, Helvetica, FreeSans, sans-serif; line-height: 23px;">開始</span><br />
<span style="color: #444444; font-family: Arial, Tahoma, Helvetica, FreeSans, sans-serif; line-height: 23px;">させて頂きます。</span><br />
<span style="color: #444444; font-family: Arial, Tahoma, Helvetica, FreeSans, sans-serif; line-height: 23px;"><br />
</span><span style="color: #444444; font-family: Arial, Tahoma, Helvetica, FreeSans, sans-serif; line-height: 23px;">時間は 1 枠につき 10 分、6 枠募集いたします。</span><br />
<span style="color: #444444; font-family: Arial, Tahoma, Helvetica, FreeSans, sans-serif;"><span style="line-height: 23px;"><br />
</span></span> <span style="color: #444444; font-family: Arial, Tahoma, Helvetica, FreeSans, sans-serif;"><span style="line-height: 23px;">この6 枠については、実行委員会側で選抜させ</span></span><span style="color: #444444; font-family: Arial, Tahoma, Helvetica, FreeSans, sans-serif; line-height: 23px;">て</span><br />
<span style="color: #444444; font-family: Arial, Tahoma, Helvetica, FreeSans, sans-serif; line-height: 23px;">頂きます。</span><br />
<span style="color: #444444; font-family: Arial, Tahoma, Helvetica, FreeSans, sans-serif;"><span style="line-height: 23px;"><br /></span></span><span style="color: #444444; font-family: Arial, Tahoma, Helvetica, FreeSans, sans-serif;"><span style="line-height: 23px;">スケジュールは以下を予定しております。</span></span><br />
<span style="color: #444444; font-family: Arial, Tahoma, Helvetica, FreeSans, sans-serif;"><span style="line-height: 23px;"><br /></span></span>
<span style="color: #444444; font-family: Arial, Tahoma, Helvetica, FreeSans, sans-serif;"><span style="line-height: 23px;">11/4(日) 締切</span></span><br />
<span style="color: #444444; font-family: Arial, Tahoma, Helvetica, FreeSans, sans-serif;"><span style="line-height: 23px;">11/9(金) 登壇者決定</span></span><br />
<span style="color: #444444; font-family: Arial, Tahoma, Helvetica, FreeSans, sans-serif;"><span style="line-height: 23px;"><br /></span></span><span style="color: #444444; font-family: Arial, Tahoma, Helvetica, FreeSans, sans-serif;"><span style="line-height: 23px;">年に一度のお祭りです!あなたのトークで盛り上</span></span><br />
<span style="color: #444444; font-family: Arial, Tahoma, Helvetica, FreeSans, sans-serif;"><span style="line-height: 23px;">げて下さい</span></span><span style="color: #444444; font-family: Arial, Tahoma, Helvetica, FreeSans, sans-serif; line-height: 23px;">!!</span><br />
<br />
<span style="color: #444444; font-family: Arial, Tahoma, Helvetica, FreeSans, sans-serif;"><span style="line-height: 23px;">以下のフォームよりご応募ください。</span></span><br />
<span style="color: #444444; font-family: Arial, Tahoma, Helvetica, FreeSans, sans-serif;"><span style="line-height: 23px;"><br />
</span></span> <span style="color: #444444; font-family: Arial, Tahoma, Helvetica, FreeSans, sans-serif;"><span style="line-height: 23px;"><a href="https://docs.google.com/spreadsheet/viewform?formkey=dHJrcHRlRU9LWmtsTnpzcmJHU1JwV2c6MQ#gid=0">東京Node学園祭2012LT募集</a></span></span><br />
<span style="color: #444444; font-family: Arial, Tahoma, Helvetica, FreeSans, sans-serif;"><span style="line-height: 23px;"><br />
</span></span> <span style="color: #444444; font-family: Arial, Tahoma, Helvetica, FreeSans, sans-serif; line-height: 23px;">皆様のご参加をお待ちしております。</span><br />
<span style="color: #444444; font-family: Arial, Tahoma, Helvetica, FreeSans, sans-serif;"><span style="line-height: 23px;"><br />
</span></span> <span style="color: #444444; font-family: Arial, Tahoma, Helvetica, FreeSans, sans-serif; line-height: 23px;">東京Node学園祭2012 実行委員</span><br />
<span style="color: #444444; font-family: Arial, Tahoma, Helvetica, FreeSans, sans-serif;"><span style="line-height: 23px;"><a href="mailto:nodefest@nodejs.jp">nodefest@nodejs.jp</a></span></span><br />
<span style="color: #444444; font-family: Arial, Tahoma, Helvetica, FreeSans, sans-serif; font-size: x-small;"><span style="line-height: 23px;"><br />
</span></span> <br />
<br />
<b>2012.11.05 0:00 追記</b><br />
<b>募集を終了致しました。</b><br />
<b>ご応募ありがとうございました!</b><br />
kysnmhttp://www.blogger.com/profile/10412852044772312836noreply@blogger.com5tag:blogger.com,1999:blog-5575797318863402249.post-55695125547749489222012-09-28T13:47:00.000+09:002012-10-16T00:07:04.703+09:00東京Node学園祭2012のセッションを募集開始します!大変お待たせいたしました。<br />
表題の通り 東京Node学園祭2012 の<br />
セッション枠発表者の募集を開始させて頂きます。<br />
<br />
時間は 1 枠につき 45 分で、<br />
今年は 4 枠募集します。<br />
<br />
<a href="http://nodefest.jp/2012/session.html">学園祭セッション内容</a><br />
<br />
この 4 枠は、公募したセッションの中から、<br />
一般による投票で決定させて頂きます。<br />
<br />
スケジュールは以下を予定しております。<br />
<br />
応募締切: 10/15(月)<br />
投票受付: 〜10/22(月)<br />
登壇者決定: 10/23(火)<br />
<br />
我こそは、というネタをお持ちの方、<br />
是非その技術を東京Node学園祭で<br />
発表してみませんか?<br />
<br />
以下のフォームよりご応募ください。<br />
<br />
<a href="https://docs.google.com/spreadsheet/viewform?formkey=dGhiekFsYlpSa1hQRmZhdHpCRE1UeGc6MQ#gid=0">東京Node学園祭2012セッション募集</a><br />
<br />
皆様のご参加をお待ちしております。<br />
<br />
<br />
東京Node学園祭2012 実行委員<br />
<a href="mailto:nodefest@nodejs.jp">nodefest@nodejs.jp</a><br />
<br />
<br />
<b>2012.10.16 0:00 追記</b><br />
<b>募集を終了致しました。</b><br />
<b>ご応募ありがとうございました!</b>kysnmhttp://www.blogger.com/profile/10412852044772312836noreply@blogger.com0tag:blogger.com,1999:blog-5575797318863402249.post-41070240516892314532012-07-19T16:53:00.000+09:002012-07-19T16:58:19.157+09:00「東京Node学園祭 2012」セッションスポンサーについて先日開始いたしました、「東京Node学園祭 2012」のスポンサー公募につきまして、既にいくつかお問い合わせを頂いております。ありがとうございます。<br />
<br />
お問い合わせの中で、「セッション枠」をもらえないかというご要望をいくつか頂きましたので、これについてこの場でご回答差し上げます。<br />
<br />
まず大前提としまして、「東京Node学園祭」はコミュニティ主体のカンファレンスです。当然のことながら、特定の企業の色が強くなりすぎることは避けたい、というのが我々の共通認識です。<br />
<br />
しかしながら、このカンファレンスを継続していくためにお金が必要なのもまた事実です。そのため、去年はスポンサー様に「お金を出すだけの価値がある」イベントだと認識していただくために、セッション枠やランチLTを設けるなどお話をして頂く時間を積極的に設定させていただきました。その結果、去年の感想では「(特定のというわけではないが)企業色が強い」という我々としては望ましくない感想がいくつか聞かれました。<br />
<br />
今年はその反省に立ち返り、企業色を薄めるために「スポンサーセッション」を1つに絞り、かつ、その1つのスポンサーセッションを担って頂くのは、Nodeに深くコミットしている会社にお願いしたい、という結論に至りました。<br />
<br />
そこでこの「セッション枠」付きのスポンサーシップについても公募を開始いたします(Platinumプランとします)。1枠限定ですので、セッションでお話頂ける内容やスポンサーシップの特典についても慎重に交渉した上で決定したいと考えております。ご応募いただいたからといって必ずしもご期待に添えるとは限りませんのでその点はご承知おきください。<br />
<br />
よろしくお願いいたします。mesohttp://www.blogger.com/profile/09102232744610763531noreply@blogger.com2tag:blogger.com,1999:blog-5575797318863402249.post-35756474571114391682012-07-11T18:36:00.001+09:002012-09-08T03:40:49.307+09:00「東京Node学園祭 2012」スポンサー公募についてNode.jsのカンファレンス「東京Node学園祭 2012」では、以下の内容でスポンサーを募集しております。<br />
下記枠組みに捕らわれないものも受け付けておりますので、まずはお気軽にお問い合わせください。<br />
(7/19追記)Platinumスポンサーについての記述を追加いたしました。<br />
(9/8追記)スポンサーの公募は全て締め切らせていただきました。多数のご応募ありがとうございました。<br />
<br />
<h3>スポンサーシップの概要<br />
</h3><ul><li>Sliverスポンサー(10万円)</li>
<ul><li>Webサイトにバナー(小)を掲載<br />
</li>
<li>チラシやノベルティの配置(持ち込み)<br />
</li>
<li>プレスリリースにスポンサー名を記載<br />
</li>
<li>パンフレットへの広告枠(小)<br />
</li>
<li>招待枠: 2名<br />
</li>
</ul><li>Goldスポンサー(30万円)<br />
</li>
<ul><li>Webサイトにバナー(大)を掲載<br />
</li>
<li>チラシやノベルティの配置(持ち込み)<br />
</li>
<li>プレスリリースにスポンサー名を記載<br />
</li>
<li>パンフレットへの広告枠(大)<br />
</li>
<li>招待枠: 5名<br />
</li>
</ul><li>Platinumスポンサー(お問い合わせください)<br />
</li>
<ul><li>セッション枠<br />
</li>
<li>Goldスポンサーの上位互換<br />
</li>
<li>詳細は<a href="http://blog.nodejs.jp/2012/07/node-2012_19.html">コチラ</a><br />
</li>
</ul><li>Mediaスポンサー(お問い合わせください)</li>
<ul><li>Webサイトにバナー(小)を掲載</li>
<li>招待枠: 1名</li>
</ul></ul><h3>お問い合わせ先 </h3><ul><li>nodefest@nodejs.jp</li>
<li>担当: 清水</li>
</ul>mesohttp://www.blogger.com/profile/09102232744610763531noreply@blogger.com0tag:blogger.com,1999:blog-5575797318863402249.post-26859702889567584892012-07-10T17:06:00.001+09:002012-07-15T02:05:25.065+09:00Node.js のカンファレンス「東京Node学園祭 2012」を開催しますNode.js日本ユーザグループは、Node.js開発リーダーである Isaac Z. Schlueter氏を始めとする海外ゲストを招聘し、第2回目のカンファレンスとなる「東京Node学園祭 2012」を、下記のとおり開催いたします。<br />
<br />
最新のNode.jsの動向、企業内でのリアルな導入例、初心者向けのセミナーからLT大会まで盛り沢山の内容を予定しております。エンジニア同士や講演者と交流できる時間も多く設けるつもりですので、是非この機会に交流を深めて頂ければと思います。<br />
<br />
日時: 2012年11月18日(日) 10:00-17:30(予定) / 後夜祭 18:00-<br />
会場: 法政大学 市ヶ谷キャンパス 外濠校舎<br />
セッション: 2トラック並行で10セッション前後を予定<br />
基調講演: Isaac Z. Schlueter氏(<a href="http://twitter.com/izs">@izs</a>)<br />
海外ゲスト: Charlie Robbins氏(<a href="http://twitter.com/indexzero">@indexzero</a>)、Mikeal Rogers氏(<a href="http://twitter.com/mikeal">@mikeal</a>)、James Halliday氏(<a href="http://twitter.com/substack">@substack</a>)<br />
参加費: 無料 / 後夜祭は実費<br />
募集人数: 400名<br />
主催: <a href="http://nodejs.jp/">Node.js日本ユーザグループ</a><br />
後援: <a href="http://cis.k.hosei.ac.jp/">法政大学情報科学部</a><br />
スポンサー: 別途公募いたします<br />
<br />
参加者募集は、夏の終わりから秋口あたりに開始する予定です。今のうちから予定を空けておいてください!<br />
セッション登壇者やスポンサーにつきましては、間もなく公募を開始いたしますので奮ってご応募ください。mesohttp://www.blogger.com/profile/09102232744610763531noreply@blogger.com3tag:blogger.com,1999:blog-5575797318863402249.post-68283238947804180272012-02-26T19:54:00.000+09:002012-02-26T19:55:05.639+09:00細かすぎて伝わらない Node v0.7.5 の変更点<p>こんにちは、<a href="https://twitter.com/summerwind">summerwind</a> です。</p><p>今日は「<a href="http://connpass.com/event/280/">東京Node学園 4時限目</a>」ということで、Node.js ハッカソンにきています。<br />
今回の会場は <a href="https://twitter.com/nifty_engineer">@nifty エンジニアサポート</a>さんにご提供いただきました。お菓子の差し入れなどもいただきありがとうございます!<br />
</p><p>さて、会場で <a href="https://twitter.com/#!/jxck_">Jxck</a> 先生に「ぜひブログにもなんか書いて」と言ってもらったので、今回は先日リリースされた <a href="http://blog.nodejs.org/2012/02/23/version-0-7-5-unstable/">Node v0.7.5</a> の変更点について、いくつか簡単にピックアップして紹介したいと思います。全ての変更点については日本語訳した <a href="http://nodejs.jp/changelog.html#v0.7.5">ChangeLog</a> をご確認ください。<br />
</p><h3>crypto モジュールに getDiffieHellman() 関数が追加されました</h3><p>まずは、crypto モジュールに追加された <a href="http://nodejs.jp/nodejs.org_ja/api/crypto.html#crypto.getDiffieHellman">getDiffieHallman()</a> 関数を紹介したいと思います。<br />
従来から <a href="http://nodejs.jp/nodejs.org_ja/api/crypto.html#crypto.createDiffieHellman">crypto.createDiffieHellman()</a> 関数を利用することで Diffie-Hellman 方式の共有鍵を生成することはできましたが、 今回追加された getDiffieHellman() を利用すると、より容易に共通鍵を用意することができます。<br />
</p><p>マニュアルには下記のような使い方が記載されています。</p><pre><code>var crypto = require('crypto');
var alice = crypto.getDiffieHellman('modp5');
var bob = crypto.getDiffieHellman('modp5');
alice.generateKeys();
bob.generateKeys();
var alice_secret = alice.computeSecret(bob.getPublicKey(), 'binary', 'hex');
var bob_secret = bob.computeSecret(alice.getPublicKey(), 'binary', 'hex');
/* alice_secret and bob_secret should be the same */
console.log(alice_secret == bob_secret);
</code></pre><br />
<p>実際のコードの変更内容は<a href="https://github.com/joyent/node/commit/c6a04ce78f9fcc07bc1ae108c402fba508344202">コミットログ</a>で確認することができます。コードが気になる方はぜひこちらもご確認ください。</p><h3>QueryString.parse() を高速化しました</h3>見出しの通り、querystring モジュールのパース処理が高速化しました。<br />
具体的には split() や join() を利用してパラメータのキーと値を処理していた部分を、indexOf() と substring() の処理に置き換えたことで、高速化したようです。短くて分かりやすい<a href="https://github.com/joyent/node/commit/5e3ca981556c305830553d006b76d5dcaaf49276">コミットログ</a>もあわせてご確認ください。<br />
<h3>#2762 net モジュールの close 関数にコールバックを追加しました</h3>net モジュールの close() 関数がコールバックを引数にとることができるようになりました。<br />
これにより、HTTP サーバーや TCP サーバーが終了する際に指定の処理の実行が可能になります。<br />
追加の発端になった <a href="https://github.com/joyent/node/issues/2762">Issue #2762</a> を見ると、開いているポートを探すためのサンプルコードがのっていたりしていて興味深かったです。ちなみに<a href="https://github.com/joyent/node/commit/d530ee62cd1eb1fd038f4e86314c741422b4de25">コミットログ</a>はこちらになります。<br />
<h3>'make test' 時に src/ と lib/ に対して JSLint が実行されるようになりました</h3>make test 時に JSLint が自動実行されるようになりました。<br />
<a href="https://github.com/joyent/node/commit/96338432e2b76ee294b7e9e8ee56164288a56a08">コミットログ</a>を見ると、Ben Noordhuis が「1日20回ぐらいビルドしてるんだけど、こいつのせいで30秒ぐらいロスするから、戻せ」って書いていたりしていて、ちょっと笑ってしまいました。<br />
<br />
こんな感じで、Node v0.7.5 では色々な細かい変更がなされました。<br />
コミットログまで追って見ると、実際のコードの変更や、開発者同士のやりとりなどが見れてとても勉強になるのでオススメです。<br />
そろそろ次の安定版である v0.8.0 のリリースも近づいてきているようなので、今後の更新も楽しみにしたいと思います。<br />
<br />
それではまた。summerwindhttp://www.blogger.com/profile/16882553976582690173noreply@blogger.com0tag:blogger.com,1999:blog-5575797318863402249.post-89276195235703266602011-11-12T17:26:00.018+09:002013-05-19T20:51:42.734+09:00Cluster<div>Node.js v0.6 の新機能として <a href="http://nodejs.jp/nodejs.org_ja/api/cluster.html">cluster モジュール</a> が導入されました.<code>cluster</code> モジュールは,HTTP を含めた TCP 接続を複数の子プロセス (ワーカプロセス) で処理することにより,特にマルチコア環境でのスループット (リクエスト/秒) を向上するための機能です.</div><div> </div><div>しかし,ドキュメントにはその使い方が書かれているだけで,どのように実現されているかは書かれていないので,ここで簡単に紹介しておきます.</div><div> </div><div>Node.js のクラスタ機能は v0.5.10 で突然コマンドラインオプションとして導入されましたが,直後の「東京 Node 学園祭 2011」が行われた頃にはコマンドラインオプションは廃止されて <code>cluster</code> モジュールによって API が提供されるようになり,その翌週の v0.6.0 リリース数時間前にはその API が変更されるというドタバタぶりでしたw</div><div> </div><div>早速複数のプルリクエストが届いているなど,現時点では API が安定しているとは言い難い状況ですが,ここで紹介する基本的な実現方式については大きく変わることはないものと考えられます.</div><div> </div><h4>ソケットの基本</h4><div>まずは,基本となるソケットについて復習しておきましょう.</div><div> </div><div>通常,サーバサイドのアプリケーションは次の手順でソケットを利用します (引数の詳細やエラーチェック等は省略,ブロッキング・ノンブロッキング等は本エントリでは省略します).</div><div> </div><div><pre>listening = socket(...); // ソケットをオープン
bind(listening, ...); // ローカルアドレス&ポートを割り当て
listen(listening, ...); // リスニングソケットに変換
for (;;) {
connected = accept(listening, ...); // 接続済みソケットを返す
...
close(connected);
}
</pre></div><div> <br />
<div class="separator" style="clear: both; text-align: left;"><a href="http://2.bp.blogspot.com/-bAYTMmJDZCU/Tr_HmjpgGVI/AAAAAAAAAB0/iJhY3YmeCPA/s1600/basic.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://2.bp.blogspot.com/-bAYTMmJDZCU/Tr_HmjpgGVI/AAAAAAAAAB0/iJhY3YmeCPA/s1600/basic.png" /></a></div><br />
</div><div>ここでは 2 種類のソケットが登場します.ひとつはクライアントからの接続を待ち受けるためのソケットで,ここでは「リスニングソケット」と呼びます.もうひとつは実際にクライアントとの接続を表すソケットで,ここでは「接続済みソケット」と呼びます.</div><div> </div><div><code>socket()</code>, <code>bind()</code>, <code>listen()</code> でリスニングソケットを準備して,<code>accept()</code> でリスニングソケットに届いた接続済みソケットを取得します.</div><div> </div><div>接続済みソケットからクライアントの要求を受信したり,結果を送信するなどしてクローズすることで,一つのクライアントに対する処理が完了します.これを繰り返すことで,単純なサーバを実現することができます.</div><div> </div><div>ただし,これではクライアントを一つずつしか処理することができません.同時に複数のクライアントを処理するには,一工夫が必要です.Node.js の場合は,<code>accept()</code> を <code>select()</code> 等のシステムコールによって「多重化」するイベントループを使うためにこの問題はありませんが,しばらくの間それは忘れましょう.</div><div> </div><h4>フォーク型</h4><div>複数のクライアントからの接続を処理するために,古くからよく使われた素朴な方法が,クライアントからの接続ごとに <code>fork()</code> して新しいプロセスを作成するというものです.</div><div> </div><div> </div><div><pre>listening = socket(...); // ソケットをオープン
bind(listening, ...); // ローカルアドレス&ポートを割り当て
listen(listening, ...); // リスニングソケットに変換
for (;;) {
connected = accept(listening, ...); // 接続済みソケットを返す
if (fork() == 0) {
// 子プロセス (親プロセスとは並行に実行される)
...
exit(0);
}
// 親プロセス
close(connected);
}
</pre></div><div> </div><div><div class="separator" style="clear: both; text-align: left;"><a href="http://1.bp.blogspot.com/-pYSa04lPgiI/Tr_H2x3At-I/AAAAAAAAAB8/6B2b8neBQn0/s1600/fork.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://1.bp.blogspot.com/-pYSa04lPgiI/Tr_H2x3At-I/AAAAAAAAAB8/6B2b8neBQn0/s1600/fork.png" /></a></div><br />
子プロセスはソケット (ファイル記述子) を親プロセスから引き継ぎますから,接続済みソケットを使ってクライアントと送受信することができます.接続済みソケットを標準入出力に設定して <code>exec()</code> (現在のプロセス上で別のプログラムを実行) すれば,CGI の動作になります.</div><div> </div><div>フォーク型は単純であるため,スレッドが普及する以前 (20 年前とか) に Unix 上で作られた多くのサーバアプリケーションで利用されていました.しかし,クライアントからの接続のたびにプロセスを起動するオーバーヘッドが大きいため,多くのクライアントを扱うことが難しいという問題がありました.</div><div> </div><div>より多くのクライアントをサポートするには,あらかじめ子プロセスを起動 (プリフォーク) しておく必要があります (本エントリではスレッドは扱いません).以下ではその方法を見ていきましょう.</div><div> </div><div>なお,以下では親プロセスをマスタ,子プロセスをワーカと呼びます.</div><div> </div><h4>ゲートウェイ型</h4><div>一つ目の方法は,クライアントとワーカの間で送受信されるデータを,マスタが間に入って転送するゲートウェイ方式です.マスタはクライアントとってはサーバ,ワーカに対してはクライアントのように振る舞います.各ワーカはそれぞれ独自のポート番号でマスタからの接続を待ち受けます.</div><div> </div><div><pre>// マスタ
listening = socket(...); // ソケットをオープン
bind(listening, ...); // ローカルアドレス&ポートを割り当て
listen(listening, ...); // リスニングソケットに変換
for (;;) {
connected = accept(listening, ...); // 接続済みソケットを返す
worker = socket(...); // ワーカとの通信用のソケットをオープン
connect(worker, ...); // ワーカに接続
... // クライアントとワーカの間でデータを転送
close(worker);
close(connected);
}
</pre></div><div> <br />
<div class="separator" style="clear: both; text-align: left;"></div><div class="separator" style="clear: both; text-align: left;"><a href="http://3.bp.blogspot.com/-4AlOGgcIdZA/Tr_IA8w8xYI/AAAAAAAAACI/FWoBQVPX0FY/s1600/gateway.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://3.bp.blogspot.com/-4AlOGgcIdZA/Tr_IA8w8xYI/AAAAAAAAACI/FWoBQVPX0FY/s1600/gateway.png" /></a></div><br />
</div><div>おっと,これでは最初の例と同じように,同時に一つのクライアントしか接続できませんね.実際には,<code>accept()</code> もワーカとの接続や送受信も,全て多重化されてイベントループの中で行われるということにしてください.</div><div> </div><div>ともあれ (JW),この方法の場合,<code>connect()</code> で接続するワーカをラウンドロビンなどの方法で切り替えることにより,複数のワーカにクライアントからの処理を分散することができます.新しいクライアントをどのワーカで処理させるか (ロードバランシング) はマスタが判断することになります.</div><div> </div><div>しかし,全てのクライアントからの送受信データがマスタを経由するため,マスタのスループットが全てのワーカを含めた全体の上限になってしまいます.実際には,この方法を親プロセスと子プロセスの間で利用することはあまりなく,複数のサーバマシン間で処理を分散するためのリバースプロキシ等で使われることが多いでしょう.</div><div> </div><div>Node.js 関連では Nodejitsu の <a href="https://github.com/nodejitsu/node-http-proxy">node-http-proxy</a> でこの方法が使われています.</div><div> </div><h4>接続済みソケット共有型</h4><div>ソケット (ファイル記述子) は,Unix ドメインソケットやパイプを通じてプロセス間で受け渡すことができます.これを利用して接続済みソケットをマスタからワーカに受け渡すことで,接続した後のクライアントとの送受信はワーカに任せることが実現できます.</div><div> </div><div><pre>// マスタ
listening = socket(...); // ソケットをオープン
bind(listening, ...); // ローカルアドレス&ポートを割り当て
listen(listening, ...); // リスニングソケットに変換
for (;;) {
connected = accept(listening, ...); // 接続済みソケットを返す
... // connected をワーカに転送する
close(connected);
}
</pre></div><div> <br />
<div class="separator" style="clear: both; text-align: left;"><a href="http://4.bp.blogspot.com/-72gSzF2Ub3k/Tr_IAVVLqQI/AAAAAAAAACE/OijB4PkQF_k/s1600/connected.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://4.bp.blogspot.com/-72gSzF2Ub3k/Tr_IAVVLqQI/AAAAAAAAACE/OijB4PkQF_k/s1600/connected.png" /></a></div><br />
</div><div>先のゲートウェイ方式方式とは異なり,クライアントからの接続時に接続済みソケットがワーカに渡された後では,もうマスタはクライアントとの通信に関与しません.ですから,ゲートウェイ方式に比べると接続済みソケット共有型の方がずっと効率的といえるでしょう.複数のワーカがある場合に,どのワーカに接続済みソケットを渡すか (ロードバランシング) はマスタが判断することになります.</div><div> </div><div><strong>2013/05/19 追記</strong><br />
Node.js の cluster モジュールは、v0.11.2 から Unix 系 (非 Windows) プラットフォームではこの方式がデフォルトになりました。マスタプロセスはラウンドロビン方式でワーカプロセスに接続済みソケットを渡します。明示的に「接続済みソケット共有型」を利用するには、<code>cluster.schedulingPolicy</code> に <code>cluster.SCHED_RR</code> を指定します (または、<code>NODE_CLUSTER_SCHED_POLICY</code> 環境変数に <code>rr</code> を指定します)。<br />
</div><div> </div><h4>リスニングソケット共有型</h4><div>プロセス間で受け渡すことができるソケットは接続済みソケットには限りません.リスニングソケットもまた受け渡すことができます.</div><div> </div><div><pre>// マスタ
listening = socket(...); // ソケットをオープン
bind(listening, ...); // ローカルアドレス&ポートを割り当て
... // ソケットをワーカに渡す
</pre></div><div> </div><div>これまでの例では <code>listen()</code>~<code>accept()</code> はマスタで実行していましたが,この方式ではワーカがそれを実行します.</div><div> </div><div><pre>// ワーカ
... // マスタからソケットを受け取る
listen(listening, ...); // ソケットをリスニングソケットに変換
for (;;) {
connected = accept(listening, ...); // 接続済みソケットを返す
...
close(connected);
}
</pre></div><div> <br />
<div class="separator" style="clear: both; text-align: left;"><a href="http://2.bp.blogspot.com/-P8ooRGSMrJo/Tr_IBAwuK2I/AAAAAAAAACQ/-7If3wbbXCw/s1600/listening.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://2.bp.blogspot.com/-P8ooRGSMrJo/Tr_IBAwuK2I/AAAAAAAAACQ/-7If3wbbXCw/s1600/listening.png" /></a></div><br />
</div><div>この場合,同じリスニングソケットに対して複数のワーカが同時に接続を待ち受けることになります.実際にクライアントからの接続が着信した場合に,どのワーカがそれを受け取るかは OS カーネルによって決められます.マスタは関与しません.そのため,この方法は「カーネルによるロードバランシング」と呼ばれることがあります.</div><div> </div><div>この方法では,マスタは初期化時にリスニングソケットを準備するだけです.クライアントとの間のやり取りは,接続から送受信まで完全にワーカとの間で直接行われます.マスタは一切関与しません.ですから,これまでの方法の中でもっとも効率がいいといえるでしょう.</div><div> </div><div>Node.js v0.6 で導入された cluster モジュールは,この方法を採用しています.<br />
</div><div> </div><div><strong>2013/05/19 追記</strong><br />
この方法では一部のワーカプロセスに接続が偏りやすいため、v0.11.2 から Unix 系 (非 Windows) プラットフォームでは前述の「接続済みソケット共有型」がデフォルトになりました。v0.11.2 以降で「リスニングソケット共有型」を利用するには、<code>cluster.schedulingPolicy</code> に <code>cluster.SCHED_NONE</code> を指定します (または、<code>NODE_CLUSTER_SCHED_POLICY</code> 環境変数に <code>none</code> を指定します)。<br />
</div><div> </div><h4>Node.js cluster モジュールの実際</h4><div>それでは,実際に Node.js の cluster モジュールがどのように動作するか,簡単に見てみましょう.以下は <code>cluster</code> モジュールを使用しない単純な HTTP サーバの例です.</div><div> </div><div><pre>var http = require('http');
http.createServer(function (req, res) {
res.writeHead(200, {'Content-Type': 'text/plain'});
res.end('Hello World\n');
}).listen(1337, 'localhost');
</pre></div><div> </div><div>これを <code>cluster</code> モジュールを使わず直接実行すると,<code>http.Server</code> (実際には <code>net.Server</code>) の <code>listen()</code> メソッドは,内部的にソケットの <a href="https://github.com/joyent/node/blob/v0.6.1/lib/net.js#L658-L668"><code>socket()</code> と <code>bind()</code></a>, <a href="https://github.com/joyent/node/blob/v0.6.1/lib/net.js#L698"><code>listen()</code> と <code>accept()</code></a> を呼び出します.</div><div> </div><div>一方,次のように <code>cluster</code> モジュールを使用すると,</div><div> </div><div><pre>var cluster = require('cluster');
var http = require('http');
var numCPUs = require('os').cpus().length;
if (cluster.isMaster) {
// マスタ
for (var i = 0; i < numCPUs; i++) {
cluster.fork(); // ワーカを起動
}
cluster.on('death', function(worker) {
console.log('worker ' + worker.pid + ' died');
});
} else {
// ワーカ
http.createServer(function (req, res) {
res.writeHead(200, {'Content-Type': 'text/plain'});
res.end('Hello World\n');
}).listen(1337, 'localhost');
}
</pre></div><div> </div><div>ワーカとして実行される部分のコードは,先ほどの <code>cluster</code> を使わない例と全く同じですが,<code>http.Server</code> の <code>listen()</code> メソッドの<a href="https://github.com/joyent/node/blob/v0.6.1/lib/net.js#L716">動作が変わります</a>.ワーカとして実行されているプロセスでは,<code>http.Server</code> の <code>listen()</code> メソッドはマスタに<a href="https://github.com/joyent/node/blob/v0.6.1/lib/net.js#L717-L720">「<code>"localhost"</code> に <code>1337</code> 番でバインドされたソケットをよこせ」</a>という要求 (プロセス間通信) を行います.そこでマスタは <code>socket()</code>, <code>bind()</code> を呼び出して<a href="https://github.com/joyent/node/blob/v0.6.1/lib/cluster.js#L116-120">ソケットを作成し,ワーカに転送</a>します.ワーカはそのソケットに対して <code>listen()</code>, <code>accept()</code> を実行します.</div><div> </div><div>別のワーカが同様に「<code>"localhost"</code> に <code>1337</code> 番でバインドされたソケットをよこせ」とマスタに要求すると,マスタは先ほど作成したソケットを転送します.これにより,複数のワーカ間でリスニングソケットが共有されます.</div><div> </div><div>このように,Node.js の cluster モジュールを使うと,従来とほぼ同じコードで複数プロセスによる負荷分散を効率よく実現することができます.皆さんも是非 <code>cluster</code> モジュールを使ってみてください.</div><div> </div><div> </div><div>なお,<a href="http://twitter.com/hakobera">@hoakobera</a> さんによる「<a href="http://d.hatena.ne.jp/scalar/20111111/1320994609">Node.js の Cluster のベンチマークをとってみた</a>」も併せてどうぞ.</div>koichikhttp://www.blogger.com/profile/13766174516802726641noreply@blogger.com1tag:blogger.com,1999:blog-5575797318863402249.post-62946482753257706702011-11-05T19:33:00.003+09:002011-11-13T18:45:36.573+09:00Node v0.6.0<div>このエントリは Node.js 公式ブログの「<a href="http://blog.nodejs.org/2011/11/05/node-v0-6-0/">Node v0.6.0</a>」を翻訳したものです.</div><hr /><div> <br />
</div><div>私たちは三番目となる安定版の Node v0.6 をアナウンスすることをうれしく思います.</div><div> <br />
</div><div>v0.6 系の全てのリリースで JavaScript,C++,そしてバイナリインタフェースは凍結されます.</div><div> <br />
</div><div>v0.4 と v0.6 の主要な違いは</div><div> <br />
</div><div><ul><li>ソケットに I/O 完了ポートを使用する Windows のネイティブサポート.</li>
<li>統合されたマルチプロセッサ上のロードバランサ.<a href="http://nodejs.jp/nodejs.org_ja/api/cluster.html">docs</a></li>
<li>改善された Node インスタンス間の IPC.<a href="http://nodejs.jp/nodejs.org_ja/api/child_processes.html#child_process.fork">docs</a></li>
<li>改善されたコマンドラインデバッガ.<a href="http://nodejs.jp/nodejs.org_ja/api/debugger.html">docs</a></li>
<li>zlib への組込バインディング.<a href="http://nodejs.jp/nodejs.org_ja/api/zlib.html">docs</a></li>
</ul></div><div> <br />
</div><div>Windows をサポートするために,私たちはコアアーキテクチャの多くを再構築しました.それが Unix システム上でのパフォーマンスを低下させるという恐れがありましたが,それは杞憂でした.Linux システムでのデモによるベンチマークはこの通りです:</div><div> <br />
</div><div><table><tbody>
<tr> <th></th> <th>v0.4.12 (linux)</th><th>v0.6.0 (linux)</th></tr>
<tr> <td>http_simple.js /bytes/1024 </td> <td>5461 r/s</td> <td>6263 r/s</td> </tr>
<tr> <td>io.js read </td> <td>19.75 mB/s</td> <td>26.63 mB/s</td> </tr>
<tr> <td>io.js write </td> <td>21.60 mB/s</td> <td>17.40 mB/s</td> </tr>
<tr> <td>startup.js </td> <td>74.7 ms</td> <td>49.6 ms</td> </tr>
</tbody></table></div><div> <br />
</div><div>http と io は数値が大きい方が,startup は小さい方が優れています.http ベンチマークは 10Gbit ネットワーク上のサーバに 3 台のマシンで 600 クライアントの負荷を生成しました.</div><div> <br />
</div><div>以前のバージョンの Node v0.4 は,Windows では Cygin 上でしか動きませんでした.そのため,ネイティブ API を目標とすることにより,劇的な改善を果たしました.同じマシンでのベンチマーク:</div><div> <br />
</div><div><table><tbody>
<tr><th></th><th>v0.4.12 (windows)</th><th>v0.6.0 (windows)</th></tr>
<tr> <td>http_simple.js /bytes/1024 </td> <td>3858 r/s</td> <td>5823 r/s</td> </tr>
<tr> <td>io.js read </td> <td>12.41 mB/s</td> <td>26.51 mB/s</td> </tr>
<tr> <td>io.js write </td> <td>12.61 mB/s</td> <td>33.58 mB/s</td> </tr>
<tr> <td>startup.js </td> <td>152.81 ms</td> <td>52.04 ms</td> </tr>
</tbody></table></div><div> <br />
</div><div>私たちはこれが Windows ポートのよい中間段階だと考えています.すべきことはまだあります.たとえば,MS VisualStudio でアドオンモジュールをビルドする方法を私たちはまだ提供していません.この後のリリースに作業は続きます.</div><div> <br />
</div><div>これからのリリースサイクルは劇的に短縮されます.1 月には新しい安定版が出ると期待してください.私たちは Chrome および V8 の 6 週間サイクルと同期してリリースしたいと望んでいます.</div><div> <br />
</div><div>コード,テスト,ドキュメント,そしてバグを報告してくれた全ての貢献者に感謝します.</div><div> <br />
</div>koichikhttp://www.blogger.com/profile/13766174516802726641noreply@blogger.com0tag:blogger.com,1999:blog-5575797318863402249.post-21685561196668334122011-10-28T23:28:00.004+09:002011-10-29T08:38:54.361+09:00東京Node学園祭 2011 明日開催!<h1>
東京Node学園祭 2011 よりお知らせ
</h1>
<p>
東京Node学園祭 2011 参加者の皆様 Node.js 日本ユーザグループ 東京Node学園祭 2011 実行委員会です。
いよいよ明日、10月29日が開催日となります!
</p>
</p>
当日学園祭を楽しめていただけるよう、
会場の注意点などを掲載いたします。
ご一読よろしくお願いします :)
</p>
<p>
今回は以下の内容についてお知らせいたします。
</p>
<ul>
<li>会場に関するお知らせ
<ul>
<li>
場所
</li>
<li>
開場時間
</li>
<li>
受付
</li>
<li>
ノベルティグッズのお渡し
</li>
<li>
入館用パスのお渡し
</li>
<li>
ネットワークのご利用について
</li>
<li>
電源のご利用について
</li>
<li>
会場の撮影について
</li>
<li>
お昼について
</li>
<li>
退場時の注意
</li>
</ul>
</li>
</ul>
<ul>
<li>
後夜祭について
<ul>
<li>
場所
</li>
<li>
移動方法
</li>
<li>
開場時間
</li>
<li>
受付
</li>
</ul>
</li>
</ul>
<ul>
<li>
Twitterのご利用について
<ul>
<li>
公式アカウント
</li>
<li>
当日のハッシュタグ
</li>
</ul>
</li>
</ul>
<hr/>
<p>
<span style="font-size: 180%;">
会場に関するお知らせ
</span>
</p>
<ul>
<li>
場所
<p>
場所はYahoo様となります。
</p>
</li>
<li>
住所
<p>
〒107-6211 東京都港区赤坂9-7-1 ミッドタウン・タワー Yahoo! JAPAN 11F
</p>
</li>
<li>
最寄駅
<ul>
<li>
都営大江戸線 六本木駅
</li>
<li>
東京メトロ日比谷線 六本木駅
</li>
<li>
東京メトロ千代田線 乃木坂駅
</li>
<li>
東京メトロ南北線 六本木一丁目駅
</li>
</ul>
</li>
<li>
詳しくは、以下サイトのリンクをご確認ください。(マップが確認できます)
<p>
<a href="http://nodefest.jp/2011/access.html">http://nodefest.jp/2011/access.html</a>
</p>
</li>
<li>
開場時間
<p>
午前 10:00となります
</p>
</li>
<li>
受付
<p>
2F受付にて、チケットのご確認をさせていただきます。
Doorkeeperでご購入いただいたチケットを受付スタッフにご提示ください。
チケットはiPadなどのデジタルデバイスに表示するか、紙への印刷をしてください。
受付後、スタッフが皆様を会場に誘導いたします。
</p>
</li>
<li>
ノベルティグッズのお渡し
<p>
11Fにてノベルティグッズをお渡しいたします。
後夜祭のご参加に必要なカンファレンスバッグを含みます。
</p>
</li>
<li>
入館用パス
<p>
スタッフが受付後、チケットを確認できましたら、入館用パスを発行いたします。
入館用パスを胸元に貼っていただく必要がございます。
</p>
</li>
<li>
ネットワークのご利用について
<p>
当日、参加者の皆様がご利用いただけるAPを用意し、
SSID及びPASSについてご連絡いたします。
ただし、利用人数に限りがございます。
ご自分でemobile/WiMAXなどの無線インターネット回線端末を
お持ちいただけると幸いです。
</p>
</li>
<li>
電源のご利用について
<p>
会場の電源容量は予め決まっており、想定されている以上の機器を
利用することはできません。独自にタップを使って電源の口を増設される、
電源を大量消費する行為については自粛をお願いいたします。
また、できるだけ譲り合って電源をご利用いただけますと、
学園祭を最後まで皆様揃ってお楽しみいただけることと思います。
よろしくお願いいたします。
</p>
</li>
<li>
会場の撮影について
<p>
受付のある2F、及び 11F の廊下は撮影が禁止となっております。
当日カンファレンスが行われる11Fセミナールームでは撮影が行えます。
撮影に関し不明な点がございましたらスタッフまでご質問ください。
</p>
</li>
<li>
お昼について
<p>
当日、参加者の皆様にはお弁当をお配りいたします。
途中の入退場は原則できませんので、お昼はお弁当でお済ませ下さい。
</p>
</li>
<li>
退場について
<p>
退場の際、入場時にお渡しした入館用パスをお返しいただく必要がございます。
受付スタッフまでお返しください。
</p>
</li>
</ul>
<hr/>
<p>
<span style="font-size: 180%; font-weight: large;">
後夜祭について
</span>
</p>
<ul>
<li>
後夜祭とは
<p>
東京Node学園祭終了後、後夜祭(アフターパーティー)を開催いたします。
開催費用は参加チケット代金に含まれておりますので、安心してご参加いただけます。
気になるnoderの方とお話するチャンスです。
</p>
<ul>
<li>
場所
<p>
居酒屋 小松となります。詳しくはリンクをご確認ください。
</p>
<p>
<a href="http://r.tabelog.com/tokyo/A1307/A130701/13060057/">http://r.tabelog.com/tokyo/A1307/A130701/13060057/</a>
</p>
</li>
<li>
移動方法
<p>
担当スタッフが皆様を誘導し、会場にご案内いたします。
</p>
<li>
開場時間
<p>
19:00 - 21:00 の 2時間となります。
</p>
</li>
<li>
受付方法
<p>
会場に入場する際、学園祭受付時にお渡ししたノベルティグッズの
カンファレンスバッグの有無を確認いたします。
受付担当スタッフにお見せください。
</p>
</li>
</ul>
</li>
</ul>
<hr/>
<p>
<span style="font-size: 180%; font-weight: large;">
Twitterのご利用について
</span>
</p>
<ul>
<li>
公式アカウント
<p>
<a href="https://twitter.com/#!/nodefest">https://twitter.com/#!/nodefest</a> です。
当日のご案内、会場での出来事などツイートいたします。
フォローしていただけると東京Node学園祭をよりお楽しみいただけると思います。
</p>
</li>
<li>
当日ハッシュタグ
<p>
#nodefest が当日利用するハッシュタグとなります。
セッション中のツイートなど、ハッシュタグをつけていただきますと、
スタッフや学園祭に参加しているnoderの皆様が捕捉し、思わぬリプライを
もらえるかもしれません :)
</p>
</li>
</ul>
<p>
以上です。当日皆様と会場でお会いできることを楽しみにしております!
</p>mksahttp://www.blogger.com/profile/02252636796648143837noreply@blogger.com1tag:blogger.com,1999:blog-5575797318863402249.post-44676855622541811692011-10-24T16:14:00.016+09:002011-10-24T18:47:50.223+09:00東京Node学園祭 2011 開催まであと5日!東京Node学園祭 2011 参加者の皆様 Node.js 日本ユーザグループ 東京Node学園祭 2011 実行委員会です。
開催まであと5日となりました。今回は以下の内容についてお知らせいたします。
<ul>
<li>
チケット販売締め切りについて(ブログのみ掲載)
</li>
<li>
会場について
</li>
<li>
セッションのスケジュールについて
</li>
<li>
アフターパーティのご案内
</li>
</ul>
<hr style="border-style:solid; border-color:#dddddd; border-width:1px; width:95%"/>
<p>
<b style="font-size:180%;">チケット販売を締めきりました
</b>
</p>
<p>
<b style="font-size:120%;">チケットについては売り切れました。
</b>
</p>
<p>
東京Node学園祭 参加者向けのチケットは完売いたしました。 ご購入をご希望されていたた方には大変ご迷惑をおかけいたしました。 ニコニコ生放送にて当日のカンファレンス内容を生で配信する予定です。 詳細は追ってご連絡いたします。
</p>
<hr style="border-style:solid; border-color:#dddddd; border-width:1px; width:95%"/>
<p>
<b style="font-size:180%;">会場について
</b>
</p>
<p>
開催会場はYahoo様となります。
</p>
<ul>
<li>
場所
<ul>
<li>
リンク先をご参照ください。 <a href="http://nodefest.jp/2011/access.html">【東京Node学園祭 開催会場アクセス】</a>
</li>
</ul>
</li>
<li>
受付方法
<ul>
<li>
受付は入り口よりスタッフがご案内致します。 DoorKeeperのチケットをスタッフに提示してください。 (iPad,iPhone,ノートPCなどの端末に表示、及び印刷などの方法でスタッフが チケットを確認できる形でご提示ください)
</li>
</ul>
</li>
<li>
ご注意
<ul>
<li>
入退場について
<p>
当日会場から退場した場合、再入場は行えません。 お昼についてはお弁当をご用意しております。 また自動販売機が設置されており飲み物の購入が可能です。
</p>
</li>
<li>
参加者の皆様による会場撮影について
<p>
当日会場の撮影については、撮影可能な場所が限られます。 会場の内部での撮影は問題ありません。会場外部(フロアから外)は 撮影が禁止となっております。ご了承ください。
</p>
</li>
<li>
会場でのセッションをネットで配信します
<p>
当日、ニコニコ生放送にてセッションの内容を配信いたします。
</p>
</ul>
</li>
<li>
スタッフ及びメディアによる会場内撮影について
<p>
後日のレポート用記事のため、スタッフが会場を撮影します。 またメディアの方による会場撮影も行われる予定です。 ご了承ください。
</p>
</li>
</ul>
<hr style="border-style:solid; border-color:#dddddd; border-width:1px; width:95%"/>
<p>
<b style="font-size:180%;">セッションのスケジュールについて
</b>
</p>
<ul>
<li>
カンファレンスのセッションは以下の予定で行われます。
</li>
<li>
スケジュールについて変更が行われる恐れがあります。ご容赦ください。
</li>
<li>
最新のセッションスケジュールについては<a href="http://nodefest.jp/2011/session.html">【こちら】</a>をご確認ください。
</li>
</ul>
<table>
<thead>
<tr>
<th>
時間帯
</th>
<th>
セッションタイトル
</th>
<th>
スピーカー
</th>
</tr>
</thead>
<tbody>
<tr>
<td>
10:00-11:00
</td>
<td>
開場
</td>
</tr>
<tr>
<td>
11:00-11:10
</td>
<td>
イントロダクション
</td>
<td>
meso
</td>
</tr>
<tr>
<td>
11:10-12:30
</td>
<td>
基調講演
</td>
<td>
Ryan Dahl
</td>
</tr>
<tr>
<td>
12:30-13:30
</td>
<td>
昼食(お弁当をご用意しております)
</td>
<td>
</td>
</tr>
<tr>
<td>
13:30-14:00
</td>
<td>
LiveCoding for beginner
</td>
<td>
Jxck(Nodejs_jp)
</td>
</tr>
<tr>
<td>
14:00-14:30
</td>
<td>
Node.jsでブラウザメッセンジャー / YOLPとRealtime Geo
</td>
<td>
石澤基、濱邉将太、栗山太希、中村友一 (ヤフー株式会社)
</td>
</tr>
<tr>
<td>
14:30-14:40
</td>
<td>
休憩
</td>
<td>
</td>
</tr>
<tr>
<td>
14:40-15:10
</td>
<td>
ピグライフとnode.js 名村卓 (株式会社サイバーエージェント)
</td>
<td>
</td>
</tr>
<tr>
<td>
15:10-15:40
</td>
<td>
ngCoreにおけるNode.js
</td>
<td>
篠崎祐輔 (株式会社ディー・エヌ・エー)
</td>
</tr>
<tr>
<td>
15:40-15:50
</td>
<td>
休憩
</td>
<td>
</td>
</tr>
<tr>
<td>
15:50-16:50
</td>
<td>
Socket.IOについて
</td>
<td>
Guillermo Rauch
</td>
</tr>
<tr>
<td>
16:50-17:00
</td>
<td>
休憩
</td>
<td>
</td>
</tr>
<tr>
<td>
17:00-18:30
</td>
<td>
LT大会
</td>
<td>
</td>
</tr>
<tr>
<td>
18:30-19:00
</td>
<td>
閉幕
</td>
</tr>
<tr>
<td>
19:00-
</td>
<td>
後夜祭(アフターパーティー)
</td>
<td>
</td>
</tr>
</tbody>
</table>
<hr style="border-style:solid; border-color:#dddddd; border-width:1px; width:95%"/>
<p>
<b style="font-size:180%;">アフターパーティーについて
</b>
</p>
<p>
居酒屋小松にてアフターパーティーを開催します! 参加費はチケットに含まれているため、チケットをお持ちの方は 無料で参加できます。ふるってご参加ください!
</p>
<p>
<b style="font-size:120%;">
居酒屋小松
</b>
</p>
<ul>
<li>
場所
<ul>
<li>
リンク先をご確認ください。 <a href="http://r.tabelog.com/tokyo/A1307/A130701/13060057/dtlmap/">【食べログ: 居酒屋 小松】</a>
<p>
当日スタッフがカンファレンス会場からアフターパーティー会場へ 先導し、皆様をご案内いたします。
</p>
</li>
</ul>
</li>
</ul>mksahttp://www.blogger.com/profile/02252636796648143837noreply@blogger.com0tag:blogger.com,1999:blog-5575797318863402249.post-53772752915153474932011-10-23T22:41:00.000+09:002011-10-24T19:31:08.767+09:00Node にまつわる良くある質問<h2>追記</h2><p>いくつか誤植を修正しました。<br />
<ul><li>Cluster API へのリンク</li>
<li>Ruby のようなフルスタックにうんざりしているんだ => Rails のような~</li>
</ul></p><br />
<p>Node 関連で良く聞かれる質問を集めて見ました。<br />
この記事を通して Node について持っていた疑問を解消し、Node の良いところも、「ちょっとなぁ。。」なところも合わせて、きちんと理解する助けになればと思います。</p><br />
<h2>そもそも "Node" なの? "Node.js" じゃないの?</h2><p>当初は "Node.js" と呼ばれていましたが、「正式名称は "Node" である。ただし曖昧さが出る場合は "Node.js" と表記しても良い」という旨の記述が本家の Wiki にあります。</p><br />
<p><a href="https://github.com/joyent/node/wiki/FAQ">What is the correct capitalization of Node.js?</a></p><br />
<p>日本のコミュニティもこれに合わせて Node と記述するようにしている人も多いです。<br />
確か "Node.js" って書くとクライアントサイドの JS ライブラリ(etc prototype.js)みたいに勘違いされる可能性がある、みたいな理由だった気がしますが、<br />
自分は正直 Node って言葉が汎用的すぎるので、まあこだわりすぎなくても良いかなと思うのが本音です。コンテキストで両方使い分けています。</p><br />
<h2>どんな人たちがいるの?</h2><p>Ruby => Rubyist, Python => Pythonista, という流れでいえば、Node の技術者は Noder という通称になります。<br />
海外の Noder の多くは、Ruby から来た人が多いという話を聞きました。<br />
Github を中心としたエコシステムだったり、Rails Ramdle を模した Node KnockOut といったイベントがあるのもその影響でしょうか。<br />
Haml, Sass, Sinatra といった Ruby 発祥のライブラリ(やそのアイデア)もどんどん Node に移植されています。その点で Ruby の文化を継承している印象があります。<br />
作者の Ryan Dahl も元は Ruby のサーバを書いたりしていました。</p><br />
<p>日本では、まだコミュニティは大きいとは言えませんが、色々なバックグラウンドの人が集まっています。<br />
面白いのは、「クライアントサイド JS をバリバリやってきました!」という人ばかりではないという点ですね、<br />
Ruby, Java, Python, Perl, Flash, C++ etc<br />
色々な人が集まっているので、刺激があって面白いと思います。</p><br />
<h2>企業も注目してるの?</h2><p>まず、作者の Ryan や npm の作者 isaac は Joyent というクラウドホスティングサービスの企業に在籍しています。<br />
Joyent は Node のビジネスユースを拡大するために色々とプランを練って動いているようです。<br />
Heroku や DotCloud から Microsoft と言った様々な企業も、特にクラウド関連のプラットフォームについて、 Node に興味を示していることもニュースにあがるようになりました。日本では、主要なソーシャルアプリやゲーム系の会社のあいだで、ちょっとづつ「無視はできない」感じになってきているという話も聞きます。<br />
そして日本でも FirstServer さんが、 Node のホスティングサービスをはじめるそうです。今後の展開に期待したい所です。</p><br />
<h2>ES5, harmonyは?</h2><p>Node は JS の処理系に Google v8 を使っています。<br />
v8 は ES5(Ecma Script 5) のほとんどを実装しているため、その機能であれば Node から自由に使うことができます。<br />
v8 で使える ES5 の機能は以下にまとまっています。</p><br />
<p><a href="https://github.com/joyent/node/wiki/ECMA-5-Mozilla-Features-Implemented-in-V8">ECMA-5-Mozilla-Features-Implemented-in-V8</a><br />
(拙作ですが参考 <a href="http://d.hatena.ne.jp/Jxck/20110709/1310215628">Node で使える ECMA Script 5 の新機能</a> にてこの内容を紹介しています。)</p><br />
<p>また、Node の v0.5.4 頃からは --harmony オプションつけると harmony_proxies と harmony_weakmaps などの機能が使えるようになっています。<br />
サーバでの使用は、クライアントのようにブラウザ間の互換性を気にせずに、安心して使える(Node 自体のバージョンの互換は別)ので、<br />
JavaScript 好きにはとても嬉しいことではないでしょうか?</p><br />
<h2>Web サーバなんだっけ?</h2><p>Web アプリケーションサーバではありません。<br />
Apache, Nginx のような HTTP サーバ実装でもなければ、Tomcat のようなアプリケーションサーバでもありません。<br />
Node はあくまでサーバサイドで JavaScript を動かす実行環境です。<br />
そして、標準のモジュールだけで HTTP サーバ、 TCP サーバ、ファイルサーバなどが、簡単に実装できるようになっています。<br />
簡単と言ってもヘッダを自分でいじるなど、それなりの知識を要するかもしれませんが、同じ事を C などでやるのと比べれば、<br />
よっぽど手軽かと思います。<br />
そしてそれを使って Apache などのように .html/.css/.js/.png を配布する Web サーバを実装することもできれば、Web アプリケーションを実装することもできます。<br />
パーサを書けば WebSocket を読むこともできて、こうしたところが Node で Ryan が目指した「手軽にネットワークプログラミングをする環境」を表していると思います。</p><br />
<h2>Node で作った Web アプリは何にデプロイするの? Apach mod_nodejs は?</h2><p>上の質問ともからみますが、Node は http という標準モジュールを持ち、これを用いると非常に簡単に HTTP サーバを作ることができます。<br />
そして多くの Web アプリ用フレームワークは、このモジュールで HTTP リクエストとレスポンスを操作し、アプリを成立します。<br />
つまり、 Node で作った Web アプリは、何か別の HTTP サーバ(Apach, Unicorn, Mongorel etc)にデプロイすること無く、Node プロセスを起動するだけで稼働することができます。</p><br />
<h2>サーバ書いたんだけどどう運用するの?デーモン化は?</h2><p>サーバを書いたら node コマンドで起動できるのは良いのですが、そのまま運用となるとちょっと心もとないです。<br />
Node もすでにプロダクション環境で動いている例もあるため、プロセスを管理するためのノウハウやツールもいくつかあります。<br />
多いのは node 製のプロセス管理ツールである forever を用いる方法や、 deamontools で管理する方法です。<br />
他にも最近は Joyent や Heroku, DotCloud など、Node に対応した PaaS が多くありますので、それらを利用するのも良いと思います。</p><br />
<h2>シングルプロセスなんでしょ?マルチコアは使えなくない?</h2><p>Node は単一のプロセスで、複数のI/Oを非同期に効率よくさばくことに長けた設計になっています。<br />
なので node コマンドで単純に起動したらプロセスが一つ立ち上がります。<br />
単一のプロセスでもある程度の性能は出ますが、それでも足りない場合は複数プロセスの起動が必要になるでしょう。<br />
アプローチは大きく二つあります。</p><br />
<ul><li>複数のプロセスを並列に起動しロードバランスする</li>
<li>特定の処理専用のワーカプロセスを起動し、マスタプロセスから処理を委譲する</li>
</ul><br />
<p>方法はいくつかがあって、ツールとして Cluster や node-webworker 、標準でも child_process などが利用できますし、<br />
前述の Heroku なども複数プロセスの起動に対応しています。<br />
また、 Node v0.5.10 からは、複数プロセス起動の <a href="http://nodejs.jp/nodejs.org_ja/api/cluster.html">cluster オプション</a> がサポートされました。<br />
このオプションは、単純にプロセスを同時起動するだけなので、複数起動したプロセス間のデータ共有などは、外部に Redis などの共有ストレージを立てるといったことが別途必要になりますが、非常に重要なオプションとなることでしょう。</p><br />
<h2>フィボナッチ遅いんでしょ?</h2><p>Node の仕組み上、 I/O ヘビーな処理をさばくことに長けていますが、CPU ヘビーな処理(例えばフィボナッチのように CPU 計算を沢山する処理)には長けていません。<br />
Node はイベントループという仕組みを用いて、I/O 中には別の処理を行うことで、単一のスレッドでも多くの処理を同時にさばくことができるようにしました。<br />
「シングルスレッド+非同期処理」なモデルです。これはスレッドの数が少ないという点で、メモリの節約にもなります。<br />
こうした I/O ヘビーな処理を効率よくさばくことができる点が、 Node が「リアルタイム Web アプリ」と相性が良いと言われる所以の一つです。<br />
WebSocket じゃなくて Ajax でも構いません。ネットワーク経由でのファイルのアップロードなんかも向いてるでしょう。</p><br />
<p>「大量のクライアント(PC, スマホ, タブレット, Bot, etc) から、大量の HTTPリクエスト(ネットワーク I/O) が来て、<br />
レスポンス(これもネットワーク I/O)には MySQL からデータを取らないといけない(ディスク I/O)」<br />
こんな場面こそ Node はその真価を発揮します。</p><br />
<p>逆に CPU ヘビーな処理は Node には向いているとは言えません。良く Ryan 本人が 「ビデオエンコードとか、 3D の演算なんかをするためじゃない」といった例を出すのは、Node はそうした「大量の計算を必要とする処理」を対象としていないというだけの話と考えます。<br />
もし CPU ヘビーな処理をしたい場合には、それ専用の子プロセスを fork して、そちらで実行し結果を受け取ると言った方法や、<br />
C 、C++ でアドオンを書くといった方法があります。</p><br />
<p>「フィボナッチを速く出したいだけなら、他の言語でやったらいいのでは?」ということかと思います。</p><br />
<h2>環境を作るの大変? Windows は?</h2><p>多くの言語で使用されている環境管理とパッケージ管理が Node でも用意されています。</p><p>環境管理</p><ul><li>Ruby の rvm</li>
<li>Python の virtualenv</li>
<li>Perl の Perlbrew</li>
<li>Node では nvm か nave</li>
</ul><br />
<p>パッケージ管理</p><ul><li>Ruby の gem</li>
<li>Python の PyPi</li>
<li>Perl の CPAN</li>
<li>Node では npm</li>
</ul><br />
<br />
<p>環境管理は nvm と nave の二つがあり、一長一短がある感じです。自分は nvm を使ってますが zsh と相性が悪いなどがあり、初めて使う場合は nave を入れておくのが吉かもしれません。もちろんソースからビルドすることもできます。Windows の場合は最近 node.exe の配布が始まったので、それをパスの通ったディレクトリに置くだけで実行が可能です。しかし npm はもともと sh で書かれているため、 Windows ではそのまま動かせないため、現在 windows 対応が進められています。</p><br />
<h2>ライブラリって結構あるの?</h2><p>いわゆる標準以外のライブラリは、Node ではモジュールと呼ばれていますが、モジュールはかなり広い範囲がカバーされています。<br />
本家リポジトリの Wiki にもそれをまとめたページがあります。<a href="https://github.com/joyent/node/wiki/modules"></a><a href="https://github.com/joyent/node/wiki/modules">https://github.com/joyent/node/wiki/modules</a></p><br />
見れば一通り揃っていることがわかるでしょう。<br />
しかし、逆に我先にとみんなが作り出し乱立したモジュール(例えば MySQL クライアントとか)や、作ったは良いけど全くメンテナンスされてないものも多く有るので、<br />
ここにある全てが未だに現役かというとそうとも言えません。動かないものも有るでしょう。(そもそも Wiki なのでここに書かれたのはあくまで自己申告です。)</p><br />
<p>導入する際には、コミットの履歴や Fork/Watch/issue/pull request の数などを確認し、そのモジュールが活発に開発されているかなどもチェックすると良いでしょう。<br />
(またまた拙作ですが、それをチェックするための [Bookmarklet(<a href="http://d.hatena.ne.jp/Jxck/20110924/1316850060">http://d.hatena.ne.jp/Jxck/20110924/1316850060</a>) を書いてたりします。ご参考まで。</p><br />
<h2>相性の良い DB</h2><p>Node と合わせてよく使用される DB には MongoDB や Redis といった NoSQL が多いかと思います。<br />
まず Node が JavaScript を用いて実装するため JSON (やそれに近い形式) でデータを格納する MongoDB や CouchDB といった、<br />
ドキュメント指向の DB と非常に相性がいいことがあげられます。特に MongoDB とは 「鼻血が出るほど相性がいい」と発表されていた例もあります。<br />
次に速度です。Node はリアルタイムアプリケーションと言った高速な応答が求められる場面で使われることも多いため、ストレージにも速度を求める場合が有ります。<br />
こうした時に memcache や redis が用いられることが多く、特に redis は良く組み合わせられる印象が有ります。<br />
もちろん MySQL や PostgreSQL といった定番の RDB 用のクライアントもあり、 ORM も開発されています。</p><br />
<h2>Web Application Framework はどんな感じ?</h2><p>Node で最も人気のある Web Application Framework は、現状 Express かと思います。<br />
Express は Ruby の Sinatra にインスパイアされており、軽量な設計になっています。一方 Rails のようなフルスタックな FW として Geddy というものもあります。<br />
なぜ Geddy のようなフルスタックなフレームワークではなく、軽量な設計の Express の方が好まれるのかというと、プロジェクトの活発度や使いやすさなど様々な要因があと思いますが、「Node に流れて来た Ruby(on Rails)開発者は、Rails のようなフルスタックにうんざりしているんだ」<br />
という話を聞いたことがあります。<br />
それ以外にも、 MVC でいう V(view) 層の多様化など色々な要因が有るとは思いますが、事実 Node では、全てを網羅したフルスタックなものよりも、単機能に絞ったモジュールを公開し、それを自分で選択して組み合わせるという流れが多いように思います。パッケージマネージャの npm も細かく依存をコントロールする機能を備えてそれを後押ししています。</p><br />
<h2>Socket.IO っていう WebSocket のライブラリがあるんでしょ?</h2><p>実用上ほとんど正しいんですが、正確に言うと少し違います。<br />
なぜなら Socket.IO がカバーしているのは WebSocket だけではないという点です。<br />
WebSocket は現状未実装だったり、実装されていてもデフォルトで無効になっているブラウザが多く、必ず使えるとは限りません。</p>しかし、 Socket.IO は WebSocket 以前に行われていたサーバからの Push 技術を併用し、<br />
「WebSocket が使えないブラウザは、別の通信方法にフォールバックする」という仕組みを取り入れる事で、<br />
この問題を解決しています。</p><br />
<p>現在 Socket.IO がフォールバックに使っている技術は以下の用なものがあります。</p><ul><li>Adobe® Flash® Socket</li>
<li>AJAX long polling</li>
<li>AJAX multipart streaming</li>
<li>Forever Iframe</li>
<li>JSONP Polling</li>
</ul><br />
<p>Forever Iframe や JSONP Polling あたりを使えばかなり広い範囲のブラウザまでサポートできます。<br />
(もちろんパフォーマンスは悪くなりますが) 現在ドキュメントにあるサーポートブラウザは以下です。</p><br />
<p>Desktop</p><ul><li>Internet Explorer 5.5+</li>
<li>Safari 3+</li>
<li>Google Chrome 4+</li>
<li>Firefox 3+</li>
<li>Opera 10.61+</li>
</ul><br />
<p>Mobile</p><ul><li>iPhone Safari</li>
<li>iPad Safari</li>
<li>iPad Safari</li>
<li>Android WebKit</li>
<li>WebOs WebKit</li>
</ul><br />
<p>ということで、 「WebSocket の」よりは「WebSocket も」になります。<br />
自分は一応「リアルタイム通信モジュール」といった紹介の仕方をしています。<br />
また純粋に 「WebSocket のライブラリ」というのであれば、<br />
Socket.IO も内部で使用している node-websocket というライブラリがそれにあたります。</p><br />
<h2>おわりに</h2><p>良く聞かれる質問についてはだいたい書かせていただきました。<br />
これらを通じて Node について、「良い面」「悪い面」も含めて正しく理解していただければと思います。<br />
こうしている間にも Node やそれを取り巻く環境は進歩し、今も次のメジャーバージョン v0.6 リリースに向けた作業が進んでいます。<br />
ここに書いていることも、少しずつ変わっていくかもしれません。</p><br />
<p>また、他にも質問があったら、コメントに書いていただければ、余力がある範囲で追記します。</p><br />
<p>Jxck</p>Jxckhttp://www.blogger.com/profile/12529498123750803055noreply@blogger.com3tag:blogger.com,1999:blog-5575797318863402249.post-72833339439458803462011-10-20T16:35:00.005+09:002012-01-11T03:54:58.478+09:00今すぐ「GitHub で」フォローすべき Node.js 界のスーパーエンジニア<div>こちらでははじめまして,koichik です.</div><div></div><div>Jxck によるエントリ:</div><div></div><div><ul><li><a href="http://blog.nodejs.jp/2011/10/nodejs.html">今すぐフォローすべき「本当の」 Node.js 界のスーパーエンジニア</a></li>
</ul></div><div></div><div>では,Node.js 自身を始め,<a href="http://npmjs.org/">npm</a> や <a href="http://socket.io/">Socket.IO</a>,<a href="http://expressjs.com/">Express</a> といった著名なプロダクトの作者が紹介されました (筆者を除く).彼等は Node.js の世界を大きく広げることに貢献している,文字通り「本当の」スーパーエンジニアです.</div><div></div><div>しかしながら,Node.js の世界に集うスーパーエンジニアは彼等ばかりではありません.著名なモジュールを作ってはいなくても,Node.js の品質改善や機能強化などで貢献している人達も大勢います.そこで今回は,Node.js の世界を深化させているスーパーエンジニアを 10 人紹介します.</div><div></div><div>とはいえ,彼等の中には Twitter をほとんど活用していない人もいます.IRC が普及しているせいか,日本に比べると技術的な話題で Twitter が使われることは少ないようです.しかし,「フォロー」は決して Twitter の専売特許ではありません.単なる公開リポジトリではなく,開発者のための SNS といっても過言ではない GitHub にもフォローの機能があります.スーパーエンジニアならではの活動を拝見するには,Twitter 以上に GitHub でのフォローが効果的です.</div><div></div><div>それでは 10 人のスーパーエンジニアを紹介しましょう.</div><div></div><h3> <a href="https://github.com/piscisaureus">piscisaureus</a> (Bert Belder)</h3><div>Node.js の次期安定版となるバージョン 0.6 の目玉は Windows サポートの強化です.その鍵となるのが Windows と Unix の API を抽象化するコンポーネントである <a href="https://github.com/joyent/libuv">libuv</a> です.Bert は libuv の「Windows パート」における中心人物で,Node.js コミッタの一人です.</div><div></div><div>彼は以前から Node.js の Cygwin 対応や MinGW 対応など,Node.js を Windows で利用するための作業を一手に担ってきました.コミット数では Ryan に次いで 2 番目ということからも,その貢献度を知ることができます.</div><div></div><div><strike>ホスティングサービスを提供する <a href="http://www.rackspace.com/">RackSpace</a> 社勤務で,ほとんどフルタイムで Node.js の開発に専念しているようです.</strike> [11/29 追記] <a href="http://c9.io/">Cloud9 IDE</a> に移ったようです.</div><div></div><div>ちなみに ID の piscis は「魚」,aureus は「黄金」という意味らしいです.金魚……でしょうか?</div><div></div><h3> <a href="https://github.com/bnoordhuis">bnoordhuis</a> (Ben Noordhuis)</h3><div>Node.js コミッタの一人で,libuv における「Unix パート」の中心人物です.Ben は低水準から高水準まで驚くほど幅広く,かつ深い知識の持ち主で,バイタリティにあふれ,その上細かい配慮も欠かさないという,なんとも素晴らしい人物です.詳しいプロフィールを公開していないのでどういう経歴の持ち主なのか不明ですが,元々は Python をやっていたようです.</div><div></div><div>前述の Bert と同じオランダ在住で,連日 IRC で会話しながら仲良く Node.js/libuv の開発を続けています.日本時間のお昼過ぎになると二人揃ってベッドに向かうため,他のメンバーから「同じベッドで寝てるのか?」などと突っ込まれるほどです (笑).</div><div></div><div>日本人ならお世話になることが多そうなモジュール,<a href="https://github.com/bnoordhuis/node-iconv">node-iconv</a> の作者でもあります.</div><div></div><h3> <a href="https://github.com/pquerna">pquerna</a> (Paul Querna)</h3><div>Paul はNode.js のコミッタであると同時に (というよりずっと以前から),<a href="http://httpd.apache.org/">Apache HTTP Server</a> (httpd) のコミッタでもあります.<a href="http://www.openssl.org/">OpenSSL</a> にも詳しく,Node.js の SSL/TLS サポートがバージョン 0.3 系で大幅に改善したのは彼の貢献によるものです.</div><div></div><div>OpenSSL は Node.js のようなシングルスレッドで非同期 I/O の環境を想定していない部分があるため,Node.js での利用は少々トリッキーなことをしています.そのため,Paul が取り組んでいるのが <a href="https://github.com/pquerna/selene">Selene</a> という非同期 I/O に適した SSL/TLS ライブラリです.これが完成すれば,Node.js だけでなく <a href="http://rubyeventmachine.com/">EventMachine</a> などでの SSL/TLS 実装がさらに改善すると期待されます.</div><div></div><div><strike>前述の Bert と同じ</strike>ホスティングサービスを提供する <a href="http://www.rackspace.com/">RackSpace</a> 社勤務です.</div><div></div><h3> <a href="https://github.com/igorzi">igorzi</a> (Igor Zinkovsky)</h3><div>今年の 6 月末,Microsoft 社が Node.js を Windows へ移植するために支援するという<a href="http://www.publickey1.jp/blog/11/nodejswindows_azure.html">ニュース</a>があったことを覚えているでしょうか? そのために Microsoft から二人の開発者が Node.js コミュニティにやってきました.その一人が Igor で,libuv のコミッタです.</div><div></div><div>なのですが,週末でも IRC に浸っていることもあるなど,社命だけで取り組んでいるようには見えません.普通に好きでやってるんだなぁという感じです.Node.js の Windows 版実行ファイルである node.exe は,主に彼と Bert の貢献によってできているといっていいでしょう.</div><div></div><div>[2011/10/26 追記] Igor が 8 人目の Node.js コミッタになりました。</div><div></div><h3> <a href="https://github.com/HenryRawas">HenryRawas</a> (Henry Rawas)</h3><div>Igor と同じく Microsoft のエンジニアです.が,彼の方はすでに Node.js から離れているかもしれません.それなら取り上げるなよって気もしますが,丁度10人にするために…… すみません.</div><div></div><h3> <a href="https://github.com/indutny">indutny</a> (Fedor Indutny)</h3><div>SSL/TLS 関連仕様である NPN (Next Protocol Negotitation) と SNI (Server Name Indication) の実装,そして最近になって劇的に機能強化された組込デバッガなど,ちょっと目の付け所が違うところで貢献しているのが Fedor です.Node.js コミッタ以外で一番コミット数が多いのが彼です.最近は libuv へも貢献しています.</div><div></div><div>とてもフレンドリーな人柄のようで,連日 IRC で他のメンバーに話しかけ続けています.ロシア在住で,前回紹介された <a href="https://github.com/indexzero">indexzero</a> 率いる <a href="http://nodejitsu.com/">Nodejitsu</a> の一員です.</div><div>[2012/01/10 追記] Fedor が 9 人目の Node.js コミッタになりました。</div><div></div><h3> <a href="https://github.com/pgriess">pgriess</a> (Peter Griess)</h3><div>Node.js を構成する主要なコンポーネントの一つが <a href="https://github.com/joyent/http-parser">HTTP Parser</a> で,Node.js 以外にも多数のプロダクトから利用されている,定評あるものです.その HTTP Parser に貢献しているのが Peter です.<a href="https://github.com/pgriess/node-msgpack">node-msgpack</a> や <a href="https://github.com/pgriess/node-websocket-client">node-websocket-client</a> など,ネットワークプロトコル関連のプロダクトを多くリリースしています.<a href="http://www.facebook.com/">Facebook</a> 勤務です.</div><div></div><h3> <a href="https://github.com/mraleph">mraleph</a> (Vyacheslav Egorov)</h3><div>Node.js を支えている最重要コンポーネントと言えるのが JavaScript の実行環境である <a href="http://code.google.com/p/v8/">Google V8</a> です.Vyacheslav (通称 Mr.Aleph) はロシア在住の Googler で,V8 の中の人です.当然ながら V8 のパフォーマンスに詳しく,Node.js でパフォーマンスに関する話題があると,GitHub 上に限らず IRC でも ML でもアドバイスをしてくれます.筆者が Twitter に日本語でつぶやいたことにも (英語で) 返事をくれたことがあります.</div><div></div><div>現時点の JavaScript (ES5) はバイト列を扱うことができないため,Node.js では独自の <a href="http://nodejs.jp/nodejs.org_ja/api/buffers.html">Buffer</a> というクラスを提供しています.これは配列のように添え字でアクセスできるのですが,C++ で実装されているため,以前は V8 の最適化が働きませんでした.Mr.Aleph はこれを改善し,Buffer を配列並みに高速にアクセスできるようにしてくれるなど,Node.js と V8 の橋渡しをしてくれています.コワモテです (笑).</div><div></div><h3> <a href="https://github.com/mnot">mnot</a> (Mark Nottingham)</h3><div>Node.js の http モジュールの <a href="http://nodejs.jp/nodejs.org_ja/api/http.html">API ドキュメント</a>を見ると,<a href="http://nodejs.jp/nodejs.org_ja/api/http.html#request.trailers">トレーラ</a>と呼ばれるボディより後ろに加えられるヘッダや,<a href="http://nodejs.jp/nodejs.org_ja/api/http.html#event_checkContinue_">Expect: 100-continue</a> など,「HTTP にそんなものがあったんだ?」と思うような,マイナーどころか誰も知らないであろう機能が実装されていることに気づきます.これらは Mark の貢献によるものです.</div><div></div><div>通常,我々が HTTP の仕様を調べる時は RFC を参照します.現在の最新版 (といっても,既に 10 年以上経過しています) は HTTP/1.1 (<a href="http://www.ietf.org/rfc/rfc2616.txt">RFC 2616</a>) ですが,IETF ではその改訂を <a href="http://tools.ietf.org/wg/httpbis/">HTTPbis</a> というワーキンググループ (WG) で進めています.彼はその WG のチェア,つまりとりまとめをしている人です.どうりでマイナーな機能まで詳しいわけですね.</div><div></div><div>GitHub の課題で HTTP プロトコルに関する問題があると,質問しなくても彼が答えてくれることがあります.なんという贅沢……</div><div></div><div>前述の <strike>Bert や</strike> Paul と同じ <a href="http://www.rackspace.com/">RackSpace</a> 勤務です.</div><div></div><h3> <a href="https://github.com/jed">jed</a> (Jed Schmidt)</h3><div>ジェッドは日本在住の翻訳家で,きわめて早期から Node.js に貢献してきました.日本の Node.js コミュニティでも最初のミートアップ (Node 飲み会) を主催してくれたり,海外の Node.js コミュニティとの橋渡しをしてくれたりしています.</div><div></div><div>Node.js といえば非同期プログラミングですが,初期の Node.js では現在とは異なり Promise (Java の Future と似た API,jQuery にも導入された Deferred の原型) を使った今以上に面倒なものでした.それがより洗練される過程で大きなインスピレーションを与えたのがジェッドの <a href="https://github.com/jed/fab">(fab)</a> です.(fab) を見ると,JavaScript の奥深さというものをうかがい知ることができます.というか,筆者にはすんなりと読めませんでした.心より恥じる.あれが JavaScript…… だと?</div><div></div><hr /><div></div><div>ということで 10 人のスーパーエンジニアを紹介しました.</div><div>Apache HTTP Server や V8 の中の人,さらには HTTP の RFC 作ってる人まで,なんともすごい人達の貢献によって Node.js は支えられていることが分かります.ワールドワイドで人気のあるプロダクトってこういうことなのかということを改めて感じました.彼等の書くコードやコメントには参考になることがたくさんあります.是非彼等を「GitHub で」フォローしてみてください.</div><div></div><div>前回紹介された 10 人の GitHub アカウントも以下に載せておきます.TJ の驚くべきアウトプットの多さ,Isaac の課題をクローズする電光石火の速さ (笑) などは,Twitter でフォローしても味わうことができません.彼等もまた「GitHub で」こそフォローすべきスーパーエンジニアと言えるでしょう (筆者を除く).</div><div></div><div><table><tbody>
<tr><th>Twitter</th><th>GitHub</th></tr>
<tr><td><a href="http://twitter.com/#!/ryah">@ryah</a></td><td><a href="https://github.com/ry">ry</a></td></tr>
<tr><td><a href="http://twitter.com/#!/izs">@izs</a></td><td><a href="https://github.com/isaacs">isaacs</a></td></tr>
<tr><td><a href="http://twitter.com/#!/sh1mmer">@sh1mmer</a></td><td><a href="https://github.com/thughes">thughes</a></td></tr>
<tr><td><a href="http://twitter.com/#!/rauchg">@rauchg</a></td><td><a href="https://github.com/guille">guille</a></td></tr>
<tr><td><a href="http://twitter.com/#!/tjholowaychuk">@tjholowaychuk</a></td><td><a href="https://github.com/visionmedia">visionmedia</a></td></tr>
<tr><td><a href="http://twitter.com/#!/indexzero">@indexzero</a></td><td><a href="https://github.com/indexzero">indexzero</a></td></tr>
<tr><td><a href="http://twitter.com/#!/felixge">@felixge</a></td><td><a href="https://github.com/felixge">felixge</a></td></tr>
<tr><td><a href="http://twitter.com/#!/mikeal">@mikeal</a></td><td><a href="https://github.com/mikeal">mikeal</a></td></tr>
<tr><td><a href="http://twitter.com/#!/substack">@substack</a></td><td><a href="https://github.com/substack">substack</a></td></tr>
<tr><td><a href="http://twitter.com/#!/koichik">@koichik</a></td><td><a href="https://github.com/koichik">koichik</a></td></tr>
</tbody></table></div>koichikhttp://www.blogger.com/profile/13766174516802726641noreply@blogger.com2tag:blogger.com,1999:blog-5575797318863402249.post-53347698819074780272011-10-09T14:10:00.030+09:002011-10-09T14:53:13.547+09:00東京Node学園祭 2011 開催まであと20日!東京Node学園祭 2011 参加者の皆様 Node.js 日本ユーザグループ 東京Node学園祭 2011 実行委員会です。
10/29 (土)の開催までの間、今回の記事を含め数回に渡り記事を掲載いたします。今回は以下の内容についてお知らせいたします。
<ul>
<li>海外スピーカーご紹介
</li>
<li>LT募集終了予定のお知らせ
</li>
<li>技評様の 東京Node学園祭 2011 紹介記事
</li>
<li>スポンサー様ご紹介
</li>
</ul>
<hr style="border-style:solid; border-color:#dddddd; border-width:1px; width:95%"/>
<p>
<b style="font-size:180%;">海外スピーカーご紹介
</b>
</p>
<p>今回のカンファレンスでは、スペシャルゲストとして海外より スピーカーをお招きしております。
</p>
<ul>
<li>
<p>Ryan Dahl</p>
<p>Node.js の生みの親です。学生時代に数学を専攻していた彼は、一方でプログラミングの世界でも活動しRubyのWebサーバなどを開発してい ました。それまでに培った知識を応用し、「簡単にスケーラブルなネットワークプログラムを作成する環境」として開発したのが、Node.jsの始まりで す。 現在はJoyentに在籍し、フルタイムでNode.jsの開発に従事しています。
</p>
</li>
<li>
<p>Guillermo Rauch</p>
<p>Node.js の代表的なリアルタイム通信モジュールSocket.IOの作者です。Socket.IOはNode.jsでのリアルタイムWebアプリの可能性を強く引 き出し、多くの開発者の注目を集めています。 オンラインの教育支援サービスを提供する LearnBoostのCTOでもあり、同じくLearnBoostに在籍するTJ Holowaychuk(Expressの作者)と共に、Node.jsのエコシステムの発展に日々貢献しています。
</p>
</li>
</ul>
<hr style="border-style:solid; border-color:#dddddd; border-width:1px; width:95%"/>
<p>
<b style="font-size:180%;">LT発表者募集終了予定について
</b>
</p>
<p>10/11 24:00に受付を終了いたします。 LT発表をご希望の方はご応募頂ますよう、よろしくお願いします。
</p>
<p>以下の応募登録フォームにアクセスしていただき、記入を行なってください。
</p>
<blockquote><a href="https://docs.google.com/spreadsheet/viewform?formkey=dG1uWjA4TTZ6bnlUSXVUSGdJZktsa2c6MQ">応募登録フォーム</a></blockquote>
<p><small>※尚、発表希望者が応募多数の場合、選考により 漏れてしまう恐れがございます。ご了承ください。</small>
</p>
<hr style="border-style:solid; border-color:#dddddd; border-width:1px; width:95%"/>
<p>
<b style="font-size:180%;">技評様の 東京Node学園祭 2011 紹介記事
</b>
</p>
<p>技評様の紹介記事です。カンファレンス参加前に目を通していただけると より東京Node学園祭 2011 をお楽しみいただける内容となっております :)</p>
<ul>
<li>タイトル: gihyo.jp×東京Node学園祭2011コラボ企画―「東京Node学園祭2011」の見どころ教えます!
</li>
<li>URL : <a href="http://gihyo.jp/dev/serial/01/nodefest2011">http://gihyo.jp/dev/serial/01/nodefest2011</a>
</li>
</ul>
<hr style="border-style:solid; border-color:#dddddd; border-width:1px; width:95%"/>
<p>
<b style="font-size:180%;">スポンサー様ご紹介
</b>
</p>
<small>※ スポンサー様は五十音順にて掲載しています。</small>
<p>
<span style="font-size:160%;">Platinum Sponsors
</span>
</p>
<ul>
<li>
<p>株式会社サイバーエージェント(<a href="http://ameblo.jp/">http://ameblo.jp/</a>)
</p>
<p>サ イバーエージェントは1998年の創業以来、インターネットメディア事業、インターネット広告事業を中心に事業展開をする、インターネット総合 サービス企業です。中でも、注力事業であるメディア「Ameba」はブログを中心にコミュニケーションサービス「アメーバピグ」などを展開し、2,500 万人以上が利用する国内最大規模のインターネットメディアとなっています。2011年6月より開始し急速に利用者を集めている「ピグライフ」は世界最大規 模の Node.js を用いた商用サービスとして注目されています。
</p>
</li>
<li>
<p>株式会社ディー・エヌ・エー(<a href="http://dena.jp/">http://dena.jp/</a>)</p> <p>ディー・ エヌ・エー(DeNA)は、日本、英語圏、中国語圏を中心としたワールドワイドのソーシャルゲームプラットフォーム「Mobage」を展開 しています。その展開を支える技術 iOS/Android の両プラットフォームにワンソースでゲームを提供できるゲームエンジン「ngCore」の提供も行っています。「ngCore」は、Web 業界で働いている方には親しみのある言語、JavaScript を使ってアプリを開発できるほか、非エンジニアのための支援ツール、ライブラリ等も提供しています。ぜひダウンロードしてみてください。 <a href="https://developer.mobage.com/">https://developer.mobage.com</a>
</p>
</li>
</ul>
<p><span style="font-size:130%;">Gold Sponsors</span></p>
<ul>
<li>
<p>株式会社リクルート(<a href="http://www.recruit.co.jp/">http://www.recruit.co.jp/</a>)
</p>
<p>リ クルートは、「じゃらん」「SUUMO」「リクナビ」を初めとする大小様々なWebサービスを展開しています。これらのWebサービスを支える アーキテクチャとして、Solr・Hadoop等オープンソースを積極的に活用しており、現在、リアルタイムWebの実現に向けNode.jsの導入に取 り組んでいます。
</p>
</li>
<li>
<p>グリー株式会社(<a href="http://www.gree.co.jp/">http://www.gree.co.jp/</a>)
</p>
<p>グ リーは、世界に1.4億ユーザーを抱えるソーシャルプラットフォームを運営しています。ソーシャル・ネットワーキング・サービス「GREE」を ベースに、SNSとしての基本機能に加え、ソーシャルゲーム、アバター、占い、Q&A投稿などのユーザー間のコミュニケーションを中心に 据えたエンターテインメント性の高い多様なコンテンツを提供しています。現在、モバイルでの提供アプリ数は8,000超にものぼっています。
</p>
</li>
<li>
<p>日本マイクロソフト株式会社(<a href="http://www.microsoft.com/japan/windowsazure/campaign/mobile/">http://www.microsoft.com/japan/windowsazure/campaign/mobile/</a>)
</p>
<p>マ イクロソフトでは、近年オープンソースへの対応を強化しています。クラウドサービスであるWindows Azureもその例外ではなく、.NETに限らずPHPやRuby on Railsのサーバーアプリをホストすることが可能です。近年、Node.jsへの対応や技術情報提供も強化しています。無償でお試しできますので Node.jsアプリのホスト環境として是非ご活用ください。
</p>
</li>
</ul>
<p><span style="font-size:130%;">Silver Sponsors</span></p>
<ul>
<li>
<p>株式会社インディソフトウェア(<a href="http://www.indi.co.jp/">http://www.indi.co.jp/</a>)
</p>
<p>インディソフトウェアは「コンテンツを通じて世界をポジティブに」を合い言葉にコンテンツ・サービスの企画・開発を行っており、Nodeフレームワークであ るSocketStreamの採用実績もございます。
</p>
</li>
<li>
<p>エムスリー株式会社(<a href="http://corporate.m3.com/">http://corporate.m3.com/</a>)
</p>
<p>エムスリー株式会社は20万人以上の医師が登録している日本最大規模の医療専門サイト m3.com を中心に医療関連サービスを提供している会社です。Node.js on Herokuの運用実績があります。
</p>
</li>
<li>
<p>ニフティ株式会社(<a href="http://www.nifty.co.jp/">http://www.nifty.co.jp/</a>)
</p>
<p>ニフティ株式会社は“ニフティとなら、きっとかなう。 With Us, You Can.”を経営理念とし、高品質で安心安全なインターネットサービスを提供しています。Node.jsにも取り組んでいます。
</p>
</li>
<li>
<p>株式会社ピクセルグリッド(<a href="http://www.pxgrid.com/">http://www.pxgrid.com/</a>)
</p>
<p>ピクセルグリッドはJavaScriptの会社です。Webアプリケーションのフロントエンド開発を得意としhtml5やCSS3といった技術を積極的に活用しています。node.jsの利用にも取り組んでいます。
</p>
</li>
</ul>
<p><span style="font-size:130%;">Supporters</span></p>
<ul>
<li>
<p>株式会社ドワンゴ(<a href="http://info.dwango.co.jp/">http://info.dwango.co.jp/</a>)
</p>
<p>株式会社ドワンゴは、ゲームや音楽をはじめとするエンタテインメント分野において、次世代ネットワークコミュニケーションの創出を目指す、ネットワーク・エンタテインメント・カンパニーです。
</p>
</li>
<li>
<p>ファーストサーバ株式会社(<a href="http://www.fsv.jp/">http://www.fsv.jp/</a>)
</p>
<p>ファーストサーバ株式会社は、レンタルサーバーサービスを主力とした、創業10年、8割以上が法人顧客の信頼と実績を誇る情報処理サービス事業者です。
</p>
</li>
<li>
<p>ヤフー株式会社(<a href="http://www.yahoo.co.jp/">http://www.yahoo.co.jp/</a>)
</p>
<p>ヤフー株式会社が運営するYahoo! JAPANは、1か月あたり約5287万人のユニークカスタマー数※と、1日23億6500万ページビューのインターネットの総合情報サイトで、検索、コ ンテンツ、コミュニティー、コマース、モバイル、スマートフォンなど多くのサービスを提供しています。 ※Nielsen Online「NetView」、2011年7月、家庭もしくは職場からのアクセスによる。
</p>
</li>
<li>
<p>Joyent(<a href="http://www.joyent.com/">http://www.joyent.com/</a>)
</p>
<p>Joyentは、開発者やエンタープライズ、サービスプロバイダに統合的な技術を提供する、世界的なクラウドコンピューティングソフトウェア及びサービスのプロバイダです。
</p>
</li>
</ul>http://www.blogger.com/img/blank.gif
<hr style="border-style:solid; border-color:#dddddd; border-width:1px; width:95%"/>
<p>
<b style="font-size:180%;">最後に
</b>
</p>
<p>東京Node学園祭 2011 ご参加の皆様、当日会場でお会いできるのを楽しみにしております。</p>
<p><a href="http://nodefest.jp/2011/">東京Node学園祭 2011 オフィシャルサイト</a>もあわせてご確認ください。</p>mksahttp://www.blogger.com/profile/02252636796648143837noreply@blogger.com0tag:blogger.com,1999:blog-5575797318863402249.post-34133988972626281922011-10-05T19:46:00.000+09:002011-10-05T21:29:28.443+09:00今すぐフォローすべき「本当の」 Node.js 界のスーパーエンジニア<br />
<br />
Jxck です。<br />
<br />
少し前、以下のような記事がポストされたのを覚えてますでしょうか?<br />
<br />
<a href="http://d.hatena.ne.jp/replication/20110615/1308063792">今すぐフォローすべきnode.js界のスーパーエンジニア</a><br />
<br />
自分もこの記事にリストしていただいて、非常に光栄です。<br />
しかし一方で、載った自分からしても、手放しに喜べない点があったのも事実でした。<br />
<br />
それは、ここに上がっているのは日本人だけで、僕らが思う<br />
本当のスーパーエンジニアの多くは、海の向こうで大活躍してるという点です。<br />
<br />
また国内に絞ってみても決して外してはいけない、「あの人」が。。<br />
<br />
自分としては、是非彼らの活躍にも注目してもらいたいと思っています。<br />
そこで今日は Node.js のことを知りたい方がフォローすべき、<br />
本当のスーパーエンジニア達を紹介したいと思います。<br />
多くてもあれなので、10人に絞ってみます。<br />
<br />
<br />
<a href="http://twitter.com/#!/ryah">@ryah</a><br />
Ryan は言わずとしれた Node.js の生みの親です。彼を抜きに語る事はできません。<br />
現在は Joyent に在籍しフルタイムで Node.js の開発に従事しています。<br />
Twitter での発言は少なめで、よく "favorite song" をポストしてたりします。<br />
東京Node学園祭2011 に登壇のため 10月に初来日の予定です。<br />
というか、もうフォローしてますよね?<br />
<br />
<br />
<a href="http://twitter.com/#!/izs">@izs</a><br />
Izaac は npm の作者でシリコンバレーのベテランプログラマです。<br />
Ryan と同じく Joyent で働いています。<br />
以前のアイコンの写真は少し暗そうなイメージがありましたが(最近変わった)、<br />
実際は結構明るい感じです。<br />
Unix 文化にも造詣が深く、Node.js のコアにもその精神を反映しています。<br />
少しマイナーですが、slideというフローコントロールライブラリを見ると彼のセンスが伺えます。<br />
<br />
<br />
<a href="http://twitter.com/#!/sh1mmer">@sh1mmer</a><br />
Tom は Joyent のチーフエバンジェリストで、元は Yahoo のエンジニアです。<br />
自転車が目印で、Joyent の中でも兄貴的な存在です。<br />
Oreilly から出る Node.js 本 <a href="http://ofps.oreilly.com/titles/9781449398583/">"Up and Running with Node.js" </a> の著者でもあり、<br />
イベントでも幅広い発表をしています。ベジタリアンです。<br />
<br />
<br />
<a href="http://twitter.com/#!/rauchg">@rauchg</a><br />
Guillermo はアルゼンチン出身で、 Socket.IO や mongoose の作者です。<br />
<a href="http://twitter.com/#!/tjholowaychuk">@tjholowaychuk</a> がいる LearnBoost の CTO でもあります。<br />
今は mongoose は離れて Socket.IO に注力しているようです。<br />
とても若くてイケメンです。<br />
同じく学園祭登壇予定です。ちなみに、Socket.IO に興味があるなら、<br />
彼と同じくコミッタである <a href="http://twitter.com/#!/3rdEden">@3rdEden</a> もフォローするといいでしょう。<br />
<br />
<br />
<a href="http://twitter.com/#!/tjholowaychuk">@tjholowaychuk</a><br />
TJ は、Express をはじめ Jade, Stylus, Cluster, Connect, Expresso, Should, Tobi などなど、<br />
数多くのプロジェクトを驚異的な生産性でこなす本物のスーパーエンジニアです。<br />
github で彼を追いかけると、そのコミットの速さに驚くことでしょう。<br />
Node.js 界のエコシステムに大きく貢献していて、 現在書籍も執筆中だそうです。<br />
あまりカンファレンスなど表には出てこない人で、<br />
コミュニティにも彼と会ったことがある人はほとんどいないそうです。<br />
(今年の学祭も、残念ながら断られてしまいました。。)<br />
彼もまたとても若く、家ではフェレットを飼っています。(この名前が Tobi の由来)<br />
<br />
<br />
<a href="http://twitter.com/#!/indexzero">@indexzero</a><br />
Charlie は <a href="http://nodejitsu.com/">Nodejitsu</a> のエンジニアです。 Nodejitsu は、サービスを<br />
Node.js で運用する中で得た経験をもとに、forever, node-http-proxy, winston など、<br />
ちょっと触る程度では必要ないけど、本気で取り組むと必ずたどり着く、<br />
玄人向けモジュールを数多くリリースしています。<br />
彼らはその中心を担うエンジニアで、実力者かつイケメンです。<br />
<br />
<br />
<a href="http://twitter.com/#!/felixge">@felixge</a><br />
Felix は node-mysql などの開発者で、現在は Node.js のコアコミッタでもあります。<br />
<a href="http://nodeguide.com/">Felix's Node.js Guide</a> には、Node.js のチュートリアルから、スタイルガイド、<br />
上司の説得方法まで幅広く書かれているので、これから始める人は<br />
ぜひ読んでみるといいでしょう。<br />
彼が在籍する <a href="http://transloadit.com/">Transloadit</a> というサービスは、 Node.js を活用した<br />
成功例の一つと言えます。<br />
背が高く気さくな青年です。彼もまたとても若いです。本当にみんな若い。。<br />
<br />
<br />
<a href="http://twitter.com/#!/mikeal">@mikeal</a><br />
Mikeal は NodeConf の主催者で Mozilla, CouchOne, Yammer と渡ってきた実力者です。<br />
request という HTTP モジュールを公開するように HTTP 周りに非常に詳しく、<br />
ML でも Node.js コアの通信周りにも鋭く切り込む場面がたまにあります。<br />
<a href="http://twitter.com/#!/jedschmidt">@jedschmidt</a> とは友人で、ラーメンが大好きな彼は、自分で作るために、<br />
Jed に「かん水」を日本から送ってくれるように頼んだほどのラーメン好きですw<br />
<br />
<br />
<a href="http://twitter.com/#!/substack">@substack</a><br />
VM からロボットまで幅広い技術をもつオークランド在住のエンジニアです。<br />
Web サイトの各ブラウザの見た目を確認できる <a href="http://browserling.com/">browseling</a> というスタートアップの<br />
サービスを提供し、npm モジュールをブラウザで使えるようにする<br />
<a href="https://github.com/substack/node-browserify">node-browserify</a> などのモジュールを公開しています。<br />
ロボットをはじめとするコミカルなイラストが特徴です。(<a href="http://substack.net/">http://substack.net/</a>)<br />
<br />
<br />
<a href="http://twitter.com/#!/koichik">@koichik</a><br />
忘れてはならないのが、日本人で初めて Node.js のコアコミッタになった koichik さんです。<br />
もともとは <a href="http://www.seasar.org/">Seasar</a> 関連のコミッタもやっているので、<br />
Java を使う人ならもしかしたら知っているかもしれません。<br />
node-handlersocket も公開していて、日本語ドキュメントも本家のドキュメントが<br />
更新されてから1日程度で訳を公開しています。<br />
東京Node学園で発表された 『<a href="http://www.slideshare.net/koichik/node1">「非同期プログラミングの改善」のエッセンス</a>』は、<br />
非同期プログラミングがベースの Node.js でプログラムを書く上では必読です。<br />
<br />
<br />
ということで 10 人紹介しました。<br />
他にも優秀なエンジニアはたくさんいますので、この10人からたどって、<br />
自分の興味のあるモジュールのコミッタなどをフォローしていくといいと思います。<br />
<br />Jxckhttp://www.blogger.com/profile/12529498123750803055noreply@blogger.com2tag:blogger.com,1999:blog-5575797318863402249.post-75776533931107332342011-10-01T15:44:00.000+09:002011-10-01T15:44:10.155+09:00「東京Node学園祭2011」 開催いたします!皆様、いかがお過ごしでしょうか。<br />
<br />
来る 2011/10/29 に Node.js 日本ユーザグループによる<br />
Node.js カンファレンス "東京Node学園祭2011" を開催いたします。<br />
<br />
Node.jsの生みの親 <span style="font-weight: bold;">Ryan Dahl</span> 、 Socket.IOの作者 <span style="font-weight: bold;">Guillermo Rauch</span> がスピーカーとして登壇いたします。<br />
<br />
詳しくは、東京Node 学園祭 公式サイトをご覧ください。<br />
<a href="http://nodefest.jp/2011/">東京Node学園祭</a><br />
<br />
東京Node学園祭 公式Twitterアカウントもございます。<br />
フォローしていただくと最新情報をご確認いただけます。<br />
<a href="https://twitter.com/#%21/nodefest">東京Node学園祭 Twitterアカウント</a><br />
<br />
Twitterでの公式ハッシュタグは <a href="https://twitter.com/#!/search/%23nodefest">#nodefest</a> となります。<br />
<br />
<span style="font-weight: bold;">2011-09-26 追記</span><br />
チケットについて2011-09-26より販売開始となりました!
ご参加希望の方はチケットをご購入ください。<br />
詳しくは<a href="http://nodefest.jp/2011/ticket.html">チケットのご購入ページ</a>をご参照ください。<br />
<br />
会場はYahoo! JAPAN様 11Fとなります。<br />
詳しくは<a href="http://nodefest.jp/2011/access.html">会場へのアクセス</a>をご参照ください。<br />
<br />
<span class="Apple-style-span" style="font-weight: bold;">2011-10-01 追記</span><br />
チケット販売は閉め切らせていただきました。<br />
みなさんありがとうございました。mksahttp://www.blogger.com/profile/02252636796648143837noreply@blogger.com10tag:blogger.com,1999:blog-5575797318863402249.post-10375794014477007772011-07-22T17:10:00.003+09:002011-08-27T08:12:52.460+09:00Node.js Knockout にて 東京Camp を開催します来る 2011/08/27-2011/08/29 に行われるNode.js Knockoutにて、Node.js日本ユーザグループとして東京で参加者が集まれる場所を用意しようという主旨のもと、東京Campを開催いたします。<br />
<br />
開催期間: 2011/08/27 08:00 - 2011/08/29 12:00<br />
上記期間中であれば、好きな時間に来て好きな時間に帰ってもらって結構です。<br />
必要な物: ノートPC<br />
場所: 東京都港区芝浦1-14-6 BSビル3F<br />
<iframe frameborder="0" height="350" marginheight="0" marginwidth="0" scrolling="no" src="http://maps.google.co.jp/maps?q=%E6%9D%B1%E4%BA%AC%E9%83%BD%E6%B8%AF%E5%8C%BA%E8%8A%9D%E6%B5%A6%EF%BC%91%E4%B8%81%E7%9B%AE%EF%BC%91%EF%BC%94%E2%88%92%EF%BC%96&ie=UTF8&hq=&hnear=%E6%9D%B1%E4%BA%AC%E9%83%BD%E6%B8%AF%E5%8C%BA%E8%8A%9D%E6%B5%A6%EF%BC%91%E4%B8%81%E7%9B%AE%EF%BC%91%EF%BC%94%E2%88%92%EF%BC%96&z=14&brcurrent=3,0x60188bca6e33653d:0xef4e4b39ff2f32ba,0,0x60188bca717a6885:0x6249976954c7f2d4&ll=35.6471,139.753147&output=embed" width="425"></iframe><br />
<small><a href="http://maps.google.co.jp/maps?q=%E6%9D%B1%E4%BA%AC%E9%83%BD%E6%B8%AF%E5%8C%BA%E8%8A%9D%E6%B5%A6%EF%BC%91%E4%B8%81%E7%9B%AE%EF%BC%91%EF%BC%94%E2%88%92%EF%BC%96&ie=UTF8&hq=&hnear=%E6%9D%B1%E4%BA%AC%E9%83%BD%E6%B8%AF%E5%8C%BA%E8%8A%9D%E6%B5%A6%EF%BC%91%E4%B8%81%E7%9B%AE%EF%BC%91%EF%BC%94%E2%88%92%EF%BC%96&z=14&brcurrent=3,0x60188bca6e33653d:0xef4e4b39ff2f32ba,0,0x60188bca717a6885:0x6249976954c7f2d4&ll=35.6471,139.753147&source=embed" style="color: blue; text-align: left;">大きな地図で見る</a></small><br />
<br />
場所は<a href="http://vasdaqh.com/index.html">VASDAQグループ</a>様のご厚意によって無料で提供していただくことになりました。深く御礼申し上げます。<br />
1Fの正面入り口が施錠されている場合は、横の階段から3Fに上がってきてください。<br />
<br />
本家ページにも載りました: <a href="http://nodeknockout.com/locations#tokyo">http://nodeknockout.com/locations#tokyo</a>mesohttp://www.blogger.com/profile/09102232744610763531noreply@blogger.com0tag:blogger.com,1999:blog-5575797318863402249.post-11270324104005075362011-06-02T21:13:00.002+09:002011-06-02T21:15:45.833+09:00「東京Node学園 2時限目」を開催します<span class="Apple-style-span" style="font-family: Arial, Verdana, sans-serif; font-size: x-small;"></span><br />
<a href="http://nodejs.jp/">Node.js日本ユーザグループ</a>主催によるNode.jsの勉強会である、「東京Node学園」の第2回です。<div>
今回は、Node.js Knockout 2011に向けたアイデアソンを行います。</div>
<div>
<br /></div>
<div>
詳細は<a href="http://bit.ly/julGUe">参加登録ページ</a>をご覧ください。</div>
<div>
<br /></div>
<div>
今回はアイデアソンということもあり、プログラマではないデザイナーや企画が得意な方など誰でも参加いただけます。</div>
<div>
<br /></div>
<div>
皆さま是非ご参加ください。</div>mesohttp://www.blogger.com/profile/09102232744610763531noreply@blogger.com0tag:blogger.com,1999:blog-5575797318863402249.post-84280909916877425092011-05-26T15:59:00.001+09:002011-08-07T14:23:17.959+09:00JJUG CCC 2011 Springが無事終わりました発表してくださったのは、下記の皆さまです。<br />
<br />
1枠目: @bad_at_math / @Jxck_<br />
2枠目: @koichik / @sugyan / @yaakaito_ / @hakobera / @y_sakamttio / @takesako / @spagetty / @muddydixon<br />
<br />
ありがとうございました!<br />
<br />
今後も幾つかイベントを計画しておりますので、是非よろしくお願いします。<br />
<br />mesohttp://www.blogger.com/profile/09102232744610763531noreply@blogger.com0tag:blogger.com,1999:blog-5575797318863402249.post-4351605598935168772011-04-30T16:17:00.001+09:002011-04-30T16:17:43.846+09:00JJUG CCC 2011 SpringのLT発表者募集<br />
<div style="color: #222222; font-family: arial, sans-serif; font-size: 13px;">
5月24日に行われる予定の、<wbr></wbr>日本Javaユーザグループ主催のイベント「JJUG Cross Community Conference 2011 Spring」に、Node.<wbr></wbr>js日本ユーザグループとして2枠いただけることとなりました。</div>
<div style="color: #222222; font-family: arial, sans-serif; font-size: 13px;">
<br /></div>
<div style="color: #222222; font-family: arial, sans-serif; font-size: 13px;">
1枠目(50分)は、<br />
a) @bad_at_mathによる「Node.jsとは何か」<br />
b) @Jxck_による「NodeConf」(<a href="http://nodeconf.com/" style="color: #2200cc;" target="_blank">http://<wbr></wbr>nodeconf.com/</a>)の報告会<br />
の二本立てでいこうと考えています。</div>
<div style="color: #222222; font-family: arial, sans-serif; font-size: 13px;">
<br /></div>
<div style="color: #222222; font-family: arial, sans-serif; font-size: 13px;">
2枠目(100分)は、<br />
Node.js日本ユーザグループのメンバによるLT大会<br />
にしたいと考えています。</div>
<div style="color: #222222; font-family: arial, sans-serif; font-size: 13px;">
<br /></div>
<div style="color: #222222; font-family: arial, sans-serif; font-size: 13px;">
というわけで、LT参加者を大募集します!</div>
<div style="color: #222222; font-family: arial, sans-serif; font-size: 13px;">
基本は5分発表で質疑応答と交代で5分の一人10分で、<wbr></wbr>枠は10人分あります。</div>
<div style="color: #222222; font-family: arial, sans-serif; font-size: 13px;">
発表者がそこまで集まらないようなら、希望者の時間を延ばす等、<wbr></wbr>柔軟に対応しようと思います。</div>
<div style="color: #222222; font-family: arial, sans-serif; font-size: 13px;">
希望者は <span class="Apple-style-span" style="color: black; font-family: 'MS PGothic'; font-size: small;">https://groups.google.com/d/topic/nodejs_jp/3R6RIHN_Xx8/discussion </span>に返信するか、<wbr></wbr>もしくは<a href="http://twitter.com/meso">@meso</a>まで連絡ください。<wbr></wbr>締め切りは応募状況を見て考えます。</div>
<div style="color: #222222; font-family: arial, sans-serif; font-size: 13px;">
<br /></div>
<div style="color: #222222; font-family: arial, sans-serif; font-size: 13px;">
開催日は平日ですが、皆さま是非こぞってご参加ください!</div>
<br />
<br />mesohttp://www.blogger.com/profile/09102232744610763531noreply@blogger.com0tag:blogger.com,1999:blog-5575797318863402249.post-45020546487889430352011-03-25T19:57:00.001+09:002011-03-25T19:58:45.655+09:00「東京Node学園 1時限目」を開催いたしました会場を提供してくださいました、リクルート メディアテクノロジーラボさま、また発表者の皆さまと手伝ってくれた皆さまに感謝申し上げます。お陰さまで成功裏に終えることができました。<br />
<br />
Ustreamの録画は http://ustream.tv/channel/nodejsjp にあります。<br />
ただし、@Jxck_の最初の方がちょっと切れています。すみません。<br />
<br />
発表者の資料は公開され次第このエントリに追記していきます。<br />
<br />
<ol>
<li><a href="http://tng1.mesolabs.com/">ご挨拶 / 5分で分るNode.js</a> <a href="http://twitter.com/meso">@meso</a></li>
<li>ECMAScript5時代のJavaScript再入門 <a href="http://twitter.com/masuidrive">@masuidrive</a></li>
<li><a href="http://www.slideshare.net/koichik/node1">「非同期プログラミングの改善」のエッセンス</a> <a href="http://twitter.com/koichik">@koichik</a></li>
<li>Nodeにおけるテスト手法 <a href="http://twitter.com/Jxck_">@Jxck_</a></li>
<li>LT</li>
<ol>
<li><a href="http://www.slideshare.net/hakobera/kinect-detheremin">Kinect でテルミン</a> <a href="http://twitter.com/hakobera">@hakobera</a></li>
<li><a href="http://www.slideshare.net/ndruger/nodejs-7375453">Node.jsによるマルチプレイヤーネットワークゲームの可能性</a> <a href="http://twitter.com/ndruger">@ndruger</a></li>
</ol>
</ol>mesohttp://www.blogger.com/profile/09102232744610763531noreply@blogger.com0tag:blogger.com,1999:blog-5575797318863402249.post-54754874051873882882011-03-03T20:59:00.003+09:002011-03-03T21:00:40.860+09:00「東京Node学園 1時限目」を開催します<br />
<div style="color: #333333; line-height: 24px; margin-bottom: 1.2em; margin-left: 0px; margin-right: 0px; margin-top: 0.5em;">
Node.js日本ユーザグループとして定期的に勉強会を行っていこうという話がありまして、その第一回として3月24日に「東京Node学園 1時限目」を開催いたします。開場は、リクルート メディアテクノロジーラボさんをお借りします。会場提供を快諾していただきありがとうございます。</div>
<div style="color: #333333; line-height: 24px; margin-bottom: 1.2em; margin-left: 0px; margin-right: 0px; margin-top: 0.5em;">
ATNDは <a href="http://atnd.org/events/13529" style="color: #66a100;" target="_blank">http://atnd.org/events/13529</a> ですが、このエントリを書いている時点で既にキャンセル待ちになってしまっています。</div>
<div style="color: #333333; line-height: 24px; margin-bottom: 1.2em; margin-left: 0px; margin-right: 0px; margin-top: 0.5em;">
し・か・し!LT発表者はキャンセル待ちでも参加できますので、キャンセル待ちだけどどうしても参加したい方は是非LTするよ!と表明してください。お待ちしております!</div>
<div>
なお、以降も定期的に勉強会を開催していく予定ですので、「発表したい!」という方は是非<a href="http://twitter.com/meso">meso</a>までご連絡をください。</div>mesohttp://www.blogger.com/profile/09102232744610763531noreply@blogger.com0tag:blogger.com,1999:blog-5575797318863402249.post-74234269559951655642010-12-26T15:55:00.005+09:002010-12-27T01:28:23.521+09:00Express と Expresso を使う際の注意点12/26 現在 npm でリリースされている Express 1.0.0 と Expresso 0.7.0 を使う際の注意点です。<br />
<br />
1つ目<br />
<br />
コマンドラインで自動生成されるテストコードにバグがあります。<br />
<br />
Express では、<br />
<blockquote>
$ mkdir foo</blockquote>
<blockquote>
$ express foo</blockquote>
で、プロジェクトを自動生成できます。 /test に app.test.js というテストコードがあります。これは Expresso 用のテストコードですが、いまの Expresso では動きません。そこでテストコードを以下のように修正します。<br />
<br />
<a href="https://gist.github.com/755281/0bca5a01e2ab8fdcae5c7f145891b3bda6910815">修正その1</a><br />
<br />
※ ちなみに <a href="https://chrome.google.com/extensions/detail/ekibhngllckenihijddjkmehiocljcpc">このエクステンション</a> を使うと gist の diff がとれます。便利すぎるのでおすすめです。<br />
<br />
これでルートディレクトリから<br />
<blockquote>
<div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;">
$ expresso</div>
</blockquote>
を実行すると、テストが走ります。Github のコードは修正されているので、もうしばらく待っていたら解消すると思います。<br />
<br />
<br />
<br />
2つ目<br />
<br />
Expresso では -c でカバレッジを取ることができますが、 /lib 配下のコードにしか対応していません。そこで /lib をつくって app.js を移動します。<br />
<br />
<blockquote>
$ mkdir lib </blockquote>
<blockquote>
$ mv app.js lib</blockquote>
外部ファイルのパスを修正します。<br />
<br />
<div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;">
<a href="https://gist.github.com/755262/8f962f0007bdeb97f664611a75180823729c6018">修正その2</a></div>
<br />
テストコードのパスも修正します。<br />
<br />
<a href="https://gist.github.com/755281/e58acacd79be05f0d73180a4ed1df6b870e0e1e0">修正その3</a><br />
<br />
テストは expresso の引数でライブラリのパスを指定して実行します。<br />
<br />
<blockquote>
$ expresso -I lib -c</blockquote>
<br />
これでカバレッジも取れるようになりました。<br />
<br />
最終的なソースコードはこうなっています。<br />
<br />
<script src="https://gist.github.com/755281.js">
</script>
<br />
以上、 Express と Expresso を使う際のちょっとした注意点でした。<br />
<br />
Happy Noding!<br />
<br />
<br />
<blockquote>
</blockquote>Unknownnoreply@blogger.com10tag:blogger.com,1999:blog-5575797318863402249.post-29239691758916024102010-12-25T23:45:00.011+09:002011-01-05T05:06:49.239+09:00HTTP と WebSocket でセッションを共有するこんにちは、 <a href="http://nodejs.jp/">nodejs.jp</a> の <a href="http://twitter.com/masahiroh">@masahiroh</a>です。 <a href="http://atnd.org/events/10497">JavaScript Advent Calendar</a> の最終日です。クリスマスだけど空気を読まずに Node.js の地味な話をします。ごめんなさい。<br />
<br />
さて、 Node.js では <a href="http://socket.io/">Socket.IO</a> を使えば、 WebSocket を使ったアプリケーションを割と簡単に作れるわけですが、これを Web フレームワークと一緒に使う場合、どうやってセッションを共有したらいいんだろう?とふと思いました。ユーザ名とパスワードをメッセージにのせたらいいんですかね? いや、セッション ID をメッセージにのせればいいのかな? うーん・・と思いながら Github をうろうろしていたら <a href="https://github.com/bmeck/session-web-sockets">SessionWebSocket</a> というアプリケーションを見つけました。セッション管理機能を追加する方法が結構参考になったので、コードリーディングをします、の予定だったのですが、動きがおかしかったので、一部書き直しつつ、コードリーディングします。説明の都合上、元のコメントは残していません。<br />
<br />
<br />
解説に使ったソースコードは <a href="https://github.com/bmeck/session-web-socket">ここ</a> の ma-read ブランチにあります。<br />
<br />
<br />
では、解説していきます。まず、おおまかに言うと、セッション管理の仕組みは次のようになっています。
<br />
<br />
<br />
<ol>
<li>ユーザが最初にページを開いたときに、クライアントは XHR でセッションのトークンを要求します。</li>
<li>サーバはそのトークンをキーとしてセッションオブジェクトを管理しています。クライアントからの要求に応えて、トークンを返します。</li>
<li>トークンを受け取ったら、 WebSocket のコネクションを開いて、そのトークンを送信します。</li>
<li>WebSocket サーバはトークンを受け取ったら、管理しているセッションの有効期限をチェックし、有効ならセキュアなセッションとみなします。</li>
</ol>
<div>
<br /></div>
<div id="container">
<div id="background">
</div>
<table cellpadding="0" cellspacing="0"> <thead>
<tr> <th class="docs"><h1>
server.js </h1>
</th> <th class="code"></th> </tr>
</thead> <tbody>
<tr id="section-1"> <td class="docs"><div class="pilwrap">
<a class="pilcrow" href="http://www.blogger.com/post-edit.g?blogID=5575797318863402249&postID=2923969175891602410#section-1">¶</a> </div>
では、サーバ側のコードから見ていきます。</td> <td class="code"><div class="highlight">
<pre></pre>
</div>
</td> </tr>
<tr id="section-2"> <td class="docs"><div class="pilwrap">
<a class="pilcrow" href="http://www.blogger.com/post-edit.g?blogID=5575797318863402249&postID=2923969175891602410#section-2">¶</a> </div>
依存しているモジュールをインポートしています。インポートしているのは、 Connect, Socket.IO, SessionWebSocket です。</td> <td class="code"><div class="highlight">
<pre><span class="kd">var</span> <span class="nx">connect</span> <span class="o">=</span> <span class="nx">require</span><span class="p">(</span><span class="s2">"connect"</span><span class="p">);</span>
<span class="kd">var</span> <span class="nx">io</span> <span class="o">=</span> <span class="nx">require</span><span class="p">(</span><span class="s2">"socket.io"</span><span class="p">);</span>
<span class="kd">var</span> <span class="nx">sws</span> <span class="o">=</span> <span class="nx">require</span><span class="p">(</span><span class="s2">"../sws.js"</span><span class="p">)();</span></pre>
</div>
</td> </tr>
<tr id="section-3"> <td class="docs"><div class="pilwrap">
<a class="pilcrow" href="http://www.blogger.com/post-edit.g?blogID=5575797318863402249&postID=2923969175891602410#section-3">¶</a> </div>
まずは Connect で Web サーバをつくります。 Connect は Web アプリケーション用のミドルウェアフレームワークです。決められたインターフェースに従ってつくられたアプリケーションを pluggable なミドルウェアとして扱うことができます。</td> <td class="code"><div class="highlight">
<pre></pre>
</div>
</td> </tr>
<tr id="section-4"> <td class="docs"><div class="pilwrap">
<a class="pilcrow" href="http://www.blogger.com/post-edit.g?blogID=5575797318863402249&postID=2923969175891602410#section-4">¶</a> </div>
createServer の引数に渡しているのがミドルウェアです。</td> <td class="code"><div class="highlight">
<pre><span class="kd">var</span> <span class="nx">server</span> <span class="o">=</span> <span class="nx">connect</span><span class="p">.</span><span class="nx">createServer</span><span class="p">(</span></pre>
</div>
</td> </tr>
<tr id="section-5"> <td class="docs"><div class="pilwrap">
<a class="pilcrow" href="http://www.blogger.com/post-edit.g?blogID=5575797318863402249&postID=2923969175891602410#section-5">¶</a> </div>
HTTP のセッションを管理しています。</td> <td class="code"><div class="highlight">
<pre> <span class="nx">connect</span><span class="p">.</span><span class="nx">cookieDecoder</span><span class="p">(),</span>
<span class="nx">connect</span><span class="p">.</span><span class="nx">session</span><span class="p">(),</span></pre>
</div>
</td> </tr>
<tr id="section-6"> <td class="docs"><div class="pilwrap">
<a class="pilcrow" href="http://www.blogger.com/post-edit.g?blogID=5575797318863402249&postID=2923969175891602410#section-6">¶</a> </div>
今回の主役のひとり。セッションのトークンを発行します。</td> <td class="code"><div class="highlight">
<pre> <span class="nx">sws</span><span class="p">.</span><span class="nx">http</span><span class="p">,</span></pre>
</div>
</td> </tr>
<tr id="section-7"> <td class="docs"><div class="pilwrap">
<a class="pilcrow" href="http://www.blogger.com/post-edit.g?blogID=5575797318863402249&postID=2923969175891602410#section-7">¶</a> </div>
これは静的ファイルを扱います。</td> <td class="code"><div class="highlight">
<pre> <span class="nx">connect</span><span class="p">.</span><span class="nx">staticProvider</span><span class="p">(</span><span class="nx">__dirname</span><span class="o">+</span><span class="s2">"/static"</span><span class="p">)</span>
<span class="p">);</span></pre>
</div>
</td> </tr>
<tr id="section-8"> <td class="docs"><div class="pilwrap">
<a class="pilcrow" href="http://www.blogger.com/post-edit.g?blogID=5575797318863402249&postID=2923969175891602410#section-8">¶</a> </div>
サーバをポート 8000 番で起動します。</td> <td class="code"><div class="highlight">
<pre><span class="nx">server</span><span class="p">.</span><span class="nx">listen</span><span class="p">(</span><span class="mi">8000</span><span class="p">);</span></pre>
</div>
</td> </tr>
<tr id="section-9"> <td class="docs"><div class="pilwrap">
<a class="pilcrow" href="http://www.blogger.com/post-edit.g?blogID=5575797318863402249&postID=2923969175891602410#section-9">¶</a> </div>
次に、 WebSocket のサーバを準備します。</td> <td class="code"><div class="highlight">
<pre></pre>
</div>
</td> </tr>
<tr id="section-10"> <td class="docs"><div class="pilwrap">
<a class="pilcrow" href="http://www.blogger.com/post-edit.g?blogID=5575797318863402249&postID=2923969175891602410#section-10">¶</a> </div>
さきほどの Web サーバが WebSocket を扱えるようにしてやります。</td> <td class="code"><div class="highlight">
<pre><span class="kd">var</span> <span class="nx">socket</span> <span class="o">=</span> <span class="nx">io</span><span class="p">.</span><span class="nx">listen</span><span class="p">(</span><span class="nx">server</span><span class="p">);</span></pre>
</div>
</td> </tr>
<tr id="section-11"> <td class="docs"><div class="pilwrap">
<a class="pilcrow" href="http://www.blogger.com/post-edit.g?blogID=5575797318863402249&postID=2923969175891602410#section-11">¶</a> </div>
イベントハンドラを設定します。引数に渡している sws.ws がもうひとりの主役です。 WebSocket 側のセッションを管理しています。こんなふうにコールバックにコールバックを渡すあたりがたまらないですね。</td> <td class="code"><div class="highlight">
<pre><span class="nx">socket</span><span class="p">.</span><span class="nx">on</span><span class="p">(</span><span class="s1">'connection'</span><span class="p">,</span> <span class="nx">sws</span><span class="p">.</span><span class="nx">ws</span><span class="p">(</span><span class="kd">function</span><span class="p">(</span><span class="nx">client</span><span class="p">)</span> <span class="p">{</span></pre>
</div>
</td> </tr>
<tr id="section-12"> <td class="docs"><div class="pilwrap">
<a class="pilcrow" href="http://www.blogger.com/post-edit.g?blogID=5575797318863402249&postID=2923969175891602410#section-12">¶</a> </div>
認証済みの場合のイベントハンドラです。セッション ID を出力してみます。</td> <td class="code"><div class="highlight">
<pre> <span class="nx">client</span><span class="p">.</span><span class="nx">on</span><span class="p">(</span><span class="s2">"secure"</span><span class="p">,</span> <span class="kd">function</span><span class="p">()</span> <span class="p">{</span>
<span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="s2">"SECURE"</span><span class="p">);</span>
<span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="nx">client</span><span class="p">.</span><span class="nx">session</span><span class="p">.</span><span class="nx">req</span><span class="p">.</span><span class="nx">sessionID</span><span class="p">);</span>
<span class="p">});</span></pre>
</div>
</td> </tr>
<tr id="section-13"> <td class="docs"><div class="pilwrap">
<a class="pilcrow" href="http://www.blogger.com/post-edit.g?blogID=5575797318863402249&postID=2923969175891602410#section-13">¶</a> </div>
認証が済んでいない場合のイベントハンドラです。</td> <td class="code"><div class="highlight">
<pre> <span class="nx">client</span><span class="p">.</span><span class="nx">on</span><span class="p">(</span><span class="s2">"insecure"</span><span class="p">,</span> <span class="kd">function</span><span class="p">()</span> <span class="p">{</span>
<span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="s2">"INSECURE ACCESS"</span><span class="p">);</span>
<span class="p">});</span></pre>
</div>
</td> </tr>
<tr id="section-14"> <td class="docs"><div class="pilwrap">
<a class="pilcrow" href="http://www.blogger.com/post-edit.g?blogID=5575797318863402249&postID=2923969175891602410#section-14">¶</a> </div>
メッセージ受信時のイベントハンドラです。</td> <td class="code"><div class="highlight">
<pre> <span class="nx">client</span><span class="p">.</span><span class="nx">on</span><span class="p">(</span><span class="s2">"message"</span><span class="p">,</span> <span class="kd">function</span><span class="p">(</span><span class="nx">msg</span><span class="p">)</span> <span class="p">{</span>
<span class="nx">client</span><span class="p">.</span><span class="nx">send</span><span class="p">(</span><span class="nx">msg</span><span class="p">);</span>
<span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="s2">"MSG:"</span><span class="o">+</span><span class="nx">msg</span><span class="p">);</span>
<span class="p">});</span>
<span class="p">}));</span>
</pre>
</div>
</td> </tr>
</tbody> </table>
</div>
<div id="container">
<div id="background">
</div>
<table cellpadding="0" cellspacing="0"> <thead>
<tr> <th class="docs"><h1>
sws.js </h1>
</th> <th class="code"></th> </tr>
</thead> <tbody>
<tr id="section-1"> <td class="docs"><div class="pilwrap">
<a class="pilcrow" href="http://www.blogger.com/post-edit.g?blogID=5575797318863402249&postID=2923969175891602410#section-1">¶</a> </div>
</td> <td class="code"><div class="highlight">
<pre><span class="kd">var</span> <span class="nx">util</span> <span class="o">=</span> <span class="nx">require</span><span class="p">(</span><span class="s1">'util'</span><span class="p">);</span></pre>
</div>
</td> </tr>
<tr id="section-2"> <td class="docs"><div class="pilwrap">
<a class="pilcrow" href="http://www.blogger.com/post-edit.g?blogID=5575797318863402249&postID=2923969175891602410#section-2">¶</a> </div>
では、いよいよセッション管理のミドルウェアについて見ていきます。</td> <td class="code"><div class="highlight">
<pre></pre>
</div>
</td> </tr>
<tr id="section-3"> <td class="docs"><div class="pilwrap">
<a class="pilcrow" href="http://www.blogger.com/post-edit.g?blogID=5575797318863402249&postID=2923969175891602410#section-3">¶</a> </div>
関数を exports にセットしています。先ほどアプリケーション側で require したときに呼んでいました。引数からオプションを受け取るために関数にしていたわけですね。</td> <td class="code"><div class="highlight">
<pre><span class="nx">module</span><span class="p">.</span><span class="nx">exports</span> <span class="o">=</span> <span class="kd">function</span> <span class="nx">verifier</span><span class="p">(</span><span class="nx">options</span><span class="p">)</span>
<span class="p">{</span></pre>
</div>
</td> </tr>
<tr id="section-4"> <td class="docs"><div class="pilwrap">
<a class="pilcrow" href="http://www.blogger.com/post-edit.g?blogID=5575797318863402249&postID=2923969175891602410#section-4">¶</a> </div>
デフォルトの設定です。セッションの生存期間 (ttl = time to live) を設定しています。</td> <td class="code"><div class="highlight">
<pre> <span class="kd">var</span> <span class="nx">defaults</span> <span class="o">=</span> <span class="p">{</span>
<span class="nx">ttl</span><span class="o">:</span> <span class="mi">30</span><span class="o">*</span><span class="mi">1000</span> <span class="c1">// 30 秒</span>
<span class="p">};</span></pre>
</div>
</td> </tr>
<tr id="section-5"> <td class="docs"><div class="pilwrap">
<a class="pilcrow" href="http://www.blogger.com/post-edit.g?blogID=5575797318863402249&postID=2923969175891602410#section-5">¶</a> </div>
引数でもらったオプションを反映させています。</td> <td class="code"><div class="highlight">
<pre> <span class="k">for</span> <span class="p">(</span><span class="kd">var</span> <span class="nx">k</span> <span class="k">in</span> <span class="nx">options</span><span class="p">)</span> <span class="p">{</span>
<span class="nx">defaults</span><span class="p">[</span><span class="nx">k</span><span class="p">]</span> <span class="o">=</span> <span class="nx">options</span><span class="p">[</span><span class="nx">k</span><span class="p">];</span>
<span class="p">}</span></pre>
</div>
</td> </tr>
<tr id="section-6"> <td class="docs"><div class="pilwrap">
<a class="pilcrow" href="http://www.blogger.com/post-edit.g?blogID=5575797318863402249&postID=2923969175891602410#section-6">¶</a> </div>
複数のセッションを扱うためのオブジェクトです。</td> <td class="code"><div class="highlight">
<pre> <span class="kd">var</span> <span class="nx">session_jar</span> <span class="o">=</span> <span class="p">{};</span></pre>
</div>
</td> </tr>
<tr id="section-7"> <td class="docs"><div class="pilwrap">
<a class="pilcrow" href="http://www.blogger.com/post-edit.g?blogID=5575797318863402249&postID=2923969175891602410#section-7">¶</a> </div>
この関数は、セッションのトークンを発行するミドルウェアと、 WebSocket 用のセッション管理の関数をプロパティにもつオブジェクトを返します。</td> <td class="code"><div class="highlight">
<pre> <span class="k">return</span> <span class="p">{</span></pre>
</div>
</td> </tr>
<tr id="section-8"> <td class="docs"><div class="pilwrap">
<a class="pilcrow" href="http://www.blogger.com/post-edit.g?blogID=5575797318863402249&postID=2923969175891602410#section-8">¶</a> </div>
先ほど createServer に渡していたミドルウェアです。
リクエストオブジェクト、レスポンスオブジェクト、next という関数を引数にとる、というのが決められたインターフェースです。</td> <td class="code"><div class="highlight">
<pre> <span class="nx">http</span><span class="o">:</span><span class="kd">function</span> <span class="nx">give_token</span><span class="p">(</span><span class="nx">req</span><span class="p">,</span> <span class="nx">res</span><span class="p">,</span> <span class="nx">next</span><span class="p">)</span> <span class="p">{</span></pre>
</div>
</td> </tr>
<tr id="section-9"> <td class="docs"><div class="pilwrap">
<a class="pilcrow" href="http://www.blogger.com/post-edit.g?blogID=5575797318863402249&postID=2923969175891602410#section-9">¶</a> </div>
リクエストのヘッダを参照し、 'x-access-request-token' フィールドが 'simple' だったらトークンを生成します。</td> <td class="code"><div class="highlight">
<pre> <span class="k">if</span> <span class="p">(</span><span class="nx">req</span><span class="p">.</span><span class="nx">headers</span><span class="p">[</span><span class="s2">"x-access-request-token"</span><span class="p">])</span> <span class="p">{</span>
<span class="k">if</span> <span class="p">(</span><span class="nx">req</span><span class="p">.</span><span class="nx">headers</span><span class="p">[</span><span class="s2">"x-access-request-token"</span><span class="p">].</span><span class="nx">toLowerCase</span><span class="p">()</span><span class="o">===</span><span class="s2">"simple"</span><span class="p">)</span> <span class="p">{</span>
<span class="kd">var</span> <span class="nx">token</span> <span class="o">=</span> <span class="nb">Math</span><span class="p">.</span><span class="nx">random</span><span class="p">();</span></pre>
</div>
</td> </tr>
<tr id="section-10"> <td class="docs"><div class="pilwrap">
<a class="pilcrow" href="http://www.blogger.com/post-edit.g?blogID=5575797318863402249&postID=2923969175891602410#section-10">¶</a> </div>
ユニークな値をとれるまで繰り返します。</td> <td class="code"><div class="highlight">
<pre> <span class="k">while</span> <span class="p">(</span><span class="nx">session_jar</span><span class="p">[</span><span class="nx">token</span><span class="p">])</span> <span class="p">{</span>
<span class="nx">token</span> <span class="o">=</span> <span class="nb">Math</span><span class="p">.</span><span class="nx">random</span><span class="p">();</span>
<span class="p">}</span></pre>
</div>
</td> </tr>
<tr id="section-11"> <td class="docs"><div class="pilwrap">
<a class="pilcrow" href="http://www.blogger.com/post-edit.g?blogID=5575797318863402249&postID=2923969175891602410#section-11">¶</a> </div>
トークンをキーとしてセッションデータと発行した日時を保存しています。 req.session は connect.session が生成したものです。</td> <td class="code"><div class="highlight">
<pre> <span class="kd">var</span> <span class="nx">tmp</span> <span class="o">=</span> <span class="nb">Date</span><span class="p">.</span><span class="nx">now</span><span class="p">();</span>
<span class="nx">session_jar</span><span class="p">[</span><span class="nx">token</span><span class="p">]</span> <span class="o">=</span> <span class="p">{</span>
<span class="nx">session</span><span class="o">:</span> <span class="nx">req</span><span class="p">.</span><span class="nx">session</span><span class="p">,</span>
<span class="nx">date</span><span class="o">:</span> <span class="nx">tmp</span><span class="p">,</span>
<span class="nx">id</span><span class="o">:</span> <span class="nx">req</span><span class="p">.</span><span class="nx">sessionID</span>
<span class="p">};</span></pre>
</div>
</td> </tr>
<tr id="section-12"> <td class="docs"><div class="pilwrap">
<a class="pilcrow" href="http://www.blogger.com/post-edit.g?blogID=5575797318863402249&postID=2923969175891602410#section-12">¶</a> </div>
レスポンスを生成します。トークンと発行日時を JSON で返しています。</td> <td class="code"><div class="highlight">
<pre> <span class="nx">res</span><span class="p">.</span><span class="nx">writeHead</span><span class="p">(</span><span class="mi">200</span><span class="p">);</span>
<span class="nx">res</span><span class="p">.</span><span class="nx">end</span><span class="p">(</span><span class="s1">'{"x-access-token": "'</span><span class="o">+</span><span class="nx">token</span><span class="o">+</span><span class="s1">';'</span><span class="o">+</span><span class="nx">tmp</span><span class="o">+</span><span class="s1">'"}'</span><span class="p">);</span>
<span class="k">return</span><span class="p">;</span>
<span class="p">}</span>
<span class="p">}</span></pre>
</div>
</td> </tr>
<tr id="section-13"> <td class="docs"><div class="pilwrap">
<a class="pilcrow" href="http://www.blogger.com/post-edit.g?blogID=5575797318863402249&postID=2923969175891602410#section-13">¶</a> </div>
'x-access-request-token' フィールドがリクエストのヘッダにない場合は、このミドルウェアはやることがないので、 next を呼んで次のミドルウェアに処理をまかせます。</td> <td class="code"><div class="highlight">
<pre> <span class="k">if</span> <span class="p">(</span><span class="nx">next</span><span class="p">)</span> <span class="p">{</span>
<span class="nx">next</span><span class="p">();</span>
<span class="p">}</span>
<span class="p">}</span></pre>
</div>
</td> </tr>
<tr id="section-14"> <td class="docs"><div class="pilwrap">
<a class="pilcrow" href="http://www.blogger.com/post-edit.g?blogID=5575797318863402249&postID=2923969175891602410#section-14">¶</a> </div>
こちらは WebSocket のセッションを管理する関数です。</td> <td class="code"><div class="highlight">
<pre> <span class="p">,</span> <span class="nx">ws</span><span class="o">:</span> <span class="kd">function</span> <span class="nx">attach_client</span><span class="p">(</span><span class="nx">cb</span><span class="p">)</span> <span class="p">{</span>
<span class="k">return</span> <span class="kd">function</span> <span class="nx">route_client</span><span class="p">(</span><span class="nx">client</span><span class="p">)</span> <span class="p">{</span></pre>
</div>
</td> </tr>
<tr id="section-15"> <td class="docs"><div class="pilwrap">
<a class="pilcrow" href="http://www.blogger.com/post-edit.g?blogID=5575797318863402249&postID=2923969175891602410#section-15">¶</a> </div>
トークンの有効性をチェックする関数を定義します。</td> <td class="code"><div class="highlight">
<pre> <span class="kd">function</span> <span class="nx">verify</span><span class="p">(</span><span class="nx">token</span><span class="p">)</span> <span class="p">{</span>
<span class="kd">var</span> <span class="nx">tmp</span> <span class="o">=</span> <span class="nx">session_jar</span><span class="p">[</span><span class="nx">token</span><span class="p">];</span></pre>
</div>
</td> </tr>
<tr id="section-16"> <td class="docs"><div class="pilwrap">
<a class="pilcrow" href="http://www.blogger.com/post-edit.g?blogID=5575797318863402249&postID=2923969175891602410#section-16">¶</a> </div>
セッションの期限切れをチェックしています。認証されたら削除しているので、トークンは1回だけしか使わない仕様になっています。</td> <td class="code"><div class="highlight">
<pre> <span class="k">if</span> <span class="p">(</span><span class="nx">tmp</span> <span class="o">&&</span> <span class="nx">tmp</span><span class="p">.</span><span class="nx">date</span> <span class="o">></span> <span class="nb">Date</span><span class="p">.</span><span class="nx">now</span><span class="p">()</span> <span class="o">-</span> <span class="nx">defaults</span><span class="p">.</span><span class="nx">ttl</span><span class="p">)</span> <span class="p">{</span>
<span class="kd">var</span> <span class="nx">session</span> <span class="o">=</span> <span class="nx">tmp</span><span class="p">;</span>
<span class="k">delete</span> <span class="nx">session_jar</span><span class="p">[</span><span class="nx">token</span><span class="p">];</span>
<span class="k">return</span> <span class="nx">session</span><span class="p">;</span>
<span class="p">}</span>
<span class="k">return</span> <span class="kc">false</span><span class="p">;</span>
<span class="p">}</span></pre>
</div>
</td> </tr>
<tr id="section-17"> <td class="docs"><div class="pilwrap">
<a class="pilcrow" href="http://www.blogger.com/post-edit.g?blogID=5575797318863402249&postID=2923969175891602410#section-17">¶</a> </div>
'message' に対するイベントハンドラを設定します。トークンをチェックしています。この関数を実行するのは最初にメッセージを受信したときだけです。</td> <td class="code"><div class="highlight">
<pre> <span class="nx">client</span><span class="p">.</span><span class="nx">once</span><span class="p">(</span><span class="s1">'message'</span><span class="p">,</span> <span class="kd">function</span> <span class="nx">first_verify</span><span class="p">(</span><span class="nx">msg</span><span class="p">)</span> <span class="p">{</span></pre>
</div>
</td> </tr>
<tr id="section-18"> <td class="docs"><div class="pilwrap">
<a class="pilcrow" href="http://www.blogger.com/post-edit.g?blogID=5575797318863402249&postID=2923969175891602410#section-18">¶</a> </div>
メッセージで渡されたトークンが有効な場合は、クライアントにセッションデータを設定して、'secure' イベントをクライアントに対して発行します。</td> <td class="code"><div class="highlight">
<pre> <span class="kd">var</span> <span class="nx">session</span> <span class="o">=</span> <span class="nx">verify</span><span class="p">(</span><span class="nx">msg</span><span class="p">)</span> <span class="o">||</span> <span class="kc">false</span><span class="p">;</span>
<span class="k">if</span> <span class="p">(</span><span class="nx">session</span><span class="p">)</span> <span class="p">{</span>
<span class="nx">client</span><span class="p">.</span><span class="nx">_session</span> <span class="o">=</span> <span class="nx">session</span><span class="p">;</span>
<span class="nx">client</span><span class="p">.</span><span class="nx">session</span> <span class="o">=</span> <span class="nx">session</span><span class="p">.</span><span class="nx">session</span><span class="p">;</span>
<span class="nx">client</span><span class="p">.</span><span class="nx">emit</span><span class="p">(</span><span class="s2">"secure"</span><span class="p">);</span></pre>
</div>
</td> </tr>
<tr id="section-19"> <td class="docs"><div class="pilwrap">
<a class="pilcrow" href="http://www.blogger.com/post-edit.g?blogID=5575797318863402249&postID=2923969175891602410#section-19">¶</a> </div>
セッションが有効だったので、 client.on を元に戻して、退避しておいた 'message' に対するイベントハンドラをバインドします。退避する処理は下の方にでてきます。</td> <td class="code"><div class="highlight">
<pre> <span class="nx">client</span><span class="p">.</span><span class="nx">on</span> <span class="o">=</span> <span class="nx">oldon</span><span class="p">;</span>
<span class="k">for</span> <span class="p">(</span><span class="kd">var</span> <span class="nx">i</span> <span class="o">=</span> <span class="mi">0</span><span class="p">,</span> <span class="nx">l</span> <span class="o">=</span> <span class="nx">onmsgs</span><span class="p">.</span><span class="nx">length</span><span class="p">;</span> <span class="nx">i</span> <span class="o"><</span> <span class="nx">l</span><span class="p">;</span> <span class="nx">i</span><span class="o">++</span><span class="p">)</span> <span class="p">{</span>
<span class="nx">client</span><span class="p">.</span><span class="nx">on</span><span class="p">(</span><span class="s1">'message'</span><span class="p">,</span> <span class="nx">onmsgs</span><span class="p">[</span><span class="nx">i</span><span class="p">]);</span>
<span class="p">}</span>
<span class="p">}</span></pre>
</div>
</td> </tr>
<tr id="section-20"> <td class="docs"><div class="pilwrap">
<a class="pilcrow" href="http://www.blogger.com/post-edit.g?blogID=5575797318863402249&postID=2923969175891602410#section-20">¶</a> </div>
セッションデータがないので 'insecure' イベントをクライアントに対して発行します。</td> <td class="code"><div class="highlight">
<pre> <span class="k">else</span> <span class="p">{</span>
<span class="nx">client</span><span class="p">.</span><span class="nx">emit</span><span class="p">(</span><span class="s2">"insecure"</span><span class="p">);</span>
<span class="p">}</span>
<span class="p">});</span></pre>
</div>
</td> </tr>
<tr id="section-21"> <td class="docs"><div class="pilwrap">
<a class="pilcrow" href="http://www.blogger.com/post-edit.g?blogID=5575797318863402249&postID=2923969175891602410#section-21">¶</a> </div>
'message' イベントに対するイベントハンドラは、セッションが有効かどうかのチェックが済んだあとから実行されるようにしたいので、 client.on を 'message' イベントのハンドラだけ退避するように書き換えます。</td> <td class="code"><div class="highlight">
<pre> <span class="kd">var</span> <span class="nx">onmsgs</span> <span class="o">=</span> <span class="p">[];</span>
<span class="kd">var</span> <span class="nx">oldon</span> <span class="o">=</span> <span class="nx">client</span><span class="p">.</span><span class="nx">on</span><span class="p">;</span>
<span class="nx">client</span><span class="p">.</span><span class="nx">on</span> <span class="o">=</span> <span class="kd">function</span><span class="p">(</span><span class="nx">name</span><span class="p">,</span> <span class="nx">fn</span><span class="p">)</span> <span class="p">{</span>
<span class="k">if</span> <span class="p">(</span><span class="nx">name</span> <span class="o">===</span> <span class="s2">"message"</span><span class="p">)</span> <span class="nx">onmsgs</span><span class="p">[</span><span class="nx">onmsgs</span><span class="p">.</span><span class="nx">length</span><span class="p">]</span> <span class="o">=</span> <span class="nx">fn</span><span class="p">;</span>
<span class="k">else</span> <span class="nx">oldon</span><span class="p">.</span><span class="nx">apply</span><span class="p">(</span><span class="k">this</span><span class="p">,</span> <span class="nx">arguments</span><span class="p">);</span>
<span class="p">};</span>
</pre>
</div>
</td> </tr>
<tr id="section-22"> <td class="docs"><div class="pilwrap">
<a class="pilcrow" href="http://www.blogger.com/post-edit.g?blogID=5575797318863402249&postID=2923969175891602410#section-22">¶</a> </div>
呼び出し元にクライアントを渡します。</td> <td class="code"><div class="highlight">
<pre> <span class="nx">cb</span><span class="p">(</span><span class="nx">client</span><span class="p">);</span>
<span class="p">};</span>
<span class="p">}</span>
<span class="p">};</span>
<span class="p">};</span>
</pre>
</div>
</td> </tr>
</tbody> </table>
</div>
<div id="container">
<div id="background">
</div>
<table cellpadding="0" cellspacing="0"> <thead>
<tr> <th class="docs"><h1>
client.js </h1>
</th> <th class="code"></th> </tr>
</thead> <tbody>
<tr id="section-1"> <td class="docs"><div class="pilwrap">
<a class="pilcrow" href="http://www.blogger.com/post-edit.g?blogID=5575797318863402249&postID=2923969175891602410#section-1">¶</a> </div>
次にクライアント側を見ていきます。</td> <td class="code"><div class="highlight">
<pre></pre>
</div>
</td> </tr>
<tr id="section-2"> <td class="docs"><div class="pilwrap">
<a class="pilcrow" href="http://www.blogger.com/post-edit.g?blogID=5575797318863402249&postID=2923969175891602410#section-2">¶</a> </div>
SessionWebSocket で、トークンのやりとりをしてから、 'message' に対するイベントハンドラをバインドします。</td> <td class="code"><div class="highlight">
<pre><span class="nx">SessionWebSocket</span><span class="p">(</span><span class="kd">function</span><span class="p">(</span><span class="nx">socket</span><span class="p">){</span>
<span class="nx">socket</span><span class="p">.</span><span class="nx">on</span><span class="p">(</span><span class="s1">'message'</span><span class="p">,</span><span class="kd">function</span><span class="p">(</span><span class="nx">msg</span><span class="p">){</span>
<span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="s2">"SWS:"</span><span class="p">,</span><span class="nx">msg</span><span class="p">);</span>
<span class="p">});</span></pre>
</div>
</td> </tr>
<tr id="section-3"> <td class="docs"><div class="pilwrap">
<a class="pilcrow" href="http://www.blogger.com/post-edit.g?blogID=5575797318863402249&postID=2923969175891602410#section-3">¶</a> </div>
セッションが確立した場合、このメッセージは受信されます。</td> <td class="code"><div class="highlight">
<pre> <span class="nx">setInterval</span><span class="p">(</span><span class="kd">function</span><span class="p">()</span> <span class="p">{</span>
<span class="nx">socket</span><span class="p">.</span><span class="nx">send</span><span class="p">(</span><span class="s1">'Succeed!'</span><span class="p">);</span>
<span class="p">},</span> <span class="mi">1000</span><span class="p">);</span>
<span class="p">});</span></pre>
</div>
</td> </tr>
<tr id="section-4"> <td class="docs"><div class="pilwrap">
<a class="pilcrow" href="http://www.blogger.com/post-edit.g?blogID=5575797318863402249&postID=2923969175891602410#section-4">¶</a> </div>
セキュアでないコネクションを示すための例です。こちらで送信したメッセージは弾かれます。</td> <td class="code"><div class="highlight">
<pre><span class="kd">var</span> <span class="nx">socket</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">io</span><span class="p">.</span><span class="nx">Socket</span><span class="p">()</span>
<span class="nx">socket</span><span class="p">.</span><span class="nx">connect</span><span class="p">();</span>
<span class="nx">socket</span><span class="p">.</span><span class="nx">send</span><span class="p">(</span><span class="s2">"OH NOES"</span><span class="p">);</span>
</pre>
</div>
</td> </tr>
</tbody> </table>
</div>
<div id="container">
<div id="background">
</div>
<table cellpadding="0" cellspacing="0"> <thead>
<tr> <th class="docs"><h1>
sws.js </h1>
</th> <th class="code"></th> </tr>
</thead> <tbody>
<tr id="section-1"> <td class="docs"><div class="pilwrap">
<a class="pilcrow" href="http://www.blogger.com/post-edit.g?blogID=5575797318863402249&postID=2923969175891602410#section-1">¶</a> </div>
次に クライアントサイドのモジュールのコードです。トークンを取得して、返ってきたらコネクションを張り直します。</td> <td class="code"><div class="highlight">
<pre><span class="kd">function</span> <span class="nx">SessionWebSocket</span><span class="p">(</span><span class="nx">cb</span><span class="p">)</span> <span class="p">{</span>
<span class="kd">var</span> <span class="nx">xhr</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">XMLHttpRequest</span><span class="p">()</span>
<span class="nx">xhr</span><span class="p">.</span><span class="nx">open</span><span class="p">(</span><span class="s2">"GET"</span><span class="p">,</span><span class="s2">"/?no-cache="</span><span class="o">+</span><span class="p">(</span><span class="k">new</span> <span class="nb">Date</span><span class="p">()</span><span class="o">+</span><span class="mi">0</span><span class="p">));</span></pre>
</div>
</td> </tr>
<tr id="section-2"> <td class="docs"><div class="pilwrap">
<a class="pilcrow" href="http://www.blogger.com/post-edit.g?blogID=5575797318863402249&postID=2923969175891602410#section-2">¶</a> </div>
トークンを取得するためのヘッダを設定します。</td> <td class="code"><div class="highlight">
<pre> <span class="nx">xhr</span><span class="p">.</span><span class="nx">setRequestHeader</span><span class="p">(</span><span class="s2">"x-access-request-token"</span><span class="p">,</span><span class="s2">"simple"</span><span class="p">);</span></pre>
</div>
</td> </tr>
<tr id="section-3"> <td class="docs"><div class="pilwrap">
<a class="pilcrow" href="http://www.blogger.com/post-edit.g?blogID=5575797318863402249&postID=2923969175891602410#section-3">¶</a> </div>
レスポンスに対するコールバックを設定します。</td> <td class="code"><div class="highlight">
<pre> <span class="nx">xhr</span><span class="p">.</span><span class="nx">onreadystatechange</span> <span class="o">=</span> <span class="kd">function</span> <span class="nx">xhrverify</span><span class="p">()</span> <span class="p">{</span></pre>
</div>
</td> </tr>
<tr id="section-4"> <td class="docs"><div class="pilwrap">
<a class="pilcrow" href="http://www.blogger.com/post-edit.g?blogID=5575797318863402249&postID=2923969175891602410#section-4">¶</a> </div>
受信完了</td> <td class="code"><div class="highlight">
<pre> <span class="k">if</span> <span class="p">(</span><span class="nx">xhr</span><span class="p">.</span><span class="nx">readyState</span> <span class="o">===</span> <span class="mi">4</span><span class="p">)</span> <span class="p">{</span>
<span class="kd">var</span> <span class="nx">tmp</span><span class="p">;</span>
<span class="k">try</span> <span class="p">{</span></pre>
</div>
</td> </tr>
<tr id="section-5"> <td class="docs"><div class="pilwrap">
<a class="pilcrow" href="http://www.blogger.com/post-edit.g?blogID=5575797318863402249&postID=2923969175891602410#section-5">¶</a> </div>
トークンが返ってきていたら、新規に WebSocket の接続を開始します。</td> <td class="code"><div class="highlight">
<pre> <span class="k">if</span> <span class="p">(</span><span class="nx">tmp</span> <span class="o">=</span> <span class="nx">JSON</span><span class="p">.</span><span class="nx">parse</span><span class="p">(</span><span class="nx">xhr</span><span class="p">.</span><span class="nx">responseText</span><span class="p">)[</span><span class="s2">"x-access-token"</span><span class="p">])</span> <span class="p">{</span>
<span class="kd">var</span> <span class="nx">socket</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">io</span><span class="p">.</span><span class="nx">Socket</span><span class="p">();</span>
<span class="nx">cb</span><span class="p">(</span><span class="nx">socket</span><span class="p">);</span>
<span class="nx">socket</span><span class="p">.</span><span class="nx">connect</span><span class="p">();</span></pre>
</div>
</td> </tr>
<tr id="section-6"> <td class="docs"><div class="pilwrap">
<a class="pilcrow" href="http://www.blogger.com/post-edit.g?blogID=5575797318863402249&postID=2923969175891602410#section-6">¶</a> </div>
取得したトークンを送っています</td> <td class="code"><div class="highlight">
<pre> <span class="nx">socket</span><span class="p">.</span><span class="nx">send</span><span class="p">(</span><span class="nx">tmp</span><span class="p">.</span><span class="nx">split</span><span class="p">(</span><span class="s2">";"</span><span class="p">)[</span><span class="mi">0</span><span class="p">]);</span>
<span class="p">}</span>
<span class="p">}</span>
<span class="k">catch</span><span class="p">(</span><span class="nx">e</span><span class="p">)</span> <span class="p">{</span>
<span class="k">throw</span> <span class="k">new</span> <span class="nb">Error</span><span class="p">(</span><span class="s2">"XMLHttpResponse had non-json response, possible cache issue?"</span><span class="p">)</span>
<span class="p">}</span>
<span class="p">}</span>
<span class="p">};</span></pre>
</div>
</td> </tr>
<tr id="section-7"> <td class="docs"><div class="pilwrap">
<a class="pilcrow" href="http://www.blogger.com/post-edit.g?blogID=5575797318863402249&postID=2923969175891602410#section-7">¶</a> </div>
リクエストを送信します。</td> <td class="code"><div class="highlight">
<pre> <span class="nx">xhr</span><span class="p">.</span><span class="nx">send</span><span class="p">();</span>
<span class="p">}</span>
</pre>
</div>
</td> </tr>
</tbody> </table>
</div>
<br />
<br />
<br />
以上でおしまいです。個人的には Connect のミドルウェアとしてセッション管理を実装するあたりや、イベントハンドラを一旦避けるあたりの処理が面白かったです。改善の余地がちょこちょこあるので、手を入れていこうと思います。
<br />
<br />
<br />
* このドキュメントは <a href="https://github.com/jashkenas/docco">docco</a> をつかってコードから生成しました。Unknownnoreply@blogger.com11