Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

AozoraEpub3 実行中 file not exist エラーに見舞われる #375

Closed
yutotakano opened this issue Dec 25, 2020 · 10 comments
Closed

AozoraEpub3 実行中 file not exist エラーに見舞われる #375

yutotakano opened this issue Dec 25, 2020 · 10 comments

Comments

@yutotakano
Copy link

yutotakano commented Dec 25, 2020

まず掲示板ではなくこちらに書き込んでいることをお許しください。海外にいるためか、掲示板に投稿しようとしたところ「逆引きできないホストからの書き込みは禁止されています」と言われてしまいました。日本サーバーのVPN使用でも同様です。

Narou.rb のバージョン:
3.5.1

OS のバージョン:
Windows 10 20H2

その他環境情報(任意):

> java --version
java 14.0.1 2020-04-14
Java(TM) SE Runtime Environment (build 14.0.1+7)
Java HotSpot(TM) 64-Bit Server VM (build 14.0.1+7, mixed mode, sharing)
> ruby --version
ruby 2.7.2p137 (2020-10-01 revision 5445e04352) [x64-mingw32]

AozoraEpub3-1.1.1b6Q
Windows Terminal 使用

何が起きたのか:
narou convert 0 の際にFile Not Existエラーが出る。AozoraEpub3のエラーかもしれないが検索しても原因が分からない。
エンコーディングに関係してそうだが細かいことは分からない。パソコン言語は英語で、Windows Terminal表示はUTF-8です。
スクリーンショット
ファイルは確かに存在する。
ファイル

再現方法(何をやったら起こったのか詳細に):
新規インストール後:

narou init
narou download n9669bk (この時ダウンロードは完了するが変換時点でエラー)
(そのあとはnarou convert 0を行うたびにエラー)
@yutotakano
Copy link
Author

やはり何かしらのエンコーディングエラーですね、、、AozoraEpub3を直接呼んでみたところ、ヘルプ画面が完全にクエスチョンマークで埋まってしまいました。こちらはUTF-8で表示しているのですが、元が違うということは自分でコンパイルする必要があるのでしょうか、、、

AozoraEpub3の文字化け

@whiteleaf7
Copy link
Owner

OSの言語が英語だと動かないらしいです(数年前に指摘されたことがありました)

@yutotakano
Copy link
Author

そうですか、ありがとうございます、、、

@yutotakano
Copy link
Author

調べたところ、英語環境ではJavaプログラムへASCII以外の引数がそもそも渡せないらしいです。20年ほど前からバグとして申請されていますが全く相手にされてないようです。

代わりにですが、https://blogs.osdn.jp/2020/05/20/java-unicode.html こちらのブログでexewrapを使用してEXEに変換したら日本語の引数も受け入れるようになったということが書かれていたので早速やってみたところ、成功いたしました。

> exewrap -a "-Dfile.encoding=UTF-8" -M AozoraEpub3 AozoraEpub3.jar
> AozoraEpub3.exe -enc UTF-8 -of -ext .kepub.epub "G:\Documents\Novels\小説データ\小説家になろう\n9669bk 無職転生 - 異世界行ったら本気だす -\[理不尽な孫の手] 無職転生 - 異世界行ったら本気だす -.txt"

成功

呼び出し方が変わるのでローカルでlib/novelconverter.rbを編集しようとおもったのですが、なにせRuby経験皆無なもので、インストールされたGemの改変方法が分からない状態です。もし差支えなければ今後誰かが同じ問題にぶつかった時のためも考え、ここで教えてもらってもよろしいでしょうか。

@takotakot
Copy link

@yutotakano まず、narou がどこにインストールされたかを探す必要がありそうです。gem env で分かるかもしれません。

narou/lib/novelconverter.rb を探し、実行部分を改変する必要があります。

narou/lib/novelconverter.rb

Lines 174 to 178 in 2acbf46

