宮川さんPodcast ep6、KDP での本の作り方

第6回は伊藤直也さん (@naoya_ito) をゲストに迎えて、Kindle 出版、GitHubGoogle Reader などについて話しました。

ほぼ週一くらいで配信されている @miyagawa さんの Podcast、第6回目のゲストで出演しました。第1回目に続き、これで自分は2回目ですね。だんだん往年のいいともみたいになっていくのだろうか。

それはともかく、内容は先日だした Kindle入門 Chef Solo に絡めて KDP (Kindle Direct Publishing) の話、それから Google Reader にまつわる RSS の話に関して。二人とも KDP での出版経験があるのと、RSS に関しては昔二人で本を書いたりした当時のホットな話題でお互い良く知ってるしというので、面白く話せました。

Chef 本が実際 KDP でどのくらいダウンロードされているかとか、KDP の実際のところみたいな話も交えていますのでその辺りが気になる方も是非聴いてみてください。ちなみにいっとき Kindle 総合 (技術書じゃないですよ) ランキングで 2位になりました。

http://cdn.bloghackers.net/images/20130321_125721.png

KDP で本を作るにあたっては、@miyagawa さんに Plack Handbook を作ったときのやり方を教えてもらったのですが、その際いっしょにもらった変換スクリプトを公開しても構わないと Podcast 内で許可をいただいたので、Podcast へのトラフィック誘導も含め以下 KDP How To を詳解いたします。

Kindle 向け書籍ができるまで

大まかな流れとしては

  • Markdown で原稿を書く
  • 変換スクリプトで html として出力する
  • その html を入力に calibre についてくる ebook-convert で epub に変換する
  • Sigil で html 目次を追加する
  • 実機で確認した後、Kindle 管理画面からアップロード

という作業になります。

KDP では epub 以外にもいくつかのフォーマットをサポートしていますが、自分は無難に epub を選択しました。

Markdown で原稿を書く

原稿は Markdown で書きました。最近は技術評論社向けの雑誌原稿なんかも Markdown で書いてます (Markdown to Inao - naoyaのはてなダイアリー とか参照) が、書籍や雑誌原稿のために使う記法は見出し、リスト、コードブロックとあとちょっとくらいなので Markdown で十分に事足りる。

## #0 はじめに

