mozillaZine 日本語版 – mozillaZine 和訳

Scott MacGregor によると、”“Mozilla Foundation は今日 Thunderbird 1.0 電子メールクライアントをリリースした。Thunderbird は 検索結果保存フォルダ、メッセージのグループ化、他のメールクライアントからの包括的なメールの移行、そして RSS との統合 (訳注:RSS リーダ機能) のようなたくさんの新しい機能を持つ。このリリースは先月成功した Firefox 1.0 のリリースに続くものである。

ビルドは GetThunderbird.com もしくは FTP サーバ から入手できる。リリースノートも利用可能だ (日本語版)。サポートは我々の Thunderbird Support Forum で受けられるが、このリリースに関するその他の話題に関しては、Thunderbird Forums (日本語版) で議論することが出来る。ローカライズされたバージョンはあと二・三日後から出始めるだろう。”“

Thunderbird 1.0キター。0.8から早かったー。

永続化がらみでPHPでアプリケーションスコープを扱うためのクラスを作ってみました。

ApplicationScope#setでアプリケーションスコープに変数をセット。

require_once("Book.php");
require_once("ApplicationScope.php");

$book =& new Book();
$book->name = "Effective Java";
$book->price = 1000;
$book->releaseDate = "2004/12/01";

$app =& new ApplicationScope();
$app->set("book", $book);
$app->set("mail", "bg@p0t.jp");
$app->set("age", 26);

ApplicationScope#getでアプリケーションスコープから変数を取得。

require_once("Book.php");
require_once("ApplicationScope.php");

$app =& new ApplicationScope();
$book =& $app->get("book");
$mail =& $app->get("mail");
$age =& $app->get("age");

var_dump($book);
var_dump($mail);
var_dump($age);

中身は結局ファイルにserializeです。デフォルトでsessionのディレクトリに一時ファイルを作ってます。setの時はその時点で書き込まれるので他のリクエストともやり取りできます。といってもアプリケーションスコープってどういう時に必要なんだろう。ASPやServletでも使ったこと無いです。

ApplicationScope-0.1.tgz

会社の五周年に楽天のKさんが来ていたのでPHP関連の質問を幾つかさせて頂きました。

Q1. PHPのセッションは重複するのか。(PHPのセッションID 参照)

A1. その理解の通り、1台では重複しないが複数台では重複する。

Q2. なぜPHPをApache2のようなマルチスレッドサーバで動かしてもおかしくならないのか。

A2. マルチスレッドでは動かない。Apache2で動かす場合はプロセスベースで動く設定にする。

その他にも楽天のDB構成やPythonの話などいろいろと聞かせてもらって勉強になりました。疑問がズバーン解決してとてもすっきりしました。

はてなダイアリー – Harukiからの平面波

しかし、クラスが外部ファイルで定義されている場合、以下のようにするとエラーが出るので注意する。

$obj = new foo; require_once ‘class.foo.php’;

これ、セッションに保存したオブジェクトを取り出すところでハマりました。 セッションからオブジェクトを復元するのにはunserialize()関数が使われているのでsession_start()より前にクラスファイルをrequireしとかないとPHPが何のオブジェクトなのか分からないので__PHP_Incomplete_Classになってしまいます。

取り出した物を見てみるとデータとしては完全にそろってる。でも何のクラスなのかわからないのでエラー。

これはガムを知らない民族の前に置いてあるガムみたいなものかと。おれらは目の前にあるものがガムクラスのインスタンスだと分かっているのでどんな振る舞いをするのかも知っている。しかしガムというものを知らない人の前に置かれたガムは謎のオブジェクト。ガムを知らないのでどんな振る舞いをするのかはさっぱりわからない、しかしデータだけは目の前にある。

「現実世界はそんなもの(クラスはわからないがインスタンスが目の前にある)ばかりなのでオブジェクト指向を無理矢理当てはめようとしても失敗する。」というのを何かで読んだ気がします。

金曜日ににせマックの電源がお亡くなりになりました・・・。

マザー死んだかと焦りましたが適当な電源を買ってきたら動いた。ディスプレイすら無い(ノートしかない)のでSSHが上がらないと詰み。しかしちゃんと立ち上がってくれたので復旧しました。

最近のクソドモによる鬼ダウンロードのせいじゃねーのかと。それ以前に電源ファン適当にはずしちゃ駄目でした。

手軽なPHPオブジェクト永続化のためのクラスStoredObjectを0.2にしました。

1オブジェクト=1ファイルだと10,000件の検索に5秒ぐらいかかるので1クラス=1ファイルにしました。(1オブジェクト=1行)

DataObjectよりシンプルにするためにfactoryを廃止。

下記は永続化のサンプル。

StoredObject#store()で保存。(保存先はデフォルトだと実行したディレクトリ。コンストラクタの第二パラメータでディレクトリ指定できます)

require_once("StoredObject.php");

class Book {
    var $name;
    var $price;
    var $releaseDate;
}

$storedObject =& new StoredObject("Book");

$book =& new Book();
$book->name = "軽快なJava";
$book->price = "1000";
$book->releaseDate = "2004/12/01";
$storedObject->store($book);

