« 2006年3月 | トップページ | 2006年5月 »

2006.04.27

Rabbit の Portfile を wiki に登録

しました。rb-rabbit

今回作成した、他の依存パッケージ(rdtool, ruby/gnome(0.14.1), ruby/gettext)も含めたものはこちら。

rabbit-0.4.1-portfiles.tgz (4KB)

せっかちな人のためのバイナリも port mpkg rb-rabbit で作成。gnome 環境など依存パッケージもまるごとはいっていて、/opt/local にインストールされます。

rabbit-0.4.1-ppc.tar.bz2 (MacOS X 10.4/ppc 65.4MB)

rb-rabbit-0.4.1-intel.tar.bz2 (MacOS X 10.4/77.5MB/かくたにさんによるintel版)

それぞれのチェックサム

  • 65a7324a11581ecfe3e9f79557f6bbba rabbit-0.4.1-ppc.tar.bz2
  • 3e5ffd2154893705091ad8cb9b10f751 rb-rabbit-0.4.1-intel.tar.bz2

また、Tiger の DVD から、X11 をインストールするのを忘れないよーに。システムのフォントを利用するためには、 /opt/local/etc/fonts に local.conf ファイルを以下の内容で作成すればよいようです。

 <?xml version="1.0"?>
 <!DOCTYPE fontconfig SYSTEM "fonts.dtd">
 <fontconfig>
  <dir>/Library/Fonts</dir>
  <dir>/Network/Library/Fonts</dir>
  <dir>/System/Library/Fonts</dir>
  <dir>/usr/local/share/fonts</dir>
  <dir>/opt/local/share/fonts</dir>
 </fontconfig>

自分で port でインストールする人は DarwinPortsWikiJP の Tips/LocalPortfile なんかを参考にどうぞ。

(2006.06.01 追記)X11 について

Rabbit が利用する ruby/gnome は、X11上で動作します。ですから、X11 を利用できる状態でないと、 rabbit コマンドは以下のようなエラーで失敗します。

