Mar 13 2010

Ecipse PDT 3.5 + xampp + xdebug を使った PHP デバッグ

たまに WordPress の不具合などでご質問をうけるも、初見のプラグインとかもすぐ直しちゃって「なんでそんなにすぐ分かるの?」と聞かれることありますが、タネを明かせばプログラムのおかしそうなところにデバッグブレイクひっかけて動作を見ているからです。 え?この軟弱もの? いいのいいの(笑)

プログラミングの難しい部分の一つは動作が一瞬で終わることにあると思います。 普通は机上というか頭の中で考えて、ここの if はこーだから、ここに入って、値はこーなるはず、、なんてやるわけですが、面倒なときはコンピュータに評価させた様子を1行ずつみていく。 これがデバッガの役目です。

てなわけで、現在の xampp 最新版 1.7.3 と Eclipse PDT を使ったデバッガの設定方法の紹介です。 前書いたのは設定方法が古くなってしまっていますが、とりあえず操作方法などもあるので併せてどうぞ。 :)

hiromasa.docs o) – Eclipse PDT + XAMPP で WordPress の開発環境をつくる (3)

Eclipse PDT と XAMPP に入っている xdebug モジュールを利用すると、実行中のプログラムを任意の位置で停止させ、ソースコードとあわせて1行ずつ動作させるステップ実行や、変数の値の監視や書き換えが行えるウォッチなどのいわゆるデバッグ機能を使うことができるようになります。

まず、xampp の PHP に xdebug というモジュールを読ませる必要があります。 現在の xampp-1.7.3 のベーシックパッケージ(lite版には入ってないようです)には xdebug が同梱されているようです。 キウイ!

昔、Vista で xdebug 動作させると Apache ごとおちるという問題がありました。 今回は Windows 7 と xdebug-2.0.6 でやっていますが大丈夫そうです。

というわけで、php.ini にそれを読ませる設定をしてあげます。

C:\Develop\xampp-win32-1.7.3\php\php.ini

xampp インストールディレクトリの php\php.ini を開きまして、

zend_extension = "C:\Develop\xampp-win32-1.7.3\php\ext\php_xdebug.dll"
xdebug.remote_enable = 1

zend_extention の php_xdebug.dll のコメントを解除。 xdebug.remote_enable = 0 の行があるので、コメントを解除した上で 0 を 1 にします。

これで、準備完了。 Apache を xampp コントロールパネルから再起動して phpinfo をみて xdebug があればOKです。

xdebug01

次は Eclipse PDT の設定。

WordPress などの PHP プロジェクトを開いた上で、実行 –> デバッグの構成。

xdebug05

左ペイン、PHP Web ページを選択し、ペイン上アイコンで新規作成。 で、ここがポイント。

xdebug04

ファイルと書いてあるところに、WP の index.php を指定。 そして、URL の部分をそのファイルをブラウザでみたときの URL と完全一致させます。 デフォルト localhost になっていますが、もしブラウザ http://127.0.0.1/ でアクセスしているときは、PHP Server 欄の構成で localhost を 127.0.0.1 に変更してください。

実ファイルの場所と、ブラウザでの URL の対応を完全に設定するところがキモです。 あっていないとブレイクしてくれません。

でもってできたら、ウインドウ->ビュー->その他 あたりから「デバッグ」というビューを表示しておきます。 デバッグ中であるとここにデバッグスレッドの様子がでますので、開始、停止ができます。

xdebug03

準備ができたら、ソースコードのブレイクしたい位置にブレイクポイントをはります。 詳しくは前述の昔の記事をみてみてください。 で、実行構成からデバッグボタンをおせばブレイクするハズです。

xdebug02

あとは、F5、F6、F8 での行すすめや、ウォッチでの変数閲覧などをたのしんでいただければ。 :)

管理画面などのプログラムなどログインを伴うときは、セッションの関係でうまくブレイクできないときがあります。 このときは以下の記事を参考に URL をいじってデバッグセッションつけてあげてください。

hiromasa.another o)» Blog Archive » wp-jrelated 1.52 リリース (関連取得不具合修正)

動きしか見てないですが、たぶん WP の認証によりデバッグセッションの cookie がきえてしまうのがとまらない原因です。 なので GET でつけてあげて再設定すればこの後は何もしなくてもとまるようになります。 :-)

この辺 Java のリモートデバッガに比べればおもちゃっぽい部分もありますが、それでも十分実用になっていると思います。

というわけで、

power source » WP ローカル環境の構築 – XAMPP+Eclipse PDT

今回インストールした XAMPP Windows版 1.7.3 には Xdebug 2.0.6-dev が入ってるので、このまま使えそう。。?

たぶん、いけそう! :)

Mar 6 2010

WordPress と Eclipse と

ぼくは WordPress をごにょごにょさわるときの環境に Eclipse を使っています。  主に PHP の解析が楽なので使っているのですが、この記事では言語サポート以外の周辺を紹介してみます。

具体的には Subversion とか DB 操作の部分も統合環境のサポートがうけることができます。 まぁまぁ、この手のは慣れの問題も多分に含まれていますのでとりあえずスクリーンショットを楽しんでもらえれば!

Eclipse ベースの Aptana を使われている方も、プラグイン導入で同じように動くかもしれません。(ちなみに依存関係があるので Eclipse に Aptana プラグインをいれたほうが各種 Eclipse プラグインを使うならば楽かもです :)

WordPress + XAMPP + Eclipse の最新導入方法はぼのをさんがまとめてくださっております! :)

power source* » WP: ローカル環境の構築 – XAMPP+Eclipse PDT

WordPressの作業用に、ローカルPCに開発環境を構築。

初めてのことなので、ひろまさ著 『Eclipse PDT + XAMPP で WordPress の開発環境をつくる』を読みながら作業し、本日はテキスト第3章「Eclipse PDT プロジェクトへの既存ファイルの取り込み」までで力尽きる。

ありがとうございます、ありがとうございます。 キウイを進呈します。

まずはソースコード管理システムの Subversion。

WordPress の本家リポジトリにつないで開発状況をみたり、タグから過去バージョンの取得を行うことができます。

Eclipse にはいくつか Subversion プラグインがあるのですが、ぼくは、Subclipse を使っています。(こちらに同梱の Pure Java Subversion ライブラリが Linux でよく動く印象があるためです)

subclipse.tigris.org

Subclipse is an Eclipse Team Provider plug-in providing support for Subversion within the Eclipse IDE. The software is released under the Eclipse Public License (EPL) 1.0 open source license.

インストールは Eclipse 上から update URL をいれるだけのタイプです。 入れると・・・

