Migrations プラグインがサポートするデータベースは MySQL のみ?

https://github.com/CakeDC/migrations

CakePHP のデータベーススキーマの管理用に Migrations プラグインがある。
Migrations プラグインで残念なことは、CakePHP の Schema クラスがサポートしていないクエリはプラグイン内部 (CakeMigration クラス)で SQL を生成しているのだが、 MySQL を前提にした SQL を発行しているので、PostgreSQL などでは使えない機能がある。(またはバージョンアップで使えなくなる)

たとえば、rename_table は、2.2 以降利用できなくなってしまった。
仕方がないので、rename_table はやめて直接 ALTER TABLE を実行するように変更した。

追記 (2013-12-25)

上記の不具合は、バージョン 2.2.3 で解決しました。

PukiWiki 派生プロジェクト

Google Apps を使用したり、Redmine などでも Wiki が使えたりする関係で、新たに単独で Wiki サーバを立てることはなくなったが、今でも一部 PukiWiki を使用している。

PukiWiki: http://pukiwiki.sourceforge.jp/

Pukiwiki の開発が止まっていることに対する記事 ( http://blog.sarabande.jp/post/46424933556 ) を読んで、派生プロジェクトにどんなものがあるか気になったのでググってみた。

PukiWiki Advance

PukiWiki Plus!

PukiWiki をベースに PukiWiki Plus! が作られ、PukiWiki Plus! をベースに PukiWiki Advance が作られているっぽい。

その他:http://ja.wikipedia.org/wiki/PukiWiki#.E6.B4.BE.E7.94.9F.E7.89.88

PHP で pkcs12 形式の SSL 証明書を pem 形式に変換

ApnsPHP でプッシュ通知するのにサーバ側にPEM形式の証明書が必要。
https://code.google.com/p/apns-php/wiki/CertificateCreation

証明書を更新するたびに openssl コマンドを打つのも面倒なので、PHP プログラム内で作成できるようにした。ついでに秘密鍵パスフレーズもリセットしている。

<?php
// pkcs12 形式の証明書を読込 (source.p12)
$pass = '証明書作成時のパスフレーズ';
$pkcs12File = 'source.p12';
$pkcs12 = file_get_contents($pkcs12File);
$certs = array();
openssl_pkcs12_read($pkcs12, $certs, $pass);

// パスフレーズをリセット
$pkey = null;
$newPass = null;
openssl_pkey_export($certs['pkey'], $pkey, $newPass);

// PEM 形式で保存 (output.pem)
$pemFile = 'output.pem';
file_put_contents($pemFile, $certs['cert'] . $pkey);

vagrant init の第2パラメータでちょっと楽する

久々の Vagrant ネタ。

Vagrantfile に ダウンロード先 URL (box_url) を設定しておくことで、 vagrant up 実行時にベースBOXが無かった場合は BOX を自動的にダウンロードしてくれるので、初回の vagrant box add が省略できて重宝している。

複数人での開発の際、この設定(box_url)は、WEBサーバー上に BOX を配備することと共に必須の設定だと思う。

今までは vagrant init 直後に Vagrantfile を編集して設定を追加していたのだが、いつからか vagrant init の第2パラメータで指定できるようになったようだ。空の状態から2ステップで仮想マシンが起動できるのでちょっと便利になった。

$ vagrant init precise32 http://files.vagrantup.com/precise32.box
$ vagrant up

vagrant 1.0.7 で vagrant init したところ、Vagrantfile に以下の設定が有効になる。

  config.vm.box = "precise32"
  config.vm.box_url = "http://files.vagrantup.com/precise32.box"

CREATE OR REPLACE LANGUAGE をシミュレートする

PostgreSQL で plpgsql を利用するには CREATE LANGUAGE する必要があるが、複数回実行すると2度目からエラーになってしまう。
"CREATE OR REPLACE" 的なことはできないかどうかググったところ、そのものずばりがかかれてあった。

http://wiki.postgresql.org/wiki/CREATE_OR_REPLACE_LANGUAGE

CREATE OR REPLACE FUNCTION make_plpgsql()
RETURNS VOID
LANGUAGE SQL
AS $$
CREATE LANGUAGE plpgsql;
$$;
 
SELECT
    CASE
    WHEN EXISTS(
        SELECT 1
        FROM pg_catalog.pg_language
        WHERE lanname='plpgsql'
    )
    THEN NULL
    ELSE make_plpgsql() END;
 
DROP FUNCTION make_plpgsql();

Chef でクエリを初回のみ実行する方法が分からなかったため調査していたのだが、これで Chef で複数回実行しても大丈夫になるはず?

CakePHP 2.x キャッシュファイルのパーミッション変更

cake コマンド実行するユーザと apache のユーザが異なる場合、キャッシュ周りでパーミッションエラーが発生してしまう。誰でも書込みできるように権限を設定するには、Cache::config() に "mask" というパラメータを追加してやるとよいらしい。
また、設定値は "数値 (例:0666)" でなければならないとのこと。文字列ではダメみたい。

/app/Congfig/core.php
<?php
/**
 * Configure the cache used for general framework caching.  Path information,
 * object listings, and translation cache files are stored with this configuration.
 */
Cache::config('_cake_core_', array(
    'engine' => $engine,
    'prefix' => $prefix . 'cake_core_',
    'path' => CACHE . 'persistent' . DS,
    'serialize' => ($engine === 'File'),
    'duration' => $duration,
    'mask' => 0666
));

/**
 * Configure the cache for model and datasource caches.  This cache configuration
 * is used to store schema descriptions, and table listings in connections.
 */
Cache::config('_cake_model_', array(
    'engine' => $engine,
    'prefix' => $prefix . 'cake_model_',
    'path' => CACHE . 'models' . DS,
    'serialize' => ($engine === 'File'),
    'duration' => $duration,
    'mask' => 0666
));
?>

参考: http://d.hatena.ne.jp/comeonly/20120630/1341026422

CakePHP 2.3.0 上の Migrations プラグインの注意

CakePHP 2.3.0 が正式にリリースしたのだが、 Migrations プラグインの master ブランチでは 2.3.0 は、未対応。公式な解決策としては、develop ブランチを使うといいとのこと。

https://github.com/CakeDC/migrations/issues/107

とりあえず master ブランチ動作させたかったので、AppShell に

<?php
App::uses('ClassRegistry', 'Utility');

の一行を追加して対応してみた。