2010年10月23日

Realtime Web hack-a-thon

水曜日に リアルタイム Web ハッカソン に行ってきました。 非同期 I/O、イベントドリブン、WebSocket 辺りのキーワードに誘われたのが参加理由です。 後楽園の近くの森ビルから六本木の森ビルに移動したのですが、同じ森ビルでもビルのセキュリティが全然違っていて驚きました。 会場を提供してくれて受付も準備してくれた gree ありがとう ><

やったこととしては、これから流行るかもしれない node.js のハンズオンもある、ということで、 とりあえずインストールして使ってみました。Cygwin なので明らかに茨の道です。 cscript を使う、とか、そういう邪悪なことは考えていません。

クライアントもサーバーも JavaScript で染めてしまおう、という考えは良いんだか悪いんだか賛否両論あることは間違いありませんが、 様々なプログラミング言語で似たようなことを比較してみることは意義深いと思います。 また、 node.js の基礎を提供する V8 を手元で使えるようにしておくと、何かと便利でしょう。 まずは手を動かすことが基本です。そして、基本が大事です。

Windows にインストールする手順

mezo さんがブログに資料を上げてくれていますので、とりあえずザーッと読みます。 こんなにエントリがあるなんて本当に素敵です!

順当な路線で Cygwin を使いますので、手順は次の通りです。

  1. Cygwin のパッケージマネージャーでコンパイラやライブラリなどをインストールする。
  2. node.js のソースパッケージをダウンロードして展開する。
  3. --prefix オプションを指定して configure スクリプトを実行する。 npm のため。
  4. make && make install でバイナリを生成して、動作することを確認する。
  5. npm をインストールする。
  6. npm を使ってモジュールをたくさんインストールする。
  7. express でアプリケーションを作成して、 socket.io を使ってみる。

ビルドエラーを粛々と...

まず "Building node.js on Cygwin (Windows)" を読みます。 で、実行してみます。

$ cd /usr/local/src
$ wget http://nodejs.org/dist/node-v0.2.3.tar.gz
$ tar xzf node-v0.2.3.tar.gz
$ cd node-0.2.3
$ ./configure --prefix=~/local
C:\Python26\python.exe: can't open file '/usr/local/src/node-v0.2.3/tools/waf-light': [Errno 2] No such file or directory

