2008年3月の投稿

Ktai Style に携帯絵文字の入力機能を付ける
この土日は、寝過して日帰り旅行ができなかったので、Ktai Style に携帯絵文字の入力機能を実装すべくコーディングしていました (というか、それで夜更しして寝過したような;-)
携帯の絵文字入力機能は、技術的には絵文字の文字コードを探索して、Ktai Style 用の絵文字コード (<img localsrc="XXXX" />
) に置き換えるだけで、そんなに難しいものではありません。大変なのは、各社の絵文字コードをスクリプトに入れ込む作業です。EZweb が 641 文字、SoftBank が 485 文字 (Vodafone 時代の文字を含む)、i-mode が 252 文字、WILLCOM が i-mode 絵文字と独自絵文字 162 文字 (計 414文字)、イー・モバイルが、i-mode 絵文字と独自絵文字 26 文字 (計 278 文字) あります。合計で 1566 文字になります。最低でも 1566 行必要なわけです。
しかも、他社絵文字への変換テーブルがありますから、1566 文字×4キャリアで6264行の変換コードが必要です (イー・モバイルはドコモ用スクリプトを流用可能)。各社の絵文字番号と Shift_JIS コードを関連させるスクリプトは比較的簡単に作れました (i-mode, SoftBank は絵文字番号と Shift_JIS コードがほぼ連続に対応しているため)。しかし、他社絵文字への変換テーブルが大変です。1文字1文字手作業で対応づけないといけませんから、膨大な作業になります。
そこで、キャリアごとの絵文字番号で保存するのではなく、できるだけ EZweb の絵文字に正規化させることを検討しました。数字・トランプマーク・お天気など、どのキャリアにもある絵文字は、EZweb の絵文字番号を使うわけです。Ktai Style のテンプレートでは EZweb の絵文字番号を使っているので、ごく自然な実装に思えます。この方法だと、絵文字番号と Shift_JIS コードの比較表さえ作れば、他社絵文字への変換テーブルが不要になるため、コーディングが楽になります。その電話会社しかない独自絵文字だけ、変換テーブルを作ればいいのです。
しかし、WILLCOM 絵文字で問題が出ました。WILLCOM は、ドコモ絵文字が丸々使える上に、独自絵文字も使えます。しかも、WILLCOM 独自絵文字にも、数字・トランプマーク・お天気アイコンがあります。そう、正規化できないのです!! ドコモ絵文字の「晴れ」と、WILLCOM 絵文字の「晴れ」を同じ「44番」としてしまっては、それぞれの使い分けできず、不便かつ動作が分かりにくくなります。
さらに、Shift_JIS コードを読み取る時点で正規化するということは、その変換テーブルにバグがあったとき、間違った変換のままデータベースに記録されるという問題も出ます。各社の絵文字番号と Shift_JIS コードの対応は、比較的連続しているのでバグは出にくいですが、他社絵文字の変換テーブルは数値が非連続なので、ミスが出やすくなります。
結局、最初に実装通り、各社の絵文字番号をそのまま記録して、出力時に閲覧端末に応じて絵文字変換させることにしました。コードは大きくなりますが、検証はこちらの方がやりやすいため、品質も高くなるでしょう。
とはいえ、土日を使っても、i-mode, WILLCOM, イー・モバイル と EZweb の対応を書くだけで終ってしまいました (i-mode 表示用スクリプト)。残りはソフトバンク絵文字ですが、他4社と相違点が多いためなかなか手強く、時間がかかりそうです。
なお、巷には携帯絵文字変換ライブラリーの類いは転がっているのですが、Ktai Style という GPL プログラムに組み込めないライセンスだったり、多機能すぎたりするので、スクラッチから書いています。

