FreePAN: blog.bulknews.net

CPAN を補完しつつ、Perl 以外の言語でも使えるようにしようというプロジェクト FreePAN がスタート。Free Programming Archive Network の略で、Subversion レポジトリのミラーリングと、開発者の追加などが簡単に行えるような感じ。

言語問わないCPAN?こりゃ速攻でなんか上げたろ思いましたが、

FAQ Kwiki

How can I get a FreePAN account?

FreePAN accounts are initially being distributed manually. Join the FreepanIrc channel and ask for an account.

まだサイト上からアカウント発行とかはできないみたいです。

アレのやり方がわかったのでコレを作りました。

<?php
require_once("AllSession.php");
$allSession =& new AllSession();

echo "<pre>";
// セッションIDの配列
print_r($allSession->sessionId);
// $sessions["セッションID"] = セッションの中身
print_r($allSession->sessions);
echo "<pre>";
?>

session.save_pathからsess~というファイルを復元しています。
共有サーバなんかはsafe mode or CGI&SuEXECが必須かもしれないですね。

AllSession.php

ref: セパレータとして ””|”” を使ってるんですよ
ref: PHPのセッション自力復元

Mojavi + DB_DataObject使ってるとやっぱり、

$Member =& DB_DataObject::factory('Member');
$Member->get("userName", $request->getParameter("userName"));
if ($Member->password == md5($request->getParameter("password"))) {
    $user->setAuthenticated(true);
    $user->setAttribute("Member", $Member);
}

こんな感じで$userに$Memberを突っ込んだりしたくなるわけですよ。
でも悲しいことにPHPのセッションはリクエスト毎にファイルにserialize ⇒ ファイルからunserializeをしてるだけなのでunserializeするとき(session_start時)にクラスが宣言されて無いとPHP_Incomplete_Classという謎オブジェクトが。
Mojaviでsession_startはSessionContainer#loadでやっているのでFilterでは遅いようです。しょうがないので
PHP_Incomplete_Classが現れた時に動くコールバック関数を指定するunserialize_callback_funcを使って無理やり読み込むことにしました。

<?php
ini_set("unserialize_callback_func", "findIncompleteClass");

function findIncompleteClass($className) {
    $config = parse_ini_file(BASE_DIR."configs/DB_DataObject.ini", true);
    $name = str_replace(strtolower($config["DB_DataObject"]["class_prefix"]), "", $className);
    include_once($config["DB_DataObject"]["require_prefix"]."/".$name.".php");
}
?>

これもっといい方法無いのかな。

PEAR :: PEPr :: Details :: RSSBuilder

This is an RSS (Reach Site Summary) PHP Class, which make use of PHP DOM extension to produce valid RSS Feeds in one of the most common RSS formats such as ‘RSS 0.91’, ‘RSS 0.92’, ‘RSS 1.0’, ‘RSS 2.0’, ‘Atom’, ‘JavaScript’. The output maybe cached in a file. For more info take a look at ’./RSSBuilder/example.php’.

正しいRSSを作ってくれそうなRSSBuilderがPEAR proposalに。

書く方は普通に書いてもそんなに大変じゃないですが、コレ使ったら気持ちよさそう。

PEAR :: Package :: XML_FastCreate

Description

- Easy way to make valid XML :
$x->div(
$x->h1(””Example”“),
$x->p(””Hello”“),
$x->p(array(‘class’=>‘example’), ””World !”“)
)

おれの求めてたのはコレか?と思わせるXML_FastCreate 1.0.0がリリース。

XML_Treeとコレで4系でも扱いが簡単になるのかも。今度使ってみたい。

ブタさんとこのサンプルにあったようにMojavi + Smartyでcompileディレクトリを一個にしてると別モジュールの同名テンプレートを読み込んだ時にコンパイルされたファイル名がカブって動かない。(index.htmlとか)
Smartyのcompile_idにモジュール名を設定するさり気無い気配りを。

SmartyFilter.class.php:

<?php
require_once(RENDERER_DIR . "SmartyRenderer.class.php");