これだから Cygwin は (以下略) 。 でも、wiki に記述されている (python.exe: can't open file 'waf-light') 通りですね。 Cygwin の Python ではなく、Windows に .msi でインストールした Python を参照しています。 Cygwin 用の Python を参照するように変更しましょう。

$ which python
/cygdrive/c/Python26/python

$ ls /usr/bin/python
/usr/bin/python*

$ PATH=/usr/bin:$PATH

$ which python
/usr/bin/python

$ ./configure --prefix=~/local
Checking for program g++ or c++          : /usr/bin/g++
Checking for program cpp                 : /usr/bin/cpp
Checking for program ar                  : /usr/bin/ar
Checking for program ranlib              : /usr/bin/ranlib
Checking for g++                         : ok
Checking for program gcc or cc           : /usr/bin/gcc
      7 [main] python 3840 C:\cygwin\bin\python.exe: *** fatal error - unable to
 remap \\?\C:\cygwin\lib\python2.6\lib-dynload\time.dll to same address as parent: 0x2D0000 != 0x410000
Stack trace:
Frame     Function  Args
002291E8  6102749B  (002291E8, 00000000, 00000000, 00000000)
002294D8  6102749B  (61177B80, 00008000, 00000000, 61179977)
0022A508  61004AFB  (611A136C, 61240954, 002D0000, 00410000)
End of stack trace
      6 [main] python 1760 fork: child 3840 - died waiting for dll loading, errno 11
/usr/local/src/node-v0.2.3/wscript:135: error: could not configure a c compiler!

これだから Cyg (以下略) 。 とはいえ、この辺でつまずくようだと「Cygwin 使ってます」とか言えないので注意が必要です。 というか、またもや wiki に記述されている (unable to remap to same address as parent) 通りですね。 シェルを bash から ash に変更しましょう。ぇ。。。っていう感じかもしれませんが、これでうまくいきます 詳しいことは DLL に関する知識が必要そうなので省きます。 英語のブログエントリ やそのコメントが参考になるかもしれません。

$ ash
(これでシェルが bash から ash に変わる。プロンプトなどが違うはず)

$ /bin/rebaseall -v
(snip)

$ ./configure --prefix=~/local
(snip)

$ make && make install

ビルドに成功するとこんな感じになります。

Cygwin の bash に戻ってもバージョンなどを確認できます。これで node のインストールは完了です。 アプリケーションを作成するまでの設定自体は半分ですけど。

ライブラリをインストール

まずは npm をインストールします。npm は node.js のパッケージマネージャーです。

$ cd ~/local

$ PATH=~/local/bin:$PATH

$ curl http://npmjs.org/install.sh | sh
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100   661  100   661    0     0    807      0 --:--:-- --:--:-- --:--:--  1721
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100  2531  100  2531    0     0   2309      0  0:00:01  0:00:01 --:--:--  6625
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100  576k  100  576k    0     0   109k      0  0:00:05  0:00:05 --:--:--  126k
FIND: Parameter format not correct
FIND: Parameter format not correct
node cli.js cache clean
npm info it worked if it ends with ok
npm info using npm@0.2.4-1
npm ok
node cli.js rm npm
npm info it worked if it ends with ok
npm info using npm@0.2.4-1
npm info not installed npm
npm ok
node cli.js install npm
npm info it worked if it ends with ok
npm info using npm@0.2.4-1
npm ERR! Error: ECONNREFUSED, Could not contact DNS servers
npm ERR!     at IOWatcher.callback (dns:53:15)
npm ERR!     at node.js:768:9
npm ERR! Report this *entire* log at <http://github.com/isaacs/npm/issues>
npm ERR! or email it to <npm-@googlegroups.com>
npm ERR! Just tweeting a tiny part of the error will not be helpful.
npm not ok
make: *** [install] Error 1

と、DNS の設定を忘れていましたので設定してからやり直します。 wiki の3番目に記載されていますが、Cygwin における DNS クエリは内部的には Windows を使います。 しかし、 node.js が使っている C 言語のライブラリは /etc/resolv.conf を使います。 ここでミスマッチが発生するので追記しましょう、ということです。 これだから (以下略) 。

$ cat <<EOF >>/etc/resolv.conf
> nameserver 8.8.8.8
> nameserver 8.8.4.4
> EOF

$ curl http://npmjs.org/install.sh | sh
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100   661  100   661    0     0    797      0 --:--:-- --:--:-- --:--:--  1734
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100  2531  100  2531    0     0   2742      0 --:--:-- --:--:-- --:--:--  7011
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100  576k  100  576k    0     0   105k      0  0:00:05  0:00:05 --:--:--  138k
FIND: Parameter format not correct
FIND: Parameter format not correct
node cli.js cache clean
npm info it worked if it ends with ok
npm info using npm@0.2.4-1
npm ok
node cli.js rm npm
npm info it worked if it ends with ok
npm info using npm@0.2.4-1
npm info not installed npm
npm ok
node cli.js install npm
npm info it worked if it ends with ok
npm info using npm@0.2.4-1
npm info fetch http://registry.npmjs.org/npm/-/npm-0.2.4-1.tgz
npm info install npm@0.2.4-1
npm info preinstall npm@0.2.4-1
npm WARN npm@0.2.4-1 linkMans It seems /home/shigeru/local/share/man might not b
e visible to man
npm WARN npm@0.2.4-1 linkMans For greater justice, please add it to your man pat
h
npm WARN npm@0.2.4-1 linkMans See: `man man`
npm info install npm@0.2.4-1
npm info postinstall npm@0.2.4-1
npm info activate npm@0.2.4-1
npm info preactivate npm@0.2.4-1
npm info activate npm@0.2.4-1
npm info postactivate npm@0.2.4-1
npm info build Success: npm@0.2.4-1
npm ok
It worked

$ ls bin
node.exe*  node-repl*  node-waf*  npm@  npm@0.2.4-1*

次に、 npm を使ってパッケージをインストールします。この辺は mezo さんの資料2と一緒です。 当たり前ですが ~/local/bin にパスが通っていないとダメです。

$ npm install express jade less socket.io
(snip)

$ ls bin
express@           jade@0.5.4*    node.exe*   npm@
express@1.0.0rc4*  lessc@         node-repl*  npm@0.2.4-1*
jade@              lessc@1.0.36*  node-waf*

ライブラリのざっくりとした概要も資料2に書いてある通りですが一応:

  • express は Web アプリケーション・フレームワークで、 express コマンドでプロジェクトの雛形を生成してくれる。
  • less は CSS 拡張のことで、Ruby からポーティングしてきたもの。 (元ネタ)
  • jade はテンプレートエンジンで、HAML みたいなもの。
  • socket.io は WebSocket 用のライブラリ。

ということで express でプロジェクトを作成して app.js を起動します。 public が静的ファイル置き場とのことなので、この辺を地味に変更してみます。 HAML を使ったことはありませんが、 jade!!! 5 で HTML5 を意味するのには驚きました。 あとは Chrome でチャットしてみる、とか。

感想

LT もありました。全然拾いきれませんでしたが、ザザーとリンクです。

  • chatsample ... ハンズオンのサンプルソースコード。
  • Chat & Edit Everywhere! ... どのページでも共同で編集できるようになる Chrome 拡張。
  • Shared paint ... App Engine の Channel API を使ってお絵描きを共有できる。
  • Accense Technology ... WebSocket を使って Twitter の統計を見られる。
  • Joyent Node SmartMachines ... node.js を動かせるホスティング環境。
  • Heroku ... Ruby だけでなく node.js も動かせるらしい?

平日の夜なのでハッカソンにしては短時間でしたが、アプリケーションを動く状態まで持っていける人もいるなど、 手早い人は本当に早いなーとシミジミ関心しました。普段からの心がけも大事です。 とはいえやっぱり Cygwin は制約多いな、とも。。。

あと、「リアルタイム」と聞くと、「制限時間厳しいのかぁ... RTOS って」とか 「ソフトとハードどっち?」とか「 librt とリンクしなきゃいけないの?」 とか、見当違いの考えも浮かびますが、ここで考えている「リアルタイム」は、他の人と一緒に何かできる、ということです。 そういう意味では単純に、プッシュに関するヨモヤマ、という括りになるのかもしれません。

プッシュできると何が嬉しいの?とか、プッシュするときに何が困るの?という疑問を抱く人もたまにいるみたいですが、 別に無くても良いと思っている人にはいらないと思いますし、困ってない人が困り始めることもないと思いますので、 懐疑的に感じる人はそのままにしておくのが良いと思います。 使ってるところでは使ってるよーというフェーズでしょうか。まぁ、気付いてないだけで広く使われているわけですが。

全体を通じて一番共感を覚えたのは、「プッシュってすぐチャットの話になるけど、Twitter のストリーミング API なんかを利用して、今までとは違った見せ方も提供できるんじゃないの?」という yuroyoro さんの LT での発言です。 ウェブ日記がブログになって、 数年前に UGC (User Generated Content) と言うバズワードっぽい言葉が出てきて、 Facebook や Twitter が盛り上がってきて、 これからはソーシャルだ!と言う流れになるなど、言葉を作る人 / 仕掛け人はスゴイなーと関心しますが、大まかな流れは、 ネットワークに繋がる人が驚異的に増えたからできることも増えたよね、ということだと思います。 これまでの多くは、エンドユーザー同士が同時にネットワークに ON になっている状態を想定してのプッシュの扱いが多かったと思いますが、 これからは非同期なんだけど何か一緒にいるっぽい、あるいは遠くのユーザーも近くに感じるかも、という流れになるのかな、と思います。 そこで必要とするユーザーの動作は、リンクをポチぽちクリックすることではなく、ソファでゴロゴロしていること。 つまり、リビングの王様であるテレビが提供していることなのではないかと思った次第です。

終わりに

プッシュのちょっとした利用シーンとして、ウェブカメラを常時起動しておいて、その前にカップラーメンをセットしたら3分後くらいに Twitter へ 「カップラーメン mgmg」と画像付きでポストされると嬉しいかもしれません。 パッケージから推奨時間を自動で認識してくれると良さそうです。 自分へのリマインドにもなりますし、いつカップラーメンを食べたか、というライフログの観点でも有効です (嘘)。 とはいえ、これを自分で作ろうとすると自宅でお湯を沸かす必要があります。 しかし、我が家には電気ポットも無いしコンロは物置と化しているという致命的な問題があります。 再来週は立冬なので、そろそろ電気ポットを買おうかなぁ、と思ったのでした。

コメントを投稿