epdiff
というコマンドがある(というか作りました)のでそれを使います。
epdiffのインストール
epdiffはRuby製なので、gemでインストールします。
$ gem install epdiff
管理者権限が必要な場合、sudo
をつけてください。
$ sudo gem install epdiff
なお、epdiffはdiff
コマンドを使います。diffコマンドがインストールされていない環境では別途インストールしておいてください(Mac OS Xや普通のLinux環境ではインストールされていると思います)。
epdiffを使う
epdiffはコマンドラインから以下の様に使います。
$ epdiff foo.epub bar.epub
こうすると、foo.epubとbar.epubの差分を表示してくれます。便利。
$ epdiff naruhounix-0.9.1.epub naruhounix-0.9.2.epub
diff -r -u /file1/OEBPS/appendix1.html /file2/OEBPS/appendix1.html
--- /file1/OEBPS/appendix1.html 2013-12-19 22:44:55.000000000 +0900
+++ /file2/OEBPS/appendix1.html 2013-12-19 22:44:55.000000000 +0900
@@ -43,7 +43,7 @@
</pre>
</div>
<p>この行は単に MRI の Ruby 1.8.7 の特定のパッチレベルで起きるバグ<a href="#fn-bug4338">*2</a>に対処するためのものだ。</p>
-<div class="footnote"><p class="footnote">[<a id="fn-bug4338">*2</a>] <a href="http://redmine.ruby-lang.org/issues/4338" class="link">http://redmine.ruby-lang.org/issues/4338</a></p></div>
+<div class="footnote"><p class="footnote">[<a id="fn-bug4338">*2</a>] <a href="http://bugs.ruby-lang.org/issues/4338" class="link">http://bugs.ruby-lang.org/issues/4338</a></p></div>
<div class="emlist-code">
<pre class="emlist">procline "Forked #{@child} at #{Time.now.to_i}"
</pre>
@@ -84,7 +84,7 @@
<h2><a id="h1-4"></a>GC が掃除をしてくるんじゃなかったっけ?</h2>
<p>ええと、それはもちろん。だけど、すごくうまくやれてるわけじゃない。及第点といったところだろうか。実際のところは、MRI の GC は、不要になったメモリを解放するのに苦労しているんだ。</p>
<p>Ruby VM が起動すると、カーネルによって特定のメモリブロックが割り当てられる。このメモリブロックを使い果たすと、カーネルから追加のメモリを割り当ててもらわねばならない。</p>
-<p>Ruby の GC にまつわる数多くの課題(単純なアプローチやディスクの断片化など)のせいで、VM が割り当てられたメモリブロックを解放してカーネルに返すことができる機会はなかなかない。そのため、Rub
y プロセスのメモリ使用量は時間の経過とともに増加いく傾向にあるが、縮小していくことはない。となると、Resque の作戦にも意味があるということにある!</p>
+<p>Ruby の GC にまつわる数多くの課題(単純なアプローチやディスクの断片化など)のせいで、VM が割り当てられたメモリブロックを解放してカーネルに返すことができる機会はなかなかない。そのため、Rub
y プロセスのメモリ使用量は時間の経過とともに増加していく傾向にあるが、縮小していくことはない。となると、Resque の作戦にも意味があるということになる!</p>
<p>もし Resque ワーカーが、処理可能になったジョブをただ順番にこなしていった場合、メモリ使用量を適切な状態に抑え続けることはできなくなる。メモリをたくさん使うジョブを処理しはじめたが最後、そ
こで確保されたメモリ、Resque のワーカープロセスが終了するまで確保されたままになってしまうだろう。</p>
<p>大量にメモリを消費した後に処理されるジョブに必要なメモリがごくわずかだったとしても、Ruby プロセスはカーネルにメモリを返すのに手こずってしまうだろう。そうなると、ワーカープロセスのメモリ消
費は時間の経過とともに肥大化していくことはあっても、決して小さくはならない。</p>
<p>fork(2) の力のおかげで、Resque ワーカーは信頼性を高められている。そのため、一定数のジョブを処理したら再起動する、といったことが必要なくなっている。</p>
diff -r -u /file1/OEBPS/appendix2.html /file2/OEBPS/appendix2.html
--- /file1/OEBPS/appendix2.html 2013-12-19 22:44:55.000000000 +0900
+++ /file2/OEBPS/appendix2.html 2013-12-19 22:44:55.000000000 +0900
@@ -14,13 +14,13 @@
<div class="footnote"><p class="footnote">[<a id="fn-unicorn">*1</a>] <a href="http://unicorn.bogomips.org" class="link">http://unicorn.bogomips.org</a></p></div>
<p>何がそんなに大事なのか?Unicorn は可能な限り仕事をカーネルに任せようとする Web サーバだ。Unicorn では Unix プログラミングがふんだんに使われており、そのコードベースには Unix プログラミング
のテクニックがぎっしり詰まっている。</p>
<p>しかも、Unicorn はパフォーマンスも信頼性も高い。Github や Shopify のような Ruby でつくられた巨大な Web サイトでも数多くの採用事例がある。</p>
-<p>だから、もしあなたが本書の内容に刺激を受けて、Ruby による Unix プログラミングについてもっと詳しく学びたいと思うなら、Unicorn の奥底まで潜ってみたほうがいい。きわめて困難を伴う冒険になるか
もしれないが、より深い理解と新しい着想を得られるはずだ。</p>
+<p>だから、もしあなたが本書に刺激を受けて、Ruby による Unix プログラミングについてもっと詳しく学びたいと思うなら、Unicorn の奥底まで潜ってみたほうがいい。きわめて困難を伴う冒険になるかもしれ
ないが、より深い理解と新しい着想を得られるはずだ。</p>
(以下略)
差分の表示のされ方はお使いのdiffコマンドによって異なります。
epdiffのしくみ
単純にテンポラリディレクトリにEPUBファイルを展開してdiffを取っているだけです。
docdiff辺りを使うようにすればdiffコマンドも不要になるので何とかしたいところですね……(遠い目)。
オレが代わりに何とかしてやる! という方がいれば、pull requestをお待ちしております。
追記: TTY::Fileを使って差分を表示するようにしたため、diffコマンドもzipコマンドも不要になりました(2021年1月)。