バグタグの投稿

Ktai Style 1.61 はちょっと延期かも
Ktai Style 1.61-rc1 を利用されている方はお気付きかもしれませんが、1.61 正式版は今日を予定していました (HISTORY.ja.html に 1.61 のリリース日として2月14日と書いてあった)。そして、同時に 1.4x 系ブランチもアップデート予定でした。しかし、テスト段階でちょっと大きめのバグが複数発見されたため、今日のリリースは無理で、数日延期になる見込みです。
- WordPress 2.7 では、コメント投稿時に PHP のエラーが出るもしくは反応がなくなることがありました。コメント時に必須項目がないときエラー文字列を
wp_specialchars()
でエスケープしていましたが、WordPress 2.7 で配列を入れられなくなったことが理由でした (従来は配列 OK だった)。これは、コメントのテンプレート comments.php の修正が必要なため、自作テーマを作っている方には影響大です。Readme で以下のような修正を案内する予定です。
(Default テーマでは91行付近; テーマによってimplode()
で挟む文字列は異なります)echo implode("<br />", wp_specialchars(explode("\n", $ks_commentdata['message'])));
↓
echo implode("<br />", array_map('wp_specialchars', explode("\n", $ks_commentdata['message'])));
- Ktai Style 1.60 が WordPress 2.1.3 以前で正しく動作しないことが判明しました。WP 2.0 にWalker クラスがなく、WP 2.1.x 以前に
number_format_i18n(), user_trailingslashit()
関数がないのに無理矢理使っていためです。 - WordPress 2.0 で、コメント投稿時にコメント本文など必須項目を入力していない場合や、外部サイト接続確認を表示しようとすると PHP のエラー表示もしくは白紙画面になっていました (Ktai Style 1.30 以降が対象)。これは
did_action()
関数がないのに無理矢理実行していたためです。WordPress 2.0 でのコメント投稿は正常系のみ試験していたので見つかってませんでした……。 - WordPress 2.0 では
wp_list_bookmarks()
が使えないので、rc1 ではks_list_bookmarks()
の出力を空にしていましたが、代わりに古いタグであるget_links_list()
を使うようにしました。
WordPress 2.0 への不具合が多いのは嫌ですね。いちおう動作すると明言している以上、きちんとテストすべきですが、漏れていたのは申し訳ありません。1.4x 系統にもバックポートすべき項目も多く、けっこう手間がかかります。
WP 2.0 + Ktai Style の動作報告がほとんどないのが辛いところです。WordPress 2.0 系統を使っている人がそもそも少なく、まして Ktai Style 利用というのは、かなりマイナーかもしれません。(まだ Otsukare さん版の Mobile Eye のままの人がいる?)
[追記] けっきょく、バージョン番号は 1.70 に変更した上で、2月22日にリリースしました。

WP 2.6 にしたらカテゴリー/タグ URL が変わってしまった
WordPress 2.6 へのアップグレードを見送っていた当サイトですが、一足飛びに、WordPress 2.6.1 ベータ版にアップグレードしました。2.6 正式版よりもバグが少ないとにらんでのことです
しかし、困った問題が発生しました。それは、カテゴリー URL が「http://www.yuriko.net/cat/ほげほげ/」→「http://www.yuriko.net/arc/cat/ほげほげ/」に変わってしまったことです。タグ URL も同様に「arc/」がついてしまいます。これは、パーマリンク構造を「/arc/%year%/%monthnum%/%day%/%postname%/」にしているために、先頭にある「/arc/」をカテゴリー URL、タグ URL にも補完してしまっているのでしょう。この挙動は不可思議なので、元に戻してもらいたいですよね……。さっそくチケット #7490を切りましたが、2.6.1 リリースまでに直してもらえるんでしょうか……。当面は、mod_rewrite かリダイレクトで逃げるしかなさそうですが。
[追記] ウチのサイトは「URL を変えない」ことが信条なのに、ソフトウェアの都合で URL 体系を変えられたら、たまったものではありません。とりあえず、wp-includes/rewrite.php をいじって元に戻しました。
450,451c450,454 < $this->category_base = 'category'; < $this->category_structure = trailingslashit( $this->front . $this->category_base ); --- > $this->category_structure = $this->front . 'category/'; > else > $this->category_structure = '/' . $this->category_base . '/'; > // $this->category_base = 'category'; > // $this->category_structure = trailingslashit( $this->front . $this->category_base ); 469,470c472,476 < $this->tag_base = 'tag'; < $this->tag_structure = trailingslashit( $this->front . $this->tag_base ); --- > $this->tag_structure = $this->front . 'tag/'; > else > $this->tag_structure = '/' . $this->tag_base . '/'; > // $this->tag_base = 'tag'; > // $this->tag_structure = trailingslashit( $this->front . $this->tag_base );
[追記] 2.6.1 ベータ2で直りました。パーマリンク構造が /archives/%post_id% の場合でも同じ不具合が発生しますから、わりと重度な不具合だったと言えます。