/opt/local/lib/ruby/vendor_ruby/1.8/rabbit/rabbit.rb:29:in `init': failed to initialize gtk+ (RuntimeError)

X11 を利用するためには、

  • /アプリケーション/ユーティリティ/X11.app を起動する
  • 適切な DISPLAY 環境変数

が必要です。

DISPLAY 環境変数は、X11.app 上の xterm では当然定義されていますが、標準のターミナルや iTerm、 JTerminal などを利用している場合は、自分で DISPLAY 環境変数を設定する必要があることに注意してください。

過去の関連記事

|

2006.04.26

NSApplication を使うコードを簡単に #2

あー、こないだのだと NSApplication#terminate: でプロセスが終了しちゃうのか。ブロックの返り値を持たせてるところを検証しようとしたら、そこまで実行されないことに気づいた。stop: でも runloop が完全に止まるわけでもないしなあ。

うーん、どうするのがいいんだろ?

  • あきらめる(ブロックの実行後、必ず終了する)
  • すごいがんばる

前者かなあ。

名前空間に delegate のクラスがわざわざ作成されるのが気持ち悪いような気もするので、無名クラスを使うように変えてみた。

 require 'osx/cocoa'
 
 module OSX
 
   def NSApplication.run_with_temp_app(&proc)
     # create delegate of NSApplication
     delegate = Class.new(OSX::NSObject).alloc.init
     def delegate.applicationDidFinishLaunching(sender)
       begin
         @proc.call
       ensure
         OSX::NSApplication.sharedApplication.terminate(self)
       end
     end
     def delegate.proc=(block)
       @proc = block
     end
     delegate.proc = proc
     # run new app
     app = NSApplication.sharedApplication
     app.setDelegate(delegate)
     app.run
   end
 
 end
 

ホントは NSObject のインスタンスの特異メソッドにしたかったのだけど、RubyCocoa では、ruby で定義したメソッドが呼ばれるのは、ruby で定義したクラスだけなので。

|

2006.04.24

NSTreeController + NSPredicate なサンプル FilteringOutlineEdit

CocoaDev の NSTreeControllerFiltering で紹介されている FilteringOutlineEdit というサンプルコードを見つけた。

先日の Cocoa 勉強会の発表内容と関連しそうなので、そのコードを見てみる。

JSFilteringTreeController という NSTreeController のサブクラスが、このサンプルの要。こないだ「NSBrowser と NSTreeController の微妙なカンケー」で書いたときには、最上位の項目を変更するときに動作が不安定なことがあってあきらめた。そこを見てみると、内容を変更する前に一度 setContent:nil してるな。自分の実装では arrangedObjects だったのだけど、このへんも同じかなあ。

|

2006.04.22

NSApplication を使うコードを簡単に

Cocoa では AppKit の多くの機能が、NSApplication に依存している。こういった処理を、RubyCocoa でのスクリプト(アプリケーションでなく)で動作させるのがめんどい。とくにテストコードを書くときに、こういう状況がけっこうある。

サンプルの HelloWorld.rb にあるように、

  1. delegate 用のオブジェクトを用意
  2. NSApplication.sharedApplication で アプリケーションを生成
  3. 2. のアプリケーションの delegate として 1. をセット
  4. アプリケーション を run で実行
  5. (処理が終わったら)アプリケーションを terminate: で終了

とするのがセオリー。これを簡単に扱う方法を、RubyCocoa 側で用意しておくといいかなと思って書いてみた。

 require 'osx/cocoa'
 
 module OSX
 
   class TempDelegate < OSX::NSObject
     attr_accessor :proc
     attr_reader :result
 
     def initialize
       @result = nil
     end
 
     def applicationDidFinishLaunching(notification)
       begin
         @result = @proc.call
       ensure
         OSX::NSApplication.sharedApplication.terminate(self)
       end
     end
   end
 
   def NSApplication.run_with_new_runloop(&proc)
     delegate = TempDelegate.alloc.init
     delegate.proc = proc
     app = NSApplication.sharedApplication
     app.setDelegate(delegate)
     app.run
     return delegate.result
   end
 
 end

使いかたはこんな感じ。

 OSX::NSApplication.run_with_new_runloop {
   # your code
   #  :
 }

ブロック付きメソッドてば便利。メソッドの名前をもうちょっと検討したら、devel で本体に取り込めるか提案してみよう。こういった細かいところも整備していきたいよな。

|

2006.04.21

テスト環境のディスクイメージをつくる

DarwinPortsWikiJP に「テスト用の chroot 環境をつくる」というのがあったのでトライ。

ディスクイメージ + chroot 環境のよい点は、dmg ファイルのマウント時に shadow ファイルを利用することで、書き込み内容は shadow ファイルにだけ持たせて、いつでもクリーンな環境をすぐ用意できることだ。まだ試してないけど、shadow ファイルを切り替えることで、環境の切り替えも簡単にできるんじゃないかと思う。

shadow ファイルを利用するには、hdid コマンドを利用する。kernelthead.comの「Mac OS X Filesystems」に union などファイルシステムについて、おもしろそうなことがいろいろ書いてあるけど、正直よくわからん。

で、ディスクイメージの作り方の手順は、リンクが切れてたのだけど「Building a Chroot on Mac OS X 10.4 and Opendarwin 6.x HOWTO」のようだ。英語だけど、手順はコマンドなのでほとんどみたまま。いくつかハマった点をメモ。

  • XcodeTools 2.2.1 では、DevSDK パッケージもインストールしたほうがよい
  • chroot 環境を使い終わったら、umount しないとディスクイメージをイジェクトできない

インストールは次のシェルスクリプトでやった。

#!/bin/sh

TARGET_DMG=/Volumes/10.4-hfs

export CM_BUILD=CM_BUILD

echo "###################"
echo "### install OSX ###"
echo "###################"
OSX_PKGS="BaseSystem Essentials BSD X11User"
DVD_PKG_DIR="/Volumes/Mac OS X Install DVD/System/Installation/Packages"
for pkgname in ${OSX_PKGS}
do
   installer -pkg "${DVD_PKG_DIR}/${pkgname}.pkg" -target "${TARGET_DMG}"
done

echo "#########################"
echo "### update OSX 10.4.6 ###"
echo "#########################"
installer -pkg "/Volumes/Mac OS X 10.4.6 Combined Update/MacOSXUpdCombo10.4.6PPC.pkg" -target "${TARGET_DMG}"

echo "########################"
echo "### install DevTools ###"
echo "########################"
DEV_PKGS="DeveloperTools DevSDK gcc3.3 gcc4.0 BSDSDK X11SDK"
DEV_VOL_DIR="/Volumes/Xcode Tools/Packages"
for pkgname in ${DEV_PKGS}
do
   installer -pkg "${DEV_VOL_DIR}/${pkgname}.pkg" -target "${TARGET_DMG}"
done

WindowServer を利用するような GUI アプリケーションの検証も、この chroot 環境でテストできるのかな?だとしたら、かなりうれしいのだけど。

|

ocm_invoke() の可変な数の引数への対応(案)

NSPredicate を扱うためには、NSPredicate.predicateWithFormat: を使うのが常道。だけど、RubyCocoa ではフォーマット文字列のように引数の数が可変であるものの扱いに問題がある。現実問題として、そろそろどうにかしないといけないなあという気持ちになった。

というわけで、以前にもちょっと考えたことのつづき。てか、handle_ruby_method() は Objective-C から Ruby のメソッドの呼び出しなので、前の記述は正しくない。ocm_send() から ocm_invoke() のとこが問題の現場だ(see framework/src/objc/mdl_objwrapper.m)。

ocm_invoke() では、ちゃんと argc が渡されるので、handle_ruby_method() よりは対応は楽だな。たぶん。

で、方針は次にように考えた。原則として前のと同様。

  • argc が NSMethodSignature#numberOfArguments (-2) より大きければ、可変長引数とみなす
  • 可変長の引数は、2つめ以降の型がわからないので、次のように扱う
    • セレクタが "Format:" で終わるとき、Number → int, float, ... とし、その他は id とする
    • そうでないとき、すべて最終引数の型を適用する

これなら、手を動かせばできそうな見通し。

コード見てて気づいたのだけど、ocm_invoke() では、ruby の引数が少ないときに nil を詰めてる。これって例外にしたほうが良くないかな?

|

2006.04.20

Rabbit うごいた

スクリーンショット

フォントはヒラギノかな?

rabbit-theme-manager で ruby/gettext が必要みたいなので、それもつくらなくちゃ。なので、port の公開にはもうちょっと時間かかります。

|

2006.04.19

DarwinPorts の rb-gnome がちゃんとインストールできてない

Rabbit の Portfile を検証してたら、rb-gnome がちゃんとビルドできてないことに気づいた。しかたないので #8458 として DarwinPorts の Bugzilla に報告した。

現象としては、% port install rb-gnome が正常に終了したあと、

 % ruby -e 'require "gtk2"'
 /opt/local/lib/ruby/vendor_ruby/1.8/gtk2.rb:5:in `require': no such file to load
  -- gdk_pixbuf2 (LoadError)
         from /opt/local/lib/ruby/vendor_ruby/1.8/gtk2.rb:5

