肉とビールとパンケーキ by @sotarok

少し大人になった「肉とご飯と甘いもの」

Ethnaで快適に開発するためのツール Ether_Suite、プレリリース

どうもこんばんは。
久々にEthnaとかガリガリいじりまくっているsotarokです。


そんなわけで、今夜はひとつ作ったのでリリースしたいと思います。

なんでプレリリースかというと、プラグイン関係をどういう風にリリースしていくかが未定だからです。*1

でも作ってしまったもんは作ってしまったので、せっかくだから公開しちゃいます。好きに使ってください&フィードバックもいただけると嬉しいです。読み方?エーテル・・スイート・・・かな・・。

まずはサンプルサイト

なにがどうなっているの、ということなるので、サンプルサイトを設置しました。

右上になにかあるのにお気づきかもしれませんが、とりあえずフォーム送信してみたり、してみてください。

快適なデバッグ・開発環境を!

まぁ、見ればわかるとおり、symfonyをぱk・・・インスパイアされて、つくりました。

Ethnaで、例えばログを画面上に表示させようとすると、log_facility で echo を指定することになるんですが、そうすると、テンプレート描写前にエラーやデバッグが出力されてしまったりして、結構厄介でした。まずひとつは、ログ出力を後ろにもってこようーと思い始めたところからスタートして、どうせなら・・・とか思っているうちにいろいろ付け足して結局こういうことになってしまいましたw

そんなわけで、Ether_Suite という名前でリリース(準備をしています)!!

必要なもの

最低限必要なものと、追加機能の2つがあります。

最低限必要なもの

  • www/ether/
  • app/pugin/
    • Filter/
      • Ether_Plugin_Filter_EndLogger.php
    • Logwriter/
      • Ether_Plugin_Logwriter_Echo.php

かな、多分。(厳密に言えばこれも別に必須ではないんですけど、これがないとただ「Ethna」って表示されるだけなのでw)

追加のものは以下のとおり。だいたい名前のとおりなんですが。

  • Ether_Plugin_Filter_DumpActionForm.php
  • Ether_Plugin_Filter_DumpConfig.php
  • Ether_Plugin_Filter_DumpInfo.php
  • Ether_Plugin_Filter_EthnaVersion.php
    • Ethna のバージョンを表示するだけのもの。雰囲気的にほしかった。
  • Ether_Plugin_Filter_ExecutionTime.php
    • Ethna標準のExcecutionTimeの置き換え。ExecutionTimeをコメントで出力せずに、Ether_Suiteで捕捉できる形で吐く。
  • Ether_Plugin_Filter_FilterSwitch.php
    • 本番時にpostFilterが出力されないようにするためのもの。これはあんま検証してない。

ダウンロード

ダウンロード。
tarボールはこちら。全部まとまってます。

配布のしかた決めたらopenpearでうにゃうにゃできたらやりたいんですが、今のところとりあえずソースはnequalのリポジトリにおいておきます。

使い方

設置

plugin とかを所定の位置に設置します。tar展開するとwwwをappがあるので、それをそのままの場所に設置するだけです。

コントローラーの $plugin_search_appids に Ether を追加

普段は、自分のAPPIDとEthnaが並んでいるところの先頭に「Ether」を追加。deadlinetimerの一部のコードもってきたので、APPIDがDeadlineになってるけど気にしない :) *2

<?php // 色づけのための開始タグ

// ..中略

    var $plugin_search_appids = array(
        /*
         *  write list of application id where Ethna searches plugin.
         *
         *  Example:
         *  When there are plugins whose name are like "Common_Plugin_Foo_Bar" in
         *  application plugin directory, Ethna searches them in the following order.
         *
         *  1. Common_Plugin_Foo_Bar,
         *  2. Deadline_Plugin_Foo_Bar
         *  3. Ethna_Plugin_Foo_Bar
         *
         *  'Common', 'Deadline', 'Ethna',
         */
        'Ether', 'Deadline', 'Ethna',
    );

コントローラーに利用するプラグインを記述

例えば、全部使う場合は以下のとおり。

<?php // 色づけのための開始タグ

// ..中略
    var $filter = array(
        /*
         *  TODO: when you use filter, write filter plugin name here.
         *  (If you specify class name, Ethna reads filter class in-
         *   filter directory)
         *
         *  Example:
         *
         *  'ExecutionTime',
         */
         'FilterSwitch',
         'ExecutionTime',
         'DumpActionForm',
         'DumpConfig',
         'EndLogger',
         'DumpInfo',
         'EthnaVersion',
    );
etc/APPID-ini.php を変更。
  • log_facility を echo に。
  • log_level を debug に。
  • debug を true に。
<?php // 色づけのための開始タグ

