rabbit-slide-naitoh-rexml-rubykaigi-2024-followup 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/.rabbit +2 -0
- data/README.md +24 -0
- data/Rakefile +17 -0
- data/config.yaml +25 -0
- data/pdf/rexml-rubykaigi-2024-followup-rexml-rubykaigi-2024-followup.pdf +0 -0
- data/rexml-rubykaigi-2024-followup.md +299 -0
- data/theme.rb +22 -0
- metadata +63 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: b427bf7b08a37f241ac0d6d984be8c1493a08a743f9b61af827c5588e146a4b4
|
4
|
+
data.tar.gz: 60924b508a17f560406a24e090f62503e9c81374102cd15d6861d861e51d32a0
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 4f47ba3ef2dad31264c83ce752b8c889be512a821f7490858671e187b1dbb26d0882116d7024302cca6512180be939e7068c868e372335c4c2fed5b4d10fc442
|
7
|
+
data.tar.gz: 8178e7ea883d9361b0702fa1e1af44c473f3c8390b3f5b3ce628b418e5ebf344382ef389eecf5d05392231cb82bfca51266901551a3a415b7e4b7b3589e82e80
|
data/.rabbit
ADDED
data/README.md
ADDED
@@ -0,0 +1,24 @@
|
|
1
|
+
# REXML改善のその後
|
2
|
+
|
3
|
+
https://rhc.connpass.com/event/320709/
|
4
|
+
|
5
|
+
## 作者向け
|
6
|
+
|
7
|
+
### 表示
|
8
|
+
|
9
|
+
rake
|
10
|
+
|
11
|
+
### 公開
|
12
|
+
|
13
|
+
rake publish
|
14
|
+
|
15
|
+
## 閲覧者向け
|
16
|
+
|
17
|
+
### インストール
|
18
|
+
|
19
|
+
gem install rabbit-slide-naitoh-rexml-rubykaigi-2024-followup
|
20
|
+
|
21
|
+
### 表示
|
22
|
+
|
23
|
+
rabbit rabbit-slide-naitoh-rexml-rubykaigi-2024-followup.gem
|
24
|
+
|
data/Rakefile
ADDED
@@ -0,0 +1,17 @@
|
|
1
|
+
require "rabbit/task/slide"
|
2
|
+
|
3
|
+
# Edit ./config.yaml to customize meta data
|
4
|
+
|
5
|
+
spec = nil
|
6
|
+
Rabbit::Task::Slide.new do |task|
|
7
|
+
spec = task.spec
|
8
|
+
# spec.files += Dir.glob("doc/**/*.*")
|
9
|
+
# spec.files -= Dir.glob("private/**/*.*")
|
10
|
+
# spec.add_runtime_dependency("rabbit-theme-YOUR-THEME")
|
11
|
+
end
|
12
|
+
|
13
|
+
desc "Tag #{spec.version}"
|
14
|
+
task :tag do
|
15
|
+
sh("git", "tag", "-a", spec.version.to_s, "-m", "Publish #{spec.version}")
|
16
|
+
sh("git", "push", "--tags")
|
17
|
+
end
|
data/config.yaml
ADDED
@@ -0,0 +1,25 @@
|
|
1
|
+
---
|
2
|
+
id: rexml-rubykaigi-2024-followup
|
3
|
+
base_name: rexml-rubykaigi-2024-followup
|
4
|
+
tags:
|
5
|
+
- ruby
|
6
|
+
- rexml
|
7
|
+
presentation_date:
|
8
|
+
presentation_start_time:
|
9
|
+
presentation_end_time:
|
10
|
+
version: 1.0.0
|
11
|
+
licenses: []
|
12
|
+
slideshare_id:
|
13
|
+
speaker_deck_id:
|
14
|
+
vimeo_id:
|
15
|
+
youtube_id:
|
16
|
+
width: 1920
|
17
|
+
height: 1080
|
18
|
+
source_code_uri:
|
19
|
+
author:
|
20
|
+
markup_language: :markdown
|
21
|
+
name: NAITOH Jun
|
22
|
+
email: naitoh@gmail.com
|
23
|
+
rubygems_user: naitoh
|
24
|
+
slideshare_user:
|
25
|
+
speaker_deck_user:
|
Binary file
|
@@ -0,0 +1,299 @@
|
|
1
|
+
# REXML改善のその後
|
2
|
+
|
3
|
+
author
|
4
|
+
: NAITOH Jun
|
5
|
+
|
6
|
+
institution
|
7
|
+
: メドピア株式会社
|
8
|
+
|
9
|
+
content-source
|
10
|
+
: RubyKaigi 2024 follow up
|
11
|
+
|
12
|
+
date
|
13
|
+
: 2024-08-31
|
14
|
+
|
15
|
+
theme
|
16
|
+
: theme
|
17
|
+
|
18
|
+
allotted-time
|
19
|
+
: 15m
|
20
|
+
|
21
|
+
|
22
|
+
|
23
|
+
# 自己紹介
|
24
|
+
|
25
|
+
* Name: 内藤 淳
|
26
|
+
* Work: メドピア株式会社
|
27
|
+
* Red Data Tools のメンバー
|
28
|
+
* redmine.tokyo スタッフ
|
29
|
+
* {::tag name='x-small'}GitHub <https://github.com/naitoh>{:/tag}
|
30
|
+
* {::tag name='x-small'}X (Twitter) <https://twitter.com/naitoh>{:/tag}
|
31
|
+
* {::tag name='x-small'}<https://naitoh.hatenablog.com/>{:/tag}
|
32
|
+
|
33
|
+
|
34
|
+
# RubyKaigi 2024 LT の発表内容
|
35
|
+
|
36
|
+
**Improved REXML XML parsing performance using StringScanner**
|
37
|
+
|
38
|
+
* XMLパース処理を Regexp から StringScanner(C拡張 のdefault gem) に書き換える形でパース処理速度を改善
|
39
|
+
* StringScanner のバグ修正
|
40
|
+
* REXML の XML 仕様違反の修正
|
41
|
+
* libxml-ruby(dom) との比較で、性能差(何倍遅い)の改善を実現
|
42
|
+
* YJIT無効状態: dom: 65倍→60倍に短縮、sax: 21倍→17倍に短縮
|
43
|
+
* YJIT有効状態: dom: 44倍→25倍に短縮、sax: 14倍→8.6倍に短縮
|
44
|
+
|
45
|
+
詳細: https://naitoh.hatenablog.com/entry/2024/05/20/232115
|
46
|
+
|
47
|
+
# 今回の内容
|
48
|
+
|
49
|
+
* (rexml 3.2.8)リリース後の問題
|
50
|
+
* 使い方の改善
|
51
|
+
* セキュリティ対策
|
52
|
+
* ActiveSupport Hash.from_xml への組み込みの取り組み
|
53
|
+
* 今後
|
54
|
+
|
55
|
+
|
56
|
+
# (rexml 3.2.8)リリース後の問題
|
57
|
+
|
58
|
+
1. リリースバージョン(rexml 3.2.8)を計測したら、遅くなっていた。
|
59
|
+
2. 巨大XML(2GB超)がパースできなくなっていた。
|
60
|
+
3. REXMLが Pure Ruby で無くなっていた。
|
61
|
+
|
62
|
+
# 1. リリースバージョン(rexml 3.2.8)を計測したら、遅くなっていた。
|
63
|
+
|
64
|
+
{:.right}
|
65
|
+
※ 3.2.6 は 内藤の改善前のバージョン
|
66
|
+
※ d78118 がRubyKaigi 前の内藤の最後のCommit
|
67
|
+
※ 数値が大きい程速い([i/s] 1秒あたりの処理回数)
|
68
|
+
|
69
|
+
| rexml | 3.2.6 | d78118 | 3.2.8 | | 3.2.6 (YJIT) | d78118 (YJIT) | 3.2.8 (YJIT) | |
|
70
|
+
|-------------|-------|--------|-------|--------|-------------|--------------|-------------|--------------|
|
71
|
+
| dom | 10.42 | 11.21 | **9.949** | | 15.00 | 18.05 | **16.37** | |
|
72
|
+
| sax | 25.95 | 30.33 | **23.90** | | 38.01 | 58.23 | **40.67** | |
|
73
|
+
| pull | 30.64 | 36.30 | **27.33** | | 44.53 | 73.80 | **47.36** | |
|
74
|
+
| stream | 29.34 i/s | 35.47 i/s | **26.81 i/s** | | 40.32 i/s | 65.22 i/s | **44.55 i/s** | |
|
75
|
+
|
76
|
+
* リリース時に対応された CVE対策の影響
|
77
|
+
* [CVE-2024-35176: REXML内のDoS脆弱性](https://www.ruby-lang.org/ja/news/2024/05/16/dos-rexml-cve-2024-35176/)
|
78
|
+
|
79
|
+
|
80
|
+
# 1. リリースバージョン(rexml 3.2.8)を計測したら、遅くなっていた。
|
81
|
+
|
82
|
+
{:.right}
|
83
|
+
※ 3.2.6 は 内藤の改善前のバージョン
|
84
|
+
※ d78118 がRubyKaigi 前の内藤の最後のCommit
|
85
|
+
※ 数値が大きい程速い([i/s] 1秒あたりの処理回数)
|
86
|
+
|
87
|
+
| rexml | 3.2.6 | d78118 | 3.2.8 | 037c16 | 3.2.6 (YJIT) | d78118 (YJIT) | 3.2.8 (YJIT) | 037c16 (YJIT) |
|
88
|
+
|-------------|-------|--------|-------|--------|-------------|--------------|-------------|--------------|
|
89
|
+
| dom | 10.42 | 11.21 | **9.949** | **10.22** | 15.00 | 18.05 | **16.37** | **17.84** |
|
90
|
+
| sax | 25.95 | 30.33 | **23.90** | **25.86** | 38.01 | 58.23 | **40.67** | **50.19** |
|
91
|
+
| pull | 30.64 | 36.30 | **27.33** | **29.57** | 44.53 | 73.80 | **47.36** | **59.93** |
|
92
|
+
| stream | 29.34 i/s | 35.47 i/s | **26.81 i/s** | **29.58 i/s** | 40.32 i/s | 65.22 i/s | **44.55 i/s** | **54.77 i/s** |
|
93
|
+
|
94
|
+
{:.right}
|
95
|
+
**※ 037c16 が修正Commit**
|
96
|
+
|
97
|
+
* 正規表現の生成処理でコストがかかっていたので、キャッシュ化する形で、 [rexml#135: Optimize Source#read_until method](https://github.com/ruby/rexml/pull/135) で改善(でもまだ遅いのでなんとかしたい。(後述))
|
98
|
+
|
99
|
+
# 2. 巨大XML(2GB超)がパースできなくなっていた。
|
100
|
+
|
101
|
+
# パース対象文字列を StringScanner のバッファに追記し、パース
|
102
|
+
@scanner << str
|
103
|
+
{: lang="ruby"}
|
104
|
+
|
105
|
+
* 性能の観点から、StringScanner のパース対象文字列をバッファに毎回追記しパースしていたが、StringScannerのバッファサイズの上限(2GB)を超えた。
|
106
|
+
* バッファが一定サイズ以上になった時点でバッファをクリアする形で対処
|
107
|
+
|
108
|
+
* [rexml#154: Fix a bug that a large XML can't be parsed](https://github.com/ruby/rexml/pull/154)
|
109
|
+
|
110
|
+
|
111
|
+
|
112
|
+
# 3. REXMLがPure Rubyで無くなっていた。
|
113
|
+
* 内部実装をRegexからStringScanner(C拡張のdefault gem)に変更時、StringScanner 3.0.9以上を対象にしたため、環境によってはStringScannerのコンパイルが発生。
|
114
|
+
* REXML最小サポート範囲のRuby 2.5添付の StringScanner 1.0.0 で動作するように修正頂き、Pure Ruby として復活。🎉 (by 須藤さん)
|
115
|
+
|
116
|
+
# 使い方の改善
|
117
|
+
1. 不正XMLチェックの強化
|
118
|
+
2. 各パーサー間でのパース処理結果の統一
|
119
|
+
3. SAXパース処理の不要なイベント応答を削除
|
120
|
+
|
121
|
+
# XMLの説明
|
122
|
+
|
123
|
+
**XMLファイルの例**
|
124
|
+
|
125
|
+
<?xml version="1.0" encoding="UTF-8" ?> ☜ XML宣言
|
126
|
+
<!DOCTYPE root [ ☜ DOCTYPE 宣言
|
127
|
+
<!ENTITY bar "baz"> ☜ ユーザー定義実体参照宣言
|
128
|
+
]>
|
129
|
+
<root>
|
130
|
+
<a>foo&</a> ☜ 定義済み実体参照 ( "foo&" と出力される)
|
131
|
+
<b>&bar;</b> ☜ ユーザー定義実体参照 ( "baz" と出力される)
|
132
|
+
<c>© MedPeer</c> ☜ 文字参照 ( "©︎MedPeer" と出力される)
|
133
|
+
</root>
|
134
|
+
{: lang="xml"}
|
135
|
+
|
136
|
+
# 1. 不正XMLチェックの強化
|
137
|
+
|
138
|
+
**下記の不正なXMLをREXML側でエラー応答するようになった。**
|
139
|
+
|
140
|
+
# 複数のルートタグ
|
141
|
+
<root1></root1><root2></root2>
|
142
|
+
|
143
|
+
# 開始ルートタグ前の文字列
|
144
|
+
foo<root></root>
|
145
|
+
|
146
|
+
# 終了ルートタグ後の文字列
|
147
|
+
<root></root>bar
|
148
|
+
|
149
|
+
# ルートタグ無し文字列
|
150
|
+
404 error
|
151
|
+
{: lang="xml"}
|
152
|
+
|
153
|
+
|
154
|
+
|
155
|
+
# 各パーサーの特徴について : DOMパーサー
|
156
|
+
|
157
|
+
**XMLファイルの例**
|
158
|
+
|
159
|
+
<root>
|
160
|
+
<a>foo</a>
|
161
|
+
</root>
|
162
|
+
{: lang="xml"}
|
163
|
+
|
164
|
+
**DOMパーサー : パース結果全体を保持し、ツリーAPI やXPATH 指定でランダムアクセスが可能。 (パース結果全体を保持する必要があるので大規模XMLではメモリ効率が悪い)**
|
165
|
+
|
166
|
+
doc = REXML::Document.new(xml)
|
167
|
+
doc.root.elements['a'].text #=> foo
|
168
|
+
REXML::XPath.each(doc, "/root/a"){|e| p e.text } #=> foo
|
169
|
+
{: lang="ruby"}
|
170
|
+
|
171
|
+
# 各パーサーの特徴について : SAX(SAX2/PULL/Stream)パーサー
|
172
|
+
ファイル先頭からシーケンシャルに1行単位ごとに処理するので、途中のパース結果の保持が不要なため、大規模XMLでもメモリ効率が良い。
|
173
|
+
|
174
|
+
# SAX2 : SAX の仕様に沿ったパース処理 (イベントドリブン)
|
175
|
+
REXML::Parsers::SAX2Parser.new(xml).parse
|
176
|
+
|
177
|
+
# Stream : SAXをシンプルにしたパース処理 (イベントドリブン)
|
178
|
+
REXML::Parsers::StreamParser.new(xml, Listener.new).parse
|
179
|
+
|
180
|
+
# PULL : 自前で1行単位にパース処理する
|
181
|
+
parser = REXML::Parsers::PullParser.new(xml)
|
182
|
+
while parser.has_next?
|
183
|
+
parser.pull
|
184
|
+
end
|
185
|
+
{: lang="ruby"}
|
186
|
+
|
187
|
+
# 2. 各パーサー間でのパース処理結果の統一
|
188
|
+
各パーサーの処理方法は異なるが、パース処理結果に差があるの困る
|
189
|
+
|
190
|
+
- [rexml#168: Fix a bug that SAX2 parser doesn't expand the predefined entities for "characters"](https://github.com/ruby/rexml/pull/168) (SAX2: 定義済み実体参照が展開されない)
|
191
|
+
- [rexml#200: Fix a bug that Stream parser doesn't expand the user-defined entity references for "text"](https://github.com/ruby/rexml/pull/200) (Stream: ユーザー定義実体参照が展開されない)
|
192
|
+
|
193
|
+
**XMLファイルの例**
|
194
|
+
|
195
|
+
<!DOCTYPE root [ ☜ DOCTYPE 宣言
|
196
|
+
<!ENTITY bar "baz"> ☜ ユーザー定義実体参照宣言
|
197
|
+
]>
|
198
|
+
<root>
|
199
|
+
<a>foo&</a> ☜ 定義済み実体参照 ( "foo&" と出力される)
|
200
|
+
<b>&bar;</b> ☜ ユーザー定義実体参照 ( "baz" と出力される)
|
201
|
+
</root>
|
202
|
+
{: lang="xml"}
|
203
|
+
|
204
|
+
# 3. SAXパース処理の不要なイベント応答を削除
|
205
|
+
|
206
|
+
# XMLファイル
|
207
|
+
<root>a</root>
|
208
|
+
|
209
|
+
# REXML(SAX) パース結果
|
210
|
+
[:start_document]
|
211
|
+
[:start_element, nil, "root", "root", {}]
|
212
|
+
[:characters, "a\n"]
|
213
|
+
[:end_element, nil, "root", "root"]
|
214
|
+
[:characters, "\n"] ☜ 終了タグ後に改行コードが応答。
|
215
|
+
[:end_document]
|
216
|
+
{: lang="xml"}
|
217
|
+
|
218
|
+
|
219
|
+
- [rexml#167 : Do not output :text event after the root tag is closed](https://github.com/ruby/rexml/pull/167) で終了タグ後のテキストイベント出力を停止するように修正
|
220
|
+
|
221
|
+
# セキュリティ対策: "XML entity explosion" attack
|
222
|
+
<!DOCTYPE root [
|
223
|
+
<!ENTITY a "&b;&b;&b;&b;&b;&b;&b;&b;&b;&b;">
|
224
|
+
<!ENTITY b "&c;&c;&c;&c;&c;&c;&c;&c;&c;&c;">
|
225
|
+
<!ENTITY c "xxxxx">
|
226
|
+
]><root>&a;</root> #=> xxxxxxxxxxxxxxxxxxxxxxxxxxxxx...
|
227
|
+
{: lang="xml"}
|
228
|
+
|
229
|
+
- [REXML におけるエンティティ展開に伴うサービス不能攻撃について (CVE-2013-1821)](https://www.ruby-lang.org/ja/news/2013/02/22/rexml-dos-2013-02-22/)
|
230
|
+
- ユーザー定義実体参照の展開回数・サイズの上限を決めて超えた場合はエラーとする対処。 **DOMパーサーのみの対応だった。**
|
231
|
+
- [CVE-2024-41946: DoS vulnerability in REXML](https://www.ruby-lang.org/en/news/2024/08/01/dos-rexml-cve-2024-41946/) で報告
|
232
|
+
- [rexml#187: Add support for XML entity expansion limitation in SAX and pull parsers](https://github.com/ruby/rexml/pull/187)で修正
|
233
|
+
|
234
|
+
# セキュリティ対策: 改善
|
235
|
+
- ユーザー定義実体参照の展開回数・サイズの最大値を下記でグローバルに変更できる。 **(gem から使いにくい)**
|
236
|
+
- REXML::Security.entity_expansion_limit=10000
|
237
|
+
- REXML::Security.entity_expansion_text_limit=10240
|
238
|
+
|
239
|
+
**red-datasets gem が巨大XMLをパースするために上記グローバル設定を変更するのは影響が多いので、パースオプジェクト単位で変更可能に。**
|
240
|
+
|
241
|
+
parser = REXML::Parsers::StreamParser.new(xml, listener)
|
242
|
+
parser.entity_expansion_text_limit = 163840
|
243
|
+
parser.parse
|
244
|
+
{: lang="ruby"}
|
245
|
+
|
246
|
+
- [rexml#202: Add local entity expansion limit methods](https://github.com/ruby/rexml/pull/202) (マージ済)
|
247
|
+
|
248
|
+
|
249
|
+
# ActiveSupport Hash.from_xml への組み込みの取り組み
|
250
|
+
|
251
|
+
xml = '<root><a>foo</a><b>bar</b></root>'
|
252
|
+
Hash.from_xml(xml) #=> {"root"=>{"a"=>"foo", "b"=>"bar"}}
|
253
|
+
{: lang="ruby"}
|
254
|
+
|
255
|
+
- ActiveSupport Hash.from_xml : XML を Hash に変換してくれる。
|
256
|
+
- Backend 切り替え可能
|
257
|
+
- LibXML(DOM)
|
258
|
+
- LibXML(SAX)
|
259
|
+
- Nokogiri(DOM)
|
260
|
+
- Nokogiri(SAX)
|
261
|
+
- REXML(DOM)
|
262
|
+
- **REXML(SAX)** ☜ 追加したい。
|
263
|
+
|
264
|
+
|
265
|
+
# [rails#52498: feature: Add SAX-based parser for XmlMini, using REXML](https://github.com/rails/rails/pull/52498)
|
266
|
+
|
267
|
+
REXML(SAX)を追加した結果、31%(YJTI OFF),16%(YJIT ON)速くなったが、 LibXML や Nokogiri に対してまだまだ遅い。
|
268
|
+
|
269
|
+
$ benchmark-driver sax_bench.yaml
|
270
|
+
YJIT=OFF YJIT=ON
|
271
|
+
LibXML 16.818 19.854 i/s
|
272
|
+
LibXMLSAX 18.235 23.218 i/s
|
273
|
+
Nokogiri 16.512 16.512 i/s
|
274
|
+
NokogiriSAX 13.469 15.905 i/s
|
275
|
+
REXML 3.341 5.426 i/s
|
276
|
+
REXMLSAX 4.390 6.301 i/s
|
277
|
+
{: lang="ruby"}
|
278
|
+
|
279
|
+
**速度メリットとメンテナンスコストの観点からClose**
|
280
|
+
|
281
|
+
# [rails#52498: feature: Add SAX-based parser for XmlMini, using REXML](https://github.com/rails/rails/pull/52498)
|
282
|
+
|
283
|
+
この取り組みの中で下記の問題を検出 & 修正済
|
284
|
+
|
285
|
+
- [rexml#167: Do not output :text event after the root tag is closed](https://github.com/ruby/rexml/pull/167) (終了タグ後のテキストイベント出力)
|
286
|
+
- [rexml#168: Fix a bug that SAX2 parser doesn't expand the predefined entities for "characters"](https://github.com/ruby/rexml/pull/168)(SAX2: 定義済み実体参照が展開されない)
|
287
|
+
- [CVE-2024-41946: DoS vulnerability in REXML](https://www.ruby-lang.org/en/news/2024/08/01/dos-rexml-cve-2024-41946/)
|
288
|
+
- [rexml#187: Add support for XML entity expansion limitation in SAX and pull parsers](https://github.com/ruby/rexml/pull/187) (SAX2/Pull: エンティティ展開に伴うサービス不能攻撃)
|
289
|
+
|
290
|
+
# 今後
|
291
|
+
1. DOM/SAX2/PULL/Stream 各パーサーのパース結果を今後も同一に
|
292
|
+
- パース結果比較のテストを増やしたい。
|
293
|
+
2. 性能劣化をCIで気付けるように
|
294
|
+
- [rexml#138: Prepare continuous benchmarking](https://github.com/ruby/rexml/issues/138)
|
295
|
+
3. 今後の性能改善 (rexml 3.2.8 での性能劣化対策)
|
296
|
+
- StringScanner#scan_until(pattern)
|
297
|
+
- pattern に正規表現だけでなく、**文字列** を指定可能にして高速化したい。(CRuby と JRuby 環境で対処が必要)
|
298
|
+
- ※ StringScanner#scan(pattern) は、 pattern に正規表現と文字列が指定可能 [strscan#4: Accept String as a pattern](https://github.com/ruby/strscan/pull/4)
|
299
|
+
- > It shows String as a pattern is 1.25x faster than Regexp as a pattern.
|
data/theme.rb
ADDED
@@ -0,0 +1,22 @@
|
|
1
|
+
@title_slide_title_font_size = screen_size(10 * Pango::SCALE)
|
2
|
+
@title_slide_subtitle_font_size = screen_size(8 * Pango::SCALE)
|
3
|
+
@title_slide_author_font_size = screen_size(6 * Pango::SCALE)
|
4
|
+
@title_slide_date_font_size = screen_size(4 * Pango::SCALE)
|
5
|
+
|
6
|
+
# 共通で使われるフォントサイズなので、主に使われるところをコメント
|
7
|
+
# ヘッドライン
|
8
|
+
@large_font_size = screen_size(3 * Pango::SCALE)
|
9
|
+
# スライド内で一般的に使われるサイズ(リストの1段目とか)
|
10
|
+
@normal_font_size = screen_size(3 * Pango::SCALE)
|
11
|
+
# リストの2段目
|
12
|
+
@small_font_size = screen_size(3 * Pango::SCALE)
|
13
|
+
# リストの3段目
|
14
|
+
@x_small_font_size = screen_size(3 * Pango::SCALE)
|
15
|
+
# 旗の大きさ
|
16
|
+
@xx_small_font_size = screen_size(3 * Pango::SCALE)
|
17
|
+
include_theme("default")
|
18
|
+
#include_theme("table")
|
19
|
+
|
20
|
+
#match(Slide, Table) do |e|
|
21
|
+
# e.prop_set "size", screen_size(2 * Pango::SCALE)
|
22
|
+
#end
|
metadata
ADDED
@@ -0,0 +1,63 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: rabbit-slide-naitoh-rexml-rubykaigi-2024-followup
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 1.0.0
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- NAITOH Jun
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2024-08-31 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: rabbit
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - ">="
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: 2.0.2
|
20
|
+
type: :runtime
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - ">="
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: 2.0.2
|
27
|
+
description: https://rhc.connpass.com/event/320709/
|
28
|
+
email:
|
29
|
+
- naitoh@gmail.com
|
30
|
+
executables: []
|
31
|
+
extensions: []
|
32
|
+
extra_rdoc_files: []
|
33
|
+
files:
|
34
|
+
- ".rabbit"
|
35
|
+
- README.md
|
36
|
+
- Rakefile
|
37
|
+
- config.yaml
|
38
|
+
- pdf/rexml-rubykaigi-2024-followup-rexml-rubykaigi-2024-followup.pdf
|
39
|
+
- rexml-rubykaigi-2024-followup.md
|
40
|
+
- theme.rb
|
41
|
+
homepage: https://slide.rabbit-shocker.org/authors/naitoh/rexml-rubykaigi-2024-followup/
|
42
|
+
licenses: []
|
43
|
+
metadata: {}
|
44
|
+
post_install_message:
|
45
|
+
rdoc_options: []
|
46
|
+
require_paths:
|
47
|
+
- lib
|
48
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
49
|
+
requirements:
|
50
|
+
- - ">="
|
51
|
+
- !ruby/object:Gem::Version
|
52
|
+
version: '0'
|
53
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
54
|
+
requirements:
|
55
|
+
- - ">="
|
56
|
+
- !ruby/object:Gem::Version
|
57
|
+
version: '0'
|
58
|
+
requirements: []
|
59
|
+
rubygems_version: 3.5.11
|
60
|
+
signing_key:
|
61
|
+
specification_version: 4
|
62
|
+
summary: REXML改善のその後
|
63
|
+
test_files: []
|