CSSフレームワーク

外部プログラムの呼び出し方法いろいろ

PHPで外部プログラムを呼び出すには

  • exec()
  • paththru()
  • popen()
  • proc_open()
  • shell_exec()
  • system()

などの関数を使う。shell_exec() は、「実行演算子 バッククォート (``)」 のエイリアスでもある。popen(), proc_open() は、標準入出力をストリームとして扱う。それ以外は、標準入力は指定できず、結果は戻り値や引数で配列や文字列として返ってくる。

array_map() を使って配列のキー/値に対して処理する

実際には foreach を使えばいいだけの話だが、 array_map(), array_keys(), array_values() の
3つの関数を組み合わせると、配列のキーと要素に対して処理できる。

例:

<?php
$a = array('a' => 'valueA', 'b' => 'valueB');

$result = array_map(function ($key, $value) { return $key . '.' . $value; },
                    array_keys($a), array_values($a));

var_dump($result);

結果:

array(2) {
  [0]=>
  string(8) "a.valueA"
  [1]=>
  string(8) "b.valueB"
}

array_map() 関数だけで出来ないのが残念。

CakePHP 2.3.0-beta を試す

CakePHP 2.3.0 ベータ版がリリースされたとのこと
http://bakery.cakephp.org/articles/lorenzo/2012/10/28/cakephp_2_3_0-beta_released

ちょっとうれしいお知らせとしては、モデルで biginteger をサポートするとのこと。
PostgreSQL で試したところ、まだプライマリーキーとして biginteger は使えないみたい。
ベータ版だからだろうけど、SQL 構文エラーで止まってしまった。

SQLSTATE[42601]: Syntax error: 7 ERROR:  syntax error at or near "serial"
LINE 2:  "id" bigint serial NOT NULL,

CREATE TABLE 時に "bigserial" となってほしいところが "bigint serial" となってしまった。
Postgres.php の buildColumn() を修正する必要がある。とりあえず修正して手元では動くようになった。

$out = str_replace('integer serial', 'serial', $out);

のような記述があったので、その直下に

$out = str_replace('bigint serial', 'bigserial', $out);

という行を追加しておいた。

追記 (2013-12-25)

CakePHP 2.4.4 で修正されました。
http://bakery.cakephp.org/articles/markstory/2013/12/24/cakephp_2_4_4_released

  • Postgres biginteger primary keys now correctly use the bigserial type.

vagrant package の注意点

OS Windows 7 (64bit)
VirtualBox 4.2.2
Ruby 1.9.1
Vagrant 1.0.5

Windows 7 にて vagrant package で作成した BOX をベースに vagrant up すると、 共有フォルダ (v-root) が作成時の古い設定のままになっていて困った。

  1. vagrant halt で VM を一旦停止
  2. GUI ツールで共有フォルダの設定を削除
  3. vagrant package を実行

という手順でやればとりあえずうまく行くようになった。MacOS X 環境では再現しなかったので、 Windows 特有の問題だと思う。