PHP:メンバメソッドをスタティックメソッドと間違えてハマるの巻。

メンバメソッドをスタティックメソッドと間違えて実行していたおかげでハマった。
PHPは、他のクラスで定義されているメソッドでもNoticeやWarningなしで実行できたりする。

以下の例だと、クラスBClassに定義されてるメソッドtestFuncを
クラスAClassの中からスタティックメソッドとして実行している。
もちろん、$thisのスコープはAClassのインスタンスとなる。
んで、運悪く、AClassにもBClassにも同じ名前のメソッド
sayHelloなんてものがあると、気づかずに処理が進んでしまったりするわけだ。

バリバリPHPやってる人には常識なのかな?
他のクラスのメソッドをコール出来るって時点でかなり違和感。

<?php
//filename: exp001.php
class AClass{
	public function test(){
		BClass::testFunc();
	}
	public function sayHello(){
		echo "Hello, World. I'm a AClass.";
	}
}
class BClass{
	public function testFunc(){
		echo "-------inside BClass::testFunc-----\n";
		$this->sayHello();	echo "\n";
		echo "------------------------------------\n";
	}
	public function sayHello(){
		echo "Hello, World. I'm a BClass.";
	}
}

$test = new AClass();
$test->test(); 		echo "\n";

BClass::sayHello(); echo "\n";
>php exp001.php
-------inside BClass::testFunc-----
Hello, World. I'm a AClass.
------------------------------------

Hello, World. I'm a BClass.

PHP基礎 関数で参照を返す場合の注意

参照はあくまで変数に対してのみ作られるので、
関数で参照を返すような場合に、returnに変数を渡さないとWarningやNoticeの原因になります。
たとえば、リテラルや式を直接returnの引数に渡すとかするケース。

// 引数に文字リテラルを渡しているので警告が発生。
funciton &returnRef(){
    return "Hello world";
}

//何も返さない場合は、
//return を引数なしで実行して強制的にNULLを返すようにする。
function &returnEmpty(){
    echo 'Some process';
    return ; //NULLが返る。
}

WordPressでoutput bufferingを有効に

wordpressの開発をしているときouput_bufferingを有効にしたい場合があります、例えば、FirePHPなどはHTTPヘッダーをつかってログを出力していますが、HTTPヘッダを変更するような処理にはoutput bufferingが必要になるケースがほとんどだと思います。

そういう時は、wp_head とwp_footのアクションフックにoutput bufferingを有効にする処理を追加してやると便利です。
以下のような感じで、my-hack.phpにコードを追加するかプラグインとして追加してやると簡単に機能が追加できます。

/*
 * Plugin Name: Enable Output Buffering
 * Description: Enable output buffering
 * Author:
 * Version: 0.1
 * License: GPL
 */

//関数名等は一意になるように適当に変えてください
function callback($buffer) {
  // modify buffer here, and then return the updated code
  return $buffer;
}

function buffer_start() { ob_start("callback"); }

function buffer_end() { ob_end_flush(); }

add_action('wp_head', 'buffer_start');
add_action('wp_foot', 'buffer_end');

Flash vs HTML5 ビデオ再生は?

Flashは本当に重いのか?

アップルは、FlashがCPUを多く使用しブラウザをクラッシュさせると批判、さらに、バッテリーの消費が早すると自社のiPhoneにFlashを搭載しないと方針をとっていますが、実際にこのAppleのFlashは重いという主張はどうなのか、Jan Ozer氏がMac、Windowのそれぞれの環境でFlash10.0 およびFlash10.1とメジャーなブラウザ Safari, Google Chrome, Firefoxでのムービーの再生時の負荷テストを公開してくれています。
Flash Player: CPU Hog or Hot Tamale? It Depends.

Jan Ozer氏のテスト

Jan Ozer氏のテストを見てみよう。
テストの内容は、Youtubeのビデオを再生させて、CPUの占有率を計測するというものです。テスト環境は以下

Window環境

  • Apple Safari (4.0.4)
  • Firefox (3.6)
  • Google Chrome (4.0.249.89)
  • Microsoft Internet Explorer (8.0.7600.16385)
  • Flash Player (10.0.45.2 と 10.1.51.95)

Macintosh 環境

  • Apple Safari (4.0.4)
  • Firefox (3.6)
  • Google Chrome (5.0.307.9 beta)
  • Flash Player (10.0.45.2 と 10.1.51.95)