// ..中略
/*
 * deadline-ini.php
 *
 * update:
 */
$config = array(
    // site
    'url' => '',

    // debug
    // (to enable ethna_info and ethna_unittest, turn this true)
    'debug' => true,

    // db
    // sample-1: single db
    'dsn' => '',

    //
    // sample-2: single db w/ multiple users
    // 'dsn'   => 'mysql://rw_user:password@server/database', // read-write
    // 'dsn_r' => 'mysql://ro_user:password@server/database', // read-only
    //
    // sample-3: multiple db (slaves)
    // 'dsn'   => 'mysql://rw_user:password@master/database', // read-write(master)
    // 'dsn_r' => array(
    //     'mysql://ro_user:password@slave1/database',         // read-only(slave)
    //     'mysql://ro_user:password@slave2/database',         // read-only(slave)
    // ),

    // log
    // sample-1: sigile facility
    'log_facility'          => 'echo',
    'log_level'             => 'debug',
    'log_option'            => 'pid,function,pos',
    'log_filter_do'         => '',
    'log_filter_ignore'     => 'Undefined index.*%%.*tpl',

// .. 中略
js と css を読み込む

抜粋。JQueryが必要なので、Google APIで読み込んでいます。

<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<link rel="stylesheet" href="{$config.url}css/ethna.css" type="text/css" />
<link rel="stylesheet" href="{$config.url}ether/css/ether.css" type="text/css" />

<script type="text/javascript" src="http://www.google.com/jsapi"></script>
<script type="text/javascript">
    google.load("jquery", "1.2");
</script>
<script type="text/javascript" src="{$config.url}ether/js/jquery.cookie.js"></script>
<script type="text/javascript" src="{$config.url}ether/js/ether.js"></script>
</head>
<body>
...

いろいろ

まず、Ethna本体のバグと思われる(報告済み)点を補うために、EndLoggerというFilterが存在します。
現行のEthnaのバージョンおよびHEADでも、なんと、loggerのendメソッドが呼ばれる箇所がないため、Logwriterプラグインのendメソッドの実装がすべて、呼ばれる場所がありません。*3 なので、EndLoggerでは、loggerを終わらせる処理をしているだけです。

それから、ether.js は、HTMLファイル内にある、「ethna-debug」クラスのついた要素を探索します。そのすべてにおいて、「ethna-debug-title」というクラスのついたdivで囲まれたところの文字列を、メニューに加え、on/offスイッチを加えます。

そんなかんじです。

ですので、もし「こういう感じのものを出力して、メニューに加えたい!」ということがあれば、自分で Filter プラグインを書いて、postFilter で、例えば以下のような実装をすればよいだけです。(以下の実装はEthnaVersionの実装例)

<?php

class Ether_Plugin_Filter_EthnaVersion extends Ethna_Plugin_Filter
{
    function postFilter()
    {
        echo '<div class="ethna-debug" id="ethna-debug-evwindow">';
        echo '<div class="ethna-debug-title">' . ETHNA_VERSION . '</div>';
        echo "<div class=\"ethna-debug-log\">";
        echo ETHNA_VERSION;
        echo "</div> \n";
        echo '</div>';
    }
}

その他注意

多分まだまだガリガリソースは書き換えると思います。
Cookie使ってる関係でjquery.cookie.js に依存しているのがいやなところですね。

でもまあ形はできてきたと思います。

使ってみると、ActionFormのダンプとかホント必要だったと思うなあ・・・w あと、それなりに表示メニューの追加をしやすくできているかな、と思うます。

JQueryが本番では必要ありません、という人は、開発環境でのみ読み込むようにしてください。(私は smarty に {dev} という block plugin を作っています)

ライセンスはEthnaにあわせてBSDにしようと思ってます。JQueryが必須なので、JQueryのMITとの兼ね合いも気になるところです。ちょっとライセンスもチェックしないとかなあ。

以上です

質問やフィードバックもお待ちしています。

*1:今、EthnaIRCチャンネルでは、id:maru_ccさんと、「みんなが共通に使えるプラグインとかを集めて自由に開発できるようにしたいよね」という話をしています。CakePHPでいうBaker、symfonyでいうPluginのような、コミュニティが作ったプラグインとかが自由に利用できるような、ということです。openpearで運用するかもしれないという話も出てたり出てなかったりしていて、そのためには若干Ethna本体への修正が必要になります。なので、そのあたりの調整どうするのか、ということと、Ethnaに備わっている plugin-install の機能との兼ね合いどうするんだとかうねうねうねうねうね。

*2:はてラボになんかパクりサービス出されたけど(被害妄想)、気にしない :p

*3:EthnaユーザーはみんなfcloseせずにPHP使っていたということになりますね、オホホホホ :p