$book->name = "Effective C++";
$book->price = "2000";
$book->releaseDate = "2004/12/02";
$storedObject->store($book);

$book->name = "Programming Perl";
$book->price = "3000";
$book->releaseDate = "2004/12/03";
$storedObject->store($book);

StoreObject#get()で取ってきます。

require_once("StoredObject.php");

class Book {
    var $name;
    var $price;
    var $releaseDate;
}

$storedObject =& new StoredObject("Book");

$book1 =& $storedObject->get("name", "軽快なJava");
var_dump($book1);

$book2 =& $storedObject->get("name", "Effective C++");
var_dump($book2);

$book3 =& $storedObject->get("name", "Programming Perl");
var_dump($book3);

実行結果はこんな感じです。_StoredObject_hashというのはStoreObjectが勝手に割り当てているハッシュ値です。

object(book)(4) {
  ["name"]=>
  string(10) "軽快なJava" 
  ["price"]=>
  string(4) "1000" 
  ["releaseDate"]=>
  string(10) "2004/12/01" 
  ["_StoredObject_hash"]=>
  string(32) "8141cda9579ef74e052390de23770469" 
}
object(book)(4) {
  ["name"]=>
  string(13) "Effective C++" 
  ["price"]=>
  string(4) "2000" 
  ["releaseDate"]=>
  string(10) "2004/12/02" 
  ["_StoredObject_hash"]=>
  string(32) "2d37647c506ed9a84f3e2966afcf40e0" 
}
object(book)(4) {
  ["name"]=>
  string(16) "Programming Perl" 
  ["price"]=>
  string(4) "3000" 
  ["releaseDate"]=>
  string(10) "2004/12/03" 
  ["_StoredObject_hash"]=>
  string(32) "ec905200936acd1ae7ecdcc6e7a4099d" 
}

find()メソッドや正規表現での検索を追加予定です。

StoreObject-0.2.tgz

はてなダイアリー – Amethyst製作日記

一つ考えられる方法として、オブジェクト管理クラスを用意して、そのオブジェクト管理クラスは管理対象のオブジェクトをシリアライズしてローカルにファイルとして保存、読み出しを行えるようにするとか。

まぁ、ファイル読み書きのオーバーヘッドが発生しちゃうけど、現実的な実装方法なのかも知れない。

コレを見てPHPで手軽にオブジェクトの永続化ができたらいいなと思ったのでちょっと作ってみました。

早い話が設定やDBがいらないDB_DataObjectといったものです。

require_once("StoredObject.php");

class Book {
    var $name;
    var $price;
    var $releaseDate;
}

$book =& new Book();
$book->name = "Effective Java";
$book->price = "1000";
$book->releaseDate = "2004/12/01";

$storedBook =& StoredObject::factory("Book");
$storedBook->store($book);

クラス名でStoredObjectのfactoryを動かして、store()でオブジェクトを保存します。

require_once("StoredObject.php");

$book =& StoredObject::factory("Book");
$book->get("name", "Effective Java");
var_dump($book);

DataObjectライクに永続化していたオブジェクトを取得。

仕組みは簡単でクラス名で作成したディレクトリに1オブジェクトに対応する1ファイルを作ってserialize()保存しているだけです。取得するところはオブジェクトが増えると半端じゃなく遅くなると思いますが、何のインストールも設定ファイルもいらないのでプロトタイプの作成にはいいかもしれないです。

StoredObject-0.1.tgz

BMediaNode: PHPでのオブジェクトプーリング

かなり大げさになりますが、memcachedというデーモンを使うとPHPでもオブジェクトのプーリング・キャッシングは可能になるみたいです。PHP用のクライアントAPIはPECLに含まれています。

PHPでオブジェクトプーリングを実現するもの。なるほど、PHPだとリクエストごとに消えちゃうし、別リクエストでは別ものになっちゃうので常駐してるデーモンに確保しといてもらうって感じですか。

・・・Servletでいいじゃん。

2ちゃんねるベストヒット: 自分の知らなかった妻の顔

[既婚男性(仮)] 怪しいぞ!嫁の不審な行動を監視するスレ ttp://human5.2ch.net/test/read.cgi/tomorrow/1096325759/l50

212 名前:素敵な旦那様 投稿日:04/11/24 09:58:44 仕事が早く終わって帰宅したらいなかった。 寝室で着替えてるうちに戻ったらしく、台所で音がしてたので おどかそうかとこっそり行ってみたら、 マツケンサンバ歌いながら激しくステップ踏んでた(上手)。 梅酒あおりながら。 その後、スーパーの袋から焼き鳥出して立ったまま食べ、 「う、う、うーまーいー!」と叫んで、またマツケンサンバ。 「キュッキュッ!」とか「えいえい!」とか意味不明な合いの手を入れながら。 出ていけなくてしばらくそのまま見てた。

「帰ってるよ」と出てった時の泣き笑いみたいな顔、初めて見る顔だった。

笑った。

H A R U P A N O B L O G: RSS Factory に Impress Watch 系ニュースを追加

フィルタを書くだけの力仕事ですが、正規表現の勉強にはなります・・・。

ImpressのHeadlineのRSSがありがたい。これでやっと巡回ページが全部RSSリーダで読めるようになりました。