三菱電機が携帯電話事業から撤退
きのう、三菱電機が携帯電話事業から撤退すると発表しました。NTT ドコモに D シリーズ端末を長年供給しており、いわゆる「御四家」(D,F, N, P) の1つでした。シャープ (SH) 参入以後は「御五家」という状況でしたが。
最近では三洋電機が京セラに携帯電話事業を譲渡したニュースがありましたが、それに匹敵する業界再編ですね。古くは、デンソーの撤退、パイオニアの撤退、国際電気の撤退などがあって、それらのメーカーの端末を使っていた人は残念な思いをしたものです。デンソーは「まめぞう」、パイオニアは「全面液晶」という他メーカーにない特徴があったので、「撤退されたら使う端末がない!!」という人もいたようです。
わたしが三菱端末を所有したのは1回だけで、関西デジタルホン時代の DP-222 です。使い勝手はいまいちで、それ以後三菱端末は持っていません……。
2年くらい前は、D,F,N,P,SH では富士通 (F) がいちばん売れてなさそうで、「撤退するとしたら F だろう」と思っていました。実は、らくらくホンが順調に売れており、指紋認証、強力なセキュリティー機能、ワンセグなどの機能で徐々に人気が出ているようです。インターフェースも使いやすく改善されているようで、906i シリーズは F にするかもしれません (F901iT みたいに Bluetooth がつけば最高なのに!!)。

Ktai Style 1.11 は管理機能が WordPress 2.5 未対応
3月前半にはリリースされるという噂の WordPress 2.5 ですが、遅ればせながらナイトリービルドを入手して Ktai Style の動作確認をしてみました。閲覧部分は特に問題なさそうですが、大きくデザインが変更された管理パネルについては、動かない部分がいくつかありました。
新規投稿ができない (投稿の編集はできる)←別のテスト環境ならばOK- コメント一覧が出ない。
- PC 向けログイン画面に携帯電話でアクセスしても携帯ログイン画面にリダイレクトされない (wp-admin/ 配下へのアクセスならリダイレクトされる)
Ktai Style の管理機能は、データベースを直接いじる部分はほとんどなく、wp-admin/ 配下の API を使っていますが、その API が少し変化しているようです。わずかな手直しで修正できそうなので、WordPress 2.5 対応をしたバージョン 1.12 を週開けぐらいには出すことにします(追記) 絵文字対応も盛り込んだ 1.20 を WordPress 2.5 リリース前後に出せそうです。ついでに、以下の改善を行う予定です。
- 各社 3G 端末、WILLCOM、スマートフォン等で出る「画像を表示する/リンクに変換」のメニューを、表示中ページに画像がない場合は隠す。
- 携帯電話用のページ分割で、ol 要素の途中で分割された場合、ol 要素の start 属性を用いて、項目番号を前ページから継続させるようにする (前ページが8番目の途中で分割された場合、現在ページは 8 という項目数字から始まる)
- 外部リンクへの中継ページで、クエリ文字列 (? や & など) を含む URL が途中で切れてしまう問題を修正しました。また、i-mode, EZweb の場合、URL のコピーをしやすいようにテキストフィールドを付けました (ソフトバンクはテキスト中の URL を直接コピーしてください)。
- 附属テーマにおいて、絵文字の代替文字列が抜けていた (
<img localsrc=”XXXX” /> となっていた) 部分を修正 - 標準のパーマリンクを使用している場合、SoftBank PDC 等の古い端末において、コメント閲覧・コメント投稿などのリンクがうまく動かない問題を改善しました。
- W-ZERO3 シリーズ、EM・ONE、htc Z 等の Windows Mobile スマートフォンにおいて、
ks_term_name()
が適切な機種名ではなく「Windows CE;」という文字列を返していた問題を修正 (バージョン 1.10, 1.11 のみのバグ) - テンプレートタグ
ks_ordered_list(), ks_comments_link(), ks_comments_post_link(), ks_back_to_post()
は、絵文字 (数字、四角、矢印等) の直後からリンクを張るようにした (絵文字自体はリンクされません) - 全テーマの page.php で余分な div 要素が出ないよう調整
- redportal テーマで、コメント停止中の投稿において、コメント一覧ページの hr 要素がダブってしまう問題を修正
- WordPress 確認ウィンドウ (コメントエラーや外部サイト接続確認などの表示) で XHTML 文法違反になることがあった問題を修正しました。
- 次の独自フィルターフックフィルターフックを追加しました:
redir
- 次のテンプレートタグを追加:
ks_is_menu(), ks_applied_appl_xhtml()
コメントや投稿本文への絵文字入力機能は、他社絵文字変換テーブルが未完成なので、まだリリースできません。
[追記] 新規投稿は別のテスト環境で OK でした。ログイン画面のリダイレクトがうまくいかない問題を発見しました。さらに、次期バージョンでの改善事項も追加しています。
[追記] 3月14日、バージョン1.20をめでたくリリースいたしました。結局、WordPress 2.5 の正式リリースを待たずして、WP .25 対応と携帯絵文字入力をサポートすることとしました。