近頃のクラウドの本格的普及もあってか、サーバー管理の自動化に注目が集まっています。[Chef](http://www.opscode.com/chef/) はそのツール/フレームワークのひとつです。

Chef への注目が集まっているにも関わらず Chef に関するある程度まとまった体系的な情報はまだまだ不足している、というのが現状です。また Chef は実際には同類のツールに比べてシンプルで分かりやすいのですが、公式ドキュメントがあまりにしっかりと書かれすぎていることもあって「はじめの一歩」としてどの辺りを知ればいいのか、つまり「普通に使う分にはこの程度知っていればOK」というのがどの辺りなのかを掴むのが難しい・・・というのが筆者の個人的な印象です。

Markdown のプレビューには自分は marked という OSX のアプリを使ってます。作りがミニマムで、ファイルの更新を検知してリロードしてれたり、シンタックスハイライトがあったりと使い勝手がよろしい。

http://cdn.bloghackers.net/images/20130321_115312.png

marked は有料アプリですが、フリーのがいいなという人は Kobito なんかもリアルタイムプレビューの機能を持っているのでいいと思われます。

作ったファイルはもちろん git で管理して、github に push。

http://cdn.bloghackers.net/images/20130321_115558.png

自分は Plack Handbook に倣い章ごとにファイルを分割して管理しました。

変換スクリプトで html として出力する

できあがった原稿は Markdown を適当な Markdown パーサーで html にする。この html を calibre に渡して epub を作ります。ここは @miyagawa さんからもらったスクリプトをほぼそのまま使いました。Markdown parser の redcarpet が必要です。

#!/usr/bin/env ruby
# -*- coding: utf-8 -*-
# by Tatsuhiko Miyagawa

require 'redcarpet'

HEADER = <<HEAD
<html>
<head>
<title>入門Chef Solo - Infrastructure as Code</title>
<meta name="Author" content="Naoya Ito">
<meta name="DC.date.publication" content="2013-03">
<meta name="DC.rights" content="2013 Naoya Ito">
<link rel="stylesheet" href="styles/epub.css" type="text/css" class="horizontal" title="Horizontal Layout" />
</head>
<body>
HEAD

def munge(html)
  html.gsub /<h2>/, '<h2 class="chapter">'
end

markdown = Redcarpet::Markdown.new(Redcarpet::Render::HTML, :autolink => true, :space_after_headers => true)
STDOUT.write HEADER
STDOUT.write munge(markdown.render(ARGF.readlines.join ''))
STDOUT.write "</body></html>\n"

h2 タグに class="chapter" みたいなクラスが振ってあるのは calibre 向けに html を作る場合に html のタグで適当なメタデータを指定しておくと本のタイトルや目次を自動で出力してくれるそれを利用するため。

calibreepub に変換

calibreebook management ツールだそうです。変換機能だけでなく、作成したファイルの管理 や Kindleバイスへの転送なんかもやってくれる。

が、GUI でちまちまちファイルを入力してやるのは面倒。calibre についてくる ebook-convert という CUI 向けのコマンドがあるのでこれを使って rake でビルドします。ついでなので mobi ファイルも作っちゃう。

# Rakefile
task :default => "book"

task book: [:mobi, :epub]

file html: Dir.glob('ja/*.md') do |task|
  sh "bin/export_html.rb #{task.prerequisites.join(' ')} > chef-solo-book.html"
end

task mobi: %w[html] do
  sh "ebook-convert chef-solo-book.html chef-solo-book.mobi"
end

task epub: %w[html] do
  sh "ebook-convert chef-solo-book.html chef-solo-book.epub --no-default-epub-cover"
end

task :clean do
  sh "rm -f chef-solo-book.html *.epub *.mobi"
end

できあがったファイルは calibreGUI なり Dropbox なりなんなりで KindleiPad なんかに転送すれば普通に電子書籍として読めるのでそれで実際の見た目や改ページが正しく行われてるかなんかを確認していきます。

Sigil で HTML 目次を作る

ここまでで epub は完成なのですが、Kindle for iPhoneKindle for iPadcalibre が作った目次をなぜか無視してしまう。iOS 向けには html で目次を作るといいとのことだったので、Sigil という epub エディタを使って目次を生成してやる。これはメニューから選ぶだけ。

本当はここも自動化したいけどいまのところ、そこまではやれていない。

あとはできあがった epub ファイルを KDP にアップロードすれば OK。ちなみに KDP にアップロードすると確認用の mobi ファイルを生成してくれるので最後の最後の確認はそれを使ってやるといいです。

KDP バッドノウハウ

そのほか細かいのがいろいろとあったので思いついたことを列挙しておきます。

  • KDP で出版するとどうやら KDP 独自のスタイルが当たるようで、インデントや行間なんかの幅が変わったりする。結構読みやすい。ebook-convert で直接生成したままのではちょっと行間詰まりすぎ、みたいな印象を抱くと思うけど KDP で mobi を作ると良い感じになる前提でいればよい
  • Kindle Paperwhite で動作確認していると、更新したファイルのせいで端末内での記憶位置そのほかがぶっこわれるときがある。そういうときは一端端末から書籍を削除する
  • 生成した epub が valid かどうかは https://code.google.com/p/epubcheck/ この辺を使うと良いと思う。書いてて思ったけどビルドフローに組み込んでしまえばいいかも
  • Podcast 内でも触れたけど、ファイルの更新を頻繁にやる前提でいる場合、KDP はそういうものではないので注意。ファイルの更新は自動ではユーザーに通知されないし、自動で更新されたりもしない。
  • またファイルをアップロードして実際にそれが反映されるまでに時間がかかる。その間、iOS版は Amazon.co.jp からの転送が不可になる
    • ファイルを更新しなくても KDP に入力した description の typo を直したという程度でも同様。Publish するたびに数時間 iOS 版が実質買えなくなる
  • 技術書という性格もあって実際に出してみると PDF にしたいとか他の形式で読みたいという声が結構多かった。DRM フリーにしておけばその辺の再利用はユーザーに任せることができるので良いと思う。もちろん選択は著作権者の自由ではありますけど。DRM フリーかどうかは KDP のアップロード画面で選べる
  • epub の中にちゃんと思った通りにファイルが含まれているかどうか、なんてのは Sigil でも確認できるし Emacs (自分のは 24) の dired で epub を開くと中身をファイラで確認できた
  • Unicode 未定義な文字とかを使うと KDP で iOS 版が生成されないという事故があったりするらしい。実際のところ、ビルドがエラーになっているのか先に述べたファイル更新中で iOS 版がダウンロードできないだけなのか・・・といった事情は確認の術がない。余計なことで悩まないように、特殊な文字は必要がないなら使わないようにするのが懸命
  • 表紙は指定しないと KDP が自動で生成してくれるとあったけど、自分の場合書名が長かったのか何なのか、ずっと表紙がない状態だった。「画像はありません」のまま総合2位でランキングに居座るという胸熱な結果となりました。結局 @nagayama に作ってもらいました。
  • 表紙があると、「人気」とか「新着」というアイコンが書影に添付されて Amazon.co.jp の検索結果に出るようになって目も引くので、売り上げ的にもあったほうがいいと思います

以上、KDP How To でした。Chef 本へのレビューもお待ちしてます!

入門Chef Solo - Infrastructure as Code
伊藤直也 (2013-03-11)
売り上げランキング: 36