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

graphロジックの分離とplantumlのサポート #1008

Merged
merged 1 commit into from
May 15, 2018
Merged

Conversation

kmuto
Copy link
Owner

@kmuto kmuto commented May 13, 2018

builder.rbのgraphロジックを扱いやすいように変更してみるのと、platnuml記法のサポート。

  • Windowsでも実行可能なようにできるだけ一時ファイルを作成(拡張する人がやりたければ標準入力で行うことも可能)
  • graph_描画エンジン の任意の名前のメシッドを呼び出すように。id、保存先ファイルパス、//{〜//}内のアンエスケープ済み文字列、一時ファイルパス を引数とする。idは単にエラー時の参照用。メソッドは「保存先ファイルパス」を返す(.pdfじゃなくて.epsで返したいときなどのため)
  • plantumlはカレントまたはCLASSPATH環境変数範囲にplantuml.jarがあることを前提、呼び出しコマンドも「java」であること前提

system()を使う限りエラー時にstderr内容が取れないのが辛いところ。systemuが標準に入ってくれないものか…(gemはいやだ)。
コマンドパスや引数などをyml指定するというのも考えたのだが、引数パースや、Windowsを考えると厄介そうなので、そこまでこだわる人はreview-ext.rbで適当に上書きしてくれるほうがよさそうと判断した。

@kmuto
Copy link
Owner Author

kmuto commented May 13, 2018

例文

= GRAPH
//graph[graphviz][graphviz][GraphVizの例]{
graph g{
    "Hello World"
    }
//}

//graph[gnuplot][gnuplot][Gnuplotの例]{
# Sample
set size ratio -1
set samples 170
set zeroaxis
set noxtics
set noytics
set noborder
set polar
plot [-4*pi:4*pi] [-8:10] [-8:6] 1.19**t notitle
//}

//graph[blockdialog][blockdiag][Blockdiagの例]{
blockdiag {
   A -> B -> C -> D;
   A -> E -> F -> G;
}
//}

//graph[aafigure][aafigure][AAFigureの例]{
    ---> | ^|   |
    <--- | || --+--
    <--> | |V   |
 __             __
|  |__  +---+  |__|
        |box|   ..
        +---+  Xenophon
//}

//graph[plantuml][plantuml][PlantUMLの例]{
@startuml

[*] --> State1
State1 --> [*]
State1 : this is a string
State1 : this is another string

State1 -> State2
State2 --> [*]

@enduml
//}

@kmuto kmuto changed the title [WIP] graphロジックの分離とplantumlのサポート graphロジックの分離とplantumlのサポート May 14, 2018
@chiepomme
Copy link

比較的大きめの変更にも関わらず対応いただき本当にありがとうございます!

Windows で PlantUML の jar ファイルが config.yml とおなじフォルダにあり、かつ java へのパスが通っている状態で動作することを確認しました!

一応バージョンは以下の通りです。

  • ruby 2.4.4p296 (2018-03-28 revision 63013) [x64-mingw32]
  • Windows 10
  • java version "1.8.0_171"
  • PlantUML version 1.2018.05 (Sun May 06 05:00:17 JST 2018)

@kmuto
Copy link
Owner Author

kmuto commented May 14, 2018

@chiepomme ありがとうございます、もし可能でしたら…

  • review-pdfmakerのほか、review-epubmaker、review-webmakerでもちゃんと動くか
  • jarファイルをカレントではなくCLASSPATH環境変数先に置いたらどうか

を確認いただけると助かります。Linuxでは問題ないことは確認しているのですが。

あと、ついでに可能ならblockdiag、gnuplot、aafigure、graphvizあたりもWindowsでちゃんと動くかが気になっていますが、これはなかなか大変ですよね。

@chiepomme
Copy link

@kmuto ちょっとお待ちください。環境を作って確認してみます!

@chiepomme
Copy link

chiepomme commented May 14, 2018

まず aafigure ですが pip install だとパスが通る位置に、本来は aafigure.exe ができるはずのところに shebang 付きの aafigure というファイルが出来ていたため、実行できませんでした。もう少し調べてみます。今回入れたのが python 3系なのも関係があるかもしれません……。

それから、blockdiag ですが、pdf が unknown format だと怒られてしまいました。

INFO: blockdiag -a -T pdf -o ./images/latex/blockdialog.pdf C:/Users/CHIEPO~1/AppData/Local/Temp/review_graph20180514-856-1dd1d4t
ERROR: unknown format: PDF
ERROR: failed to run command for id blockdialog: blockdiag -a -T pdf -o ./images/latex/blockdialog.pdf C:/Users/CHIEPO~1/AppData/Local/Temp/review_graph20180514-856-1dd1d4t

gnuplot は公式のインストーラーでパスを通すオプションを入れるだけでそのまま動作。
graphviz は公式のインストーラーでインストールあと、自前で dot.exe にパスを通すことで動作を確認しました。