eclipse03

こんな感じで新規プロジェクトを SVN のリポジトリからつくれるようになりますので、たとえば WordPress のリポジトリを指定してあげるとファイルが取得できます。 取得場所を Apache の htdocs の下にしてあげれば WordPress のインストール完了です。

でもって、プロジェクト右クリックのチーム、ヒストリーあたりから改版履歴がみれるようになります。

eclipse06

で、気になった修正があったら diff してみたり。

eclipse07

なるほど、みたいな。 :)

さらに Eclipse には Mylyn という仕組みが備わっていて、ソースコード管理とタスクを結びつけることができます。 タスク、、というのはそう、WordPress Trac。

Eclipse Mylyn Open Source Project

Mylyn is a task-focused interface for Eclipse that reduces information overload and makes multi-tasking easy. It does this by making tasks a first class part of Eclipse, and integrating rich and offline editing for repositories such as Bugzilla, Trac, and JIRA.

インストールなど詳細ははぶきますが、MyLyn から接続するリポジトリ種別を Trac として、WordPress Trac の URL を設定。 ちなみに他にもいろいろなシステムに接続できます。

eclipse04

WordPress の Trac は API をあけてくれていないので細かいことはできませんが、以下のようになります。

eclipse02

Subversion の修正履歴コメントの # の番号をクリックすると、インターナルで WordPress Trac の該当タスクを開いてくれます。  ソース修正とタスクの結びつけができます。

API あけてないのでいつもの画面がでてくるだけではありますが、ワンクリックで修正経緯がみれるので割と便利です。 :)

次は DB 操作系。

こちらもいくつかプラグインがありますが、ぼくは DB Viewer を使っています。

DBViewer Plugin for Eclipse

DBViewer Plugin for Eclipse(以下DBViewer)は、Eclipse(統合開発環境)を拡張するためプラグインです。Eclipseに「データベース・フロントエンド」機能を提供します。(JDBCドライバーを使用しています)

スクリーンショット小さくて見づらいですが、こんな感じで MySQL に接続できて、中を閲覧したり画面からパッチしたり SQL を発行したりできます。

eclipse05

phpMyAdmin と同じような感じですが、たとえば SQL 作成時のオートコンプリートや SQL 履歴保存、SQL 整形とか便利機能がいろいろあります。

eclipse01

というわけで、こんなことをしていると、、、

家で仕事しているみたいだ~(笑)

そう、、事務所でも家でも Eclipse な時期も多いわけです。。

いろいろな現場で使えるようになっているシステム群ですので、若干複雑な部分もありますが、取り入れて便利そうなところがあったら使ってみてください。 :)

Feb 22 2010

WordPress Thematic フレームワークで hiromasa.another をつくる

最近、ウィジェットは入れるは JavaScript でひゅんひゅん動くはで、WordPress 近代化が図られている(!?)このサイトですが、何を隠そう IE8 でみるとおかしかったのです。 しょうがないので、IE7 エミュレーションしていたのですが、気にくわなかったのでついにテーマを書き直すことに!

テーマといえばおでこさんでおなじみ、Thematic テーマフレームワーク。 目標は、旧 hiromasa.another を style.css と functios.php だけで再現すること、、、、なのでご覧のサイトは既に Thematic 版になっていますが見た目はほとんど変わっていません :)

Thematic とはなんじゃという方や、初めて使う方はおでさんのスライドが良いっす!

テーマフレームワークは、WordPress のお約束的な部分が既にできていて、それに対して追加設定をするような形でテーマを構築していくものです。 ループなど基本的なことはもちろん、コアやプラグインが要求するようなテーマの仕様がきちんと設定されています。

まっさらからフルスクラッチすると忘れがちな部分や大変な部分が既に構築済みなので、PHP コードに関して楽ができます。 また、ぼくのような CSS がよく分からないものにも、リセットや段組などのノウハウ的な部分が盛り込まれていますので便利に感じました。

新しいテーマの構築は、style.css への CSS の追加適応とたくさんの位置に配置できるウィジェットでほぼ望みのサイトはできると思いますが、「ウィジェットが配置できないところに何かを出したい」とか、「表示文言を変えたい」とかいったときに、さらに追加で2つの方法をとることができます。

ひとつは Thematic 本体から修正したいテンプレートファイルをコピーしてきて書き換えること。 もうひとつは、WordPress のフックの仕組みをつかって functions.php でプログラム的に書き換えることです。

どちらの方法をとっても良いと思いますが、ここでは後者を紹介してみます。

style.css と functions.php だけでサイトを構築するのは極端ですが、functions.php 作戦はファイルを修正するより楽にできる部分もありますので、いくつかのコードが参考になれば。

まず基本的なところですが、Thematic の本体にはあちこちで do_action もしくは apply_filter をしているところがります。 これを自分の functions.php に追加したプログラムでフックして動作を書き換えるイメージです。 どんなフックがあるかは、修正対象部分の Thematic 本体のプログラムを追っていけば大抵は見つけることができます。

以下、そんなコードの例です。(自分のテーマ内の functions.php にかきます)

パターン1。 どっかに何かを追加。

hiromasa.another のヘッダには kougabu さんのサムネイルが4つでていますが、このようなことをするには Thematic 本体で do_action をしているところをみつけて、そこに echo で HTML を差し込みます。(ここでは thematic_header というフックを使いました)

/*************************************************************
 * ブログヘッダー部分に kougabu のサムネイルいれる
 *************************************************************/
