merb-genコマンド用にZshの補完関数を作りました。

   1  _merb-gen () {
   2    compadd `merb-gen | grep '^  *' | awk '{print \$1}' | xargs`
   3  }
   4  
   5  compdef _merb-gen merb-gen

.zshrcなどに記述すれば、 以下のような感じで補完出来ます。

   1  % merb-gen [TAB]
   2  --debug      controller   part
   3  --no-color   core         plugin
   4  -d,          flat         resource
   5  -f,          helper       resource_controller
   6  -h,          layout       session_migration
   7  -p,          mailer       slice
   8  -s,          migration    very_flat
   9  app          model

posted by Png genki on Tue 18 Nov 2008 at 03:05

Merb-1.0がリリースされた事もあり、使ってみる事にしました。 Merbの使い方といえば、 優しい Merb の育て方 という素晴らしいまとめがありますが、 1.0になっていくつか新しい情報が必要になっている所があるので、 ざっくりと手順をまとめてみます。

まずはアプリを生成

アプリケーションの生成には、merb-genコマンドを使います。 これは、Railsで言えばscript/generateに相当します。

   1  % merb-gen app appname

appというのは何を作りたいかを指示するサブコマンドです。

これでひな形は出来上がったので、あとはmerbコマンドでウェブサーバを起動してブラウザでアクセス、といきたい所なのですが、 そうは問屋が卸さないとばかりに罠が待っていました。

Merb1.0 Install & Create First Application & TroubleCommentsAdd Star

と、ここまでが通常の道筋なのですが

昨日は最後のmerbコマンドを実行するとエラーになって起動しませんでした。

どうやら、タイミング悪く addressable というGemの最新バージョン(2.0.0)が、 現時点でのMerbでうまく動かないようです。

ということで、一個前のバージョンにダウングレード。

   1  % sudo gem install addressable -v 1.0.4
   2  % sudo gem uninstall addressable -v 2.0.0

あとは、merbコマンドでサーバを立ち上げて、http://localhost:4000/を見に行くだけです。

Fresh Merb App
Uploaded with plasq's Skitch!

デフォルトではMongrelが使われるようですが、例えばThinを使いたい場合は、

   1  % merb -a thin

で起動出来ます。

posted by Png genki on Tue 18 Nov 2008 at 00:30

iPhoneアプリの開発をしていると、たまに、 Xcodeがプロビジョニングファイルを検出してくれなくて困ることがあります。 あれこれとやってるうちになんとか検出出来るようになるのですが、 これさえやれば100%大丈夫というような処方箋には未だ出会えずにいます。 とりあえず自分がよくやる事をメモしておきます。

  1. Xcodeのプロセスを全て終了して起動し直す
  2. オーガナイザを起動し、問題がありそうなプロビジョニングファイルを削除して入れ直す
  3. ~/Library/MobileDevice/Provisioning\ Profiles/の下を確認し、当該ファイルを削除してみる
  4. Macを再起動する
  5. iTunesも再起動する
  6. プロビジョニングファイルを削除してからiTunesにD&Dしてみる
  7. YourAppName.xcodeproj/project.pbxprojファイルをテキストエディタで開き、プロビジョニングファイルの指定を確認する

何かしらいろいろとやってるうちに問題は解決するのですが、 一度はまると小一時間ぐらい無駄にしてしまうので、 なんとか解決方法を確立したいですね。

posted by Png genki on Sun 16 Nov 2008 at 22:50

と、ふと思った。

命の価値と価格と

その誰か、というのは、実は明らかすぎる。 医師不足と言うけれど 医師不足の中の諦め

「今よりもっと良い周産期医療体制を望みたい」 と誰かが望んでも 「今より少し不便になっても良い」 と誰かが許容しなければ議論は進みません

高齢者たち、である。

posted by Png genki on Sun 16 Nov 2008 at 00:50

Objective-CでMethodのIMPを取得して呼び出す場合に、 正しい関数プロトタイプの関数ポインタにキャストする必要がありますが、 typedefなどを使わずにその場で目的の関数ポインタ型にキャスト する方法を紹介します。

   1  SEL selector = @selector(drawRect:);
   2  Method method = class_getInstanceMethod([UISearchBar class], selector);
   3  IMP drawRect = method_getImplementation(method);
   4  ((void(*)(id, SEL, CGRect))drawRect)(self, selector, rect);

こんな感じにすればOkです。

posted by Png genki on Thu 13 Nov 2008 at 01:15

Objective-Cのコードを書いていると、メモリリークを していないかという所が気になりますが、 scan-buildコマンドを使うと、非常に簡単に静的にプログラムを解析して メモリリークを検出することができます。

   1  % scan-build xcodebuild

プロジェクトのディレクトリに移動して、上記コマンドを実行するだけです。 標準出力と/tmp(あるいはオプションで指定したディレクトリに)レポートが出力されます。

メモリリークはInstrumentsでも検出出来ますが、 これもなかなか便利ですね。

See Also

posted by Png genki on Sun 9 Nov 2008 at 16:47

