Hatena::ブログ(Diary)

はらぐろブログラマン このページをアンテナに追加 RSSフィード

脱オタクファッションガイド

2010-04-12

[] ステータスバーに通信中のぐるぐる表示

UIApplication* app = [UIApplication sharedApplication]; 
app.networkActivityIndicatorVisible = YES;

2009-10-28

[] 線や矩形の描画

サンプルはググれば出てくるが説明不足な面が。

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

[] タスクを作る

タスクとはコマンドラインから実行できるスクリプト。

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

[] 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でエイリアス指定したら、必ずそのエイリアスを使うように気をつけないと、

ひどい目に遭いそう。

[] 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

[] リレーション先のレコードが無いときリレーションメソッドを呼び出すとオブジェクトが返ってくる件

仮に、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 {
  // レコードがないときの処理
}

[] 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);
                }
            }
        }
    */