Good to know yaml

【平成 Ruby 会議 01】@MITSUBOSHI さんのセッションをとぅぎゃりました。
0
黒曜@Leaner Technologies @kokuyouwind

さて、休憩終わってセッション聞く。「Good to know YAML」 #heiseirubykaigiB

2019-12-14 16:20:55
黒曜@Leaner Technologies @kokuyouwind

YAMLのAST周りをざっくり話して、実世界でAST理解してると便利な話をする。55枚あるので駆け足で進める。 #heiseirubykaigiB

2019-12-14 16:21:30
黒曜@Leaner Technologies @kokuyouwind

psych gem。YAMLのバックエンドライブラリ(Ruby 1.9.3から標準化) github.com/ruby/psych #heiseirubykaigiB

2019-12-14 16:22:19
makicamel @makicamel

「親近感持ってもらいたいので言うんですけど」もった! #heiseirubykaigib

2019-12-14 16:22:33
黒曜@Leaner Technologies @kokuyouwind

Psych::Nodes::StreamがASTのルートノード。子ノードが1個以上、かつ Psych::Nodes::Documentオブジェクト。 #heiseirubykaigiB

2019-12-14 16:23:32
黒曜@Leaner Technologies @kokuyouwind

Psych::Nodes::Document はルートの子ノードで、Sequence, Mapping, Scalarのいずれか。 #heiseirubykaigiB

2019-12-14 16:24:23
黒曜@Leaner Technologies @kokuyouwind

MappingはRubyでいうMap。子ノードの数は必ず偶数個(重要)。子ノードはSequence, Mapping, Scalar、Aliasのいずれか。 #heiseirubykaigiB

2019-12-14 16:25:15
黒曜@Leaner Technologies @kokuyouwind

Scalarは葉ノードにあたり、子要素を持たない。Sequenceは配列。AliasはASTの葉ノードで子ノードを持たないが、anchorで別のYAML要素を指す。 #heiseirubykaigiB

2019-12-14 16:26:26
黒曜@Leaner Technologies @kokuyouwind

YAMLを実際に解釈するときはstart_stream、start_documentなどが対応する要素ごとに呼ばれて、ASTノードに変換される。Mappingはkeyとvalueがそれぞれペアになって順に子ノードに入る #heiseirubykaigiB

2019-12-14 16:28:20
Hirotaka Miyagi @MH4GF

なんちゃらmine、一旦なんなんだ… #heiseirubykaigib

2019-12-14 16:29:09
黒曜@Leaner Technologies @kokuyouwind

実用例。重複したkeyを持つyamlファイルの検出。YAML.load_fileすると消えてしまう。案1. end_mappingをモンキーパッチして重複キーを検証する。動くが影響が大きい #heiseirubykaigiB

2019-12-14 16:30:18
黒曜@Leaner Technologies @kokuyouwind

案2、Psych::TreeBuilderを指定する。これでもいける。案3、ASTから頑張る(これがメイン)(案2のほうがスマートなので実用的にはそちらのほうが良いが、ASTの理解のために頑張ってみる) #heiseirubykaigiB

2019-12-14 16:31:26
黒曜@Leaner Technologies @kokuyouwind

「yamcha gem。サイバイマンに負けるほど弱い」 発想好きだわw github.com/MITSUBOSHI/yam… #heiseirubykaigiB

2019-12-14 16:32:45
Hirotaka Miyagi @MH4GF

継承元でのメソッド定義を矯正したい場合はやっぱりNotImplementErrorをraiseするのがいいのか(本題ではない) #heiseirubykaigib

2019-12-14 16:33:48
Hirotaka Miyagi @MH4GF

Yamcha::Composer、名前が可愛い、、 #heiseirubykaigib

2019-12-14 16:34:21
黒曜@Leaner Technologies @kokuyouwind

ノード2つの組み合わせで処理分けてるのか… めっちゃ頑張ってるな… #heiseirubykaigiB

2019-12-14 16:35:36