2009-10-28
■[iPhoneSDK] 線や矩形の描画
サンプルはググれば出てくるが説明不足な面が。
UIView#drawRectの中でのみ描画するコードは有効
UIViewにdrawRectというメソッドがあるのだが、この中でUIGraphicsGetCurrentContext()を呼ばないと有効なコンテキストは取得できない。
この説明が書いてないサンプルが多くてはまった。drawRectが自前メソッドかと・・・
明示的なタイミングでの描画
UIViewのdrawRectを呼んでも駄目。これはあくまで描画のタイミングで呼ばれるコールバック。
明示的なタイミングで再描画したいときは、UIView#setNeedsDisplayを呼ぶ。
サンプル
- (void)drawRect:(CGRect)rect {
// 線の頂点
CGPoint pointAry[] =
{
CGPointMake(0.0, 0.0),
CGPointMake(100.0, 100.0),
};
int numPoints = sizeof(pointAry)/sizeof(pointAry[0]);
// コンテキストを得る
CGContextRef context = UIGraphicsGetCurrentContext();
// 線の色
CGContextSetRGBStrokeColor(context, 1.0, 1.0, 1.0, 1.0);
// 線の太さ
CGContextSetLineWidth(context, 10.0);
// 線の頂点を登録
CGContextAddLines(context, pointAry, numPoints);
// 描画
CGContextStrokePath(context);
2009-09-26
■[symfony] タスクを作る
タスクとはコマンドラインから実行できるスクリプト。
railsのscript runnerと似たようなもの。
タスクの生成
symfony generate:task namespace:taskname 例) symfony generate:task db:clear_old_records
lib/taskの下にクラスファイルができる。
configure()の実装
configure()の以下の行はDBの接続先を決定している。
new sfCommandOption ( 'connection', null, sfCommandOption::PARAMETER_REQUIRED, 'The connection name', 'propel' ),
デフォルトではpropelになっているので、database.ymlの定義に従って適切な物にする必要がある。
doctrineの場合は通常'doctrine'と定義してあるはず。
同じ要領で新たなタスクのオプションを追加できる。
new sfCommandOption ( オプション名, null, sfCommandOption::PARAMETER_OPTIONAL|PARAMETER_REQUIRED, オプション説明, デフォルト値 ),
execute()の実装
// initialize the database connection $databaseManager = new sfDatabaseManager($this->configuration); $connection = $databaseManager->getDatabase($options['connection'] ? $options['connection'] : null)->getConnection();
自動生成された最初の行でDB接続をしている。
以降に実行したいコードを実装する。
タスクの実行
symfony namespace:taskname [options] [arguments]
2009-09-18
■[Doctrine] createQueryのエイリアス名指定と参照における注意
$tblEntry = Doctrine::getTable("BlogEntry");
$q = $tblEntry->createQuery("entry")
->select("BlogEntry.*")
->addWhere("BlogEntry.blog_id = ?", $this->id);
return $q;
こんな感じのコードを書いてたら、おかしなSQLを出力していた。
この例ではBlogEntryテーブルをcreateQuery()で"entry"というエイリアスを指定したが、
そのエイリアスを使わずにBlogEntryというテーブルの正式名称を使ってカラム参照している。
このとき、なぜかSQLのFROM句に
FROM blog_entry b, blog_entry b2
のように2つBlogEntryテーブルが指定されていた。
createQueryでエイリアス指定したら、必ずそのエイリアスを使うように気をつけないと、
ひどい目に遭いそう。
■[Doctrine] SoftDeleteとサブクエリーの併用でエラー
SQLSTATE[42S22]: Column not found: 1054 Unknown column 'h2.deleted' in 'where clause'
SoftDeleteを使っているテーブルで、addSelect()メソッドを使ってサブクエリーを使うと、
こんなエラーが出る。
理由は、自動で付加される
AND (h2.deleted = 0 AND h2.deleted IS NULL)
この条件文がサブクエリーの外に付けられてしまうから。
サブクエリーの外でサブクエリー内のテーブルを参照したら、当然カラムが無いとなる。
解決するには、addSelect()の中で
AND (h2.deleted = 0 AND h2.deleted IS NULL)
を明示的に付けてやること。そうするとdeleted条件は自動付加されなくなる。
ちなみに、普通はdeletedカラムは通常"NOT NULL DEFAULT 0"で作られるので
AND h2.deleted = 0
単純にこれだけでも良い。
2009-09-06
■[Doctrine] リレーション先のレコードが無いときリレーションメソッドを呼び出すとオブジェクトが返ってくる件
仮に、groupテーブルにuser_idを持っていて、それがuserテーブルのidであるとき、
schema.xmlでrelationを定義しておけば、
$user = $group->getUser();
こんな感じで$userがゲットできる。
しかしuser_idが存在しないidの場合、falseやnullが返るかと思ったら、
Userオブジェクトが返ってくるので注意。
これが空レコードと判定するには、
$user->exists() == false
とすべし。
以下のように書くとよいかな。
if ($user && $user->exists()) {
// レコードがあるときの処理
} else {
// レコードがないときの処理
}
■[symfony] foreign key制約を勝手につけるのを抑制する
その方法がよくわからんので、めんどいからソース直接編集。
Doctrine/Export/Mysql.phpのcreateTableSql()の以下の部分をコメントアウト
/*
if (isset($options['foreignKeys'])) {
foreach ((array) $options['foreignKeys'] as $k => $definition) {
if (is_array($definition)) {
$sql[] = $this->createForeignKeySql($name, $definition);
}
}
}
*/