PlantUMLがすごい

テキストファイルをソースに、UML図を作れるツール。しゅごい。(というお題目で始めたのにどうしてこうなった)

plantuml.com

走れメロス(前20段落)の状態遷移図です。(オチ)

www.dropbox.com

出力用ワンライナー

返ってこなくてもバグではありませんし、JVMの設定などをしてないとそもそも例外が飛びます(全文だとJava以前にDotの実行から返ってこずTimeoutしますが。。。)。

aozora books --title "走れメロス" | jq '.[0].book_id' | xargs aozora content --format html --id | sed '1,/id="contents"/d' | sed '/class="chitsuki_1"/,$d' | sed 's#<ruby><rb>\([^<]*\)</rb><rp>[^<]*</rp><rt>\([^<]*\)</rt><rp>[^<]*</rp></ruby>#\1#g' | sed 's#<[^>]*>##g' | tr -d \\r | sed 's#[ 、「」]##g' | head -n 20 | mecab | sed 's#\t.*##' | grep -v -e EOS -e '^$' | awk 'NR==1{print "(*) \""$0"\""}NR!=1{print "\""p"\" \""$0"\""}{p=$0}END{print "\""$0"\" (*)"}' | awk '{a[$0]++;i[NR]=$0;a1[NR]=$1;a2[NR]=$2}END{for(idx=1;idx<=NR;idx++){print a1[idx]" -->["a[i[idx]]"] "a2[idx]}}' | awk '!a[$0]++' | cat <(echo @startuml) - <(echo @enduml) | plantuml -p > merosu_20.png

解説

青空文庫CLIでアクセスできる aozora-cli を使って、ワンライナー走れメロスの状態遷移図(アクティビティ図)を作ったよ!

インストール

まずはインストール。

sudo apt install plantuml fonts-ricty-diminished

Rictyフォントをインストールしているのは、Windows Subsystem for Linum (Bash on Windows) には、デフォルトだと日本語が入っていないからです。

$ pip3 install aozora-cli
The program 'pip3' is currently not installed. You can install it by typing:
sudo apt install python3-pip

ʅฺ(・ω・。)ʃฺ??

$ apt install python3-pip
......
$ pip3 install aozora-cli
Collecting aozora-cli
  Downloading aozora-cli-0.0.3.tar.gz
Collecting requests (from aozora-cli)
......
aozora books --title "走れメロス" | jq '.[0].book_id' | xargs aozora content --format html --id | sed '1,/id="contents"/d' | sed '/class="chitsuki_1"/,$d' | sed 's#<ruby><rb>\([^<]*\)</rb><rp>[^<]*</rp><rt>\([^<]*\)</rt><rp>[^<]*</rp></ruby>#\1#g' | sed 's#<[^>]*>##g' | tr -d \\r | sed 's#[ 、「」]##g' | head -n 20 | mecab | sed 's#\t.*##' | grep -v -e EOS -e '^$' | awk 'NR==1{print "(*) \""$0"\""}NR!=1{print "\""p"\" \""$0"\""}{p=$0}END{print "\""$0"\" (*)"}' | awk '{a[$0]++;i[NR]=$0;a1[NR]=$1;a2[NR]=$2}END{for(idx=1;idx<=NR;idx++){print a1[idx]" -->["a[i[idx]]"] "a2[idx]}}' | awk '!a[$0]++' | cat <(echo @startuml) - <(echo @enduml) | plantuml -p > merosu_20.png
java.lang.NegativeArraySizeException

(#^ω^)

$ sudo vim `which plantuml`
$ tail -n 1 `which plantuml`
$JAVA -Xmx4096m -jar /usr/share/plantuml/plantuml.jar ${@}

で再度実行したらできます。

まとめ

plantumlもaozora-cli青空文庫もしゅごい。

おまけ

1文

f:id:nogiro_iota:20171214223120p:plain

aozora books --title "走れメロス" | jq '.[0].book_id' | xargs aozora content --format html --id | sed '1,/id="contents"/d' | sed '/class="chitsuki_1"/,$d' | sed 's#<ruby><rb>\([^<]*\)</rb><rp>[^<]*</rp><rt>\([^<]*\)</rt><rp>[^<]*</rp></ruby>#\1#g' | sed 's#<[^>]*>##g' | head -n 1 | tr -d \\r | sed 's#[ 、「」]##g' | sed 's#\([^。]*。\).*#\1#' | mecab | sed 's#\t.*##' | grep -v -e EOS -e '^$' | awk 'NR==1{print "(*) \""$0"\""}NR!=1{print "\""p"\" \""$0"\""}{p=$0}END{print "\""$0"\" (*)"}' | awk '{a[$0]++;i[NR]=$0;a1[NR]=$1;a2[NR]=$2}END{for(idx=1;idx<=NR;idx++){print a1[idx]" -->["a[i[idx]]"] "a2[idx]}}' | awk '!a[$0]++' | cat <(echo @startuml) - <(echo @enduml) | plantuml -p > merosu_1.png
1段落

f:id:nogiro_iota:20171214223104p:plain

aozora books --title "走れメロス" | jq '.[0].book_id' | xargs aozora content --format html --id | sed '1,/id="contents"/d' | sed '/class="chitsuki_1"/,$d' | sed 's#<ruby><rb>\([^<]*\)</rb><rp>[^<]*</rp><rt>\([^<]*\)</rt><rp>[^<]*</rp></ruby>#\1#g' | sed 's#<[^>]*>##g' | head -n 1 | tr -d \\r | sed 's#[ 、「」]##g' | mecab | sed 's#\t.*##' | grep -v -e EOS -e '^$' | awk 'NR==1{print "(*) \""$0"\""}NR!=1{print "\""p"\" \""$0"\""}{p=$0}END{print "\""$0"\" (*)"}' | awk '{a[$0]++;i[NR]=$0;a1[NR]=$1;a2[NR]=$2}END{for(idx=1;idx<=NR;idx++){print a1[idx]" -->["a[i[idx]]"] "a2[idx]}}' | awk '!a[$0]++' | cat <(echo @startuml) - <(echo @enduml) | plantuml -p > merosu.png

https://www.dropbox.com/s/3d5q3ih40v3u4ip/merosu.png?dl=0

整形ワンライナー
aozora books --title "走れメロス" \
  | jq '.[0].book_id' \
  | xargs aozora content --format html --id \
  | sed '1,/id="contents"/d' \
  | sed '/class="chitsuki_1"/,$d' \
  | sed 's#<ruby><rb>\([^<]*\)</rb><rp>[^<]*</rp><rt>\([^<]*\)</rt><rp>[^<]*</rp></ruby>#\1#g' \
  | sed 's#<[^>]*>##g' \
  | tr -d \\r \
  | sed 's#[ 、「」]##g' \
  | head -n 20 \
  | mecab \
  | sed 's#\t.*##' \
  | grep -v -e EOS -e '^$' \
  | awk 'NR==1{print "(*) \""$0"\""}NR!=1{print "\""p"\" \""$0"\""}{p=$0}END{print "\""$0"\" (*)"}' \
  | awk '{a[$0]++;i[NR]=$0;a1[NR]=$1;a2[NR]=$2}END{for(idx=1;idx<=NR;idx++){print a1[idx]" -->["a[i[idx]]"] "a2[idx]}}' \
  | awk '!a[$0]++' \
  | cat <(echo @startuml) - <(echo @enduml) \
  | plantuml -p > merosu_20.png