kayaru28の学習日記

勉強したことの整理と、graphvizでの図形作成練習のための学習日記です。

Graphviz:Graphvizにて使用できるattributes(属性?)について仕様を調べる ~arrowhead/arrowtail/arrowsize~

****************** 以下、定期

Graphvizの各コンポーネントにて使用できる属性は以下のページにまとめられている。

emden.github.io

しかしながら英語である。いや、英語であることを百歩譲っておいておいたとしても、図形の例がないために具体的にどのような違いが出るのかがわかりにくい。 ということでこのattributesを実際に各コンポーネントに実装して、どんな仕様になるのかということをここに整理していく。

徐々に調査して、追加していく所存。

****************** 以上、定期終了

今回の対象属性はarrowhead/arrowtail/arrowsizeを使用する。

環境

・OS:Windows10にて、VirtualBox6.0.8上のCentOS7.4

# cat /etc/redhat-release
CentOS Linux release 7.4.1708 (Core)

Graphviz : 2.38..0

#  dot -V
dot - graphviz version 2.30.1 (20180420.1509)

arrowhead/arrowtail/arrowsize

対象コンポーネント:エッジ 対象レイアウト:全部 矢印付きのエッジを使用した際に、その矢印の形状および大きさを変更することができる。見ての通りarrowheadはエッジの頭(A→Bの場合はエッジのB側端)、arrowtailはエッジの後ろ(A→Bの場合はエッジのA側端)の形状を指定できる。指摘できる形状とそのパラメータは下記のページにまとめられている。

emden.github.io

そして、arrowsizeは矢印の大きさを指定することができる。

実際に以下のdotファイルを使用してグラフを作成した。

digraph {
    layout=dot
    A -> B [dir=both]
    C -> D [arrowhead=inv dir=both]
    E -> F [arrowtail=inv dir=both]
    G -> H [arrowhead=tee arrowtail=odot dir=both]
    I -> J [arrowhead=tee arrowsize=2.0 arrowtail=odot dir=both]
}

その結果できた図形は以下のとおりである。 f:id:kayaru28:20200328124949p:plain

グラフのエッジの端が指定した形に変わっているのがわかる。また、サイズを指定した一番右のグラフだけ、エッジの大きさが大きくなっているのもわかる。

ちなみにこのグラフの中で使われている'''dir=both'''という属性は、これはエッジの後ろにも形状を持たせるための属性になります。これをつけていると、一番左の図形のように、エッジの両端が矢印マークを持つようになります。

Graphviz:Graphvizにて使用できるattributes(属性?)について仕様を調べる ~K~

****************** 以下、定期

Graphvizの各コンポーネントにて使用できる属性は以下のページにまとめられている。

emden.github.io

しかしながら英語である。いや、英語であることを百歩譲っておいておいたとしても、図形の例がないために具体的にどのような違いが出るのかがわかりにくい。 ということでこのattributesを実際に各コンポーネントに実装して、どんな仕様になるのかということをここに整理していく。

徐々に調査して、追加していく所存。

****************** 以上、定期終了

今回の対象属性は”K”を使用する。

環境

・OS:Windows10にて、VirtualBox6.0.8上のCentOS7.4

# cat /etc/redhat-release
CentOS Linux release 7.4.1708 (Core)

Graphviz : 2.38..0

#  dot -V
dot - graphviz version 2.30.1 (20180420.1509)

K

対象コンポーネント:グラフ、サブグラフ
対象レイアウト:fdp,sfdp
ノード間の距離を大まかに指定できて、値が大きいほど距離が大きくなる。
lenが設定されていた場合には上書きされる。
以下のサンプルコードにて、Kの値をそれぞれ0.3(デフォルト)、1.0、2.0にしたときのグラフを作成する。

digraph {
    layout=fdp
    K=[0.3 or 1.0 or 2.0]
    A -> A0
    A0 -> A00
    A00 -> A000
    A00 -> A001
    A00 -> A002
    A0 -> A01
    A01 -> A010
    A01 -> A011
    A01 -> A012
    A0 -> A02
    A02 -> A020
    A02 -> A021
    A02 -> A022
    A -> A1
    A1 -> A10
    A10 -> A100
    A10 -> A101
    A10 -> A102
    A1 -> A11
    A11 -> A110
    A11 -> A111
    A11 -> A112
    A1 -> A12
    A12 -> A120
    A12 -> A121
    A12 -> A122
    A -> A2
    A2 -> A20
    A20 -> A200
    A20 -> A201
    A20 -> A202
    A2 -> A21
    A21 -> A210
    A21 -> A211
    A21 -> A212
    A2 -> A22
    A22 -> A220
    A22 -> A221
    A22 -> A222
}
  1. K=0.3 f:id:kayaru28:20200325000647p:plain
  2. K=1.0 f:id:kayaru28:20200325000704p:plain
  3. K=2.0 f:id:kayaru28:20200325000716p:plain

