携帯コンテンツのつくり方


 日記にこういう小難しいことを書くのは「俺ってどう? こんなことやっててスゴイでしょ?」という自慢である。もちろん技術情報を提供しようという高尚な考え方の人もいると思うけど、私は違う。ハッキリ言って自己顕示欲の現れだ。だって自慢したいんだから仕方ない。自分のことをひけらかそうと思わないなら、そもそもサイトを作ろうなんて思わないだろうし。
 でも人によってはこういう情報が役に立つかもしれないので、今回はいつもより気合い入れて書いてみます。

 某掲示板を運営していて、携帯からの利用者の意見が来た。どうやらiモードからだとマトモに表示されていないらしい。元のスクリプトは CGI に直接アクセスすれば見られると説明にはあったが、私がケータイコンテンツというものに興味がないというか、むしろバカにしていたぐらいなので全く動作確認などしていなかった。iモード携帯は持っていない上、使っている au に関しては EZweb どころかやメールさえ滅多に使わない。したがってどんな表示になるのかも全く想像がつかない。
 困ったなぁと思いつつ、とりあえず DoCoMo の開発者用サイトで HTML の仕様書を見ようとしたら、そこに PC 上で携帯の表示をシミュレートする Windows 用のソフトがフリーで置いてあった。これはありがたい。

iモードHTMLシミュレータ
http://www.nttdocomo.co.jp/service/imode/make/content/html/tool/
iモードHTMLシミュレータII
http://www.nttdocomo.co.jp/service/imode/make/content/html/tool2/

  NTT謹製のiモードHTMLシミュレータには古いバージョンとIIがあったので両方入れてみた。IIの方は FOMA などの画面が大きく新しめの機種を再現しているらしい。起動して早速その掲示板にアクセスしてみると確かにこれはひどい。というかよくこんな画面でアクセスする気になるものだ。まあIIの方だとなんとか「見れる」程度なのだが、問題は古い方。こちらについては文字が完全に化けてしまって読むことすらできない。
 調べてみたら DoCoMo 携帯は基本的にシフトJISにしか対応しないという。この掲示板はアスキーアートなどで半角カタカナが多用されることを考えて、全ての文字コードを EUC に書き直していた。他にも色々スクリプトを書き直しているため、携帯表示用のスクリプトでことごとくエラーを吐いている。FOMA などの最新機種は EUC にも若干対応しているようで、何とか表示できていたようだ。旧機種は無視してとりあえず文字は「読めればいい」ので、まずはHTML表示のエラーを直す。匿名でも投稿を受け付けるようにしているため、名前が空欄になる部分を if〜else で「名無しさん」と埋めるように改造。これでとりあえず解決。

 と、思ってローカルの Apache のバーチャルアドレスから表示確認しようとしたら表示エラー。サーバが存在しないと出る。おかしいなと思ってiモードHTMLシミュレータIIの[ブラウザ]>[オプション設定]>[ネットワーク設定]を確認したところ「HOSTSファイルを参照する」のチェックが外れていた。ここにチェックを入れて内部参照できるようになって解決。私のようにローカルのCGIテスト環境でWindowsのHOSTS設定している人は要注意だろう。

  IIで正しく表示されることも確認できて、本サーバにアップ。試しに EZweb で初めてアクセスしてみると、むむう、こちらは完全に文字化けしてしまう。どうやら EZweb はシフトJISのみしか対応していないらしい。こうなると悔しいので、こうなったら文字コードも直すことを決意する。
 ただしログから何から全部をシフトJISに戻すのはハッキリ言って無茶な上に改造した意味がない。というか数パーセントの利用者のため、たかがケータイのためにPC上で正常に動いているものを全部作り変えるのは無茶だ。スクリプトをいろいろ解析した結果、jcode.pl で全角カナを半角カナに変換している関数を見つけた。なるほど、CGI でログをいじらずに表示だけを切り分けているようだ。ファイルの I/O は増えるが表示前にテキストを一気にコンバートすれば済みそうだ。

 いろいろいじっているうちに、このスクリプトの構造が分かってきた。 CGI ファイルにアクセスするとまず UserAgent で携帯か否かを判定している。UA の先頭に DoCoMo、KDDI、J-PHONE という文字列があれば携帯表示用のサブルーチンに進む。機種によって若干の表示調整を行っているようだが、すでにその分岐が DoCoMo 505i 以前のものと仕様が古く、正常に動作していないようだった。とりあえずそれらをコメントアウトして、

