« 2006年4月 | トップページ | 2006年6月 »

2006.05.31

Xcode にモノ申ス by rentzsch.com

rentzsch.com の最近のエントリで "King of the Xcode" というのがある。Xcode の開発チームに送ったリクエストの内容(だと思う)なんだけど、なかなか興味深い。

特にはじめの二つ、「ZeroLink の初期値は無効にすべき」「NSZombieEnabled の初期値は YES にすべき」というのは全く同意。

ZeroLink は、高速化のメリットよりも、副作用が大きすぎる。まだ、利用者の確かな理解ってのを要求する技術なんじゃないかと感じる。

NSZombieEnabled は dealloc されたオブジェクトが _NSZombie というクラスになり、このオブジェクトへのメッセージ送信は例外を発生させる。これは、Cocoa プログラミングでよく発生するバグのひとつである「retainが足りない/releaseしすぎ」の問題を発見するのにとても役に立つ。詳しくは TN2124 "Mac OS X Debugging Magic" 参照のこと。

「ユニットテストを簡単に」で挙げられている二つの記事は、まだ読んでいないので、なにも言えず。読んでみておもしろかったら、あとでなにか書くかも。

それはそれとして、タイトルの意味がよくわからん。なんか慣用句があるのかな?

|

2006.05.30

Apple による NSURLProtocol のサブクラスのサンプル

最近の webkitsdk-dev の投稿(まだアーカイブがない)経由で、SpecialPictureProtocol という、カスタムな URL Protocol のサンプルが出ていることを知る。

ぱっと見でわかりにくいので、ちょっと説明。

ウィンドウの赤い文字は、画像で、このサンプル中で定義した special という scheme を持つプロトコルだ。下のほうは、 JavaScript でテキストフィールドに文字が入力されるたびに新しい URL でリロードしている。これは本当に単純な例なので、キャッシュや認証を利用したときの動作はよくわからないよな。

ずいぶん前の Cocoa 勉強会のときに書いたものだけど、「URL Loading Systemを拡張する」 が参考になるかも。という、宣伝。

|

2006.05.29

ちょっと落ち着いたかも

ここのとこほとんど活動してなかったんだけど、ようやく時間とれるようになってきた。RubyCocoa 関係の未読メールがすげーたまってる。しばしおまちください。

今週の Cocoa 勉強会の発表も準備しなくちゃ!と思いながら、Rabbit のテーマをいじっている間に時は過ぎてゆく…

|

2006.05.26

RubyCocoa を Xcode 2.3 で構築してみた

帰ってきたらさすがにダウンロードが終わっていたので、0.4.2 と CVS HEAD をビルドしてテストコードを試してみた。とくに問題なし。

clean で tests/objc_test.bundle が削除されないのは良くないかも。

|

2006.05.21

今日の SourceForge.net

cvs update したら

 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
 @    WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!     @
 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
 IT IS POSSIBLE THAT SOMEONE IS DOING SOMETHING NASTY!
 Someone could be eavesdropping on you right now (man-in-the-middle attack)!

と言われた。証明書更新したとか?不安なのでとりあえず更新はあきらめて放置。

(追記)SourceForge のドキュメント "SSH Host Key Fingerprints" に fingerprint があったので、確認して known_hosts を更新した。

|

2006.05.19

メモ: RubyCocoa でのカテゴリやプロトコルのとりまわし

rubycocoa-talk への返答を書いている間に思いついたことのメモ。

ML に投げたように、addRubyMethod:withType: を利用すれば解決可能な問題ではあるけれど、

  • メソッドひとつずつについて書く必要がある
  • 型情報を自分でつくらないといけない

というあたりがコード書く際のネックになりそう。メソッド名や型情報をまちがえたらアウトなのだ。そういうのはニンゲンには向いていない。

Objectice-C のランタイムは、カテゴリや非定型プロトコルとして、セレクタや型の情報を持っているのだから、それを利用すれば簡単に処理できるんじゃないかと考えた。

こんなでどうだろう?

  • プロトコルおよびカテゴリのクラスをつくる OSX::OCProtocol, OSX::OCCategory
  • 個々のプロトコルやカテゴリは上記クラスのインスタンス
  • これらを DummyProtocolHandler やカスタムクラスの型情報として登録できる

