AnypowとNet::EmptyPortをリリースしました

node でアプリ書きたい →Grunt がイケてる → 色々整備したけど開発環境のサーバ起動は Pow が使いたい → 空いてる TCP ポート探せればなんとかなりそう、という感じの yack を経て、Anypow と Net::EmptyPort という gem をリリースしました。実働 2 日なので実験レベルですが自分では使っていこうと思います。cf. Released Anypow and Net::EmptyPort

Pow?

Pow は Rails やってる人はもはや使うのが当たり前かなと思うのですが、そうでない人にはあんまり有名じゃなさそう。僕も 1 ヶ月くらい前に Rails4 を始めるまでは知りませんでした。。。何をするツールかというと、Mac 限定ですがhttp://myapp.devという URL にアクセスすると、勝手に指定したディレクトリの Rack アプリを起動してくれてアクセスできるという開発支援ツールです。

何が良いかって、ローカルで起動するアプリのポート番号とか考えなくていいし、そもそも事前に起動しておく必要もないし、80 番ポートで名前を使って普通にアクセスできるので、ローカルでいろんな種類のアプリを開発する人には持ってこいのツールです。僕はこれを知った時かなりのカルチャーショックを受けました。こういうやり方があるのかと。

ちなみに、僕は powder というツールも入れてます。Pow を素で使うと symlink 貼ったりとかが面倒なんですが、コマンドでやれるのでとても便利。

Anypow?

とはいえ、Rack アプリしか対応してないのは勿体無い。Pow はワーキングディレクトリにある config.ru を読んで Rack アプリを起動するので、それと同時に plackup とかしてあげて、空いてる TCP ポートでつなげておいて、Rack アプリは単に Proxy としてしまえば、おんなじ感じにならないかなぁと思って作ったのが Anypow です。

とりあえず簡単なものは動いてることを確認しましたが、こういうツールはいろんな環境で色々試してみないと分からんので、協力してくれる方募集中です。

Net::EmptyPort?

で、空いてるポートを探すのに、Perl だと tokuhirom さんの作ったTest::TCPの中に同名のモジュールがあってとても便利そうだったので、そっくりそのまま ruby に移植しました。Thanks!

ロジックはほぼそのまま頂いたので僕は頭使ってないんですが、waiter の部分はクロージャを使ってたので ruby でクロージャ書くいい練習になりました。あと、これ書いてるときに rspec が should から expect に変わったのを知ったりしました。

終わりに

もう Pow を知ってからは、ポート番号について思いを馳せることはしたくなくなったので、Anypow を活用していこうと思います。

Pow は更に、Guard と組み合わせて使うと効果的です。僕は Rails では以下を使って、ファイルの変更があったら必要に応じて Pow の再起動と livereload させてます。

Grunt でもおんなじ感じのができそうな気がしなくもないですね。これらを Anypow と組み合わせて使えたらどんな言語でもハッピーな開発ができるんじゃないか!と思ったところで、本来アプリを書きたいと思ったんだったことを思い出した次第ですので、yack はこの辺に。。。

ruby なんか書かないのに ruby 入れるの面倒だよって人は、拙作の anyenv を使っておくと、今後いろんな言語が出現してきても困らないのでこっそりオススメです。

ではまた~