function head_kougabu() {
    
    echo '<div id="header-kougabu">' . "\n";
    echo '<ul style="display: inline;">' . "\n";
    kougabu_get_images('before=<li style="display: inline;">
        &post_id=662&count=4&max_width=70&max_height=70');
    echo '</ul>' . "\n";
    echo '</div>' . "\n";
    
}
 
add_action('thematic_header', 'head_kougabu', 6);

パターン2。 不要な文字列を削除。

たとえば、記事の下に出ている記事情報メタ文字列を消すコードです。 ここではついでに消したトラックバック URL を別な場所(コメントフォームの下に動かしています)

/*************************************************************
 * トラックバックの URL をコメントフォームの下に移動
 *************************************************************/
function trackback_add_url() {
    echo '<div id="trackbacks">' . "\n";
    echo '<h3>Trackback</h3>' . "\n";
    echo '<p>' . trackback_url() . '</p>' . "\n";
    echo '</div>' . "\n";    
}
 
function trackback_delete_default($content) {
    return '';
}
 
add_action('thematic_belowcomments', 'trackback_add_url');
add_filter('thematic_postfooter', 'trackback_delete_default');

パターン3。 不要なフックの削除。

ある状態の時に、Thematic にデフォルトで登録してあるフックを呼ばなく(delete)する場合です。 たとえば、シングルページの時はナビゲーションを出さない、など。 ポイントはいきなり remove_action するのではなく、template_redirect くらいまで実行を遅延させることです。

自分の functions.php は Thematic の functions.php より先に呼ばれます。 なので、いきなり remove は無理、なのです。 で、 init くらいでもいいかなって感じなのですが、ここだとまだ is_single が確定できてないので、適当に  template_redirect でやってみました。

/*************************************************************
 * 不要なナビゲーション削除
 *************************************************************/
function navigation_delete_post() {
    remove_action('thematic_navigation_above', 'thematic_nav_above', 2);
    if(!is_single()) return;
    remove_action('thematic_navigation_below', 'thematic_nav_below', 2);
}
 
add_action('template_redirect', 'navigation_delete_post');

パターン4。 ある特定ページだけサイドバーを消す。

ここのサイトの Gallery ページでやっている部分です。 Thematic のコードを追っていくと制御できるコードがありました。 thematic_sidebar に false を返すとサイドバーが非表示になるようです。

/*************************************************************
 * ギャラリーページだったらサイドバーをなし
 *************************************************************/
function kougabu_delete_sidebar() {
    $show = true;
    // kougabu page : 182
    if(is_page('182')) {
        $show = false;
    }
    return $show;
}
 
add_filter('thematic_sidebar', 'kougabu_delete_sidebar');

パターン5。 パターン2といっしょですが、ある文字列を修正加工。

フッター文字列にクエリー数をだしています。

/*************************************************************
 * フッターにクエリー数
 *************************************************************/
function fotter_add_query($content) {
    global $wpdb;
    $timer = "({$wpdb->num_queries} queries.";
    $timer .= timer_stop(false) . "seconds.)";
    return $content . ' ' . $timer;
}
add_filter('thematic_footertext', 'fotter_add_query');

などなど。

ここのサイトでは他にも、記事タイトルにカレンダーだしてり、いろいろしていますがパターンはほぼ全ていっしょです。 :)

ひとつだけ違うのが、コメント、トラックバック・ピンバックの表示で、Thematic 標準ではそれぞれ分けた形で表示となるのですが、hiromasa.another はずらっと並べる形にしていたので、それは comment.php をコピーして修正しています。

functions.php でも無理矢理やればできたのですが、おそらくは Thematic 作者さんの意図外でしたのでやめました。 こういうときは素直にいったほうが良さそうです。 :)

てなわけで、

できた~

何を隠そう、ぼくは CSS がなんちゃってしか分からないのでそちらに時間がかかりました。。 まだおかしいところありますが、とりあえず。。

thematic01

制作は Linux 上の Firefox で確認。 一応、IE6 もそれなりにでるようにしています。 ぼくは VMWare 上の XP をわざと IE6 のままにしていてそれを、Unity で Linux のデスクトップにだして確認する方法をとっています。

テーマフレームワークは CSS さくさくできる方なら、WordPress がそれほど分からなくてもテーマつくれちゃいますね。 あとは、PHP をつかって細かい差し込みをしていくイメージでしょうか。

ためしてがってん。 :)

がってん、がってん、がってん。

Feb 14 2010

使っている WordPress プラグイン 2010年版

たまに古い企画を持ち出してくる .another です。 みなさまいかがお過ごしでしょうか(?)。 ということで、過去 2006 年に一度やったらしい「使っている WordPress プラグイン」 再び。 :)

hiromasa.zone :o ) » WordPress プラグイン

hiromasa.zone で使っている WordPress のプラグイン。 画面に見えるものを紹介します。

とりあえずぱっとブラウザから見えるものからいきます!

ちっちゃくてすいません。。 しかも画像あれた、、しょんぼり。。

plugins02

まずはサイドバー。

全てウィジェットです。 吹き出しがないのは WordPress 標準のものを使っています。 テキストウィジェットはなんでもはれるので便利ですね。 :)

WordPress Plugins/JSeries » wp-kotodama (投稿コメント表示ウイジェット)

サイドバーなどに、最近投稿されたコメント者名とその親記事へのリンクを出力するウィジェットです。 MySQL 5 系で動作します。

WordPress Plugins/JSeries » wp-kyodeki (本日人気の記事表示ウィジェット)

サイドバーなどに、本日人気の記事表示の一覧とそのアクセス回数を表示するウィジェットです。

WordPress Plugins/JSeries » Kougaburari (ランダムポスト・スライドショー)

画像付きアーカイブ表示プラグイン「wp-kougabu」のランダムポスト機能を使用して、スライドショーを表示するプラグインです。

記事のタイトルに入れている系。

WordPress Plugins/JSeries » wp-hatena

WordPress の各エントリを「はてなブックマーク」するクイックリンクを自動的に挿入するプラグインです。 また、del.icio.us のクイックリンクも追加できます。

WordPress Plugins/JSeries » wp-otenki

WordPress のエントリにLWWSから取得したお天気情報を付加します。

Chameleon Cyber » MoonPhase

デフォルトでは月相イメージと月齢が投稿日時の後に表示されます。

Date Stamp « stevelam.org

This is a plugin for Wordpress that displays the date/time in a stamp fashion. It has been tested with and configured for K2. It might work with other themes with few modifications.

記事の中。

WordPress Plugins/JSeries » wp-tegaki

投稿エントリ内のタグで指定した文字列を指定の TrueType フォントで出力する WordPress 用プラグインです。

記事の外。

WordPress Plugins/JSeries » wp-kougabu (画像付きアーカイブ)

WordPress の投稿やページにアップロードされた画像ファイルを抽出し、サムネイルでページに一覧表示するショートコードを提供します。過去に投稿した画像をサイトに一覧表示しそこから本文にリンクされる、画像付きアーカイブのようなプラグインです。

WordPress Plugins/JSeries » WordPress Related Post for Japanese (関連投稿表示プラグイン)

Yahoo! Japan が提供する日本語形態素解析APIを利用して、WordPress の投稿をアナライズし、自動的に投稿の下部に「関連する記事」へのリンクを付与するプラグインです。

コメント。

WordPress Plugins/JSeries » wp-ohayo

コメントや投稿の"時間"をお日様などのイメージに置き換えます。

最近では、にいさんの Kougaburari でランダムポストが出せるようになったので、ご機嫌です。 :)

サイト上あちこちで kougabu くんが活躍していますが、現行バージョンだと、キーが画像 + サイズで実装されているのでフレームが一種類しかもてません。 次はこの変を直してみようかな・・・。