command = %!java #{java_encoding} -cp #{aozoraepub3_basename} AozoraEpub3 -enc UTF-8 -of #{device_option} ! +
%!#{cover_option} #{dst_option} #{ext_option} #{yokogaki_option} "#{abs_srcpath}"!
if Helper.os_windows?
command = "cmd /c #{command}".encode(Encoding::Windows_31J)
end

java のコマンド呼び出しをしているのですが、なんとなく読めますでしょうか。

ここを AozoraEpub3.exe の呼び出しに変えれば、ひとまずは動くと思います。(ここまで成功した時点で共有して頂くのが良さそう?)

上手くいきそうなら、「java 経由か、exewrap 後かを切り替えるフラグ」みたいなのを用意して頂いて、フラグによって分岐したコードを書ければ取り込みまでいけると思います。

横から失礼しました。

@yutotakano
Copy link
Author

yutotakano commented Dec 26, 2020

gem envありがとうございます!C:\Ruby27-x64\lib\ruby\gems\2.7.0\gems\narou-3.5.1\lib\novelconverter.rbにて発見できました。場所的にgem updateの際に上書きされそうですが、その時はその時でまた改変しますね。

- command = %!java #{java_encoding} -cp #{aozoraepub3_basename} AozoraEpub3 -enc UTF-8 -of #{device_option} ! +
- %!#{cover_option} #{dst_option} #{ext_option} #{yokogaki_option} "#{abs_srcpath}"!
+ command = %!AozoraEpub3.exe -enc UTF-8 -of #{device_option} ! +
+ %!#{cover_option} #{dst_option} #{ext_option} #{yokogaki_option} "#{abs_srcpath}"!

これで無事narou convert 0ができるようになりました!
成功です!

切り替えのフラグについてですが、数年間需要が無かったものですからまずは @whiteleaf7 さんに判断を任せたいと思います。exewrapで包むという過程がエンドユーザーに増えるので、導入がちょっと難しくなる懸念があります(まぁそもそも不可能だったので可能なだけいいのですが)。フラグが別にあっても問題無いようでしたらフォークでちょっと弄ってプルリクしてみますね。

@takotakot
Copy link

@yutotakano 素早い…良かったですね。
@whiteleaf7 init 処理の追記を何か考えるか、narou setting convert.epub-use-exe (初期 false 変数)のようなものを増やしていただくのはいかがでしょうか。

@whiteleaf7
Copy link
Owner

java コマンドを偽装すれば良いと思いますが。

@whiteleaf7
Copy link
Owner

whiteleaf7 commented Dec 26, 2020

windows は bat ファイルを拡張子省略で実行できるので、パスが通ってるところに java.bat を作ってその中で AozoraEpub3.exe を実行すれば良いと思われます
(Narou.rb を実行するときだけ偽装したいだろうと思うので、narou コマンドも bat 作ってそこでパス通せばいいんじゃないかなと)

@yutotakano
Copy link
Author

あ!凄いです思いつきもしませんでした!
やってみたところ、Gemに変更を施すことなく問題なく使用できることを確認できました、ありがとうございます。

AozoraEpub3のあるフォルダにて、java.bat (または java.cmd)を作成、中身は以下の通りです。

@echo off
rem 最初の 0「java」 1「-Dfile.encoding」 2「UTF-8」 3「-cp」 4「AozoraEpub3.jar」 5「AozoraEpub3」 を消す。イコールサインはスペースとみなされる。
shift && shift && shift && shift && shift
rem 残りを全てくっつけるためのループ
set params=%1
:loop
shift
if [%1]==[] goto launch
set params=%params% %1
goto loop
:launch
AozoraEpub3.exe %params%

narouの時だけ偽装ということについては今のところ特に問題ないのでとりあえず見送らせていただきます。

@whiteleaf7 さんも @takotakot さんも、本当に夜分遅くまでありがとうございました!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

3 participants