rabbit-slide-hasumikin-RubyWorldConference2022 2022.11.10.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/PicoRuby_ep3.png +0 -0
- data/PicoRuby_ep3.rab +629 -0
- data/README.rd +24 -0
- data/Rakefile +17 -0
- data/config.yaml +24 -0
- data/images/Monstarlab_Logo_Grey_CMYK.png +0 -0
- data/images/Monstarlab_Logo_Yellow_CMYK.png +0 -0
- data/images/QR_R2P2.png +0 -0
- data/images/QR_picoruby.png +0 -0
- data/images/QR_prk_firmware.png +0 -0
- data/images/R2D2.jpg +0 -0
- data/images/R2D2_mosaic.png +0 -0
- data/images/architecture_1.png +0 -0
- data/images/architecture_2.png +0 -0
- data/images/architecture_3.png +0 -0
- data/images/c3p0_icon-icons.com_76936.png +0 -0
- data/images/ewok_icon-icons.com_76943.png +0 -0
- data/images/hasumi.jpg +0 -0
- data/images/mark_g.png +0 -0
- data/images/mark_y.png +0 -0
- data/images/matz.jpg +0 -0
- data/images/picoruby-t-shirt.jpg +0 -0
- data/images/r2d2_icon-icons.com_76952.png +0 -0
- data/images/rp2.jpg +0 -0
- data/images/rubyconf_1.png +0 -0
- data/images/rubyconf_2.png +0 -0
- data/images/rubykaigi_1.png +0 -0
- data/images/rubykaigi_2.png +0 -0
- data/images/star-background.jpg +0 -0
- data/images/title-background.png +0 -0
- data/memo_/345/220/214/346/231/202/351/200/232/350/250/263/347/224/250/350/252/236/351/233/206.md +127 -0
- data/pdf/RubyWorldConference2022-PicoRuby_ep3.pdf +0 -0
- data/tanoshiimiconruby.rab +13 -0
- data/theme.rb +176 -0
- metadata +92 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: ee2ad31b6425367bfd8e0beb0755bfc0d6fc1d6f70e93e81db8824b1ff768217
|
4
|
+
data.tar.gz: 16ad4618b185dbf7f39591687f888a84ffcfa09895c53b4e4fd255cb57991cb3
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 20e248bdfb9b05b168b511719faa4cd11084ee7e95cebfd146460025b40f77153f4b9735e1222f2fc3fb85047ae9d8e7f0b748e923c27383e885aa1af31fca8e
|
7
|
+
data.tar.gz: 8ca0edddbb3a38da8ab160b017aa427e375569f038263680b822cf8816b1ba49831939a6382af60b75222987a5a0a120dde45c155a6a1e2a5a474cc09690c4c0
|
data/.rabbit
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
PicoRuby_ep3.rab
|
data/PicoRuby_ep3.png
ADDED
Binary file
|
data/PicoRuby_ep3.rab
ADDED
@@ -0,0 +1,629 @@
|
|
1
|
+
= pico
|
2
|
+
|
3
|
+
: subtitle
|
4
|
+
ruby
|
5
|
+
: author
|
6
|
+
Episode Ⅲ\nREVENGE OF THE STDIN
|
7
|
+
: content-source
|
8
|
+
RubyWorld Conference 2022
|
9
|
+
: institution
|
10
|
+
hasumikin>&Monstarlab
|
11
|
+
: date
|
12
|
+
Nov. 10, 2022
|
13
|
+
: allotted-time
|
14
|
+
24m
|
15
|
+
: theme
|
16
|
+
theme
|
17
|
+
|
18
|
+
= sub_chapter
|
19
|
+
Episode Ⅱ
|
20
|
+
\n
|
21
|
+
(('tag:large:ATTACK OF THE RAKE'))
|
22
|
+
\n
|
23
|
+
find on the internet
|
24
|
+
\n
|
25
|
+
== prop
|
26
|
+
: hide-title
|
27
|
+
true
|
28
|
+
|
29
|
+
= This slot has Q&A time
|
30
|
+
# image
|
31
|
+
# src = images/picoruby-t-shirt.jpg
|
32
|
+
# relative_height = 80
|
33
|
+
|
34
|
+
(('tag:center'))PicoRuby@SUZURI
|
35
|
+
|
36
|
+
= sub_chapter
|
37
|
+
(('tag:xx-large:📱'))
|
38
|
+
== prop
|
39
|
+
: hide-title
|
40
|
+
true
|
41
|
+
|
42
|
+
= PicoRuby: An alternative mruby
|
43
|
+
puts "Hello World"
|
44
|
+
|
45
|
+
* mruby = mruby VM + mruby compiler\n=> ((*136 KB*))
|
46
|
+
* MicroRuby = mruby VM + PicoRuby compiler\n=> ((*88 KB*))
|
47
|
+
* PicoRuby = mruby/c VM + PicoRuby compiler\n=> ((*11 KB*))
|
48
|
+
(('tag:center'))
|
49
|
+
(('tag:small:\\nAll measurement on 64-bit Ubuntu'))
|
50
|
+
|
51
|
+
= PicoRuby: An alternative mruby
|
52
|
+
# image
|
53
|
+
# src = images/QR_picoruby.png
|
54
|
+
# relative_height = 80
|
55
|
+
|
56
|
+
(('tag:center'))github.com/picoruby/picoruby
|
57
|
+
|
58
|
+
= PRK Firmware: Keyboard firmware
|
59
|
+
# image
|
60
|
+
# src = images/rubykaigi_2.png
|
61
|
+
# relative_height = 80
|
62
|
+
|
63
|
+
(('tag:center'))Displayed in Large exhibition hall (1F)
|
64
|
+
|
65
|
+
= PRK Firmware: Keyboard firmware
|
66
|
+
# image
|
67
|
+
# src = images/QR_prk_firmware.png
|
68
|
+
# relative_height = 80
|
69
|
+
|
70
|
+
(('tag:center'))github.com/picoruby/prk_firmware
|
71
|
+
|
72
|
+
= Raspberry Pi Pico
|
73
|
+
* RP2040
|
74
|
+
* Arm Cortex-M0+ (dual)
|
75
|
+
* 264 KB RAM
|
76
|
+
* 2 MB ROM
|
77
|
+
* (RP2040 supports upto 16 MB)
|
78
|
+
* $4~ (¥600~)
|
79
|
+
* "Pi Pico W" supports WiFi
|
80
|
+
* Got 技適 (new!)
|
81
|
+
# image
|
82
|
+
# align = right
|
83
|
+
# src = images/rp2.jpg
|
84
|
+
# relative_height = 100
|
85
|
+
|
86
|
+
= chapter
|
87
|
+
(('tag:x-large:demo'))
|
88
|
+
== prop
|
89
|
+
: hide-title
|
90
|
+
true
|
91
|
+
|
92
|
+
= Serial port terminal emulator
|
93
|
+
* Traditional CUI/TUI tools have fallen to\nthe dark side (apparently CR/LF issue)
|
94
|
+
* cu🙅
|
95
|
+
* screen😖
|
96
|
+
* minicom🤦
|
97
|
+
* Linux -> ((*GTKTerm*))😍
|
98
|
+
* Windows -> Tera Term? (not sure)
|
99
|
+
* macOS -> PuTTY? 🤷
|
100
|
+
|
101
|
+
= Summary: It's still a PoC, though...
|
102
|
+
* An integrated Micon programming environment
|
103
|
+
* Ruby compiler inside
|
104
|
+
* Shell ready
|
105
|
+
* Text editor equipped
|
106
|
+
* Your own commands available
|
107
|
+
* Accelerates developing an IoT system with Ruby
|
108
|
+
|
109
|
+
= chapter
|
110
|
+
(('tag:x-large:implementation'))
|
111
|
+
== prop
|
112
|
+
: hide-title
|
113
|
+
true
|
114
|
+
|
115
|
+
= Command: builtin and executable
|
116
|
+
* Builtin commands are implemented in shell
|
117
|
+
* cd, echo, export, pwd, type, etc.
|
118
|
+
* Executable commands are located in storage
|
119
|
+
* cat, ls, rm, vim, etc.
|
120
|
+
|
121
|
+
|
122
|
+
= Command: builtin
|
123
|
+
# enscript ruby
|
124
|
+
# picoruby/mrbgems/picoruby-shell/mrblib/command.rb
|
125
|
+
def exec(params)
|
126
|
+
args = params[1, params.length - 1]
|
127
|
+
case params[0]
|
128
|
+
when "echo"
|
129
|
+
_echo(*args)
|
130
|
+
when "type"
|
131
|
+
_type(*args)
|
132
|
+
when "pwd"
|
133
|
+
puts Dir.pwd
|
134
|
+
when "cd"
|
135
|
+
puts if Dir.chdir(args[0] || ENV['HOME']) != 0
|
136
|
+
when "free"
|
137
|
+
Object.memory_statistics.each do |k, v|
|
138
|
+
print "#{k.to_s.ljust(5)}: #{v.to_s.rjust(8)}", @feed
|
139
|
+
end
|
140
|
+
|
141
|
+
= Command: executable
|
142
|
+
# enscript sh
|
143
|
+
picoruby/mrbgems/picoruby-shell/
|
144
|
+
├─ mrbgem.rake
|
145
|
+
├─ mrblib
|
146
|
+
│ ├─ command.rb
|
147
|
+
│ └─ shell.rb
|
148
|
+
├─ shell_executables 👈
|
149
|
+
│ ├─ cat.rb
|
150
|
+
│ ├─ hello.rb
|
151
|
+
│ ├─ ls.rb
|
152
|
+
│ ├─ rm.rb
|
153
|
+
│ └─ vim.rb
|
154
|
+
└─ src
|
155
|
+
└─ shell.c
|
156
|
+
|
157
|
+
# Search path
|
158
|
+
ENV["PATH"] => ["/bin"]
|
159
|
+
|
160
|
+
= Command: executable
|
161
|
+
* You can write your own executable in PicoRuby
|
162
|
+
|
163
|
+
# enscript sh
|
164
|
+
$ vim hello_ruby.rb
|
165
|
+
```
|
166
|
+
puts "Hello RubyWorld"
|
167
|
+
```
|
168
|
+
$ install hello_ruby.rb /bin/hello_ruby
|
169
|
+
$ hello_ruby
|
170
|
+
Hello RubyWorld
|
171
|
+
|
172
|
+
|
173
|
+
= Filesystem
|
174
|
+
* Computer has filesystem(s)
|
175
|
+
* MS-DOS: ((*M*))icro((*s*))oft ((*D*))isk ((*O*))perating ((*S*))ystem
|
176
|
+
* NTFS, ext{2,3,4}, etc.
|
177
|
+
* Micon generally doesn't have a filesystem
|
178
|
+
|
179
|
+
= FAT filesystem
|
180
|
+
* File Allocation Table (FAT)
|
181
|
+
* Developed by Microsoft along with MS-DOS
|
182
|
+
* 8-bit FAT, FAT12, FAT16, FAT32, exFAT
|
183
|
+
* Under construction for Flash ROM 😅
|
184
|
+
* Today's demo is working on RAM disk
|
185
|
+
|
186
|
+
= VFS (Virtual File System)
|
187
|
+
* VFS-like system written in PicoRuby
|
188
|
+
* Different devices and even different filesystems can mount under the root
|
189
|
+
|
190
|
+
# enscript ruby
|
191
|
+
|
192
|
+
VFS.mount(FAT.new(:flash), "/")
|
193
|
+
VFS.mount(FAT.new(:ram), "/ram")
|
194
|
+
VFS.mount(FAT.new(:sdcard), "/sdcard")
|
195
|
+
|
196
|
+
/
|
197
|
+
├─ bin/
|
198
|
+
├─ home/
|
199
|
+
├─ ram/
|
200
|
+
│ └─ tmp/
|
201
|
+
├─ sdcard/ # SPI not impemented yet
|
202
|
+
│ └─ data.sqlite
|
203
|
+
|
204
|
+
= mruby's build system
|
205
|
+
* mrbgems is a library management system for mruby
|
206
|
+
* You can freely host your own gem
|
207
|
+
* Matz says it's an advanced one (('tag:xx-small:(than MicroPython?)'))
|
208
|
+
* Bundled mgems are automatically loaded
|
209
|
+
|
210
|
+
= mruby's build system
|
211
|
+
# enscript sh
|
212
|
+
mruby
|
213
|
+
├─ Rakefile
|
214
|
+
├─ bin/
|
215
|
+
├─ build/
|
216
|
+
├─ build_config/
|
217
|
+
├─ include/
|
218
|
+
├─ lib/
|
219
|
+
│ └─ mruby/ # MRuby module
|
220
|
+
├─ mrbgems/
|
221
|
+
├─ mrblib/
|
222
|
+
├─ src/
|
223
|
+
├─ tasks/
|
224
|
+
│ ├─
|
225
|
+
│ ├─ mrbgems.rake
|
226
|
+
│ ├─
|
227
|
+
|
228
|
+
= PicoRuby's build system
|
229
|
+
# enscript sh
|
230
|
+
picoruby
|
231
|
+
├─ Rakefile 👈 modified
|
232
|
+
├─ bin/
|
233
|
+
├─ build/
|
234
|
+
├─ build_config/
|
235
|
+
├─ include/
|
236
|
+
├─ lib/
|
237
|
+
│ ├─ mruby/ # `module MRuby`
|
238
|
+
│ └─ picoruby/
|
239
|
+
│ └─ build.rb 👈 MRuby overridden
|
240
|
+
├─ mrbgems/
|
241
|
+
├─ mrblib/
|
242
|
+
├─ src/
|
243
|
+
├─ tasks/
|
244
|
+
│ ├─
|
245
|
+
│ ├─ mrbgems.rake
|
246
|
+
│ ├─
|
247
|
+
│ ├─ picogems.rake 👈 MRuby.each_target overridden
|
248
|
+
│ ├─
|
249
|
+
|
250
|
+
= PicoRuby's build system
|
251
|
+
# enscript sh
|
252
|
+
picoruby
|
253
|
+
├─ build/repos/host/
|
254
|
+
│ ├─ mruby-bin-picorbc/ # picorbc
|
255
|
+
│ └─ mruby-pico-compiler/
|
256
|
+
├─
|
257
|
+
├─ mrbgems/
|
258
|
+
├─ default.gembox
|
259
|
+
├─ picoruby-bin-picoirb/ # picoirb
|
260
|
+
├─ picoruby-bin-picoruby/ # picoruby
|
261
|
+
├─ picoruby-bin-prsh/ # prsh [pəːrʃ]
|
262
|
+
├─ picoruby-filesystem-fat/ # FAT filesystem
|
263
|
+
├─ picoruby-io/ # io gem
|
264
|
+
├─ picoruby-mrubyc/ # mruby/c VM
|
265
|
+
├─ picoruby-sandbox/
|
266
|
+
├─ picoruby-shell/
|
267
|
+
├─ picoruby-terminal/
|
268
|
+
├─ picoruby-vfs/
|
269
|
+
└─ picoruby-vim/
|
270
|
+
|
271
|
+
= PicoRuby's build system
|
272
|
+
# enscript ruby
|
273
|
+
# picoruby/mrbgems/default.gembox
|
274
|
+
MRuby::GemBox.new do |conf|
|
275
|
+
conf.gem github: 'picoruby/mruby-pico-compiler'
|
276
|
+
conf.gem github: 'picoruby/mruby-bin-picorbc'
|
277
|
+
conf.gem core: 'picoruby-bin-picoruby'
|
278
|
+
conf.gem core: 'picoruby-bin-picoirb'
|
279
|
+
conf.gem core: 'picoruby-mrubyc'
|
280
|
+
end
|
281
|
+
|
282
|
+
(('tag:center'))
|
283
|
+
`mruby-pico-compiler` and `mruby-bin-picorbc`
|
284
|
+
\n
|
285
|
+
can be bundled in mruby (MicroRuby)
|
286
|
+
|
287
|
+
= A typical picogem
|
288
|
+
picoruby/
|
289
|
+
└─ mrbgems/picoruby-io/
|
290
|
+
├─ mrbgem.rake
|
291
|
+
├─ mrblib
|
292
|
+
│ └─ io.rb
|
293
|
+
└─ src/
|
294
|
+
├─ hal/
|
295
|
+
│ ├─ hal.h
|
296
|
+
│ └─ posix
|
297
|
+
│ └─ hal.c
|
298
|
+
└─ io.c
|
299
|
+
|
300
|
+
= `require`
|
301
|
+
* mruby doesn't have `require` out of the box
|
302
|
+
* Neither does mruby/c
|
303
|
+
* PicoRuby has introduced `require`
|
304
|
+
* Bundled Picogem code already consumed ROM, but
|
305
|
+
* It isn't loaded onto RAM automatically
|
306
|
+
* Consumes RAM only after `require`
|
307
|
+
|
308
|
+
= Making a PicoRuby app elegantly
|
309
|
+
* CRuby code compatible with PicoRuby
|
310
|
+
* PicoRuby for PC (MRBC_USE_HAL_POSIX)
|
311
|
+
* Write minimum HAL for POSIX
|
312
|
+
* Extend PicoRuby's builtin class if necessary
|
313
|
+
* Keep the app code independent from Picoruby
|
314
|
+
* ((*Do not copy and paste files any longer*))
|
315
|
+
|
316
|
+
= Keep the app code independent
|
317
|
+
# enscript sh
|
318
|
+
example-IoT-app
|
319
|
+
├─ CMakeLists.txt # Just link src/*.c and libmruby.a
|
320
|
+
├─ Rakefile
|
321
|
+
├─ build
|
322
|
+
│ ├─ ...
|
323
|
+
├─ include
|
324
|
+
│ ├─ ...
|
325
|
+
├─ lib
|
326
|
+
│ └─ picoruby # libmruby.a created by `rake`
|
327
|
+
├─ mrblib
|
328
|
+
│ ├─ main_task.rb
|
329
|
+
│ └─ temperature_sensor_task.rb
|
330
|
+
├─ pico_sdk_import.cmake
|
331
|
+
└─ src
|
332
|
+
├─ hal.c # Micon dependent hal
|
333
|
+
├─ temperature_sensor.c
|
334
|
+
├─ main.c
|
335
|
+
├─ ...
|
336
|
+
|
337
|
+
= Compatible CRuby with PicoRuby
|
338
|
+
# enscript ruby
|
339
|
+
# picoruby-vim/mrblib/vim.rb
|
340
|
+
case RUBY_ENGINE
|
341
|
+
when "ruby", "jruby"
|
342
|
+
require_relative "../../picoruby-terminal/mrblib/terminal"
|
343
|
+
when "mruby/c"
|
344
|
+
require "terminal"
|
345
|
+
else
|
346
|
+
raise "Unknown RUBY_ENGINE: #{RUBY_ENGINE}"
|
347
|
+
end
|
348
|
+
|
349
|
+
class Vim
|
350
|
+
(...)
|
351
|
+
end
|
352
|
+
|
353
|
+
= Compatible CRuby with PicoRuby
|
354
|
+
(('tag:center'))
|
355
|
+
Run with CRuby on your PC, then
|
356
|
+
|
357
|
+
# enscript sh
|
358
|
+
$ ruby -r./mrbgems/picoruby-vim/mrblib/vim.rb \
|
359
|
+
-e 'Vim.new("myfile.txt").start'
|
360
|
+
|
361
|
+
(('tag:center'))
|
362
|
+
You can easily implement and debug\na "Pure" PicoRuby app with CRuby
|
363
|
+
|
364
|
+
= chapter
|
365
|
+
(('tag:x-large:demo'))
|
366
|
+
== prop
|
367
|
+
: hide-title
|
368
|
+
true
|
369
|
+
|
370
|
+
= chapter
|
371
|
+
(('tag:x-large:back to'))
|
372
|
+
\n
|
373
|
+
(('tag:x-large:implementation'))
|
374
|
+
== prop
|
375
|
+
: hide-title
|
376
|
+
true
|
377
|
+
|
378
|
+
= Shell and text editor
|
379
|
+
* Without Curses and Readline
|
380
|
+
* Pure Ruby just like Reline (irb of CRuby3.0+)
|
381
|
+
|
382
|
+
= Shell and text editor
|
383
|
+
* Without Curses and Readline
|
384
|
+
* Pure Ruby just like Reline (irb of CRuby3.0+)
|
385
|
+
|
386
|
+
(('tag:center'))
|
387
|
+
(('tag:large'))
|
388
|
+
\n
|
389
|
+
\n
|
390
|
+
((*STDIN confuses you*))😈
|
391
|
+
|
392
|
+
= Standard INPUT
|
393
|
+
* Cooked mode ((*(by default on Unix-like OS)*))
|
394
|
+
* Blocked until submit (recall Kernel#gets)
|
395
|
+
* "a" "b" "c" "[BSPACE]" "d" "[ENTER]" => "abd"
|
396
|
+
* Raw mode ((*(obviously by default on bare metals)*))
|
397
|
+
* Immediately receives any input
|
398
|
+
* "a" "b" "c" "[BSPACE]" "d" => "abc[BSPACE]d"
|
399
|
+
|
400
|
+
(('tag:center'))
|
401
|
+
\n
|
402
|
+
Really confusing in making compatible code
|
403
|
+
|
404
|
+
= Standard INPUT
|
405
|
+
# enscript c
|
406
|
+
static struct termios save_settings;
|
407
|
+
static int save_flags;
|
408
|
+
|
409
|
+
/* Turn into raw mode on Linux (Windows has another solution) */
|
410
|
+
struct termios settings;
|
411
|
+
tcgetattr(fileno(stdin), &save_settings);
|
412
|
+
settings = save_settings;
|
413
|
+
settings.c_iflag = ~(BRKINT | ISTRIP | IXON);
|
414
|
+
settings.c_lflag = ~(ICANON | IEXTEN | ECHO | ECHOE | ECHOK | ECHONL);
|
415
|
+
settings.c_cc[VMIN] = 1;
|
416
|
+
settings.c_cc[VTIME] = 0;
|
417
|
+
tcsetattr(fileno(stdin), TCSANOW, &settings);
|
418
|
+
save_flags = fcntl(fileno(stdin), F_GETFL, 0);
|
419
|
+
fcntl(fileno(stdin), F_SETFL, save_flags | O_NONBLOCK);
|
420
|
+
|
421
|
+
/* Turn back to cooked mode */
|
422
|
+
fcntl(fileno(stdin), F_SETFL, save_flags);
|
423
|
+
tcsetattr(fileno(stdin), TCSANOW, &save_settings);
|
424
|
+
|
425
|
+
= Standard INPUT
|
426
|
+
# enscript ruby
|
427
|
+
# picoruby/mrbgems/picoruby-terminal/mrblib/terminal.rb
|
428
|
+
case RUBY_ENGINE
|
429
|
+
when "ruby", "jruby"
|
430
|
+
require "io/console"
|
431
|
+
|
432
|
+
def IO.get_nonblock(max)
|
433
|
+
STDIN.noecho{ |input| input.read_nonblock(max) }
|
434
|
+
rescue IO::EAGAINWaitReadable => e
|
435
|
+
nil
|
436
|
+
end
|
437
|
+
|
438
|
+
when "mruby/c"
|
439
|
+
require "io"
|
440
|
+
|
441
|
+
def IO.get_nonblock(max)
|
442
|
+
str = read_nonblock(max) # calls C implementation
|
443
|
+
str&.length == 0 ? nil : str
|
444
|
+
end
|
445
|
+
|
446
|
+
end
|
447
|
+
|
448
|
+
= C object in RVALUE: mruby
|
449
|
+
# enscript c
|
450
|
+
|
451
|
+
#define MRB_VTYPE_FOREACH(f) \
|
452
|
+
/* mrb_vtype */ /* c type */ /* ruby class */ \
|
453
|
+
f(MRB_TT_FALSE, void, "false") \
|
454
|
+
...
|
455
|
+
f(MRB_TT_OBJECT, struct RObject, "Object") \
|
456
|
+
...
|
457
|
+
f(MRB_TT_DATA, struct RData, "Data") \ // 👈
|
458
|
+
...
|
459
|
+
|
460
|
+
struct RData {
|
461
|
+
MRB_OBJECT_HEADER;
|
462
|
+
struct iv_tbl *iv;
|
463
|
+
const mrb_data_type *type;
|
464
|
+
void *data; // 👈 You can pin any object here
|
465
|
+
};
|
466
|
+
|
467
|
+
= C object in RVALUE: mruby((*/c*))
|
468
|
+
# enscript c
|
469
|
+
|
470
|
+
typedef struct RInstance {
|
471
|
+
MRBC_OBJECT_HEADER;
|
472
|
+
struct RClass *cls;
|
473
|
+
struct RKeyValueHandle ivar;
|
474
|
+
uint8_t data[]; // 👈 The last member can extend
|
475
|
+
} mrbc_instance;
|
476
|
+
// File.new
|
477
|
+
mrbc_value obj = mrbc_instance_new(vm, v->cls, sizeof(FIL));
|
478
|
+
// ^^^^^^^^^^^
|
479
|
+
// extend RVALUE
|
480
|
+
FIL *file_stream_ptr = (FIL *)obj.instance->data;
|
481
|
+
SET_RETURN(obj); // File.new => #<File:200098a0>
|
482
|
+
|
483
|
+
(('tag:center'))No need to `free(file_stream_ptr);`
|
484
|
+
|
485
|
+
= sub_chapter
|
486
|
+
(('tag:large'))
|
487
|
+
Finally, the shell works🎉
|
488
|
+
== prop
|
489
|
+
: hide-title
|
490
|
+
true
|
491
|
+
|
492
|
+
= sub_chapter
|
493
|
+
(('tag:large:By the way,'))
|
494
|
+
== prop
|
495
|
+
: hide-title
|
496
|
+
true
|
497
|
+
|
498
|
+
= sub_chapter
|
499
|
+
(('tag:large:How should I name\\nthis product'))🤔
|
500
|
+
== prop
|
501
|
+
: hide-title
|
502
|
+
true
|
503
|
+
|
504
|
+
= sub_chapter
|
505
|
+
(('tag:large:Ruby on Raspberry Pi Pico'))
|
506
|
+
== prop
|
507
|
+
: hide-title
|
508
|
+
true
|
509
|
+
|
510
|
+
= sub_chapter
|
511
|
+
(('tag:large:((*R*))uby on ((*R*))aspberry ((*P*))i ((*P*))ico'))
|
512
|
+
== prop
|
513
|
+
: hide-title
|
514
|
+
true
|
515
|
+
|
516
|
+
= chapter
|
517
|
+
(('tag:xx-large:r2-p2'))
|
518
|
+
== prop
|
519
|
+
: hide-title
|
520
|
+
true
|
521
|
+
|
522
|
+
= chapter
|
523
|
+
# image
|
524
|
+
# src = images/R2D2_mosaic.png
|
525
|
+
# relative_height = 100
|
526
|
+
== prop
|
527
|
+
: hide-title
|
528
|
+
true
|
529
|
+
|
530
|
+
= chapter
|
531
|
+
(('tag:xx-large:r2((*-*))p2'))
|
532
|
+
== prop
|
533
|
+
: hide-title
|
534
|
+
true
|
535
|
+
|
536
|
+
= cite
|
537
|
+
# blockquote
|
538
|
+
# title = @kakutani
|
539
|
+
\n
|
540
|
+
“It is said that (account) names
|
541
|
+
\n
|
542
|
+
should not contain
|
543
|
+
\n
|
544
|
+
hyphens or underscores.”
|
545
|
+
\n\n
|
546
|
+
== prop
|
547
|
+
: hide-title
|
548
|
+
true
|
549
|
+
|
550
|
+
= chapter
|
551
|
+
(('tag:xx-large:r2((*-*))p2'))
|
552
|
+
== prop
|
553
|
+
: hide-title
|
554
|
+
true
|
555
|
+
|
556
|
+
= chapter
|
557
|
+
(('tag:xx-large:r2p2'))
|
558
|
+
== prop
|
559
|
+
: hide-title
|
560
|
+
true
|
561
|
+
|
562
|
+
= sub_chapter
|
563
|
+
Be one the first stargazers of
|
564
|
+
\n
|
565
|
+
(('tag:large:github.com/picoruby/R2P2'))
|
566
|
+
\n
|
567
|
+
(turned public repo today!)
|
568
|
+
== prop
|
569
|
+
: hide-title
|
570
|
+
true
|
571
|
+
|
572
|
+
= Wrap-up
|
573
|
+
* R2P2 is an all-in-one programming Micon
|
574
|
+
|
575
|
+
= Wrap-up
|
576
|
+
* R2P2 is an all-in-one programming Micon
|
577
|
+
* Runs on Raspi Pico which has 264 KB RAM and 2 MB ROM
|
578
|
+
|
579
|
+
= Wrap-up
|
580
|
+
* R2P2 is an all-in-one programming Micon
|
581
|
+
* Runs on Raspi Pico which has 264 KB RAM and 2 MB ROM
|
582
|
+
* Picogem ecosystem easily builds your app
|
583
|
+
|
584
|
+
= Wrap-up
|
585
|
+
* R2P2 is an all-in-one programming Micon
|
586
|
+
* Runs on Raspi Pico which has 264 KB RAM and 2 MB ROM
|
587
|
+
* Picogem ecosystem easily builds your app
|
588
|
+
* Filesystem ly makes you happy
|
589
|
+
* Filesystem will make you happy
|
590
|
+
|
591
|
+
= Wrap-up
|
592
|
+
* R2P2 is an all-in-one programming Micon
|
593
|
+
* Runs on Raspi Pico which has 264 KB RAM and 2 MB ROM
|
594
|
+
* Picogem ecosystem easily builds your app
|
595
|
+
* Filesystem will make you happy
|
596
|
+
* STDIN is evil
|
597
|
+
|
598
|
+
= Future work
|
599
|
+
* PicoRuby and Shell
|
600
|
+
* More functionality of vim and the name
|
601
|
+
* UTF-8 support
|
602
|
+
* Multi-task controll on the fly
|
603
|
+
* Redirect and pipeline
|
604
|
+
* Peripherals
|
605
|
+
* FAT filesystem with SD card (SPI)
|
606
|
+
* Real-time clock (RTC)
|
607
|
+
* WiFi and TCP/IP on Raspberry Pi Pico W
|
608
|
+
|
609
|
+
= chapter
|
610
|
+
(('tag:xx-large:q'))
|
611
|
+
(('tag:x-large:and'))
|
612
|
+
(('tag:xx-large:a'))
|
613
|
+
# image
|
614
|
+
# src = images/QR_R2P2.png
|
615
|
+
# relative_height = 80
|
616
|
+
(('tag:center'))github.com/picoruby/r2p2
|
617
|
+
== prop
|
618
|
+
: hide-title
|
619
|
+
true
|
620
|
+
|
621
|
+
= chapter
|
622
|
+
(('tag:x-large:may the'))
|
623
|
+
\n
|
624
|
+
(('tag:xx-large:source'))
|
625
|
+
\n
|
626
|
+
(('tag:x-large:be with you'))
|
627
|
+
== prop
|
628
|
+
: hide-title
|
629
|
+
true
|
data/README.rd
ADDED
@@ -0,0 +1,24 @@
|
|
1
|
+
= PicoRuby epsode 3
|
2
|
+
|
3
|
+
Presentation slide for RubyWorld Conference 2022
|
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-RubyWorldConference2022
|
20
|
+
|
21
|
+
=== Show
|
22
|
+
|
23
|
+
rabbit rabbit-slide-hasumikin-RubyWorldConference2022.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,24 @@
|
|
1
|
+
---
|
2
|
+
id: RubyWorldConference2022
|
3
|
+
base_name: PicoRuby_ep3
|
4
|
+
tags:
|
5
|
+
- PicoRuby
|
6
|
+
- Shell
|
7
|
+
- Filesystem
|
8
|
+
presentation_date: '2022-11-10'
|
9
|
+
presentation_start_time:
|
10
|
+
presentation_end_time:
|
11
|
+
version: 2022.11.10.0
|
12
|
+
licenses: ["MIT License"]
|
13
|
+
slideshare_id:
|
14
|
+
speaker_deck_id:
|
15
|
+
ustream_id:
|
16
|
+
vimeo_id:
|
17
|
+
youtube_id:
|
18
|
+
author:
|
19
|
+
markup_language: :rd
|
20
|
+
name: HASUMI Hitoshi
|
21
|
+
email: hasumikin@gmail.com
|
22
|
+
rubygems_user: hasumikin
|
23
|
+
slideshare_user:
|
24
|
+
speaker_deck_user:
|
Binary file
|
Binary file
|
data/images/QR_R2P2.png
ADDED
Binary file
|
Binary file
|
Binary file
|
data/images/R2D2.jpg
ADDED
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
data/images/hasumi.jpg
ADDED
Binary file
|
data/images/mark_g.png
ADDED
Binary file
|
data/images/mark_y.png
ADDED
Binary file
|
data/images/matz.jpg
ADDED
Binary file
|
Binary file
|
Binary file
|
data/images/rp2.jpg
ADDED
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
data/memo_/345/220/214/346/231/202/351/200/232/350/250/263/347/224/250/350/252/236/351/233/206.md
ADDED
@@ -0,0 +1,127 @@
|
|
1
|
+
以下すべて、スライドに書かれるとは限りませんが、発表の中で言う可能性があります
|
2
|
+
|
3
|
+
## 一見すると一般名詞だが、ソフトウェア用語(固有名詞)であるもの
|
4
|
+
|
5
|
+
- Lemon
|
6
|
+
- Bison
|
7
|
+
- Rails
|
8
|
+
- gem
|
9
|
+
- library
|
10
|
+
- steep
|
11
|
+
- terminal
|
12
|
+
- shell
|
13
|
+
- fish(shellの一種)
|
14
|
+
- thread
|
15
|
+
- fiber
|
16
|
+
- task
|
17
|
+
- builtin
|
18
|
+
- executable(実行ファイルのこと)
|
19
|
+
- null
|
20
|
+
- nil
|
21
|
+
- true
|
22
|
+
- false
|
23
|
+
- array
|
24
|
+
- string
|
25
|
+
- hash
|
26
|
+
|
27
|
+
ちなみにこれらは他のセッションでも頻出すると思います。
|
28
|
+
英語セッションを日本語へ通訳するときは、すべてそのまま発声すればよいです。
|
29
|
+
たとえばgemを宝石と訳すとNGで、たんにジェムと言えばよいです
|
30
|
+
|
31
|
+
## そのほか登場する可能性のある専門用語
|
32
|
+
|
33
|
+
カッコ内は発音。書いていない場合は単にアルファベット読みすればOK
|
34
|
+
|
35
|
+
### ハードウェア用語
|
36
|
+
|
37
|
+
- MCU
|
38
|
+
- CPU
|
39
|
+
- Cortex m0+ (コーテクスエムゼロプラス)
|
40
|
+
- Cortex m4などのバリエーションあり
|
41
|
+
- LED
|
42
|
+
- 以下をまとめてperipheralと言うことがあります。マイコン用語です
|
43
|
+
- GPIO
|
44
|
+
- ADC(アナログ→デジタルコンバータのこと)
|
45
|
+
- DAC(↑の逆)
|
46
|
+
- SPI
|
47
|
+
- I2C(アイスクエアドスィー)
|
48
|
+
|
49
|
+
### ソフトウェア用語
|
50
|
+
|
51
|
+
- RBS
|
52
|
+
- GUI(ジーユーアイ。グイでも通じます)
|
53
|
+
- CUI
|
54
|
+
- TUI
|
55
|
+
- IREP(アイレップ。internal representation = 内部表現)
|
56
|
+
- VM(たんにヴィーエムと言っても通じますが、virtual machineと言い換える方がいいかもしれません)
|
57
|
+
- VM code
|
58
|
+
- RVALUE(アールヴァリュー。Rubyにおける値の内部表現)
|
59
|
+
- Rake(レイク。ビルドシステムの一種)
|
60
|
+
- Make(メイク。ビルドシステムの一種)
|
61
|
+
- CMake(シーメイク。ビルドシステムの一種)
|
62
|
+
- mrbgem(エムアールビージェム。mgemエムジェムと言うこともあり、同じ意味)
|
63
|
+
- picogem(ピコジェム)
|
64
|
+
- 以上の3つは単数形で言ったり複数形で言ったりします。単数形は特定のgemを指し、複数形はその仕組み全体を指します
|
65
|
+
- POSIX(パズィクス。OSの仕様の一種)
|
66
|
+
- FAT(ファットまたはエフエーティー。ファイルシステムの一種。FAT12、FAT16、FAT32という3種類のバリエーションあり)
|
67
|
+
|
68
|
+
### 個別のソフトウェア名称
|
69
|
+
|
70
|
+
- Rubygem(ルビージェム)
|
71
|
+
- Ruby on Rails(ルビーオンレイルズ。これが単数形になることは決してありません)
|
72
|
+
- IRB(バリエーションにMIRB、PicoIRBがあります)
|
73
|
+
- vim(ヴィム)
|
74
|
+
- emacs(イーマクス)
|
75
|
+
- textbringer(テクストブリンガ)
|
76
|
+
- SQLite(エスキューライト)
|
77
|
+
- YACC(ヤック。Lemonの仲間)
|
78
|
+
- sh(シェル。shellとおなじ)
|
79
|
+
- bash(バッシュ。shellの一種)
|
80
|
+
- zsh(ズィーシェル。shellの一種)
|
81
|
+
- Curses(カースィズ)
|
82
|
+
- Readline(リードライン)
|
83
|
+
- Git(ギット)
|
84
|
+
- libc(リブシー)
|
85
|
+
|
86
|
+
### OS
|
87
|
+
|
88
|
+
- Android
|
89
|
+
- iOS
|
90
|
+
- macOS
|
91
|
+
- MS-DOS
|
92
|
+
- Linux(リーヌクス)
|
93
|
+
- Ubuntu(ウブントゥ)
|
94
|
+
|
95
|
+
### Webサービス
|
96
|
+
|
97
|
+
- GitHub(ギットハブ)
|
98
|
+
- GitLab(ギットラブ)
|
99
|
+
|
100
|
+
## シェルコマンド
|
101
|
+
|
102
|
+
基本的にそのままアルファベット読みすればよいです。
|
103
|
+
カッコ内に意味を書きます
|
104
|
+
|
105
|
+
- cd (change directory。ワーキングディレクトリを変更する)
|
106
|
+
- pwd (print working directory。現在のワーキングディレクトリのパスを表示する)
|
107
|
+
- ls (list。ファイルのリストを表示する)
|
108
|
+
- mv (moveファイルの場所や名前を変更する)
|
109
|
+
- cat(concatenate = 連結。「キャット」と発音することが多い)
|
110
|
+
|
111
|
+
## 適切な翻訳がある日本語
|
112
|
+
|
113
|
+
- 規約 -> convention
|
114
|
+
- 構造体 -> Struct(ストラクト)。IREP構造体、mrb構造体のように使う
|
115
|
+
- (キーボードが)「割れてる」やつ -> Split type keyboard
|
116
|
+
- ラズパイ -> Raspberry Pi(ラズベリーパイ)
|
117
|
+
- ラズパイピコまたはラズピコ -> Raspberry Pi Pico(ラズベリーパイピコ)
|
118
|
+
- ラズパイ財団 -> Raspberry Pi Foundation
|
119
|
+
- マイコン -> Microcontroller(Microcomputerではないので注意)
|
120
|
+
- RP2040 -> RP-twenty-forty
|
121
|
+
- ウブンツ -> Ubuntu(ウブントゥ)
|
122
|
+
- 標準入力 -> Standard input
|
123
|
+
- 標準出力 -> Standard output
|
124
|
+
- 標準入出力 -> Standard IO(アイオー)。STDIO(エスティーディーアイオーとも)
|
125
|
+
- GCされる -> being garbage collected
|
126
|
+
- 静的型 -> Static typing
|
127
|
+
- 型チェック -> Type check
|
Binary file
|
data/theme.rb
ADDED
@@ -0,0 +1,176 @@
|
|
1
|
+
# puts font_families.sort
|
2
|
+
@xxx_large_font_size = screen_size(22 * Pango::SCALE)
|
3
|
+
@xx_large_font_size = screen_size(18 * Pango::SCALE)
|
4
|
+
@x_large_font_size = screen_size(11 * Pango::SCALE)
|
5
|
+
@large_font_size = screen_size(7.5 * Pango::SCALE)
|
6
|
+
@normal_font_size = screen_size(5 * Pango::SCALE)
|
7
|
+
@small_font_size = screen_size(4.5 * Pango::SCALE)
|
8
|
+
@x_small_font_size = screen_size(3.5 * Pango::SCALE)
|
9
|
+
@xx_small_font_size = screen_size(3 * Pango::SCALE)
|
10
|
+
|
11
|
+
@font_family = find_font_family('Franklin Gothic Medium')
|
12
|
+
@monospace_font_family = 'Ricty Discord'
|
13
|
+
@title_font_family = find_font_family('Star Jedi Hollow')
|
14
|
+
|
15
|
+
@default_headline_line_color = '#ffff00'
|
16
|
+
@default_headline_line_width = 2
|
17
|
+
@default_headline_line_expand = false
|
18
|
+
|
19
|
+
@default_emphasis_color = "#ff0000"
|
20
|
+
@default_emphasis_level2_color = "#ffffff"
|
21
|
+
|
22
|
+
set_graffiti_color "#FF2B22"
|
23
|
+
set_graffiti_line_width 5
|
24
|
+
|
25
|
+
#@table_frame_color = "#ffffff"
|
26
|
+
#@table_fill_color = "#0f0428"
|
27
|
+
#@table_body_frame_color = "#ffffff"
|
28
|
+
#@table_body_fill_color = "#3f3468"
|
29
|
+
#@table_head_frame_color = "#ffffff"
|
30
|
+
#@table_head_fill_color = "#rf0428"
|
31
|
+
|
32
|
+
@preformatted_fill_color = '#000000'
|
33
|
+
# @preformatted_centering = true
|
34
|
+
@space = screen_y(1)
|
35
|
+
|
36
|
+
# @margin_left = 300
|
37
|
+
|
38
|
+
@image_slide_number_start_flag_color = "#53575a"
|
39
|
+
@image_slide_number_goal_flag_color = "#a81313"
|
40
|
+
|
41
|
+
#@slide_headline_hide = true
|
42
|
+
|
43
|
+
@slide_background_image = 'images/star-background.jpg'
|
44
|
+
include_theme("slide-background-image")
|
45
|
+
|
46
|
+
@title_slide_background_image = 'images/star-background.jpg'
|
47
|
+
include_theme("title-slide-background-image")
|
48
|
+
|
49
|
+
include_theme('default')
|
50
|
+
|
51
|
+
match(Slide, HeadLine) do |heads|
|
52
|
+
#heads.prop_set("size", 0)
|
53
|
+
heads.prop_set("weight", "normal")
|
54
|
+
set_font_family(heads)
|
55
|
+
end
|
56
|
+
match(Slide) do |slides|
|
57
|
+
slides.prop_set("foreground", "#ffff00")
|
58
|
+
end
|
59
|
+
|
60
|
+
match TitleSlide do |slides|
|
61
|
+
slides.margin_left = @margin_right
|
62
|
+
slides.prop_set("foreground", "#ffff00")
|
63
|
+
end
|
64
|
+
match TitleSlide, Title do |title|
|
65
|
+
title.margin_top = -120
|
66
|
+
title.prop_set "size", @xxx_large_font_size
|
67
|
+
title.prop_set "font-family", @title_font_family
|
68
|
+
title.prop_set "weight", "normal"
|
69
|
+
end
|
70
|
+
match TitleSlide, Subtitle do |subtitle|
|
71
|
+
subtitle.margin_top = -290
|
72
|
+
subtitle.prop_set "size", @xxx_large_font_size
|
73
|
+
subtitle.prop_set "font-family", @title_font_family
|
74
|
+
end
|
75
|
+
match TitleSlide, Author do |authors|
|
76
|
+
authors.margin_top = -70
|
77
|
+
end
|
78
|
+
match TitleSlide, ContentSource do |cs|
|
79
|
+
cs.margin_top = 0
|
80
|
+
cs.prop_set "size", @xx_small_font_size
|
81
|
+
cs.prop_set "style", "normal"
|
82
|
+
end
|
83
|
+
match TitleSlide, Date do |date|
|
84
|
+
date.prop_set "size", @xx_small_font_size
|
85
|
+
date.prop_set "style", "normal"
|
86
|
+
end
|
87
|
+
match TitleSlide, Institution do |i|
|
88
|
+
i.prop_set "size", @xx_small_font_size
|
89
|
+
i.prop_set "style", "normal"
|
90
|
+
end
|
91
|
+
|
92
|
+
#@slide_logo_image = 'images/mark_g.png'
|
93
|
+
#include_theme('slide-logo')
|
94
|
+
|
95
|
+
@item_image_1 = 'images/r2d2_icon-icons.com_76952.png'
|
96
|
+
@item_image_2 = 'images/c3p0_icon-icons.com_76936.png'
|
97
|
+
@item_image_3 = 'images/ewok_icon-icons.com_76943.png'
|
98
|
+
|
99
|
+
include_theme("default-item-mark")
|
100
|
+
|
101
|
+
add_image_path("rabbit-images")
|
102
|
+
|
103
|
+
slide_body = [Slide, Body]
|
104
|
+
item_list_item = [ItemList, ItemListItem]
|
105
|
+
|
106
|
+
indent = 50
|
107
|
+
|
108
|
+
match(*(slide_body + (item_list_item * 1))) do |items|
|
109
|
+
name = "item1"
|
110
|
+
items.delete_pre_draw_proc_by_name(name)
|
111
|
+
items.delete_post_draw_proc_by_name(name)
|
112
|
+
draw_image_mark(items, @item_image_1, name, indent: indent)
|
113
|
+
end
|
114
|
+
|
115
|
+
match(*(slide_body + (item_list_item * 2))) do |items|
|
116
|
+
name = "item2"
|
117
|
+
items.delete_pre_draw_proc_by_name(name)
|
118
|
+
items.delete_post_draw_proc_by_name(name)
|
119
|
+
draw_image_mark(items, @item_image_2, name, indent: indent)
|
120
|
+
end
|
121
|
+
|
122
|
+
match(*(slide_body + (item_list_item * 3))) do |items|
|
123
|
+
name = "item3"
|
124
|
+
items.delete_pre_draw_proc_by_name(name)
|
125
|
+
items.delete_post_draw_proc_by_name(name)
|
126
|
+
draw_image_mark(items, @item_image_3, name, indent: indent)
|
127
|
+
end
|
128
|
+
|
129
|
+
enum_list_item = [EnumList, EnumListItem]
|
130
|
+
|
131
|
+
match(*(slide_body + enum_list_item + item_list_item)) do |items|
|
132
|
+
name = "enum-item1"
|
133
|
+
items.delete_pre_draw_proc_by_name(name)
|
134
|
+
items.delete_post_draw_proc_by_name(name)
|
135
|
+
draw_image_mark(items, @item_image_1, name, indent: indent)
|
136
|
+
end
|
137
|
+
|
138
|
+
match(*(slide_body + enum_list_item + (item_list_item * 2))) do |items|
|
139
|
+
name = "enum-item2"
|
140
|
+
items.delete_pre_draw_proc_by_name(name)
|
141
|
+
items.delete_post_draw_proc_by_name(name)
|
142
|
+
draw_image_mark(items, @item_image_2, name, indent: indent)
|
143
|
+
end
|
144
|
+
|
145
|
+
# table
|
146
|
+
all_table = ["**", Table]
|
147
|
+
match(*(all_table + [TableBody, TableRow, TableCell])) do |cells|
|
148
|
+
set_font_family(cells, @monospace_font_family)
|
149
|
+
end
|
150
|
+
match(*(all_table + [TableHead, TableRow, TableHeader])) do |headers|
|
151
|
+
set_font_family(headers, @monospace_font_family)
|
152
|
+
end
|
153
|
+
|
154
|
+
match("**", Emphasis, Emphasis) do |texts|
|
155
|
+
texts.prop_set("foreground", @default_emphasis_level2_color)
|
156
|
+
texts.prop_set("weight", "normal")
|
157
|
+
end
|
158
|
+
|
159
|
+
# Chapter
|
160
|
+
match Slide do |slides|
|
161
|
+
slides.each do |slide|
|
162
|
+
if slide.match?(/sub_chapter/)
|
163
|
+
slide.horizontal_centering = true
|
164
|
+
elsif slide.match?(/chapter/)
|
165
|
+
set_font_family slide, @title_font_family
|
166
|
+
slide.horizontal_centering = true
|
167
|
+
elsif slide.match?(/cite/)
|
168
|
+
slide.prop_set "foreground", "#222222"
|
169
|
+
slide.horizontal_centering = true
|
170
|
+
end
|
171
|
+
end
|
172
|
+
end
|
173
|
+
|
174
|
+
match("**", PreformattedBlock) do |blocks|
|
175
|
+
blocks.prop_set("foreground", "#00FFAF")
|
176
|
+
end
|
metadata
ADDED
@@ -0,0 +1,92 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: rabbit-slide-hasumikin-RubyWorldConference2022
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 2022.11.10.0
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- HASUMI Hitoshi
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2022-11-11 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: Presentation slide for RubyWorld Conference 2022
|
28
|
+
email:
|
29
|
+
- hasumikin@gmail.com
|
30
|
+
executables: []
|
31
|
+
extensions: []
|
32
|
+
extra_rdoc_files: []
|
33
|
+
files:
|
34
|
+
- ".rabbit"
|
35
|
+
- PicoRuby_ep3.png
|
36
|
+
- PicoRuby_ep3.rab
|
37
|
+
- README.rd
|
38
|
+
- Rakefile
|
39
|
+
- config.yaml
|
40
|
+
- images/Monstarlab_Logo_Grey_CMYK.png
|
41
|
+
- images/Monstarlab_Logo_Yellow_CMYK.png
|
42
|
+
- images/QR_R2P2.png
|
43
|
+
- images/QR_picoruby.png
|
44
|
+
- images/QR_prk_firmware.png
|
45
|
+
- images/R2D2.jpg
|
46
|
+
- images/R2D2_mosaic.png
|
47
|
+
- images/architecture_1.png
|
48
|
+
- images/architecture_2.png
|
49
|
+
- images/architecture_3.png
|
50
|
+
- images/c3p0_icon-icons.com_76936.png
|
51
|
+
- images/ewok_icon-icons.com_76943.png
|
52
|
+
- images/hasumi.jpg
|
53
|
+
- images/mark_g.png
|
54
|
+
- images/mark_y.png
|
55
|
+
- images/matz.jpg
|
56
|
+
- images/picoruby-t-shirt.jpg
|
57
|
+
- images/r2d2_icon-icons.com_76952.png
|
58
|
+
- images/rp2.jpg
|
59
|
+
- images/rubyconf_1.png
|
60
|
+
- images/rubyconf_2.png
|
61
|
+
- images/rubykaigi_1.png
|
62
|
+
- images/rubykaigi_2.png
|
63
|
+
- images/star-background.jpg
|
64
|
+
- images/title-background.png
|
65
|
+
- memo_同時通訳用語集.md
|
66
|
+
- pdf/RubyWorldConference2022-PicoRuby_ep3.pdf
|
67
|
+
- tanoshiimiconruby.rab
|
68
|
+
- theme.rb
|
69
|
+
homepage: https://slide.rabbit-shocker.org/authors/hasumikin/RubyWorldConference2022/
|
70
|
+
licenses:
|
71
|
+
- MIT License
|
72
|
+
metadata: {}
|
73
|
+
post_install_message:
|
74
|
+
rdoc_options: []
|
75
|
+
require_paths:
|
76
|
+
- lib
|
77
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
78
|
+
requirements:
|
79
|
+
- - ">="
|
80
|
+
- !ruby/object:Gem::Version
|
81
|
+
version: '0'
|
82
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
83
|
+
requirements:
|
84
|
+
- - ">="
|
85
|
+
- !ruby/object:Gem::Version
|
86
|
+
version: '0'
|
87
|
+
requirements: []
|
88
|
+
rubygems_version: 3.3.7
|
89
|
+
signing_key:
|
90
|
+
specification_version: 4
|
91
|
+
summary: PicoRuby epsode 3
|
92
|
+
test_files: []
|