11月2007

LayerはModelである

Core Animation Programming Guideを読んでいたら、面白いことがわかった。ちょうどCore Animation Rendering Architectureのところなので、興味があったら直接覗いてほしい。

CocoaアプリケーションのデザインパターンはMVC(Model – View – Controller)が使われているので、アプリケーションを開発するときには少なからずこれを意識する必要がある。Core AnimationはCocoaではないが、Cocoaから利用する事が最も多いと思われるので、Core Animationも当然MVCの例外ではないようだ。

ところで、私が今見ている限りCore Animationは、Layer,Animation,Actionで主に構成されているようだ。Layerに描画し、それをAnimationでアニメートさせる、そしてActionだが、これは私も今調べている途中である。LayerはNSViewと同じような構造をしていて、木構造を作る事ができるが、zPositionを指定できるので、表示する際の順番を木構造に反映する必要はない。Core Animationを使うときには、ひとつルートになるLayerを作成し、それに他のLayerを貼付けていき、ルートLayerをNSViewなどに設定する事で実際に表示させる事ができる。このあたりの流れは、この前の記事(Core Animationしてみた)を参照してほしい。

このLayerであるが、MVCで言ったらどれにあたるだろうか?これについてCore Animation Rendering Architectureに書かれているのだ。これを見ると、LayerはViewと思いきや、実はModelだと言う事がわかる。

While there are obvious similarities between Core Animation layers and Cocoa views the biggest conceptual divergence is that layers do not render directly to the screen.

Where NSView is clearly a view object in the model-view-controller design pattern, Core Animation layers are actually model objects. They encapsulate geometry, timing and visual properties, and they provide the content that is displayed, but the actual display is not the layer’s responsibility.

どうやらプログラミングで直接使うLayer-Treeの他に、内部的にあと二つの全く同じ構造のLayerが作成されていて、一つは実際に描画するためのRender-Tree、もう一つはRender-TreeとLayer-TreeをつなぐためのPresentation-Treeが存在するようである。Render-Treeはアプリケーションから独立したスレッドで実行され、アニメーションの責任と、アプリケーション実行ループに影響を与えないようになっている。また、Render-TreeはPresentation-Treeの値をもとに描画を行う。Presentation-Treeは、Layer-Treeの値を常に監視しているわけではなく、実際に描画で必要な値だけをLayer-Treeから取ってくるらしい。

この結果、Core Animationは何百ものLayerを扱う事ができるというわけだ。まだ使った事ないけど…

Objective-C 2.0の日本語訳が公開されたようです

Objective-C 2.0プログラミング言語

早くも公式の翻訳がリリースされています。プロパティのところは読もうと思っていますが、余裕があったら他のところも目を通したいところです。

Leopardから搭載されたもの関係の記事は、既にいくつか翻訳されているものがあるので、この調子でCore Animation programming guideも訳してくれたらありがたいです。

電子辞書を使いこなすべき

私が電子辞書を購入して1年くらい経ちますが、ようやく使いこなせてきた感じがあります。そこで、今日は電子辞書の活用の仕方を紹介しようと思います。今回紹介する機能は、CASIOの電子辞書コンテンツプラス機能のテキストビューワー機能です。ちなみに、今回紹介する機能は、CASIOの電子辞書のコンテンツプラス機能が搭載されているものであれば、ほとんどができると思います。

テキストビューワー機能とは、PCから転送したテキストを電子辞書で読む機能です。機種にもよりますが、私の電子辞書では50MBまでテキストを本体に転送する事ができます。ちなみに、50MBあれば小説50冊くらい入ると思われます。この機能のどこが魅力的なところかと言えば、電子辞書本来の機能と、テキストビューワーの連携が非常に魅力的なのです。

1. すぐ開く

電子辞書にはレジューム機能があり、電源をONにすると、必ずOFFにした時の画面から始まります。辞書の単語を調べたままならそこから始まり、当然テキストビューワーであるならば、その読んでいた地点から即座に表示されます。もちろん電源をONにすると一瞬で画面が表示されます。

2. 各テキストの読んでいる位置が記録されている

テキストビューワーで小説を読んでいるときも安心して辞書を利用する事ができます。なぜなら、テキストビューワーを閉じて辞書で調べた後、再度テキストを開くと、読んでいた位置から開かれるからです。ちなみに、機種にもよりますがテキストファイルは50ファイルくらい入り、いずれのテキストも位置が保存されます。

3. しおり登録機能がある

