PEAR :: Package :: PHP_Archive

Description
PHP_Archive allows you to create a single .phar file containing an entire application.

.pharという要するにJARのPHP版を作るパッケージ。といってもまだリリースされてません。

PHP_Archive gains maturity – Lot 49 – Greg Beaver’s blog

Now, .phar can truly be self-contained archives – no dependencies at all, so that shrink-wrapped applications can be distributed in a single file and run with

$ php app.phar

or in a web browser by associating .phar with php the same way you associate .php

JARとWARの中間みたいな感じで1ファイルにまとめてアプリケーションを実行できるようです。

require_once 'Calendar.phar';
require_once 'Logger.phar';
require_once 'phar://Calendar.phar/Calendar/Arabic.php';
require_once 'phar://Logger.phar/Logger/Mail.php';

こんなように.pharをrequireしたり、アーカイブの中のファイルを指定してrequireしたりできるようです。圧縮した.pharsも使えるようになったとか。
オープンソースのPHPウェブアプリのインストールがもっと簡単になりそうです。

Passion For The Future: JavaScriptやVBscriptをExeに変換するWSH用コンパイラ

WSH用コンパイラ+

WSH用コンパイラ はVBScriptやJavaScriptをWindowsの実行ファイルに変換するコンパイラソフト。通常、こうしたスクリプト言語は実行コンテナにWebブラウザを必要とするが、このソフトでExeファイルに変換しておけば、単体で動作できる(但しmsscript.ocxは必要)。JavaScriptしか使えなくても、Windowsプログラムを作って、配布することができるようになる。

こんないいものがっ!?

Folksonomy : del.icio.usとFlickrを支える情報アーキテクチャ:Goodpic

階層構造を持たない、完全にフラットなネームスペース。XMLでおなじみの、Parent(親)・Child(子)・Siblingといった構造を持たない情報アーキテクチャ

Rails-Ajaxのデモを見て階層構造を持たない分類ってシンプルでいいなと思いました。
整合性もあまり気にしなくていいし、悩まずサッと付けれられるのでそれほど分類してる感が無いのがいい。何よりタグって呼んでるがいい。だって普通にカテゴリーだったら流行らなかったよ?

JavaScript面白い!
目標はPrototypeが読めるようになること。(=現状、読めない・・・)

今日びのJS事情に追いつくために基本的なところから勉強していきます!
まずはHTMLとイベントを分離する方法。

<button id="push">push</button>

こんなHTMLに、

<script type="text/javascript">
<!--
window.onload = function() {
    document.getElementById("push").onclick = function() {
        alert("push!");
    }
}
//-->
</script>

イベントをHTMLに書かずに直接入れます。HTML拾うには読み込みが終わってる必要があるのでonloadに設定。 Webアプリをやっていると馴染み薄いですが、無名インナークラスをリスナに登録する感じでしょうか。(Geckoエンジンだと正にaddEventListenerメソッドが使えるようです)
ああ、これは気持ちいいわ。

ref: イベントハンドラをHTMLから分離する

ml_dbobject.png

PEAR MLより。
DataObjectはある意味話題が尽きません・・・。

Mojavi + Smartyでコンポーネント化されたテンプレートはどうやって作るんだろうか・・・。

コンポーネント化されたテンプレートとは要するに

form1.png

こんな奴を

{$loginForm}

って感じで埋め込みたいってこと。
Filterでやろうにも特定のいくつかのページにだけ埋め込みたいし、Actionとテンプレが一緒になったものとしてほしいのでforwardやActionChainもどうもうまくない。それっぽいのがあった気がするブタさんとことももう見れなくなってるし。
たぶん仕事で使ってる人がみんなやってる方法っていうのがあると思うんですが・・・

神の子どもたちはみな腕を磨く: PHP

現在開発中のMojavi 2.0.0を使っている案件で$controller->forward()を実行しているアクションの挙動がおかしいので調べたところ、この事実を知ることになり驚愕しました。超ショック。

まさに、「ここはforward()のためにあったのね」でした。ためんなるわあ。

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");
}
?>

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