4月2008

簡易コンストラクタの注意点

Cocoaでよく使う、一時的なオブジェクトを返す簡易コンストラクタを作る際には注意が必要です。

+ (id)className
{
	return [[[self alloc] init] autorelease];
}

このようにしていれば問題はありませんが、クラス名でalloc,init,autoreleaseをすると、このクラスを継承したときに問題が生じます。

+ (id)className
{
	return [[[ClassName alloc] init] autorelease];
}

このクラスを継承したサブクラスでclassNameを呼び出すと、当然継承先のクラスではなく、継承元のインスタンスが返ってきます。ClassNameで初期化しているのであたりまえです。

最初の例のようにselfにallocメッセージを送るの良いやり方ですが、クラスメソッドなのにselfが使えることに疑問を持つ方もいるでしょう。詳しくはObjective-C 2.0プログラミング言語に載っていると思います。(確認はしてません。)

または、このブログのサイドバーで紹介しているObjective-C Mac OS Xプログラミングに解説されています。

OpenGLやろうかな

ちょっとOpenGLに興味がわいてきたのでドキュメントを眺めています。

OpenGL Programming Guide for Mac OS X

5月くらいまでペース落ちます

4月から新しい環境になり、生活ペースが大幅に変わったので、しばらくブログの更新が安定しなさそうです。

ABのライブラリでネットワーク関連が欲しいので、.NETのNet関連のライブラリを実装し始めているところですが、意外と大きかったり、結構面倒な物が絡んできそうなので、もしかすると独自のライブラリ風な実装になってしまうかもしれません。まだIPAddressクラスしか作ってないのでわかりませんが。配列の仕様がそろそろはっきりしてほしいところです。

というわけで、なんだか慌ただしさが表れている文章になってしまった気がします。

iPhone SDK beta3をPPCで動かす方法

iPhone SDK beta3がリリースされましたが、beta2からカスタムインストールだけではPowerPCのMacでiPhoneのアプリケーションをビルドできなってしまいました。しかし、少し設定ファイルを編集することで、beta3でもiPhoneアプリケーションをビルドできることがわかりました。これでIntel Mac同様にPPC MacでもiPhone SDKを楽しむことができます。

その方法はこちらのブログに書かれています。
iPhone SDK Beta 2 PPC Fix
最も簡単な方法は、iPhone SDKをカスタムインストールした後、上のリンク先のブログで配布されている設定ファイルを上書きする方法です。

まず、iPhone SDKをPPC Macにインストールする方法を見て、iPhone SDKをカスタムインストールしてください。以前の記事ではAspen…のパッケージをインストールしていますが、beta2からiPhone…のパッケージに名称が変更されているので、それらをカスタムインストールしましょう。

次に、SDKをインストールした場所/Platforms/iPhoneSimulator.platform/Developer/
Library/Xcode/Specifications/iPhone Simulator Architectures.xcspecのファイル内容を、上のリンク先のブログで配布されている設定ファイルの内容と置き換えます。

これでiPhone SDK beta3をPPCでも動かすことができるようになります。

光で約64倍

やっと光回線開通しました。今年からかなりADSLの速度が落ちていたので、iPhone SDK(1.37GB)のダウンロードに7時間もかかっていました。 今は20分くらいでダウンロードできるようになりました。

ADSLの速度:(Yahoo!BB – 50MB契約)

------ BNRスピードテスト (ダウンロード速度) ------
測定サイト: http://www.musen-lan.com/speed/ Ver3.5001
測定日時: 2008/04/13 09:18:01
回線/ISP/地域:
--------------------------------------------------
1.NTTPC(WebARENA)1: 380.166kbps(0.38Mbps) 47.11kB/sec
2.NTTPC(WebARENA)2: 387.315kbps(0.387Mbps) 48.01kB/sec
推定転送速度: 387.315kbps(0.387Mbps) 48.01kB/sec

光開通後:

------ BNRスピードテスト (ダウンロード速度) ------
測定サイト: http://www.musen-lan.com/speed/ Ver3.5001
測定日時: 2008/04/13 11:22:10
回線/ISP/地域:
--------------------------------------------------
1.NTTPC(WebARENA)1: 15736.363kbps(15.736Mbps) 1966.69kB/sec
2.NTTPC(WebARENA)2: 24617.966kbps(24.617Mbps) 3076.16kB/sec
推定転送速度: 24617.966kbps(24.617Mbps) 3076.16kB/sec

predicateWithFormatとstringWithFormatは違う

NSPredicateのイニシャライザのpredicateWithFormatと、NSStringのイニシャライザのstringWithFormatがありますが、両者には微妙に違いがあるので注意が必要です。

NSLog( [NSString stringWithFormat:@"%@ > 200", @"key"] );
NSLog( [[NSPredicate predicateWithFormat:@"%@ > 200", @"key"] predicateFormat] )

実行結果:

key >= 200
"key" >= 200

調べればすぐにわかりますが、NSPredicateの方は、文字列がクオーテーションで囲まれています。実は、NSPredicateの方は、それ用に少しだけ違っていて、%@でクオーテーションで囲まれた文字列、@Kでクオーテーションで囲まれていない文字列にすることができます。

なぜこうなっているのかというと、NSPredicateのフォーマットだからでしょう。NSPredicateの文法は”キー 演算子 値”です。@Kはキーの部分を指定するためにあり、%@は値の部分を指定するために存在しています。値の部分は、文字列の場合クオーテーションで囲まれていなければならないからです。