と require 'gtk2' が失敗する。pixbuf がインストールされてないようだ。構築時のログを詳しくみていると、

 % sudo port -d -v build rb-gnome
  :
  :
 -----
 SUCCEEDED: glib pango atk gtk gconf gnomevfs gtkhtml2 gnome libglade gnomecanvas
  gtkglext
 FAILED: gdkpixbuf libart
 -----
 Done.

おいおい、"FAILED" ってでてるじゃん。 "Done." とかゆうなよ!当然のように、終了ステータスは 0。なんかビルド時のエラーは gcc4 まわりっぽい。

試しに port edit して 0.14.1 にバージョンを上げたところ、問題なくビルドできた。本家のほうで時間がかかるようなら、野良 port つくればいいか。

|

2006.04.17

Cocoa のクラス名に関する傾向と対策

トーフサロンの「Objective-Cにおけるクラス命名パターン」という記事がおもしろい。Cocoa フレームワークにおける、クラス名の傾向とそのパターンの役割を整理したもの。こういうことがわかると、フレームワークの構成を把握したり、自分で設計するときに効いてくるんじゃないかと思う。

ちなみに Apple が出しているドキュメント 「Coding Guidlines for Cocoa」 では、クラス名にはあまりスペースを割いていない。だけど、 "Class and Protocol Names" での、「クラス名と思ってしまいそうなのはダメ」てのは意識したことなかったな。てか、Foundation の プロトコル名のリストを見てもいまいち違いがよくわからない。例に挙げられてる NSLock と NSLocking くらいはなんとなくという程度。英語の感覚がわからないからかな。

