Skim のノートが保存される場所・Insync や DropBox 経由での Skim ノートの共有


 論文や仕事で使う PDF 書類を Google Drive (以下、Insync) の同期対象にして、複数の環境から参照できるようにしている。PDF 書類への書き込みは Skim (http://skim-app.sourceforge.net) という PDF ビューアを使っているが、書き込んだデータが Insync では同期できないことに気がついた。同様のファイル同期機能を持つ Dropbox でも同期できない。そもそも、Skim で書き入れたメモはどこに保存されているのか、なぜ同期できないのかについて調べてみた。この件について日本語で書かれたサイトがあまり無かったので、分かった部分を少し説明したい。

____________________
1. Skim で書き入れたメモデータの取り扱い

 PDF へのメモ書きは MacOSX にデフォルトでついている「プレビュー.app」でもできるが、Skim は動作が軽く、書き込んだ内容を別ウィンドウでリスト表示したり、LaTeX との親和性が非常に高かったりと、とても有用なアプリケーションだ。書き込んだメモの内容を簡単に取り除けるため、PDF を印刷して第三者に渡す際に、自分で書き込んだメモを消して印刷することもできる。そもそも、Skim で書き込んだ内容は Skim 以外の PDF ビュアーで見た際には表示されないようになっている。それでは、Skim で書き込んだ内容はどこに保存されているのだろうか? Skim の FAQs に以下の説明がある。

Q. Where are the notes and highlights stored?
A. Skim stores its notes and highlights in extended attributes (EAs). EAs are metadata that many file systems, such as HFS+, can associate with a file. So the notes are not stored in the PDF data itself.

 というわけで、PDF ファイルの拡張属性 (いわゆる xattr) に保存されているらしい。 テスト用に PDF ファイルを作成してファイルの状態を調べてみる。まずは素の PDF ファイル (sample.pdf)。

$ ls -lah
total 72
drwxr-xr-x   4 user_name  staff   136B  8 17 11:06 ./
drwx------+ 10 user_name  staff   340B  8 17 11:06 ../
-rw-r--r--@  1 user_name  staff   6.0K  8 17 11:07 .DS_Store
-rw-r--r--   1 user_name  staff    26K  8 17 11:06 sample.pdf

 この sample.pdf を Skim で開いて、アンダーライン、テキストの囲い、メモの書き込みをする。ついでに、Finder からラベルをつけ、Spotlight コメントもつける。

 そして再度 ls コマンドでファイルを確認。

$ ls -alh
total 72
drwxr-xr-x   4 user_name  staff   136B  8 17 11:12 ./
drwx------+ 10 user_name  staff   340B  8 17 11:06 ../
-rw-r--r--@  1 user_name  staff   6.0K  8 17 11:13 .DS_Store
-rw-r--r--@  1 user_name  staff    26K  8 17 11:12 sample.pdf

 sample.pdf のパーミッション末尾にアットマーク (@) がついた。これが MacOSX の拡張属性。拡張属性の内容を xattr コマンドで表示させてみる。

$ xattr sample.pdf
com.apple.FinderInfo
com.apple.metadata:kMDItemFinderComment
com.apple.metadata:kMDLabel_hlsi7t7nerhynemqvydgeb26de
net_sourceforge_skim-app_notes
net_sourceforge_skim-app_rtf_notes
net_sourceforge_skim-app_text_notes

 skim なんちゃらという名前の拡張属性が3つ付いていることが分かる。ついでに付けたラベルや Spotlight コメントもそれっぽい名前で拡張属性として付加されている。
 ここまでをまとめると、Skim のデータは MacOSX の拡張ファイル属性として保存されていることが確認できた。

____________________
2. Insync や DropBox でのシンクロ

 次にこの PDF ファイルを Insync (ver.0.9.17.17232) と DropBox (ver.1.4.12) 経由で他の端末へシンクロさせてみる。両者のバージョンは現在 (2012-08-17) の最新版にしてある。Skim で PDF へ書き込みをした環境とは別の環境 (シンクロ先) でファイルを確認してみる。

 まずは Insync 経由でシンクロされた PDF ファイル。

$ ls -alh
total 56
drwxr-xr-x  3 user_name  staff   102B  8 17 11:33 ./
drwxr-xr-x  9 user_name  staff   306B  8 17 11:33 ../
-rw-r--r--  1 user_name  staff    26K  8 17 11:32 sample.pdf

 Insync では拡張ファイル属性がごっそり消えている。Finder のラベルも Spotlight コメントも消えており、Skim のメモデータも無くなっている。

 次に、DropBox 経由でシンクロされた PDF ファイル。

$ ls -alh
total 72
drwxr-xr-x  3 user_name  staff   136B  8 17 11:33 ./
drwxr-xr-x  9 user_name  staff   272B  8 17 11:33 ../
-rw-r--r--@ 1 user_name  staff   6.0K  8 17 11:32 .DS_Store
-rw-r--r--@ 1 user_name  staff    26K  8 17 11:32 sample.pdf
$ xattr sample.pdf
com.apple.FinderInfo
com.apple.metadata:kMDItemFinderComment

 DropBox は Finder ラベルと Spotlight コメントは保存されているが、Skim のデータが消えている。
 いろいろウェブを検索してみると、Insync は現在拡張ファイル属性のシンクロには対応していない。開発者からは、拡張属性のシンクロは今後の対応案件にあがっているとコメントされている (https://forums.insynchq.com/discussion/682/resource-forks-xattrs/p1)。DropBox は ver.0.8 あたりで基本的な拡張属性には対応したらしく、Finder のラベルや Spotlight コメントは扱えるようになったらしいが、skim の拡張属性については不明。

____________________
3. Insync や Dropbox で Skim のノートをやり取りするには

 Skim にはコマンドラインから Skim 関連の作業ができる SkimNotes というツールがある。Skim の本家サイトからダウンロードし、skimnotes, skimpdf の2つのファイルをパスの通ったところ (/usr/local/bin とか ~/bin あたり) においておく。使えるコマンドはここ (http://sourceforge.net/apps/mediawiki/skim-app/index.php?title=SkimNotes_Tool) に詳しい。このコマンドの中に、Skim で書き入れた情報を別ファイル (.skim) に書き出すコマンドがある。

$ skimnotes get sample.pdf

 拡張子 .skim のファイルは当然ながら Insync でも Dropbox でもシンクロされる。親ファイル (.skim の拡張子以外同名のファイル) である PDF を Skim で開く際には次のようなダイアログが表れる。

 ここで「はい」を選べば、Skim で書き加えたメモなどが反映された状態で PDF ファイルが読み込まれる。
 .skim ファイルを読み込んだ場合、ファイル保存時には次のようなダイアログが表れる。「保存」を選ぶと Skim で書き加えたメモが拡張ファイル属性として親 PDF ファイルに追加される。

 .skim の内容を PDF の拡張ファイル属性として戻すのは、上記のようにファイルを開き直すだけでなく skimnotes の set コマンドでもできる。コマンドを活用してスクリプトで一括処理したり、cron で定時処理させるなどもできるかもしれない。

____________________
結論

 Skim で書き込んだ内容を別ファイル (.skim) として書き出す機能を使えば、Insync や Dropbox でも Skim のメモの内容を同期させることが可能であることが分かった。しかしながら、編集を加えるたびに書き出し、読み込みさせるのは少々現実味に欠ける。非常時や一時的にメモ付きのファイルを手渡す際には使えるだろうが、理想としては Insync や Dropbox が Skim の拡張ファイル属性に対応してくれるのを待つ、ということになりそうだ。
 注意が必要なのは、新しいマシンへの環境移行などの際に「データバックアップは DropBox にあるから、あとでシンクロすればいいや」とか思って Skim のメモの付いたファイルを DropBox 経由で復元したりすると、今まで書き込んだメモがごっそりなくなっている……なんて不幸も起こりかねないところだ。気をつけておきたい。