&jcode::convert(\$imode_html,'sjis');
&jcode::z2h_sjis(\$imode_html);

と、すでにサブルーチンで $imode_html に格納されている〜のタグとテキストを一気にシフトJISに変換し、カタカナも携帯表示用に半角カタカナへコンバート。そしてiモードの場合はHTTPヘッダ情報に受信ファイルのバイト数を示す「Content-length」が必須になるため

my $len = length $imode_html;

と、バイト数を調べ

print "Content-length: $len¥n";
print "Content-type: text/html¥n¥n";
print $imode_html;
exit;

と書き出す。意外にあっさりと変換されて表示もスムーズ。これで旧バージョンのiモードHTMLシミュレータだけでなく、EZweb からの表示もOKとなった。

 こうしていじりだすとだんだん携帯コンテンツをつくるのが面白くなってきた。いろいろと調べてみると携帯のダイヤルボタンでダイレクトにリンクさせる独自の「accesskey」というタグを発見。

<a href="index.html" accesskey="1">ホーム</a>

のように記述すると、携帯利用者には当たり前の事なのだろうけど、これで[1]のダイヤルボタンを押すだけでダイレクトに index.html にアクセス。いちいち上下キーでリンクを移動する手間を省くことができるらしい。さらに携帯の独自コードでダイヤルボタンの「絵文字」を表示できるようで、ユーザはこれを見て「ダイヤルボタンで直リンク」と判断するようだ。ダイヤルボタンの絵文字の 1 は 驪 というコードになるため、

<a href="index.html" accesskey="1">&#63879; ホーム</a>

のように記述。するとシミュレータで「1 ホーム」のように表示され、いかにもケータイサイトらしい作りになった。EZweb も同じ絵文字コードのため(厳密には「互換」であって、これが後に私を苦しめるのだが…)、試しに自分の au ケータイでブラウジングしてみるとちゃんと絵文字も表示され、ボタンでサクサク移動できてなかなかよろしい。恐らく以前よりも非常に軽快な操作になっただろう。

 2つのキャリアに対応できるようになると欲が出て、SoftBank 携帯への対応もやりたくなってきた。調べてみると SoftBank にもウェブコンテンツビューアというツールが用意されていた。

ウェブコンテンツビューア
http://developers.softbankmobile.co.jp/dp/tool_dl/web/tool.php

NTTのものより様々な機種/メーカーが選択できて機能も豊富。絵文字も入力ツールが始めからついている(iモードは別ツール)。そのため最初は慣れるのに戸惑った。
 使い勝手が分かって、いろいろな機種で現在の状態を確認すると、iモードやauでは表示されていたダイヤルボタンのところが「驪」とそのままコードが丸見えになってしまうことに気づいた。調べてみると J-PHONE 時代から絵文字コードが他キャリアと互換性がないとのこと。これは困った。だったらわざわざ絵文字を使うのはあきらめて「1.」と書いておけばいいのだろうが、それではせっかく組み込んだのにイヤだ。

 色々調べてみたところ、どうやらバイナリコードをそのまま埋め込めば表示ができることを発見。[1]ボタンなら$F<と埋め込めばいいらしい。ただしそのまま CGI に埋め込むとエスケープ文字や特殊文字とかち合ってエラーを吐く文字もあるため、
$a_key1 = ‘$F<';

のようにシングルクォーテーションでくくって変数化。これで DoCoMo/au と SoftBank を UA で判定して分岐させ、$a_key1 を入れ替えて表示させればOK…と思いきやまた問題。全く設定した文字が表示されない。分岐が反映されないのだ。どうもおかしいと思って、ウェブコンテンツビューアの「HTTPログ」を確認すると

