MT4iタグの投稿

2009-04-02

MT4i 風携帯テーマ Spanner

ゆりこ による 03:27:32 の投稿
カテゴリー: WordPressハック
タグ: , , , ,

さっそくですが、昨日のエイプリルフールで使用した、MT4i 風携帯テーマを一般に配布いたします。名称は「Spanner」といいます (Movable Type のアイコンがスパナなので)。WordPress Plugins/JSeries の「Ktai Style テーマ集」にも掲載してあります。

ダウンロード: spanner101.zip (14.9KB)

実はこのテーマは去年のエイプリルフールで使おうと思って開発したものです。当時はまだ独自ウェブログシステムだったので、「WordPress に移行かつ MT4i 風テーマを採用」しつつ「Movable Type にしました」というエイプリルフールを検討したのです。でも、「あまりシャレになってない」と思ったことと、旅行記の方の「ランダム表示」で十分オモロイと判断したため中止し、2009年まで取っておくことにしたものです。今年の場合「Movable Type にしました」という文言はやめて、単純に「MT4i を採用」としましたが、偶然にも、他サイトによる「WordPress への移行エイプリフール」に対する強烈な皮肉になっています ;-)

あと、パソコンでの閲覧で強制的に携帯表示にしていましたが、これは以下のようなコードを my-hacks.php に書くことで実現しています。その仕組み上、携帯テーマの functions.php に書くのでは不可能です。

function ks_force_ktai_mode($ktai, $ua) {
  if (! $ktai) {
    $ktai = new Ktai_Service_Other($ua);
  }
  return $ktai;
}
if (! is_admin() && ! function_exists('login_header')) {
  add_filter('detect_agent/ktai_style.php', 'ks_force_ktai_mode', 10, 2);
}
2009-04-01
くもりのち雨

MT4i を採用

ゆりこ による 00:05:57 の投稿
カテゴリー: WordPressハック,更新履歴
タグ: , ,

MT4i 利用画面イメージ

去年3月31日に WordPress を採用した当サイトですが、世間の潮流に逆らって、MT4i を採用することにしました。さすがに、2003年から公開されているソフトウェアだけに、作り込み度合いが違いますね。非常に高度なハックにより、携帯サイトの URL は従来と同じく「http://www.yuriko.net/」です。

なお、パソコンで見ても携帯風の表示になっているかもしれませんが、それは気のせいです ;-)

(続きを見る…)

2009-03-06
雨

WordPress の携帯表示を Smarty で行う実装

ゆりこ による 19:47:10 の投稿
カテゴリー: WordPressハック
タグ: , , , , ,

ガイドミーというサイトの管理者ブログで、「Smarty を使って WordPress の携帯表示を行う実装」を披露されているのを見かけました (ソースは未公開)。Ktai Style を使わない理由は「PC と携帯で URL が同一だと Google に嫌われる(と作者が思い込んでいる)」からだと思われます(*)。

ウェブログの DB に直接アクセスして携帯表示を作るのは、MT4iwp-ktai.php の手法ですね。はっきり言うと、第1世代の携帯対応のやり方です。Mobile Eye, Mobile Eye+, MobilePressNEO, Ktai Style は、WordPress のテンプレート機構を乗っ取るというやり方で、第2世代と呼べるでしょう。これは単に設計手法の新旧の違いであって、実装の優劣を述べているのではないことに注意してください。優劣があるとすれば、携帯向けサイトの URL が永続的であるかどうか、です (第1世代は携帯閲覧ツールの寿命に左右されるが、第2世代は左右されず永続的です)。

とはいえ、2009年になって、第1世代の実装方法を新規に行うというのは、大胆です ;-) まあ、Smarty を使っているという点を加味すると 1.5 世代と言えるでしょうし、単純な XSS 脆弱性を起こしにくくなるという面ではよい方法だと言えるでしょう。(WordPress のテンプレートタグを XSS を起こさないように使うのはちょっとコツがいる)

ただ、作者の PHP スキルが、「データ中に??などの文字(バイナリデータ?)が存在するのですが、よく分からないので全部削りました」とか「PHP5.2.6 で date("Y年n月j日 H:i"); の『年』が化けるのは PHP のバグ」と言っているレベルなのが不安です。正解は、「年」を Shift_JIS で書くと2バイト目が「N」なので、PHP 5.1.0 で導入された曜日フォーマット文字「N」と解釈されるため、「年」の1バイトが浮いてしまって化けるためなのです。バグというより、date() 関数の仕様ですね。date 関数で文字エンコーディングを指定できるようになるのがあるべき姿だと思いますが、PHP コードを Shift_JIS ではなく、EUC-JP や UTF-8 で書けば回避できるので、仕様変更の必然性は低いでしょう。PHP コードを Shift_JIS で書くこと自体、あまり好ましくないことですし。

