Clotho の偶感録
CakePHP の updateAll() で Boolean 型を update しようとしたらハマったお話し
- 2011/12/10 20:59
- 軟
タイトルどおりなんだけど,CakePHP 1.2.10 の話ね。
以下で true として渡してるところがキモ。
< ?php
$delete_conditions = array(
'Post.id' => $post_ids,
);
$this->updateAll(array('Post.is_deleted' => true), $delete_conditions);
?>
DB で Boolean のカラムなので PHP の Boolean 型を渡すと失敗する。
DboSource::_prepareUpdateFields() の中で,(Boolean)true を str_replace() で置換しようとしてるところがあって,PHP のステキ自動キャストのせいで (Boolean)true -> (Integer)1 -> (String)'1' みたいに変化してるらしくて,最終的に発行される SQL クエリがおかしくなる。
以下のようにすればオッケー。
< ?php
$delete_conditions = array(
'Post.id' => $post_ids,
);
$this->updateAll(array('Post.is_deleted' => 'true'), $delete_conditions);
?>
'true' と文字列で渡すのがキモ。
他のメソッドは PHP の Boolean で渡せるのに。まったくもー。
1.3 系だと直ってるのか? 2.0 が proof されるまで待つつもりなんだけどな。
買った飯盒の端部バリ取り
トランギアのラージメスティンという飯盒を買った。
プレスしただけらしくバリが残っている。
使うのが自分だけなら気にしないのだが,そうもいかないのでダイヤモンドやすりでがしがし処理した。
来週土曜がたのしみ。
CakePHP 1.2.10 を PostgreSQL で使っているときに Fixture で SERIAL 型に INSERT すると SEQUENCE がインクリメントされない
- 2011/06/28 14:03
- 軟
なんでバグチケットみたいなタイトルなんだろう。まいいや。
CakePHP でアプリを作ると,モデルへ新規レコードを保存 (AppModel::save()) するときには id (SERIAL 型とか AUTO_INCREMENT 属性とか)のデータを与えず,DB の自動生成に任せることが多いと思う。
ところが UnitTest の fixture を書くときには,id も固定値でないと想定外の結果になったりして assertion が書けなくなってしまうので,id も与えて INSERT するようにテストデータを定義したい。
ここで問題が発生する。
PostgreSQL の場合,自動で挿入した id を記録しておくために SERIAL 型のレコード毎に SEQUENCE を持って保存しているんだが,SEQUENCE は SERIAL 型の DEFAULT 値に設定されている nextval() が生成した id を使っているため, fixture のようにアプリケーションが id を指定して INSERT してしまうと SEQUENCE を更新する奴が誰もいなくなってしまう,というおはなし。
Cake on MySQL でどうなってるのかは知らん。
というわけで,これに対処するために CakeTestFixture を継承した AppTestFixture でも作って app/tests にでも置いておく。
< ?php
class AppTestFixture extends CakeTestFixture
{
function insert(&$db)
{
$result = parent::insert($db);
if (array_key_exists('id', $this->fields)
&& $this->fields['id']['type'] == 'integer'
&& $this->fields['id']['key'] == 'primary'
) {
$db->fetchAll("SELECT pg_catalog.setval(pg_get_serial_sequence('{$this->table}', 'id')"
. ", (SELECT MAX(id) FROM {$this->table}), true);", false);
}
return $result;
}
}
あとはこれを継承して fixture を書けばおけ。
< ?php
require_once TESTS . 'app_test_fixture.php';
class HogeFixture extends AppTestFixture
{
var $name = 'Hoge';
var $import = array('table' => 'hoges', 'connection' => 'default');
var $fields = array(
0 => array(
'id' => 1,
'foo' => 'bar',
),
1 => '以下略',
);
}
GrowlHelperApp がいつの間にか沈黙している
- 2011/06/24 12:19
- 軟
Mac OS の定番アプリ,Growl 1.2.2 を使っているんだけど,しばらく放っておくと GrowlHelperApp が死んでてポップアップが表示されなくなってしまう。
とりあえずプロセス情報から適当に推測して,思い立ったら GrowlHelperApp を再起動するスクリプトを書いてみた。
適当なところに置いて chmod +x して実行すればおっけー。再起動したら Growl でポップしてお知らせしてくれる。
手元の Git リポジトリで管理してるんだけど,この際だからブログのために gist を使ってみたり。
CakePHP のあるアクションから,他のアクションの HTML 出力を取得したい
- 2011/05/18 23:20
- 軟
CakePHP (1.2.9) で 自分自身に HTTP ソケット通信する方法。
ふつーは Object::requestAction() で取得できるじゃんとか思うんだろうけど,$this->layout が適用されなくて悩み右往左往した,というおはなし。
とあるコントローラのアクションにて,まず URI をつくる。ホストとか入ってない (ex: /posts/view/1) ので付け足す。
App::import('Helper', 'Html');
$html = new HtmlHelper();
$uri = 'http://localhost' . $html->url(array(
'controller' => 'posts',
'action' => 'view',
'id' => $id,
));
ソケット通信も簡単。
でもこれリクエスト投げてサーバのアクセスログに残ったとこまでしか確認してないから注意ね。検証してくれ。
uses('http_socket');
$socket = new HttpSocket();
$cookies = array();
foreach ($_COOKIE as $name => $val) {
$cookies[$name] = array(
'value' => $val,
);
}
$res = $socket->request( array(
'method' => 'GET',
'uri' => $uri,
'cookies' => $cookies,
));
このコードを実験していて,たいへん遅くてやばいと思ったので 「Object::requestAction() で layout を適用する方法」 を調査するのに戻った。
あった。
$posted_html = $this->requestAction(array(
'controller' => 'posts',
'action' => 'view',
'id' => $id,
), array(
'return',
'bare' => 0,
));
'bare' => 0 をつければいけるという情報を英語の Q and A サイトで発見。何という徒労感…… orz
死んだ皮、生きた革
- 2011/04/29 19:39
- 硬
MBT のシューズ買った。
MBT フォロワーであるスケッチャーズのシェイプ・アップス (後ろの黒いの) を Amazon でぽちってたんだが,わたしの筋量だとふつーに安定してしまうので,本家本元が欲しくなったのである。
違うデザインならスケッチャーズも無駄にならずに済むかな,と思って革製を買ったので,使う前に前処理した。
わたしが革をメンテするときは,革用のクリーナーと 「ラナパー」 で終わらせてしまうのでらくちん。MBT は汚れていないのでクリーナーを使わずにラナパーで一拭き。
左側 (右足) のみ処理してみたところ。
どう違うのかわかりにくいほどさりげない艶になるので良い。この革 (ステアハイド) の 「銀」 はそんなにぴかぴか光らない。
ついでに他の革製品もやっておいた。めんどくさがりなので,年に 2 〜 3 回しかやらないのである。一気にやっておかないと忘れてしまう。
カバンの取っ手は汚れやすくて艶が戻りにくい。でも磨きすぎると銀を喪って取り返しが付かなくなる。
暇があるなら毎月ちょっとずつクリーナーを使えばいいんだが,どうせ汚れるものだしそこまでこだわらない。
油脂を喪いかけてたのでラナパーで補給。
革は死んだ細胞でできているので,腐らせないためになめしを行う。細胞内のタンパク質を薬品で処理して架橋させるのだが,これでごわごわになった革を柔らかくするために油で処理する。
革は新陳代謝しないので,この油は自分で補給する必要があるのだ。ラナパーはホホバオイルの他に蜜蝋が含まれているので,表面の保護もできる。
ほかにも小物をいくつかやっつけた。
こうしてメンテすれば革製品は長持ちする。財布は高校生から 15 年弱使っているのだが,革より先に縫製糸がめげてきた。
玄箱 HG (Debian GNU/Linux 4 etch) を (Debian 6 squeeze) へアップデート (メモ)
- 2011/04/21 02:41
- 感
職場のマシンにメモ置きっぱなしが邪魔くさいのでブログに移しておく。
手順にないけど Debian 5 lenny まではアップデート済み。
Debian にふつーに ssh でログインして作業したときのもの。この手順は /etc/fstab の編集を忘れてるので,このまま実行すると玄箱死ぬよ。
あとで HDD 抜いて Linux マシンにつなげて直す予定。
sudo apt-get install fakeroot kernel-package linux-source-2.6 cd ~/src ## make mkimage on u-boot #wget ftp://ftp.denx.de/pub/u-boot/u-boot-1.2.0.tar.bz2 #tar xjvf u-boot-1.2.0.tar.bz2 #cd u-boot-1.2.0 wget ftp://ftp.denx.de/pub/u-boot/u-boot-2011.03.tar.bz2 tar xjf u-boot-2011.03.tar.bz2 cd u-boot-2011.03/ export OBJTREE=`pwd` export SRCTREE=`pwd` export TOPDIR=`pwd` make linkstation_HGLAN_config make sudo dd if=u-boot.bin of=/dev/mtdblock1 bs=1k # cd tools/ # make mkimage # sudo mv /usr/local/bin/mkimage /usr/local/bin/mkimage.old sudo cp -p ./tools/mkimage /usr/local/bin/mkimage-2011.3 sudo ln -s /usr/local/bin/mkimage-2011.3 /usr/local/bin/mkimage sudo dd if=u-boot.bin of=/dev/mtdblock1 bs=1k ## Kernel cd ~/src tar xjf /usr/src/linux-source-2.6.32.tar.bz2 sudo apt-get install -y libncurses5-dev cd linux-source-2.6.32 make ARCH=powerpc linkstation_defconfig cp -p .config .config.orig make menuconfig ## CONFIG_SYSFS_DEPRECATED=n ## CONFIG_SIGNALFD=y ## CONFIG_INOTIFY_USER=y fakeroot make-kpkg clean fakeroot make-kpkg --initrd --revision=KuroboxHG.private.1.0 kernel_image modules_image # fakeroot make uImage # sudo make modules # sudo make modules_install fakeroot scripts/dtc/dtc -f -I dts -O dtb -o /tmp/kuroboxHG.dtb arch/powerpc/boot/dts/kuroboxHG.dts sudo dpkg -i ../linux-image-2.6.32_KuroboxHG.private.1.0_powerpc.deb sudo mv /boot/uImage /boot/uImage.old-20110413 sudo mv /boot/System.map /boot/System.map.old-20110413 sudo cp -p ./arch/powerpc/boot/uImage /boot/ sudo cp -p ./System.map /boot/ sudo cp /tmp/kuroboxHG.dtb /boot/ # Fail! /etc/fstab で hdd のデバイス名を変える! sudo reboot
参考文書
SSD を修復するとネットも繋がるミラクル
- 2011/04/20 09:26
- 軟
というわけで Snow Leopard のインストール DVD を挿入し再起動して,画面がブラックアウトしたあたりから “C” を押しっぱなしにし DVD の OS インストール画面を見た訳よ。
ここからユーティリティメニュー辿って “ディスクユーティリティ” をポチッとな。
でディスク修復をかけたら HFS+ のジャーナルか何かから修復ができたらしく成功したのでついでにもう一度アクセス権修復してから SSD で再起動。
するとだな,ネット (Ethernet) も繋がったんだな。
Mac OS X がおかしくなったときはまずアクセス権を見る。ディスクチェックする。で何が何だかいまいち判らないが直ってしまう。イミフ。
ちなみに他の Linux 触っててシステムのファイルアクセス権が勝手に変わってるとこなんか見たことない。イミフ。
これで直らなかったら,Mac のハードウェアに載ってる PRAM や SMC をクリアすると直ることもある。PRAM や SMC は PC で言うと BIOS の中身保存してる CMOS みたいなもん。PC で CMOS クリアが必要な障害なんて遭ったことない。イミフ。
まー繋がったから良しとしよう。
SSD にエラーががが
- 04:15
- 軟
MacBook Pro (Mid 2009) の Ethernet 接続がおかしい。
ケーブルは刺さってるのに “ケーブル未接続” とかなってる。おかしい。
というわけで Disk Utility.app を立ち上げて “ディスクのアクセス権を修復” してみたはいいものの直らない。
では “ディスクの検証” でもしてみますかね……というところでこれだよ。
256GB の SSD は Apple TS256A ってやつで,たぶん東芝製。逝ってしもたんか……?
とりあえず OS の DVD で起動してチェックしてみるか orzorz
- 野菜食べて SAN 値削られたから放射脳になるのか。業深きものどもだな。
- 野菜の減 SAN 値表示
- 『モケケピロピロ』 はけっこう膾炙してるんだな。『SAN 値』 とかもあちこちで通じるしなー。
- バージョン管理の概念も先カンブリア紀だったんだが,最近は若手主導で Mercurial が流行りつつあるらしい。頑張って欲しい。リポジトリにはビルドの中間生成物もいれちゃダメだよ。
- 内仕は 「ソースに書いてあります」と言い張って Doxygen の生成物を提出した。あれが通ったのでそんなにひどい上司ではなかったなあと思っている。ただガラパゴスだっただけで。
- 前の会社で外部仕様書をパワポで書かされたのがトラウマ。
- Keynote でプレゼン作ると,見せる内容よりノートの方が書き込み多くなる。と思ったけどパワポでも同じ感じだな。
- そういえば鳥のさえずりをマイクで録って鳥の名前の候補を挙げるアプリ入れてた。まー,あの場では出さなかったけど。
- (いまのは酒精の精霊が囁いたいたずらです)
- All your basin are below to ass.
- Athlon 64 X2 5000+ Black Edition を ¥0 + 着払いで引き取ってくれる人とかいるかしら。あと GeForce 8800GT を ¥1,000 + 着払いくらいで。
- 明日はぶらぶらできる日だっけか。使う予定ない PC パーツを捨てるとかなんとかするか。あと Objective-C やる。
- 地元にランドマークがあんまなくて侘しいという千葉県人に,じゃあ作りなよと言ったんだがいつのまにか了法寺の話題になっていた。彼が地元に身を捧げて出家する日を心待ちにしている。
- 勉強会。LT 10 分の予定が,スクリプトに書いてないことまで膨らましたせいで 13 分になってしまった。思っていたような反応が返ってきたのでよし。みんなで発明済みの車輪つかって楽に生きようよ。
- しかし Cent6 はデフォルトで起動するデーモンがだいぶ減ったな。Cent5 は VM にインストールしたのに apmd とか bluetooth とか isdn とか起動しててぐんにょりしながら off にしたもんだが。
- おもむろに勉強会の発表内容をいま勉強している
- あれ? これ vim じゃね? と思って見たら vim 7.2.411 だった。"vi" って打ったら vim 起動するのに "vim" が command not found ってどういうことだよ……ふつー vim いれといて vi はシンボリックリンクとかするだろ常考。
- ssh は標準で入ってるのに vim は入ってないのか
- W3C 原理主義者はよくいるけどパッケージマネージャ原理主義者は寡聞にして知らない。apt 原理主義とかもっと流行ってくれ。Windows にも apt を! みたいな。
- Linux にアプリ入れるときは、安易に make && make install させるんでなくてパッケージ管理システム上で完結すべきだと教えるページが増えて欲しい。私家版パッケージ作る方法教えた方がもっとコミュニティが活性化すると思うよ?


