User-Agent: J-EMULATOR/4.0/J-K51/SN12345678901 KW/ Profile/...

などと表示されている。UA で J-PHONE、Vodafone、MOT-、SoftBank と先頭につくものを SoftBank ケータイと振り分けていたのだが、どうやらウェブコンテンツビューアの UA は J-EMULATOR やら Semulator などワケのわからんものになっている。仕方ないため、以下のようにして分岐させてみる。

if ($ENV{'HTTP_USER_AGENT'} =~ /^(?:DoCoMo|KDDI|UP)/) {
    $a_key1 = qq|&#63879;|;
    $a_key2 = qq|&#63880;|;
    $a_key3 = qq|&#63881;|;
.....
}
elsif (($ENV{'HTTP_USER_AGENT'} =~ /(?:J-PHONE|Vodafone|MOT-|SoftBank)/i) || ($ENV{'HTTP_USER_AGENT'} =~ /emulator/i)) {
    $a_key1 = '$F<';
    $a_key2 = '$F=';
    $a_key3 = '$F>';
    .....
}

乱暴ではあるが大文字小文字関係なく「emulator」とマッチすれば無理矢理 SoftBank ケータイということにしておく。まあ他のブラウザでヒットしたとしても、ロクなものではないだろうし…

 そんなこんなでようやくそれっぽくなってきたのだが…まだまだ格闘の日々は続くのであった(って続くの?)。

画像掲示板

 しばらく日記の更新が途切れていたが、別に何もしていなかったわけでもないし、飽きたわけでもない。実はとある掲示板を運営するようになってしまったからである。

 画ちゃんねるの事件以来、いつも巡回していた某画像板が1年前に機能停止された。荒れることも少なく「オトナの社交場」と称されるほど居心地のいい場所だったため、そこの住民が勝手に作ったまとめサイトがあちこちにあった。私が自鯖で運営しているものもその一つ。だが本家そのものがなくなり、復活の兆しが見えないまま住民は次第に離散、諦めのムードが漂い始めた。そこへ元来仕切りたがりの私が「代替サイト」として勢い余って設立してしまったのがこの掲示板である。そこの設立と改良に今日までかかってしまったという訳。

 匿名の、それも画像が貼れる掲示板。著作権や18禁画像やらリスクが高いものでありながら、何の収入にもつながらない完全なボランティア。それも社会に何の役にも立ちそうにない。かなり面倒臭いことになりそうなので立ち上げには迷いがあった。そんなことを他の関連サイトでグチグチとこぼしてたら「立てちゃえ!」とレスされて、半ばカッとなって立てたというのが本音。全く我ながらいつまで経っても後先考えない行動だと思う。

 本家の CGI スクリプトは配布されていないため、自分が使い慣れたフリーの掲示板スクリプトにカスタマイズを加え、デザインも Web Archive に残っていた本家のものに近づけた。4月末に公開してから現在まで9回の改良を加えてようやく最近になって本稼働といえるようになった。それでもまだまだ改善の余地がありそうな気配。実はある特定の動作を行うと 500 エラーが出るのだが、スキルがあるわけではないので未だ原因が特定できない。

 それでもスクリプトをいじって新機能がちゃんと動くと楽しくて仕方がない。昨日も DoCoMo のiモードの仕様を調べて動作確認ツールをダウンロードし、携帯アクセスに改善を加えてみたりと需要を無視して楽しんでいた。今日は初めて自分の携帯からネットに接続してみたし(携帯は普段「電話機」としての機能しか使わない人なので)。PerlMagick を初めて使ってみたり、その他 Perl の基本のおさらいと応用を繰り返し、最近やたらにプログラムスキルが上がってきた。昔できなかったことができるのは自分でもうれしい。

 で、肝心の掲示板の状況だが、公開し始めたときすでに本家の板がなくなってから1年近く経っているので住民の大半は戻ってこない。しかし最近になってアクセスが倍増し、元の雰囲気が戻ってきた。自分自身も「名無し」で書き込みを楽しんでいる。やっぱりここの住人は最高だ。ヒマさえあれば巡回してしまう程だ。

 しかし楽しいだけでは済まされない。今後様々なトラブルが予想されるので、想定されるものには先手を打って規約を細かく設定。なおかつ12時間以内の監視を怠らない。というかこの点は私がネット中毒者なので問題ないし、実際6時間以内にアクセスしているけれど。あと苦情メールについても常に持ち歩く Zero3 にも転送されるように設定し、迅速に対応ができるようにしている。それでも想定外のものが出るのは人生○十年の経験で分かっているが、法令や判例について研究は怠らないようにしているので裁判沙汰には発展しないだろう、と思う。

 自分が死ぬか飽きるか、法律が変わったり逮捕されたりしない限り、しばらく管理者としての余計な手間が増えてしまったが、一度立ち上げてしまえば大した手間じゃないし、トラブルも引っくるめて楽しんでしまおうかと考えている。

 しかし金にならんことばかり手を出すな…