それにしても "NSManagedObjectContext" という名前は、今でもどーかと思う。

|

2006.04.16

rdtool の Portfile を書いてみた(続・Rabbit 使いになりたい!)

kouさんのコメントに勇気をもらったので、DarwinPorts の環境を一度捨ててつくり直す、というアタマ使わない方法で再チャレンジ。

環境は次のとおり

  • DarwinPorts 1.2.1 (port sync は 4/14)
  • MacOS X 10.4.6(ppc)
  • XcodeTools 2.2.1

rb-gnome をインストール。gnome-session の configure で、依存しているらしい gnome-desktop がインストールされてなくて失敗。なので、先に gnome-desktop をインストールしてから、再度 rb-gnome をインストールしたらOK。同じような現象が発生した人は、port edit で gnome-session の依存パッケージに、gnome-desktop を追加するのがよいと思う。

というわけで、 ruby/gtk2 の環境は用意できた。意外とあっさり。

Rabbit の前に、rdtool のパッケージがなかったので、まずはそこから攻めることに。自分の環境では、ちゃんとインストールできているようなので、DarwinPortsWiki JPPrivatePortfile/rb-rdtool として登録。

うっかりリビジョンを 1 にしてしまいました。他にもおかしなところがあれば指摘・Portfile の差し替えなどお願いします。Rabbit のパッケージは、まだ作業中。

|

第17回 Cocoa 勉強会に行ってきた

今回は、見学者も含めて20名以上という大所帯に。発表も10本と過去最大に。特におもしろかったのは、log4c++ を Cocoa でラップしたというさえきさんのと、CoreData に2000万件超のデータをつっこんだっていう吉川さんのやつかな。

自分の発表

例によって発表資料とサンプルプログラムは、 Cocoa 勉強会のページに置いときます。

ものすごく要約すると、このスライドになる。

SQL と NSPredicate + コレクション演算子

今回作成したクラスは、それなりに使えるんじゃないかと思ってるんだけど、どうなんだろ?なんかひとつ作ってみるといいかな。

ひさしぶりの発表は、反省点がたくさん。

  • 時間が守れなかった。20 分の予定だったのに 10 分オーバー。スライド 32 枚の時点で気づくべき。
  • 内容が絞れなかった。コントローラクラスなのか、NSPredicate + コレクション演算子の話なのか。
  • サンプルアプリが ZEROLINK で動かない事件

コレクション演算子の存在には、金曜の夜に新しいほうの荻原本を読んでいて気づいた。そこから構成をちょっと考えなおしたりしたのだけど、うまくまとまらず。

次回以降の糧になりますように。

|

2006.04.15

SourceForge.net の Anonymous CVS が更新されてない

rubycocoa-talk で先日の[BUG:37]の件が指摘されてたので、「cvs update してね」と答えるつもりで確認したら、コードが変更前のものになってることに気づいた。コミットし忘れたのか!とかなりあせったのだけど、どうやら3月末の障害の影響で SourceForge の anoymous CVS と CVSWeb に、障害後の変更が反映されてないそうだ(sf.net の Site Status 参照)。

というわけで、SourceForge.net 使ってる人は気をつけたほうがいいかも。

|

2006.04.14

RubyKaigi は 6/10-11 ?

ささださんのところで RubyKaigi に言及されてた。そういや情報見かけないなあと思って、日本 Ruby の会の ML アーカイブをのぞいてみたところ、[ruby:1203]で「6/10〜11になる予定」とのこと。

