システム奮闘記:その10
携帯3社のコンテンツ作成の物語
(2002年5月8日に掲載)
(2006年9月16日に改定)
はじめに
  2006年10月に、名称がボーダフォンからソフトバンクフォンに代わります。
  しかし、初版を出した頃は、ボーダフォンは、Jフォンという社名で
Jフォンのインターネット関係の機能の事を J-SKY と呼んでいました。
  ここでは、当時の内容を忠実に書くため、旧名称を使っています。
PHP言語で携帯コンテンツの作成
  さて、お客さん向けのデータ検索システム。
  「システム奮闘記;その7」(無償データベースのPostgreSQL導入)でも
触れた検索システムだが、肝心のデータの修正の手間取っていた。
  その上、担当部署から、データのテーブルの変更を言い渡された。
  仕様変更を言われると、変更するのに時間がかかる。
  そのため「他の仕事も立て込んでいるため、1ヶ月はみて欲しい」と返答した。
担当部署の部長は、渋々認めてくれた。
  さてさて、どうせ変更するのなら、もっと付加価値をつけた方が良い。
そこで思いついたのは、パソコンのブラウザーだけでなく、
携帯3社(i-mode、J-SKY、EZWeb)でも閲覧できるようにしたい。
  そこで、3種類の携帯でも閲覧できるようにシステムを組みました。
  というわけで、携帯3社のコンテンツ作成の物語の、はじまりはじまり。
3社携帯対応のサイト作成
  さて、携帯3社。3社ごとに、アドレス(URL)を変えると作成は楽なのだが、
それだと使う方は面倒になる。3社とも同じアドレス(URL)で見れるようにしたい。
  しかし、そうなると言語が違ったりするため、PHP3言語を使って、
どの携帯からアクセスがあったのか判別して、振り分けないといけない。
  まず最初に思いついたのは、PHP3のユーザーエージェント変数を使って
振り分ける事を考えた。
| ユーザーエージェント変数とは | 
PHP内で「$HTTP_USER_AGENT」という変数名で使われている変数だ。
  | 
  しかし、AUの場合、どう表示されるのか、わからない上、
周りに、AUを使っている人もいないため、確かめようがない。
  また、Netscapeでも、Windows版とLinux版では、表示が違っていた。
  もしかして、ブラウザーのバージョンや、OSの違いで表示が変わってくると