キー値監視

Cocoaのユニークな仕組みの一つであるキー値コーディングは以前紹介しましたが、今回はそれと合わせて存在している、キー値監視(Key Value Observing, KVO)という仕組みを紹介しようと思います。

キー値監視は、名前から想像できるように、キー値コーディングにおいてのキー値を監視することができるものです。具体的には、監視したいオブジェクトを監視側のオブジェクトが登録し、キー値が変更されると、登録したオブジェクトに特定のメソッドが呼ばれるようになります。

オブジェクトの登録には、以下のメソッドを監視したいオブジェクトに対して送ります。

- (void)addObserver:(NSObject *)anObserver forKeyPath:(NSString *)keyPath options:(NSKeyValueObservingOptions)options context:(void *)context
anObserver
監視するオブジェクト
keyPath
監視するキーパス
options
オプション
context
説名省略,cocoaでよく見かける(void *)context

監視を登録すると、以下のメソッドが監視側のオブジェクトで発生します。

- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context
keyPath
変更されたキーパス
object
変更された監視オブジェクト
change
説明省略
context
説名省略

監視を終了する場合、以下のメソッドを送ります。

- (void)removeObserver:(NSObject *)anObserver forKeyPath:(NSString *)keyPath
anObserver
監視側のオブジェクト
keyPath
キーパス

説明だと話がややこしいので、実際にひとつ例をあげます。dictionaryの@”key”というキーを監視する例です。

NSMutableDictionary *dictionary = [NSMutableDictionary dictionaryWithObject:@"" forKey:@"key"];
[dictionary addObserver:self forKeyPath:@"key" options:NSKeyValueObservingOptionNew context:NULL];

[dictionary setValue:@"new" forKey:@"key"];

こんな感じで登録し、値を変更すると次のメソッドが呼ばれます。

- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context
{
	NSLog( keyPath );
	NSLog( [object valueForKey:keyPath] );
}

このキー値監視はとても役立ちます。例えば、NSUserDefaultsのキーを監視すれば、常に設定と同期した振る舞いを実装することができます。

参考資料:Key-Value Observing Programming Guide

ニコニコ大百科の可能性

ニコニコ動画は「動画共有ではなく動画コミュニケーション」

上の記事で注目していただきたいのは、最後のニコニコ大百科のところです。

 今後はニコニコ動画で使われる専門用語の解説を目的とした「ニコニコ大百科」などの立ち上げを予定すると同時に、….

ニコニコ大百科だけでも価値あるコンテンツになると思うのですが、これと動画上のコメントの情報を組み合わせると面白いことができそうな気がしませんか?

例えば動画再生中に、その動画の内容にあった広告を、プレーヤーの上部の広報欄に表示することができるかもしれません。また、コメントの情報を元に、動画の内容を検索できるようになるかもしれません。

ただこれは、コメントの手軽さ故に、悪用も簡単にできてしまうのが問題でしょう。悪用が見つかったユーザーには退会措置をとることや、コメントにはプレミアム会員かという情報も付加されているので、それを利用することもできるでしょう。

検索エンジンはどうなのか

「青少年ネット規制法」成立はほぼ確実 その背景と問題点

こういう話題をブログであまり書かないのは、それほどこういうことに詳しくないからです。しかしそれでも、この法案には言いたいことが山ほどあります。

例えば、googleなどの検索エンジンはどうなるのでしょう。各サービスは、検索結果から有害な情報の除外に努めていると思うのですが、全力を尽くしたとしても0にすることは、現在の技術では不可能でしょう。つまり、検索サイトは常に有害の情報があると言えるのではないのでしょうか?

去年、高校のパソコンからHatenaがフィルタリングされていることを知ったときには、非常に残念な思いをしました。

IKImageBrowserViewの使い方 – 2

前回の、IKImageBrowserViewの使い方の続きです。今回は、前回作成したイメージブラウザに、拡大縮小機能と検索機能を付けようと思います。

まず、Interfacebuilderに戻り、nibにNSObjectControllerをひとつドラッグして作成します。AttributesのPrepare Contentにチェックを入れます。そして、Keyにzoomとpredicateを追加します。

NSObjectController Attributes

次に、設置しておいたNSSliderとNSSearchFieldにバインディングを設定します。NSSliderのValueのバインディングに、さっき作成したObject Controllerを指定し、Controller keyはselection,Model Key Pathはzoomにします。他の項目を間違えていじらないのように注意しましょう。

NSSearchFieldの方のバインディングは、Predicateのバインディングを、Object Controllerにバインディングし、これもController keyはselection, Model key pathはpredicateに設定します。ここでさらに、Predicate Formatを編集します。”keyPath contains $value”となっているところを、”imageTitle contains $value”と編集します。

最後に、IKImageBrowserViewのバインディングのzoomを、Object Controllerにバインディングします。Controller Keyはselection,Model Key Pathはzoomです。

また、Predicateの方のバインディングは、NSArrayControllerのImageControllerにバインディングを設定します。ImageControllerのFilter PredicateをObject Controllerにバインディングします。Controller Keyはselection,Model Key Pathはpredicateです。

これで設定は完了です。あとはXcodeに戻ってビルドして進行しましょう。設定ができれば、スライダーで拡大縮小、サーチフィールドで折込検索が行えるはずです。

参考までに、今回のプロジェクトをzipで用意しました。説明に画像が少ないので、わからなくなったら参考にしてみてください。
cocoa-application.zip