Flex 3 リファレンスからchmに

このエントリは2008/04/16の再掲です

表現をユル目に書き換えています。

flashhelp2chm-ja - Convert Adobe Flash documents to CHM - Google Project HostingFlex 3にも対応させようと思い立って、Flex 3 SDKAPIリファレンスを探すも、なんと、Flex 3 SDK 日本語版は、リファレンスマニュアルのローカルダウンロード版を準備していなかったのです。英語のほうは、正式には書かれていないけれど、開発サイトのドキュメントリストの追記コメントに、zipアーカイブがあるのに。日本語版zipを待つか、いますぐ何とかするか…。

で、調べてみたら、えーっと?みんな wget -r とかで拾っているの?それはたぶんまずいよ。ファイル全部揃わないわ、ありもしないリンクに誘導されるわ、無限リダイレクトの罠もあるわ…。で、そうやってあの弱いサーバをみんなでいじめると、たぶん他の人をすごく邪魔していることになるでしょう。

というわけで、livedocsのFlex リファレンスに特化したクローラをつくり、「生きているリンクで、かつ、意味のあるものだけ」をダウンロードするスクリプトを、flashhelp2chm-jaプロジェクトに追加することにしました。

で、作ってみていきなり大問題。なんと、Adobeのlivedocsサーバは、たまに誤ったコンテンツを返すというバグを持っていることがわかりました。内部でセマフォの獲得に失敗してタイムアウトしているのか、しばらく待たされたあと、明らかに間違った内容のHTMLを内包したページを返します。(charsetか何かでzh_CNって書かれた中国語のコンテンツとかが出てきました)間違い方にとくに法則性がみられなかったので、たぶん、プールの中の同じサーバスレッドで、別の人が参照したことがあるコンテンツの残骸が出てきたのでしょう。

ていうか、ServerName:JRun って、おい。独自J2EE実装の単独サーバで、世界中からのアクセスをさばいてるの?普通は国別にミラーを設けたり、ロードバランサになるプロクシ通して負荷分散すると思うんだけど。ドキュメント閲覧はステートレスなリクエストで済むんだしさぁ。おっと余談でした。

と、いうわけで、クローラにはコンテンツが本当に自分の求めたものなのかどうかを検証し、それっぽくない場合はあとでやり直す機能も必要でした。Flexという単語があるかどうか、というような最大公約数的な検証ルールだと、偶然にも残骸としてFlex 3を含むテキストが帰ってくることがあり、やむなく、ページの種類ごとに、「それっぽさ」のルールを何種類か準備する必要がありました。

不正ページについてすぐにリトライすると、いくらやっても正しい返答が得られないページがありました。その場合、時間をあけて後でやりなおさないといけないけど、最初から全部やり直すと、こんどは別のページの応答でバグが出ます。なので、成功したファイルの再取得を避ける、レジューム的な機能も必要でした。このレジューム機能は、すでに404 Not Foundになるとわかっているデッドリンクをスキップする必要がありました。livedocsサーバに余計なリクエストを投げると、自分が待たされるばかりでなく、他の人に迷惑なので。あと、同じホストの別のドキュメントへのリンクもあり(livedocsって、文書ごとに独立してるんじゃなくて、もしやひとつの巨大なDreamweaverサイト?)、これも排除する必要がありました。

----で、

HTMLファイルが全部揃った、と思いきや、こんどはまた例の「翻訳時の文字列処理がHTMLを壊す」現象です。

Flex2のときは、HTMLタグの中まで日本語で置き換えてて、親クラスのフィールド非表示ができなくなっていました。(なんか、「パブリック Methods」とかいう変な表記も残ってたし…)

今回最高に壊れていたのは、migration.htmlファイルです。Flex 2のときから内容がほとんど変わっていないにもかかわらず、Flex 3では露骨に間違った置換処理がなされている感じでした。英語版で半角コロンがある箇所に、全角コロンが書かれてて、その直後から内容が壊れています。

壊れたままにしていると、無駄なデッドリンクがクローラを邪魔する(余計なリクエストをlivedocsサーバに投げる)ので、どうにかしないといけません。どっちみち、このファイルが壊れたままだと、HTML Helpコンパイラをクラッシュさせてしまう(ファイルの解析中にメモリ違反を起こしているみたいで、次の数ファイルを処理したあと強制終了する)ので、取得しても意味ありませんし。

というわけで、migration.htmlは、Flex 2のもので代替するのが正解です。livedocs上のFlex 3のmigration.htmlは、拾ってはいけません。

そうして出来上がった「Flex SDKリファレンスlivedocs専用のダウンロードツール」がflashhelp2chm-jaの最新ベータ、flashhelp2chm-ja-20080416.zipに含まれています。

flashhelp2chm-ja-20080416.zip - flashhelp2chm-ja - Flex3 SDK supproted with downloading from livedocs - Convert Adobe Flash documents to CHM - Google Project Hosting
より新しいものは、Downloads - flashhelp2chm-ja - Convert Adobe Flash documents to CHM - Google Project Hostingにあります。

LiveDocsサーバはバグありで、「おかしなURLへの参照」と「コンパイラのクラッシュ」の原因がHTMLタグを壊しちゃった翻訳不具合のせいだと調査して…と、余計なことに相当時間を消耗しました。

いやね、私はべつに、どれだけ複雑なものを作ったのかを言いたいんじゃないんです。なぜこうも彼らの仕事は質が低く、なぜいつも正しくアプローチして裏切られ、本質よりもバッドノウハウが膨れ上がり、ユーザのスキル標準の形成を困難にし、それを社会的に是正する抜本的対策が取られないことに悩まされ…うだうだ。

たしかに、こんなハックは正規の使い方とは違うけど、普通にFlash使ってても、謎のAPI仕様や文書化されてない元バグに出会わなかったことがありません。問題の大元は同じなんじゃないのかと、そう思うわけです。