CGIアクセスをHTTPSへリダイレクトする方法

CGIへのアクセスをSSL通信にしたい。

ということで、真っ先に思い浮かんだのが、CGIへのリンク全てのURLを「https://~」というフルパスの記述に変える方法。でも、これだとSSL対応していないプラットフォームでの運用に支障が出るし、何より開発時と本番時で絶対パスを変えたりして、開発コストがかかりそう。

そんなわけで、apache側の設定でリダイレクトさせるのが一番かなと思って、やってみた。

<FilesMatch "\.cgi$">
    RewriteEngine   On
    RewriteCond     %{SERVER_PORT} !^443$
    RewriteRule     ^/usr/local/apache/htdocs/(.*)$ https://www.hoge.com/$1 [L]
</FilesMatch>

SSL通信(443ポート使用)でないCGIへのアクセスを、mod_rewriteを使って、httpsへリダイレクト。.phpとか.doとか、拡張子が増えたときでも、これなら簡単に追加できそう。LocationMatch ディレクティブとか使って、もっとキレイに実現する方法もありそうだけど、とりあえずは良しとしよう。

いまだにApacheの設定は、うまくいくまで手探り。なかなか1発で思うように動いてくれた試しがない。慣れの問題なのかもしれないけど、そんなにApacheをイジることはないからなあ。

"Tenured Gen"と"PS Old Gen"

以前、JMXで書いたメモリ使用量の監視プログラムが、監視対象サーバを変えた途端、Exception を吐いて死亡。えええ。

JMXServiceURL url = new JMXServiceURL("service:jmx:rmi:///jndi/rmi://myserver:1234/jmxrmi");
JMXConnector conn = JMXConnectorFactory.connect(url);
MBeanServerConnection mbsc = conn.getMBeanServerConnection();

MemoryPoolMXBean mpbean = (MemoryPoolMXBean) ManagementFactory.newPlatformMXBeanProxy(mbsc, "java.lang:type=MemoryPool,name=Tenured Gen", MemoryPoolMXBean.class);

んで、エラー。

Exception in thread "main" java.lang.IllegalArgumentException: java.lang:type=MemoryPool,name=Tenured Gen not found in the connection.
at java.lang.management.ManagementFactory.newPlatformMXBeanProxy(Unknown Source)
...

「そんな ObjectName のMBean はコネクションに無いよ」とか言っちゃっているので、どんなもんがリストされているか確認。

ObjectName oName;
Set names = mbsc.queryNames(null, null);
for (Iterator it = names.iterator(); it.hasNext();) {
    objectName = (ObjectName) it.next();
    System.out.println("ObjectName: " + objectName );
}

そして、暴かれた驚愕の事実。

...
ObjectName: java.lang:type=MemoryPool,name=PS Old Gen
...

Old領域を表す名前が、「Tenured Gen」じゃなくて、「PS Old Gen」になっている。書き直してコンパイルしたら、無事に動作してくれた。ふう。

どうやらJVMが採用するGC方式によって、ここの名前が変わるみたい。JVM1.5系だと、マルチプロセッサ環境では、パラレルGC方式に自動的にスイッチされる。賢い仕様なのだけど、こんなとこにも影響が出るとは。

ということで、環境に応じて適切なプール名称を指定する方法を考えねば…。

続きを読む ""Tenured Gen"と"PS Old Gen""

HttpUnitでもタイムアウトを実現する

先日、「HttpUnitはタイムアウトに未対応だって」で、HttpUnitがソケット通信中のタイムアウトをサポートしていないことについて、嘆き悲しんだわけです。

もはや HttpUnit に修正パッチ当てるしか無いのかなーなんて思っていたけど、裏技っぽいものを発見。Sun JVM 限定だけど、以下のコードでタイムアウト値が設定できた。

// コネクション確立時に使用するタイムアウト値
System.setProperty("sun.net.client.defaultConnectTimeout", "10000");

// 入力ストリーム読み出し時に使用するタイムアウト値 System.setProperty("sun.net.client.defaultReadTimeout", "10000");

プログラムの先頭で、上記のようにプロパティを設定しちゃえば、それ以降の HttpUnit が使用する URLConnection がその値を参照して動いてくれる。もしタイムアウトになった場合は、SocketTimeoutException をスローする。