SF.JP もついに PHP5 に
Ktai Style などの配信元である SourceForge.jp (SF.JP) のサーバーで、やっと PHP がバージョン 5 になることが発表されました。これで、WordPress Plugins/JSeries のウェブサイトも、WordPress 2.0 系統から 2.3 なり 2.5 なりにアップグレードすれば、Ktai Style が入れられますね (現状はモバイル対応まったくなし)
今年になって、なんとか PHP5 への移行が進みつつあります。Ktai Style が PHP4 対応を行う必要性はまったくないと言ってよいでしょうか。というか、「Ktai Style を使いたいために PHP5 にする」ぐらいの勢いが欲しいところです;-)

WordPress 2.5 対応はけっこう大変
Ktai Style の WordPress 2.5 対応を行なっていますが、けっこう変更すべき箇所が多くて大変です。開発中の日本語リソースも入れてみると、ところどころ英語の部分が残ります。これは、Ktai Style が WordPress コアのローカライズ文字列を使っているものの、WordPress 2.3 以前と 2.5 で違ってしまったことを意味します。2.5 の ja.mo でそのローカライズ文字列が存在しなくなると、英語のまま残ってしまうわけです。こういう場合、Ktai Style 側でローカライズ文字列を定義してしまうか、WordPress のバージョンを判定して使用する文字列を差し替えるかの対処が必要です。
新規投稿については、2種類のテスト環境で、できる/できないが違っているのですが、できない環境が Windows 環境ということで、後回しになりそうです。PC 向け管理パネルでは投稿できるので Ktai Style の管理機能に不備があると思われるのですが、Mac OS X 環境 (==UNIX 環境) では OK なのが不可思議です。PHP のバージョンや MySQL のバージョンも微妙に違うため、それが原因かもしれず、難航しています。
もっと困っているのは、PC での管理パネルのデザイン変更です。そのままでは、標準の設定画面と Ktai Style の設定画面のデザインが違いすぎます。class 名が変更されているので、WordPress 2.5 用の class 名を振ってやれば、見た目を揃えられると思っていますが、調整が必要です。
そうこうしていると、もはや「1.11 からのバグフィックス」を越えた違いになってしまうため、WordPress 2.5 対応版は「1.20」としようかと思っています。といっても、絵文字入力対応版を「1.30」とするとバージョン番号がインフレしすぎます。絵文字入力版の完成まで WordPress 2.5 対応を待たせるのもよくないので、とりあえず、WordPress 2.5 対応版を「1.20 ベータ」(いちおう絵文字入力は可能) として、絵文字対応版を「1.20 正式版」としようかと思っています。
そのためには、Jseries Notifier が「-beta」というサフィックスを認識するような修正が必要になってきます。ということで、2,3日中に Jseries Notifier のバージョンアップを行う予定です。
[追記] えいやっ、で他社絵文字変換テーブルを完成させました!! ということで、テストさえ完了すれば、絵文字対応 & WordPress 2.5 対応としてバージョン 1.20 を出せそうです。1週間くらいかけてテストしたいですが、それまでに WordPress 2.5 が出てしまったら、その時点で「1.20ベータ」としてリリースいたします。

