システム奮闘記:その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との連動までの長い道程」を読む
前章:「ディスクパーティションの話」を読む
目次:システム奮闘記に戻る