PHP の autoload を使ってみる

PHP5 からは、オブジェクト指向言語らしくクラスのオートローディングが可能になりました。
具体的には、明示的に require_once “foo.php” としなくても、

function __autoload($class){
    include_once $class . “.php”;
}

としておけば、

$foo = new foo;

とした時に include_path から自動的に foo.php をインクルードしてくれる,というものです。
 
ただ、class_exists()はデフォルトで__autoload()を呼び出すらしいので __autoload() の実装は以下のような感じにするのがよさそうです。

function __autoload($class){
   // 検索する拡張子一覧
   $exts = array(“php”, “inc”, “class.inc”, “class.php”);
   // 検索するディレクトリ一覧( “./” や “../” で始めると,その指定については include_path を見なくなるので注意 | PHP マニュアル include() 参照)
   $dirs = array(“”, “include/”, “classes/”);
   // include_path を検索し、存在すればそのファイルをインクルードする。
   // 存在しなければ何もしない。
   foreach($dirs as $dir){
     foreach($exts as $ext){
       $file = $dir . $class . “.” . $ext;
       // echo “Debug: trying $file \n”;
       if($fp = @fopen($file, “r”, 1)){
         @fclose($fp);
         require_once $file;
         return;
       }
       // PEAR Style
       $file = $dir . str_replace(“_”, “/”, $class) . “.” . $ext;
       // echo “Debug: trying $file \n”;
       if($fp = @fopen($file, “r”, 1)){
         @fclose($fp);
         require_once $file;
         return;
       }
     }
   }
}

MeCabのコンパイルでエラー

mecab-0.94 をインストールしようとしたところ、make で