JSeries 更新通知プラグインのバージョン 0.80 リリース
WordPress Plugins/JSeries 用更新通知プラグイン「JSeries Notifier」のバージョン 0.80 をリリースしました。変更点は以下の通りです。
- バージョン番号の比較を PHP 関数 version_compare() を使うように変更しました。これにより、「4.3.2RC1」「1.0.0-alpha」などのようなバージョン番号でも、うまく比較できるようになりました。
ここで告知しなくてもみなさんの管理パネルで告知されるはずですが、バージョンアップをお願いいたします。

mb_ereg_replace と 0x5c 文字に悩む
WordPress 携帯対応プラグインKtai Style を携帯絵文字の入力対応にするべく作業中ですが、その検出のために mb_ereg_replace() を使ったところ、2バイト目が 0x5c な文字に悩まされました。
Ktai Style は携帯絵文字を <img localsrc="XXXX" />
というフォーマットで記録するのですが、EZweb の場合は以下のようなコードで正規表現で絵文字の Shift_JIS コードから変換させています。しかし、0xf35c など「2バイト目が 0x5c な文字」でエラーが出てしまいました。self::$pics は、絵文字コードをキー、絵文字自体を値とする配列です。ソースコードは Shift_JIS で書かれているため、バックスラッシュじゃなくて円マークで正当です。
$pics = array_flip(self::$pics); if (! $pics) { return $buffer; } mb_regex_encoding($this->charset); $replaced = mb_ereg_replace( "([¥xf3¥x40-¥xf3¥xfc]|[¥xf4¥x40-¥xf4¥xfc]|[¥xf6¥x40-¥xf6¥xfc]|[¥xf7¥x40-¥xf7¥xfc])", 'isset($pics["¥1"]) ? "<"img localsrc=¥"" . $pics["¥1"] . "¥" />"" : sprintf("&t;img localsrc=¥"ez¥" alt=¥"[0x%x%x]¥" />", ord(substr("¥1",0,1)), ord(substr("¥1",1,1)))', $buffer, 'e');
出たエラーは以下のようなものです。マッチした文字を \1 によって代入した時点で、2バイト目の 0x5c が、次のダブルクォートをクォートしてしまい、閉じブラケット (]) が検出されなくなってしまうようです……。
PHP Parse error: syntax error, unexpected T_
STRING, expecting ‘]’ in /(ほげほげ)/ezweb.php(1905) : mbregex replac
e on line 2
対策をいろいろ考えてみましたが、正規表現オプションの “e” 用のコードで \1 でマッチした部分を取り出すことが原因なので、「e オプションを使わない」もしくは「\1 でマッチした部分を取り出すのをやめる」のどちらが対策となります。それは避けたいため、2バイト目が 0x5c な文字はマッチ条件から除外して、あとで処理することにしました。
$replaced = mb_ereg_replace( "([¥xf3¥x40-¥xf3¥x5b]|[¥xf3¥x5d-¥xf3¥xfc]|[¥xf4¥x40-¥xf4¥x5b]|[¥xf4¥x5d-¥xf4¥xfc]|[¥xf6¥x40-¥xf6¥x5b]|[¥xf6¥x5d-¥xf6¥xfc]|[¥xf7¥x40-¥xf7¥x5b]|[¥xf7¥x5d-¥xf7¥xfc])", 'isset($pics["¥1"]) ? "<img localsrc=¥"" . $pics["¥1"] . "¥" />" : sprintf("<img localsrc=¥"ez¥" alt=¥"[0x%x%x]¥" />", ord(substr("¥1",0,1)), ord(substr("¥1",1,1)))', $buffer, 'e'); if ($replaced) { $replaced = mb_ereg_replace("¥xf3¥x5c", '<img localsrc="' . $pics["¥xf3¥x5c"] . '" />', $replaced); $replaced = mb_ereg_replace("¥xf4¥x5c", '<img localsrc="' . $pics["¥xf4¥x5c"] . '" />', $replaced); $replaced = mb_ereg_replace("¥xf6¥x5c", '<img localsrc="' . $pics["¥xf6¥x5c"] . '" />', $replaced); $replaced = mb_ereg_replace("¥xf7¥x5c", '<img localsrc="' . $pics["¥xf7¥x5c"] . '" />', $replaced); }
なんとも見苦しいコードですが、まあ仕方ないでしょう……。ソフトバンク絵文字は「ウェブコード」という、ESC-$-X-Y-SI という文字群で、マルチバイト対応の正規表現を使う必要がないため、preg_replace() が使えます。preg_replace ならば ‘e’ オプション用のコードで $1 を入れても問題ありません。しかし、絵文字コードにシングルクォート(‘)、ダブルクォート (“) を含むことがあって、そういう文字と 0x5c を含む文字が結合すると、これまたうまく処理できません。仕方ないので、preg_match() でマッチした文字を変数に取り出し、分解してから substr_replace() で戻すという、さらに泥臭い手法になりました……。
// ================================================== public function pictogram_index($webcode) { if (preg_match('/¥x1b.(.)(.)¥x0f/', $webcode, $c)) { $c2 = ord(stripslashes($c[2])); return $c[1] . ($c2 ? $c2 : '92'); } else { return '0'; } } /* ================================================== * @param string $buffer * @return string $buffer */ public function pickup_pics($buffer) { $pics = array_flip(array_map(array($this, 'pictogram_index'), self::$pics)); if (! $pics) { return $buffer; } for ($offset = 0 , $replace = 'X' ; preg_match('/¥x1b.([GEFOPQ])([!-z]+)¥x0f/', $buffer, $webcode, PREG_OFFSET_CAPTURE, $offset) ; $offset += strlen($replace)) { $orig = $webcode[0][0]; $offset = $webcode[0][1]; $seq = $webcode[1][0]; $char = $webcode[2][0]; $replace = ''; for ($i = 0 ; $i < strlen($char) ; $i++) { if (isset($pics[$seq . ord($char[$i])])) { $replace .= '<img localsrc="' . $pics[$seq . ord($char[$i])] . '" />'; } else { $replace .= '<img localsrc="s" alt="[ESC$' . $seq . ord($char[$i]) . 'SI]" />'; } } $buffer = substr_replace($buffer, $replace, $offset, strlen($orig)); } return $buffer; }
ともあれ、絵文字入力は問題なく動作するようになりました。WordPress 2.5 はリリース延期になったようですが、ベータ版での動作は確認できているので、Ktai Style 1.20 は近日中にリリースできることでしょう!!