結構変えないといけないので、ひろまさプラグイン初の 2.0 系が出現するかもしれません。 お気づきの方も多いと思うのですが、tegaki と kougabu は基本の動きが同じなので恐らくそのときには統合されます。 :D

WordPress も安定してきて、最近こういったブログいじり的なネタが少なくなってきたよねと思いだし書いてみました。 昔は

バグるだけでおいしいネタ

だったもんですね(笑)

Feb 13 2010

サーバサイド Groovy と Groovlets

ちょっと前ですが、スクリプト言語 Groovy の新しいバージョンにあわせて eclipse-groovy プラグインのバージョンがあがったということで、ちょっと触ってみました。 Groovy 自体、ワンショットスクリプトを数回かいただけでほどんどさわったことがないのですが、まぁお遊びということで。

このスクリプト言語、いざとなったら普通の Java の書き方できるので手が止まらなくて便利なのです。 クラスライブラリもいつもの使えますし(笑)

【コラム】イマドキのIDE事情 (74) 高機能なGroovy開発環境「Groovy-Eclipse 2.0」リリース! | エンタープライズ | マイコミジャーナル

1月15日、Groovy開発用のEclipseプラグイン「Groovy-Eclipse 2.0」がリリースされた。GroovyはJava VM上で動作するスクリプト言語でJavaに似た構文を持つためJavaプログラマにとって扱いやすいという特徴がある。Groovy-EclipseはこのGroovyでの開発を強力に支援してくれるEclipseプラグインだ。バージョン1.0から大幅に機能が強化されており、Eclipse標準の Java開発環境であるJDTと比較しても遜色ない開発支援機能を備えている。

ぱらぱらみていると、Groovy をサーバサイドでつかう Groovlets という仕組みがあるようだったので、こちらとあわせてサーブレット環境で使ってみることに。

以下、せっかくやったのでメモです。

とりあえず、Eclipse WTP で新規「動的 Web プロジェクト」をつくります。

groovlets02

普通ですね。 :)

で、このままだと Groovy-Eclipse が構成されていないので(.groovy がコンパイルされない)、つくったプロジェクトを右クリックして Groovy を構成します。

groovlets01

Convert to Groovy Project。 これで nature に groovy が入ります。 でもって、これやると groovy の jar も追加してくれるのですが、JavaEE の場所 (WEB-INF/lib)に入らないので消して、手動で lib の下にいれてあげます。

Groovlets を使うには –all を使うといいようです。 配布元にある groovy-binary-1.7.0.zip の embeddable フォルダに入っています。

あとは、 src の下で .groovy ファイルを作成すればコンパイル・再デプロイを groovy-eclipse と WTP がやってくれます。 ここまでで、 .groovy のグルーヴィな記述でサーバサイドプログラムを行うことができます。

さて、こっからが Groovlets。

サーバに「ファイルとして配置された」 .groovy をそのまま動かすのが Groovlets です。 ランタイムで勝手にコンパイルしてくれます。 あと、GSP という JSP みたいなテンプレートライブラリがあります。

要はサーバに配置された .groovy ファイルを書き換えると Groovlets がホットデプロイ(とはいわないか。JIT?) してくれる仕組み。 ぼくはまた、このホットデプロイを利用しながら、Groovy のシンタックスシュガーを使いまくって小規模な Web アプリを高速にかくものと想像していたのですが、どうもそうとは違う模様。

間違っていたらご指摘いただきたいのですが、 Groovy でモジュールを分割する仕組みは import のみ。 でもって、Groovlets は import 先のモジュールはダイナミックにコンパイルしてくれないのです。 なので、プログラムは url-pattern にあたったひとつの .groovy ファイルだけで構成する必要があります。

もちろん、デプロイ時に .class になっているものは import 可能なので Eclipse で .groovy かいてコンパイルしてデプロイすりゃいいんですが、そしたら Groovlets 使わなくてもいいような(笑)

結論的には、GSP とか JSP とかと同じように html テンプレートで使うのかな~。 もしくは上にフレームワークをかくための土台、、あとモジュール1本で済むような、「なんとか度」判定みたいなアプリとか。 :D

groovy のオリジナルソースを読んだところ、ダイナミックコンパイルは直アクセスだけでなく RequestDispatcher の指定も対応しているようだったので、きっとそういうことなのでしょう。

てなわけで、試しに以下のように構成してみました。

groovlets03

web.xml (抜粋)

<display-name>Groovlets</display-name>
<!-- Groovlets -->
<servlet>
    <servlet-name>Groovy</servlet-name>
    <servlet-class>groovy.servlet.GroovyServlet
    </servlet-class>
</servlet>
<servlet-mapping>
    <servlet-name>Groovy</servlet-name>
    <url-pattern>*.groovy</url-pattern>
</servlet-mapping>
<!--  GSimpleServlet -->
<servlet>
    <servlet-name>GSimpleServlet</servlet-name>
    <servlet-class>net.maple4ever.groovlets.GSimpleServlet
    </servlet-class>
</servlet>
<servlet-mapping>
    <servlet-name>GSimpleServlet</servlet-name>
    <url-pattern>/index.do</url-pattern>
</servlet-mapping>

Groovlets と自前のサーブレットを2つ登録します。

テンプレート(ダイナミックコンパイル側)の .groovy ファイルは WEB-INF/groovy もしくは WEB-INF/ に配置します。(/ 優先で、そこになければ groovy/ を見に行くようになっていました) ここではわかりやすいように WEB-INF/groovy/index.groovy を配置。

index.groovy

html.html {
    head {
        title 'index.groovy'
    }
    body {
        h1 'Hello, Groovy World.'
    }
}

このへんが groovy の面白いところで、クロージャをつかった html の builder とかがあります。 これを使っておけば変な HTML ができることはないでしょう。(たぶん)

で、サーブレット側。 一応こちらも groovy っぽく書いてみる。。

GSimpleServlet.groovy

package net.maple4ever.groovlets;
 
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
 
class GSimpleServlet extends HttpServlet {
    
    void doGet(
        HttpServletRequest request
        , HttpServletResponse response) throws IOException {
        def rd = request.getRequestDispatcher("index.groovy")
        rd.include(request,response);
    }
    
}

最初、 void doGet(reauest, response) とかかいてみて、動かなくてはたと2分。 型を指定してなかったので、 HttpServlet の doGet をオーバーライドできなかったというオチでした。 オーバーロードになっちゃったのね。 てっか、そこ省略は怖いか。 :)

