2011年10月21日金曜日

Node.jsが面白い

Node.jsは、よく「サーバサイドのJavaScript実行系」と言われるが、よく見ると、Google ChromeのJavaScriptエンジン「V8」を実行する処理系そのもの、といえる。

一般的な説明だけでは、「Apacheに組み込むのか? それともCGIとして実行するのか?」などの疑問が生じるが、生成されたコマンドnodeをただ実行してみると、プロンプトが出ることで、「つまりインタプリタそのもの」ということがわかる。

> 3+5
8
のような具合だ。JavaScriptのコマンドをそのまま受け取って実行結果を返してくる。

プログラムの実行は、ファイル名を引数として与えてやることになる。そして、プログラムのなかで、TCP/IPのサーバやクライアントとなるモジュールを使ったメソッドなどを書いて、それを実行してやることでWebサーバにもなれる、というわけだ。

http://nodejs.org/ のトップページにある1時間程度の講演が、すべてを物語っている。JavaScriptを多少なりとも触ったことがあるプログラマなら必見だと思う。

Macの場合、MacPortsにnodejsとnodejs-develの2つがある。後述するCalipsoは、0.4系のNode.jsでなければ依存するモジュールのバージョンが合わずインストールに失敗するので、nodejsのほうを入れてやることになる。

Node.jsをサポートするモジュール群は、Perlなどのモジュールと似たような管理をされていて、npmというコマンドで管理することになる。といっても、npmは内部でnodeを呼び出しているので、実際にはJavaScriptが動いているということだ。

公式サイトでは、curlを使って直接ソースを取得してインストールする方法が紹介されているが、MacPortsでnpmをインストールするほうがなにかといいだろう。

Node.jsでサーバサイドJavaScriptがプログラムできるのなら、何か適当なサンプルになるものはないかと探したところ、CalipsoというCMSが開発されていることがわかった。CMSはバックエンドにデータベースサーバを持つが、CalipsoはMongoDBだ。MongoDBはいわゆるNoSQL(SQLでクエリしないデータベースサーバ)であり、JSONでデータのやりとりをするので、Node.jsにうってつけといえる。

問題は、今日現在、MacPortsにあるMongoDBはXcode 4.2ではコンパイルできないこと。というより、LLVM GCCに対応していないようで、clangでコンパイルが通らない。そこで、/usr/bin/{gcc,cpp,g++}を使うように、オプションを与えてportコマンドを実行するというkludgeがMacPortsのメーリングリストで紹介されていた。


sudo port install mongodb configure.cc=/usr/bin/gcc configure.cpp=/usr/bin/cpp configure.cxx=/usr/bin/g++
「configure.??=xxx」というオプションで、それぞれを指定するということができるようだ。実際、-vオプションをつけて様子を見ていたところ、clangやclang++が使われることもなく、見慣れたgccによるコンパイルが行われていた。

MacPortsなので、インストールしたMongoDBは、port load mongodbコマンドで起動してやることになる。そのあとで、Calipsoのサイトにあるように、Git cloneしてソースを取得し、npm installすればよい。実行は、node  appでとりあえず、コンソールにログが出る形で試すことができる。ポート番号は3000番になっているので、ブラウザから適当にhttp://127.0.0.1:3000/などとして開いてみれば、動作していることがわかる。

というところまでやったのだが、あとが続かない。とりあえずきょうはここまで。