パフォーマンス改善を正しくやりたいとか言っておいて、Plnetがあまりに重く、使い物にならなくなっていたので焦ってまた勘で対応していまいました・・・。

lighter_graf.png

しかも効果がありまくりで・・・。

mysqlがslow-query出しまくりなのでページキャッシュを入れまくりました。Mojavi2なんでこういうSmartyプラグインを作った感じです。

<?php
if (!defined(CACHE_LITE_DIR)) define('CACHE_LITE_DIR', '/tmp/');
if (!defined(CACHE_LITE_AUTO_CLEANING)) define('CACHE_LITE_AUTO_CLEANING', 128);

function smarty_function_mojavi_action($params, &$smarty)
{
    $id = $params['module'].'_'.$params['action'];

    if (isset($params['lifetime'])) {
        include_once 'Cache/Lite.php';
        $cache =& new Cache_Lite(array(
            'cacheDir' => CACHE_LITE_DIR,
            'lifeTime' => $params['lifetime'],
            'automaticCleaningFactor' => CACHE_LITE_AUTO_CLEANING,
            'automaticSerialization' => true
        ));

        $cache_id = $id.'_'.
            (isset($params['cache_id']) ? $params['cache_id'] : '');
        if ($data = $cache->get($cache_id)) {
            return $data;
        }
    }

    $controller =& Controller::getInstance();
    $actionChain =& new ActionChain();
    $actionChain->register($id, $params['module'], $params['action']);
    $actionChain->execute($controller, $controller->request, $controller->user);
    $data = $actionChain->fetchResult($id);
    if (isset($params['lifetime'])) $cache->save($data, $cache_id);
    return $data;
}
?>

なんでDBが重いのにmysql serverがCPU食わないんだろう。clientの方ばっかり食ってることになってる。

とりあえずcocoitiさんにスケーラブルWebサイトを借りたので読んで悔い改めたいと思います。

スケーラブルWebサイト
  • スケーラブルWebサイト
  • オライリー・ジャパン(2006-12-26)
  • オライリー・ジャパン
  • (著)Cal Henderson
  • (翻訳)武舎 広幸
  • (翻訳)福地 太郎
  • (翻訳)武舎 るみ
  • 定価:¥ 3,570
  • 新品価格:¥ 3,570
  • 中古価格:¥ 2,913
  • ASIN:4873113113
2007年4月1日から1日24時間La Foneraをより多くのフォネロにオンラインにして もらう為に、30日以上オフライン(プラグインしていない状態、アクティブにしていない状態、WiFiを共有していない状態)にしていたフォネロの方は、強制的 に一時的なローミングサービスの停止を行います。

FONコミュニティを楽しんでください!あなたのLa Foneraが再度WiFiをコミュニ ティと共有すれば、またローミングを楽しんでいただけます。

FONって最初の登録だけしとけば使いホじゃんとか思ってたら、

・・・そりゃそうだよなあ。おk

こないだちょろっと書いてたsplume(スプリューム)がテレビ東京のワールドビジネスサテライトで紹介されてた。

この記者会見の後、セミナーみたいのがあってそれにエントリーしてたんですが、仕事のスケジュールが厳しくて行けなかった・・・。

以前、会社でデモを見せてもらってすごく面白いと思いました。SplumeがSecond LifeやHomeと決定的に違う点は、“仮想空間がHTTPとその上のVRML2.0(の拡張)というオープンで標準的な仕様で作られてること”これはネットゲームの延長の閉じた仮想世界とはかなり話が違う。

TVでは仮想世界を企業が作ってリンクすることが出来るというふうに紹介されていたけど、HTMLでホームページを作るみたいに誰でも3D空間を作ってリンクできる。提唱者の人はネット全体を仮想空間に変えようっていう妄想野望を持ってるに違いない。

PHPでVRMLを出力していたエリアもあったので永久ループみたいな空間とか再帰的な空間とかもできるんだと思うと面白い。

デモの後で、

「10年ぐらい前に見た時はVRMLは現実的には使えなさそうな動きとかだったんですが、技術的にはどんな変化があったんですか?」

という質問をしたんですが、

「何も無い。世の中のCPUと通信速度が上がったのでまともに使えるようになった。」

と言っていたのが面白かった。

VRMLでリンクされた空間で面白かったのが、URLに地理的な位置関係があるところ。例えば、

「http://p0t.jp/foo.html の道をまっすぐ行くと http://yahoo.co.jp があるけど十字路を左に行くと http://google.co.jp がある」

みたいな感覚があるということ。非常に楽しいURIの可視化方法だと思う。既存の3DオーサリングツールもVRMLに対応してるのがあるからGoogle Earthを丸ごとエクスポートとか簡単なんじゃなかろうか。

実際に空間を歩いてて別ドメインに行ってもURL欄を見ていなければほぼ気付かないぐらいスムーズ。隣接した空間は先読みしてるんだと思う。