考えるだけでも、ゾッとしてきた。
  そのため・・・
 開始早々で座礁に乗り上げた  (--;
  ある日、ふとしたことで、「オープンソースで飯を食う」と宣言している
(株)グッデイさんのホームページを見ていた。
  そこに、JHPのホームページを発見した。
  JHPとは、(合資)ディアの細川さんが開発されたオープンソースで、
どのブラウザーからアクセスしてきたか、判別するソフトである。
  内容は、PHP3にパッチをあてる仕組みで、これを使うと、
  ブラウザーの判定関数 jhp_carrier();を使って、どのブラウザーか判別できる。
| ブラウザー判定関数の戻りの値 | 
| ブラウザの種類 | 
戻り値 | 
| Netscape | 
Netscape | 
| IE | 
Microsoft | 
| i-mode | 
I | 
| J-SKY | 
J | 
| EZWeb | 
E | 
  凄く便利な物を発見してしまった。これならいけると思った。
それと同時に、オープンソースとして公開する細川さんの太っ腹に感謝  (^^) 
  さて、さっそくダウンロード。
  LinuxサーバーからNetscapeでダウンロードするが・・・
 なぜかエラーが出る (TT)
 なぜだろうかと考えるが・・・
 理由がわからへん (TT)
  なぜか、私がシステム開発する時は、トラブルが多い。
  そこで、細川さんに問い合わせてみるが、原因不明。
  次の手を考える。WindowsからIEでダウンロードする。
そうすると、拡張子が gz なのに、圧縮が解除されていた。
  まぁいいやと思い、それをftpでLinuxに転送して使うが、うまくパッチが当たらない。
  思わず頭を抱えてしまう。なぜなの  (@_@)  ???
  数時間後、もう一度、LinuxサーバーからNetscapeでダウンロードする。うまくいった。
  この事を、細川さんに報告すると「なぜでしょうねぇ?」と返答が来た。
  私も「なぜでしょうねぇ?」という心境だったが、うまくいって良かった (^^)
  準備万端。さっそく開発にとりかかった。
  J-SKY、EZWebとも、各社のホームページを見に行き、言語の情報のページを印刷した。
  Webの表示で問題になるのは、日本語文字コード。とにかく、これがややこしい。
  主に、EUC、Shift_JISがある。ブラウザーに出力する際の日本語文字コードを
正しく設定しないと、文字化けが起こる。
  携帯各社で表示させる日本語文字コードを見ると、幸い3社ともShift_JISだった。
  NetscapeとIEなら、EUC、SJISのどちらでも対応可能なので、
SJISで表示しようと、すぐに決められた。
  さて、問題はphp3.iniの設定だった。
  「システム導入記:その7」」(無償データベースのPostgreSQL導入)では
メチャクチャな設定をしたが、いつまでもゴマ化しでは良くないと思い
キチンとした設定にしようと考えた。
  そこで、PHPの関係の本を数冊見てみた。
  そして、以下のように理解した。
| 私が設定した内容 | 
私なりの解釈 | 
| i18n.http_output = SJIS | 
ブラウザーに出力する文字コード | 
| i18n.internal_encoding = EUC-JP | 
コンピューターの内部で処理される文字コードみたい 
詳しくは、わからん (^^;; | 
| i18n.script_encoding = auto | 
PHPのソースの文字コード | 
| i18n.http_input = auto | 
ブラウザーから入力される文字コード | 
| i18n.http_input_default = EUC-JP | 
ブラウザーから入力される文字コード(初期設定)だと思う (^^;; | 
| (2006/9/16に注釈) | 
i18n.internal_encoding は、PHPのプログラム中で、
文字列を処理する際、その文字列の文字コードを意味する。
LinuxやUNIXではEUCコードにするのが無難なのだが、
携帯サイトで絵文字の処理を行う場合、Shift_JISの絵文字が
PHPソースを処理する時点で、EUCに文字列が変換された上で処理されるので
文字化けの可能性がある。
なので、携帯サイトではSJISに設定しているという。
  | 
  この設定で問題がないかどうか確認するために、簡単なページを作り
IEで表示させた。
  そして、ソースを開く。Shift_JIS表示ならWindows上で日本語は化けない。
  結果は見事に成功した!!
  この時、感激した。
  というのも、PHP3のプログラムソースはEUCコードを使っているのに、
IEに出力されるHTMLのソースはShift_JISに変換されているからだ。
  同様に、PostgreSQLに入れている日本語データがEUCなのに、
表示はShift_SJISになっている!!
  思わず感激してしまった  ← これで携帯端末をつくるから無謀だなぁ (^^;;
  php3.iniの設定の部分が理解できて、ルンルン気分♪
  文字コードの問題が解消されたので、プログラムにとりかかる。
  さてさて、ホームページの言語とならば携帯各社とも違う。
端末の種類と表示言語の違い
  
(注意)
あくまでも2002年3月頃の話です。 | 
ブラウザー 携帯の名前 | 
言語名 | 
私の独断と偏見の見解 | 
IE Netscape | 
HTML言語 | 
でも、細かい部分になると方言が出てくる | 
| i-mode | 
CHTML言語 | 
細かい設定をしない限り、HTMLを知っていたら問題なし | 
| J-SKY | 
名称不明 (^^;; | 
細かい設定をしない限り、HTMLを知っていたら問題なし | 
| EZweb | 
HDML言語 | 
HTML言語とは日本語と中国語並みの違いがある | 
  J-SKYは、ほどんどHTML言語に似ているため、余り手間がかからない。
でも、人間は過ちは犯すので、検査・確認は必要。
  周りに、ホームページも閲覧できるJ-PHONEを使っている人を探したら、
私の部長が持っていた。
| 部長と私とのやりとり | 
| 私 | 
携帯、お借りしてよろしいですか | 
| 部長 | 
お金のかかる変なサイトに入らんといてな | 
 部長から借りた携帯で画面表示を確認する。
 やはり、入力間違いなどで、表示がおかしかった箇所があった。
 それで修正をかける。
  後で気づいた話。
  ほとんど、HTML言語に近いのだから、NetscapeやIEで確認できたが、
その時は携帯というものしか頭になかった  (^^;;
  
  J-SKYは、問題なかった。だが、EZWebに問題があった!!
  本社でAUを使っている人がいない上、しかもHDML言語。
はじめて触る言語な上、検査・確認をとりながらの開発ができない!!
  そこで外注(?)ということで、大学時代の後輩に頼んで見てもらうことにした。
  はじめに、こんな簡単な物をつくったみた。
| AUでテスト表示させるためのPHP3のプログラム | 
<?php
$carrier = jhp_carrier();  //  ブラウザーの判定
if ( $carrier == "E" )  //  AU  (EZWeb)
   {
    printf("<HDML VERSION=\"3.0\" PUBLIC=\"TRUE\">\n");
    printf("<DISPLAY>\n");
    printf("おぬしAUを使っているな!<BR>\n");
    printf("</DISPLAY>\n");
    printf("</HDML>\n");
    }
?>
 | 
  もし、正しく動けば、EZWebで「おぬしAUを使っているな!」と表示される。
  結果は成功!!  V(^o^)V  万歳!!
  しかし、この成功が、後で、大混乱の原因になるとは、
その時は想像がつかなかった!!
  さてさて、J-SKY用のページの作成は、着々と進んでいった。
  EZWebのテスト環境がないとなれば、困った物だ。
毎回、後輩に頼むといわけにもいかない。
  そこで、AUのホームページを見にいった。
  「EZweb開発ツール・ダウンロード」があったので、クリックする。
  そして、OPENWAVE社のSDK3.2をダウンロードする。
これは、Windows上で、EZWebなどのHDML言語のサイトの開発ツールである。
  さっそく、会社のマシンにインストールしてみる。
  そして、動くかどうかのテストで、上に書いたソースで確認してみる。
しかし、エラーが発生!!!
| テスト画面 | 
エラー表示の内容 | 
  | 
Empty Digest! Check Info window  
for possible bad content-type
 | 
  ぬわにぃ!!  俺の作ったコンテンツにエラーだと!!
  しかし、何度見ても、おかしな点が見つからない。
  開発ツールのSDK3.2の設定がおかしいのかなぁと思い、見てみるが設定に問題なし。
  わけがわからなくなり、パニックに陥る  (@_@)
 携帯コンテンツの状況を見ていた部長。
| 部長と私とのやりとり | 
| 部長 | 
状況は、どないやねん | 
| 私 | 
EZWebで手こずっています | 
| 部長 | 
別に、EZWebに、こだわらんでもええやん。 
i-mode、J-SKYでええやん | 
| 私 | 
とりあえず、i-mode、J-SKYで開発を進めます | 
  反論して水掛け論になっても仕方ないので「とりあえず」と返事をした。
  部長は携帯での活用は、あまりないものと考えていたからだ。
  なぜ、EZWebの開発ソフトでコンテンツが見れないのか、全く見当すらつかず。
  開発ソフトの設定が正しいかどうか確かめるため、EZWebのサイトを見に行くと、正しく表示される。
  そこで、AUのホームページにあったサンプル・プログラム(拡張子がHDML)を
ダウンロードして、表示されるかどうか調べてみた。
  
  結果は、ダメだった (TT)
  ますます頭がパニックに陥った。
  ふと、AUのホームページを見ると、サーバー設定があった。
  よくよく考えると、サーバー設定は読んでいなかった。
  もしかして、これが原因かと思い、見てみると、案の定、そうだった。
  Apacheの設定ファイル(http.conf)の中に、次のような設定を追加する必要があった。
| Apacheの設定ファイル(http.conf)に追加する内容 | 
| 
AddType text/x-hdml;charset=Shift_JIS .hdml
 | 
  さっそく設定して、AUのサンプルプログラム(拡張子がHDML)を見ると、見事に見れた。
  やれやれと思い、今度は、PHPで作ったEZWebのプログラムを見ると、エラーを吐き出した。
| エラーの内容 | 
----------------- DATA SIZE ------------------------
Uncompiled data from HTTP is 868 bytes.
...found Content-Type: text/html.
Content-Type: text/html is not handled by UP.Simulator.
Compiled Digest is 2 bytes.
Empty Digest! Nothing to display.
Digest baseUrl: <internal:error-digest>
  | 
| 
ピンクの部分を見たら、HTML言語と認識しているようだ。
 | 
  なんでHTML言語やねん (TT)
  困った私。でも、それなら「HDMLとPHP」で検索してみようと思い、検索にかけた。
そうしたら、いくつかホームページが見つかったので、開いてみた。
  内容は、PHP言語にあるheader()関数を使えば良いと書いてあった。
  PHPの本を見たら、header()関数があったけど、HDML言語の表示が載っていない。
うーん、困ったなぁと思いつつ、HTML言語で<META>のタグを思い出した。
  <META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=Shift_JIS">
  ならばと思い、header(Content-Type="text/html; charset=Shift_JIS");としたが失敗。
  これならばと思い、header("Content-Type:text/x-hdml");としたら成功した!!
  ほとんど勘でみつけたが、うまくいって万歳、万歳 V(^o^)V
  後でわかった話。
  telnet localhost 80  でログインして、GET / HTTP1.0 コマンドを使うと、
へッダーとコンテンツが出てくる。ブラウザーに送られる情報だ。
  この中に、初期設定でContent-Type: text/htmlがある。
  コンテンツのファイルの形式が、HTML言語の内容だという意味だ。
  そのため、header()関数でHDML言語に対応するように書き換える必要があった。
  HTML言語で <META> のタグは、へッダーの書き換えのためにあるもの。
  私はホームページの場合、HTMLの内容だけがブラウザーにいくとばかり思っていた。
だって、このホームページを編集している時も、Apacheを介さずに、
ftp:///root/web/doc/funto10.html のアドレスで見ながら編集しているもん。
  だからへッダーなんて気づかなかったもん ← おいおい、言い訳かよ (^^;;
  ここで一つ謎が残った。何も設定していない状態で、なぜ、私の後輩の携帯では
HDML言語のコンテンツが見れたのか。
  今だに謎のままである。うーん、ホンマに謎だ。
  とにかく、七転八転しながらも、なんとかEZWebでも表示できるようになった。
  さて、EZWebでも開発できる状態になり、開発を進めることにした。
  とはいえ、HDML言語。HTML言語とは日本語と中国語の差はある。
カードにデッキ。タグも違えば、用語も違う。
  しかし、AUのホームページにしか説明書がなく、書店などに本がないため、
試行錯誤の繰り返しになった。
  もちろん・・・
 頭は混乱  (@o@)
 で、まさに「ムンクの叫び」の表情になっていた。
  まぁ、なんとかなるさと開き直りながら作っていった。
  しかし、これで全てがうまく行くとは限らない。
  
  いきなりエラーが出た。原因は容量超過だった。
  携帯コンテンツの場合、容量制限が出てくる。
  容量制限の解決方法は、文字数を削るのみ。
  そこで、私はリンクの部分に着目した。
| プログラムの中身 | 
printf("<A HREF='index.php3?maker=$qrec->maker&kind=$qrec->kind&gamen=4'>
$qrec->kind : $qrec->form </A><BR>\n");
 | 
| 携帯に送られる情報 | 
<A HREF='index.php3?maker=AAAAAAAAA&kind=BBBBBBBBB&gamen=4'>
AAAAAAAAA : BBBBBBBBB </A>
  | 
 うーん、確かにリンクの部分で<A>のタグの内部のmakerの変数は、
文字変数で固有名詞を使っているため、文字数が必然的に増える。
  これらの文字数を削減しないと、容量オーバーになる。
  そこで、makerという部分の固有名詞と対応する数字(id2という変数)を作って、
数字を当てはめる。
  そうすると、文字数が少なくなり、うまくいくはず。
  そこで次のように書き換えた。
| プログラムの中身 | 
printf("<A HREF='index.php3?id2=$qrec->id2&kind=$qrec->kind&gamen=4'>
$qrec->kind : $qrec->form </A><BR>\n");
 | 
| 携帯に送られる情報 | 
<A HREF='index.php3?id2=3&kind=BBBBBBBBB&gamen=4'>
AAAAAAAAA : BBBBBBBBB </A>
  | 
  これだと、かなり文字数を押さえられる。上の例だと8バイトの節約。
  結果は成功。文字数を押さえることがうまくいった。
  そして、携帯3社とパソコンのブラウザーで閲覧できる検索システムが完成した。
  担当の部長に報告。部長が自分の携帯を使ってみてみる。
そして、「これはいけるで」と言ってくれた。
  部長、最初は携帯で検索は懐疑的だっただけに、評価が変わった。
まさに「百聞は一見にしかず」だった。
  実際に、お客さんが使ってくれるかどうか、わからない。
  結果は、鬼が出るか蛇が出るか。とにかくお客さんの反応が楽しみだ。
  もちろん、何時に、どのデータを、どのブラウザーで閲覧したか、記録をとる。
  これらのデータを分析して、携帯コンテンツの有用性などが確認できたり、
格好良く書けば・・・
  携帯ソリューションができたら、面白い!
  となる。
  未来指向で前に進む今日この頃。
  (2006/9/16追加)
  実際には、あまり携帯は使われませんでした。
 詳しくは「システム奮闘記:その12」(名ばかりの携帯ソリューション)
をご覧ください。
さいごに
  オープンソースを活用しますと、費用をかけずに、システムが構築できます。
書籍とネットがあれば、なんとか自力でできることもあります。
  しかも、大企業が高いお金を出して外注した物と互角に戦えます!!
  最後に、携帯3社でコンテンツの閲覧を可能にしてくれた、細川さんのJHPを始め
PostgreSQLやPHPなどのオープンソースの、ありがたみに感謝します。
| JHPについて (2011/10/18) | 
その後、PHP4からは携帯判別がしやすくなったため
JHPを使う事はなくなりましたが
ありがたかった存在には変わりありません。
JHPや、うそぐれすの細川さんは千客万来亭におられます。
  | 
次章:「PostgreSQLとMS-Accessとの連動までの長い道程」を読む
前章:「ディスクパーティションの話」を読む
目次:システム奮闘記に戻る