あと、au, ソフトバンク向けにも <!DOCTYPE html PUBLIC "-//i-mode group (ja)//DTD XHTML i-XHTML(Locale/Ver.=ja/2.1) 1.0//EN" "i-xhtml_4ja_10.dtd"> という DTD を出力したり、XHTML なのに <HR size="0.5" color="#ccccff"> とか <br> というマークアップがある (大文字だったり閉じタグがない) のもイマイチでしょうか……。今後はこのへんが修正されることに期待ですね。

(*) 作者は「事実だ」と書いていますが、ログから推測される事項はあくまで「意見」であって事実ではありません。いついつにどういうアクセスがあった/いついつの間のアクセス件数はxxだったというのが事実であって、減った/増えたは統計による推論となるからです。

[追記 5月9日] 作者の翌日のエントリーで「サイトを作る目的は多くの人に見てもらうため」と書いておられました。わたしの考えでは、それに必要なことは、まずウェブ標準/各社の規約に従うこと、次にクールな URI を守ること、そして訪問者の立場でデザイン (見栄え・設計両方の意味) をすることでしょう。Ktai Style はそのような方針で作られています。

他人のフレームワークに左右されたくないという下りは実は同感で、わたしの自作プラグインは、「他人のプラグインが信用できない/挙動が来に食わない」から作ったものがほとんどです。PEAR の Net_UserAgent_Mobileなどを使わないのもその理屈です。

2009-01-17
晴れ

mb_convert_kana の a オプションで XSS 脆弱性

ゆりこ による 14:45:58 の投稿
カテゴリー: WordPressハック,ソフトウェア
タグ: ,

先日修正した、Ktai Style および Mobile Eye+ パッチの脆弱性ですが、詳細を公開しておきます。リリース時に公開した情報としては、Ktai Style では「classic テーマに存在したセキュリティーホールを修正」であり、Mobile Eye+ パッチでは「全角→半角変換に伴なうセキュリティーホールを修正」となっていましたが、具体的には「コメントやトラックバックの表示に関して XSS 脆弱性があった」のです。

これは、全角→半角変換で、mb_convert_kana() 関数を a オプション付きで使っていたのが原因でした。このため、(いわゆる) 全角の英数字のみならず、記号類も半角に変換されていました。つまり、<, > というかっこが <, > になってしまったのです。これだと、コメントに以下のようなコードを書かれてしまうと、半角変換によって、JavaScript コードとなってしまいます。

 <script>alert(document.cookie);</script>

しかし、シングル/ダブルクォートは WordPress によってエスケープされるため、以下のコードは通りません。

<script>alert('hogehoge');</script>

シングル/ダブルクォートが使えないため、危険なコードを作るのは困難でしょうが、それでも安全とは言い難いです。

対策としては、a オプションを使わないのが一番確実でしょう。Ktai Style, Mobile Eye+ の場合、画面出力すべてをバッファリングしてその結果を mb_convert_kana() に通しているため、HTML エスケープすることは不可能です (変換前に HTML コードが含まれているため)。といって、<, > に変換されそうな全角記号を先に &lt;, &gt; に置換しておくのは、漏れがありそうで怖いです。

なお、MobilePressNEO は、逐次全角→半角変換を行う方式でしたが、今のところ a オプションをやめる方向で直しています。ちなみに、MT4i の方は、Encode モジュールおよび Jcode.pm による全角半角変換は厳密に英数字のみなので、この脆弱性はないようです (作者にも確認ずみ)。

この脆弱性の発覚により、未パッチの Mobile Eye+ は大変危険な状態となりました。すぐにパッチを当てるか、PHP を 5.0 以降にして Ktai Style をご利用頂きますようお願いします。

2008-06-09
晴れ一時雷雨

非標準 URL で不正なリダイレクト

ゆりこ による 04:07:31 の投稿
カテゴリー: WordPressハック
タグ: , ,

Ktai Style を WordPress 2.3 以降で使った場合、「標準 URL (canonical URL) としてリダイレクトする飛び先が不正になる」というバグがあることが分かりました。例えば、http://example.jp/?cat=3 をリクエストしたら http://example.jp/category/living/ に正規化される場合、Ktai Style では http://example.jp/://example.jp/category/living/ となってしまいます。当然 Not Found になります。

