rabbit-slide-hasumikin-ToyamaRubyKaigi01 2019.11.3.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.rabbit +1 -0
- data/README.rd +24 -0
- data/Rakefile +17 -0
- data/config.yaml +25 -0
- data/images/VM_code.png +0 -0
- data/images/VM_code_2.png +0 -0
- data/images/borges.jpg +0 -0
- data/images/hasumi.jpg +0 -0
- data/images/himi.jpg +0 -0
- data/images/ishikura.jpg +0 -0
- data/images/mark32.png +0 -0
- data/images/mark48.png +0 -0
- data/images/mark64.png +0 -0
- data/images/matz.jpg +0 -0
- data/images/monstarlab.png +0 -0
- data/images/mrubycKaigi02.png +0 -0
- data/images/noboru_i.jpg +0 -0
- data/images/rwc.png +0 -0
- data/images/rwc4.png +0 -0
- data/images/slide-background.png +0 -0
- data/images//346/235/276/346/261/237/345/237/216_Matsue.rb.16x9.jpg +0 -0
- data/images//346/235/276/346/261/237/345/237/216_Matsue.rb.jpg +0 -0
- data/mruby-de-Hello-World.rab +482 -0
- data/pdf/ToyamaRubyKaigi01-mruby-de-Hello-World.pdf +0 -0
- data/theme.rb +104 -0
- metadata +81 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: a702c4fda6262d6f6919a4414ccd016723f6f6a0ea7d0f5cbb60affb2b923de0
|
4
|
+
data.tar.gz: 3cfe649c53337323d2f8df4dee75af7103d5a3dafcd3a008d3f0d0c4f2b4d9f3
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: '088c4286ce162971fd229dc8f4e8c91104724a0566a76291a1a49d07ee4bc1cf20e14eeee5556f3786f3840e7130287a96ec6212b699ef0f890e7945089574e4'
|
7
|
+
data.tar.gz: 4883ca504e33e8e8d79aac6589acb8f31c6a9bfbf5059f430471887ef7a6f775c8b6aaaf5628da2e2ba135f3ca96b8d5f9c9aee8890b9400c24b29c852bdb67b
|
data/.rabbit
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
mruby-de-Hello-World.rab
|
data/README.rd
ADDED
@@ -0,0 +1,24 @@
|
|
1
|
+
= mruby de Hello World!
|
2
|
+
|
3
|
+
The Presentation for RubyKaigiToyama01 by hasumikin
|
4
|
+
|
5
|
+
== For author
|
6
|
+
|
7
|
+
=== Show
|
8
|
+
|
9
|
+
rake
|
10
|
+
|
11
|
+
=== Publish
|
12
|
+
|
13
|
+
rake publish
|
14
|
+
|
15
|
+
== For viewers
|
16
|
+
|
17
|
+
=== Install
|
18
|
+
|
19
|
+
gem install rabbit-slide-hasumikin-ToyamaRubyKaigi01
|
20
|
+
|
21
|
+
=== Show
|
22
|
+
|
23
|
+
rabbit rabbit-slide-hasumikin-ToyamaRubyKaigi01.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: ToyamaRubyKaigi01
|
3
|
+
base_name: mruby-de-Hello-World
|
4
|
+
tags:
|
5
|
+
- mruby
|
6
|
+
- compiler
|
7
|
+
- parser
|
8
|
+
- lemon
|
9
|
+
presentation_date: '2019-11-03'
|
10
|
+
presentation_start_time:
|
11
|
+
presentation_end_time:
|
12
|
+
version: 2019.11.3.0
|
13
|
+
licenses: []
|
14
|
+
slideshare_id:
|
15
|
+
speaker_deck_id:
|
16
|
+
ustream_id:
|
17
|
+
vimeo_id:
|
18
|
+
youtube_id:
|
19
|
+
author:
|
20
|
+
markup_language: :rd
|
21
|
+
name: HASUMI Hitoshi
|
22
|
+
email: hasumikin@gmail.com
|
23
|
+
rubygems_user: hasumikin
|
24
|
+
slideshare_user:
|
25
|
+
speaker_deck_user:
|
data/images/VM_code.png
ADDED
Binary file
|
Binary file
|
data/images/borges.jpg
ADDED
Binary file
|
data/images/hasumi.jpg
ADDED
Binary file
|
data/images/himi.jpg
ADDED
Binary file
|
data/images/ishikura.jpg
ADDED
Binary file
|
data/images/mark32.png
ADDED
Binary file
|
data/images/mark48.png
ADDED
Binary file
|
data/images/mark64.png
ADDED
Binary file
|
data/images/matz.jpg
ADDED
Binary file
|
Binary file
|
Binary file
|
data/images/noboru_i.jpg
ADDED
Binary file
|
data/images/rwc.png
ADDED
Binary file
|
data/images/rwc4.png
ADDED
Binary file
|
Binary file
|
Binary file
|
Binary file
|
@@ -0,0 +1,482 @@
|
|
1
|
+
= mruby de Hello World!
|
2
|
+
|
3
|
+
# : subtitle
|
4
|
+
# SUBTITLE
|
5
|
+
: author
|
6
|
+
HASUMI Hitoshi @hasumikin
|
7
|
+
: institution
|
8
|
+
Monstar Lab, Shimane office
|
9
|
+
: content-source
|
10
|
+
富山Ruby会議01
|
11
|
+
: date
|
12
|
+
2019-11-03
|
13
|
+
: start-time
|
14
|
+
2019-11-03T15:40:00+0900
|
15
|
+
: end-time
|
16
|
+
2019-11-03T16:04:59+0900
|
17
|
+
: theme
|
18
|
+
theme
|
19
|
+
|
20
|
+
= Matsue
|
21
|
+
# image
|
22
|
+
# src = images/松江城_Matsue.rb.16x9.jpg
|
23
|
+
# relative_height = 100
|
24
|
+
== プロパティ
|
25
|
+
: hide-title
|
26
|
+
true
|
27
|
+
|
28
|
+
= Today is
|
29
|
+
|
30
|
+
= Today is
|
31
|
+
(('tag:center'))
|
32
|
+
\n\n\n\n
|
33
|
+
(('tag:x-large:My birthday 🎂'))
|
34
|
+
|
35
|
+
= me
|
36
|
+
* HASUMI Hitoshi
|
37
|
+
* @hasumikin
|
38
|
+
* Microcontroller\ndetective
|
39
|
+
* RubyKaigi 2018, 2019
|
40
|
+
* RubyWorld 2018
|
41
|
+
* KRKRB 2019 (Poland)
|
42
|
+
* RubyConf 2019 (the US)
|
43
|
+
# image
|
44
|
+
# src = images/hasumi.jpg
|
45
|
+
# align = right
|
46
|
+
# relative-height = 80
|
47
|
+
|
48
|
+
= RubyWorld Conference 2019
|
49
|
+
# image
|
50
|
+
# src = images/rwc.png
|
51
|
+
# relative-height = 80
|
52
|
+
|
53
|
+
(('tag:center'))
|
54
|
+
Nov. 7-8, 2019 / Matz江, the Holy City of Ruby + 🍶
|
55
|
+
|
56
|
+
= RubyWorld Conference 2019
|
57
|
+
(('tag:center'))
|
58
|
+
\n\n
|
59
|
+
(('tag:x-large:🍶熱燗 sponsored'))
|
60
|
+
\n\n
|
61
|
+
(('tag:x-large:by Monstar Lab'))
|
62
|
+
|
63
|
+
= Monstar Lab
|
64
|
+
# image
|
65
|
+
# src = images/monstarlab.png
|
66
|
+
# relative_height = 110
|
67
|
+
|
68
|
+
= Monstar Lab
|
69
|
+
(('tag:center'))
|
70
|
+
\n\n\n\n
|
71
|
+
We don't have Toyama office, though
|
72
|
+
|
73
|
+
= Monstar Lab
|
74
|
+
# image
|
75
|
+
# src = images/noboru_i.jpg
|
76
|
+
# relative_height = 80
|
77
|
+
|
78
|
+
(('tag:center'))
|
79
|
+
@noboru_i
|
80
|
+
|
81
|
+
= Monstar Lab
|
82
|
+
(('tag:center'))
|
83
|
+
\n\n\n\n
|
84
|
+
石倉神
|
85
|
+
|
86
|
+
= Monstar Lab
|
87
|
+
(('tag:center'))
|
88
|
+
\n\n\n\n
|
89
|
+
いわゆるゴッド
|
90
|
+
|
91
|
+
= Monstar Lab
|
92
|
+
# image
|
93
|
+
# src = images/ishikura.jpg
|
94
|
+
# relative_height = 80
|
95
|
+
|
96
|
+
(('tag:center'))
|
97
|
+
この人です
|
98
|
+
|
99
|
+
= Monstar Lab
|
100
|
+
(('tag:center'))
|
101
|
+
\n\n\n\n
|
102
|
+
WE ARE HIRING!
|
103
|
+
|
104
|
+
= Monstar Lab
|
105
|
+
# image
|
106
|
+
# src = images/ishikura.jpg
|
107
|
+
# relative_height = 80
|
108
|
+
|
109
|
+
(('tag:center'))
|
110
|
+
採用してます
|
111
|
+
|
112
|
+
= mruby de Hello World!
|
113
|
+
(('tag:center'))
|
114
|
+
\n\n\n\n
|
115
|
+
How to code
|
116
|
+
|
117
|
+
= mruby de Hello World!
|
118
|
+
# enscript C
|
119
|
+
5249 5445 3030 3036 9a78 0000 0062 4d41
|
120
|
+
545a 3030 3030 4952 4550 0000 0044 3030
|
121
|
+
3032 0000 0060 0001 0004 0000 0000 000c
|
122
|
+
1001 4f02 002e 0100 0137 0167 0000 0001
|
123
|
+
0000 0c48 656c 6c6f 2057 6f72 6c64 2100
|
124
|
+
0000 0100 0470 7574 7300 454e 4400 0000
|
125
|
+
0008
|
126
|
+
|
127
|
+
= puts "Hello World!"
|
128
|
+
# enscript C
|
129
|
+
5249 5445 3030 3036 9a78 0000 0062 4d41 RITE0006.x...bMA
|
130
|
+
545a 3030 3030 4952 4550 0000 0044 3030 TZ0000IREP...D00
|
131
|
+
3032 0000 0060 0001 0004 0000 0000 000c 02...`..........
|
132
|
+
1001 4f02 002e 0100 0137 0167 0000 0001 ..O......7.g....
|
133
|
+
0000 0c48 656c 6c6f 2057 6f72 6c64 2100 ...Hello World!.
|
134
|
+
0000 0100 0470 7574 7300 454e 4400 0000 .....puts.END...
|
135
|
+
0008 ..
|
136
|
+
|
137
|
+
(('tag:center'))
|
138
|
+
\n\n
|
139
|
+
VM code
|
140
|
+
|
141
|
+
= CRuby, mruby and mruby/c
|
142
|
+
# image
|
143
|
+
# src = images/VM_code.png
|
144
|
+
# relative_height = 105
|
145
|
+
|
146
|
+
= CRuby(2.6.4) + Ruby code
|
147
|
+
# enscript ruby
|
148
|
+
puts "Hello World!"
|
149
|
+
rss = `ps -o rss= -p #{Process.pid}`.to_f / 1024
|
150
|
+
vsz = `ps -o vsz= -p #{Process.pid}`.to_f / 1024
|
151
|
+
puts "RSS: #{rss} MB"
|
152
|
+
puts "VSZ: #{vsz} MB"
|
153
|
+
|
154
|
+
# $ ruby hello.rb
|
155
|
+
# Hello World!
|
156
|
+
# RSS: 13.63671875 MB
|
157
|
+
# VSZ: 78.6328125 MB
|
158
|
+
|
159
|
+
= mruby(2.0.1) + Ruby code
|
160
|
+
# enscript C
|
161
|
+
#include <mruby.h>
|
162
|
+
#include <mruby/compile.h> // compile at runtime
|
163
|
+
int main(void) {
|
164
|
+
mrb_state *mrb = mrb_open();
|
165
|
+
char code[] = "puts 'Hello World!'";
|
166
|
+
mrb_load_string(mrb, code);
|
167
|
+
mrb_close(mrb);
|
168
|
+
return 0;
|
169
|
+
}
|
170
|
+
// $ valgrind ./hello_ruby
|
171
|
+
// (...)
|
172
|
+
// Hello World!
|
173
|
+
// ==18802==
|
174
|
+
// ==18802== HEAP SUMMARY:
|
175
|
+
// ==18802== in use at exit: 0 bytes in 0 blocks
|
176
|
+
// ==18802== total heap usage: 3,067 allocs, 3,067 frees,
|
177
|
+
// 379,851 bytes allocated
|
178
|
+
|
179
|
+
= mruby(2.0.1) + VM code
|
180
|
+
# enscript C
|
181
|
+
#include <mruby.h>
|
182
|
+
#include <mruby/irep.h>
|
183
|
+
#include "hello.c" // compiled by mrbc
|
184
|
+
int main(void) {
|
185
|
+
mrb_state *mrb = mrb_open();
|
186
|
+
mrb_load_irep(mrb, hello);
|
187
|
+
mrb_close(mrb);
|
188
|
+
return 0;
|
189
|
+
}
|
190
|
+
// $ valgrind ./hello_vm
|
191
|
+
// (...)
|
192
|
+
// Hello World!
|
193
|
+
// ==18858==
|
194
|
+
// ==18858== HEAP SUMMARY:
|
195
|
+
// ==18858== in use at exit: 0 bytes in 0 blocks
|
196
|
+
// ==18858== total heap usage: 3,057 allocs, 3,057 frees,
|
197
|
+
// 329,083 bytes allocated
|
198
|
+
|
199
|
+
|
200
|
+
= mruby/c(2.0) + VM code
|
201
|
+
# enscript C
|
202
|
+
#include "mrubyc/src/mrubyc.h"
|
203
|
+
#include "hello.c"
|
204
|
+
#define MEMORY_SIZE (1024 * 12) // RAM:12KB
|
205
|
+
static uint8_t my_memory_pool[MEMORY_SIZE];
|
206
|
+
int main(void) {
|
207
|
+
mrbc_init(my_memory_pool, MEMORY_SIZE);
|
208
|
+
mrbc_create_task(hello, 0);
|
209
|
+
mrbc_run();
|
210
|
+
return 0;
|
211
|
+
}
|
212
|
+
|
213
|
+
= Hello memory usage
|
214
|
+
# RT
|
215
|
+
|
216
|
+
, CRuby + Ruby code, mruby + Ruby code, mruby + VM code, mruby/c + VM code
|
217
|
+
|
218
|
+
ROM, 18MB(*), 3561KB, 2736KB, 148KB
|
219
|
+
RAM, 13MB, 370KB, 321KB, 12KB
|
220
|
+
ROM\n / RAM, 1.3, 9.6, 8.5, 12.3
|
221
|
+
|
222
|
+
(('tag:center'))
|
223
|
+
(*)...binary size of `bin/ruby` itself
|
224
|
+
|
225
|
+
= CRuby, mruby and mruby/c
|
226
|
+
# image
|
227
|
+
# src = images/VM_code.png
|
228
|
+
# relative_height = 105
|
229
|
+
|
230
|
+
= mruby compiler
|
231
|
+
(('tag:center'))
|
232
|
+
\n\n\n\n
|
233
|
+
How to code?
|
234
|
+
|
235
|
+
= Steps of coding a compiler
|
236
|
+
* Tokenize (Scan, Lexical analyze)
|
237
|
+
* Parse
|
238
|
+
* Generate Code
|
239
|
+
|
240
|
+
(('tag:center'))
|
241
|
+
\n\n
|
242
|
+
Not detailed enough 😵
|
243
|
+
|
244
|
+
= Steps of coding a compiler
|
245
|
+
* Tokenize (Scan, Lexical analyze)
|
246
|
+
* Find keywords
|
247
|
+
* Classify tokens
|
248
|
+
* Parse
|
249
|
+
* Make syntax tree
|
250
|
+
* Make symbol table
|
251
|
+
* Make literal pool
|
252
|
+
* Count local variables and registers
|
253
|
+
* Make each scopes (文字数
|
254
|
+
* Make header and footer
|
255
|
+
|
256
|
+
= Steps of coding a compiler
|
257
|
+
* Tokenize (Scan, Lexical analyze)
|
258
|
+
* Parse
|
259
|
+
* Generate Code
|
260
|
+
|
261
|
+
(('tag:center'))
|
262
|
+
\n\n
|
263
|
+
Just outlines for today
|
264
|
+
|
265
|
+
= mruby compiler written in CRuby
|
266
|
+
(('tag:center'))
|
267
|
+
\n
|
268
|
+
github.com/hasumikin/mmrbc.gem
|
269
|
+
|
270
|
+
= mruby compiler written in CRuby
|
271
|
+
(('tag:center'))
|
272
|
+
\n
|
273
|
+
github.com/hasumikin/mmrbc.gem
|
274
|
+
\n\n\n
|
275
|
+
for only `puts "Hello World!"` 😂\n
|
276
|
+
`[identifier] "[string literal]"`
|
277
|
+
|
278
|
+
= mruby compiler written in CRuby
|
279
|
+
(('tag:center'))
|
280
|
+
\n
|
281
|
+
github.com/hasumikin/mmrbc.gem
|
282
|
+
\n\n\n
|
283
|
+
for only `puts "Hello World!"` 😂\n
|
284
|
+
`[identifier] "[string literal]"`
|
285
|
+
\n\n\n
|
286
|
+
but no cheat 😤
|
287
|
+
|
288
|
+
= Tokenizer
|
289
|
+
* FLEX is a tokenizer generator
|
290
|
+
* You can write tokenizer from scratch w/o FLEX
|
291
|
+
* CRuby, mruby and mmrbc.gem, too
|
292
|
+
|
293
|
+
# enscript Ruby
|
294
|
+
puts("Hello World!")
|
295
|
+
....................
|
296
|
+
p
|
297
|
+
pu
|
298
|
+
put
|
299
|
+
puts
|
300
|
+
puts( # look ahead
|
301
|
+
puts # detemine a token
|
302
|
+
|
303
|
+
= Tokenizer of Ruby
|
304
|
+
* It has state
|
305
|
+
|
306
|
+
# enscript sh
|
307
|
+
$ irb
|
308
|
+
irb(main):001:0> [1, 2, 3].each do |n|
|
309
|
+
irb(main):002:1*
|
310
|
+
|
311
|
+
* `do` keyword sets tokenizer_state as EXPR_BEG
|
312
|
+
* irb can delay parsing until it becomes EXPR_END with `end` keyword
|
313
|
+
|
314
|
+
= Parser and Parser generator
|
315
|
+
* Parser
|
316
|
+
* Syntactic analysis of token list
|
317
|
+
* Parser generator
|
318
|
+
* Generates C code of parser by syntactic definition (and "reduction" code)
|
319
|
+
* Parse algorithms
|
320
|
+
* LL(n), LR(n), etc.
|
321
|
+
|
322
|
+
= Parse algorithm - LL(1)/LR(1)
|
323
|
+
* LL(k) = Left to right, Leftmost derivation
|
324
|
+
* You can write LL parser from scratch
|
325
|
+
* LR(k) = Left to right, Rightmost derivation
|
326
|
+
* You can hardly write LR parser from scratch
|
327
|
+
* You should use parser generator
|
328
|
+
* LALR(k) is a variation of LR
|
329
|
+
* (k) = length of lookahead symbols
|
330
|
+
|
331
|
+
= Parser generator
|
332
|
+
(('tag:center'))
|
333
|
+
\n\n\n\n
|
334
|
+
YACC/BISON
|
335
|
+
|
336
|
+
= YACC/BISON
|
337
|
+
* Most popular parser genarator
|
338
|
+
* Used in CRuby, mruby, bash, Blawn, etc.
|
339
|
+
* BISON is a GNU version of YACC
|
340
|
+
* Thread safe (Reentrant)
|
341
|
+
* Genarates LALR(1) parser
|
342
|
+
|
343
|
+
= However
|
344
|
+
|
345
|
+
= However
|
346
|
+
(('tag:center'))
|
347
|
+
\n\n\n\n
|
348
|
+
(('tag:x-large:I don't use YACC/BISON'))
|
349
|
+
|
350
|
+
= So?
|
351
|
+
|
352
|
+
= So?
|
353
|
+
(('tag:center'))
|
354
|
+
\n\n\n\n
|
355
|
+
(('tag:x-large:LEMON, instead'))
|
356
|
+
|
357
|
+
= LEMON?
|
358
|
+
* Parser generator of SQLite
|
359
|
+
* A part of SQLite project
|
360
|
+
* Generates LALR(1) parser code
|
361
|
+
* as well as YACC/BISON does
|
362
|
+
* Doesn't use global variable to pass information between parser and tokenizer
|
363
|
+
* YACC/BISON does
|
364
|
+
* Tokenizer calls parser in LEMON
|
365
|
+
* Parser calls tokenizer in YACC/BISON
|
366
|
+
|
367
|
+
= Parser calls tokenizer in YACC/BISON
|
368
|
+
# enscript C
|
369
|
+
int yyparse(parser_state *p) {
|
370
|
+
...
|
371
|
+
yynewstate:
|
372
|
+
...
|
373
|
+
yychar = yylex (&yylval, p); // calls tokenizer
|
374
|
+
...
|
375
|
+
goto yynewstate;
|
376
|
+
...
|
377
|
+
}
|
378
|
+
|
379
|
+
= Tokenizer calls parser in LEMON
|
380
|
+
# enscript C
|
381
|
+
void Tokenize(char *code) {
|
382
|
+
...
|
383
|
+
while (token == get_token(code)) {
|
384
|
+
...
|
385
|
+
Parse(parser, token, value); // calls parser
|
386
|
+
...
|
387
|
+
}
|
388
|
+
Parse(parser, 0, NULL);
|
389
|
+
}
|
390
|
+
|
391
|
+
= Parsing "Hello World!" in YACC
|
392
|
+
#enscript sh
|
393
|
+
# an excerpt from mruby/mrbgems/mruby-compiler/core/parse.y
|
394
|
+
primary : literal
|
395
|
+
| string
|
396
|
+
(...)
|
397
|
+
;
|
398
|
+
literal : numeric
|
399
|
+
(...)
|
400
|
+
;
|
401
|
+
string : string_fragment;
|
402
|
+
| string string_fragment
|
403
|
+
{ $$ = concat_string(p, $1, $2); }
|
404
|
+
;
|
405
|
+
string_fragment : tSTRING_BEG string_rep tSTRING
|
406
|
+
{ $$ = new_dstr(p, push($2, $3)); };
|
407
|
+
string_rep : string_interp
|
408
|
+
| string_rep string_interp
|
409
|
+
{ $$ = append($1, $2); };
|
410
|
+
string_interp : tSTRING_MID
|
411
|
+
{ $$ = list1($1); };
|
412
|
+
|
413
|
+
= Parsing "Hello World!" in LEMON
|
414
|
+
#enscript sh
|
415
|
+
# an excerpt from mmrbc.gem/ext/mmrbc/parse.y
|
416
|
+
primary ::= literal.
|
417
|
+
primary ::= string.
|
418
|
+
literal ::= numeric.
|
419
|
+
string ::= string_fragment.
|
420
|
+
string_fragment(A) ::= STRING_BEG string_rep(C) STRING.
|
421
|
+
{ A = new_dstr(p, list3(atom(ATOM_string_add),
|
422
|
+
list1(atom(ATOM_string_content)), C)); }
|
423
|
+
string_rep ::= string_interp.
|
424
|
+
string_rep(A) ::= string_rep(B) string_interp(C).
|
425
|
+
{ A = append(B, C); }
|
426
|
+
string_interp(A) ::= STRING_MID(B).
|
427
|
+
{ A = list2(atom(ATOM_at_tstring_content),
|
428
|
+
literal(B)); }
|
429
|
+
|
430
|
+
= ((* *))
|
431
|
+
(('tag:center'))
|
432
|
+
\n\n
|
433
|
+
\n\n
|
434
|
+
(('tag:xx-large:DEMO?'))
|
435
|
+
== prop
|
436
|
+
: hide-title
|
437
|
+
true
|
438
|
+
|
439
|
+
= Future work
|
440
|
+
|
441
|
+
= Future work ->{mmrbc + mruby/c}
|
442
|
+
* More syntax than `puts "Hello World!"`
|
443
|
+
* Rewrite mmrbc.gem into C
|
444
|
+
* And embed it with mruby/c in one-chip microcontroller which has less than 512KB ROM and 128KB RAM
|
445
|
+
|
446
|
+
= Future work ->{mmrbc + mruby/c}
|
447
|
+
# image
|
448
|
+
# src = images/VM_code.png
|
449
|
+
# relative_height = 105
|
450
|
+
|
451
|
+
= Future work ->{mmrbc + mruby/c}
|
452
|
+
# image
|
453
|
+
# src = images/VM_code_2.png
|
454
|
+
# relative_height = 105
|
455
|
+
|
456
|
+
= Future work ->{mmrbc + mruby/c}
|
457
|
+
(('tag:center'))
|
458
|
+
\n\n
|
459
|
+
"LEMON would generate smaller binary than YACC."
|
460
|
+
\n\n
|
461
|
+
|
462
|
+
# image
|
463
|
+
# src = images/matz.jpg
|
464
|
+
# align = center
|
465
|
+
# relative_height = 70
|
466
|
+
|
467
|
+
= Future work ->{mmrbc + mruby/c}
|
468
|
+
(('tag:center'))
|
469
|
+
\n\n
|
470
|
+
(('tag:large:Possibly and hopefully,'))\n
|
471
|
+
(('tag:large:I will see you on'))\n
|
472
|
+
(('tag:large:RubyKaigi2020 at Matsumoto'))
|
473
|
+
|
474
|
+
= ((* *))
|
475
|
+
(('tag:center'))
|
476
|
+
\n\n
|
477
|
+
\n\n
|
478
|
+
(('tag:xx-large:Thank you!'))
|
479
|
+
== prop
|
480
|
+
: hide-title
|
481
|
+
true
|
482
|
+
|
Binary file
|
data/theme.rb
ADDED
@@ -0,0 +1,104 @@
|
|
1
|
+
# puts font_families.sort
|
2
|
+
@xx_large_font_size = screen_size(11 * Pango::SCALE)
|
3
|
+
@x_large_font_size = screen_size(9 * Pango::SCALE)
|
4
|
+
@large_font_size = screen_size(7 * Pango::SCALE)
|
5
|
+
@normal_font_size = screen_size(4.5 * Pango::SCALE)
|
6
|
+
@small_font_size = screen_size(4 * Pango::SCALE)
|
7
|
+
@x_small_font_size = screen_size(3.5 * Pango::SCALE)
|
8
|
+
@xx_small_font_size = screen_size(3 * Pango::SCALE)
|
9
|
+
|
10
|
+
@default_headline_line_color = '#888888'
|
11
|
+
@font_family = find_font_family('Rockwell')
|
12
|
+
#@foreground = "yellow"
|
13
|
+
@foreground = "#d9333f" # タイトルスライドの文字色
|
14
|
+
|
15
|
+
@table_frame_color = "#ffffff"
|
16
|
+
@table_fill_color = "#0f0428"
|
17
|
+
@table_body_frame_color = "#ffffff"
|
18
|
+
@table_body_fill_color = "#3f3468"
|
19
|
+
@table_head_frame_color = "#ffffff"
|
20
|
+
@table_head_fill_color = "#rf0428"
|
21
|
+
|
22
|
+
@monospace_font_family = 'Ricty Discord'
|
23
|
+
@preformatted_fill_color = '#000000'
|
24
|
+
# @preformatted_centering = true
|
25
|
+
@space = screen_y(1)
|
26
|
+
|
27
|
+
include_theme('default')
|
28
|
+
|
29
|
+
match(Slide, HeadLine) do |heads|
|
30
|
+
heads.prop_set("size", @large_font_size)
|
31
|
+
heads.prop_set("weight", "normal")
|
32
|
+
set_font_family(heads)
|
33
|
+
end
|
34
|
+
|
35
|
+
match Slide do |slides|
|
36
|
+
slides.each do |slide|
|
37
|
+
# スライドの文字色
|
38
|
+
slide.prop_set("foreground", "#fef263")
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
@slide_headline_hide = true
|
43
|
+
#match Slide do |slides|
|
44
|
+
# slides.each do |slide|
|
45
|
+
# slide.prop_set("hide_title", true)
|
46
|
+
# end
|
47
|
+
#end
|
48
|
+
|
49
|
+
@title_slide_background_image = 'images/himi.jpg'
|
50
|
+
include_theme("title-slide-background-image")
|
51
|
+
|
52
|
+
@slide_background_image = 'images/slide-background.png'
|
53
|
+
include_theme("slide-background-image")
|
54
|
+
|
55
|
+
@slide_logo_image = 'images/mark48.png'
|
56
|
+
include_theme('slide-logo')
|
57
|
+
|
58
|
+
@item_image = 'images/mark48.png'
|
59
|
+
|
60
|
+
include_theme("default-item-mark")
|
61
|
+
|
62
|
+
add_image_path("rabbit-images")
|
63
|
+
|
64
|
+
slide_body = [Slide, Body]
|
65
|
+
item_list_item = [ItemList, ItemListItem]
|
66
|
+
|
67
|
+
indent = 70
|
68
|
+
|
69
|
+
match(*(slide_body + (item_list_item * 1))) do |items|
|
70
|
+
name = "item1"
|
71
|
+
items.delete_pre_draw_proc_by_name(name)
|
72
|
+
items.delete_post_draw_proc_by_name(name)
|
73
|
+
draw_image_mark(items, @item_image, name, indent: indent)
|
74
|
+
end
|
75
|
+
|
76
|
+
match(*(slide_body + (item_list_item * 2))) do |items|
|
77
|
+
name = "item2"
|
78
|
+
items.delete_pre_draw_proc_by_name(name)
|
79
|
+
items.delete_post_draw_proc_by_name(name)
|
80
|
+
draw_image_mark(items, @item_image, name, indent: indent)
|
81
|
+
end
|
82
|
+
|
83
|
+
match(*(slide_body + (item_list_item * 3))) do |items|
|
84
|
+
name = "item3"
|
85
|
+
items.delete_pre_draw_proc_by_name(name)
|
86
|
+
items.delete_post_draw_proc_by_name(name)
|
87
|
+
draw_image_mark(items, @item_image, name, indent: indent)
|
88
|
+
end
|
89
|
+
|
90
|
+
enum_list_item = [EnumList, EnumListItem]
|
91
|
+
|
92
|
+
match(*(slide_body + enum_list_item + item_list_item)) do |items|
|
93
|
+
name = "enum-item1"
|
94
|
+
items.delete_pre_draw_proc_by_name(name)
|
95
|
+
items.delete_post_draw_proc_by_name(name)
|
96
|
+
draw_image_mark(items, @item_image, name, indent: indent)
|
97
|
+
end
|
98
|
+
|
99
|
+
match(*(slide_body + enum_list_item + (item_list_item * 2))) do |items|
|
100
|
+
name = "enum-item2"
|
101
|
+
items.delete_pre_draw_proc_by_name(name)
|
102
|
+
items.delete_post_draw_proc_by_name(name)
|
103
|
+
draw_image_mark(items, @item_image, name, indent: indent)
|
104
|
+
end
|
metadata
ADDED
@@ -0,0 +1,81 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: rabbit-slide-hasumikin-ToyamaRubyKaigi01
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 2019.11.3.0
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- HASUMI Hitoshi
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2019-11-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: The Presentation for RubyKaigiToyama01 by hasumikin
|
28
|
+
email:
|
29
|
+
- hasumikin@gmail.com
|
30
|
+
executables: []
|
31
|
+
extensions: []
|
32
|
+
extra_rdoc_files: []
|
33
|
+
files:
|
34
|
+
- ".rabbit"
|
35
|
+
- README.rd
|
36
|
+
- Rakefile
|
37
|
+
- config.yaml
|
38
|
+
- images/VM_code.png
|
39
|
+
- images/VM_code_2.png
|
40
|
+
- images/borges.jpg
|
41
|
+
- images/hasumi.jpg
|
42
|
+
- images/himi.jpg
|
43
|
+
- images/ishikura.jpg
|
44
|
+
- images/mark32.png
|
45
|
+
- images/mark48.png
|
46
|
+
- images/mark64.png
|
47
|
+
- images/matz.jpg
|
48
|
+
- images/monstarlab.png
|
49
|
+
- images/mrubycKaigi02.png
|
50
|
+
- images/noboru_i.jpg
|
51
|
+
- images/rwc.png
|
52
|
+
- images/rwc4.png
|
53
|
+
- images/slide-background.png
|
54
|
+
- images/松江城_Matsue.rb.16x9.jpg
|
55
|
+
- images/松江城_Matsue.rb.jpg
|
56
|
+
- mruby-de-Hello-World.rab
|
57
|
+
- pdf/ToyamaRubyKaigi01-mruby-de-Hello-World.pdf
|
58
|
+
- theme.rb
|
59
|
+
homepage: https://slide.rabbit-shocker.org/authors/hasumikin/ToyamaRubyKaigi01/
|
60
|
+
licenses: []
|
61
|
+
metadata: {}
|
62
|
+
post_install_message:
|
63
|
+
rdoc_options: []
|
64
|
+
require_paths:
|
65
|
+
- lib
|
66
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
67
|
+
requirements:
|
68
|
+
- - ">="
|
69
|
+
- !ruby/object:Gem::Version
|
70
|
+
version: '0'
|
71
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
72
|
+
requirements:
|
73
|
+
- - ">="
|
74
|
+
- !ruby/object:Gem::Version
|
75
|
+
version: '0'
|
76
|
+
requirements: []
|
77
|
+
rubygems_version: 3.0.3
|
78
|
+
signing_key:
|
79
|
+
specification_version: 4
|
80
|
+
summary: mruby de Hello World!
|
81
|
+
test_files: []
|