で、この中で index.groovy をこんな感じで include してあげると、読まれた時点で index.groovy が動的コンパイルされます。

ということで、、、う~ん view に groovy 使えるよ、という理解でいいのだろうか。いまいっぽ腹に落ちないひろまさくんでした。

Feb 7 2010

wp-kougabu 1.12 リリースとぶらりぶらり

ぼくの密かなたのしみは、MMRT daily life の上部に配置されたランダムポストをクリックして次々と出てくる記事をうししと読むことだった。

いつかぼくもランダムポストを、そう思って早3年。 なにやら twitter を覗くと、 kougabu を利用したランダムポストがにいさんによってつくられている!?、こ、これは…!!

…ということで、にいさんこと、をかもとさんが現在作成中の豪華エフェクト付きランダムポスト・スライドショープラグインに向けて、wp-kougabu をバージョンアップしました。 kougabu の API がいまいちだったのでプラグインに向けて拡張しています。

WordPress Plugins-JSeries » wp-kougabu (画像付きアーカイブ)

wp-kougabu-1.12.zip

kougabu_get_images 関数に新規のオプション array_ext を追加しました。画像属性が分割された形式で配列を取得できプログラムから扱いやすくなりました。

それ以外に変更はありませんので、ダウンロードいまお使いの kougabu に上書きしていただいて、にいさんのリリースを楽しみにしていただければ。 新規の方も使い方かわりません。

うちのサイドバー下でうごいているのが、そうです。 :)

burari01 

うーん、たのしすですね。 ウィジェット、ショートコード、関数から kougabu サムネイルを利用したランダムポスト・スライドショーを呼び出すことができます。

近くリリースされると思いますので、にいさんのブログを要チェックや!  :)

(23:40 追記)

JSeries にリリースされました!

WordPress Plugins-JSeries » Kougaburari ( ランダムポスト・スライドショー )

画像付きアーカイブ表示プラグイン「wp-kougabu」のランダムポスト機能を使用して、スライドショーを表示するプラグインです。

にいさん、ありがとうございます!

Kougaburari  dogmap.jp

てなわけで、前から気になっていた jQuery プラグイン JQuery Cycle Plugin を使用して、wp-kougabu が吐き出したランダムポストイメージをスライドショー表示するプラグインを作りました。

むっふっふ。 :)

Jan 26 2010

携帯電話 Bluetooth + DUN でモバイルインターネットを試す

10年前くらいは携帯電話/PHP の回線契約数を 5 回線くらい持っていたりして、モバイル系大好きだったのですが、いつのころからかご無沙汰気味。

昔はこの手のがずいぶんお値段高くて維持費的なものからやめてしまったと思いましたが、最近 ドコモの 128K パケホーダイとかでてきて、お小遣いくらいでまた遊べるようになったので、ちょっと復活して試しに Bluetooth + DUN を使ってノートPC をインターネットにつなぐ準備をしてみました。

こういうの、なにかちょっとした出張とかあったときのためとか、緊急時のインターネット回線用にとかでも用意しておくと便利かもしれません。 :)

bluetooth01

用意したのはノートPC ThinkPad くんと、ドコモの FOMA 携帯電話 SH906i さん。

また、ドコモの FOMA を契約していると、mopera U というドコモがやっている携帯電話接続可能なインターネットプロバイダを使うことができます。 これが現在キャンペーン中で、4末までですが 0円、もしくは 262.5円/月で接続することができます。

キャンペーン|サービス一覧|ドコモの定額データプラン対応のインターネット接続プロバイダ「mopera U (モペラユー)」

2009年12月1日(火)~2010年4月30日(金)

てなわけで、こちらの U スタンダードプランを使ってみることに。 ライトでもいいのでうすが、ドコモの公衆無線LAN Mzone も 0円キャンペーン中なので、こちらも試してみたくてスタンダードにしています。(ライトだとつけられない)

ちなみに mopera U の契約は、携帯電話を使って iMode のお客様メニューからやるのが一番簡単そうでした。 ただ申し込みサイトの説明がちょっと違っていて、

お申込み・契約変更|ドコモの定額データプラン対応のインターネット接続プロバイダ「mopera U (モペラユー)」

「iMenu」⇒「お客様サポート」⇒「お申込・お手続き」⇒「各種お申込・お手続き」⇒「便利なサービスの申込」

とありましたが、なくって、、「便利なサービス」じゃなくて、「MM サービス」というメニューの中にありました。 探したわ。 っていうか MM って久しぶりに聞いた(笑) ここでスタンダード + 公衆無線LAN を申し込みました。

ではでは、まず ThinkPad + SH906i の Bluetooth で Windows から DUN してみます。

どんな PC でも同じですが、先ずは PC 側の Bluetooth を有効に。。 …する方法を忘れて10分を消費しました。。 デバイスマネージャから見えなかったので一瞬、ぼくの ThinkPad に Bluetooth がついていたのが夢だったかと。。(笑)

ThinkPad の場合は Fn + F5 でオンにできます。 :)

bluetooth02

で、デバイスマネージャを確認。 でてきます。

bluetooth04

あとは、携帯電話の Bluetooth メニューから機器検索とかして、PC とペアリングします。 そうすると、PC 側にデバイスが現れます。

bluetooth05

この PC の場合は、携帯電話が COM4 に割り当てられました。 この状態で COM4 にアクセスがあると Bluetooth の無線を経由して接続されます。

で、ここからが mopera U に接続する設定です。 実はドコモからコネクションマネージャというのアプリがでていてオート設定できるのですが、ここは黙って手動設定。(笑)

まず、携帯電話に mopera U の APN を登録します。 ここでは実験なので、インターネットには接続できない、(現在)パケット無料の管理画面表示用のアクセスポイントを追加。

Poderosa でも teraterm でも使って、携帯電話のつながっている COM4 にアクセスします。 Bluetooth 経由で携帯電話のモデムにつながるハズです。 昔みたく PC と携帯をケーブルつながなくていいので便利ですね。 携帯電話はポッケにいれたままでOKです。 :D

でもって、携帯電話モデムの AT コマンド(説明書にでています)を使って、0120.mopera.net という APN を追加します。 番号は 10 にしてみました。

bluetooth03

シリアルなのでコマンドはゆっくり入力しましょう。 文字が遅れてくるよ。

AT+CGDCONT?
+CGDCONT:1,"PPP","mopera.ne.jp",,0,0
+CGDCONT:3,"IP","mopera.net",,0,0
OK
AT+CGDCONT=10,"IP","0120.mopera.net"
OK
AT+CGDCONT?
+CGDCONT:1,"PPP","mopera.ne.jp",,0,0
+CGDCONT:3,"IP","mopera.net",,0,0
+CGDCONT:10,"IP","0120.mopera.net",,0,0
OK

