言語ゲーム

とあるエンジニアが嘘ばかり書く日記

Twitter: @propella

Lambda the Ultimate を Kindle で読む

Kindle ユーザに人気のツールに Calibre というのがあります。これは iTune みたいに使う物で、電子書籍のバックアップやフォーマット変換を行う物です。一見初心者にも優しい見かけをしていて、iTune みたいな使い方をしても良いのですが、このツールに本気を出させようと思うと Python を覚えた方が良いです。Python 無しの Calibreelisp 無しの emacs みたいな物です。Python を使えば Calibre の変態的に強力なパワーを味わう事が出来ます。という事で、そのさわりとしてブログを Kindle 等の e-book で読めるように変換するというのをやります。

CalibrePython をつかうにはコマンドラインツールをインストールする必要があります。Mac では Calibre 起動後、Preferences - Advanced - Install command line tools をクリックすると各種コマンドが使えるようになります。例えば calibre-debug というのは Calibre 内臓の Python コマンドで、Calibre APIPython から直接操作出来ます。

ここでは、ebook-convert コマンドを使います。ebook-convert は電子書籍のフォーマット変換に使うツールですが、入力にレシピファイルというのを使うと、ウェブからブログをダウンロードして好みの電子書籍に変換します。レシピファイルは Python プログラムで次のような物です。

# lambda_the_ultimate0.recipe

from calibre.web.feeds.news import BasicNewsRecipe

class LambdaTheUltimate(BasicNewsRecipe):

    title          = u'Lambda the Ultimate' # ブログの名前
    oldest_article = 7                      # 何日前の記事まで取得するか
    max_articles_per_feed = 2               # いくつ記事を取得するか

    # ブログの RSS フィード
    feeds          = [(u'Lambda the Ultimate', u'http://lambda-the-ultimate.org/rss.xml')]

これを lambda_the_ultimate0.recipe という名前で保存して次のように ebook-convert コマンドを使うと lambda_the_ultimate0.mobi というファイルが出来ます。これを Kindle にコピーすれば読めます。ebook-convert はまず feeds で指定したフィードを取得し、それぞれの記事をダウンロードして連結し電子書籍ファイルを作ります。ここではテストなので、2 件だけ取得するようにしてみました。

$ ebook-convert lambda_the_ultimate0.recipe lambda_the_ultimate0.mobi -d debug

ebook-convert レシピファイル 出力ファイル のように使いますが、-d オプションを使うと変換中 HTML ファイルが見れて便利です。例では debug ディレクトリに途中経過が保存されます。

lambda0

ただし!これが結構読みにくいです。というのもブログの記事は普通パソコンで読むように作ってあるので、Kindle の小さな画面では記事の周りのメニューやなんかが邪魔だからです。そこで工夫をして、余分な HTML を削除します。

# lambda_the_ultimate.recipe

from calibre.web.feeds.news import BasicNewsRecipe

class LambdaTheUltimate(BasicNewsRecipe):
    title          = u'Lambda the Ultimate'
    oldest_article = 60
    max_articles_per_feed = 50
    no_stylesheets = True

    remove_tags    = [{'name': 'div', 'attrs': {'class': 'form-item'}},
                      {'name': 'div', 'attrs': {'class': 'breadcrumb'}},
                      {'name': 'h2', 'attrs': {'class': 'title'}},
                       {'id' : ['footer']}]

    keep_only_tags = [{'id' : ['main']}]

    feeds          = [(u'Lambda the Ultimate', u'http://lambda-the-ultimate.org/rss.xml')]

remove_tags を使って削除したいタグを指定します。ここではコメント欄などを削除しています。また、keep_only_tags を使うと、そのタグの中だけ取り出す事が出来ます。Lambda The Ultimate はテーブルでレイアウトされているのでテーブルの中身だけ取りたい時に便利です。あと、スタイルシートがあるとインデントがきつすぎて読みにくかったので no_stylesheets で削除しました。

$ ebook-convert lambda_the_ultimate.recipe lambda_the_ultimate.mobi -d debug

lambda

おお、これで随分きれいになった。

ここではマニアックにコマンドラインだけで作りましたが、一応 GUI からでも作れます。Fetch news - Add custom news source の中の Switch to Advanced mode でレシピを登録して、Fetch news - Schedule news download の Custom から登録したレシピを選び Download now をします。まあでもコマンドラインの方が簡単でしょう。詳しくはレシピの作り方 http://calibre-ebook.com/user_manual/news.html をご覧下さい。