豚めし豚汁セット

健康診断で異常が見つかって何かと思いきや肥満だったわけで。
どうも「なんとかcho」とかいうやつ(悪玉コレステロール)が悪さしているようなので食生活の徹底見直しを図ることに。


で、初回から豚めし。しかもご丁寧に豚汁と生卵まで。

言い訳をすると、「ご飯単品+味噌汁+焼き魚+納豆」というメニューを考えていたら焼き魚が赤羽店になく、硬直してたら次の客がやってきてしまい、テンパって一番左端のボタンを押したということで。

まあ明日から頑張ればいいよね。

php_uname() を使ってみたい

よくわかんないけど、人生で一度だけでいいからこの辺の関数を使ってみたいとずっと思ってる。

  • php_uname()
  • phpcredits()
  • php_logo_guid()
  • zend_logo_guid()

で、先日 symfonyCSRF 対策をおこなうときに、 SALT とか何にするよ? ってなったときが絶好のチャンスだった。

俺1「普通に aaaaaaaaaa とかでよくね?」
俺2「かっこわるすぎじゃね?」
俺3「俺の名前入れようぜ、クレジット的に」
俺4「てか設定ファイルSVNで公開されてるんだし、固定の文字列入れてたんじゃ SALT のメリット減るんじゃね」
俺5「rand() とか?」
俺6「ランダムに生成しちゃだめに決まってんだろ」

で、すかさず俺が、

俺7「php_uname() で取得できる実行中のOSの情報とか使えばよくね?」
俺たち「SO RE DA!」

ということでついに php_uname() を使う日が来たわけですよ。php_uname() デビューとか言っちゃって、近所の php_uname() に挨拶して回ったりとか、幼なじみの php_uname() と鬼ごっこしたりとか、もう夢が広がりんぐ。

で、そこで空気の読めない俺が、

俺8「普通に filemtime() とかで設定ファイルの最終更新日時取得して使えば予測不可能でユニークでほぼ固定された値になるんじゃね?」
俺たち「……」

さて今日はベータ版リリース日です。

PHPのオブジェクトへの変換を試してみた

PHP の変数って型キャストをすることでオブジェクトに変換できるのは知ってたんだけど、実際どの型がどうなるっていうのは把握してなかったので、ちょっと試してみた。

結論から言うと、

  • いずれも stdClass のインスタンスとなる
  • スカラー変数(bool, string, int, float) は scalar というプロパティに値がそのまま代入される
  • null と添字配列は空のインスタンスとなる
  • 連想配列は、キーがプロパティ名、値がプロパティの値になる

ということに。添字配列がかなり意外だった。

サンプルコードは以下。

 <?php
 $bool = false;
 $int = 10;
 $float = 4.23;
 $string = 'ebi';
 $null = null;
 $indexedArray = array('ebi', 'kani', 'sasori', 'zarigani');
 $associativeArray = array('o-hira' => 'teriyaki', 'ogawa' => 'balibali', 'ebihara' => 'co3k');

 Reflection::export(new ReflectionObject((object)$bool));
 echo "---------\n"; 
 Reflection::export(new ReflectionObject((object)$int));
 echo "---------\n";
 Reflection::export(new ReflectionObject((object)$float));
 echo "---------\n";
 Reflection::export(new ReflectionObject((object)$string));
 echo "---------\n";
 Reflection::export(new ReflectionObject((object)$null));
 echo "---------\n";
 Reflection::export(new ReflectionObject((object)$indexedArray));
 echo "---------\n";
 Reflection::export(new ReflectionObject((object)$associativeArray));
bool, int, float, string の結果
Object of class [ <internal> class stdClass ] {

  - Constants [0] {
  }

  - Static properties [0] {
  }

  - Static methods [0] {
  }

  - Properties [0] {
  }

  - Dynamic properties [1] {
    Property [ <dynamic> public $scalar ]
  }

  - Methods [0] {
  }
}
null, 添字配列 の結果
---------
Object of class [ <internal> class stdClass ] {

  - Constants [0] {
  }

  - Static properties [0] {
  }

  - Static methods [0] {
  }

  - Properties [0] {
  }

  - Dynamic properties [0] {
  }

  - Methods [0] {
  }
}
連想配列の結果
Object of class [ <internal> class stdClass ] {

  - Constants [0] {
  }

  - Static properties [0] {
  }

  - Static methods [0] {
  }

  - Properties [0] {
  }

  - Dynamic properties [3] {
    Property [ <dynamic> public $o-hira ]
    Property [ <dynamic> public $ogawa ]
    Property [ <dynamic> public $ebihara ]
  }

  - Methods [0] {
  }
}

