ホーム > 軟
軟のアーカイブ
CakePHP 1.2 の Shell から Task のメソッドを呼ぶ方法
- 2012/02/02 17:58
- 軟
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
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
gitosis を最新 (git HEAD) から DEB パッケージへ
- 2011/04/08 10:34
- 軟
家サーバの git リポジトリは,gitosis を git://eagain.net/gitosis.git からもらってきて手でインストールしてたので,家サーバを Debian GNU/Linux 6.0 “squeeze” にアップデートしたときに手で修正するはめになった。
会社のマシンや VM で使ってる設定ファイルも家サーバの git で管理してたので,止まると損害でかいのである。
手動のときはユーザー “git” を作ってこいつで gitosis を実行するかたちだった。
というわけで squeeze 入れて gitosis が無い! てところから。
いつも使ってるユーザーでログインして,gitosis をインストール。
$ sudo apt-get install gitosis
基本的にはファイル全部移すだけ。
でオーナーを gitosis へ。
$ sudo cp -r /home/git/{repositories,.ssh} /srv/gitosis/
$ sudo su - gitosis
gitosis$ ln -s /srv/gitosis/repositories/gitosis-admin.git/gitosis.conf ~/.gitosis.conf
gitosis$ exit
$ sudo chown -R gitosis:gitosis /srv/gitosis
私の場合 ssh の AllowUsers を設定してるので,それも。
--- /etc/ssh/sshd_config.old 2011-04-08 10:32:48.466536612 +0900 +++ /etc/ssh/sshd_config 2011-04-08 10:32:55.387536714 +0900 @@ -77,4 +77,4 @@ UsePAM no AllowUsers kyasuda -AllowUsers git +AllowUsers gitosis
これで sshd を再起動すれば完了。
$ sudo /etc/init.d/ssh restart
手元のリポジトリで origin の URI を変更するのを忘れずに!
Flickr 始めました
Flickr という超有名な写真アップロードサービスがあって,無料でアカウントを作成してこそこそ実験してたりしたのだが,年 $24.95 で容量無制限になったりするというのでバックアップ代わりに契約を 2 年分入れてみた。
まず公開範囲をプライベートにして手元の写真を全部アップロードして,後から公開できる写真をパブリックに変更していけばいいかな。
メモ:D90 で撮った動画はそのままのエンコード (Motion JPEG) は認識してくれないので変換する。Evom で変換する場合は .MOV をターゲットに。なぜか MP4 でも WMV でもダメ。
iTerm.app 上の tmux で起動してる vim とかで C-h が Backspace にならない件
- 2010/02/23 18:35
- 軟
Snow Leopard で iTerm という端末エミュレータ使っていて,tmux という GNU screen の次世代版みたいな端末マルチプレクサを起動しっぱなしにしつつその上で Vim とか動かすと,Ctrl-H やら delete キーやらが Backspace として働かず “^?” が入力されまくってストレスフルであり f**kin’ であるという問題に人類の命運をかけずに対処したというお話しの序章のアブストの触りである。
てゆかこんな遊んでる場合でなく設定ファイルいじってる暇もないのだが今書かないと忘れるので書く。
内臓ぶっちゃけて省略すると tmux 上のときだけ “stty erase "^?"” を実行すればよいという話なんだが,環境変数 TERM が “screen” のときにどうたらこうたらという設定を .zshenv やら .zshrc やらに書き散らしてあったのでついでに if の中に突っ込んでおきました。
おわり。
ホーム > 軟
- BS 機器のアンテナ接続に F 型接栓つかわない男のひとって……/今読: BSデジタル追加チャンネルの放送によるモバイルデータ通信(ULTRA SPEED等)への影響について | ソフトバンクモバイル株式会社 - http://t.co/hG8R90Ec
- 火事多いな。先週頭に降ってからまた乾燥してきたか。
- 古いコードは,あんまりよくないサンプルに影響されてへんな書き方してるところあるんだよな。近場を修正するときに一緒に直しておこう。 $(function() { $(document).ready(function() { }); });
- RT @syuu1228: ΩΩΩ< RT @nakj: VimSHell、つまりVim's Hell ってことだったんだよ。人類は滅亡する
- しごとならんので再起動してアクセス権チェックとかやってみるか
- メモリに余裕作ったんだがなんかもっさりしてるよ Lion さん。
- まさか GPU がいかれたとかないよね,ね。 http://t.co/WgOKR4AK
- 2003 年くらいから,ケータイのメアドをひとに教える時は転送サービスのアドレスを出したはず。転送先を GMail に変えとこう。
- docomo のケータイ,どうせ業者系のしか来ないしと思ってメールチェックを 2 週間ほどサボってたら友人から来てた。すみませんすみません。
- 歯医麻酔用に電動注射器というのがあって,調べてみると注射してるあいだメロディを流せるやつがあったりして面白い。X ファイルのテーマとか入ってないかな。
- 帰ろ
- Python で遊んでたらこんな時間に
- そこらへん OS X の Cocoa フレームワークはよくわかっとるっつーかデフォルトで ^h は deleteBackward.
- Emacs 風キーバインドなのに C-h を Backspace に設定できないエディタはみんなばくはつしろ!
- Web アプリ側でフレームワークに乗ってるとどうもやってることが単純になりがちだけど,Python でクライアント側のスクリプトをオブジェクト指向で書いてると 「あーこれは Visitor パターンに載せよう」 とかなったりして思い出すあのころの楽しさ。そう,設計って楽しい。
- ふと修正に飽きたので今朝おもいついたやつを Python でいじりはじめた。
- vim で set relativenumber するとマクロによってはけっこう遅くなるな。気をつけよう。
- /bin/dash とかまじトラップ。bash じゃねーのかよ!
- あー他のユーザー権限のこと忘れてた。Skipfish 叩く Python スクリプトでも書くか。もうシェルスクリプト書くのつらい。
- 「刺さる」 って聞くようになったの結構最近だよな。2009 年くらいか?