あぶねー、前の週で予定組むとこだった。

あーでも、その日曜てば日商簿記の試験の日じゃん。ま、11月まで延ばせばいいか。あんまり勉強してないし。

|

2006.04.12

NSBrowser と NSTreeController の微妙なカンケー

今週の Cocoa 勉強会の発表用サンプルプログラムがようやくできた。 iTunes のブラウズ機能(iTMS でもいいけど)を作ってみようというもの。はじめは、 NSTreeController と CoreData で Tiger 全開な実装にするつもりだったのだけど、うまく設計できなかったので NSBrowser の delegate を使うことに。

今回 NSTreeController でうまくいかなかった点は

  • 選択された cell をコントローラのキー・パスで取得できない
  • いちばん左の列の項目数が変化したときに、うまく動作しない

が大きいとこだなあ。 NSManagedObject のサブクラスで NSPredicate を生成するメソッドを定義しておけば、 selection.predicate で選択条件を取得できてらくちん!というモクロミだったのに、あえなく瓦解。

解決方法のわかる人がいたら教えてください。

|

intel Mac READY!

ひ日誌の Intel Mac で RubyCocoa で intel Mac で RubyCocoa (0.4.3d1 universal binary)が動いているらしいとの情報がッ。ひとばしらありがとうございます。

以前にソースからの構築ができたとの報告もあったので、次リリースでは公式に intel Mac ready と言ってもよいかな。

|

2006.04.11

第17回 Cocoa 勉強会の見学者の募集を締め切りました

勉強会のお知らせにも出ているけど、4/15(土)の勉強会が、会場に対して参加者の人数がいっぱいになってしまいました。

4/11 までの受付のぶんで、見学者の募集を締めきらせていただきます。

|

2006.04.10

Rabbit 使いになりたい!

角谷さんの素敵スライドで有名な、ruby と gtk2 でできているプレゼンテーションツール Rabbit 。これを使いたいなあと以前から思っているのだけど、いまだに MacOS X 上に ruby/gnome の環境が構築できない。つーか、gtk2 の時点でダメ。DarwinPorts からのインストール時になんだかエラーになってしまう。

今週の Cocoa 勉強会は、あきらめて Keynote にするかあ。

|

(BUG:37)CVS HEAD だとすべての RubyCocoa アプリケーションが起動しない

やっちまった。定数として扱えるように変更したときに、初期化のあたりをいくつかいじったのだけど、そのために RBApplicationMain() が正しく動かなくなっているという副作用。rb_main.rb がロードされないために、アプリケーションが全く起動しないよ。

定数および関数の OSX モジュールへの追加の処理を RubyCocoa の初期化処理の中で後ろのほうにずらすつもり。すぐに直せるかは試してみないとわからないので、まずはお知らせまで。

(追記)とりあえずのパッチを sf.net の [BUG:37]のトラッカーにアップした。 osx/objc/oc_all.rb のあたりがぐだぐだな気がするので、コミットはそのへんを整理してから。

(追記その2)整理してコミットした。パッチは実際にコミットしたものに差し替え。

|

2006.04.08

自分インストールの ruby でバイナリパッケージの RubyCocoa を使う

rubycocoa-talk で

バイナリパッケージをインストールしたんだけど、% ruby fontnames.rb で "no such file to load" て言われるよ

との質問。ruby のバージョンが 1.8.4 て書いてあるので、自分でインストールした ruby だなということがすぐにわかった。情報あるといいよな。

原因は、次のとおり。RubyCocoa のバイナリパッケージでは、ライブラリおよび拡張ライブラリはシステム標準の /usr/bin/ruby に合わせてインストール場所が設定してある。だけど、自分で最新の ruby をインストールしていたりすると、ライブラリの場所が異なる( /usr/local/lib/ruby など)ために、コマンドラインの ruby からは 'osx/cocoa' の require が失敗するが、アプリケーションは動く、という状態になってしまう。