複数プラグインの有効化・無効化に未対応
先日リリースした Ktai Style 1.42 ですが、WordPress 2.6 対応が不十分だったことが分かりました。それは、複数プラグインの有効化・無効化に対応していないという問題です。Ktai Style を有効にしたとき、ログインセッション保存用のテーブルを作成し、無効にしたときテーブルを削除するのですが、複数有効化・無効化を検知していないのです。このため、Ktai Style を1つだけ無効にし、その後、他のプラグインとまとめて有効にしようとすると、携帯電話からログインできなくなってしまいます。
WP_CONTENT_DIR を移設したときの対策も思いつきましたので、それらを含めた 1.43 を WordPress 2.6 日本語版が出てからリリースすることにしましょう。Ktai Style の日本語表示は、WordPress 自体の日本語表示に一部頼っていますので、WordPress 2.6 の日本語リソースの出来具合をみないことには、Ktai Style の日本語リソースを調整できないのです……。

Ktai Style 1.41 で Google 地図が出ない
先日リリースした Ktai Style 1.41 ですが、拙作のLightweight Google Maps (LWGM) と互換性がなく、携帯電話表示で地図が出ないという問題があることが分かりました。「mobile_same_url 用のフィルター関数を携帯テーマの functions.php に書ける」ようにするため、携帯テーマ用関数を定義する tags.php を読み込ませるタイミングを遅らせたのですが、LWGM の初期化段階で tags.php の関数を使っていたたため、結果として LWGM が Ktai Style を認識できなくなり、地図を出さなくなっていたのでした。
WordPress 2.6 対応のため LWGM のアップデートが必要だったのですが、これでは急いで直す必要があります。さほど大きい変更ではないはずなので、簡単にテストして今週中には出すようにしましょう。
[追記] バージョン 1.30 にて修正いたしました。なお、Ktai Style もバージョン 1.42 以降にアップデートすることが必要です。