上はデフォルトで保存される動作ですが、各テキストに最大で4つまでしおりをつける事ができます。しおりに登録する事で、あとでその場所を簡単に開く事ができます。

4. スーパージャンプで辞書を引ける

テキストビューワーを利用中にわからない単語が出てきたなら、当然辞書で調べる事ができます。普通にビューワーを閉じて調べる事もできますが、スーパージャンプ機能を使えば、その場でテキストを選択し、指定した辞書でその単語を引く事ができます。ちなみに、このスーパージャンプ機能は、テキストビューワーだけでなく通常の辞書を引いているときにも使う事ができ、連続で意味を調べる事が可能です。

5. テキストを見ながら辞書を引ける

スーパージャンプとは異なり、さらに検索機能を使うと、テキストビューワーを開きながら単語を調べる事ができます。

6. 英文を読むときはPCより快適

スーパージャンプ機能で選択したテキストから辞書へ飛ぶ事ができますが、英語の場合は特に便利です。単語間にスペースがあるので、テキストを選択するときは当然単語単位になるのは当然ですが、スーパージャンプ機能のときに、動詞の活用形,名詞,形容詞,副詞、など、通常から少し変形した単語であった場合も、辞書に単語があればそれを、なければ動詞の原形で候補が挙ります。

さらに便利なのが、成句,複合語検索です。スーパージャンプの時に「成句,複合語」を選ぶ事で、例えば、”make”を引くと、”make sure”,”make a change”,”make O a matter of conscience”などの成句や複合語を調べる事ができます。ここでさらに検索を使うと、この成句一覧画面でさらに絞り込む事ができ、目的の複合語などを容易に調べる事ができます。

7. 電池の寿命が長い

私の電子辞書は単四電池2つで動いていますが、かなり長持ちします。使い方にもよりますが、小説を数冊読んでもまだまだ使えます。電池の寿命はそれほど気にならないでしょう。

文章だけでなかなかわかりにくい説明かと思いますので、興味があったらCASIOのサイトへ行ってみましょう。写真付きでわかりやすく機能が紹介されています。今回は、テキストビューワー機能を中心に紹介しましたが、まだまだ便利な機能が電子辞書にはあります。ぜひ電子辞書を活用してみてください。今では携帯電話は電話らしく使い、電子辞書には電子辞書以上の扱いをしている生活です。

Core Animationしてみた

ある程度までドキュメントにも目を通したので、試しにCore Animationを使ってみた。以下のコードは、NSViewを継承したカスタムビューのコードである。ちなみに、インデントは邪魔なので省いた。

- (void)awakeFromNib
{
CALayer *rootLayer = [CALayer layer];
rootLayer.layoutManager = [CAConstraintLayoutManager layoutManager];
[self setLayer:rootLayer];
[self setWantsLayer:YES];

CATextLayer *textLayer = [CATextLayer layer];
CGColorRef color = CGColorCreateGenericRGB(0.0, 0.8, 0.0, 0.6);
textLayer.string = @"Hello, Core Animation";
textLayer.frame = CGRectMake(0, 0, 500, 30);
textLayer.foregroundColor = color;
[rootLayer addSublayer:textLayer];

CABasicAnimation *movingAnimation = [CABasicAnimation animationWithKeyPath:@"position"];
movingAnimation.duration = 2.0;
movingAnimation.repeatCount = 100;
movingAnimation.autoreverses = YES;
movingAnimation.fromValue = [NSValue valueWithPoint:NSMakePoint(0.0, 300.0)];
movingAnimation.toValue = [NSValue valueWithPoint:NSMakePoint(400.0, 300.0)];

[textLayer addAnimation:movingAnimation forKey:@"moveingAnimation"];

CGColorRelease(color);
}

軽く説明すると、最初に一つルートになるレイヤーを作成し、それをself、すなわちカスタムビューに設定している。設定だけでなく、setWantsLayerで有効にしなければならないようだ。ちなみに、作成した後のLayoutManagerとかいうのは、レイヤーを自動的にスーパービューの大きさに合わせるような設定だが、詳しくはまだよくわからない。

次に、CATextLayerクラスでテキストレイヤーを作成している。これはもちろんテキストを表示させるもので、大きさや色を設定し、最後のaddSubLayerで、最初に作成したルートレイヤーにテキストレイヤーを追加している。

その次に書いてある固まりがいよいよアニメーションの部分である。Core Animationでは主にレイヤーのプロパティを変更するアニメーションをサポートしていて、始点になる値、終点になる値、そして時間やリピート回数を指定すれば、自動的にレイヤーがアニメーションしてくれるような仕組みになっている。autoreversesというのは、逆の動きもするかという設定だ。今回はpositionをアニメートさせている。

