きりかノート 3冊め

おあそびプログラミング

Array#pack というマホウ

Tim Burks の新作「Cocoa Magic for Gruff Graphs」。なんといってもでき上がりの絵がキレイなので、自分でもやりたくなる(まだやってないけど)。内容としては、NSImage と NSBezierPath でグラフをぐりぐり書くというもの。

そこで NSBezierPath のメソッドで (float *) の引数をとるものがあるので、 OSX::ObjcPtr を拡張までしている。

だけど、単純な配列なら Array#pack を使えば解決してしまう。だいぶ前に ruby-talk あたりで誰かが教えてくれたもの。

 bezier = OSX::NSBezierPath.bezierPath
# some settings..
pattern = [5.0, 2.0].pack('f*')
bezier.setLineDash(pattern, :count, 2, :phaze, 0.0)
bezier.stroke

なんでこんなで ok かというと、 "^f" のエンコーディングRubyCocoa では変換されないので、 pack された文字列がそのままバイト列のデータとしてObjective-C 側に渡される。そのため、ちゃんと動くわけ。OSX::ObjcPtr#unpack(template) があるとうれしいケースがあるかも。

なんだか黒魔術っぽいけど、それで解決するならいいじゃん。とりあえず FAQ あたりに書いておいたほうがいいかな?