WordPress 携帯対応プラグイン Ktai Style 1.20 リリース
大幅に機能アップした WordPress 携帯対応プラグイン「Ktai Style」のバージョン 1.20 をリリースいたしました。主な変更点は以下の通りです。
- WordPress 2.5 への対応を盛り込みました。
- イー・モバイルのネット接続サービス EMnet への対応を盛り込みました。
- 携帯電話からのコメント投稿・新規投稿・投稿編集などで絵文字が入力できるようになりました (設定変更が必要)。
- 各社 3G 端末、WILLCOM、スマートフォン等で出る「画像を表示する/リンクに変換」のメニューを、表示中ページに画像がない場合は隠すようにしました。
- WordPress コアが、アポストロフィー、ダッシュ、3点リーダーなどを数値実体参照に変換しても、普通の文字に戻すようにしました (数値実体参照は携帯電話で文字化けする場合が多いため)。
- 携帯電話からの新規投稿/投稿編集で、コメント・ピンバックの許可・拒否を設定できるようにしました。「投稿を削除」はボタンではなくリンクにしました (WordPress 2.5 風)。
- 携帯電話でのコメント編集で、メールアドレス欄を追加しました (なぜか今までありませんでした)。「コメントを削除」はボタンではなくリンクにしました (WordPress 2.5 風)。
- 携帯電話用の管理パネルで、コメントの「一括編集モード」を廃止しました。
- 携帯電話用のページ分割で、ol 要素の途中で分割された場合、ol 要素の start 属性を用いて、項目番号を前ページから継続させるようにしました。
- default テーマで index.php が表示する投稿本文は先頭1000バイトのみに短縮しました。投稿本文が長い場合でもページ分割が起きなくなります。
- (変更点を全部見る)
今回のバージョンアップは、WordPress 2.5/イー・モバイル音声端末/携帯絵文字入力可能、という3つの機能アップが図られています。PC でも携帯絵文字が画像で出るならば「Ktai Style 2.0」を名乗りたかったですが、さすがに1600文字分の画像は作れなかったので、「バージョン 1.20」としています。その他にも、附属テーマの細かい改良を行なっておりますので、ぜひともバージョンアップをお願いいたします。
WordPress 2.5 およびイー・モバイルについては、正式版での確認はまだですが、「おそらく問題ないだろう」と判断しています。正式版や実機を入手すれば、すぐに確認して、もし問題があればバグフィックスいたします。
Google Maps プラグイン Lightweight Google Maps 1.20 リリース
WordPress 用 Google Maps プラグイン「Lightweight Google Maps」のバージョン 1.20 をリリースします。変更点は以下の通りです。
- Ktai Style 1.20 以後を利用している場合、携帯電話でも地図が出るようにしました。
- WordPress 2.5 への対応を盛り込みました。
- 設定画面の場所を、「プラグイン」タグから、「設定」または「各種設定」タブに戻しました。
約半年ぶりのリリースですが、今回は携帯電話でも地図が出るという機能アップを図っています。WordPress 2.5 対応はオマケで、設定画面を WordPerss 2.5 スタイルに合わせただけで、従来バージョンも WordPress 2.5 で動きます。
同一地点の位置情報が複数あるとき、固定ページでのマーカーが重なってしまう問題などは、今回は対応していません。Ktai Style の開発は一段落させて、しばらくは当プラグインをいじった方がいいのかな?

