同梱の自動起動スクリプトがおかしい

pgpoolには自動起動用のスクリプトredhat/pgpool.init として同梱されています。

しかしこれの stop のとこがおかしく、--prefix=/usr 以外でインストールした場合、終了することができなくなっています。
これを修正して、ちゃんと停止するように修正。

stop(){
  echo -n $"Stopping ${NAME} service: "
        if [ $UID -ne 0 ]; then
                RETVAL=1
                failure
        else
                $PGPOOLDAEMON stop >> "$PGPOOLLOG" 2>&1 < /dev/null
                RETVAL=$?
                if [ $RETVAL -eq 0 ]; then
                        rm -f /var/lock/subsys/${NAME}
                        success
                else
                        failure
                fi
        fi;
        echo
        return $RETVAL
}

本当は第2引数で smart とか指定できるようにしたかったけど、時間なかったのでこれで。

Formで定義したWidgetを、全てHiddenとして出力する

確認画面で必要になったのですが、意外と簡単に実装できた。

Formクラスの中に下記のようなメソッドを追加して

<?php
  public function renderHiddenForConfirm()
  {
    $txt = '';
    foreach ($this as $f) {
      $id = $f->getName();
      if (self::getCSRFFieldName() != $id) {
        $w = new sfWidgetFormInputHidden();
        $txt .= $w->render(sprintf($this->getWidgetSchema()->getNameFormat(), $id), $this->getValue($id));
      }
    }
    return $txt;
  }

あとはテンプレート内で

<?php echo $form->renderHiddenForConfirm() ?>

と、するだけです。

ofFormConfirmPluginとかHTML_QuickFormのfreeze,unfreezeの実装だとか既にあったのですが、どう書く?みたいな感じで実装してみました。

scponlyc(chrooted)で接続ができないときの対処

たまーにchrootが利用できないときがある。(RHEL5とかDebian4とかFreeBSDとか)

そんなときは大体、作成したユーザのルートに/dev/nullを作成すると正常に動作するようになる。

cd /path/to/user/root
mkdir dev && mknod -m 666 dev/null c 1 3

プラグイン内でconfig_handlers.ymlを利用するときにエラーになる

config_handlers.ymlはプラグインの中で定義して、一緒に配布することが可能です。
しかし、バグかどうか分かりませんが、普通に書くとdebug=falseのときにエラーになるようです。
envがprodだろうがdevだろうが関係ありません。

symfonyのバージョンは1.2.7
ダウングレードしてみたけど直らなかったので、ずっとこの状態なのかも。

普通の書き方

config/foo.yml:
  class: myCustomConfigHandler

これだと Fatal error: class myCustomConfigHandler not found となります。
cache/の中を見てみると、config_config_handlers.ymlとroutingだけで、config_autoload.ymlの生成まですらいっていないようです。
というか、config_autoload.ymlが先に解析されないとダメなんじゃ。。。

回避

クラスが宣言されているファイルのパスを指定します。

config/foo.yml:
  file: %SF_PLUGINS_DIR%/myPlugin/lib/config/MyCustomConfigHandler.class.php
  class: myCustomConfigHandler


debugのtrue/falseでエラーになるんだから、バグだと思うんだが。。。


そういえば試行錯誤している途中で、%SF_PROJECT_ROOT%/configにconfig_handlers.ymlを入れて、%SF_PROJECT_ROOT%/libにmyCustomConfigHandler.class.phpを入れてみたけど動かなかった。

もしかして、カスタムハンドラがチュートリアルとかにあるように設定できなくなってる?

openpearでsymfonyプラグインを作るときに注意すること

openpearでパッケージングするときに色々パラメータを設定するのですが、「詳細な設定」のところにある「インストール先」の指定を注意しなければなりません。
デフォルトでは「/」となっておりますが、このままでplugin:installを行うと

plugins/
  config/
  lib/
  modules/
  プラグイン名/
    config/
    README

という風に展開されてしまいます。


公式パッケージのpackage.xmlと見比べると、openpearでパッケージングした方では、

に対してbaseinstalldir="/"と属性が指定されてました。 どうやらこれが悪さをしているようですが、openpearでは「インストール先」の指定が必須となっていますので、外すことはできません。 そこで、インストール先を「/プラグイン名」と指定してあげると

plugins/
  プラグイン名/
    config/
    lib/
    modules/
    README

といった具合に展開されるようになりました。

実際に使っているのがsymfony1.2なので1.0と1.1がどうなのか分かりませんが、以前は大丈夫だったのでしょうか。

openpearに登録しました。

openpearにてsfJpMobilePluginを公開しました。
開発はgithubで行っておりますので、こちらはgithubからマージしてもってくるスタンスです。
plugin:install 対応ということで。

やっと設定ファイルのキャッシュ機構が分かった

どうすればプラグインの中の設定ファイルをキャッシュできるか悩んでいたんですが、分かると簡単でした。

キャッシュを行うにはconfig_handlers.ymlという設定ファイルに、どういった設定ファイルなのか認識させる必要があります。
このファイルはプラグインの中の config/ に置くことも可能です。

書き方はこんな感じ

# config_handlers.yml

# 設定ファイルの各ROOTからの相対パス
#   - sf_root_dir
#   - sf_root_dir/sf_apps_dir/sf_app_dir
#   - sf_plugins_dir/*
config/foo.yml:
config/foo_bar.yml:
config/foo/bar.yml:
# *も使えます。
config/foo/*.yml:
config/foo/*/bar.yml

# 指定した設定ファイルに対するパラメータ指定
  # 設定ファイルをキャッシュに吐き出すためのパーサークラスの指定
  class: sfDefineEnvironmentConfigHandler
  class: myConfigHandler

    # 吐き出したパーサーに対してパラメータを渡せます。
    param:
      prefix: foo_
      foo: bar

そして、呼び出すときは、config_handlers.ymlで指定したパス名みたいに、各ROOTからの相対パスで書きます。

<?php
include sfContext::getInstance()->getConfigCache()->checkConfig('config/foo.yml');
include sfContext::getInstance()->getConfigCache()->checkConfig('config/foo_bar.yml');
include sfContext::getInstance()->getConfigCache()->checkConfig('config/foo/bar.yml');