rabbit-slide-hasumikin-ToyamaRubyKaigi01 2019.11.3.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 +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: []
|