Home日記コラム書評HintsLinks自己紹介
 

フィンローダのあっぱれご意見番 第159回「インストールは大騒ぎ」

← 前のをみる | 「フィンローダのあっぱれご意見番」一覧 | 次のをみる →

次世代(誇張あり)コミュニケーションツールである Mawou を公開サイトに置いたら、 いきなりダウンロードできないという話が。 Windows で置いたものを Fedora から Firefox でダウンロードして展開できることを確認してから内緒でURL を公開したのだが、甘かった。 後で試してみたら IE でダウンロードしたらサイズが違っていたのだ。

普通ならまず IE で試すのだと思うが、 私のpcの「start」メニューからは、 よく使うプログラムベスト5からついにランクダウンしてしまった。 やはりIEで試してみないといけないのか。

原因は想像なのだが、「.zip」という名前に対して、 サーバーの設定がテキストファイル送信になっているのではないか、 という結論になった。 ではなぜ Firefox だとちゃんと受信できるのか、というのが謎だが、 結局、So-net に Mawou を置くことで解決したので、 放置中である。 @nifty 専用のソフトを So-net に置かないといけない、 というのが世界の不思議の一つだ。

§

  

もっとも、まだインストーラーもできていないので、 現状の公開は開発参加者用である。 例えば、こういう感じで XML のデータを作るから、 加工する XSLT を作ってみようとか、 もしかしたらインストーラーを誰か作らないか、とか、そういう夢はある。

 

※ Mawou は最初から、 ブログとか他の普通のサイトを巡回することを想定して作っている。 例えば、mixi に投稿する処理を追加しようとしている。 ということで、開発終了した訳ではないが、 モチベーションは下がっているので、なかなか作業進行する気配がない。

ところで、事前インストールが必要だという時点で挫折したという意見を chat で聞いた。 これは想定の範囲内である。 多分、パソコンでインターネットを使っているユーザーの9割は、Java をインストールしろと言ってもできないだろう。

  

インターネットに接続していれば、Java をインストールする手順は難しくはない。 Sun のサイトから JRE (Java 実行環境) を実際にインストールしたことのある人なら分かると思うが、 ブラウザでページを開いて何回かクリックするだけだ。 表示も日本語だし、ライセンスを読むところを除けば、かなり簡単だと思う。

 

※ ライセンスの文章が難解なのだ。 大学レベルの読解力がないと読めないと思うのだが、 Windows の使用条件が読める人なら、全く問題なく読めるはず。

だが、その簡単な手順が、実際できないものである。 マイクロソフトがなぜ Windows に Sun の Java をインストールしないで配布することにこだわったか、理由がそこにある。 この「何回かクリックするだけ」という手順すらできないユーザーが大半を占めていることを、 マイクロソフトはよく理解しているのだ。

さて、Mawou は Java で書いてあるので、 J2SE か、JRE がインストールされていなければ動作しない。 JRE を入れたインストーラーを作成するという手がありそうだが、 その方法というか手順が分からないし、ライセンスの問題も分からない。

但し、プログラマーズフォーラムの場合、 利用者として、プロのソフトウェア技術者を想定しているのである。 もちろんソフトウェアというのは限りなく範囲の広い世界だから 「Java って何?」という人が、もしかするといるかもしれない。 ただ、もしそうだとしても、 いくら何でも Java のインストールもできないという人は想定しなくてもいいような気がする。

  

となると、次の壁は何か。 Mawou は HTML のデータ生成に Apache Ant を使っている。 実は Mawou 自体は ant がなくても動作するのだが、 それだと単に xml のデータを作るだけになってしまう。

 

※ ant は、こう言うと反撃にあいそうだが、 要するに make みたいなものである。 いろいろな面倒な手順を自動化するためのツール。

Ant も最近では定番のツールになりつつあって、 Java で開発している人なら既にインストールしているという人も多いと思うが、 そうでなければ、 ant のインストールが次なる壁だ。

実は、ant には、指定したサイトからファイルをダウンロードしてくる機能を持っている。 zip を展開して指定したディレクトリにファイルを移動するような処理もできる。 ということは、 Java と ant がインストールできていれば、 その他のファイルをダウンロードして指定の位置に配置するような処理を提供できるのである。

  

しかし、Java は我慢できるとしても、Ant もインストールしろというと、 殆どの人は「もういいよ」となるのではないか。 クリック一発で動かないとイヤ、というのは分かる。 朝三暮四というと失礼かもしれないが、 目先の利益を優先する行動は、人間に本能的に備わった定番パターンなのである。 もし10分手間をかけたらフォーラムのアクセスに毎日1分、 1年で365分の節約になるよ、と言ったとしても、 「でも10分も面倒だ」といって手間をかけない、というのが普通のリアクションなのだ。

 

※ トータルを考えると大損するとわかっても、 なかなか行動パターンは変わらない。 いつかパターンを変えたときに、 人生を随分無駄にしたことに気付いてかなりヘコむのである。 人間というのは、そういうものだ。

せめて、Ant を自動的に get したい。 指定したサイトからダウンロードする機能は Ant が持っているが、 Ant を自動的に get するためには Ant が必要、というのは私のいつものパターンである。

§