ただし、プロパティを設定すると JVM 単位でしか制御できなくなるはず。サーブレットコンテナ上で使う場合や、コネクションごとに値を変えたいケースでは、現実的じゃない。簡単なクライアントだったらOKだけれども。

こうなってくると、いよいよスレッドかなー。スレッドにしておくと、後々の利便性も高そうだし、やってみる価値はありそう。

NekoHTML+XPathで注意すべきこと

HTMLパーサの素敵ライブラリ NekoHTML のパース結果を、XPathAPI でごにょごにょしようとしたら、上手くノードが取れない。なぜ。

Document doc = parser.getDocument();
NodeList nodelist = XPathAPI.selectNodeList(doc, "//input");

試しに Xerces2 の DOMParser を使ってみると、上手く行く。まさか相性とかじゃないし、何だろうと思ってログを眺めていたら、タグ名が大文字になって返ってきてるわけ。えー。

ちゃんとFAQに書いてありました。

Element names are written in uppercase letters (e.g., BODY). Attribute names are written in lowercase letters (e.g., lang, onsubmit).

ということで、NekoHTML のパース結果に対してタグ名処理する場合は、大文字にしなくちゃいけない。

Document doc = parser.getDocument();
NodeList nodelist = XPathAPI.selectNodeList(doc, "//INPUT");

見事にハマりました。春だなあ。

HttpUnitはタイムアウトに未対応だって

Webページを自動巡回するのに、HttpUnitを使ったら便利かなーと思っていたけど、コネクションのタイムアウト設定がサポートされてないっぽい。今時、JDK1.3ベースなのか。うーん、惜しい。

やっぱりcommonsのHttpClientを使うのが良いかなー。さすがに自前でソケットをイジイジすんのは辛いからなあ。

人月の違和感

「このシステムの開発規模、どんくらい?」
「うーん、20人月くらいかなあ」

いわゆるIT業界に足を踏み入れてから、もう幾年と経つけれども、いまだに受容できない妙な文化が多い。はじめこそ、「そんなもんかな?」と長いものに巻かれていたけど、最近は「やっぱり変でしょ」と反発モード。

特に違和感のあるのが、「人月」という単位。

システム開発などの工数、仕事量を示す単位で、「人数×時間(月)」で表される。プロジェクトの大きさを表現する場合や、1人当たりの費用月額(人月単価)を掛け合わせてシステム開発の費用算定/見積もりに利用される。

人月は、極端なことを言うと、「そこに人がいれば、仕事の質に関わらずお金が入る」仕組み。ビジネスマンじゃなく、サラリーマンなルール。20人月の仕事を、生産性を上げて10人月でこなしても、それは10人月のお金にしかならないケースもありえる。バイトの時給制か、とツッコミたくなる。

素晴らしいアイデアで、1億の価値があっても、1人月だったら60万。
商品価値は30万円でも、1人月だったら60万。

できあがるモノの価値や、マーケットと離れたところで、勝手わがままに見積もられる人月金額というのは、スゲーうさんくさいと思う。

もちろん使える点もある。

正確な売上予測が立てられる。新人SEや低スキルSEにとって、格好の隠れ蓑になる。顧客との商談で、価格設定の言い訳に使える。

「人月問題」として、これまで各所で問題視され、議論されているものの、一向にこの文化は衰えない。EVMなどの代替案も挙げられるけど、その有効性にまだまだ疑問が残っている。何より、この業界で長年やってきたプレイヤーにとって、人月という商習慣が変わることは、致命傷になる可能性もあるのだから、仕方ない。

結局、この文化を変えるためには、人月からスムーズに移行でき、なおかつ彼らが納得できるような具体的な策を提示しなければいけないんだろう。もしくは、彼らが使い物にならなくなるくらいのパラダイムシフトをするか。

さて、どう動こうかしらん。


最新エントリー
CGIアクセスをHTTPSへリダイレクトする方法
"Tenured Gen"と"PS Old Gen"
HttpUnitでもタイムアウトを実現する
NekoHTML+XPathで注意すべきこと
HttpUnitはタイムアウトに未対応だって
人月の違和感
あわせて読みたいブログパーツ