WordPress 2.9 リリースと 2.9 対応版 wp-kyodeki とタイムゾーンと

というわけで、まさに日本時間で昨日になりますが WordPress 2.9 がリリースされました。 めでたい。 いろいろ新機能もあるようで使うのが楽しみです 🙂

さてさて、昔はつくっていたプラグインがバージョンアップでよく動かなくなっていたりしていたのでベータでチェックとかしていたのですが、最近わりと動くのでさぼってたら、ふと wp-kyodeki がおかしくなっているよう、、その動作を見てコアにとある変化があったのに気がつくぼく・・・。(←遅い

というわけでとりあえず wp-kyodeki。

このプラグインはアクセスカウンタみたいなもんですが、日付をまたぐとカウントがクリアされる仕様になっております。(もともとアクセスデータを蓄積しないようにつくったプラグインでした)

夜行性のぼくは 2.9 にアップデートされた我がサイトのサイドバーをみて、日付をまたいだのにカウントがクリアされていないことに気がついたのです。。

というわけで不具合がありましたので、 JSeries にリリースしました。お使いの方は更新ください。

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

タイムゾーンでの日付変更クリアとならない不具合が修正されます。

さて、なんでだろうという話ですが、コアの wp-settings.php に以下のコードが追加されていました。

if ( function_exists('date_default_timezone_set') )
    date_default_timezone_set('UTC');

PHP の date 関数の戻り値などに影響する、timezone の設定でこれが標準時間になるようになっています。 というわけで、これがなかった今までは日本時間が戻ってきていたのですが、UTC になったので標準時間がもどってくるようになった、ということでした。

wp-kyodeki の不具合です。 冷静に考えたら海外サーバだと WordPress のタイムゾーンを日本に設定していてもあちらの時間で更新されていましたね。すいません(笑)

で、そういやコアがどうなっているのかあんまり考えたことなかったなぁとちらほらソースをみていると、結構 date を生でつかっているところがあるようです。

まぁ、いまも日本タイムゾーン設定で海外サーバ使われている方も多くて問題になっていないようなのでコアは大丈夫かと思いますが、プラグインは考慮漏れているものがあるかもしれない(あんまりないと思いますが)ので、万が一 2.9 の日付系で問題があったら疑ってみてください。 🙂

WordPress プラグイン管理画面を簡単につくる非実用なフレームワーク

WordPress プラグインをつくるときにぼくが結構大変に思うのは、実は管理画面をつくること・・・。

なにげに自分のプラグインのソースを眺めると実ロジックより大きいこともあったりして笑ってしまいます。 というわけで、既存の管理画面のないプラグインにポンとつける用途を念頭に試しに(本当に試しに)フレームワーク的なものをかいてみました 🙂

といっても、PHP 的に厳しい部分もあったりしてごにゃごにゃしなきゃいけない部分もありであまり実用的ではなく、まぁまぁこんな作り方もできるよねって話でみてもらえたらと思います。 PHP 5 系専用です。

まずはサンプル。 なにかしら管理画面の持たない既存のプラグインがあることにします。(以下、ソラでかいているので間違っているかもなのでイメージで)

なんでもいいですがおなじみ the_content フィルターで何か追加する感じのやつにしてみましょう。

   1: function addContent($content) {
   2:     $header = "ほげ";  
   3:     $content = "<p>$header</p>" . $content;
   4:     return $content;
   5: }
   6: add_filter('the_content', 'addContent');

記事の頭に「ほげ」ってつけるプラグインです。。 まぁサンプルってことでごかんべんを。(笑 プラグインヘッダなどは省略です。

ここでは固定値「ほげ」を管理画面から設定できるようにしたいと思います。

とりあえず、こいつを「クラス」にします。 っていってもほぼ機械的な置き換えです。

可変にしたい部分をフィールド(メンバ)においているところと「コンストラクタ」で初期化しているところに注目してください。

   1: class example {
   2:     
   3:     var $header;
   4:     
   5:     function __construct() {
   6:         $this->header = "ほげ";
   7:     }
   8:     
   9:     function addContent($content) {
  10:         $content = "<p>{$this->header}</p>" . $content;
  11:         return $content;
  12:     }
  13:     
  14: }
  15: $example = new example();
  16: add_filter('the_content', array($example, 'addContent'));

$header 変数が外にいきフィールド(メンバ)になりました。

__construct は new ってやったとき(15行目)に勝手に動く特別なメソッドだと思ってください。(ちなみに PHP はコンストラクタもメソッド扱いらしい)

変数を初期化して、あとは WordPress からの the_content の呼び出しを待っているイメージのプログラムです。

さてここからが本題。

今回つくってみたフレームワークというのは DolphinPanel という名前のプログラムで、こいつをつかうとこの手のプラグインに管理画面をつけられます。 “Dolphin” にはなんら意味はないです。 たまたまエコーザドルフィンを思い出しただけです。。(古)

まずプラグインのあたまで、このプログラムを require してあげます(1行目)。 で、プラグインのクラスに dolphin のインターフェースを “implements” します。

まぁかくだけです。 🙂

   1: require_once('dolphin-panel.php');
   2:  
   3: class example implements Dolphinable {
   4:     
   5:     var $header;
   6:     
   7:     function __construct() {
   8:         $this->header = "ほげ";
   9:     }
  10:     
  11:     function addContent($content) {
  12:         $content = "<p>{$this->header}</p>" . $content;
  13:         return $content;
  14:     }
  15:     
  16: }
  17: $example = new example();
  18: add_dolphin($example, 'example');
  19: add_filter('the_content', array($example, 'addContent'));

implements Dolphinable したクラス(3行目)は Dolphin 管轄の WordPress 管理画面を持つことができます。 権利をもったクラスを add_dolphin します。(18行目)

さて Dolphinable であるためには 3つの管理画面に関する決められたメソッド(onActive、onBind、onDispose)が必要になります。 これを実装していきます。

といっても単純にテキストボックスをひとつつけて、値を保存したいだけなら onActive だけ実装すればいいです。 onBind には return true; 、onDispose は空実装してください。

   1: require_once('dolphin-panel.php');
   2:  
   3: class example implements Dolphinable {
   4:     
   5:     var $header;
   6:     
   7:     function __construct() {
   8:         $this->header = "ほげ";
   9:     }
  10:     
  11:     function addContent($content) {
  12:         $content = "<p>{$this->header}</p>" . $content;
  13:         return $content;
  14:     }
  15:     
  16:     function onActive(DolphinForm $form) {
  17:         $form->add(new DolphinTextBox('$header', 'ヘッダ'));
  18:     }
  19:     
  20:     function onBind(DolphinForm $form) {
  21:         return true;
  22:     }
  23:     
  24:     function onDispose() { }
  25:     
  26: }
  27: $example = new example();
  28: add_dolphin($example, 'example');
  29: add_filter('the_content', array($example, 'addContent'));

17行目が Dolphin のキモで、この書き方で変数(フィールド)と管理画面のテキストボックスを結びつけます。 HTML フォームとの値変換、変数へのバインドをこの記述だけでやってくれます。(配列渡すと複数テキストボックスがでてきたりします)

おしまい!。

dolphinpanel02

なんだかここだけみると不思議かもしれませんが、このコードだけでめでたく管理画面がつきます。 簡単あるね。 もちろんプラグインはこの設定値で動きます。 🙂

一応、もうちょっといじるとユーザ対話などもできるようになっています。 追加処理を書くとこんな感じになります。

dolphinpanel01

ここではサンプルだったので極力短くしていますが、onBind は値検査が必要な場合に実装するメソッドで、onDispose はプラグインが非活性になった場合に実装するメソッドです。 入力値に必須が入っていなかった場合のメッセージ出力や、プラグイン非活性時のデータベースからの削除などができます。

もうちょっと詳しいコメント付きサンプルと Dolphin のソースを JSeries の CVS にコミットしてあります。 気になる方は(いるのか?!)みてみてください。

http://sourceforge.jp/cvs/view/wppluginsj/dolphin-panel/

実は管理画面でつかえる HTML コンポーネントがまだテキストボックスとチェックボックスだけだったり実用にはほど遠いのですが、まぁプラグインのサービスクラスに管理画面の意識がなくなるのは楽かなと思います。 また、ここではサービスクラスにつけていますが、単純な VO のクラスに implements  して、上に親のサービスクラスをつくってプラグインを実装するのもいいかもです。

さて、お気づきの方もいらっしゃると思いますが、requre している関係でフレームワークとかいいつつクラス名称がかぶったりして、そのままだと Dolphinable な管理画面をもつプラグインがひとつしか作れなかったり、、、 namespace 使おうと思っても PHP 5.3 からだったりけっこう八方ふさがりなところがあったりします。

一応コントローラ自体は、ひとつで複数の Dolphinable を扱えるようにしているので、myhack.php とかにいれればいいんですが、もうないし(笑) __autoload とかで気合いで最新を読むような制御も考えましたが、hackish すぎるのでやめました。。 運用対処ということで(笑)

あとあと、PHP 5.3 じゃないと private プロパティがこじあけられないので、プラグインのフィールドは public にしてください。。 まぁスコープつけなきゃよいです。(お察しの通りリフレクションを使って変数をバインドしています)

というわけで、いろいろあって途中何度か企画倒れにしようかと思ったのですが、まぁせっかくつくったので話のネタに。 たぶんバグってると思うので、実用よりプログラム的な動きだけ楽しんでもらえればと思います。 🙂

Moblin 2.1 の研究

以前から気になっていました、解像度の低いコンピュータ向けの UI をもつ Moblin を試してみました。 とりあえず ライブ USB で ThinkPad / IdeaPad で起動してみることに。

最近ネットブックとかに Windows とは別に、起動選択でブラウザとメールくらいが高速起動でつかえる機能がついているものがありますが、あれのすごいやつだと思ってもらえれば正解です。 🙂

HOME | moblin.org/jp

Moblin は、The Linux Foundationが主催するモバイル端末向けのLinuxディストリビューションで、ネットブックやMobile Internet Device(MID)、In-Vehicle Infotainment(IVI)向けのソフトウェア技術、アイデア、プロジェクト、コード、アプリケーションを共有するオープン・ソース・コミュニティです。

いまのとろこ、ネットブック/ネットトップ向けのリリースが成果物の中心となっていますが、これらをカスタマイズして MID など小型コンピュータにいれていくのだと思います。

ベースは Linux で、その上に OpenGL を使った描画ライブラリの Clutter や、解像度が低い PC 用への UI ツールキットなどの Moblin のキモがのっていくイメージに見えました。 このうわものを各ディストリビューションに移植した Ubuntu Moblin や Fedora Moblin などもあるようです。(本家の Moblin は Fedora ベースの for Intel ってな感じでしょうか)

てなわけで、

[tegaki]ごう、もぶりん![/tegaki]

moblin01

噂通りの超高速起動で、 USB メモリからですが、おそらく BIOS から 12,3 秒くらいで起動してしまっている気がします。 とりあえずアニメしたりしてめんこいです。 🙂

moblin02

しばらく使っているとトップ画面はこんな風に。 おもしろいのがデータを使った履歴がサムネイルで真ん中の縦列に表示されることです。 見た Web ページや画像、動画などなど。 アプリ指向ではなくデータ指向でつくられていることが伺えます。

右の縦列は外部的な時系列なデータの動きがでるようになっているようです。 Last.fm と twitter がとりあえず標準で対応していました。 左の縦列は登録していた未来、予定や TODO などが出るようです。

基本的に Linux/GTK ベースなので一般的な UNIX アプリは動きそうですが、本領を発揮するのが Clutter と Moblin UI をつかってできているアプリだとおもいます。 基本はフル画面。 iPhone のアプリを想像してもらうといいかもですね。

まずはブラウザ。 Firefox ベースですが、小さい画面でうごくように UI が再設計されています。 2.1 からアドインも使えるようになっているようです。

moblin03 

でもってメーラです。 ベースは不明。。(笑)

moblin04 

タブがつかえる模様。

アプリのランチャーです。 GNOME DO みたくアプリ名入力でしぼっていけます。

moblin06

当然マルチタスク対応ですのでアプリのスイッチャーがあります。

moblin07

仮想デスクトップみたいになっていて、フル画面じゃないアプリも(普通の GTK っぽいアプリ)を配置できます。 スクリーンショットでは画面1(左)で動画を再生していますが、スイッチング中の縮小表示でもちゃんと動いているのはさすがといったところです。 🙂

まだ Moblin ネイティブ(?)的なアプリが少ないようで、ブラウザ、メーラ、メディア再生がそれっぽくなっていて、残念ながら TODO やスケジューラはいまいちな感じでした。 もちろん Evolution とかも動くのだと思いますが、今後各アプリとも UI を Moblin にあわせたものがそろって本領発揮といったところだと思います。

アプリの開発環境も(なんとなくの予想ですが) Python バインディングもでてきそうな雰囲気なので、できたら手軽におしゃれなアニメ UI がつくれるようになりそうですね。

ちなみにこのネットブック版、完成度ははっきりいってしまうとまだまだです。 特に日本語環境は、本気で使おうと思うと対応はしていますがやばめっぽい。 あとメディアが DNLA サーバみてくれなかったんです~。 対応しているハズなんですが。。 あと、IdeaPad では無線LAN が使えませんでした、ThinkPad X61 は OK。

まぁまぁネットブック向けにリリースされているものはコンセプトモデルも兼ねていると思いますので、これを各社カスタマイズしてコンピュータにいれて出荷するのが本流かと思います。 さっくり起動してきれいに動く感覚はこれで十分わかりそうです。

とりあえず紹介動画とかみてたのしげな夢を見てみることにします。

かわいすなぁ。 🙂