雰囲気としてこんな動作かな。メソッド名はてきとう。

 OSX::OCProtocol.import :SomeProtocol # => define OSX::OCProtocol::SomeProtocol
 
 class MyClass < OSX::NSObject
   
   ns_confirm OSX::OCProtocol::SomeProtocol # allow informal protocol
   
   # automatically invoke addRubyMethod:withType: via method_added
   # when the name of method matches any method of the protocol 
   def sel_msg(a, b)
   end
   
 end
 cat_delegate = SomeClass.category[catname]
 OSX.ns_handle_signature(cat_delegate) # add selector/signature to DummyProtocolHandler

後者についても、本来なら NSObject クラスに ns_confirm すれば意味的には同じになるはずなんだけど、現在の RubyCocoa の実装では継承関係がないから、そうもいかず。

考えてみると、セレクタと型情報しか持たないなら、ただの Hash でもよさそう。登録操作に与えるものとして Hash を使ってもいいかも。もし実装されるとしてもだいぶ先だけどね。

|

2006.05.18

alloc/init まわりの修正の新しいパッチ

を読んだ。autorelease されてるオブジェクトは、RubyCocoa 的に ruby サイドのオーナーシップが必要だろうということで retain する、というもの。

今までの「ruby での参照が発生したら、 ruby 用の retain を必ず発生させる」というポリシーとは異なる。ruby 側に渡ってきたときに autorelease されてなくって、ruby で参照され続けている(たとえばインスタンス変数に代入とか)状態で Objective-C サイドよりも生存期間が長くなってしまうと、まだ ruby で使っているはずなのに解放されてしまうということが起きるように思う。自分の誤読だといいんだけど。

ただ、Objective-C の作法にしたがって作ってあるものならば、そういう状況は起こらないはず。外部に渡すオブジェクトは、autorelease するか copy するから。どうしてもマズければ、自分で retain すればよい。release もしないといけないけどね。

テストコ−ドを書いて走らせたら、ひとつ SEGV が起きるケースがあるのでそこは調べないといけない。

このパッチには、ほかにもセレクタの扱いとか、いくつかの改善がはいってる。そっちはとくに異存なし。

|

2006.05.16

RubyCocoa 今日のコミット

というわけで Laurent のパッチとそのテストコードをコミット。やっぱり allocWithZone: のときに問題があるっぽいけど、それはあとで。

(追記)あー、新しいパッチがきてた。メールが "Apple" フォルダ(ADC の案内やeNews を入れてるとこ)に振り分けられてて見落としてた。それはそれとして、これは @try/@catch 使ってるから、 10.2 でコンパイルできなくなるけどどうなんだろ?

|

NSView の警告関連のテストを書いた

意外にもあっさり書けた。[rubycocoa-devel:253]いちおう今の CVS HEAD での fail が予想どおりであることも確認しといた。

  1. ruby コード中で Ruby で定義したサブクラスのオブジェクト
  2. ruby コード中で Cocoa のクラスのオブジェクト
  3. Objective-C コード中で Ruby で定義したサブクラスのオブジェクト
  4. 3. を ruby 側に渡すときに ruby への retain が実施される

というパターンについて検証すればよいはず。考えてみれば、Objective-C 内で Cocoa なオブジェクトのテストなんかやる意味ないんだよね。Objective-C ランタイム自身の検証をここでしたって仕方ない。それは Apple の仕事だよな。

はじめは fail のテストケースが1つあってかなりあせったけど、テストのほうにかんちがいがあったというオチだった。devel で異論がでなければ、 数日中に CVS HEAD にコミットするつもり。

|

2006.05.15

NSView の警告へのパッチのテスト方針

CVS も復活したので、いいかげんコミットしないとね。とりあえず動かしてみた感じでは問題なさそう。テストコード書いて、それで確認したら ok にしよう。

前にも書いたような気がするけど、

  • メッセージ:alloc/init/他 の3種類
  • クラス:Cocoa/Rubyで定義したサブクラス の2種類
  • retainCount を検証するコンテキスト:Objective-C内/Rubyコード内 の2種類