最後に、テキストレイヤーにさっきのアニメーションを追加して完了である。これでテキストレイヤーがアニメーションで指定した通りにアニメーションするようになるのだ。

静止画像になってしまうが、次のようにアニメーションしていく。2秒間で右へ行ったり左へ行ったりする。
Text Animation
Text Animation
Text Animation

もちろん、ルートレイヤーに新たなレイヤーを追加する事でもっと他のものも表示できるし、テキストレイヤーに他のアニメーションを追加することで、例えば半透明のプロパティをアニメーションさせれば文字を点滅させる事もできる。ドキュメントによれば、Core Animationは何百ものレイヤーを同時に動かす事ができるようなので、レイヤーのアニメーションで困る事はないだろう。

気になったところと言えば、さりげなくいろいろなところにキー値コーディングが使われてる事。少し探すのに苦労したのが、CGPoint,CGRect,NSPoint,NSRectなどのラッパークラス。これはNSValueがラッパーになっているようだ。

まさに欲しかった部品群

以前、ニコニコ動画のマイリストをiPhotoのように管理するソフトや、ニコニコ動画のオフラインプレーヤーを作りたいとブログで言ったときがありましたが、どちらもABのライブラリ開発同様に、あまり時間がないので手を出していませんでした。それで、まずこれらを作成するためには、iPhotoのようなビューを自前で作成すること、そして動画の上に文字を描画するために、Core Videoを使うか、少しトリッキーなことをしなければなりませんでした。

しかし、ここに来てLeopardの発売がありました。開発環境を見渡すと、そこには豊富なアプリケーションの部品がそろっており、もちろんiPhotoのようなインターフェースも例外ではありませんでした。まさにそれがIKImageBrowserViewなわけです。

さらに、ここ最近頑張ってCore Animation Programming Guideを読んでいるところですが、Core Animationは単なるビューのアニメーションを行うものではなく、Mac OS Xのさまざまなグラフィックステクノロジーを集約する働きもあることがわかってきました。具体的には、Core Animationの基本はレイヤーなのですが、そのレイヤーには、OpenGL,Quartz Composerを扱うもの、テキストさらにはQTMovieを扱うものが用意されていて、それらを重ね合わせてひとつのものとしていきます。そして当然、Core Animationなので、各レイヤーのアニメーションを、時間や動きなどをサポートしてくれます。具体的に使い方はわかっていませんが、時間と目標の値を設定すれば、その目標の値へ時間までに徐々に推移してくようなことができるようです。

要するに、これらを使えば動画にテキストを重ねるのは容易なわけで、ニコニコ動画のオフラインプレーヤーを作成することも可能になってくる訳です。そういうわけで、Image KitやCore Animationに非常に関心を抱いているのでした。

いろいろとドキュメントにまとめたくなってきた

ActiveBasic 5.0の言語仕様がそろそろ落ち着いてきたので、言語仕様をひとつのドキュメントとしてまとめたくなってきた次第ですが、実は以前書きかけたものがあります。

書きかけの仕様書

半年くらい前にこんな話をしたときの産物で、今日からまた、これの続きを書いて仕上げていこうかと考えていたのですが、データ型をどこに区分して載せていくかに迷って結局手を付けられませんでした。どこかに見本になるようなものはないのでしょうかね。

あとは、ライブラリ開発でのコーディングガイドライン的なものがあったらいいなとは思っているのですが、一人で書いていけるものでもないのでなかなか難しい話です。まあ結局、誰かが動き出さないことには始まらないので、あったらいいなと思っている自分が動き出すべきなんでしょうけどね…

とりあえず、仕様のほうはぼちぼち進めていこうかと思います。

Core Animationが気になる

Image Kitもそこそこ気になるのですが、やはりLeopardのでの目玉はなんといってもCore Animationでしょう。Interface BuilderのビューのインスペクタパネルでCore Animationの項目があることからして、Core Animationを無視する訳にはいきません。

というわけで、Core Animationを使ってみたいのは山々なのですが、ドキュメントが英語なので苦戦中であります…。早くも下のサイトでは日本語でCore Animationについての記事があるようです。

Numata Designed Factory

