中年engineerの独り言 - crumbjp

LinuxとApacheの憂鬱

Cockatoo近況

まとまった時間が取れたのでCockatooの機能追加をしました。

v1.0ブランチを切りました

https://github.com/cockatoo-org/Cockatoo/tree/v1.0
ある程度互換性を無視して一気に進みます。

Beak高機能化

アプリ開発の簡易化(わざわざMongoDBなどを立てなくても開発できるように!)を目指して作った機能です。
発案当初はCockatooシステム構成を柔軟にする為のモノだったのですが、開発の流れでアプリデータまでサポートしてしまい、非常に中途半端なORMになってしまいました。
今回一通りの機能を揃え、まともに使えるレベルになってきました。

しかし元々分散システム用に諦めている部分が多く
アプリデータまでサポートしようとしても、どこまで行っても中途半端なORMになってしまいます。
さらにORM(で複雑な事をやった時)の副作用で避けては通れない問題

  • パフォーマンス劣化
  • 隠ぺいによる煩わしさ
  • 使用可能プロダクトの限定
  • などなど

に悩まされる事になるので、積極的にはサポートしていかない方針です。
今後はCockatooシステム自体が必要とした場合に限定して、機能追加されて行くでしょう。

シンプルI/F

これまでのBeakController::beakQueryは複数並列クエリーを前提として設計されました。
しかし実際には単発クエリーを打つことが多く冗長でした。
今回新たに、単発クエリー用のI/FBeakController::beakSimpleQueryを用意しました。

$admin_data = BeakController::beakSimpleQuery("storage://wiki-storage/users/admin?get");
$admin_data["history"] []= $histdata;
$res = BeakController::beakSimpleQuery("storage://wiki-storage/users/admin?set",$admin_data);

勿論、今後もBeakController::beakQueryは並列用として残ります。

範囲取得(getR)

MongoDBのクエリーと互換です。(そのまま渡します)
なので条件を渡さない場合はコレクション全体を取得します。

$query = array('_u" => array('$gt' => time()-86400));
$histories = BeakController::beakSimpleQuery("storage://wiki-storage/hist/?get",$query);
foreach( $histories as $history ){
 :
}

現在サポートしている演算子はこれだけ。

  • $in
  • $gt
  • $lt
  • $gte
  • $lte
Sort , Skip , Limit

MongoDBとほぼおなじです。
ただし、Sortに関しては以下の制限があります

  • 指定できるキーは1つだけ
  • キーは条件に指定したもの(table scanを避ける為の措置)
$query = array('_u" => array('$gt' => time()-86400));
// キー'_u'で降順ソートし、21番目〜30番目のドキュメントを取得する
$cond  = array(Beak::Q_SORT=>'_u:-1',Beak::Q_SKIP=>20,Beak::Q_LIMIT=>10);
$histories = BeakController::beakSimpleQuery("storage://wiki-storage/hist/?get",$query,$cond);
foreach( $histories as $history ){
 :
}
ドメインマッチドライバ

地味だけど今回一番大きな変更です。(ここがCockatooの心臓部です)

今までは先頭のスキーム単位でドライバを選択していました。

== config.php ==
    self::$BEAKS = array (
      Def::BP_CMS      => 'Cockatoo\BeakFile'   , // cms://...
      Def::BP_SESSION  => 'Cockatoo\BeakFile'   , // session://...
      Def::BP_LAYOUT   => 'Cockatoo\BeakFile'   , // layout://...
      Def::BP_COMPONENT=> 'Cockatoo\BeakFile'   , // component://...
      Def::BP_STATIC   => 'Cockatoo\BeakFile'   , // static://...
      Def::BP_STORAGE  => 'Cockatoo\BeakFile'   , // storage://...
      Def::BP_ACTION   => 'Cockatoo\BeakProxy' , // action://...
      null
      );

この場合BeakProxyが採用され、リモートサーバのアクションがコールされます。

  • "action://wiki-acion/wiki/PageAction" => BeakProxy = (RPC)
  • "action://core-acion/wiki/AccountAction" => BeakProxy = (RPC)

しかしRPCオーバーヘッドより小さな処理や
一部のストレージをmemcachedに流したかったりする要望がありました。

今回、設定項目が増え、より柔軟な構成が可能になりました。

== config.php ==
    self::$EXT_BEAKS = array (
      'action://core-action/'   => 'Cockatoo\BeakAction' ,
      null
      );

$EXT_BEAKSは$BEAKSより優先されます。
よって上記の設定と合わせて以下の様に動作します。

  • "action://wiki-acion/wiki/PageAction" => BeakProxy = (RPC)
  • "action://core-acion/wiki/AccountAction" => BeakAction = (local実行)

バイス => テンプレート

開発当初と意味が変わって来たのでソースコード共々名前を変えました。
変数名とクラス名が微妙に変わったので何気に大きな変更になってしまった。。

class DeviceSelector

名称変更 TemplateSelector

config.php / def.php

以上の影響により、若干変更があります。