Project "pKizzy"

Workshop Cocam プロジェクト第4弾は,Cocoa Binding & Core Data に挑戦。

↑ top page


pKizzy のご紹介
    pKizzy は iTunes ライクなインターフェイスで PDF ファイルを管理するためのアプリです。
    以下のような機能を備えています。
    • PDF 内容のプレビュー機能
    • プロパティ中の文字列をキーとしてアーティクルをインクリメンタルに絞り込み
    • Spotlight 全文検索/メタデータ検索を用いたアーティクル絞り込み
    • 階層化可能なグループによる管理
    • 条件指定可能なスマートグループ
    • スマートグループの条件を使った検索機能
    • PDF ファイルを持たない PDFless アーティクルを作成・管理可
    • Source プロパティの省略形を管理する Source Titles Manager
    • アーティクルのリストを任意書式でテキストとして出力する Bibliography Exporter
    • PDF インポート時に自動的にメタデータを抽出する Extractor をプラグ・インとして組み込み可
    ・・・その他いろいろ。


Download pKizzy

0.7 のいま (進行状況)
    September 12, 2009:
      pKizzy 0.7.8 unSnow-Leoparded 公開です。

      ついに Snow Leopard 入手!
      さっそく試してみたけど、特に問題なく動いていそう。
      ・・・だったんだけど、Snow Leopard とは直接関係ないところで不具合が見つかったので、その修正版のリリースです。
      久々にアップデートすると、いろいろと詰めが甘かった・・・前からという話もあるけど (^^;

      今回の変更は、

    • 日本語リソースの不具合の修正。
      わりと目立つところだけど、どこだったかは秘密 (^^;

      以上。

    • 今回は、Snow Leopard + Xcode 3.2 で Leopard 向けにビルドしてみた。
      すると、deprecated method の警告で怒られた。
      で、改めてドキュメントを確認してみると、確かに 10.5 で deprecated されたメソッドをいくつか使ってた。 この間までは文句言われなかったんだけどなぁ・・・。
      その辺もついでに修正。


    September 2, 2009:
      pKizzy 0.7.7 公開です。
      怒濤の2日連続更新です! バグが見つかっただけ、とも言う (^^;

      今回の変更は、

    • グループ・カラーリングの on/off ボタンが正しく機能していなかった不具合の修正。
      ビルドのログで警告は出ていたんだけど、すっかり見落としてた (^^;

      以上。
      お騒がせしました。


    September 1, 2009:
      pKizzy 0.7.6 公開です。
      今回は、Snow Leopard 未導入!! (威張ることではない (^^; )
      というわけで、対応チェックもまだ。
      あしからず。

      今回の主な変更は以下の通り。

    • 日本語リソースを追加。
      0.7 シリーズは、例によって、メンテナンスモードに移行します。 もともと更新ペースも落ちてたわけだけど。
      すでに Snow Leopard もリリースされ、リソースをいじくるような変更は Snow Leopard 以降かな、という気もするので、この辺で一区切り。 Snow Leopard 導入計画はまだ未定なわけだけど。
      不具合の修正なんかは、必要に応じてやるつもり。

    • 前回、グループ変更したときに選択アーティクルの情報が保存されるように修正したけど、明示的にアーティクルの選択を変更しない限り、その情報が保存されてしまっていた。
      たとえば、あるグループでいくつかアーティクルを選択して、アーティクルを含まないグループに変更 (本来、ここで選択がクリアされるはず) した後、何もせず元のグループに戻ると、アーティクル選択が復元されていた。
      その不具合の修正。

    • Finder 上などでアプリのアイコンにファイルをドロップして起動、かつ、自動的に情報パネルを開く設定のとき、情報パネルに読み込んだファイルの情報が表示されなかった不具合の修正。
      原因は、起動後にデータベースの読み込み (fetch) が完了しない間にアーティクル情報にアクセスしようとしていたため。

    • グループの背景色が適切に更新されない場合があった不具合の修正。
      たとえば、グループにアーティクルが追加/削除された時とか。

      今回は,こんなところで。
      以下,独り言。

    • Snow Leopard に期待すること。

      Snow Leopard では、GCD や OpenCL (こっちは pKizzy ではあまり役に立たないか?) を使って、割とお手軽にパフォーマンス向上ができそうか?
      まだリファレンスなんかも読んでないので、何とも言えないところなんだけど、パフォーマンス向上できるなら何にせよ良いことだ。
      今どきのマシンと僕の使い方では、あまりパフォーマンスに不満を感じてはいないんだけど。

      で、それよりも期待が大きいのは、API の充実。
      現状では、不具合があったり、仕様が未公開だったり (実は未完成だったり?) するクラスがまだまだあるようだ (単に僕の勉強不足である可能性も大 (^^; )。 そいつらが完成されると、そしてもちろん、ドキュメントやサンプルが充実していると、とっても嬉しい。
      たとえば pKizzy に直接関わるあたりだと、NSTokenField のバグ (?), NSRuleEditor (NSPredicateEditor は大丈夫そうなんだけど) や Quick Look クライアントの仕様、などなど。
      ちょこっとオンライン・ドキュメントを覗いてみた限りでは、
      • NSRuleEditor には delegate protocol が追加されていて、これで解決できそうか。
      • Quick Look クライアントは、相変わらず締め出されているようだ。
      • NSTokenField は、実際に試してみんとよく分からん。
      といった感じ。

      今回はメンテナンス・バージョンの意味合いも大きいようなので、この辺りにも大いに期待。


    February 26, 2009:
      pKizzy 0.7.5 公開です。
      今回は,サムネイル表示まわりのバグ修正など。

    • サムネイル表示でのソートボタンの不具合の修正。

    • サムネイル表示でアプリを終了したとき,次回起動時にビュー設定 (縮小率) が復帰されない不具合の修正。

    • サムネイル表示のとき,ダブルクリックで PDF を開く (もしくは書類を開く) ように仕様変更。

    • メインウィンドウで,メタ情報の再読み込みが機能していなかった不具合の修正。

    • 情報パネルで,複数アーティクル選択時でもアーティクル移動が可能に。

    • グループ切り換えなど,アーティクル一覧表示が切り替わった時,アーティクルの選択を保存して,選択アイテムにスクロール移動するようになった。

      今回は,こんなところで。
      以下,独り言。

    • ビュー切り替え時に選択を保存するためには,NSArrayController の setPreserveSelection: で YES を指定してやればいい。
      ・・・ふつうは。

      pKizzy の場合の問題は,グループ内でのアーティクル順を任意に記録しておくため,group オブジェクトと article オブジェクトの間に articleIndex オブジェクトが挟まっていること。 つまり,NSArrayController は選択された articleIndex オブジェクトを保存する。 しかし,articleIndex はグループ間で重複しないので,グループを切り替えたときには必ず選択が解除されてしまっていた。

      これを解決するには,選択の変化を検出して,その度に選択されたアーティクルを記録して,グループ切り替えを検出したら復帰する・・・ 要するに,preserveSelection を自前で実装しないといけないということになる。
      ただし厄介なことに,KVO でグループの @"selection" を observe していると,一度グループを切り替えるだけで,なぜか何度も反応してしまう。
      なので,反応するたびに,実際に処理するかどうか判定をしないといけない。 ・・・ややこしい・・・。

      で,前にチャレンジしたときはうまくいかなかったんだけど,今回やってみたら,割とすんなり実装できた。 どうやら動いてもいるようだ。


    January 30, 2009:
      pK090130.png pKizzy 0.7.4 公開です。

    • アーティクル一覧で,リスト形式の他にサムネイル形式での表示が可能に。
      使い方は・・・ま,分かるんではないでしょうか。
      開発の詳細は下で。

    • 情報パネルで,アーティクルのカウントがおかしい場合があった不具合の修正。

    • 情報パネルを閉じてすぐ開いたときプレビューが表示されなかった不具合の修正。

    • スマート検索ウィンドウで,検索結果をグループ/スマートグループに変換したとき,新しく作られるグループに生じる不具合の修正。

    • スマート検索ウィンドウで,検索結果をグループ/スマートグループに変換するの UI をコンテクスト/ギア・メニューに統合。

    • ムービーのプレビューで,拡大しないように仕様変更。

      今回は,こんなところで。
      以下,独り言。

    • アーティクルのサムネイル表示を実現するためには,Image Kit の IKImageBrowserView を使ってみた。
      これ,便利。 最初は自分で画像を作らないとと思ってたんだけど,勝手にサムネイルは作ってくれるし,勝手に並べてくれる (当然か?) し,スライダとバインドしておくだけで縮小率も変えられるし,並べ替えたときには勝手にアニメーションまでしてくれる (ある程度の on/off 制御はしてます)

      で,最大のメリット。
      表示する画像をどうやって用意するか,には何種類かの選択肢があって (詳細はこちらを参照のこと)NSImage なんかで画像そのものを用意することもできるんだけど,ファイルパスや URL で指定することもできる。
      そして何と言っても特筆すべきは,Quick Look 形式を指定できること,でしょう。

      データとしてファイルパス (URL でも OK) を渡してやると,勝手にプレビュー画像を作ってくれる。 PDF や画像ファイルの場合は,ファイルパス (URL) 指定でも同じ事ができるわけだけど,Quick Look 形式だとさらに,いろんなドキュメントのプレビューも作ってくれる。 非対応のファイルの場合には,とりあえずアイコンを表示してくれるらしい。

      サムネイルは見れるのにプレビューできない,なんてのもアレなので,プレビューでも見れるように,もちろんしたい。 でも,Quick Look クライアントの仕様はまだ公開されていない (と思う) ので,pKizzy でもプレビューではまだ実現できていない。
      さっさと公開してくれんかなぁ・・・。

    • 本当は,メモリ効率とか考えると,リスト・ビューとサムネイル・ビューは nib ファイルも分けて,動的に呼び出すようにしようと思ってた。 プレビューではそんな感じにできてるし。
      しかし,テーブル・ビューまわりにあまりにもたくさんバインディングが絡まり合ってて,結局,諦めた。 要するに,手抜き? (^^;

    • ちなみに,サムネイル表示は,12月初め頃にはいったん完成間近に迫っていた。
      もう一息というところで,なんと,HDD クラッシュ!! ・・・ T T)

      開発途中のソースはバックアップも取ってなくて,サムネイル表示の実装は,1からやり直し・・・。
      幸い,0.7.3 段階のソースやリソースは残ってた。
      ま,おかげで2回目は比較的すんなり実装できたけどねっ! (何の強がりだ? (^^; )

      実は,この2年半ほどで4回目の HDD クラッシュ。 HDD ってこんなに壊れるもんなのか? すっかり信用なくしてしまったよ・・・。 ちなみに,ラップトップ2台,外付け1台で4回なので,特定のハードが悪いというわけではない。 ・・・使い方が悪いのか?
      これをきっかけに,開発環境にもようやく念願の Time Machine を導入しちゃいました。


    November 28, 2008:
      pKizzy 0.7.3 公開です。

    • グループ・カラーリングのスイッチを設置。
      バージョン 0.7.2 では強制適用されてたけど,見栄えがいまいちだったり,パフォーマンスが多少なりとも落ちたりするわけで,使いたくないケースもあることでしょう。 というわけで,on/off 制御可能にしてみた。

    • スマート検索ウィンドウでの絞り込み検索結果がグループ・カラーリングに影響していた不具合の修正。

    • グループに含まれるアーティクルを増減した後で,結果がグループ・カラーリングに反映されない不具合の修正。

    • アーティクル・テーブルへのドラッグ&ドロップで複数ファイルをインポートした後,自動的に情報パネルを開く設定の場合,1つのアーティクルだけが選択されていなかった不具合の修正。

      今回は,こんなところで。


    October 19, 2008:
      pKizzy 0.7.2 公開です。

    • pK081019.png インクリメンタル・サーチの結果を,グループ名のバックグラウンド色に反映。
      そのグループに含まれるか,子グループに含まれるか,といった条件によって色が変わります。
      具体的にどういう法則かは,ま,すぐに分かるでしょう。

      アーティクルやグループの数が増えてくると,あのアーティクルはどのグループへ入れたっけ? とか迷うことがけっこう起きる。 僕だけ? σ (^^;
      ま,アーカイブには全て含まれてるわけだし,検索ワードは保持されるからグループを切り替えながら探すこともできるわけだけど,ま,一発で見つけ易いかな〜,と。

      ただ,見栄えはあまりよろしくないとは思ってる。 Finder のラベルのように,グラデーションをつけたり両端を丸めたりするとなお良いんだろうなぁ。 色合いも検討の余地はあると思うし。
      とりあえず今回は,実装法として手抜き 効率のよさを重視。

    • アーティクルのグループへのドラッグ&ドロップで,モディフィア・キー対応。
      コピーや移動が,モディフィア・キーである程度制御できるようになりました。

    • ファイルインポート時のドラッグ&ドロップでも,モディフィア・キー対応。
      オリジナルファイルを移動するか,残してコピーするか,一時的に初期設定をオーバーライドすることができます。

    • 複数アーティクルインポート後に情報パネルを表示する設定の場合,インポートしたアーティクルのうち1つだけ選択するように仕様変更。

    • PDF ファイルをアタッチメントとしてインポートした時にページ数を自動取得。

    • エイリアス処理の内部処理の最適化 (してみたつもり)

    • 同梱のプラグインもアップデート。
      抽出精度が (若干) 向上しました

      今回は,こんなところで。
      以下,独り言。

    • 前回の Scripting Bridge に続き,ファイル操作に Apple Script の変わりに NSWorkspace を利用することを試みた。
      NSWorkspace に便利なメソッドがあることを,今まで知らんかった (^^;

      今回試したのは performFileOperation: source: destination: files: tag:selectFile: inFileViewerRootedAtPath:
      perform... の方で,「ゴミ箱に移動」処理を代替。

      NSInteger tag = 0;

      [[NSWorkspace sharedWorkspace] performFileOperation:NSWorkspaceRecycleOperation source:sourcePath destination:@"" files:filenameArray tag:&tag];

      という感じで OK。 sourcePath ディレクトリ内にある filenameArray でファイル名で指定した複数のファイルを,まとめて処理できる。

      select... の方では「Finder で表示」処理を代替。

      [[NSWorkspace sharedWorkspace] selectFile:filePath inFileViewerRootedAtPath:sourcePath];

      といった感じで,sourcePath のディレクトリを Finder で開いて,filePath で指定したパスのファイルを選択状態にする。

      これで,Apple Script のコードと同様の事ができそうだ・・・ったんだけど。
      「ゴミ箱に移動」では音が出ない
      ファイル選択は,複数まとめて処理できない
      というわけで,どちらも片手落ち。 やはり,Apple Script を使い続けることにした。 1から書くなら妥協するかもだけど,すでに動いてるコードがあるしね。

    • ファイルのインポート処理には NSFileManager を使っていた訳だけど,そちらのメソッドが Leopard で改良されたようだ。
      これまでは

      [[NSFileManager defaultManager] copyPath:source toPath:destination handler:nil];

      という感じにやっていて,まぁ,問題なかった訳だけど。これを

      NSError *err = nil;

      [[NSFileManager defaultManager] copyItemAtPath:srcPath toPath:dstPath error:&err];

      とできるようになった。 今まで使った試しのなかった handler の代わりに,エラー情報を取りやすくなった。 これで得たエラー情報は,

      [[NSAlert alertWithError:err] runModal];

      などとやることでエラーメッセージを表示できる。


    August 12, 2008:
      pKizzy 0.7.1 公開です。
      今回は,0.7.0 をしばらく自分でも使ってみて目についた,不具合の修正がメイン。
      主な変更は以下の通り。

    • グループをドラッグ&ドロップ移動した後の不具合の修正と,処理待ちの最適化。

    • スマートグループの条件を変更した後,表示が乱れる不具合の修正。

    • エクストラクタ・セレクタ・パネル表示のタイミングに関する不具合を修正。

    • doi, URL プロパティを利用してアーティクルの関連サイトをネットで開くとき,プロパティの前後から空白を自動的にトリムするよう変更。

    • ファイルのドラッグ&ドロップでアーティクルをインポートした際の処理完了を高速化 (・・・したはず)

    • アーティクル・テーブルのアタッチメント項目のコンテクスト・メニューで,選択したアタッチメントを開くように仕様変更。

      今回は,こんなところで。
      以下,独り言。

    • pKizzy では,いくつかのファイル操作に Apple Script を使っているわけだけど,今回はそれを Scripting Bridge に乗り換えることを目指してみた。
      というのも,Leopard では Apple Script は使用不可になったらしく,NSAppleScript でコマンドを実行するとアプリが落ちてしまうから。
      ・・・と思ってたんだけど,最近試してみると問題なくなっていた。 どうやら,10.5.x のどこかのマイナー・アップデートで修正されたか。
      で,結論から言うと乗り換えは諦めたんだけど,せっかくなので,試して分かったことなど書いてみます。

      Leopard では,Apple Script の代わりになる,Scripting Bridge なるものが導入されたらしい。
      これを使うと,Apple Script のコマンド文字列を用意しなくても,オブジェクトのメソッドを呼び出す objective-C 的なやり方で他のアプリをコントロールできるらしい。 たとえば,ScriptingBridge.framework と Finder.h を用意して,

      FinderApplication *theFinder = [SBApplication applicationWithBundleIdentifier:@"com.apple.finder"];

      [theFinder activate];

      とやると,Finder をアクティブにできる。
      Apple のドキュメントでは Finder を制御するサンプルコードも紹介されていて,ファイル操作もさっそく試してみた。

      たとえば,

      FinderFolder *theFolder = [[theFinder folders] objectAtLocation:urlOfTheFolder];

      とやると,URL で指定したフォルダをオブジェクトとして得ることができて,

      FinderItem *anItem = [[theFolder items] objectWithName:filename];

      [anItem reveal];

      とやると,ファイル名を指定してオブジェクトを得て,ファイル操作 (この場合,選択状態にして表示) を実行できる。
      こりゃ,Apple Script コマンドのテキストを合成するより,直感的だし簡単,よっぽどよさそうだ。

      で,複数オブジェクトを扱う場合には,NSMutableArray のサブクラスである SBElementArray を使う。
      たとえば,さっきの [theFolder items] の返り値は実は SBElementArray で,

      [[theFolder items] arrayByApplyingSelector:@selector(reveal)];

      とやると,フォルダ内の全オブジェクトに対して reveal 操作をおこなうことができる。
      簡単! 便利!!

      ・・・かと最初は思ったんけど,現時点での仕様では,とても使い物にならないことが判明した (少なくとも僕にとっては)

      SBElementArray は NSMutableArray のサブクラスといいながら,まず,空の array を作れないinitarray で作ろうとすると,エラーが出て怒られる。
      さらに,array のオブジェクト操作が Finder のファイル操作と連動している。 たとえば,[theFolder items] に対して removeObject: すると,対応するファイルがゴミ箱に移動される。
      結果,どうなるかというと,任意のオブジェクトをグルーピングしてまとめて操作,ということができなくなる。 その代わり,ファイル1つずつに処理を繰り返さないといけない。
      それでどんな不具合があるかというと,たとえば
      • 「Finder に表示」しようとすると,最後に処理した1つだけが選択状態になる。 本来は,対象のファイルはまとめて選択状態になってほしい。
      • 「ゴミ箱に移動」すると,「ザザザザンッ」と濁った音が鳴る。 本来はまとめて処理されて,「ザンッ」と心地よい音が響くはず。
      といったことになる。

      Scripting Bridge は,Apple Script でできることは全て出来る,と謳っているはずなのに。
      これはバグか? 仕様だとしたら困ったもんだと思う。
      もちろん,ただ単に僕の勉強不足である可能性は大 (^^;


    April 13, 2008:
      pK080413_1.png 今回は,待望 (誰が?) の pKizzy 0.7.0 Leoparded 公開です。

      Tiger 対応版は 0.6.10 でいちおうの区切りとして,0.7 からは Leopard 専用版として仕切り直し。
      Leopard の新機能もバリバリ (とはいってないか。ポリポリ,ぐらい? (^^: ) 使ってます。
      こちらは開発途上なので,リソースは英語のみ。
      それと,plug-in の仕様も一新したので,新たに同梱のファイルを "plug-ins" フォルダに移してください。 0.6 以前用のファイルと混在していても問題ありません (・・・のはず)

      Tiger 対応版もしばらくはダウンロードできる状態にしときます。

    • 主な変更は,・・・たくさん (^^;

      レイアウトからウィンドウから内部処理から,かなり手を加えてます。
      データ構造も変わっているので,変更を加えると 0.6 以前へは戻れません。 0.6 以前のデータは,初回起動時に自動的に変換して読み込みます。
      pArticles 時代のデータからの変換には悪しからず対応してません。 0.6 あたりを経由して乗り切ってください。

      使い方に難しいところは特に無い・・・とは思いますが,以下でいくつか簡単に説明を。

    • article に attachments の登録が可能に。

      今どきの文献というと,supplementary なんちゃらとか,supporting うんちゃらとか,本編以外に PDF (その他のファイルの場合も多々ある) が付いてくることが多い。
      そいつらもまとめて管理したいところだけど,一緒に並べてもリストが長くなるだけだし,どうにもまとまりがない。

      pK080413_2.png
      command キーを押しながらアーティクルをドラッグ&ドロップで attachment 登録 (カーソルはスクリーンショットに映っていません)
      そこで,article を別の article の attachments として登録できるようにした。 登録の方法は2つ。
      • article のリスト上で,attachment にしたい article をドラッグし,command キーを押しながら登録したい article 上へドロップ。
      • Info Panel にある attachment リストに,attachment にしたい article をドラッグ&ドロップ。
      もしくは,
      • Info Panel にある attachment リストに,attachment にしたいファイルを直接ドラッグ&ドロップ。
      で登録することもできます。

    • PDF 以外のフォーマットのファイルも登録が可能に。

      attachment で PDF 以外のファイルも扱えるようにすることを目論んでみた。
      ファイルフォーマットによる差別は特にしないので,メインのデータベースを PDF 以外のファイルの管理に使うことも可能です。 違いは,プレビューできるかどうかと,メタ情報抽出機能が効くかどうかぐらい,のはず。

      当然,PDF 以外のプレビューも搭載したいところだし,とすると当然,あの機能なんかも使いたいところなんだけど,どうやら client 側の仕様はまだ公開されていないらしい。 当面 Apple が独り占めするつもりなんだろうか。 残念。

      今回は,こんなところで。


Project "pKizzy" のページ

ご紹介
Download
スクリーンショット

0.1 のころ
0.2 のころ
0.3 のころ
0.4 のころ
0.5 のころ
0.6 のころ
0.7 のいま


システム要求

pKizzy は以下の環境で開発・動作確認をおこなっています。
  • MacBook 1.82GHz/
    MacBook Pro 2.8GHz
  • MacOSX 10.6.1
  • Xcode 3.2
最新版を使用するためには 10.5 以上の OS が必須です。
今のところ,10.4 上で動作するバージョンも公開しています。


権利等

pKizzy に関するすべての権利は作者である kokam (以下,作者) が保持します。

pKizzy の実行ファイル,ソース・ファイルは自由にダウンロードおよび使用していただいてかまいません。
しかし,使用によって生じたいかなる損害に関しても作者は責任を負いかねます。 あくまで素人が趣味で作っただけのソフトであることを了解した上で,自己責任で使ってください。

個人利用での改変はご自由にどうぞ。
再配布に関しては,ダウンロードしたそのままの .dmg ファイル,つまり未改変のファイルについてのみ認めます。


Known Problems

いくつか未解決の問題があります。 解決策が分かる方がいれば,教えていただけたらうれしいなぁ・・・。
  • メタ情報エクストラクタが精度悪すぎ (PDFKit のバグも原因?)
  • table view 中の pop up menu の表示がおかしい (Cocoa Binding のバグ?)
  • 情報パネル等で undo できない
  • スマートグループ/スマート検索で "Imported Date" を条件とした絞り込みが機能しない


References

HAPPY Macintosh Developing TIME!
Cocoa プログラミングや Cocoa Binding についてとても分かりやすく解説されている mkino さんのサイト。

Cocoaで遊ぼう!!
Cocoa プログラミングや Cocoa Binding について実例とともに解説されているグースさんのサイト。


Workshop Cocam, 2008