gnuplot graphviz plantuml が含まれたファイルを用いて、pdfmaker webmaker については動作確認できましたが、 epubmaker については、epub ファイルが破損していて読み込めませんでした。もう少し詳しくみてみます。

Windows 環境はこのあたりはなかなかやっかいですね・・・。

@chiepomme
Copy link

メモのようにつかって申し訳ないのですが pip install reportlabblockdiag も動作しました。
aafigure と CLASSPATH環境変数を使った plantuml それから epubmaker がどこでこけているのかも分かれば調べてみます。

@chiepomme
Copy link

CLASSPATH 環境変数 に plantuml.jar もしくはそれの置かれたフォルダを指定してみましたが

Unable to access jarfile plantuml.jar

と出てしまい、jar を見つけることが出来ませんでした。
Java には全く明るくないのでわからないのですが、
-jar を指定すると、CLASSPATH 自体を無視するような記述も見かけました。
いまのところ、動作を確認できたのはカレントディレクトリに置いたときのみです。

epubmaker についても少し調べます。

@chiepomme
Copy link

chiepomme commented May 14, 2018

一通り手元の環境で確認を行ったのでまとめます。

TeX と Ruby はこれと同じ方法でインストールしました。
TeXとRubyだけでWindowsにRe:VIEW環境を構築した話 - Qiita

確認環境

  • Windows 10(x64)
  • W32Tex, dviout, Ghostscript (TeXインストーラ 3 でインストール)
  • ruby 2.4.4p296 (2018-03-28 revision 63013) [x64-mingw32] (RubyInstaller for Windows でインストール)
  • java version "1.8.0_171" (公式インストーラーでインストール)
  • PlantUML version 1.2018.05 (Sun May 06 05:00:17 JST 2018) (公式から jar をダウンロード)
  • Python 3.6.2 (公式インストーラーでインストール)
  • reportlab 3.4.0 (pip でインストール)
  • blockdiag 1.5.3 (pip でインストール)
  • dot - graphviz version 2.38.0 (20140413.2041) (公式インストーラーでインストール)
  • gnuplot 5.2 patchlevel 3 (公式インストーラーでインストール)

確認項目

pdfmaker, webmaker, epubmaker

以下の確認項目で、動作したというものは pdfmaker webmaker で動作が確認できたものです。
epubmaker に関しては、手元で review init をし、フォントを Windows 対応したまっさらな状態でも壊れたファイルが生成されたため、確認できませんでした。

PlantUML

plantuml.jar をカレントディレクトリに置くことで動作確認できました。
次に jar を CLASSPATH 環境変数が指すところに置いてみましたが、こちらは動作しませんでした。

blockdiag

reportlab と合わせて pip でインストールすることで動作確認できました。

aafigure

Windows 環境でのパッケージの定義に問題があるらしく、pip ではそもそも実行ファイルが生成されませんでした。そのため動作確認できませんでした。

graphviz

公式インストーラーでインストールし、パスを通すことで動作確認できました。

gnuplot

公式インストーラーでパスを通すオプションを有効にしてインストールすることで動作確認できました。

@kmuto
Copy link
Owner Author

kmuto commented May 14, 2018

ありがとうございます、助かります! epubmakerはなんでしょうね… debug: trueにしたら何かわかるのかな。

@chiepomme
Copy link

chiepomme commented May 14, 2018

config.ymldebug: true を定義することで、graph も全部正しく入った epub が生成されました。
image
まだ Re:VIEW も使って間もないため、正直理由が全く分かりません😢

@kmuto
Copy link
Owner Author

kmuto commented May 14, 2018

CLASSPATH、たしかにLinuxのjava 1.8でもダメでした。jarファイルの指定まで設定で面倒見るのはつらいので、Re:VIEW開発側としてはカレントで勘弁かな…(OS間差異や空白フォルダ名対応なども交じってくるので)。どうしてもの場合はreview-ext.rbでgraph_plantumlを差し替えてもらうということになりそうです。

@kmuto
Copy link
Owner Author

kmuto commented May 14, 2018

ム! debug:trueでいけるとなると、以前に発生した、一時ファイルの削除タイミング問題っぽい。今回もgraph内で生成しているのでいかにも怪しいです(いちおうensureで消してるんだけどなぁ…)。
ちょっとこちらでも追跡してみます。

@chiepomme
Copy link

chiepomme commented May 14, 2018

CLASSPATH、たしかにLinuxのjava 1.8でもダメでした。jarファイルの指定まで設定で面倒見るのはつらいので、Re:VIEW開発側としてはカレントで勘弁かな…

使用する側としても PlantUML が標準のインストール先や、実行ファイル、環境変数を用意していないため、どこに置くのが正解かわかりません。そのため、Re:VIEW で使用する場所に置くというのは、一番わかりやすい置き場所のように思います。

