Bowtie’s PowerSearch
BowtieというMac OS X用のイカしたiTunesコントローラがあって、テーマをHTMLベースで手軽に作ることができるため、まだベータ版にも関わらずThemeコミュニティが盛り上がっている。
このBowtieの持つ検索機能がかなり優秀で、手元の704アーティスト・9404曲というライブラリでも一瞬で検索が完了する。その性能に感動していたら、ちょうど開発者のブログに「世のiTunesコントローラはどれも検索機能がバギーで遅い。それは何故かというと…」というエントリがあったので、読んでみた次第。
まず、iTunesの持つ検索機能をそのまま使おうとすると、Apple Eventオブジェクトを投げてやりとりすることになるが、これはかなり遅い。検索リクエストのたびにiTunesと通信したりするとレスポンスがよろしくないので、アプリによってはあらかじめiTunesから情報を取得しておいて自前の検索処理を走らせるらしいのだが、それでも速度はともかくメモリ消費量は増えてしまう。
そこでBowtieでは、plist(iTunes Music Library.xml)とPredicateを使ったPowerSearchという仕組みを考案して使っている。Predicateは、CoreDataを使ったデータ構造に対するクエリ言語のようなもので(【コラム】ダイナミックObjective-C (116) デザインパターンをObjective-Cで – Interpreter (2))、具体的には起動時もしくはiTunesライブラリの変更時にplistを内部表現に変換し、検索の際は独自に拡張したPredicateを使って結果を取得するようになる(他の方式に比べてメモリ消費がどうなのかは読み取れなかった)。
これにより、Bowtie内では以下のように曲のメタデータに対する検索が容易に行えるようになり、
(artist contains[cd] "u2") AND (name contains[cd] "where the stre")
ユーザーレベルでは、検索フォームに
@U2 + "where the stre"
と入力すればスムーズに絞り込み検索が行えるようになる。
スクリーンショットを見るとわかるように、アーティスト、アルバム、楽曲で異なるプレフィクスを指定するようになっているのもポイントで、これによって検索対象のフィールドを大幅に絞り込むことができ、とても高速なレスポンスが実現できている(もちろんプレフィクス無しで入力してもまともな速度で結果を返してくれる)。
CoreDataの設計にあらためて感動した。ちゃんとCocoaプログラミングしよう。
おまけ
ターミナルから以下のコマンドを実行してBowtieを再起動することで、検索ウィンドウの見栄えを変えることができる。
defaults write net.mattpat.Bowtie searchMode HUD
defaults write net.mattpat.Bowtie searchMode Aqua