SH906i では APN 追加は、AT+CGDCONT= コマンドです。(真ん中コマンド) 他の携帯電話の方はマニュアルを確認のこと。(たぶんいっしょですが)

できたら、PC からここで登録した APN にダイアルアップします。 番号識別は電話番号の欄で行います。 携帯電話デバイスから右クリックして、ダイアルアップネットーワークの追加。

bluetooth06

電話番号に *99***[APN番号]# を設定します。 ここでは先に設定した 10 を。

で、ダイアル。 :)

bluetooth07

ユーザ名とパスワードは、mopera U に加入したときのウエルカムメッセージの URL からネットワーク暗証番号をいれた後の画面で確認できます。(若干わかりにくい)

接続できたら、 http://start.mopera.net/ にアクセスしてみましょう。 つながっているはずです。 この APN ではここのサイト以外はつながりません。(設定確認などをするところです)

ちゃんとインターネットにつながる 128K パケホなどの APN 設定情報はこちらにあります。

設定方法|ドコモの定額データプラン対応のインターネット接続プロバイダ「mopera U (モペラユー)」

ネットワーク設定(アクセスポイント等)やメール設定(POP、IMAP等)など、手動で設定を行う際に必要な各種設定情報をご紹介いたします。

手動設定用詳細情報(PDF形式:735KB)

mopera Uを従量でネットサーフィンやメールを利用する場合のアクセスポイント情報です。

アクセスポイント一覧(PDF形式:1,008KB)

パケホ 128K だと、APN は mpr.ex-pkt.net かな。(必ずサイト/PDF で確認してください) 128K だと使えないですが、フィルタリングフリーアクセスポイントとかあって面白いですね。

実は、ぼくのパケホ契約はまだ昔のやつなので 128K 接続つかえず、インターネット接続は試せていないのですが、後日やってみます。(一応、準備だけしたらしい(笑))

では、最後に mopera u スタンダードで使える、Mzone という公衆無線LAN。 このオプションをつけておくと、携帯電話じゃなくって、普通のそのへんにとんでいる Mzone の 無線 LAN も使えるようになります。

札幌だと、地下街はほぼ全域で使える模様。 あとはホテルとか空港とか、カフェとかですかね。 ぼくは、お昼あの辺の地下街でご飯を食べていることが多いのでためしてがってん。

接続は iPod touch より。 :)

mopera01 

うむうむ。 札幌地下街歩きながら見ていましたが、だいたいつながるようです。 現在 0 円なのでこれはお得。。 ポートは http のみかな、、メールは試しませんでしたが、特殊なポートはふさがれている模様でした。 WEP 接続なので、まぁまぁやることはほどほどに。

iPod touch から http でブラウジングはちゃんとできるので、お昼のオタノシミが増えました(笑)

とりあえず、ダイアルアップ、公衆LAN ともにキャンペーンは 4末までなので、それまでにいろいろ試してみたいと思います。 :)

Jan 12 2010

Eclipse 3.5 wiki エディタのフォント不具合

Eclipse 3.5 からだとおもうのですが、ファイル拡張子を .mediawiki とか tracwiki とかにして開くと wiki 記法が使えるエディタが開くようになりました。 ちょっとドキュメントを書く機会があったので気分転換に使ってみたり。

新しいものというのは、楽しいものである、、ぼくは、うきうきで wiki の記述を始めた・・・。(←ふり

悲劇は、 tracwiki のコード表記の部分で起きた。

travwiki01

倍角か! 昔のワープロか!(←弱いおち

ぼのを「・・・」

というわけで、Eclipse の Bugzilla を探してみるとどうやら SWT の不具合の模様。

Bug 278959 – setting font height should update font width

Created an attachment (id=138181) [details]

次の Eclipse 3.6 には入るようですが、3.5 で使えないのも寂しいのパッチを SWT 3.5.1 に適応してみました。 といっても1行パッチ。

SWT のソースをコンパイルして、上記不具合 class を plugins の下の

org.eclipse.swt.win32.win32.x86_3.5.1.v3555a.jar

に差し替えただけです。

とう!

travwiki02

なおった、なおった。 :-)

.wiki のファイルは HTML や DocBook などに出力でき、リアルタイムでは HTML で表示できます。 設定画面である程度 CSS も変更できるようです。

travwiki03

まぁ正直、エディタの方はまだまだのできっぽいですが、とりあえず記法をオートコンプリートできるのは、wiki になれていないぼくには便利でした。 こまったら、CTRL + SPACE。

travwiki04

DocBook に書き出せるので、docbook2pdf とか docbook2txt とかでも整形して出力できそうですね。

というわけで、ひさびさのこののりのブログはやっぱり良い・・・。 :-)

Jan 2 2010

Twitter のボットと Platform as a Service

明けましておめでとうございます。 2010 年、ぼくも hiromasa.another もいつもどおりのまったり感かと思いますが、今年もよろしくお願いいたします。 :)

さて去年あたりから、Windows Azure などいわゆるクラウド的なサービスがいろいろでてきて、なんだかちょっとわくわく。 今年の興味はこの辺から・・・。

クラウドというと、ラップするレイアがサービスによっていろいろ違ってなんだかよく分からないですが、ぼくはその中の PaaS というサービスが遊ぶに面白そうかなと思っています。

クラウドと呼ばれているものにはいくつか種類があると思いますが、たとえば Amazon EC2 はサーバの物理存在を隠します。 サーバが 2台ほしければ、2 って画面にいれて起動させれば 2台できる。 増やしたければすぐ増やせる。 サーバの手配とかデータセンターの置き場所とか電源とか考えなくていいわけですね。

たとえば Google Apps。 これはサーバとさらにアプリケーションの運用を隠します。 言うならばメールサーバ落ちた!などと会社の情報システム部門がてんやわんやしなくてよくなるというサービス(笑)

で、PaaS というのはその中間。 物理サーバとアプリケーション動作に無関係な運用部分を請け負ってくれます。 で、のせるアプリケーションは各自つくってすぐデプロイできるように環境が整っている感じです。

今で言うところの、レンタルサーバに PHP のアプリケーションを各自入れて動かすの発展系のイメージ。

たとえば現状のレンタルサーバでは WordPress の MySQL のバックアップとか自分でやらなくてはならなくて結構大変ですが、PaaS の場合はスケジュールで勝手にバックアップをとってくれたり簡単にリストアできたり、各種リソースの使用量が管理画面から見えたり、よりアプリケーションよりのサービスが付随します。