ソースからビルド してもらうのがいちばん簡単な解決策なのだけど、今回は新しい方法を考えた。

  • ライブラリ類を自分の ruby のライブラリインストール先にコピーする

というもの。 libruby のバージョンが異なるからダメだろうなと思っていたのだけど、試してみたら問題なかったからまあいいやという感じで。

 % sudo cp -R /usr/lib/ruby/site_ruby/1.8/osx \
     `ruby -r rbconfig -e "p Config::CONFIG['sitedir']"`
 % sudo cp /usr/lib/ruby/site_ruby/1.8/powerpc-darwin8.0/rubycocoa.bundle \
     `ruby -r rbconfig -e "p Config::CONFIG['sitearchdir']"`

でも、こんなことをせずに DarwinPorts あたりのパッケージ管理システムにおまかせしてしまうのが、いちばんのオススメ。 RubyCocoa は rb-cocoa という名前で登録されてる。

|

2006.04.07

RubyAEOSA は今ごろどうしてる?

なぜだか rubycocoa-talk に「RubyAEOSA てば、今も開発されてるの?」という質問が来た。両方ふじもとさんの開発したものだけど、なぜこの ML に投げるのだろう?以前も、sf.net のトラッカーになんか質問が登録されてたし。日本語のほうの ML は明らかに RubyAEOSA の名前があがっているのでわかるのだけどさ。

と思ったら、RAA ではダウンロードページが sourceforge の RubyCocoa のとこになってるじゃん。

Automator と RubyCocoa がどうのという箇所もあるのだけど、Automator を使ったことがないのでいまいち想像つかず。来週の勉強会の準備が終わったら、ちょっとやってみようかな。

|

2006.04.06

mt.setPostCategories の謎

ただのグチ。

この日記は、自作の ruby スクリプトで tdiary の wiki スタイルのテキストから内容を生成して、XMLRPC で投稿している。

数日前にカテゴリーも使えるようにしたのだけど、どうにも XMLRPC API の設計の方針がナゾ。カテゴリーを設定するには、mt.setPostCategories を利用することでできる。なので、新しい記事を投稿した後でカテゴリーを設定するという順で処理する。

  1. metaWeblog.newPost # 新しい記事を投稿
  2. mt.setPostCategories # 1.で投稿した記事にカテゴリーを設定

だけどさ、記事のカテゴリーって書いたときにはもう決まってるものじゃないの?ひとつの記事を投稿するのに、なんで2回 RPC を呼ばなければならないのだろう?と思わずにはいられない。(もちろん、カテゴリーを使わなければ1回でよい)

いくつかのサービスでは newPost や editPost のときに、記事内容の属性として categories が指定できるらしいのだけど、最近試した限りではココログではサポートされていないみたい。

|

2006.04.05

RubyCocoa on i386 続報

RubyCocoa on i386のその後。てきとうに想像で作ったパッチで、MacBook Pro 上でソースからビルドできたそうだ。(MLアーカイブ参照)

さっそくコミットしたいところだけど、3/29から sf.net の CVS が利用できない状態になってるのでどうにもならない。パッチつくって、トラッカーにいれておけばいいかな?

(2006.04.05 追記:cvs が復活したのでコミットした。[BUG:36])

|

2006.04.04

いまさらレビュー「MacOS X プログラミング入門 Objective-C」(広文社版)

通称「荻原本」こと、荻原剛志さんの「MacOS X プログラミング入門 Objective-C」がソフトバンククリエイティブから復刊(加筆あり)されるとのこと。4/7発売とあるにもかかわらず、表紙が NOW PRINTING! だったり、Amazon でも目次がなかったりと、なんだか不安なんですけど…

どのくらい内容が変わるのかわかりませんが、広文社のほうを持っているので参考までにレビューを書いておきます。

はじめに

日本語で出版された MacOS X での Cocoa/Objective-C でのプログラミングの書籍としては、もっとも早い時期(2001年)に刊行されたもののひとつです。そのため Cocoa バインディングや CoreData などの近年の技術はカバーされていませんが、Cocoa/Objective-C プログラミングにおけるエバーグリーンな内容が中心なので、現在読んでも内容が古いと感じることはあまりありません。刊行からだいたい5年たっていますが、これから5年後に読んでもそんな感じでしょう。