を確認すればばっちりだと思う。まあ、ちょっとめんどうなだけで大変ではない。はず。

|

2006.05.13

Ruby-GetText-Package の Portfile を更新

DarwinPortsWikiJP の Portfile を1.5.0にしたよ。

ruby.setup の rubyforge:nnnn の数字も書き換える必要があるのか。なんか納得いかないなあ。

|

SourceForge.net の開発者 CVS が復活した

らしい。from mputの日記

というわけで、私と Jonathan にそのメールを転送してくれるとうれしいです>ふじもとさん。今はばりばりコミットできる状態じゃないんで、そんなには急ぎませんが。

|

2006.05.09

Inside TextEdit #1 - まずは README から

「あなたがMacを使うべき10の理由」で TextEdit についての言及があって興味を持ったので、久しぶりにコードをながめてみよう。通常であれば、 /Developer/Examples/AppKit/TextEdit/ にインストールされている。

「Document base Application で ドキュメントウィンドウに NSTextView 貼ればできるんじゃないの?」と思ってる人もいるかもしれないけれど、それがそうでもないのだ。AppleScript に対応させたり、印刷の制御したり。なによりも、NSDocument を使っていない。NSDocumentController は使ってるから、Document base のとそんなに変わらなくもあるのだけど。

コ−ドにはいる前に、README.rtf を見ておく。けっこうていねいに書いてあって、OS のバージョンが変化したときに Cocoa にどんな機能が追加されたかもわかったりしておもしろい。

「Changes in TextEdit 1.4 (Tiger)」で、いくつか目をひいた点としては、

  • Spotlight 検索のためのドキュメントプロパティを追加したよ
  • WordML, Safari WebArchive 形式での保存ができるよ
  • 「編集」メニューに「改行」「段落区切り」「改ページ」の挿入を追加したよ。改行と段落区切りは区別されてて、 Return キーの入力は段落区切りになるよ。
  • Cocoa のテキストシステムが変わったから、複数選択や矩形選択ができるようになったよ

最後のはぜんぜん知らなかった。NSTextView レベルでそうなってるので、CotEditor や JTerminal でもできる。複数選択は Command-ドラッグで、矩形選択は、Option-ドラッグだ。

今日はここまで。本格的なコードについては(たぶん)次回以降に。

|

2006.05.08

第18回 Cocoa 勉強会の日程

会長のところでも告知されてるけど、とりあえず日程が6/3(土)に決まりました。発表内容とかは、まだ全然決まっていません。

|

2006.05.06

NSView の警告へのパッチ

rubycocoa-talk にパッチが投稿された "PATCH: fix retain-before-init problem"。「なんてマニアックなパッチを」と思ったら、Apple の中の人だった。

修正内容としてはそう複雑でもなくて、

  • Ruby 側で retain したかどうかのフラグを持つ
  • メッセージが alloc 以外のとき、retain されていなければ、retain する

ということ。基本的には、以前 ML で議論した方針とおんなじ。予想してたより、コードの変更量は少ないな。あと autorelease pool の位置を変更したりしてるんだけど、それの意図はよくわからず。

とりあえずざっと見た感じでは、疑問点はひとつだけ。

  • allocWithZone: のときも alloc と同様に処理する必要があるのでは?

まずはテストコード書いて、動作検証しますか。

|

RubyCocoa-0.4.3d2 リリース

anonymous CVS が復旧しなそうなので、とりあえずちゃんと動くバージョンとして今のスナップショットを developer release としてリリース。

詳しくは [rubycocoa:0338] あたりをどーぞ。

|

2006.05.02

今日のコミット

暑くて寝られないので、イキオイで NSApplication.run_with_temp_app をコミット。終了するかどうかの引数を追加してみた。

|

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 あたりに書いておいたほうがいいかな?

|

2006.05.01

SF.net の Anonymous CVS はまだ死んでた

rubycocoa-talk のパッチを「なんか見たな〜」と思ったら、もう修正済みのだった。anonymous CVS がまだ3/30から更新されてないようだ。

今の anonymous CVS のコードは致命的なバグがあるんだよね。仕方ないから、0.4.3d2 を出しておくかな。

|

« 2006年4月 | トップページ | 2006年6月 »