手作業でブラウザを使えば Ant を取ってくるのは簡単だ。 ブラウザをコントロールして、Ant を自動的に取得できないか。 あるいは、 その処理を簡単にやってくれるソフトが Windows に標準で入っていないのだろうか? うかつだったが、標準ではないが、実はそれがあったのだ。 つまり、Mawou というのは、もともと、自動的に指定サイトからデータを get するというソフトウェアではないか。 しかも、Ant を get する前に Mawou を既に get している確率は高い。

ならば後は簡単である。 Mawou に、Ant を get する機能を組み込んでしまえばいいのだ。 ということで、 Java さえ動いていたら、Mawou.jar をダウンロードして Mawou を使えるようにする、 という目標に一歩近づくことができた。

と思っていたら、世の中そう甘くないことを思い知る事件が勃発したのである。

§

Mawou はかなり前から作っているクローラーをベースにしている。 数年前から作っているもので、 例によって未完成だ。 このクローラーは、MaidOCrawler という名前で、 まいどクローラーと読む。 未完成ではあるが実際に動作はしているし、 何万サイトから拾ってくる、というような処理をこなす。 このクローラーで使っている ContentLoader というクラスを Mawou で使っていたのだが、 公開直前に、 通信処理を全て Jakarta Commons の HttpClient ベースに置き換えた。

前回も書いたのだが、 Mawou のデバッグで困っていたのが Cookie の処理である。 Jakarta Commons を使えば、Cookie の処理は何も考えずに、全部そっちがやってくれる。 さらに、post の処理の form のエンコードとか考えはじめると、 こんなの自前で作るのは無駄以外の何物でもない。 だったら乗り換えてしまえ、と決断したのだ。

Mawou は製作の初期段階だから、 こういうコアな所が大規模にリファクタリングされたりするのが怖い。 もっとも、そこが面白いのかもしれないし、 コンテンツを取得する処理位は、 最初から、 そんなに手をかけずに入れ替えられるように作ってあるのだ。

Jakarta Commons の HttpClient を使ってページを get する手順は、 大雑把にいって、 List 1 のようになる。

---- List 1 ----

    HttpClient httpClient = net HttpClient();
    GetMethod method = new GetMethod(uri);
    httpClient.executeMethod(getMethod());
    byte[] responseBody = method.getResponseBody();

---- List 1 end ----

実際は、いろいろ細かい設定をしないと失敗したりする。 List 2 は、Multipart を指定して、 @nifty のフォーラムの掲示板に実際に書くのに使っている処理の抜粋だ。 ここでは省略している getPostCharset() というのがミソで、 これを理解するのに百年かかった。 @nifty には Shift_JIS のデータを送らないといけないので、 ここでそれを指定しているのだ。

---- List 2 ----

    PostMethod method = new PostMethod(uri);
    method.getParams().setContentCharset("Shift_JIS");

    Part[] parts = {
        new StringPart("jobid", getJobid()),
        new StringPart("name", getShiftJisString(getName()),
                getPostCharset()),
        new StringPart("mail", getMail()),
        new StringPart("title", getShiftJisString(getTitle()),
                getPostCharset()),
        new StringPart("contents", getShiftJisString(getText()),
                getPostCharset()),

        new StringPart("web", getWeb()),
        new StringPart("cmd", "preview"),
        new StringPart("send", "送信"),
    };

    method.setRequestEntity( new MultipartRequestEntity(
        getParts(), method.getParams()) );

    httpClient.getHostConfiguration().setHost(host, port, protocol);
    httpClient.executeMethod(getMethod());

--- List 2 end ----

§

さて、Jakarta Commons を使うようにリファクタリングしたら、 ちょっとしたデメリットが追加されてしまった。 少しインストールの手間が増えるのだ。

つまり、Mawou はそれまで基本的に JRE のみ、 標準ライブラリだけで動作したのだが、 書き換え後は、Jakarta Commons からいくつか jar ファイルを get しておかないと動作しない。 具体的には、httpClient、logging、codec の3つが必要になった。 httpClient だけで済むかと思ったのだが、 なぜか、この3つがないと動作しなかったのだ。 ということは、ヤバい。 またユーザーが逃げてしまう。

しかも、今度は症状が重い。 Mawou に Ant をダウンロードさせるのは簡単だった。 Ant がなくても Mawou は動くから、 単に Mawou にダウンロードさせるだけの話だった。 しかし、Jakarta Commons の jar ファイルは、 Mawou そのものを動かすために必要である。 Commons をダウンロードするために Mawou を動かす、 そのためには Commons を先にダウンロードして…、 ほらまたこのパターンである。

もっとも、簡単な解決策はいくつかある。 まず、Jakarta Commons を Mawou と一緒に配ってしまう方法がある。 これは安直だが、とりあえず確実だ。 もう一つは、 Ant や Commons の取得には Cookie や multipart の処理は必要ないから、 以前使っていた ContentLoader クラスを使うという方法である。 同じ目的の処理が2つあるというのは面白くないか、それとも面白いか。 結果は現物を見てのお楽しみだ。

  

(C MAGAZINE 2005年9月号掲載)
内容は雑誌に掲載されたものと異なることがあります。

修正情報:
2006-03-01 裏ページに転載。

(C) Phinloda 2005-2006 All rights reserved.