このあたり本当に厄介過ぎますね・・・。

ム! debug:trueでいけるとなると、以前に発生した、一時ファイルの削除タイミング問題っぽい。

もしこちらでもなにか分かったら、共有させていただきます!
(docker 上の review を使っていたときはこの問題が無かったので、やはり Windows 固有の問題なのかもしれません……)

@kmuto
Copy link
Owner Author

kmuto commented May 15, 2018

だいたい同じですが、Windows 10 64bit Home + Ruby 2.5.0p0 (2017-12-25 revision 61468) [x64-mingw32] の環境でreview-epubmakerを20回ほどまわしてみました。
結果としては1度も実行時エラーやzip展開できない破損物は生じず、正常に動作しました。

  • 「壊れる」ときに何かメッセージは出るでしょうか。
  • C:\Users\CHIEPO~1\AppData\Local\Tempにbook-epub-*やreview_graph-*のゴミは残ってしまっているでしょうか。
  • .epubファイルが「壊れた」状態で存在するならお送りいただけますか。

@chiepomme
Copy link

動作確認していただきありがとうございます。

メッセージとしては正常動作する debug: true の際には

>bundle exec review-epubmaker config.yml
Loaded yaml file (config.yml). I will produce book.epub.
Created first temporary directory as F:/TEST/book-epub.
Call hook_beforeprocess. ()
Call hook_afterfrontmatter. ()
Create TEST.xhtml from TEST.re.
WARN: TEST.re:1: headline is empty.
Call hook_afterbody. ()
Call hook_afterbackmatter. ()
Push titlepage.xhtml to ePUB contents.
Copy images/cover.jpg to the temporary directory.
Call hook_aftercopyimage. ()
Call ePUB producer.
Finished.

epub が破損している debug: null の場合

>bundle exec review-epubmaker config.yml
WARN: TEST.re:1: headline is empty.

と出るため、ほぼほぼ問題がなさそうに見えます。
なお、リーダーは Microsoft の Edge と Adobe Digital Edition 4.5.8 でファイルが壊れていると表示されることを確認しています。
読み込めない epub も含めたプロジェクトごと zip にまとめました。
Gemfile の参照がローカルになっているのでお気を付けください。
BrokenEpub.zip

(仕事にいく関係で epub の中身の比較ができていませんので、帰ってきたら見てみます)

@chiepomme
Copy link

すみません!上記のファイルですが Temp は消した状態で行いました。

@kmuto
Copy link
Owner Author

kmuto commented May 15, 2018

Archive:  book.epub
  Length      Date    Time    Name
---------  ---------- -----   ----
       20  2018-05-15 09:27   mimetype
      256  2018-05-15 09:27   ../../../../../chiepomme/AppData/Local/Temp/d20180515-19688-spkq5m/META-INF/container.xml
      618  2018-05-15 09:27   ../../../../../chiepomme/AppData/Local/Temp/d20180515-19688-spkq5m/OEBPS/book-toc.xhtml
     1960  2018-05-15 09:27   ../../../../../chiepomme/AppData/Local/Temp/d20180515-19688-spkq5m/OEBPS/book.opf
      576  2018-05-15 09:27   ../../../../../chiepomme/AppData/Local/Temp/d20180515-19688-spkq5m/OEBPS/book.xhtml
   114018  2018-05-15 09:27   ../../../../../chiepomme/AppData/Local/Temp/d20180515-19688-spkq5m/OEBPS/images/cover.jpg
     8458  2018-05-15 09:27   ../../../../../chiepomme/AppData/Local/Temp/d20180515-19688-spkq5m/OEBPS/style.css
      590  2018-05-15 09:27   ../../../../../chiepomme/AppData/Local/Temp/d20180515-19688-spkq5m/OEBPS/titlepage.xhtml

いただいたものはこうなっちゃってますね。
手元のWindowsでは同じコンテンツフォルダからbundle使ってビルドしても問題ありませんでした。

Re:VIEWロジック側と比較すると、テンポラリフォルダにフォルダを作成してそこに移動しているのですが、ご使用のWindows環境だとパス名を探索するときのPathname.new(一時フォルダ) の結果に../../みたいに相対移動が発生してしまっている、という状況ですね。

EPUBmaker+Windows環境の話で、このPRとはそろそろ無関係になってきたので、それ自体は別のissueに立てることにしましょうか。
このPR自体はLinux・Windowsともにうまく動いている(aafigureのほうはWindows版がupstreamレベルで未対応)ようなのでマージしたいと思います。

@kmuto kmuto merged commit 309e133 into master May 15, 2018
@kmuto kmuto deleted the plantuml branch May 15, 2018 01:26
kmuto added a commit that referenced this pull request May 15, 2018
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

Successfully merging this pull request may close these issues.

2 participants