Lynxを使って「iアプリで簡易ウェブブラウザ」計画 (2004-11-07)
前置き
テキストブラウザのLynxを使用して、iアプリで簡易的なテキストウェブブラウザのようなものを作れないものかと考えている。
ウェブブラウザをまともに実装するとなると、文字コードの判別やら、HTMLのパーズやら、表示結果のレンダリングやら、とにかく面倒くさい作業が目白押しだ。なるべくなら既存の実装を流用して楽をしたい。
そこで、そのあたりの面倒ごとはテキストブラウザのLynxにすべて任せることにする。サーバ上にLynxを用意しておき、クライアント側のiアプリでは表示したいWebページのURLをLynxに伝える。そして、サーバ側のLynxは指定されたURLのHTMLをレンダリングして、クライアント側に対してレンダリング結果をプレーンテキストで送信する。後は、クライアント側でそのテキストデータを表示するだけという寸法だ。
処理の流れ
大まかな仕組みは、以下のようになるだろうか。
- iアプリ側では、表示したいWebサイトのURLをパラメータとして、Webサーバに設置したCGIプログラムを呼び出す。
- CGIプログラムは、指定されたURLにLynxでアクセスして、HTMLのレンダリング結果をプレーンテキストで取得する。
- CGIプログラムは、取得したプレーンテキストをzip圧縮して、octet-streamとして出力する。
- iアプリ側では、取得したzipデータを展開して、画面に表示する。
iアプリには「iアプリ自身のダウンロード元であるサーバーとしか通信できません」という制限がある(『iアプリコンテンツ開発ガイド for DoJa 3.0』16ページより)。よって、自由に通信する必要のあるiアプリでは、サーバ側にプロキシとなるCGIプログラムを用意して、iアプリ側ではそのプロキシ経由で通信を行うという方法が一般にはとられている(らしい。通信をともなうアプリを作ったことがないので詳細は不明)。
そういうわけで、本来ならサーバ側のCGIプログラムで通信処理を実装する必要があるわけだが、今回のケースではそのあたりもLynxにお任せできる。
また、サーバ側CGIで出力するテキストデータはzip圧縮しておくとよさそうだ。DoJa 3.0以降には「JarInflaterクラス」があるので、zipデータの展開も容易だろう。私は使ったことがないのでよくわからないのだが。
問題点
問題点もいくつか思い浮かぶ。
HTMLを解釈できない
Lynxを使うことでレンダリングされた状態のテキストデータを得ることができるわけだが、裏を返せばクライアント側ではHTMLの形でデータを解釈することができないことを意味する。
実のところ、これはかなり致命的な問題だといえる。例えば、各種要素の属性を取得できないので、リンクが張られていてもリンク先URLがわからない。フォーム部品なども全滅だ。要するに、単に表示されるだけの要素についてはテキストの状態でもかまわないが、ユーザー側からのアクションが必要な要素についてはHTMLから情報を引っ張ってくる必要があるということだ。
とはいえ、リンク関連の情報については、Lynxが気を利かせてくれるのでなんとかなりそうだ。以下は、LynxでGoogleのトップページをダンプした際に得られるテキストデータだ。
>lynx -width=40 -dump http://www.google.co.jp/ Google ウェブ [1]イメージ [2]ニ ュース New! [3]グループ [4]ディレクトリ ______________________________ Google 検索 I'm Feeling Lucky [5]検索オプション [6]表示設定 [7]言語ツール (_) ウェブ全体から検索 (_) 日 本語のページを検索 [8]広告掲載について - [9]人材 募集 - [10]Google について - [11]Google.com in English (c)2004 Google - 4,285,199,774 ウェブページから検索 参照 1. http://www.google.co.jp/imghp?hl=ja&tab=wi&ie=UTF-8 2. http://www.google.co.jp/nwshp?hl=ja&tab=wn&ie=UTF-8 3. http://www.google.co.jp/grphp?hl=ja&tab=wg&ie=UTF-8 4. http://www.google.co.jp/dirhp?hl=ja&tab=wd&ie=UTF-8 5. http://www.google.co.jp/advanced_search?hl=ja 6. http://www.google.co.jp/preferences?hl=ja 7. http://www.google.co.jp/language_tools?hl=ja 8. http://www.google.co.jp/ads/ 9. http://www.google.co.jp/jobs/ 10. http://www.google.co.jp/intl/ja/about.html 11. http://www.google.com/ncr
ご覧のように、リンク文字列の位置には“[1]”のような目印が挿入され、テキストの最後にはリンク先一覧が追加されている。この情報を活用すれば、「リンクをたどる」ことについては可能になるはずだ。フォーム部品についてはあきらめるしかなさそうだが。
レンダリング品質
テーブルのレンダリングについては、Lynxに過剰な期待はできない。単純な表であればきれいに整形してくれるが、レイアウトのためにテーブルを使っている場合はレイアウトが崩れることになる。このあたり、w3mならばテキストベースでもきれいにレンダリングしてくれそうなのだが。
細かい点
その他、実装時に考慮したほうがいい細かい点について。
Lynxの画面幅
Lynxのオプション"-width"にて横方向の文字数を設定できるわけだが、幅はちょっと広めにとる方がよさそうだ。というのも、Lynxのレンダリングでは、画面の左右にけっこう広い余白をとるようになっているからだ。幅を広めに指定しておいて、表示する際には左側の余白を削るようにするとちょうどいい表示になりそうだ。
脆弱性
Lynxに渡すURLには注意する必要がある。例えば、URLとして"."を指定したりすると、Lynxはカレントディレクトリ上のファイルリストを表示してしまう。ローカルで使う分には便利な機能だが、CGIとして動作させるにあたってはセキュリティ的に非常に危険な動作だ。
この点に関しては、おそらく"-validate"オプションで解決できる。このオプションを指定すると、httpプロトコルのURLのみを受け付けるようになる。
とはいうものの
長々と書いてはみたが、現在私はOpera搭載AirH"PHONE「AH-K3001V」を使用しているし、そもそも今のところDoCoMoの端末は持っていなかったりする。個人的には、こういったものを開発する必要性は生じていない。あくまでアイディアレベルということで。