class SmartyFilter extends Filter {
    function execute (&$filterChain, &$controller, &$request, &$user) {
        // see if renderer is already loaded
        $loaded =& $request->getAttribute("SmartyRenderer");

        if ($loaded == NULL) {
            // smarty init params
            $params =  array(
                "cache_dir"      => SMARTY_CACHE_DIR,
                "caching"        => SMARTY_CACHING,
                "force_compile"  => SMARTY_FORCE_COMPILE,
                "compile_dir"    => SMARTY_COMPILE_DIR,
                "config_dir"     => $controller->getModuleDir()."config/",
                "app_name"       => $controller->getCurrentModule(),
                "debug_tpl"      => SMARTY_DEBUG_TPL,
                "debugging_ctrl" => SMARTY_DEBUGGING_CTRL,
                "debugging"      => SMARTY_DEBUGGING,
                <strong>"compile_id"     =&gt; $controller-&gt;currentModule</strong>
            );

            $renderer =& new SmartyRenderer($controller, $request, $user);
            $smarty = & $renderer-&gt;getEngine();

            foreach ( $params AS $key =&gt; $value ) {
                $smarty-&gt;$key = $value;
            }

            // set the renderer as a request attribute so we can retrieve it
            $request-&gt;setAttributeByRef("SmartyRenderer", $renderer);

            // execute chain
            $filterChain-&gt;execute($controller, $request, $user);

            // remove renderer
            $request-&gt;removeAttribute("SmartyRenderer");

        } else {
            $filterChain-&gt;execute($controller, $request, $user);
        }
    }
}
?&gt;

ref: Mojavi HTML_QuickForm Smarty + DB_DataObjectサンプル

PEAR :: Package :: File :: 1.2.0

Changelog:

* Fixed package.xml for PEAR 1.4 (dufuz)
added FILE_SORT_RANDOM mode (mike)
added File_Util::switchExt() (mike)

ファイルやディレクトリの読み書きなどが簡単にできるFileの1.2.0がリリース。

ChangelogにあるFILE_SORT_RANDOM modeを試してみました。

&lt;?php
require_once("File/Util.php");
foreach (File_Util::listDir("foo", FILE_LIST_FILES | FILE_LIST_DIRS, <strong>FILE_SORT_RANDOM</strong>) as $file) {
    echo $file-&gt;name."\n";
}
?&gt;

結果:

&gt;php FileListing.php
d.txt
b.txt
a.txt
c.txt

なるほど、ちょっとだけ嬉しい。

よくきたblog

xxxio : $_SESSION[‘foo’]の、fooの所に使える文字って、きまりありましたっけ?
xxxio : うーん。””|”“が入ってると上手く動かない気がする
xxxio : php5.0.3 / FC2 なんですけど、そもそも /tmp/sess_XXXXX の中って、
xxxio : セパレータとして ””|”” を使ってるんですよ

セッションの話。
そうそう、セパレータに””|”“を使ってるんですよね!

セッション変数名|中身をserializeしたやつ;セッション変数名|中身をserializeしたやつ;

ってなってるんですよね。これ簡単なパースのやり方無いかな。
このクラスができたら楽しいけどsafe modeじゃない共有レンタルサーバとかすっごい危険。

ref: PHPのセッション自力復元

PEAR :: PEPr :: Details :: Auth_TypeKey

The Auth_TypeKey package provides verification method using TypeKey Authentication. TypeKey is one of single sign-in service for weblog comments and others provided by Six Apart.

Blogネ申平田さんが以前公開されたPHPでTypeKeyを扱うクラスAuth-TypeKeyがPEARのProposaleに入っています。
認証で何気にTypeKey使ってたらおしゃれかもしれません。

PEAR好き野郎なのでPEAR Watchなどというカテゴリを作って見ました。

既存の便利クラスの紹介やバージョンアップ情報、リリース前のパッケージ、メンテナのなり方(おれが知りたいのでこれから勉強)などを書いていく予定です。