Swift Mailer4 のレポジトリに LICENSE.GPL が

symfony 推薦しまくりな一方、日本語圏ではあまり評判のよろしくない Swift Mailer ですが、どうも Swift Mailer のライセンスが GPL になりそうな気配。

Swift Mailer3 を手元で色々日本語圏向けに修正してパッチ送ろうとしてサイト見てみたら、どうもいまリリースされている 3.3.3 で 3 系の開発を終了するようで、じゃあ 4 系はどうなのというところで 4 月時点で 95% 完成しているとのことだったのですがあまり動きが見えず、うーんまあとりあえず使ってみるとかと思ったら見事にハマり、適当にソースコードを追っていたら発見した次第。

まあ普通の人には関係ないかもしれないけど、ちょっと自分はGPLだとかなり都合が悪いというか、斬らざるを得ないというか。。。

ああもう完全に萎えたぞどうすりゃいいんだ。

symfony 1.2 における Propel の Behavior のフックポイントまとめ(たぶん)

自分の手元で生成されたモデルクラスを基にまとめてみる。あくまで自分用なので環境によっては違ったりするかもね。

BaseObject クラス

対象メソッド フック名 備考
delete :delete:pre delete() の冒頭で呼ばれる。falseを返すと以降の処理をおこなわない。
delete :delete:post delete() の末尾で呼ばれる。
save :save:pre save() の冒頭で呼ばれる。整数型の結果を返すと affectedRows であると見なし、その結果を関数の結果として返却した上で、以降の処理をおこなわない。
save :save:post save() の末尾で呼ばれる。
__call :(任意のメソッド名) マジックメソッド __call の冒頭で呼ばれる。コールされたメソッド名に基づいた名称のフックが登録されていればそのメソッドを実行する。登録されていない場合はsfExceptionをthrowする。

Base**Peerクラス

対象メソッド フック名 備考
doCount Peer:doCount:doCount doCount() の冒頭で呼ばれる。
doSelectStmt Peer:doSelectStmt:doSelectStmt doSelectStmt() の冒頭で呼ばれる。
doInsert Peer:doInsert:pre doInsert() の冒頭で呼ばれる。falseを返すと以降の処理をおこなわない。
doInsert Peer:doInsert:post doInsert() の末尾で呼ばれる。
doUpdate Peer:doUpdate:pre doUpdate() の冒頭で呼ばれる。falseを返すと以降の処理をおこなわない。
doUpdate Peer:doUpdate:post doUpdate() の末尾で呼ばれる。
doSelectJoin** Peer:doSelectJoin:doSelectJoin doSelectJoin**() の冒頭で呼ばれる。
doSelectJoinAll Peer:doSelectJoinAll:doSelectJoinAll doSelectJoinAll() の冒頭で呼ばれる。
doCountJoin** Peer:doCount:doCount doCountJoin**() の冒頭で呼ばれる。doCountのフックと同じ。
doSelectJoinAllExcept** Peer:doSelectJoinAllExcept :doSelectJoinAllExcept doSelectJoinAllExcept**() の冒頭で呼ばれる

svn log の結果を各エントリ1行で出すスクリプト

svn log って下みたいな感じで出力されるけど、こうやって複数行で出されると grep とか sed とかしにくいのよね。

------------------------------------------------------------------------
r9547 | ebihara | 2008-12-12 16:40:57 +0900 (金, 12 12 2008) | 2 lines

#3211:added no_image.gif

------------------------------------------------------------------------

ということでこいつを1行で出すPHPスクリプトをつくった。

<?php
$contents = file_get_contents('php://stdin');
$xml = simplexml_load_string($contents);

foreach ($xml->logentry as $entry)
{
    $attributes = $entry->attributes();
    echo 'r' . trim((string)$attributes['revision']) . ' : ' . trim((string)$entry->msg) . PHP_EOL;
}

以下みたいに使うよ。

svn log --xml | php ~/Documents/misc/svnLogFormatter.php | grep "#3211"