少しドキュメントを読んで思ったのですが、Core Animationはもちろんマルチスレッドです。通常マルチスレッド対応のアクセサメソッドを作るには、以前書いた記事のメソッドを、さらにマルチスレッドに対応させるコードを追加する必要が出てきます。Core Animationはプロパティを多用していますが、もしプロパティが導入されなかったとすると、Core Animationはアクセサメソッドを作るだけで結構な労力を使ってしまいかねない気がします。

IKImageBrowserView使ってみた

この前IKImageBrowserViewのスクロールをつけるのに手間取っていましたが、今日ようやくつけ方がわかりました。

ついでに右下のスライダーで画像の大きさを変えられるようにしました
IKImageBrowserView

後で詳しく書こうかと思っていますが、簡単に説明すると、NSScrollViewのドキュメントにイメージブラウザをセットするだけです。Interface Builderで設定できなさそうだったので、IKImageBrowserViewのカスタムクラスを作成し、awakeFromNibでNSScrollViewにsetDocumentメッセージを送るようにしたのですが、これが最も簡単な方法なんでしょうかね。

ところで、このIKImageBrowserViewはなかなか優れていて、各イメージがリクエストされるのは、実際に画面上に表示されるときになってからです。これによって処理が分散するので、大量のイメージを読み込ませても固まってしまうなんてことにはなりません。

読み込み中のところは灰色の枠で表示される:
ImageBrowser

これはImage Kitですが、Leopardでは標準コントロールでNSCollectionViewなどいくつか追加されたコントロールがあるので、それらも試してみたいですね。

iBookにLeopardインストールして…

Leopard

さて、Leopardをインストールして落ち着いてきたので、そろそろブログにまとめておこうと思います。まずは、私のMacのスペックから紹介しましょう。

iBook G4最終モデル(12inch)
CPU: PowerPC G4 1.33GHz
メモリ: 512MB + 1GB
HDD: 40GB

第一に、LeopardとTigerはそれほど違いがありません。アップデートしても、どの操作も違和感なく行うことができるので、特に新鮮さも感じないところではあります。しかし、使っているうちに、確実にいいOSへ進化しているということも実感することができます。

最初に驚いたのはSpotlightです。Tigerより大幅に検索の速度が向上しました。このiBookですら打ち込んですぐに検索結果が表示されます。それでいて、以前よりWEB履歴や辞書などの検索の範囲が広がっていることに驚きです。少々残念なのは、検索するときの文字入力がもたつくところです。まあでも全体的にみれば検索速度が大幅に向上されているので、それほど問題ではないかもしれません。それと、スペックがある程度あるMacなら問題ないでしょう。

Spotlight:
spotlight in leopard

次にFinderです。それほどドキュメントはありませんが、やはりCover Flow + Quick Lookの連携は強力です。これで特定のドキュメントを探すのに苦労することはかなり減ると思われます。

Cover Flow:
cover flow in finder

Quick Look: スペースキーを押すとサッと表示されます。このまま隣のファイルを表示することも可能です。
cover flow in finder

目立つのはこのあたりですが、他にも全体的に動作がきびきびするようになりました。Safariもさらに速くなっています。ただ残念なのが、ExposéとSpacesのウィンドウがさっと移動するアニメーションが、滑らかでないときが目立つ点です。特にExposéはTigerのときよりそういう時が多いです。これはおそらく、LeopardがiBook用にそれほど最適化されていないことと考えられますが、なんともいえません。

さて、とりあえず今日のところはこれまでです。また何かあれば紹介しようと思います。あと、一般の人には見えない開発環境の部分ですが、かなりいい感じにアップデートされていると思います。新しいコントロールとかもあるので、そのうちそれらも紹介してみたいです。

NSScrollerと格闘中…

一昨日あたりにImage KitのIKImageBrowserView試してみましたが、スクロールがデフォルトで用意されていないので、自前でつけなければならないようだと書きました。しかし、ビュー上でマウスをドラッグする(画像を選択するため)と、それに合わせてビューがスクロールするのです。つまり、ビュー自体にスクロールの機能は実装されているが、スクロールバーの表示がされていないことになります。実際、IKImageBrowserViewのメソッドのひとつに、scrollIndexToVisibleというものがあり、これに表示したい画像の番号を入れると、そこを表示してくれます。

- (void) scrollIndexToVisible:(NSInteger) index;

というわけで、スクロールバーのNSScrollerを使おうとビューに表示するところまではできているのですが、まだNSScrollerの使い方がわからずに苦戦中です…

あと、できればこういうのはCocoa Drawing Guideを一通り目を通してからやりたかったのですが、残念ながら読んでる時間もあまりないです。