集中講義3.携帯端末系開発
Lesson 3.HDMLとは何か '01/12/30
今回は、HDMLについての解説である。年末なので時間はほとんど無い。このページを30分以内に書き上げ、とっとと仕事に戻りたい。
まず、HDMLとは何かという部分について簡単に書いておきたい。HTMLの誤植では無いかとお思いの方もおられるだろうが、誤植では無い。詳しいことは、ここでも見ていただくとして、HTMLを携帯端末用に特化した記述用の言語だと思っていただければ良い。i-mode等はHTMLなのだが、cdmaOne 200/300/400/1000シリーズ等のコンテンツは、このHDMLで書かねばならない。HTMLとは似ているようで何もかも異なるので、うっとおしい限りで、タグもHTMLとHDMLとでは1対1には対応しないのでいろいろ工夫が必要となる。
コンテンツ作成にあたっては、携帯端末からコンテンツをデバッグしていたのでは、お金がもったいないので(最終的な確認はそうするべきだが)、とりあえずは、パソコン上でテストするためのシミュレータを用いる。シミュレータについては、ここからdownloadできる。ここにあるシミュレータにはOpenWaveSDK 3.3.1Jと4.1とがあるが、日本語対応のページをデバッグしないといけないので、前者を用いる。
このシミュレータなのだが、めちゃくちゃ使いにくい。しょっちゅうハングする。実機と動作が違う。おかしなタグを使っているファイルを読み込ませてエラーが出たら、このソフトを終了させて、再度立ち上げないと次のファイルが正しく表示されない等、書き出せばキリが無いほど問題をはらんでいる。まあ、そのへんは目を瞑るとしよう。
次に、HDML/HTMLの両コンテンツを提供するサーバー側は、まずブラウザ判定が必要である。C言語で書けば、以下のようになる。(このソースコードは、この連載の第1回で紹介したyaneCGISDKに含まれる)
LPCSTR psz = getenv("HTTP_USER_AGENT"); if (psz==NULL) { // わかんない } if (strstr(psz, "MSIE")) { /* Microsoft Internet Explorer の場合 */ } ef (strstr(psz, "Mozilla")) { /* Netscape Navigator (愛称 Mozilla) の場合 */ } ef (strstr(psz, "DoCoMo")) { /* i モード携帯の場合 */ } ef (strstr(psz, "J-PHONE")) { /* J-PHONE 携帯の場合 */ } ef (strstr(psz, "UP.Browser")) { /* au,ツーカーなど(DoCoMoの一部機種も含まれる)*/ } ef (strstr(psz, "UPSim")){ /* Up.Simulator */ } else { /* それ以外 */ } |
上述のHDMLシミュレータの場合、UpSimという文字列が返ってくる。
HDMLの書き方については、ここでもここでも見ていただくとして、カードやらデッキやら、意味不明の概念が出てくる。まあ、そのへんは遊戯王でも読んで勉強していただくとして(勉強になるかいヽ(`Д´)ノ)、実際に運用していくときにHTMLとHDMLの両方のコンテンツを用意する場合、両方の種類のファイルを保守していかなければならないとなると、管理がとても面倒である。
そこで、制限付きではあるがHTMLファイルを自動的にHDMLファイルに変換するためのコンバータを用意する。(見てのとおり日本語対応Perl(jperl等)のソースなので煮るなり焼くなりしていただきたい)
このコンバータについては少し解説が必要だろう。まず、HTMLファイルに対する埋め込み文字列の機能として、$で始まる特定の文字列を、特定の文字列に置換するようにしていたのだが、(すなわち、「$USER_NAMEさん、こんにちは!」というようにすると、そこにユーザー名が埋め込まれる)この$文字列はHDMLで他の部分で使うので、ちょっとマズイ。ついでに言えば、主なHDMLブラウザでは、アドレスに日本語(2バイト文字)を渡せないのでHTMLでよくやる「http://xxxxx?name=やねうらお」のように、パラメータを渡してやりたいときは%でエスケープしなければならない。そこで、埋め込み文字列を、このパラメータ部分で使う場合は、上記コンバータではエスケープが必要なところは$%xxx$%に変換,%無しのエスケープが必要なところは$!xxx$!という変換するような仕様になっている。
まあ、そのへんの細かいことはどうでも良い。適当に参考にしていただきたい。あと、たいていのHDML端末には文字変数キャッシュのバグがあったりするし、タグの途中にスペースが途中に入っているだけでタグを認識しなかったり、何かとシビアであるのだが、そのへんの細かいことも目を瞑ろう。
あと、この手の携帯端末用のプログラムを書いていると、携帯端末へのメールでコールバックをする必要が出てきたりして、何かの都合でSJIS⇒JISへの変換が必要だったりすることもあるかも知れない。参考となるページとして、「猫でもわかるプログラミング」の第234章を挙げておく。このページは非常に資料的価値の高いページなのだが、このトップページには中級者以上の方、セミプロの方、プロの方ご遠慮ください。と書いてあるので、仮初にもプロである私は遠慮しなければならないのかも知れない。粂井氏は確か医者だったと思うが、当ホーム・ページの一部または全部を無断で複写、複製、転載あるいはコンピュータ等のファイルに保存することを禁じます。 だとか、言うことがいちいちケチくさいねん!だいたい、ブラウザで見た瞬間、ブラウザキャッシュに保存されるっちゅーねん! ちなみに、このソース、ここで変換後のデータを入れるバッファを(本文の長さ)+1024として確保してあるが、JIS
では1行(または Ascii 文字との区切り目)ごとに漢字始め文字(0x1b
0x24 0x42)、漢字終わり文字(0x1b 0x28 0x42)が入るので、こんな確保の仕方をしたらマズイ。ここはstd::vector等で動的に確保するとかすべき。さらに言えばこのソースでは"RCPT
TO :"になってるが、これ正しくは"RCPT
TO:"でスペースは入れると送信できない!このソースって、本当にテストしたの?とここまで書いて思ったのだが、たぶん、粂井氏もこんなことは百も承知なのだろう。だからこれは、猫でもわかる〜の猫はライオンと同じくネコ科だからして、わざと自分の子供を谷から落とす行為なのかも知れない。そうして、谷から這い上がってきた者のみを自分の子供として認めるのだ。やねうらおは、谷から落ちてそのまま死にそうになったあるよ。わははははは。