Ktai Style 1.20 は SoftBank 3G での絵文字入力に非対応
昨日リリースした Ktai Style 1.20 ですが、SoftBank の 3G 端末における絵文字入力に対応してないことが判明しました。リリース時点では「SoftBank 3G の ShiftJIS 非対応端末では絵文字入力が無理」ということは判明していたのですが、そういう端末は少ないと思って、リリースノートには書きませんでした。しかし、実際の端末で確認してみたところ、多くの SoftBank 3G 端末で絵文字入力が無理っぽいことが判明してしまいました。
SoftBank 3G が、絵文字を含むときは UTF-8 で返すことがあるのは予測しておりましたが、そういう挙動が多いとは思っていませんでした (マイナーな動作で無視できると思っていました)。SoftBank 3G の場合、絵文字は Shift_JIS で返すようです (PDC はウェブコードで返す)。対応コードをすぐに準備して、バグフィックスを出したいと思います。というか、SoftBank 3G を手元に準備した方がいいのかも……。
[追記 3/17 2:25] CVS リポジトリーに対応コードをコミットしました。ソフトバンクの絵文字 Shift_JIS コードは技術資料 HTML 編 (PDF) の付録Aに記載されていました。本文はよく読んでるのに、付録までは全部目を通してなかった……。実機確認はまだ (持っている人にテスト依頼中) なので、確認終了しだい、リリースいたします。