結果:Macintosh

Machintosh
MacBook Pro Safari - HTML5 Safari - Flash Chrome - HTML5 Chorme Flash Firefox
CPU 占有率 Flash Player 10.0 12.39 37.41 49.89 50.39 40.25
Flash 10 vs HTML5 202% 1%
CPU 占有率 Flash Player 10.1 12.39 32.07 49.89 49.79 42.07
Flash 10 vs HTML5 159% 0%
10.0と10.1の差 -14% -1 2%

見ての通り、HTM5のビデオ再生がMacでは、Safariがダントツに効率が良い。これはSafariがH.264の再生をハードウェアアクセララレーションを利用して再生できるおかげ。Apple主張するFlashは遅いっていうのは、Safariが早いってだけで他のブラウザもそんなに効率がいいわけではない。Appleはハードウェアアクセラレーションに必要なAPIを公開していないらしく、MacではSafariに勝てるプレーヤは出ないだろう。

ChromeではHTML5とFlashの効率はほとんど変わらない。

FirefoxではFP10.0とFP10.1を比較すると、FP10.1の方が効率が落ちてしまっている。SafariではFP10.1の方が14%も効率が良くなっているのと比べると不思議かんじだが、これはSafariのFP10.1がSafariのCore Animationを利用しているおかげらしい。一方、FirefoxのFP10.1はQuickDrawからQuartz2Dに描画方法を変えたらしくその事が原因と推測される。

結果:Windows

Windows
HP 8710p Windows Safari - HTML5 Safari - Flash Chrome - HTML5 Chorme Flash Firefox IE - Flash
CPU 占有率 Flash Player 10.0 未対応 23.22 25.66 19.55 22.00 22.41
Flash 10 vs HTML5 NA -24% NA NA
CPU 占有率 Flash Player 10.1 未対応 7.43 25.66 10.73 6.00 14.62
Flash 10 vs HTML5 NA -58% NA NA
10.0と10.1の差 -68% NA -45 -73% -35%

Window向けのSafariはHTML5ビデオを再生できない。FP10とFP10.1の比較では、FP10.1がハードウェアアクセラレーションをサポートしたおかげで68%も効率が良くなっている。

Chromeでは、HTML5とFP10,HTML5とFP10.1ともにFPの方が効率が良い。HTML5とFP10.1との比較に至っては58%も効率がよくなっている。

Firefox,IEもともにFPの効率が良い事がわかる。FirefoxのFP10とFP10.1の比較では73%も効率が良くなっているのは凄い。

結局はハードウェアアクセラレーション次第

Windowsでは、HTML5よりもFlashPlayerの方が効率がよく、ハードウェアアクセラレーションが利用可能なFlashPlayer10.1ではその差は顕著になる。いずれはその差は縮まるだろう。
一方、Macでは、Safariがダントツで効率が良い。確かにAppleの主張は正しい。しかし、これはハードウェアアクセラレーションのAPIをAppleが公開していないからで、この事でFlashや他のブラウザが劣る批判するのは、すこし不公平な感じもする。

Windows版のSafariでは、QuickTimeがインストールされてる場合、mp4の動画を再生することができます。

ページに『投稿』を挿入するWordPress プラグイン:Inline Posts

Inline Postsとは

WordPressの記事には、ページ(Page)と投稿(Post)の2種類があります。
WordpressのプラグインInline Postsは、ページ中に『投稿』を挿入してくれるプラグインです。
これを使うと、『投稿』をページ内のセクションのようにして扱う事ができるので、過去に書いた『投稿』をまとめてページとして公開するとうような便利な使い方ができます。
作者は、SWXの作者でもあるAral Balkan氏です。実際にSWXFormat.orgのサイトもこのプラグインを使っているようです。

インストール

  1. ここのページのInline Posts WordPress Pluginのzipアーカイブをダウンロードする
  2. ダウンロードしたzipアーカイブの中身をWordpressのプラグインフォルダに配置して、プラグインをアクティベーションします。

使い方

使い方は簡単で、挿入したい『投稿』のIDを角括弧で2重に囲ってやるだけでOK。例えばIDが43の『投稿』は、

[[43]]

としてやります。
さらに、プラグインUltimate Category Excluderを使えば、メインページに表示したくないカテゴリの『投稿』を非表示にすることもできるので、Inline Postsと組み合わせて使うとかなり便利です。