タイトルには「入門」とありますが、プログラミング経験のない人が「MacOS X には Xcode が付属してるし、ちょっとやってみたいな」と思ったときに1冊めに買う本とするには、読み方を工夫しないと厳しいでしょう。なんせ、全19章の構成で Interface Builder がでてくるのが14章です。AppKit についての説明はかなりあっさりなので、他の書籍やネット上、ADC のサンプル・リファレンスなどで情報をとれる状態でないと、いざ何かをつくろうと思ったときに実現方法の見当もつかないということもありえます。(まあ自分はそのおかげで ADC の英語がそれなり読めるようになったとも言えなくもないですが)

自分の経験や Cocoa 勉強会での雑談、ネット上での評判としても「ある程度 Cocoa プログラミングの経験を経たあとで、あらためて読むと発見があちこちに」というタイプの書籍です。まちがいなく良書なので、ある程度 Cocoa をやるつもりなら買っておいて損はないでしょう。ちょっと高いですけどね。

じゃ、これ以降は目次に沿って内容を紹介していきます。

オブジェクト指向と Objecitve-C 言語(1〜4章)

第1章「オブジェクトに基づくソフトウェアの作成」では、オブジェクト指向とそこで使われる用語について説明されています。1.2の内容はデザインに関するやや抽象的な話題で、ソフトウェア設計やオブジェクト指向になじみの少ない人にはいくらか難しいかもしれません。

第2章「Objective-C のプログラム」では、Objective-C の基本的な構文とファイル分割についての説明がされています。この段階(2.4)で、非公開のメソッド(ヘッダファイルで宣言しない)や、C の関数の混在、static 変数の扱いにまで言及しているあたりが本書らしいと思います。

第3章「継承とクラス」では、クラスの継承やメソッドのオーバーライド、イニシャライザ(initXXX メソッド)など、サブクラスの実装に関するトピックです。self と super の振る舞いに関する例は、なかなか面白いので自分で試してみることをおすすめします。

第4章「クラスと動的結合」では、Objective-C の動的な側面にスポットを当てています。コンパイラによる型チェックや、nil の振る舞い、アクセサの定義など柔軟なプログラムを作るためのポイントについて説明されています。また、クラスオブジェクト(Class 型)やクラスメソッドに関する記述もあり、読み物的に、序盤ではとくに面白い章なのですが、読み飛ばしても問題ありません。4.4.6 の init の返り値の型はなぜ id なのか?だけは読んでおくとよいかもしれません。

Objective-C Cocoa プログラミング基礎(5〜10章)

第5章「メモリ管理とオーナーシップ」では、Objective-C の特徴でもあるリファレンスカウントによるメモリ管理について説明しています。この章は必読です。はじめのうちは retain や autorelease すべきかどうか迷うケースがあると思います。そんなときは、5.4.1 オーナーシップ・ポリシーが指針になります。(実際には、Cocoa倶楽部(仮称)のCocoaのメモリ管理(3)の retain/release/autoreleaseの適用方針 がいちばん参考になります)

第6章「NSObject クラスとランタイムシステム」では、6.1と6.2ではルートクラスである NSObject を題材に、Cocoa のクラス/オブジェクトの一般的な振る舞いについて説明しています。6.3でフレームワークがでてくるのは、ちょっと不自然な気もしますが、章立ての構成上、ここに入れるしかないのでしょうね。

第7章「Foundation フレームワークの重要なクラス」では、mutable/immutable なオブジェクトについて説明した上で、Foundation フレームワークの以下のクラスについて説明しています。

  • 文字列: NSString, NSMutableString
  • データ: NSData, NSMutableData
  • 配列: NSArray, NSMutableArray と NSEnumerator
  • ディクショナリ: NSDictionary, NSMutableDictionary
  • 数値: NSNumber, NSValue

また、この章の最後では、プロパティリスト(plist)についてのあまりに簡単な説明があります。