PaaS のひとつである、Windows Azure では、既に WordPress も稼働しているとのことです。

「PDC09」リポート:Microsoftはハイブリッドな戦略で古い殻を脱ぎ捨てる (2/3) – ITmedia +D PC USER

欧米を中心に世界中で広く利用されているブログシステム「WordPress」の開発者であるマット・マレンウェッグ氏が登場し、Windows Azure上でWordPressを動作させるデモを紹介した。

さて、この PaaS ですがもう一つの特徴が、様々なアプリケーションを動かすための環境が整っていること。 簡単に言えば、C# とか Java とかそのへんの言語と、そのアプリケーションサーバ環境周りも使うことができます。

PHP では少し無理があったことも簡単にできるようになる・・・。 実はここがぼくの最大の関心事。 大昔 CGI が無料で使える海外サーバがでてきたようなどきどきが(笑)

PaaS のサービスは Google App Engine とか Stax Networks とかありますが、ここでは後者を使ってみました。 Stax のほうがサンドボックスの制限が緩いので遊びやすいのです。

とりあえずつくってみたのは、twitter ボット。

 stax02

PHP でももちろんボットはつくれますが、一般的な PHP の環境はプログラムから動き出すことができないという制約があります。 人のアクセスとか別系の cron とか外的要因からプログラムをキックする必要がありますが、ここでは Java のスレッドスケジューラを使って自分から定期起動するようにしています。

いろんなライブラリが簡単に使えるのもいいところで、このボットは twitter クライアントに twitter4j、また スケジューラ に Quartz というライブラリを使っています。

Twitter4J – A Java library for the Twitter API

Twitter4J は TwitterAPI の Java ラッパです。 Twitter4J を使うと XML や HTTP に詳しくなくても容易に Twitter とインタラクトするアプリケーションを書くことが出来ます。

Quartz Scheduler – Home

Quartz is a full-featured, open source job scheduling service that can be integrated with, or used along side virtually any Java EE or Java SE application – from the smallest stand-alone application to the largest e-commerce system.

ちなみに、Google App Engine はスレッド禁止っぽいので、Quatz は残念ながら動作しないと思われます。 http の通信もなにか特別なことをしなくてはいけなそうでした。(たぶん)

で、とりあえずライブラリや web.xml を配置します。 Stax Networks は Tomcat を使っているようで、また一般的な WAR も配置できるので基本的になにも考えずにいつも通りにつくれます。

stax04

web.xml を以下のように。

<?xml version="1.0" encoding="UTF-8"?>
<web-app>
  <display-name>Desyura</display-name>
  <servlet>
    <servlet-name>QuartzInitializer</servlet-name>
    <servlet-class>
    org.quartz.ee.servlet.QuartzInitializerServlet</servlet-class>
    <init-param>
      <param-name>shutdown-on-unload</param-name>
      <param-value>true</param-value>
    </init-param>
    <init-param>
      <param-name>start-scheduler-on-load</param-name>
      <param-value>false</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
  </servlet>
  <servlet>
    <display-name>RobotInitializer</display-name>
    <servlet-name>RobotInitializer</servlet-name>
    <servlet-class>
    net.maple4ever.desyura.RobotInitializer</servlet-class>
    <load-on-startup>2</load-on-startup>
  </servlet>
</web-app>

QuartzInitializerServlet と、スケジューラの起動の Servlet を順番に登録。

あとはソースを書くだけです。 動作できるかどうかのサンプルでかいただけなので、いんちきをたくさん含んでいることをあらかじめご了承ください。

RobotInitializer.java。 スケジュールのインスタンスをもらって、Job を行うクラスを登録する感じです。 CronTriger を使うと cron みたいな形式で時間を指定できます。

package net.maple4ever.desyura;
 
import java.text.ParseException;
import java.util.Calendar;
import java.util.Locale;
 
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
 
import org.quartz.CronTrigger;
import org.quartz.JobDetail;
import org.quartz.Scheduler;
import org.quartz.SchedulerException;
import org.quartz.Trigger;
import org.quartz.impl.StdSchedulerFactory;
 
public class RobotInitializer extends HttpServlet {
    
    public static final String START_TIME = "START_TIME";
    private static final long serialVersionUID = 1L;
 
    public RobotInitializer() {
        super();
    }
 
    @Override
    public void init() throws ServletException {
        // QuartzInitializerServlet で作成したスケジューラを取得
        Scheduler sched = null;
        try {
            sched = (new StdSchedulerFactory()).getScheduler();
        } catch (SchedulerException e) {
            throw new ServletException(e);
        }
        // Cron 形式のトリガー作成(とりあえず 5分)
        Trigger trigger = new CronTrigger("trigger1", "group1");
        try {
            ((CronTrigger) trigger).setCronExpression("0 0/5 * * * ?");
        } catch (ParseException e) {
            throw new ServletException(e);
        }
        // JobDetail にコールバッククラス登録
        JobDetail jobDetail = new JobDetail(
                "Twitter Bot"
                , "Twitter Bot"
                , TwitterBotService.class
                , true
                , true
                , true);
        // 起動時間を JobDataMap に格納(twitter のロケールも日本にすること)
        jobDetail.getJobDataMap().put(START_TIME,
                Calendar.getInstance(Locale.JAPAN));
        // スケジュール開始
        try {
            sched.scheduleJob(jobDetail, trigger);
            sched.start();
        } catch (SchedulerException e) {
            throw new ServletException(e);
        }
    }
    
}

 

TwitterBotService.java。 時間がきたら twitter をみてつぶやく Job クラスです。 スケジュールごとに new されるので手を抜いて static で値を保持しています。(本当は context にシリアライズできる形で値をいれるのが良いと思われます)

package net.maple4ever.desyura;
 
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Collections;
import java.util.List;
import java.util.Date;
 
import org.quartz.JobExecutionContext;
import org.quartz.StatefulJob;
 
import twitter4j.Status;
import twitter4j.Twitter;
import twitter4j.TwitterException;
 
public class TwitterBotService implements StatefulJob {
    
    // StatefulJob は同時実行されないが手抜き synchronized しておく
    static private List<Long> read = (List<Long>) Collections
            .synchronizedList(new ArrayList<Long>());
    static private final int PAGE_COUNT = 20;
    
