rabbit-slide-unasuke-omotesandorb-51 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: 0fdb99c91b2683e70c9f6cab7262437c1891f47219954951d9aba7564bba8b34
4
+ data.tar.gz: bf3e9b3b614bad26b679b0239d286e34a8ef639be5fd195ac98c4f4c1f6033ae
5
+ SHA512:
6
+ metadata.gz: 954f3bdff37e8d59742308cef9033a23fc6c0fd4518154d61c81a325e3f66b03f0a27f1c20d70b66477d43a65a7db71c547e3db3cc2a16207604b0a4df776afc
7
+ data.tar.gz: 0b7d661be659d6ebf78028d1ea2122c1a18042ebb2d5de1aba8e4d6cb4f2cc14dc123d7078156e9c4f7133f1406e0062b5237a91b60c7b254429eeb05450b909
data/.rabbit ADDED
@@ -0,0 +1 @@
1
+ slide.md
@@ -0,0 +1,24 @@
1
+ # omotesandorb #51
2
+
3
+ https://omotesandorb.connpass.com/event/149080/
4
+
5
+ ## 作者向け
6
+
7
+ ### 表示
8
+
9
+ rake
10
+
11
+ ### 公開
12
+
13
+ rake publish
14
+
15
+ ## 閲覧者向け
16
+
17
+ ### インストール
18
+
19
+ gem install rabbit-slide-unasuke-omotesandorb-51
20
+
21
+ ### 表示
22
+
23
+ rabbit rabbit-slide-unasuke-omotesandorb-51.gem
24
+
@@ -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
@@ -0,0 +1,21 @@
1
+ ---
2
+ id: omotesandorb-51
3
+ base_name: slide
4
+ tags: ['ruby', 'markdown', 'html']
5
+ presentation_date: 2019-10-03
6
+ presentation_start_time:
7
+ presentation_end_time:
8
+ version: 1.0.0
9
+ licenses: []
10
+ slideshare_id:
11
+ speaker_deck_id:
12
+ ustream_id:
13
+ vimeo_id:
14
+ youtube_id:
15
+ author:
16
+ markup_language: :markdown
17
+ name: unasuke
18
+ email: yusuke1994525@gmail.com
19
+ rubygems_user: unasuke
20
+ slideshare_user:
21
+ speaker_deck_user:
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
@@ -0,0 +1,193 @@
1
+ # Markdownで\\nLazy image loading
2
+ subtitle
3
+ : 2019-10-03
4
+
5
+ subtitle
6
+ : 表参道.rb #51
7
+
8
+ author
9
+ : うなすけ
10
+
11
+ theme
12
+ : unasuke-white
13
+
14
+
15
+ # 自己紹介
16
+ - 名前 : うなすけ
17
+ - 仕事 : 株式会社バンク (エンジニア)
18
+ - インフラ寄りサーバーサイドエンジニア
19
+ - Ruby, Rails, Kubernetes...
20
+
21
+ - {::tag name="x-small"}GitHub [@unasuke](https://github.com/unasuke){:/tag}
22
+ - {::tag name="x-small"}Mastodon [@unasuke@mstdn.unasuke.com](https://mstdn.unasuke.com/@unasuke){:/tag}
23
+ - {::tag name="x-small"}Twitter [@yu\_suke1994](https://twitter.com/yu_suke1994){:/tag}
24
+
25
+ ![](img/icon_raw.jpg){:relative_width="24" align="right" relative_margin_right="-10" relative_margin_top="42"}
26
+
27
+ # はじめに
28
+ See your [chrome://settings/help](chrome://settings/help)
29
+
30
+ ![](img/chrome-version.png){:relative_width="100"}
31
+
32
+ # Native lazy-loading from Chrome 75!
33
+ - [Native lazy-loading for the web  \|  web.dev](https://web.dev/native-lazy-loading)
34
+ - [AddyOsmani.com - Native image lazy-loading for the web!](https://addyosmani.com/blog/lazy-loading/)
35
+ - [遂に来る! Chrome 75にてLazyLoadが正式に実装されるようです🎉 \| フロントエンドBlog \| ミツエーリンクス](https://www.mitsue.co.jp/knowledge/blog/frontend/201904/08_0854.html)
36
+
37
+ # loading="lazy"
38
+ Slimの場合
39
+
40
+ ```slim
41
+ img(src="https://example.org/image.png" loading="lazy")
42
+ ```
43
+
44
+ Hamlの場合
45
+
46
+ ```haml
47
+ %img{src:"https://example.org/image.png", loading: "lazy"}
48
+ ```
49
+
50
+ # loading="lazy"
51
+ Markdownの場合
52
+
53
+ ```markdown
54
+ <img src="https://example.org/image.png" loading="lazy" />
55
+ ```
56
+
57
+ ……いやいやいや
58
+
59
+ # Markdownの場合の理想
60
+ こう書いたら
61
+
62
+ ```markdown
63
+ ![](https://example.org/image.png)
64
+ ```
65
+
66
+ こうなってほしい
67
+
68
+ ```html
69
+ <img src="https://example.org/image.png" loading="lazy" />
70
+ ```
71
+
72
+ # Markdownの場合の理想
73
+
74
+ {:.center}
75
+ {::tag name="x-large"}なぜそんなことを気にしているのか{:/tag}
76
+
77
+ # blog.unasuke.comの事情
78
+ - Middlemanと、blogプラグインによって生成されている
79
+ - 記事自体はMarkdownで書かれている
80
+ - 画像が重いというご意見がある
81
+
82
+ # 画像が重いというご意見
83
+ <https://github.com/unasuke/blog/pull/149>
84
+
85
+ ![](img/blog-pullreq-149.png){:relative_width="100"}
86
+
87
+ # つまりこういうこと
88
+ - blog.unasuke.comは画像が重いことに定評がある
89
+ - img に `loading="lazy"`を付けられたらいいかも?
90
+ - いやでもMarkdownやんけ…‥
91
+
92
+ # どういう手順で進めるか
93
+ 理想
94
+
95
+ 1. `loading="lazy"` で本当に早くなるのか計測
96
+ 1. Markdownの変換結果になんとかして `loading="lazy"`をつける
97
+
98
+ 実際
99
+
100
+ 1. Markdownの変換結果になんとかして `loading="lazy"`をつける
101
+ 1. 本当に早くなるのか計測
102
+
103
+ # なぜ計測ファーストでないか
104
+ - 変換結果に介入できることが検証できなければ、早くなることが確認できても実現できないため
105
+ - gemを作りたいという気持ちのほうが先にあった
106
+ - うっかり
107
+
108
+ # 実装やっていきましょう
109
+ - blog.unasuke.comではRedcarpetを使っている
110
+ - <https://github.com/vmg/redcarpet>
111
+ - RedcarpetにはCustom Rendererを指定できる
112
+ - Custom Rendererで `image(link, title, alt_text)` の返り値をいじればできそう
113
+
114
+ see also
115
+ [Railsでカスタムmarkdownを実装する - k0kubun's blog](https://k0kubun.hatenablog.com/entry/2013/09/19/223400)
116
+
117
+ # Minimum code
118
+ ```ruby
119
+ class CustomRenderer < ::Redcarpet::Render::HTML
120
+ def image(link, title, alt_text)
121
+ "<img loading=\"lazy\" src=\"#{link}\" alt=\"#{alt_text}\" />"
122
+ end
123
+ end
124
+ ```
125
+
126
+ これでやりたいことは実現できる
127
+
128
+ # gemができました
129
+ <https://github.com/unasuke/redcarpet-render-html_lazy_img>
130
+
131
+ ![便利QRコード](https://i.imgur.com/QU9gYu8.png){:relative_width="40"}
132
+
133
+ # gemができました
134
+
135
+ ```ruby
136
+ markdown = Redcarpet::Markdown.new(Redcarpet::Render::HTMLLazyImg::Lazy)
137
+ markdown.render('![example image](https://example.com/img.png)')
138
+ # => '<p><img loading="lazy" src="https://example.com/img.png" alt="example image" /></p>'
139
+
140
+ markdown = Redcarpet::Markdown.new(Redcarpet::Render::HTMLLazyImg::Auto)
141
+ markdown.render('![example image](https://example.com/img.png)')
142
+ # => '<p><img loading="auto" src="https://example.com/img.png" alt="example image" /></p>'
143
+
144
+ markdown = Redcarpet::Markdown.new(Redcarpet::Render::HTMLLazyImg::Eager)
145
+ markdown.render('![example image](https://example.com/img.png)')
146
+ # => '<p><img loading="eager" src="https://example.com/img.png" alt="example image" /></p>'
147
+ ```
148
+
149
+ `loading` attributeの他の値にも対応
150
+ (auto, eager)
151
+
152
+ # Middlemanで使用するには
153
+ `config.rb`にこのように書けばOK
154
+
155
+ ```ruby
156
+ set :markdown, renderer: Redcarpet::Render::HTMLLazyImg::Lazy
157
+ ```
158
+
159
+ # では計測しましょう
160
+ 使用するのは僕のブログ記事でも大量に画像を使用しているこの記事!
161
+
162
+ [TEX Yoda Trackpoint Keyboardを買った \| うなすけとあれこれ](https://blog.unasuke.com/2015/tex-yoda-trackpoint-keyboard-assembly/)
163
+
164
+ ![](https://i.imgur.com/wu0yM2j.png){:relative_width="30"}
165
+
166
+ # 計測方法
167
+ 1. 上記記事をhtmlとしてローカルに保存
168
+ 1. `<img>` に何もなし、`loading="lazy"`, `loading="eager"`を指定したものの3つを用意
169
+ 1. `chrome://flags/#enable-lazy-image-loading` を Enabledに
170
+ 1. Chrome Developer toolsでloadingやperformanceを見る
171
+
172
+ ※ もちろん Disable cacheの状態で
173
+
174
+ # 結果 (6回計測)
175
+ Load eventが発火するまでの時間
176
+
177
+ | | 最悪値 | 最速値 | 平均値 |
178
+ | -- | -- | -- | -- |
179
+ | pure img | 8.33 | 5.42 | 6.25 |
180
+ | lazy | 6.89 | 4.96 | 5.63 |
181
+ | eager | 7.83 | 4.97 | 6.47 |
182
+
183
+ Load eventはページ内の要素が全て読み込まれたら発火するのであまり意味のない計測だったかな……
184
+
185
+ # 結果 (1回のみ取得)
186
+ Performanceの結果
187
+
188
+ ![](img/performance-result.png){:relative_width="100"}
189
+
190
+ # まとめ
191
+ - Loadingにかかる時間が削減されておりよさそう
192
+ - 画像のサイズは変わらないが、ページ自体は軽くなったのでは(サイズの話ではない)
193
+ - Webの最新技術を使うのは楽しい!!!
metadata ADDED
@@ -0,0 +1,69 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: rabbit-slide-unasuke-omotesandorb-51
3
+ version: !ruby/object:Gem::Version
4
+ version: 1.0.0
5
+ platform: ruby
6
+ authors:
7
+ - unasuke
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2019-10-03 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://omotesandorb.connpass.com/event/149080/
28
+ email:
29
+ - yusuke1994525@gmail.com
30
+ executables: []
31
+ extensions: []
32
+ extra_rdoc_files: []
33
+ files:
34
+ - ".rabbit"
35
+ - README.md
36
+ - Rakefile
37
+ - config.yaml
38
+ - img/blog-pullreq-149.png
39
+ - img/chrome-version.png
40
+ - img/icon_raw.jpg
41
+ - img/perfiemance-eager.png
42
+ - img/performance-img.png
43
+ - img/performance-lazy.png
44
+ - img/performance-result.png
45
+ - pdf/omotesandorb-51-slide.pdf
46
+ - slide.md
47
+ homepage: https://slide.rabbit-shocker.org/authors/unasuke/omotesandorb-51/
48
+ licenses: []
49
+ metadata: {}
50
+ post_install_message:
51
+ rdoc_options: []
52
+ require_paths:
53
+ - lib
54
+ required_ruby_version: !ruby/object:Gem::Requirement
55
+ requirements:
56
+ - - ">="
57
+ - !ruby/object:Gem::Version
58
+ version: '0'
59
+ required_rubygems_version: !ruby/object:Gem::Requirement
60
+ requirements:
61
+ - - ">="
62
+ - !ruby/object:Gem::Version
63
+ version: '0'
64
+ requirements: []
65
+ rubygems_version: 3.0.3
66
+ signing_key:
67
+ specification_version: 4
68
+ summary: 'omotesandorb #51'
69
+ test_files: []