KDDIのWebサイトに掲載されている、EZweb端末へのダウンロードファイルにチェックサムを埋め込むツールのソースコードについて小さな、ホントに小さな小言。
EZweb + HDMLで着メロや壁紙をダウンロードさせる場合、ファイルにCRCチェックの値を埋め込む必要がある、というのは携帯サイト運営に携わる方は既にご存知のことと思います(私はそれを昨日一昨日知ったヘタレ。だって使わないんだもん...)。で、その処理のサンプルとしてadd_crc.cというCのコードが配布されているのですが、これプラットフォーム毎のバイトオーダの差異を意識しない作りなので、PowerPCやSPARCやMIPSなどのビッグエンディアンな環境では間違ったフォーマットでCRC値を埋め込んでしまいます。一応サンプルを用意した中の人もその辺は認識されているらしく、コメントには
/* チェックバリュー付加 */ /* 注)動作させるプラットフォームによってセットするバイトが逆の場合もある。*/ /* (ビッグエンディアン/リトルエンディアン) */と書いてありますが、何故広く使われうるにもかかわらず環境非依存なサンプルを最初から用意しないのか謎です。だいたいこんな感じで書いてあります
write(fd, (char *)&crc+1, 1); write(fd, (char *)&crc, 1);これを単に
fputc((crc >> 8) & 0xff, fp); fputc(crc & 0xff, fp);とか書けば済むことなんだけど...もしかしてKDDIはIntelアーキテクチャ以外での携帯サイト運営を推奨していないのでしょうか!(違)
このヘンの移植性に関するお話はGNU Autoconf / Automake / Libtoolやプログラミング作法に詳しく書いてあるので興味のある方はぜひご一読を。
また、バイトオーダの話題は扱っていませんがUNIXのプログラミング環境における実装ごとのAPIやパラメータなどの差異や互換性や歴史的経緯については詳解UNIXプログラミングが良い塩梅に詳しいのであわせてオススメです。この本は他にもシステムコールの裏側などの基礎の基礎といえる部分の解説も豊富なので、UNIXプログラマ必読ですね。
mod_ezweb_downloadについて
半分冗談でつくったmod_ezweb_downloadモジュールなんですが、はたしてこれって必要とされる物なのでしょうか?イマドキのEZweb端末ならXHTMLでフツーにobjectタグでリンクするだけでダウンロードさせられるのですが、HDMLしか解さない端末はドレくらい生き残っているんだろう。また普通の商用携帯サイトではそのへんどう扱ってるんだろう?
というわけで冗談で作ったソフトウェアなのでライセンスも冗談らしく、GPLとコマーシャルライセンス(有料)のデュアルライセンスにしました(最低だよあんた)
コードを書く時間よりもパッケージ化(ビルドツールとかcopyrightとか)する方が時間かかったのは秘密です。
とまぁサーバの負荷と戦う携帯サイト管理者の方は是非お試しくださいませ。