Perlのローカルプロキシ紹介と見せかけてJS開発環境紹介

齢27にしてNirvanaをまともに聴き出したtaiyohです。 最近、ベースの他にギターも始めてみたのですが、本当に難しい… (個人の方含め)ブログ書くの本当に久しぶりです。

ちょうど今JavaScriptをがっつり使った案件に関わっているので、開発周りで小ネタを一つ。

JSの割とポピュラーな開発方法として、ローカルプロキシ経由でアクセスし、開発中のファイルを読みこませてチェックするという方法があります。 その最に使う代表的なローカルプロキシとして、Mac OSXやLinuxの場合はCocProxyがありますし、Windowsの場合、FiddlerProxomitronがあります。

さて、僕の開発方法はといいますと、ローカルプロキシを使用しているという意味ではあまり変わったことはしていません。 ただ最近、ひょんなことから、PerlのHTTP::Proxy::Selectiveというモジュールがローカルプロキシとして使えることがわかったので、今ではこれを使って開発を進めています。

使い方

実はSynopsisより、このモジュールに同梱されているお手軽スクリプトのselective_proxyのソースを見る方が、より具体的な使い方がわかると思います。

[taiyoh@watkins] $ cat list.ini
debug = 1

[www.example.com]
/path/to/remote.js = /path/to/local.js

こんな.iniファイルを作成し、

[taiyoh@watkins] $ perl -Ilib script/selective_proxy list.ini

これでもう動きます。 あとはブラウザのプロキシ設定を切り替えるだけでOK。まあ、selective_proxyのSynopsisのまんま…

問題点

ただ、素のselective_proxy(H::P::Selective)には以下のような不満があります

・ローカルホスト以外からのアクセスは受け付けない

僕は、開発サーバとその他用とでのマシンを分けているため、 開発用マシンにプロキシサーバを設置し、その他用マシンからそちらにアクセスする必要があります。 が、ローカルホスト以外からのアクセスの制限を外さないと、その他用マシンからアクセスしても弾かれてしまいます。

・ルールの保持方法がちょっとアレ

パスの指定方法は、ちょっと違う方がいいかな、と思ってます。 普通にハッシュのまま保存するのじゃだめなのかな… マッチするパス以下のファイルを全部対象にするというのも、明示的にワイルドカード書かせた方が分かり易い気が。 (ワイルドカード対応は未検証です)

・(おまけ)デバッグログ用のメソッドくらい定義してくれ&デバッグログがしょぼい

直でwarnか…まあいいけど

ということで、(おまけ以外の)これらの点をどうにかしてみました。 selective_proxyと使い方は殆ど同じです。スクリプトはgistに置いておきました。 http://gist.github.com/259276 無保証ですが、気になった方はどうぞお使いください。

ところで、PAC(Proxy Auto-Config)って知ってます?

例えば

[taiyoh@watkins] $ cat proxy.pac
function FindProxyForURL(url, host) {
    var proxy = 'PROXY hogefuga.local:3128';

    if (dnsDomainIs(host, 'www\.example\.com')) {
        if(/\/path\/to\/modified\.js/.test(url)) {
            return proxy;
        }
    }
    return 'DIRECT';
}

こんなファイルを用意していたとします。 そしてこれをブラウザのプロキシ設定に読み込ませます。 (Firefoxだと、環境設定->詳細->ネットワーク->接続設定から自動プロキシ設定スクリプトURLにラジオボタンを合わせ、ファイルのパスを入力) すると、上の例だと「http://www.example.com/path/to/modified.js」にリクエストが飛ぶ時だけ、 指定したプロキシ経由でのリクエストに切り替えることができます。 何がいいかというと、特定のファイルのみをローカルプロキシ経由で取得できるので、 レスポンスが圧倒的に速くなります(といっても、普通に閲覧する程度になる、という意味です)。

尚、PACのもっと詳しい使い方については、「プロキシの自動設定方法」というページをご参照ください。

(追記:IEだと動作が怪しいという噂も…)

さっきのPerlのローカルプロキシのときに作っていたlist.iniから、このPACファイルも生成できないかな

ということで、これも変換スクリプトを作ってしまいました。 http://gist.github.com/259275 今僕の環境では、list.iniを書き換えたらこの変換スクリプトを起動してproxy.pacを生成しなおし、 プロキシを再起動、firefoxのPACファイルの再読み込み、というフローで新しいファイルに対応できるようにしています。 まあ、これはもっと自動化できますね…。でも、そんなに頻繁に切り替えるものでもないですが。

総括

ということで、殆ど僕の開発環境晒しみたいになってしまってますね… PACについては、あまり知られていないけど、あると便利な技術だと思いますので、試しに使ってみては如何でしょうか!

カヤックでは、オールラウンドにプログラムを書きたい技術者も募集しています!