    public void execute(JobExecutionContext context) {
        // スケジュールイベント
        System.out.println("Fire! " + context.getScheduledFireTime());
        // 初回起動時間取得
        Date fistTime = ((Calendar) context.getMergedJobDataMap().get(
                RobotInitializer.START_TIME)).getTime();
        // twitter 接続
        Twitter tw = new Twitter("ユーザ名", "パスワード");
        
        String tweet;
        try {
            // twitter から Mentions をもらう
            List<Status> status = tw.getMentions();
            for(Status stat : status) {
                // 起動時より前の返信は答えない
                if(fistTime.after(stat.getCreatedAt())) continue;
                // すでに返信していたら答えない
                if(read.contains(stat.getId())) continue;
                // 自分のスクリーンネームを相手に置換してつぶやく
                tweet = stat.getText().replaceAll(
                        stat.getInReplyToScreenName(),
                        stat.getUser().getScreenName());
                tw.updateStatus(tweet, stat.getId());
                System.out.println(tweet);
                // 読んだリストに入れておく
                read.add(stat.getId());
            }
            // getMentions() は 20件取得なのでそれを超えたら忘れる
            if(read.size() > PAGE_COUNT) {
                read.remove(0);
            }
        } catch (TwitterException e) {
            // 投稿失敗しても次に期待する
            System.out.println(e.getStackTrace());
        }
    }
    
}

(あ!!、if の位置間違っていることをブログかきながら発見。。(笑))

ひとつしかスケジュールもアカウントも制御できないエコーなボットですが、100 ステップくらいでできちゃうのはお手軽すぎです。

これは実験なのであれですが、スケジュールも twitter も意識させずに文字列操作部分だけ外だしにできるようにプログラムをかえていけばいいかなという感じですね。 Jython とか JRuby とか Groovy とかの Java の上で動くスクリプト言語にその部分をプラグインのように渡すのも面白いかもしれません。

できた WAR は Stax Networks にそのままデプロイできます。 ant タスクがあるのでコマンド一発。 FTP クライアントとかいりませぬ。

hiromasa.another :o ) » Blog Archive » Stax Networks への JavaEE アプリのデプロイ

あとは、ドキュメントにかいてあるとおり build.xml にユーザ名とかパスワード、war の stax-application.xml パスをかきます。

stax-application.xml はとりあえず適当に Stax Networks の管理画面で BASIC Servlet and JSP なアプリを作成しておいて、それをダウンロードしてきてそのまんま使うのが楽かもしれません。

さて、twitter は昔 Jabber をサポートしていたので、たとえば Stax Networks とソケットつなぎっぱなしにして、リアルタイムに反応するボットとかもつくれたと思うのですが、もうできなくて残念。

でも、最近は websocket とかそれっぽい技術もできてきていますので、こういったアプリケーションサーバがあると、いままで http な Web ではできなかったようなことも実現できそうです。

いろいろこのへんの技術で遊んでみたいな、と思った1年の始まりでした。 :)

Dec 31 2009

大晦日と WordPress 2.9.1 RC1

いろいろありました 2009年もあっというまに、日本は大晦日です :)

師走の中、WordPress 2.9.1 の準備も着々と進み、WordPress 2.9.1 RC1 が 30日にでております。 2.9.1 で修正される不具合で、いくつかプラグインの動作が直るものがありますので、紹介したいと思います。

まずはブログでもアナウンスがありました、wp-cron が動かない問題です。

WordPress | 日本語 » WordPress 2.9.1-1

残念なことに、先日の 2.9 リリースと一部のバージョンの PHP 組み合わせで cURL 拡張に関するバグが起こることが判明しました。該当するバージョンの cURL では、予約投稿およびピンバックが正しく処理されません。

wp-cron は WordPress のスケジュールイベント系を司るモジュールのことですが、これのタイムアウト待ち時間の設定が一部のサーバで速くなりすぎるため、スケジュール実行が発動しないという問題です。

予約投稿やピンバック、またスケジュールを使っているプラグインも影響を受けますが、WordPress Related Post for WordPress もそのひとつで、該当サーバでは関連が取得できなくなっていると思います。(このプラグインは辞書作成で投稿時間や過去記事の閲覧が遅くならないように wp-cron によるバックグラウンド処理を行っています)

とりあえず辞書作成について、2.9.1 までは http://www.example.com/wp-cron.php に手動でブラウザからアクセスすることで対処できます。(www.example.com はお使いのサーバスペースにあわせてください)

次はタイムゾーン問題。

以前書きましたとおり、2.9 より PHP のタイムゾーンの設定を WordPress が UTC に変更する動作が加わりました。

その後、もう少しプログラムを追っていくと、(wp_)options の gmt_offset という値を取得しようとするとフックにより、UTC に設定したタイムゾーンを、timezone_string 値(Asia/Tokyo とか)で再設定する動作があることが分かりました。

影響をうけたのが、 current_time() という WordPress コアの関数で、timezone_string が存在するとタイムゾーンの再設定により、日本であれば +9 +9 の時間 (2回ずらしてしまう)を返してしまうようです。 wp-kyodeki プラグインが正しく日またがりで値がクリアされないケースがこの件です。

パラ見ですが、xmlrpc 経由の投稿日付、ファイルアップロード時に作成される年月ディレクトリ、テンプレートタグのカレンダーのめくりの処理などの時間が +9 ずれる可能性がありそうです。

で、最初現象が分からなかったのがなる人とならない人がいることで、どうも昔から WordPress を使っている人で、最近、管理画面の general setting の更新をしてない方は timezone_string 値が入っていなくて、gmt_offset だけが入っている状態。 この場合は current_time() はうまく動作します。 ぼくとかおでさんとか(笑)

General Setting で都市名で値を設定すると、timezone_string に値が入るため current_time() がうまく動作しなくなります。

timezone01

幸いなことに、WordPress 2.9.1 より UTC 形式での細かい値を設定できるようになりました。 この設定を使った場合、timezone_string に値が入らなくなり、うまいこと current_time() が正しい値を返してきますので、不具合で困ったことになっている方は、2.9.1 がでてアップグレードした後、日本のタイムゾーンの方は

timezone02

こうしてください。(ドロップダウンの下の方に追加されています) これで修正されると思います。

current_time() の件については、Nao さんにご協力(ぼくは英語が書けません。。)をいただきましてチケットをきってあります。 Nao さん、お忙しいところありがとうございました! :)

3.0 にまわされていますが、おそらく修正されると思います。 それまでは、UTC な Timezone 設定でしのぐ方向で。 :)

#11672 (current_time() does not correctly retrun localized time) – WordPress Trac

When you set you set timezone using a city name, current_time() function in functions.php does not return correct local time.

てなわけで、 +9 の日本は粛々と除夜の鐘が鳴る時間に進んでおります。

みなさま、良いお年を・・・!!