WordPress はパーマリンクを設定していてもクエリー文字列を使った URL でアクセスできるため、WordPress 2.3 以降、パーマリンクを使った URL を強制させるべく、非標準の URL を (クエリー文字列を使った URL など) を標準 URL (パーマリンクを使った URL など) にリダイレクトする仕組みがあります。例えば、living カテゴリー (ID:3) のアーカイブは http://example.jp/category/living/ が標準 URL となります。クエリー文字列を使った http://example.jp/?cat=3 でもアクセスできますが、これは前者の URL にリダイレクトされるのです。しかし、Ktai Style では、「URL のホスト部分を削除する」というフィルターを入れているため、その副作用で「スキーム文字列」 (http の部分) だけ落ちてしまい、「://example.jp/category/living/」がリダイレクト先になってしまいます。この場合、カレント URL が補われて「http://example.jp/://example.jp/category/living/」にジャンプしようとするわけです。

MT4i みたいに、カテゴリーのポップアップメニュー (プルダウンメニュー) を付けたい」というカスタマイズをした場合、プルダウンで選んだカテゴリーアーカイブは非標準の URL のため、標準 URL にリダイレクトされます。カスタマイズを紹介した時点では問題なく動作していたはずなので、それ以後のバージョンアップで不具合が出てしまったようです。

一応対策コードを作ってみましたが、redirect_canonical() が出力するリダイレクト先 URL が不正だったら直すという対処療法的なものです。これだと、対策コードが想定しない不正な URL が来た場合はそのまま通ってしまいます。といって、「URL のホスト部分を削除するフィルター」をなくしてしまうとパケット削減効果が落ちてしまいます。「携帯電話では非標準の URL がリクエストされることは少ない」と考えて、この対策で進めましょうか。

さほど致命的なバグだとは思っていませんので、これの修正を入れたバージョン 1.36 のリリースは、しばらくお待ちください。6月中には出す予定です。Ktai Style 1.50-test3 の方は、redportal テーマに PHP 構文エラーがあるという致命的なバグがあるので、早期に修正版を出したいのですが、他にも調整したい部分がありますので、数日お待ちください。

2008-05-15
くもり

Six Apart が携帯対応モジュールと携帯絵文字を GPL 公開

ゆりこ による 13:49:06 の投稿
カテゴリー: ソフトウェア
タグ: , , , ,

シックスアパートが、TypePad で使っていた携帯電話表示モジュール TypeCast を GPL で公開しました。また、携帯絵文字画像を GPL, CC-by-2.0 のデュアルライセンスで公開しました。

ついに、MT 用携帯表示モジュールが本家から登場ということは「MT4i 終了」ということになるんでしょうか……。もちろん MT4i は継続して開発・提供されるでしょうが、今後は MT4i よりも TypeCast が選ばれるでしょうから、MT4i は前途多難になりそうです。また、Ktai Style のライバルとして TypeCast がターゲットとなります。(追記: プレスリリースに「一般のユーザー様の利用には、同じくGPLライセンスで公開されている、MT4i の利用をお勧めします」という注意が追加されました。MT4i はまだまだ価値があるということですね)

個人的には、そちらよりも、携帯絵文字画像がフリーウェアとして公開されたことに興味があります。GPL, CC-by-2.0 というフリーなライセンスですよ!!。GPL を選択すれば、Ktai Style に組み込んでも問題ないじゃないですか!! 絵文字の数は250種類程度ということですが、さっそくダウンロードして組み込みを検討したいと思います。

Six Apart の絵文字サンプル画像

[追記] ダウンロードして絵文字を確認してみましたが、iモード絵文字しか揃ってなくて、EZweb、ソフトバンク、ウィルコム、イー・モバイルでは抜けがいっぱいあります。自作絵文字も追加する必要はありそうで、組み込み方法はもうちょっと検討しなければなりませんね。

[さらに追記] とりあえず組み込んでみました。吹き出しアイコン、国旗、1時〜12時の時計アイコン (ソフトバンク用) は自作のものを継続利用しています。ドコモ以外で抜けが多いというのはなかなか厳しいものがあるので、ちょびちょびと自作して増やしてみますか。

2008-05-02

当サイトの FireStats 統計結果

ゆりこ による 07:20:14 の投稿
カテゴリー: ソフトウェア
タグ: , , , ,

2週間ほど前に FireStat をインストールしたのですが、ある程度傾向が見えてきました。

まず、ページビューとビジター数の比率ですが、だいたい 2.5ページ/人程度です。本当は平均値は意味がなくて、最頻値が気になるところですが、それは「1ページ/人」が圧倒的に多いはずです ;-)

