今回の記事では、Narou.rbというアプリで「小説家になろう」の小説をダウンロード&縦書きレイアウト向けにテキスト整形し、EPUB化してKindleで読むということにトライする。これ、以前からやりたかったのだがアプリの設定手順がかなり大変そうなのでずっと保留していたのだ。
使用環境はMacBookAir (M1)。普段あまり使わないコマンドまわりの知識について「このコマンドを打てばOK」ではなくて、自分が納得いくまで調べたのでとても長い記事になってしまった(約22,600字)が、その分、Java・Ruby環境・brewコマンドについて復習したいときにも役にたつ内容になった。
まずは、Narou.rbのWebサイトを見てみる。
https://github.com/whiteleaf7/narou/wiki
このアプリは小説家になろうなどの投稿サイトで公開されている小説の管理、及び電子書籍データへの 変換を支援します。縦書き用に特化されており、横書きに最適化されたWEB小説を違和感なく縦書きで読むことが出来るようになります。 また、校正機能もありますので、小説としての一般的な整形ルールに矯正します。(例:感嘆符のあとにはスペースが必ずくる)
小説家になろうを含めて、下記のサイトに対応しています。
・小説家になろう http://syosetu.com/
・ノクターンノベルズ http://noc.syosetu.com/
・ムーンライトノベルズ http://mnlt.syosetu.com/
・ミッドナイトノベルズ http://mid.syosetu.com/
・ハーメルン https://syosetu.org/
・Arcadia http://www.mai-net.net/
・暁 http://www.akatsuki-novels.com/ (※300話以上ある作品は未対応)
・カクヨム https://kakuyomu.jp/
簡単にまとめると以下の様なことが出来ます。
1.小説投稿サイトから小説をダウンロード
2.ダウンロードした小説の更新管理(新規投稿、改稿された既存話をダウンロード)
3.縦書きで読みやすい様にがっつり変換(校正、整形)
4.AozoraEpub3、kindlegenによるEPUB/MOBI出力
5.接続されている端末に送信
1~5はすべて自動化されていて、利用者がほとんど操作をしなくても良いように設計されています。(各コマンドを使うことにより、ダウンロードのみ、変換のみ、送信のみ、なども可能です)
■必須ツール
・Ruby 2.7 以上(rbenvやrvmで最新を入れることを推奨)
・AozoraEpub3
・Java8以上
・kindlegen 2.8以降(kindlegen の公式からの配布が終了してしまいました。当面の間、上記に書いてある様に Kindle Previwer の中から取り出せるので、それを使用してください。(Kindle Previwer で直接変換できる対応を今後導入予定))
おまけ:Dockerイメージを用意したので、分かる人はそっちのほうが簡単です。
https://hub.docker.com/r/whiteleaf/narou
→Linux 版の kindlegen が手に入らなくなってしまったため、動きません。
Docker版が使えなくなってしまったのが残念だ。かなり大変そうだが、Mac上に環境構築を試みる。
(Ruby, Java, AozoraEpub3, kindegen)の4つと、Narou.rbを加えると全部で5つの資材が絡んでややこしいので構成を整理する。
(Ruby, Narou.rb):Rubyプラットフォーム上でNarou.rbが動作する。「小説家になろう」から小説をダウンロードして縦書き整形し、テキストファイルを出力するまでをやってくれる。
(Java, AozoraEpub3, kindegen):Javaプラットフォーム上でAozoraEpub3が動作する。AozoraEpub3は単体でEPUBファイルを出力し、kindlegenをインストールするとKindle用のmobiファイルも出力できる。
処理の順番は上記の通りなのだが、「Narou.rbアプリはインストール時にAozoraEpub3用の構成ファイルを書き換える」ことからインストールの順番は以下の通りとなる。
■1.Javaインストール
■2.AozoraEpub3インストール
■3.kindlegenインストール
■4.Rubyインストール
■5.Narou.rbインストール
■6.まとめ
ここから、手順の詳細。
■1.Javaインストール
いきなりだが、情報が錯綜していてこの手順が一番苦労した。
Narou.rb公式ページの手順説明だと「Java8 をインストールします。」とされていたので、最初はその手順通りにJava8をインストールしたのだが、Narou.rbがAozoraEpub3を使ってEPUBを生成するところでエラーになってしまい失敗した。原因はたぶん、AozoraEpub3(本家版)の代わりに「AozoraEpub3改造版」を使用したこと。javaアプリはビルド環境と実行環境のjavaバージョンを合わせる必要があり、本家版はJava8、改造版はJava21を推奨している。
公式ページの手順通りにAozoraEpub3を使用したかったのだが、本家版の配布ファイル(AozoraEpub3-1.1.0bXX.zip)のダウンロードページが404エラーで見られなくなっており、開発が継続しているブランチ版の「AozoraEpub3改造版」を使わざるを得ない。まあ、改造版は本家版のバグを修正したものなのでたぶんこっちの方が優れているのだが。
AozoraEpub3 公式ページ
https://w.atwiki.jp/hmdev/
【説明】
青空文庫の注記入りテキストファイルをePub3ファイル(zip圧縮)に変換するツールです。
・青空文庫txtのテキスト+画像ファイル(またはzip/rar)のePub3変換
・Web小説のHTMLを取得して青空文庫txt形式で保存→ePub3変換
・画像zip/rarを画像ePub3に変換
が可能です。
以下が、「AozoraEpub3改造版」のWebページ。作者は「kyukyunyorituryo(急急如律令)」さん。
(Qiita)AozoraEpub3の改造
https://qiita.com/99nyorituryo/items/93b37f5f67ed30f87332
(GitHub)kyukyunyorituryo / AozoraEpub3
https://github.com/kyukyunyorituryo/AozoraEpub3?tab=readme-ov-file
【概要】
AozoraEpub3とは青空文庫形式のテキストをEPUBに変換することができるソフトウェアである。ただ、このソフトウェアはEPUBの規格にきちんと対応していない部分が残っている。その部分の修正をどのようにしているかを書いています。JAVAで書かれたオープンソースのプログラムなので、JAVAがわかれば改造できる。そのためにEPUB規格に沿うように改造しています。EPUBの種類が色々ありますが、電書協EPUBをもとにEPUBの規格を書いていきます。
改造版AozoraEpub3では電書協EPUBに対応したEPUBを作成します。
【動作環境】
Java 21 以降のOpenJDKでJava 21を推奨 https://adoptium.net/temurin/releases/
Javaライセンスの問題からAdoptiumでビルドすることにします。Oracle JAVAまたは、OpenJDKを利用してください。AdoptiumのJavaではインストール時にパスが通るので使いやすい。
AozoraEpub3改造版の動作環境はOpenJDKのJava 21を推奨!
このあたりでJavaのバージョンの話を押さえておいた方がよい。古いバージョンで開発されたJavaアプリが、より新しいバージョンのJava環境で動作する可能性はあるが、その保証はないため、動作させたいJavaアプリに応じたバージョンのJava動作環境を用意してやる必要がある。
Javaの最初のリリースは1996年でバージョンは1.0、2024年8月時点の最新バージョンは22。2018年以降は1年に2回のペースでメジャーバージョンのリリースが行われている。これだけ多くのバージョンがあると、全てのバージョンを平等にメンテナンスしていくことは難しいので、LTS: Long Term Support版というものがあり、LTS版に選ばれたバージョンはそうでないバージョンのJavaに比べて長期間サポートされる。LTSではないJavaバージョンは、それが最新バージョンである半年間だけが保証期間で、実質的にベータリリースのような扱いと考えても間違いではないと思う。
2024年8月現在、LTS版でサポート期限がまだ到来していないバージョンは以下の通りで、原則的に現行アプリはこのどれかのバージョンで動作保証をしている。
【LTS版Javaバージョンと、延長サポート期限】(Wikipediaより)
・Java8:2030年12月
・Java11:2032年1月
・Java17:2029年9月
・Java21:2031年9月
なお、このあたりのJavaのバージョンの話は以下の記事が分かりやすかった。
「Javaのバージョンの取り扱い(2023年6月) / 日々常々(はてなブログ)」
https://irof.hateblo.jp/entry/2023/06/07/023118
今回はせっかくなので、今後異なるバージョンのJavaアプリを使いたい場合に備えて、上記4つのJavaをインストールし、自由に切り替えられるようにする。
Javaのバージョンの話の次はディストリビューションについての話を押さえる必要がある(ああ面倒くせえ)。Javaディストリビューションについてはこの記事が分かりやすかった(半分くらいしか読んでないけど)。
「2022年のJavaまるわかり!最新バージョンからJavaを取り巻く環境まで / 杉山貴章(gihyo.jp)」
https://gihyo.jp/article/2022/07/java2022-0701
↑画像を拝借。後述するがMacでJavaをインストールするときには"temurin@8"とか"openjdk@21"という風に指定する。"temurin@8"はTemurinディストリビューションのバージョン8、"openjdk@21"はおそらくOracleのOpenJDKのバージョン21ということになるのだろう。
ここまで理解してやっと、「Javaのインストール」が、「Javaの、どのバージョンを、どのディストリビューションでインストールする」という解像度で話をできるようになったのでJava(Java JDK)のインストールに話を進めたいのだが、そのまえにHomebrewについての基本的な知識を押さえておく(本当に面倒くせえ)。
HomebrewはmacOS上で動作するパッケージ管理ツールで、CUI系のツールはこれを使ってインストールするようになっていることが多い。今回の場合、JavaとRubyをHomebrewでインストールする。私は以前に別のアプリのインストールで使ったのでHomebrewはインストールされているはず。まずはHomebrewのインストールを確認(バージョン確認)、Homebrew自体のアップデート、そして再度バージョン確認をする。
$ brew -v Homebrew 4.0.5 $ brew update ==> Updating Homebrew... Updated 2 taps (Homebrew/core and Homebrew/cask). ==> New Formulae crow dwarfs packcc ==> New Casks truetree $ brew -v Homebrew 4.3.17
「brew list」コマンドで、自分がHomebrewでインストールしたパッケージの一覧を見ることができる。
$ brew list ==> Formulae autoconf iperf3 openssl@3 readline ca-certificates libyaml pkg-config ruby-build handbrake m4 telnet
確かに、過去に入れた覚えのあるものが入ってる。
「brew search
$ brew search openjdk ==> Formulae openjdk openjdk@17 openjdk@8 openjph openjdk@11 openjdk@21 openj9 openvdb ==> Casks adoptopenjdk microsoft-openjdk@11 openttd microsoft-openjdk microsoft-openjdk@17
結果を見ると、これからインストールしようと思っているバージョンのOpenJDKが全て揃っている(openjdk@8, 11, 17, 21)。下段の"Casks"のところにはMicrosoftのディストリビューションのバージョン11と17と、adoptopenjdkというディストリビューションも見えている。バージョン表記が無いものは最新バージョンと思われる。
この結果から素直に考えるとOpenJDKを入れようということになるのだが、ここには罠があって、「M1 Macではopenjdk@8は使えない」らしいのだ(下記記事参照)。
「macOS で Java を使う方法 ver. 2022 / もばらぶエンジニアブログ」
https://engineering.mobalab.net/2022/06/06/how-to-install-java-on-macos-in-2022/
ではどのディストリビューションを入れるか。上記記事でおすすめしているのは、AdoptOpenJDKというディストリビューション。ただ、2021年くらいにEclipse Temurinプロジェクトに移管されたらしい。Web上の古い記事では当然これをAdoptOpenJDKと呼称していて、ややこしい事この上ない。それはさておき、Temurinというディストリビューションはお薦めしている人が多いので、これを入れておけば間違いないだろうと思う。"temurin"で検索してみる。
$ brew search temurin ==> Formulae maturin ==> Casks temurin temurin@11 temurin@17 temurin@19 temurin@20 temurin@21 temurin@8
下段の"Casks"のところに、インストールしようと思っているJavaバージョンが全て揃っている(temurin@8, 11, 17, 21)。今回は4つのバージョンを全てこのTemurinディストリビューションでインストールしようと思う。
で、、インストールする前に、上記のSearch結果にも出てきている"Formulae"(Formulaの複数形)と"Casks"の意味について押さえておく(本当に本当に面倒くせえ)。多くの記事ではHomebrewの知識は前提としてコマンドだけが書いてある中で、下記記事ではその基礎知識を非常に分かりやすく解説してくれていてとても助かった。
「Homebrewとは?本質的な価値を解説。何ができる?メリットは? / Proggy.jp」
https://proggy.jp/Homebrew-value/
元々、HomebrewはRuby On Railsというフレームワークに関係するプログラマーのコミュニティで人気が出てメジャーになりました。なので、彼らが開発で必要なCUIのソフトウェアを管理するために主に使われていたようです。徐々にHomebrewの人気が拡大する中で、普通のGUIアプリもこれで管理できたら便利じゃない?って発想になってきたと思われます。ただ、CUIと同じリポジトリに入れるのではなく、Caskというリポジトリにそれらを入れる運用になりました。
また、Caskの使い方の変更点についても言及されている。
以前はCaskを使いたい場合は、Homebrewをインストールするだけでは足りず、
$ brew tap caskroom/cask
というコマンドで、Caskのリポジトリをローカルに持ってくる必要がありました。そして、各アプリをインストールする際も、
$ brew cask install google-chrome
というように、 cask というオプションを指定する必要がありました。
しかし現在は、Homebrewをインストールしただけで、既にCaskのリポジトリもダウンロードされ、インストールする際の cask というオプションも不要になりました。なので、Formulaのソフトウェアと全く同じようにインストールできます。
こういうのがあると、インターネットで調べているときに記事によって紹介されているコマンドが微妙に異なっていて混乱するんだよな。まったく、、疲れる。
さて!いよいよ(temurin@8, 11, 17, 21)のインストールを始める。異なるバージョンの切り替え方法は「jEnv」という管理ツールが便利なようだが、それはあえて使わずに、この人の記事を参考にしてシンプルに環境変数を切り替えて実施するやり方でいく。この方が原理原則が頭に入りやすいから。
「MacでマルチJavaバージョン(Temurin)の切替」
https://zenn.dev/gekal/articles/switch-java-version-in-mac
この記事によれば、インストールコマンドはまずtapコマンドを実行してから、"--cask"というオプションつきで"brew install"することになっている。
$ brew tap homebrew/cask-versions $ brew install --cask temurin21
さっき読んだ記事によればtapコマンドもcaskオプションも不要になったということだったが、よく見るとさっきのGoogle Chromeの例とはtapの後のリポジトリ名が違うが、、どうなんだ?…分からない!のでとりあえずやってしまおう。
$ brew tap homebrew/cask-versions Error: homebrew/cask-versions was deprecated. This tap is now empty and all its contents were either deleted or migrated.
エラーが出た。「このtapは現在は空であり、中身は削除されたか移行された。」と読める。ググってたどり着いたこの記事によれば、
「(Qiita)Macで多様なJavaバージョンとディストリビューションを管理:HomebrewとjEnvの活用」
https://qiita.com/seijikohara/items/56cc4ac83ef9d686fab2
(cask-versionsは)最新バージョン以外のインストールに必要だが、Homebrew/homebrew-caskに統合されたため、導入不要になった
とのこと。また"homebrew-cask"という微妙に違う名称のCaskが出てきたぞ。もう訳がわからないが、さっきのエラーメッセージと合わせて考えると、「tapしないでも使えるCask」に統合されたのだろう。ということは、tapしないでも問題なく、caskオプションも要らないはず。caskオプション抜きでやってみる。
$ brew install temurin@21 ==> Downloading https://formulae.brew.sh/api/formula.jws.json ##################################################################################### 100.0% (ログ中略) 🍺 temurin@21 was successfully installed!
行けた。続いて、他の3つのバージョンをインストールして、"brew list"で確認する。
$ brew install temurin@17 (インストールログ略) $ brew install temurin@11 (インストールログ略) $ brew install temurin@8 ==> Caveats temurin@8 is built for Intel macOS and so requires Rosetta 2 to be installed. You can install Rosetta 2 with: softwareupdate --install-rosetta --agree-to-license Note that it is very difficult to remove Rosetta 2 once it is installed. ==> Downloading https://github.com/adoptium/temurin8-binaries/releases/download/jdk8u422-b05 ==> Downloading from https://objects.githubusercontent.com/github-production-release-asset-2 ##################################################################################### 100.0% ==> Installing Cask temurin@8 ==> Running installer for temurin@8 with sudo; the password may be necessary. Password: installer: Package name is Eclipse Temurin installer: Installing at base path / installer: The install was successful. 🍺 temurin@8 was successfully installed! $ brew list ==> Formulae (表示略) ==> Casks temurin@11 temurin@17 temurin@21 temurin@8
temurin8のインストールの時だけ「ロゼッタ2をインストールする。これは一度インストールすると取り除くのが難しい」と怖い文言が出てきたのがちょっと気になる(結局このロゼッタ2というやつはインストールされたのか?)が、どうやらインストールに成功した模様。…ロゼッタ2の件は怖いので忘れよう。
Javaインストール済みのバージョンの確認のコマンドというやつを実行してみる。
$ /usr/libexec/java_home -V $ /usr/libexec/java_home -V Matching Java Virtual Machines (5): 21.0.4 (arm64) "Eclipse Adoptium" - "OpenJDK 21.0.4" /Library/Java/JavaVirtualMachines/temurin-21.jdk/Contents/Home 17.0.12 (arm64) "Eclipse Adoptium" - "OpenJDK 17.0.12" /Library/Java/JavaVirtualMachines/temurin-17.jdk/Contents/Home 11.0.24 (arm64) "Eclipse Adoptium" - "OpenJDK 11.0.24" /Library/Java/JavaVirtualMachines/temurin-11.jdk/Contents/Home 11.0.2 (x86_64) "Oracle Corporation" - "OpenJDK 11.0.2" /Library/Java/JavaVirtualMachines/jdk-11.0.2.jdk/Contents/Home 1.8.0_422 (x86_64) "Eclipse Temurin" - "Eclipse Temurin 8" /Library/Java/JavaVirtualMachines/temurin-8.jdk/Contents/Home /Library/Java/JavaVirtualMachines/temurin-21.jdk/Contents/Home
んん…なんだァ?バージョン21と17は問題ないけど、バージョン11はarm64とx86_64の両アーキテクチャがインストールされて、バージョン8はx86_64アーキテクチャだけがインストールされている。どこかの記事で「"openjdk@8"はM1非対応だからAdoptOpenJDK8(=Temurin8)を入れる」てな事が書いてあったからTemurinを選んだのに、これじゃ意味無いんじゃ?まあ、今回はJava8使わない予定だから気にしないことにする。
次に、バージョン切り替えのために以下を~/.bash_profileに追記する。
# 各バージョンのJAVA_HOMEを設定 export JAVA_21_HOME=$(/usr/libexec/java_home -v 21) export JAVA_17_HOME=$(/usr/libexec/java_home -v 17) export JAVA_11_HOME=$(/usr/libexec/java_home -v 11) export JAVA_8_HOME=$(/usr/libexec/java_home -v 1.8) # Java Versionの切替エイリアスを設定 alias java21="export JAVA_HOME=$JAVA_21_HOME" alias java17="export JAVA_HOME=$JAVA_17_HOME" alias java11="export JAVA_HOME=$JAVA_11_HOME" alias java8="export JAVA_HOME=$JAVA_8_HOME"
なお、参考にした記事ではこの部分「zshの場合、~/.zshrcに下記のコマンドを追記してください。」と書いてあったのだが、私の環境ではbashシェルを使っていたため、bash用に読み替えた。bashシェルの初期化設定ファイルは.bash_profileと.bashrcがあり、それぞれ「ログイン時にのみ実行」と「対話モードの bash を起動する時に毎回実行」で使い分けるらしいが、あまりイメージできないのでとりあえず.bash_profileを使うことにした。なお、現在のシェルを調べるコマンドとして、以下を使った。
$ echo $SHELL /bin/bash
~/.bash_profileを読み込ませてから、Javaバージョン切り替えの動作確認をする。
$ source ~/.bash_profile TakaBookAirM1:narou_wk taka$ java8 TakaBookAirM1:narou_wk taka$ java -version openjdk version "1.8.0_422" OpenJDK Runtime Environment (Temurin)(build 1.8.0_422-b05) OpenJDK 64-Bit Server VM (Temurin)(build 25.422-b05, mixed mode) TakaBookAirM1:narou_wk taka$ java11 TakaBookAirM1:narou_wk taka$ java -version openjdk version "11.0.24" 2024-07-16 OpenJDK Runtime Environment Temurin-11.0.24+8 (build 11.0.24+8) OpenJDK 64-Bit Server VM Temurin-11.0.24+8 (build 11.0.24+8, mixed mode) TakaBookAirM1:narou_wk taka$ java17 TakaBookAirM1:narou_wk taka$ java -version openjdk version "17.0.12" 2024-07-16 OpenJDK Runtime Environment Temurin-17.0.12+7 (build 17.0.12+7) OpenJDK 64-Bit Server VM Temurin-17.0.12+7 (build 17.0.12+7, mixed mode) TakaBookAirM1:narou_wk taka$ java21 TakaBookAirM1:narou_wk taka$ java -version openjdk version "21.0.4" 2024-07-16 LTS OpenJDK Runtime Environment Temurin-21.0.4+7 (build 21.0.4+7-LTS) OpenJDK 64-Bit Server VM Temurin-21.0.4+7 (build 21.0.4+7-LTS, mixed mode)
ついにJavaがインストールできた!
■2.AozoraEpub3インストール
前述のように、AozoraEpub3は入手できず、AozoraEpub3(改造版)を使用する。
現在の最新版「AozoraEpub3-1.1.1b24Q.zip」をダウンロードしてきてzipを解凍し、「アプリケーション」フォルダにコピーした(/Applications/AozoraEpub3-1.1.1b24Q)。
インストール手順はAozoraEpub3(改造版)のWikiページに従う。
「(GitHub)kyukyunyorituryo / AozoraEpub3:Wiki>インストール」
https://github.com/kyukyunyorituryo/AozoraEpub3/wiki#kindlegenのインストール
Narou.rbとの連携動作の前に、AozoraEpub3単体での動作を確認するため、青空文庫の「吾輩は猫である」の変換をテストする(AozoraEpub3(改造版)公式ページの手順)。
例として青空文庫の「吾輩は猫である」をEPUBに変換する。
下記リンクから、テキストファイルのZIPファイルをダウンロードする
https://www.aozora.gr.jp/cards/000148/card789.html
テキストファイル(ルビあり) zip 789_ruby_5639.zip
次に、コマンドラインでAozoraEpub3を起動する(起動前にJava21に切り替え)。
$ java21 TakaBookAirM1:narou_wk taka$ java -version openjdk version "21.0.4" 2024-07-16 LTS OpenJDK Runtime Environment Temurin-21.0.4+7 (build 21.0.4+7-LTS) OpenJDK 64-Bit Server VM Temurin-21.0.4+7 (build 21.0.4+7-LTS, mixed mode) TakaBookAirM1:narou_wk taka$ cd /Applications/AozoraEpub3-1.1.1b24Q/ TakaBookAirM1:AozoraEpub3-1.1.1b24Q taka$ java -jar AozoraEpub3.jar
AozoraEpub3のウィンドウが立ち上がった。
このウィンドウ下部の白いエリアに先ほどの「吾輩は猫である」のzipファイルをドラッグ&ドロップすると、「変換前確認」ウィンドウが出て、デフォルト設定のまま「変換」を押下すると、1秒ほどで「ダウンロード」フォルダにEPUBファイルが生成された([夏目漱石] 吾輩は猫である.epub(439KB))。ダブルクリックするとアップル純正の「ブック」アプリですぐに読むことができる。綺麗な縦書きレイアウトになっていて、ルビ表示も完璧。全く問題ない。成功だ。
AozoraEpub3の公式ページでは、「小説家になろう」の小説の変換方法も書いてあったのでこれも試す。ブラウザで「小説家になろう」の作品ページを開き、そのURLを先ほどと同様にAozoraEpub3の白いエリアにドラッグ&ドロップするだけ。作品の読み込みには時間がかかった。「異世界に落とされた…」という作品で試したところ、約7分で「変換前確認」ウィンドウが出て、デフォルト設定のまま「変換」を押下すると、1秒ほどで「ダウンロード」フォルダにEPUBファイルが生成された([ほのぼのる500] 異世界に落とされた….epub(2.6MB))。アップル純正の「ブック」アプリで開いてみる。これも綺麗な縦書きレイアウトになっているのだが、一行ごとに改行が挟まれていて読みにくい。20年前のケータイ小説みたいだ。なろう小説ってこういうものなのか?いや違うだろう。なぜなら「小説家になろう」で提供されている「縦書きpdf」は一行ごとに改行が挟まれることはないから。
次に、ブラウザで「Send to Kindle」(https://www.amazon.co.jp/sendtokindle)のページを開いてこれらのEPUBファイルを自分のKindleライブラリにアップロードし、Macの「Kindle」アプリで表示を確認してみる。なお、アップロードには結構時間がかかり、「吾輩は猫である」:約7分、「異世界に落とされた…」:約50分だった。
う〜む、これは…?!「吾輩は猫である」も「異世界に落とされた…」も縦書きレイアウトだったのが横書きレイアウトになっちゃって、同じEPUBファイルとは思えない。「吾輩は猫である」のルビの処理(たとえば、3行目の"到底(とうてい)"の部分の表示も正しくない。どうなってんだ、Kindle?
以前のKindleは「*.mobi」という独自形式の電子書籍ファイルをメインに採用していたが、最近mobi形式のサポート縮小し標準的なEPUBファイルを中心にしていく方針と理解している。その裏付けとして、「Send to Kindle」では下記リリースの通り、mobi形式のサポートを廃止してEPUB形式の方のサポートを残している。それなのにEPUB形式をまともに認識できないのでは困ってしまう。
「(Amazon公式)Kindleライブラリへのドキュメントの送信について」
https://www.amazon.co.jp/gp/help/customer/display.html?nodeId=G5WYD9SAF7PGXRNA
2023年11月より、Send to Kindle for EmailによるMOBIファイルのKindleライブラリへの送信に関するサポートを縮小します。また、iOSまたはAndroid版Kindleアプリ、またはデスクトップ版Send to KindleアプリからのMOBIファイルのKindleライブラリへの送信に関するサポートは終了します。この変更は、すでにKindleライブラリに保存されているMOBIファイルには影響しません。これらは引き続きKindleで読むことができます。MOBIは古いファイル形式であるため、Kindleのドキュメント向け最新機能には対応しません。
もしかしたら、次の手順「■3.kindlegenインストール」は、Kindle独自の電子書籍形式「*.mobi」の生成のためだけではなく、EPUB形式の出力内容もKindle仕様に微修正してくれるのかもしれない。という希望を胸に次の手順に進むことにする。
なお、「■5.Narou.rbインストール」ではNarou.rbがこのAozoraEpub3アプリの中身を書き換えるらしいので、ここでNarou.rb用にもうひとつAozoraEpub3アプリのコピーを用意しておく。つまりこういうことだ。
・/Applications/AozoraEpub3-1.1.1b24Q:単体で使う用
・/Applications/AozoraEpub3-1.1.1b24Q_forNarou.rb:Narou.rbとの連携動作で使う用
■3.kindlegenインストール
インストール手順は前項に引き続きAozoraEpub3(改造版)のWikiページに従う。
まず、Amazon公式ページから「Kindle Previewer」アプリをダウンロードする。
WindowsとMac用で別々のダウンロードリンクが用意されているので、Windows/Mac OSネイティブ動作するバイナリ形式で配布しているのだろう。Linux版は配布されていない。Narou.rbのDocker版イメージが「Linux 版の kindlegen が手に入らなくなってしまったため、動きません。」となっていたのは、このためだ。
「(Amazon公式) Kindle Previewer」
https://kdp.amazon.co.jp/ja_JP/help/topic/G202131170
インストール手順は、ダウンロードしたMac用の「KindlePreviewerInstaller.pkg」をダブルクリックしてインストーラの指示に従うだけで、特に問題なく完了した。「アプリケーション」フォルダに「Kindle Previewer 3.app」が格納されているので、これを右クリックして「パッケージの内容を表示」し、「Contents/lib/fc/bin/kindlegen」が目的の実行ファイルだ。
この実行ファイルをAozoraEpub3のフォルダ直下にコピーする。先ほどの手順で作成した「単体で使う用」「Narou.rbとの連携動作で使う用」の2つのフォルダ両方の直下にコピーする。
・/Applications/AozoraEpub3-1.1.1b24Q:単体で使う用
・/Applications/AozoraEpub3-1.1.1b24Q_forNarou.rb:Narou.rbとの連携動作で使う用
ここで動作確認テストをする。先ほどと同様にAozoraEpub3を実行し、そのウィンドウの「拡張子」の項目をデフォルトの「.epub」から「.mobi+.ebub」に変更し、下部の白いエリアに「吾輩は猫である」のzipファイルをドラッグ&ドロップ、「変換前確認」ウィンドウが出て、デフォルト設定のまま「変換」を押下、1秒ほどで「ダウンロード」フォルダにEPUBファイルとmobiファイルが生成された([夏目漱石] 吾輩は猫である.epub(439KB)/[夏目漱石] 吾輩は猫である.mobi(2MB))。
まずはEPUBの方の見え方を確認してみる。ダブルクリックするとアップル純正の「ブック」アプリが開き、kindlegen導入前と違いがない綺麗な縦書きレイアウトになっていて、ルビ表示も完璧。全く問題ない。ファイルサイズも同一なのでもしかしたら何も変わっていないのかもしれないが、ファイルは上書きしてしまったし、とりあえず「Send to Kindle」でKindleライブラリに転送してみる。ファイル転送の所要時間も約7分で先程と変わらず。そして、Macの「Kindle」アプリでの見え方も先程と変わらず横書きレイアウトになってしまっている。NGだ。
では、同時生成されたmobi形式ファイルの方はどうか?まずはMacローカルでmobiファイル([夏目漱石] 吾輩は猫である.mobi(2MB))を開いてみる。するとなんと、現行の「Kindle」アプリではなく旧バージョンの「Kindle Classic」アプリが開いた。こいつを見るのはかなり久しぶりだ(2年ぶりくらい?)。そして本の表示はというと、ちゃんと美しい縦書きで表示されているし、ルビ表示も問題ない。
ただし、本来やりたかった事は本をMacローカルのKindleで読むことではなく、本をKindleライブラリに追加してiPhone/Mac横断でリジュームしながら読むことだ。
そこで、次はこのmobi形式ファイルを「Send to Kindle」してみた。Amazonの公式リリース通りならもう使えなくなっているはずだが果たして…やはりダメだった。
結局、この手順は丸々無駄だった…。
■4.Rubyインストール
前項までの検証で、すでに本来の目的が達成される見込みはほぼ潰えたのだが、AozoraEpub3でデフォルト設定のまま「なろう小説」を出力した場合のEPUB出力が「20年前のケータイ小説みたい」なレイアウトになってしまう件はNarou.rbが直してくれる可能性があるので、当初の予定通り続ける。
まず、rbenvをインストールする。rbenvとは、「Rubyのバージョン管理を行ってくれるツールで、開発環境に複数バージョンのRubyをインストールし、切り替えることができる」というもの。インストールする前に、rbenvのインストール確認をする。過去にインストールして忘れている可能性があるから。
$ rbenv -v -bash: rbenv: command not found
コマンドがないのでどうやらインストールされていないらしい。次のコマンドでrbenvをインストールする。(最初にインストールしたときのログが流れてしまったので、以下は再実行時の表示)
$ brew install rbenv ruby-build ==> Downloading https://formulae.brew.sh/api/formula.jws.json ##################################################################################### 100.0% ==> Downloading https://formulae.brew.sh/api/cask.jws.json ##################################################################################### 100.0% Warning: rbenv 1.3.0 is already installed and up-to-date. To reinstall 1.3.0, run: brew reinstall rbenv Warning: ruby-build 20240727 is already installed and up-to-date. To reinstall 20240727, run: brew reinstall ruby-build
rbenvのインストール確認をする。
$ rbenv -v rbenv 1.3.0
rbenv バージョン1.3.0がインストールされたことが確認できた。
rbenvの初期化コマンドを、シェルの初期化設定ファイルに書き込み、sourceコマンドで即時実行する。
$ echo 'eval "$(rbenv init -)"' >> ~/.bash_profile source ~/.bash_profile
rbenvでインストール可能なrubyのバージョンを以下のコマンドで確認する。
$ rbenv install --list 3.1.6 3.2.5 3.3.4 jruby-9.4.8.0 mruby-3.3.0 picoruby-3.0.0 truffleruby-24.0.2 truffleruby+graalvm-24.0.2
最新のRuby 3.3.4をインストールして、インストール確認をする。
$ rbenv install 3.3.4 $ rbenv versions * system (set by /Users/taka/.rbenv/version) 3.3.4
この場合、「system」と「3.3.4」の2バージョンがあり、*が付いた「system」が現在有効になっていることを意味する。なお、切り替えコマンドは以下の通り
$ rbenv global 3.3.4
切り替え後のバージョン確認をする。
$ rbenv versions system * 3.3.4 (set by /Users/taka/.rbenv/version)
■5.Narou.rbインストール
以下コマンドでNarou.rbをインストールする。gemとは、rubyにおけるパッケージの事であり、またそのパッケージを管理するコマンドの名前もgemになっている。
$ gem install narou Fetching webrick-1.8.1.gem Fetching unicode-display_width-1.8.0.gem (ログ省略) Successfully installed sinatra-contrib-2.2.4 Successfully installed ffi-1.17.0-arm64-darwin Building native extensions. This could take a while... Successfully installed sassc-2.4.0
次に、Narou.rb用のフォルダを作成し、そこに移動して「narou init」コマンドでそのフォルダをNarou.rb用に初期化する。Narou.rbの公式説明ではパスは「C:¥MyNobel」(Windows)としているが、この名称だと自分が書いた小説のフォルダみたいでわかりづらいので「~/narou_wk」とした。(wkは私がいつも使っている命名規則で、work(作業領域)の意味)
「narou init」コマンドの実行中にAozoraEpub3のパスと行間設定を尋ねられたので「/Applications/AozoraEpub3-1.1.1b24Q_forNarou.rb」を入力、行間設定はオススメの1.8を入力した。
$ cd ~ $ mkdir narou_wk $ cd narou_wk $ narou init narou init .narou/ を作成しました 小説データ/ を作成しました ------------------------------ AozoraEpub3の設定を行います !!!WARNING!!! AozoraEpub3の構成ファイルを書き換えます。narouコマンド用に別途新規インストールしておくことをオススメします AozoraEpub3のあるフォルダを入力して下さい: (未入力でスキップ) >/Applications/AozoraEpub3-1.1.1b24Q_forNarou.rb 行間の調整を行います。小説の行の高さを設定して下さい(単位 em): 1em = 1文字分の高さ 行の高さ=1文字分の高さ+行間の高さ オススメは 1.8 1.6 で若干行間狭め。1.8 だと一般的な小説程度。2.0 くらいにするとかなりスカスカ (未入力で 1.8 を採用) >1.8 (次のファイルを書き換えました) /Applications/AozoraEpub3-1.1.1b24Q/chuki_tag.txt (次のファイルをコピーor上書きしました) /Applications/AozoraEpub3-1.1.1b24Q/AozoraEpub3.ini /Applications/AozoraEpub3-1.1.1b24Q/template/OPS/css_custom/vertical_font.css AozoraEpub3の設定を終了しました 初期化が完了しました! 現在のフォルダ下で各種コマンドが使用出来るようになりました。 まずは narou help で簡単な説明を御覧ください。
ここで、Narou.rbの公式ページの以下の注意書きを覚えておきたい。
AozoraEpub3をアップデートした時の注意
narou init をしたフォルダで、再度 narou init コマンドを実行し、AozoraEpub3 の設定を反映させて下さい。 特に AozoraEpub3 をアップデートした時は、設定ファイル等が初期化されてしまいますので、Narou.rbの設定を反映させるためにもこの作業が必要です。
(narou init コマンドで小説データが削除されることはありません)
Ruby本体をアップデートした時の注意
Narou.rb は Ruby に標準添付されているの RubyGem というアプリケーション管理ツールでインストールされます。Ruby 本体をアップデートした場合、RubyGem の状態もまっさらになりますので、 gem install narou を再度実行し新しく Narou.rb を入れなおす必要があります。小説データ自体は独立したフォルダに保存されているので、Ruby や Narou.rb のバージョンに関係なく扱うことが出来ます。
Narou.rbの初期化が成功したので、Narou.rbのWeb UIを起動してみる。
$ narou web
Narou.rbのWeb UIが起動した。
「異世界に落とされた…」のコード「n0223eu」を入力すると、ダウンロードが始まり、数分で完了した。
続いて、「異世界に落とされた…」の行を選択して「Convert」ボタンを押下すると、すぐにEPUBファイルが出力された([ほのぼのる500] 異世界に落とされた….epub(2.6MB))。出力先は「ダウンロード」フォルダではなくて「narou_wk」だった。
これを「ブック」アプリで開くと、、余計な改行が入っていなくていい感じだ。Narou.rbをインストールした甲斐があった。
■ 6.まとめ
今回得られた成果をまとめる。
・Homebrewの使い方について学習した
・現行の4つのJava LTSバージョン(8,11,17,21)の実行環境をインストール完了、切り替え方法も確立した
・Ruby ver.3.3.4をインストール完了、rbenvという切り替えアプリもインストールしたので、後から異なるRubyバージョンのインストールと切り替えも可能
・AozuraEpub3をインストールした(AozoraEpub3改造版)
・青空文庫から取得した「吾輩は猫である」をAozuraEpub3に入力して綺麗な縦書きEPUBファイルを得た。
・Narou.rbをインストールした
・Narou.rbで「小説家になろう」から作品を取得し、縦書きに整形、ozuraEpub3に入力して綺麗な縦書きEPUBファイルを得た。
・kindlegenをAozoraEpub3のフォルダに格納してmobiファイル出力を得たが、mobiファイル形式はすでにサポート終了していて、Kindleライブラリにアップロードすることができないので意味がなかった。
・縦書きEPUBファイルをMacのKindleアプリで開くと横書き表示になってしまう
「縦書きEPUBファイルをMacのKindleアプリで開くと横書き表示になってしまう」について追加で調べた。すると、以下の記事を発見。
「(note)iOSのKindleでepubを縦書き・ルビ表示する / Atsu1166」
https://note.com/atsu1166/n/nae986ab404e7
自炊した縦書き&ルビepubをSendToKindleすれば、Kindle Oasis 第8世代では、普通に読めるのに、iPhoneとiPadでは、ナーンと横書き・ルビなし表示に変換されてしまうのだ、トホホ。ところが、Kindle専用デバイスとAndroidデバイスのKindleアプリではちゃんと表示されるらしいのだ、おいおい、AmazonからのAppleへの嫌がらせじゃん
縦書きEPUBが横書きで表示されてしまうのは、MacとiOSの「Kindle」アプリの不具合のせいだったのか…。ここまでの手順でKindleライブラリに追加済みのEPUBファイルを、Kindle Fire HD 10のKindleアプリで開いてみた。
「小説家になろう」の「異世界に落とされた…」も、青空文庫の「吾輩は猫である」も、Appleの「ブック」アプリで開いた時と同様の綺麗な縦書きレイアウトで表示された。MacやiPhoneで読めないのは不便だが、それだけのためにCSSをチューニングしたEPUBを作成するほど、「小説家になろう」や青空文庫のヘビーユーザーではないので、今回はここまでとする。