「HTTPベースということは空間にBasic認証かけて入ろうとするとパスワード聞いてくる、みたいなこともできるんですか?」

って聞いたら、

「そういうダイアログは作ってないが、基本的には可能」

と言っていた。HTTPベースというのは楽しい。

唯一気になるのがクライアントが独自ブラウザだということ。これはプラグインかもしくはFlashで出来たら素晴らしいな。

追記:

“日本版Second Life”とは言わせない――「splume」とは - @IT

 スプリュームは専用ブラウザの機能をInternet ExplorerなどのWebブラウザで実現するプラグインや、仮想空間内の三次元グラフィックスを開発できるオーサリングツールも開発中で、オーサリングツールは今夏にも提供開始するという。

開発中だそうです。すばらし。

ref: Splumeの技術面はココ ref: 3Dデスクトップと仮想空間

ボタン一発で実体参照に変換!MTプラグイン『EntityRefButton』 | i d e a i d e a

その名も「EntityRefButtonプラグイン」。MTの編集画面からボタン一発で選択した文字列を実体参照に置き換えてくれるというもの。これは便利!

便利!

「これ作ったら便利だけど、絶対誰か作るだろうから、出来たらそれを使わせてもらおう」

ってものって結構ありますけど、コレについては思ってから大分時間がたってしまって、逆に自分で作った方が効率的だったかも・・・。

ウィッシュツールリストって無いかな? 開発者しか参加できなくて、リストにあるツールを作るとポイント入って代わりに自分の欲しいツール作ってもらえるとか。そりゃないか。

経緯:

p0t: コンポーネント化されたテンプレパーツ

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

悩み。

p0t: Action呼び出しプラグイン

テンプレ中でActionChainでパーツを呼び出す。 なんで今までこれ気づかなかったんだろ。

解決。

本題:

Webアプリのコンポーネント化されたテンプレパーツが好きだ。

他にも好きな奴がいるらしい。JSR 168にPortletなんて仕様もあった。

JSR-000168 Portlet Specification

いやいやいや、こんなメンドイやつじゃないっつーの。ロジックとテンプレ(見た目)がひとまとまりになってればなんでもいいっつーの。

前述のmojavi_actionプラグインによって解決に見えたが、あれには2つ問題があります。

  1. エラーが拾えない
  2. 遷移が出来ない
1についてはこの間のEthna開発ミーティングでも話が出てました。(そういう仕組み入れてくれるらしい。あつい) Action → View → テンプレ という風にコンポーネントを呼び出す場所を後にもってくる程楽にはなるけどエラーが拾い辛い。

2は例えばログインのコンポーネントがあったとして、ログイン失敗したときに元の画面に遷移できない。いくつものコンポーネントが集まって一つの画面になってるのに遷移先はそのコンポーネントのみの画面に遷移しちゃうんです。

Paul Grahamの教え子(じゃない)はどうやってるのかなと思い、最近のUI的ヒットであるreddit.comを見てみました。

reddit_1.png

これのログイン枠も同じ問題を持ってるハズ!

reddit_2.PNG

?error=1だとinvalid loginで、

reddit_3.PNG

?error=2だとusername already takenかよ!!!

今ごろMojavi2用Smartyプラグイン作成。

<?php
function smarty_function_mojavi_action($params, &$smarty) {
    $controller =& Controller::getInstance();
    $actionChain =& new ActionChain();
    $actionChain->register($params["module"]."_".$params["action"], $params["module"], $params["action"]);
    $actionChain->execute($controller, $controller->request, $controller->user);
    return $actionChain->fetchResult($params["module"]."_".$params["action"]);
}
?>

これをこんな感じで使う。

<html>
<body>
<div id="menu">
<strong>{mojavi_action module="Menu" action="List"}</strong>
&lt;/div&gt;
&lt;div id="contents"&gt;
foo
bar
ontent
&lt;/div&gt;
&lt;/body&gt;
&lt;/html&gt;

テンプレ中でActionChainでパーツを呼び出す。 なんで今までこれ気づかなかったんだろ。

ZEND ANNOUNCES INDUSTRY-WIDE PHP COLLABORATION PROJECT AT ITS INAUGURAL PHP CONFERENCE
  1. Zend PHP Framework: A Web application framework which will standardize the way PHP applications are built. The Zend PHP Framework will accelerate and improve the development and deployment of mission-critical PHP Web applications
  2. Engagement with the Eclipse Foundation: Zend is joining the Eclipse Foundation as a Strategic Developer. Zend is now proposing to lead a project focused on PHP within Eclipse

Zendのプレスリリース、PHP COLLABORATION PROJECT。

・エンタープライズ向けWebアプリケーションフレームワーク作る。 ・Eclipse Foundationと組んでEclipseのPHPプラグイン作る。

