php_uname() を使ってみたい
よくわかんないけど、人生で一度だけでいいからこの辺の関数を使ってみたいとずっと思ってる。
で、先日 symfony で CSRF 対策をおこなうときに、 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 ------------------------------------------------------------------------
<?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"