サーチエンジンからの流入は Yahoo! が一番多くて「灯火の会」「E03CA」「百度」がそれぞれ100件近くあります。「WordPress 携帯」も50件あります。Google はそれより落ちて、「ステージ」「H11T」が50件ほど、「Ktai Style」が40件程度です。100件オーバーの2つは、他のサイトではなかなか記事がないようで、ウチのサイトが主要な情報源になっているのかもしれません。どこかが「灯火の会まとめサイト」を作れば、そっちにページビューが流れるんでしょうが……。

ブラウザーのシェアは驚くべき結果となりました。1位は Internet Explorer ですが 30% しかありません。2位が Openwave UP.Brower すなわち au 端末で 27%、3位は Netfront (ほぼ SoftBank 端末) で17%、4位にやっと PC ブラウザーが復活して Firefox が 14%、Safari は 3% となっています。したがって、OS シェアは、不明 == 携帯電話が 51%、Windows が 43%、Mac が 5% となっています。なぜか、ドコモからの閲覧は非常に少なく、0.1%程度です。うーん、不思議。

日本では、携帯電話からネットを使う人と、PC でネットを使う人がほぼ半々となっていますが、それを見事に証明した結果となりました。いわば、「携帯版ページを作ったら読者が2倍になった」と言えます。Ktai Style による携帯サイトの提供がうまく機能しているわけです。他の携帯対応プラグイン (Mobile Eye+, MobilePress, MT4i) だとどういう結果になるのかは非常に興味ありますね。

[追記] Google モバイル検索とかでは、めったに MT4i で作ったサイトがひっかからないので MT4i は検索エンジンとは相性が悪いと思っていました。どうやら、「エントリーを追加するごとに個別記事の URL が変わる仕様」なようです。これじゃあ「パーマリンク」じゃないわけで、SEO に弱いのは当然ですね……。Ktai Style, Mobile Eye+ など WordPress の携帯対応プラグインは「PC サイトと同じ URL」なので当然ながらパーマリンクとなっていて、それが検索に強くなっているのかもしれません。このへんは MT4i カイハツシャの奮起を期待でしょう。

[追記 2009-02-22] わたしが大事だと思っているのは SEO よりも URL の恒久性です。たとえ携帯サイトと言えど「クールな URI は変わらない」は金科玉条だと考えています。SEO に有利になるというのは、URI を永続的にした副産物にすぎません。そういう意味では、MT4iTypeCast は「そのソフトウェアが提供する URL」に縛られるため、パーマリンクを維持するためにはソフトウェアと心中する覚悟が必要でしょう。まあ、mod_rewrite を使って新しいパーマリンクに変換すれば「心中」まではしなくて済むかもしれませんが。

2008-03-24
晴れ

GPL でない WordPress プラグインを作れるか

ゆりこ による 23:39:20 の投稿
カテゴリー: ソフトウェア
タグ: , , ,

4月1日(!)に、とある WordPress プラグインをリリースしようと思っていますが、ライセンスを GPL ではないものにしようと考えました。しかし、なかなか難しいようです。

まず、WordPress 本体が GPL であることがネックです。GPL ソフトウェアに対するプラグインについては、FSF によると、データ構造を共有していれば両者が単一のプログラムを構成しているとみなせるため、GPL を適用すべきと解釈されるようです。

もしプログラムがプラグインと動的にリンクされており、お互いにファンクションコールを使ってデータ構造を共有している場合、それらは単一のプログラムを形成していると見なされますので、プラグインはメインプログラムの拡張部分として扱われなければなりません。すなわち、それらはGPLかGPLと矛盾しないフリーソフトウェアライセンスの下で公開されなければならないということです。

WordPress の場合、add_action(), add_filter() でフックを追加する場合は独立性が保てそうですが、$wpdb をグローバル宣言してデータベースアクセスを行う場合は、GPL の制約にひっかかりそうです。

難しいのが、the_content() のような場合でしょうか。実行結果は直接画面に行なわれるため、データ構造は共有していません。しかし、WordPress ループを使っているならば、暗黙的に $post がグローバル宣言されていて、共有しているとも言えます。

うーん。やっぱり GPL にするのがラクかなーー。非 GPL にするには、よほど慎重な作り方が必要なようです。

FSF の FAQ には、非 GPL なソフトウェアに対する GPL プラグインの例もあります。この場合、素の GPL ではライセンス違反になってしまうため、例外条項を付与する必要があると記されています。MT4i のような場合が該当すると思いますが、MT4i って、そういう例外条項がなかったような……。