システム奮闘記:その10

携帯3社のコンテンツ作成の物語



Tweet

(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言語のサイトの開発ツールである。
  さっそく、会社のマシンにインストールしてみる。

  そして、動くかどうかのテストで、上に書いたソースで確認してみる。
しかし、エラーが発生!!!

テスト画面 エラー表示の内容
AUでの表示画面を出すソフト 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との連動までの長い道程」を読む
前章:「ディスクパーティションの話」を読む
目次:システム奮闘記に戻る

Tweet