Ruby on Railsの生みの親、DHHが在籍する37signalsがMac OS X用のRackサーバ「Pow」をオープンソースで公開しました。ちょっとこれまでにない種類のプロダクトで、その使い勝手のシンプルさとアイデアに鼻血が出そうになりました。実装にNode.jsとCoffeeScriptを使っているというのも面白いです。
Powの売りは、「Zero-configuration」(設定要らず)ということで、複数のRails/Sinatraアプリをローカルで動かして開発するようなときに、仮想的なドメイン名を手軽に割り当ててアクセスできるようにしてくれる、というものです。インストールはcurlのコマンド一発で、
$ curl get.pow.cx | sh
とするだけ。そして、RailsやSinatraなどのRackアプリのディレクトリをPowのディレクトリにシンボリックリンクを貼るだけです。
$ cd ~/.pow$ ln -s ~/Projects/myapp
これだけで、このアプリには「http://myapp.dev」というホスト名でアクセスできるようになります。Rails同様にConvention over Configurationの精神で、ホスト名は「ディレクトリ名.dev」と決め打ちです。Powはインストール時にlaunchd(Mac版のinit、inetdみたいなもの)を使ってファイアウォール設定を書き足していて、「ディレクトリ名.dev」というリクエストが来ると、powディレクトリ下のRackアプリを起動するという仕組みです。1アプリ当たり、最大2ワーカーが起動し、15分間アクセスがないとアプリを終了させます。
「localhost」の代わりに名前を付けるために、これまでは「/etc/hosts」を手で書き換えたりしていて、これだと複数アプリを開発環境で動かすための設定が煩雑だった、ということです。37signalsは自社のオンラインのサービス群で共通して使う決済アプリなどがあり、開発に当たっては複数アプリを起動する必要があり、この設定が面倒だったということです。
サブドメインを設定して違うアプリに割り当てたり、アプリのディレクトリトップに「.rvmrc」を書いておいて、異なるバージョンのRuby処理系を使って各アプリを起動したりもできます
いろいろなアプリを同時並行で開発しているケースなどに便利かもしれませんね。「/etc/hosts」を手でいじるよりも良いアプローチのように思えますから、複数アプリを開発するわけでなくても、Powは使われていくようになるのかも、と思いました。
●CoffeeScriptの実例としての面白さ
PowはCoffeeScriptで書かれていて、http://pow.cx/docs/を見ると、注釈付きでコードが見られます。CoffeeScriptはJavaScriptにコンパイルすることを前提とした言語で、JavaScriptよりもPythonやRubyに近い感じで書けて、例えばPythonのリスト内包表記のような配列内包表記で、
cubes = (math.cube num for num in list)
のように面倒なループがスッキリ書けたりするようです。このコードは、
cubes = (function() { var _i, _len, _results; _results = []; for (_i = 0, _len = list.length; _i < _len; _i++) { num = list[_i]; _results.push(math.cube(num)); } return _results;})();run: cubes
とコンパイルされます。オブジェクトの定義もブレースなしで
math = root: Math.sqrt square: square cube: (x) -> x * square x
のように書けば、
math = { root: Math.sqrt, square: square, cube: function(x) { return x * square(x); }};
にコンパイルされるといった具合です(このへん、CoffeeScriptの公式サイトからサンプルを持ってきています)。打鍵数が多くて嫌われ者(?)のfunctionも不要で、「->」というのでラムダが書けるのってRubyっぽいですよね
CoffeeScriptのリアルなコード例が見れるという意味でもPowは面白いなと思います。
日 | 月 | 火 | 水 | 木 | 金 | 土 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 | 29 |
30 |