第8章「例題:カードゲームのシミュレーション」では、トランプのババ抜きを例にObjective-C での設計と実装を行っています。ここでは、設計の比重がわりと高めです。

第9章「カテゴリ」では、Objective-C 言語のひとつの特徴でもあるカテゴリについてです。カテゴリの文法と、その用途である、インターフェイスの整理や既存クラスへのメソッドの追加、オーバーライドについて説明されています。また、いちばん多く使われているであろうプライベートメソッド的な利用についても、その問題点も含めて言及されています。

第10章「抽象クラスとクラスクラスタ」では、設計としての抽象クラスと、Foundation フレームワークにおけるクラスクラスタについて説明しています。この章は、後回しにしても差し支えありません。10.1 抽象クラスは、オブジェクト指向における一般的な話題です。10.2 クラスクラスタは、自分でサブクラスをつくるときになってはじめて意識すればよいと思うので、読みとばしても問題はありません。

AppKit プログラミング(11, 13〜14章)

ここからは AppKit に関する話題です。たぶん。

第11章「プロトコル」、第13章「デリゲートと通知」は AppKit でよく利用されるデリゲート + 非形式プロトコルと、通知(notification)の仕組みについてです。この2つは、AppKit を利用したデスクトップアプリケーションの Cocoa プログラミングでは多用されるテクニックなので、しっかり読んでおきましょう。また、13.3 メッセージの転送で forwardInvocation の説明がありますが、これはほとんど NSProxy でしか使わないので、分散オブジェクトの章を読むときまでほうっておいて良いでしょう。

第14章「例題:簡易画像ビューア」では、Cocoa アプリケーションの基本的な構成とInterface Builder を利用したプログラミングの具体例になります。responder chain については、もっと詳しく書いてほしかったなあと思うところ。

もっとくわしく(12, 15〜18章)

12章ではゾーンとオブジェクトコピー(NSCopying)、15章以降は例外処理、スレッド、分散オブジェクトに関する話題が続きます。説明がかなりていねいなので、他の言語でのこれらの経験がなくてもとくに問題はないでしょう。ここまでくれば、前から順にやるのも、興味のあるものからやっていくのも、とばすのも自由です。

意外と重要な「その他のトピックス」(19章)

最後にその他いろいろといった形になっていますが、19.1 アプリケーションラッパでは NSBundle とバンドルパッケージ、ローカライズについて書いてあります。他の書籍でこれらについて説明しているものを持っていなければ、必ず読んでおきましょう。デスクトップアプリケーションをつくるときには必須の知識です。

他には可変長引数をとるメソッドの書き方(va_start 他)や、アサーションマクロなどについての記述があります。

付録

付録として「Foundation フレームワークの概要」として簡易リファレンスと、「C 言語の復習」として ANSI C に関するちょっとした解説があります。「C は構文が分かるという程度」だった自分には、この付録はかなり役に立ちました。

裏表紙

内容には全然関係ありませんが、当時衝撃だったので。

広文社の他の書籍の広告。表3対向あたりならともかく、裏表紙に24冊も並んでるのは壮観。

(おわり)

|

2006.04.03

RubyCocoa on i386

人柱テスターがついに現れた!Need help to build RubyCocoa from source on Intel

しかも Tim Burks なので、有用な情報がかなり得られるんじゃないかと期待しまくり。

|

2006.04.01

ruby で enum

遅レス。経由、ささださんによる ruby の enum。enum の定義はテキストリテラルにしておいて、それをパースするというやりかたが目からウロコ。以前も自分で似たようなのを実現したいと考えたことがあったのだけど、うまくデザインできなかった。勉強になる。

で、使い道の話。

RubyCocoa で AppKit と Foundation 以外のフレームワークを使おうとするときには、

のどちらかになると思う。後者の ruby コードを och_analyzer3.rb を使って生成できないかなあというのが長年の(いいすぎ)個人的な懸案のひとつなのだ。今は enum はすべての値を書かないといけない(ただの定数なので、あたりまえ)のだけど、これを利用すると元の C ヘッダとほとんど同じように書けるようになる。

|

« 2006年3月 | トップページ | 2006年5月 »