gitを使っていて、間違ったファイルをgit addしてしまった場合に、 これをキャンセルする為には、以下のコマンドが使えます。

   1  % git rm --cached <filename>

git rmは、Working Tree (作業コピー)と index からファイルを削除するコマンドですが、 --cachedを指定する事で、 indexからのみファイルを削除する事ができます。

git addはWorking Treeからindexにファイルを追加するコマンドなので、 git rm --cachedは、git addと対をなすコマンドだと言えますね。

posted by Png genki on Fri 17 Oct 2008 at 01:44

Sqlite3を使っている場合に、テーブルが存在するかどうかを確認する為には、 以下のようなSQLを実行すればOkです。

   1  SELECT count(*) FROM sqlite_master
   2    WHERE type='table' AND name=?;

?には、sqlite3_bind_textなどで存在を確認したいテーブルの名前をbindします。

あとは結果をsqlite3_column_intなどで取得すればOkです。

See Also

posted by Png genki on Wed 15 Oct 2008 at 19:07

Xcodeでgdbを使ってObjective-Cのコードをデバッグしているときに、 Objective-Cのメソッドを呼んだ結果が知りたい場合、 以下のようにすれば良いようです。

   1  (gdb) call (int) [@"a" length]
   2  $1 = 1

C関数の形式で以下のように呼び出してもOkです。

   1  (gdb) call (int) objc_msgSend(@"ab", @selector(length))
   2  $2 = 2

ただし、戻り値のサイズや型によっては、objc_msgSend ではなく、objc_msgSend_stretなどを使う必要があります。

posted by Png genki on Mon 13 Oct 2008 at 00:42

時々忘れるのでメモ。

引数の数英語(A)英語(B)
0constant function
1unary functionmonadic function
2binary functiondyadic function
3ternary(trinary) functiontriadic function
4quaternary functiontetoradic function
不定/可変multinary functionvariadic function

5つ以上の場合は、 quinary, senary, septenary, octonary, nonary, denary, undenary, duodenaryなどと続きます。

posted by Png genki on Fri 10 Oct 2008 at 04:10

Objective-Cで、Method構造体からCレベルの関数ポインタを取得する方法のメモです。

以前は、

   1  Method *method = class_getInstanceMethod(class, selector);
   2  IMP imp = method->method_imp;

という感じで取得出来ていたみたいですが、現在はDeprecatedとなっており、 以下のようにする必要があるようです。

   1  IMP imp = method_getImplementation(method);

posted by Png genki on Thu 9 Oct 2008 at 02:31

Objective-Cで、クラスやプロトコルを前方宣言(前方参照とも呼ばれたりします)をする方法のメモです。

クラスの前方宣言

クラスを前方宣言する場合は、@classに続いてクラス名、セミコロンを書きます。

   1  @class Foo;

プロトコルの前方宣言

クラスのときと同様、プロトコル名のあとにセミコロンでOk。

   1  @protocol Foo;

posted by Png genki on Wed 8 Oct 2008 at 16:56

Objective-Cでオブジェクトを初期化する処理は、-init メソッドなどの初期化メソッドで実装されます。 よく見かけるのはこんな例ですね。

   1  - (id)init
   2  {
   3      [super init];
   4      /* initialization code */
   5      return self;
   6  }

しかしながら、基底クラスの初期化処理[super init]の最中に、 メモリアロケーションの失敗などによって正常に初期化が行われなかった場合に備えて、次のようなエラーハンドリングを行った方が良いでしょう。

   1  - (id)init
   2  {
   3      if(self = [super init]){
   4          /* initialization code */
   5      }
   6      return self;
   7  }

この辺の処理はXcodeなどが生成するひな形にも書かれていますね。

さて、ここからが本題ですが、上述の /* initialization code */ の中で初期化が失敗したときは、どうしたら良いでしょうか。 仕様的には、初期化に失敗したら nil を返す必要がありますが、 その際、途中までの段階で確保したリソースを解放する必要があるでしょう。 つまり、[super init]の中で確保されたであろうリソースを解放する必要があります。

   1  - (id)init
   2  {
   3      if(self = [super init]){
   4          /* initialization code */
   5          if(/* initialization failure */){
   6              /* release all resources */
   7              [super dealloc];
   8              return nil;
   9          }
  10      }
  11      return self;
  12  }

ということで、こんな感じに[super dealloc] を呼び出して nil を返します。 ここで、[super release] を呼び出すと、 参照カウンタが0になり、 [self dealloc] が呼び出されてしまうので注意が必要です。 [self dealloc]を呼び出すようにする場合は、上述の /* release all resources */ の中でリソースを解放せずに、[self dealloc] の中で解放するようにする必要があります。 しかし、失敗した初期化処理の中で中途半端に確保したリソースを、 正しく解放する為には、[self init] の内部で解放処理まで行った方が楽な気がします。 あるいは、以下の様に初期化済みのものだけ解放するようなコードを [self dealloc]に書いておくという手もあるかもしれません。

   1  #define RELEASE(x) if(x) [(x) release]
   2  
   3  - (void)dealloc
   4  {
   5      RELEASE(_something);
   6      [super dealloc];
   7  }

こんなコードを見ると、なんだかノスタルジーを感じます。

ちなみに関係ないですが、このブログシステムでは、 Objective-Cのソースコードを以下のような記法でSyntax highlightさせる事ができます。

   1  objective-c>>
   2  /* Objective-C code */
   3  <<objective-c

posted by Png genki on Mon 6 Oct 2008 at 22:09 with 4 comments

久々にRailsプラグインの紹介です。

Plugins - NamedScope

This is not simple hack of named scope like you might find in WillPaginate. This is a fully backported and tested version of NamedScope that will work on rails 1.2.6 or 2.0.4.

Rails-2.0.4およびRails-1.2.6でNamedScopeが使えるようになるようです。

posted by Png genki on Sun 5 Oct 2008 at 07:29
3rd Fri

My .gitconfig

~/.gitconfigをさらしてみます。[user]は省略。

   1  [color]
   2    status = auto
   3    diff = auto
   4  [alias]
   5    co = checkout
   6    ci = commit -a
   7    st = status
   8    up = pull --rebase

こんな感じ。SVNぽい感じで使えるようにサブコマンドのaliasを設定してます。 色づけはautoで。

posted by Png genki on Fri 3 Oct 2008 at 16:20

いろいろ調べた事をブログに書けなくて、 フラストレーションがたまっていたのですが、 ついにソースコードの開示や解説などが解禁されたようですね。

NDA契約更新が完了次第、iPhoneアプリ開発についても ブログに書いていこうと思います。 今まで通りRailsアプリ開発の話も書いていきます。

See Also

posted by Png genki on Fri 3 Oct 2008 at 03:40