エンタープライズ/ミッションクリティカルな用途向けっつーとEJBみたいなのを作るってことかな? Eclipseの方もどうなるのか気になるところ。IBMがPHP用のPluginを寄与するんじゃないかと勝手に予想してたんですが、Zendがやるんですね。PHPEclipse、TruStudioはどうなるのか!

怠惰なテンプレライブラリRaw Template Engineを更新しました。

Raw Template Engine 0.2

更新点:

  • プラグインによる拡張機能追加

大層な新機能ですが実際は・・・

テンプレ:

&lt;html&gt;
&lt;head&gt;
&lt;title&gt;&lt;?=$title?&gt;&lt;/title&gt;
&lt;/head&gt;

&lt;body&gt;
&lt;h1&gt;&lt;?=$title?&gt;&lt;h1&gt;
&lt;hr /&gt;
&lt;h2&gt;Methods&lt;/h2&gt;
&lt;ul&gt;
&lt;?foreach ($methods as $method):?&gt;
    &lt;li&gt;&lt;?=$method?&gt;&lt;/li&gt;
&lt;?endforeach;?&gt;
&lt;/ul&gt;
&lt;h2&gt;Directories&lt;/h2&gt;
&lt;ul&gt;
    &lt;li&gt;
        plugins/
        &lt;ul&gt;
            &lt;li&gt;html_options.php&lt;/li&gt;
            &lt;li&gt;html_radios.php&lt;/li&gt;
        &lt;/ul&gt;
    &lt;/li&gt;
    &lt;li&gt;
        templates/
        &lt;ul&gt;
            &lt;li&gt;index.php&lt;/li&gt;
        &lt;/ul&gt;
    &lt;/li&gt;
    &lt;li&gt;index.php&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Plugins&lt;/h2&gt;
&lt;ul&gt;
    &lt;li&gt;&lt;?html_options("html_options", $plugins)?&gt;&lt;/li&gt;
    &lt;li&gt;&lt;?html_radios("html_radios", $plugins)?&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/body&gt;
&lt;/html&gt;

PHP:

&lt;?php
include_once("Raw.php");

$raw =& new Raw();
$raw-&gt;assign("title", "Raw Template Engine");
$raw-&gt;assign("methods", array("assign", "assign_by_ref", "fetch", "display"));
$raw-&gt;assign("plugins", array(1 =&gt; "html_options", 2 =&gt; "html_radios"));
$raw-&gt;display("index.php");

ライブラリ:

&lt;?php
//
// Raw Template Engine - the template engine using raw php.
//
// Copyright (C) 2005 Masaki Komagata &lt;komagata@p0t.jp&gt; 
//     All rights reserved.
//     This is free software with ABSOLUTELY NO WARRANTY.
//
// You can redistribute it and/or modify it under the terms of 
// the PHP License, version 3.0.
//
class Raw {
    var $template_dir = "templates/";
    var $plugin_dir = "plugins/";
    var $template_vars = array();
    function assign($name, $value) { $this-&gt;template_vars[$name] = $value; }
    function assign_by_ref($name, &$value) { $this-&gt;template_vars[$name] =& $value; }
    function display($template) { echo $this-&gt;fetch($template); }
    function fetch($template) {
        $this-&gt;_load_plugins();
        extract($this-&gt;template_vars);
        ob_start();
        include($this-&gt;template_dir.$template);
        $result = ob_get_contents();
        ob_end_clean();
        return $result;
    }
    function _load_plugins() {
        if (is_dir($this-&gt;plugin_dir) and ($dh = opendir($this-&gt;plugin_dir))) {
            while (($file = readdir($dh)) !== false) @include_once($this-&gt;plugin_dir.$file);
            closedir($dh);
        }
    }
}

表示:

raw-0.2.png

ただの関数をsmartyプラグインみたいに見せてるだけです!

Mojavi Japan – フォーラム Smarty-Lightについて

SmartyRendererではSmarty-Lightって使えないんですよね?(頓珍漢な質問であればすいません)使えなかったら使えるようなプラグインがあったらいいかなぁ…と。

という話題があったのでSmartyLightRenderer作りました。

SmartyLightRenderer-0.1

PHPカンファレンス2005のEthnaの藤本さんの発表であった、

「ウィザードなど一定のパターンのあるパーツをプラグインとしてフレームワークに組み込む」

っていう話を聞いて、なるほどそういうのがたくさんあったら便利かもと思いました。フレームワークでクラスライブラリより粒度の大きい再利用部品ができたので更に粒度を大きくしようとするとコンテンツを再利用できるようにしようとして自然とレイヤーが上がるのかもしれません。

最近PHPのフレームワークを調べていると、以前見つけたMidgardとか最近知ったBlueshoesとかCMSフレームワークというのを見かけるようになりました。
フレームワークより部品の粒度を上げてくと自然とCMSに向かっちゃうのかもと思いました。

ref: TownPortal
ref: PHPカンファレンス2005