Perl Magick


 諸般の事情により PerlMagick(CGI で画像の加工を行うことができる Perl モジュール)を Windows のローカルテスト環境に入れようとしているのだが、昨日からどうにもうまく行かない。

 検索してみると普通に「ImageMagick の Windows 版をダウンロードして、インストールの際に PerlMagick のインストールオプションにチェックを入れればいい」らしいのだが、その通りやってもダメ。なんか一瞬開いた DOS 窓で Failed とか出て、読む間もなく消えてしまってるのが気になる。ImageMagick は動くがテスト用 CGI が動かない(試しに借りてるサーバにうpしてみたらちゃんと動く)。DOS 窓から Perl -wc test.cgi とデバッグしても「PerlMagick がねえよ!」とエラー。Perl のライブラリ内を見ると PerlMagick モジュールが入っていない。ppm (Perl Package Manager) からインストールしようとしても PerlMagick そのものがリストにない。CPAN でやってみたらパッケージが見つかって、ダウンロードもちゃんと始まったのだが途中でエラー。むむう。

 インストールされた ImageMagick のプログラムフォルダ内を確認したら PerlMagick というフォルダ内に Image-Magick.ppd という ppm 用のファイルを見つけたので、

> ppm install Image-Magick.ppd

と打ってみたのだが、

ppm install failed: The PPD does not provide code to install for this platform

などと出る。いろいろググって Perl のライブラリフォルダ内に直接ブチこんでみたりもしたが、まったく動かない。どうやら現在使っているメインマシンの Athlon64(AMD64)プロセッサでは相性が悪いらしい。

 試しに ImageMagick-6.4.1-1-Q16-windows-x64-static.exe を使ってみたりしたが、OS がだいたい 64bit 版じゃないから今度は ImageMagick そのものが動かない。ImageMagick のインストールオプションで出てくる Perl のバージョンが違うのが悪いのかと思って、Active Perl 5.8.8→5.10.0 に入れ直す。ダメ。ImageMagick の Q8 やら Q16 やら dll やら Static やら全部試してみたがどうにもならない。

 最終手段としてエラーメッセージそのものをググってみる。すると以下の対処法を発見。
It_lives_vainlyの日記」2008.03.13
http://d.hatena.ne.jp/It_lives_vainly/20080313

意味はよくわからないが「ppmにリポジトリの追加」をすると ppm ですんなり入るらしい。以下を「かいふくのじゅもん」と思って

> ppm rep add "bribes" http://www.bribes.org/perl/ppm

をまんま DOS 窓にコピペして Enter を叩く。ん? なんか2つのパッケージリストが追加されたみたい。ppm 起動してみると、あった、ありましたよ!>PerlMagick。ppm 上でこれをマークして Run させるとタタタッと画面が進んでエラーもなく終了。テスト用 CGI を起動してみると…やったぁ、無事動作。

 今回は徹夜しなかっただけマシかな。先人の知恵に感謝!

…えーと、それはそうと最近コンピュータとち○この話題ばかりですな。
 みんなついてきてるかーい? いぇー(馬鹿)。