少しずつノードの距離が大きくなっているのがよくわかる。

それにしても、1.0大きくしただけで結構距離が離れるようだった。

Graphviz:Linux上で動かしているGraphvizにて日本語表示の文字化け修正に苦戦した話

結論

Linux上に使用できる日本語フォントが存在しなかったため

詳細

環境

・OS:Windows10にて、VirtualBox6.0.8上のCentOS7.4

# cat /etc/redhat-release
CentOS Linux release 7.4.1708 (Core)

Graphviz : 2.38..0

#  dot -V
dot - graphviz version 2.30.1 (20180420.1509)

経緯等

  1. Pythonにてgraphvizキックして作成する図形上に日本語を使用しようとしていたら、どうにも日本語表示が文字化けしてしまう。
  2. Pythonを使っている部分が悪いのかの部分の切り分けをするために、dotファイルを直接作って図形を作成してみたが、それでも文字化けしてしまうため、Pythonじゃないもっと足元の環境が悪そう
  3. ネットの上の文献たち *1 *2 *3 *4 を漁って、フォントを指定すればいいらしいということを知る。
    →しかしながら、解決はしなかった。かなり絶望した。
    だめもとでエンコードutf-8に明に指定(そもそもデフォルトでutf-8になっているらしい)してみるも、やはり解決はしない。
  4. 文献をいろいろ見てみて、”使用できる日本語フォントを指定”という文言がひっかかり、そもそもこのゲストOSのLinux上で使用できる日本語フォントって何だろう?と思って確認
    →しかし出てこない →日本語フォントをインストールして再度図形を作成
    →解決!!

という流れだった。

最後の具体的な解決の流れは、まずは日本語フォントの確認のために、

fc-list :lang=ja

にて日本語フォントで使用できるものがあるか確認するも、何も出力されなかった。そのため、使用できる日本語フォントがないことがわかる。

そこで、なんでもいいから日本語フォントをインストールしようと、また別のサイト *5 を参考に、下記コマンドにて日本語フォントを導入してみた。

# yum install ipa-gothic-fonts ipa-mincho-fonts ipa-pgothic-fonts ipa-pmincho-fonts

改めと先述のコマンドで確認してみても、導入されてるっぽい

# fc-list :lang=ja
/usr/share/fonts/ipa-gothic/ipag.ttf: IPAGothic:style=Regular
/usr/share/fonts/ipa-mincho/ipam.ttf: IPAMincho:style=Regular
/usr/share/fonts/ipa-pmincho/ipamp.ttf: IPAPMincho:style=Regular
/usr/share/fonts/ipa-pgothic/ipagp.ttf: IPAPGothic:style=Regular

以上を実施して再度図形を作成してみたら、無事に文字化けが修正されていた。

ちなみに、下記コードのようにdotファイル内にてフォントを指定しなくても、文字化けは発生しなかった。

digraph sample {
 "テスト"
}

実際に作成された図形がこちら

f:id:kayaru28:20200321165407g:plain

以上でどうにか無事に解決しました。

参考文献

Scala:ScalaでPythonのtypeみたいに変数型を確認して表示する

PythonでTypeで変数型を表示するように、Scalaでも変数型を調査・確認して表示する方法を調査していて、地味に見つけるのに時間がかかったので備忘としてメモを残します。

結論を言うと、getClassを使用することで、変数の型を取得することができます。コードとしては以下のようになります。

変数名.getClass

実際に自分で作成したClass型を使用している変数を含む変数型を調査したコードとその結果は以下のようになります。

コード

//独自Classの定義
case class profile(name:String,age:Int,height:Double)
case class license(name:String,age:Int)

//調査対象の変数の作成
val value_int = 123
val value_double = 123.0
val value_string = "abc"
val value_profile=profile("aa",1,2.0)
val value_license=license("aa",1)

//各変数の型の調査と表示
println(value_int.getClass)
println(value_double.getClass)
println(value_string.getClass)
println(value_profile.getClass)
println(value_license.getClass)

出力結果

# scala Z001_type.scala
int
double
class java.lang.String
class Main$$anon$1$profile
class Main$$anon$1$license

上記の通り、一通りの変数の型を調査して表示させることができました。独自Classの表示内容の詳細な意味が調べ切れていませんが、独自Classということは特定できているようです。