チャンク形式の HTTP 返答に対応する
Ktai Style 1.41 をリリースすべくテストを重ねていますが、細かいバグが少しずつ発見されてしまい、それを修正してはまたテストする、というサイクルに陥っています……。1.3x 系統がバギーだっため、その尻拭いという状況ですね で、今日は「外部サイトのリンクをクリックしたとき、携帯サイトの検出時に不正な URL を拾ってしまう」という現象を発見しました。具体的には、「ひたちなか海浜鉄道が WordPress 採用」で、http://finder.music.coocan.jp/?p=152 へのリンクをクリックしたとき「http://finder.music.coocan.jp/?p=15224http://finder.music.coocan.jp/?p=1525」にジャンプしようとしました。http:// がダブっているのは、検出した URL が相対 URL であったとき、飛び先の URL をベースとして補完したためです。つまり、携帯サイトとして検出した URL 自体は「24http://finder.music.coocan.jp/?p=1525」でした。
これはとっても不可思議なので、redir.php をいじって実際に受信したデーターを見てみました。すると、以下のような内容だったのです。
fa <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head profile="http://gmpg.org/xfn/11"> <meta http-equiv="Content-Type" content=" 9 text/html a ; charset= ……中略…… 2e <link rel="alternate" media="handheld" href=" 24 http://finder.music.coocan.jp/?p=152 5 " />
実際のデーターの前にバイト数がくっついた形式になっています。はて、PHP の fgets()
はこんな形式になったっけ、と思ったのですが、よく調べると、これは HTTP のチャンク形式のデータなのでした。RFC2616に詳しく書かれていますが、とほほの WWW 入門の解説がシンプルで分かりやすいでしょう。
このサーバーはえらく細切れにデーターを返していて、肝心の rel=”altinate” media=”handheld” の URL 部分の前後でチャンクが切れてて、バイト数が挟まってしまっていたのです。その結果、「24http://finder.music.coocan.jp/?p=1525」が携帯サイトの URL であると検出していました。数回リトライしてもほぼ同じ結果です。なお、たいていのサーバーでは 1024 バイトぐらいは一括して返してくるので、こういう現象はめったに起きません。
redir.php のコードは、wp-includes/comment.php の discover_pingback_server_uri()
を参考にしていますが、このコードがチャンク形式を考慮していないため、今回の現象が発生しました。対応させるためには、HTTP ヘッダで「Transfer-Encoding: chunked」の有無を確認し、あれば「バイト数・コンテンツ」のペアで受信させることが必要になります。WordPress コアの不具合なので、trac にも報告(#7224)しておきました。添付ファイルを2回送ってしまったのはちょっとしたミスです
これで、携帯サイトの検出も問題なくできるようになりました。もうちょっとテストしたいので、Ktai Style 1.41 のリリースは金曜日ぐらいかな〜〜。
[追記] trac のコメントで「HTTP/1.0 ならばチャンク形式がないので、リクエスト自体を HTTP/1.0 にすればよいのでは」という提案がされています。そういう手もあるかと思いますが、それでいいのかな??

mobile_same_url のフィルター関数置き場
Ktai Style 1.30 から、「PC 版ページの URL に携帯電話でアクセスするとモバイル版ページが出るブログサービスへのリンク」は中継ページを出さないようにしましたが、この「ブログサービスの一覧」は mobile_same_url フィルターを使えば編集できます。しかし、コードの不具合で、フィルター関数を my-hacks.php に置かなければなりませんでした。当初の予定では、携帯テーマの functions.php に置いても OK のはずですが、それでは動作しないという報告を受けてしまったのです。
いろいろ調査した結果、tags.php, shrinkage.php を早い段階で require
してしまっているのが原因でした。mobile_same_url フィルターの適用は、shrinkage.php が require
されたタイミングです。設計上は、template_redirect アクションによって、Ktai_Style::output()
メソッドが実行された時点で tags.php が require
されるつもりでした。
しかし、よくコードを見てみると、admin/class.php でも tags.php を require
していました。admin/class.php は ktai_style.php の初期化段階 (WordPress コアによってプラグインがロードされた時点) で require
しているため、結果として、shrinkage.php がプラグイン初期化時点で読まれていることになります。この時点では、携帯テーマの functions.php はまだ読まれていないので、当然そこにフィルター関数を書いても無効なわけです。
うーん。これは require
じゃなくて require_once
と書いていたために発見できなかった現象ですね。安易に once を使ったらダメということかもしれません……。この問題の調査には、報告者さんにもご協力頂きました。大変ありがとうございます。
当初の仕様と違っているため、admin/class.php で tags.php を取り込むのはやめて、class.php では tags.php にある関数群を使わないようにします。また、require_once
は極力 require
に直しましょう。それらの変更を行なった Ktai Style 1.41 は土日に出す予定ですが、テストがなかなか進んでいません。7月上旬まで伸びてしまうかも。
Ktai Style で小さい画像が出ない
先日リリースした Ktai Style 1.40 で、「小さい画像が表示されない」「画像をリンク表示しているとき (mova, ソフトバンク PDC 等) で、PNG, GIF 画像のサムネールへのリンクが Not Found になる」というバグがあることが分かりました。前者は 1.35 でエンバグしたもの、後者は当初からあるバグ (実装の不良) です。
前者は、小さい画像の場合、携帯向けサムネール (長辺が 96 ピクセル) を作らず元画像をそのまま表示させるようにするはずが、1.35 あたりで「改良」したときに「元画像をそのまま表示する場合」を考慮してなくて、不正な処理になっていました。
後者は、「PNG, GIF 自動切り替え機能」の設計不良で、元画像および携帯向けサムネールしか PNG, GIF 画像の切り替えにしか対応していなかったのが原因です。中サイズおよび PC 向けサムネールは対象になっていないのです。3G 端末など、画像をインライン表示しているときは携帯向けサムネールを表示するので問題ないのですが、mova, ソフトバンク PDC では PC 向けサムネールにリンクするので、これらの画像に対しても GIF→PNG ないし PNG→GIF の変換を用意してやらないといけなかったわけです。テストサイトおよびわたしの実運用サイトはほとんどが JPEG 画像なので、なかなか発見できなかった現象です……。
前者のバグはすぐ修正できるのですが、後者はちょっと時間がかかりそうです。今週中には修正版をリリースしたいと思いますので、しばらくお待ちください。
[追記] とりあえず、両方修正したバージョンを CVS リポジトリーに置きました。今回のバグが気になる人は、shrinkage.php を入れ換えてください。

携帯からコメントできなかった
申し訳ないことに、しばらくの間、当サイトで携帯からコメント投稿できない状態でした。これは、携帯対応プラグイン Ktai Style のバグで、スパム対策の自作プラグインがうまく動作しなかったのが原因です。スパム対策プラグインのテストは行なっていましたが、PC 閲覧と携帯閲覧で動作が違ってくるとは予想できず、携帯からのテストは省略していました……。Ktai Style 1.40 にてバグ修正しましたので、問題なくコメントできるようになりました。
旅行記にも同じ不具合がありました。そちらはコメントがしばらくついてなかったので、「どこかバグっているのかも」とは思っていましたが、きちんと調査しませんでした。ご迷惑をおかけいたしました。スパム対策の副作用と言えるわけで、なかなか難しいですね……。

Ktai Entry と Ktai Location にバグ発見
本日の、東京地下鉄副都心線初乗りレポートを実施していて、Ktai Entry および Ktai Location にバグがあることが判明しました。申し訳ありません。
Ktai Entry の方は、投稿スラッグが時分秒を繋げた6ケタの数字にならず「003328」という固定の数字になってしまうというものです。複数回投稿すると、追番がついて「003328-2」などとなります。Ktai Location の方は、Yahoo! 地図情報の緯度・経度が小数点フォーマットの場合に認識されないというものです。どちらも以前は正常動作していたもので、機能アップやバグフィックスした際にエンバグしてしまったものです。非常に情けない……。
投稿スラッグについては、テスト時に見落してました。今日は1日で何通も投稿したため、スラッグが変だぞと一発で分かったのですが、テストは1通しかしてなかったので、一見問題ないように見えたのでした。
Yahoo! の方は、以前から存在する dms2deg()
関数にあったバグが、今回発覚したというものです。この関数は、度分秒フォーマットを小数点フォーマットに変換するものですが、小数点フォーマットを与えた場合はそのまま戻ってくるという仕様のはずでした。そのため、Yahoo! 地図情報では、度分秒フォーマットか小数点フォーマットかを気にせずにどちらの場合でも関数を通せばよいはずでした。しかし、実際にはバグのため小数点フォーマットを与えると false が戻ってしまったのです。他の地図 URL の場合は、「必ず度分秒フォーマットが来る」ことが決まっているのでバグが露呈しなかったのです。とはいえ、ソースコードをよく見たら一発で分かる類いのものです。ソースコードレビューがおざなりになっていたわけですね……。
これらの不具合は近日中に直して修正版を出したいと思います。なんか、最近はエンバグすることが多くて迷惑をおかけしています。もうちょっと品質保証体制を整えないといけませんね。
[追記 2008-06-15] Ktai Location は修正版を出しました。Ktai Entry は他に直したいところがあるため、もうしばらくお待ちください。
[追記 2008-06-18] Ktai Entry の修正版も出しました。今回のバグ以外にも気になる点が多かったため、だいぶいじっています。かなり安定しているはずです。

携帯でコメントできない
なんと、Ktai Style 1.35 および 1.50-test3 には「携帯からコメントできない」(白紙画面ないし PHP エラー表示) という問題があることが分かりました。利用者の方が見つけられたのですが、できれば、当サイトないしはWP 日本語フォーラムで報告して頂けるとありがたかったです。
原因は、comments-post.php の 93 行目で、$allowedposts
配列に絵文字用属性の localsrc, alt を追加する部分です。従来は単に代入していたのですが、それだとすでに $allowedtags['img']
に配列が存在した場合に消えてしまうので、+=
演算子によって「追加」にしました。しかし、これは PHP の構文エラーになっていたのでした。
この問題はテスト時に発見していたので、リリース時は元通り代入に戻したつもりでしたが、直っていなかったようです……。1.35 と 1.50 の2系統あって、comments-post.php を揃えるとき古いファイルで新しいのを上書きしてしまったのかもしれません。「直したはずなのに直ってない」というのは一番嫌ですね……。
これは重大な問題なので、Ktai Style 1.36 および 1.50-test4 は、できれば今日中に出したいと思います。