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を使っておくと、今後いろんな言語が出現してきても困らないのでこっそりオススメです。

ではまた~