no matching function for call to `basic_string,__default_alloc_template >::clear ()’

というエラーが出たので調べたところ
こちら(CJ?ごろうのひとりごとかも?)によると、GCC 2.X にはstring.clear() がないためにエラーになっているとのこと。
 
作業環境に GCC3.4 があり、ports でインストールしようとしていたので

cd /usr/ports/japanese/mecab
make USE_GCC=3.4

として無事解決しました。

XCache を使ってみた

前の記事に書いた、XCache を使ってみました。
 
例1:

if(!xcache_isset(“time”)){
    xcache_set(“time”, “現在の時刻: “.date(“Y-m-d H:i:s”), 30); // 30 秒間キャッシュ. 数値を省略すると、おそらく php.ini の設定依存
}
 
echo xcache_get(“time”);

結果例:

現在の時刻: 2007-03-14 11:30:56

30秒未満でアクセスすると、キャッシュを参照するため常に同じ結果を返します。
30秒以上経過後にアクセスすると、新たに現在時刻をキャッシュ、表示します。
 
例2:

echo “count: ” . xcache_inc(“count”);

結果:

count: 1

数値は 1, 2, 3… と、アクセスする度に増加していきます。
 
手軽に扱え、管理ページもあるということでなかなか便利そうです。
 
ちなみに、php.ini の設定は大体以下のようにしました(xcache.admin.user, xcahe.admin.pass は要変更)。

[xcache-common]
zend_extension = /usr/local/lib/php/20060613/xcache.so
; extension = xcache.so
; extension = php_xcache.dll

[xcache.admin]
xcache.admin.user = “admin”
xcache.admin.pass = “fded9601747e160c1dac9b7eb0ce4af9” ; md5($your_password)

[xcache]
xcache.shm_scheme = “mmap”
xcache.size = 4M
; set to cpu count (cat /proc/cpuinfo |grep -c processor)
xcache.count = 1
xcache.slots = 8K
xcache.ttl = 600
xcache.var_ttl = 600
xcache.var_maxttl = 3600
xcache.var_size = 4M
; interval of gc scanning expired items, 0=no scan, other values is in seconds
xcache.gc_interval = 300
 
xcache.test = Off
xcache.readonly_protection = Off
xcache.mmap_path = “/dev/zero”
;xcache.mmap_path = “/tmp/xcache”
 
xcache.coredump_directory = “”
 
; per request settings
xcache.cacher = On
xcache.stat = On
xcache.optimizer = On
  
[xcache.coverager]
xcache.coverager = Off
 
cache.coveragedump_directory = “”
;xcache.coveragedump_directory = “/tmp/pcov/”

 
参考:
XCache API

PHP5 とキャッシュまわり

PHP5 でメモリキャッシュをしようと思うと、選択肢は APC, eAccelerator, XCache のいずれかになるようです。
 
ちなみに、BSD の ports ではそれぞれ www/pecl-APC, www/eaccelerator, www/xcache が該当パッケージです。
 
参考:
Do You PHP? – eAccelerator を導入してみる, XCache を導入してみる
ZAPAブロ〜グ2.0 – XCache のインストールとphp用アクセラレータ比較
XCache API

<script src="…"> で注意すべき点

で注意すべき点">

ドメイン間のデータ送信テスト(docodemo door Test)
<script src=”…”>を用いた、パスワード入力フォームの内容を悪意あるサイトに送るテスト。
 
たとえばブログペットやアクセスカウンター、アフィリエイトなどは <script src=”http://サービス提供サイト/xxx”>という形式の HTML タグをブログに埋め込みますが、埋め込んだブログがトップページからログイン可能なものであった場合、サービス提供サイト側がブログのパスワードを盗み出すことができてしまいます。
 
対策として
– 信頼できる(盗まれても問題が無い,あるいは自分で構築した)サイトのサービスのみ利用する。
-重要な情報が含まれる(入力される)ページには信頼できるサイト以外のサービスを付加しない。
などが挙げられます。
 
JSONP を利用する場合も当然注意する必要があります。

で注意すべき点">

Ajax で利用できるお絵かきクラス

ブラウザ上でお絵かき – DrawingCanvas クラス(Days of the Moon)
複数の描画エンジンに対応していて、さまざまなブラウザで利用可能な描画用クラス。SVG Tiny 、HTML Canvas 、CSS Positioning 、VML に対応している。
 
ネタ元:
Ajax で簡単リソースモニター

JSON で実現する快適な Ajax

AJAX で JavaScript でサーバからの出力を解釈する際に、最も用意にパースできる出力形式として、JSON(JavaScript Object Notation)形式があります。出力が XML ではなくなるため、厳密には Ajax(Asynchronous JavaScript + XML)ではなくなりますが、JSON を利用することで、JavaScript でのパース作業が格段に容易になる上、クロスドメイン呼び出しが可能になるというメリットがあります。
 
基本的な文法についてはこちらが参考になりますが、大体このようになります。

var person = {
      name: “John”, // name プロパティ
      age: 30,
      family: [ // 配列
        {name: “Jane”, age: 24}, // 配列内オブジェクト
        {name: “Richard”, age: 1}
      ]
   };
// 参照例
alert(person.name); // John が出力される
alert(person.family[0].name); // Jane が出力される

 
JavaScript で動的利用する場合、
JavaScript – JSONでデータを受信する方法2種類(s.h.log)
dojo toolkit の ScriptSrcIO(snippets from shinichitomita’s journal)
が参考になります。
これを PHP で生成する場合、PHP 5.2.0 以降デフォルトで組み込まれるようになったJSON関数(PECL:php-json)を利用します。日本語使用時の注意として、json_encode に渡す文字列の文字コードは UTF-8 にする必要があります。

  echo json_encode(array(“name”=>”John”, “age”=>30));

また、JSONP (JSON with Padding) という手法により、サーバ側からクライアントに対し非同期コールバック関数を実行させることができます。
リクエストURL:

http://foo.example.com/api/person?name=John&callback=myPersonHandler

リクエスト結果:

myPersonHandler({name: “John”, age:30});

埋め込む HTML:

<script type=”text/javascript” src=”http://foo.example.com/api/person?name=John&callback=myPersonHandler” charset=”UTF-8″><!–
    function myPersonHandler(result){
        alert(result.name + ” is ” + result.age + “years old”);
    }
//–></script>

こうすると、サーバからの結果の出力完了後に自動的に myPersonHandler が呼ばれるようになります。なお、myPersonHandler という関数名は、リクエストURL の callback パラメータを元にしているため、クライアント側で任意の関数に置き換えることが可能です。
 
参考:
PHP で JSON(Do You PHP?)
Collection & Copy – JSON 入門
JavaScript – dojo の ScriptSrcIO で動的クロスドメイン JSON 読み込み
JSONP とコールバック関数(戯れ言++ – 入門 JSON 3)

Java Web Start と Java 3D の関係

Java 3D を使う上で、障害になるのが、作成したプログラムの配布方法。
一つ前のエントリの方法で j3dcore-*.dll をバンドルして、manifest.mf を

Manifest-Version: 1.0
Bundle-NativeCode: j3dcore-d3d.dll;j3dcore-ogl.dll;j3dcore-ogl-cg.dll
Class-Path: j3dcore.jar j3dutils.jar vecmath.jar
Main-Class: Main

のようにして Executable JAR を作成、j3d*.jar と同じフォルダに置いて実行すれば簡単に動作するので、これをまとめて配布はできるのですが、この方法だと Java 3D のライセンス(LICENSE-Java3D-v*.txt: 2.a – 2.e)が懸念事項になります。
 
そこで、もう一つの配布方法として、公式のデモでも使われている手法、
Java Web Start を使うことにしました。
 
以下参考にした犀角(Diceros Horn)のとくながさんの記事へのリンクです。
 
Java Web Start リンク集 ( 犀角(Diceros Horn) )
Java Web Start を始めてみる
Java Web Start のサンプル
JWS で jar ファイルに含まれるファイルにアクセスするには