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 経由で復元したりすると、今まで書き込んだメモがごっそりなくなっている……なんて不幸も起こりかねないところだ。気をつけておきたい。