Objective-CでCSSでよく使うようなABCDEFFFのようなHex encodeされた形式の文字列からUIColorを生成する方法の紹介です。

   1  @interface UIColor (HexEncoding)
   2  + (UIColor*)colorFromString:(NSString*)string;
   3  - (NSString*)encodeToString;
   4  @end
   5  
   6  @implementation UIColor (HexEncoding)
   7  
   8  + (UIColor*)
   9  colorFromString:(NSString*)string
  10  {
  11    NSScanner *scanner = [NSScanner scannerWithString:string];
  12    NSUInteger value;
  13    [scanner scanHexInt:&value];
  14    CGFloat red   = ((value & 0xFF000000) >> 24) / 255.0f;
  15    CGFloat green = ((value & 0x00FF0000) >> 16) / 255.0f;
  16    CGFloat blue  = ((value & 0x0000FF00) >>  8) / 255.0f;
  17    CGFloat alpha = ((value & 0x000000FF) >>  0) / 255.0f;
  18    return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
  19  }
  20  
  21  - (NSString*)encodeToString
  22  {
  23    const CGFloat *components = CGColorGetComponents(self.CGColor);
  24    return [NSString stringWithFormat:@"%02x%02x%02x%02x",
  25            (int)(components[0]*255 + 0.5f),
  26            (int)(components[1]*255 + 0.5f),
  27            (int)(components[2]*255 + 0.5f),
  28            (int)(components[3]*255 + 0.5f)];
  29  }
  30  
  31  @end

わかりやすいように、UIColorにメソッドカテゴリを追加しています。 encodeToStringのほうでは、0.5を足してroundをかけていますが、 状況に応じてfloorにしたりceilにしたりしてください。

また、この例ではComponentsのサイズが4である事を期待しています。 そうではない色を扱うときには問題が発生しますので、ご注意ください。

posted by Png genki on Fri 7 Nov 2008 at 12:20

Objective-Cは、Rubyのようにメソッドの定義を書き換えたりする事ができます。

   1  #import <objc/runtime.h>
   2  
   3  id (*foo_without_bar)(id, SEL);
   4  id foo_with_bar(id self, SEL selector)
   5  {
   6    /* do your work here */
   7    return foo_without_bar(self, selector);
   8  }
   9  
  10  // exchange method implementation
  11  SEL fooSelector = @selector(foo);
  12  Method method = class_getInstanceMethod(class, fooSelector);
  13  *(IMP*)&foo_without_bar =
  14    method_getImplementation(method);
  15  method_setImplementation(method, (IMP)foo_with_bar);

この例では、IMPの定義と同じプロトタイプのメソッドを書き換えてるので不要ですが、IMPの定義と異なるプロトタイプのメソッドを書き換える場合は、 IMPにキャストする必要があります。

また、戻り値が浮動小数型であったり、サイズが大きい構造体を返すメソッドの場合は、上記の例とは異なる方法を使う必要があるので、注意が必要です。(NSInvocationを使う必要があります)

See Also

posted by Png genki on Fri 7 Nov 2008 at 12:00 with 2 comments

UIScrollViewのscrollRectToVisible:animated:の挙動についてのメモです。

これは名前の通り、第一引数で指定したCGRectをViewの可視領域に 持って行くためのメソッドなのですが、 可視領域からはみ出すような大きなCGRectを指定した場合は、CGRectの下端が優先的に表示されるような挙動になるようです。 また、CGRectがemptyの場合は何もおこりません。

上端を優先して表示させたい場合は、 可視領域のCGRectを求めて、あらかじめ可視領域に収まるようにしてから呼び出せばOkです。

ところで、このメソッドはcontentInsetを意識してくれないようなので、 contentInsetを使っている場合は、contentInsetの分だけ広げたrectを指定してあげると良い感じになるようです。

posted by Png genki on Fri 7 Nov 2008 at 11:14

たいしたものではないですが、 iPhoneアプリ開発用に Linked ListとLRUCacheを実装したユーティリティライブラリを公開します。

http://github.com/genki/s21gutils/tree/master

本当はサードパーティフレームワークの形にしたかったんですが、 iPhoneでサポートされてないようなので、ソースとUnitTest用プロジェクトの形で公開します。

ヘッダファイルをコピーとかするのが面倒なので、 Gitでソースを管理してるプロジェクトで使う場合は、 以下のようにGit submoduleとして追加するとメンテナンスが楽かもです。

   1  % git submodule add http://github.com/genki/s21gutils/tree/master Classes/s21gutils

Public Domainです。無償・商用問わず自由に使ってください。 よろしくお願いします。

posted by Png genki on Sun 2 Nov 2008 at 07:55
Contents
Zsh用merb-genコマンド補完関数
Merb-1.0を使う
プロビジョニングファイルをXcodeが検出してくれない場合の対処
産科医療特定財源として「孫税」を設けてはどうだろう
その場で関数ポインタ型にキャストする方法
scan-buildでメモリリークを発見する方法のメモ
Objective-CでABCDEFFFのような文字列をparseする方法
Objective-Cでalias_method_chain
UIScrollView#scrollRectToVisible:animated:の挙動に関するメモ
iPhone用のユーティリティライブラリを公開します
Comments
瀧内元気: MacOS版は以下にあります * [genki/ViMouse](https://githu... '23-1
dsjf: https://gist.github.com/6bf1bf2c3cbb5eb6e7a7 これ... '13-1
瀧内元気: おお、チェックしてみます。thx! '11-12
overisland: Reeder for iPhone もこの UI を実装していますね。 '11-12
瀧内元気: その情報は見たのですが、以下のサイトによると、現在はまた必要になってるっぽいんですよね。 ... '11-12
Services from s21g
twpro(ツイプロ)
Twitterプロフィールを快適検索
地価2009
土地の値段を調べてみよう
MyRestaurant
自分だけのレストラン手帳
Formula
ブログに数式を埋め込める数式コミュニティ