rabbit-slide-hasumikin-RubyConf2021 2021.11.08.1
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/On-a-Keyboard-Ruby-on-Board--PicoRuby-and-PRK-Firmware.rab +816 -0
- data/README.rd +24 -0
- data/Rakefile +17 -0
- data/config.yaml +25 -0
- data/images/Multitasking.png +0 -0
- data/images/Multitasking_sandbox.png +0 -0
- data/images/Notepad.png +0 -0
- data/images/QR_prk_firmware.png +0 -0
- data/images/QR_raactivityreport.png +0 -0
- data/images/QR_raactivityreport_2.png +0 -0
- data/images/RAGrant.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/architecture_4.png +0 -0
- data/images/black.png +0 -0
- data/images/boot_button_1.png +0 -0
- data/images/crkbd.jpg +0 -0
- data/images/crkbd_2.jpg +0 -0
- data/images/drag_and_drop_1.png +0 -0
- data/images/drag_and_drop_2.png +0 -0
- data/images/firmware_logos.png +0 -0
- data/images/gem.gif +0 -0
- data/images/gem_32.gif +0 -0
- data/images/gem_40.gif +0 -0
- data/images/gem_48.gif +0 -0
- data/images/keyboard.rb.png +0 -0
- data/images/keycaps.png +0 -0
- data/images/kmk.jpg +0 -0
- data/images/matrix_claw44.jpg +0 -0
- data/images/matrix_helix.jpg +0 -0
- data/images/matrix_prk_firmware.jpg +0 -0
- data/images/meishi2.jpg +0 -0
- data/images/msc.png +0 -0
- data/images/picoruby.png +0 -0
- data/images/pipi_gherkin.jpg +0 -0
- data/images/pipigherkin_2.jpg +0 -0
- data/images/prk.png +0 -0
- data/images/promicro.jpg +0 -0
- data/images/promicro_rp2040.jpg +0 -0
- data/images/promicro_rp2040_boot_button.png +0 -0
- data/images/qmk.png +0 -0
- data/images/qmk_kmk_prk.png +0 -0
- data/images/qmk_kmk_prk_2.png +0 -0
- data/images/red_pill.png +0 -0
- data/images/red_pill_24.png +0 -0
- data/images/red_pill_32.png +0 -0
- data/images/red_pill_40.png +0 -0
- data/images/red_pill_48.png +0 -0
- data/images/regex_light.png +0 -0
- data/images/release.png +0 -0
- data/images/rpi_pico.jpg +0 -0
- data/images/shortage.jpg +0 -0
- data/images/shortage.png +0 -0
- data/images/switches.png +0 -0
- data/images/textedit.png +0 -0
- data/no_rabbit.rab +209 -0
- data/pdf/RubyConf2021-On-a-Keyboard-Ruby-on-Board--PicoRuby-and-PRK-Firmware.pdf +0 -0
- data/theme.rb +181 -0
- metadata +117 -0
@@ -0,0 +1,816 @@
|
|
1
|
+
= On a Keyboard Ruby on Board
|
2
|
+
|
3
|
+
: subtitle
|
4
|
+
PicoRuby and PRK Firmware
|
5
|
+
: author
|
6
|
+
hasumikin
|
7
|
+
: place
|
8
|
+
RubyConf 2021 / Nov 8-10
|
9
|
+
: allotted-time
|
10
|
+
30m
|
11
|
+
: theme
|
12
|
+
theme
|
13
|
+
|
14
|
+
= HIDE
|
15
|
+
Wake up, Ruby...
|
16
|
+
|
17
|
+
= HIDE
|
18
|
+
The Micon has you...
|
19
|
+
|
20
|
+
= HIDE
|
21
|
+
Follow the white rabbit.
|
22
|
+
|
23
|
+
= HIDE
|
24
|
+
\n\n\n\n
|
25
|
+
\n\n\n\n
|
26
|
+
\n\n
|
27
|
+
(('tag:small:Hi!'))
|
28
|
+
|
29
|
+
= VCENTER HCENTER XXLARGE
|
30
|
+
PicoRuby
|
31
|
+
\n
|
32
|
+
and
|
33
|
+
\n
|
34
|
+
PRK Firmware
|
35
|
+
|
36
|
+
= VCENTER HCENTER XLARGE
|
37
|
+
PicoRuby
|
38
|
+
\n
|
39
|
+
is a Ruby interpreter
|
40
|
+
\n
|
41
|
+
for Microcontorollers
|
42
|
+
|
43
|
+
= VCENTER HCENTER XLARGE
|
44
|
+
PRK Firmware
|
45
|
+
\n
|
46
|
+
is a keyboard firmware
|
47
|
+
\n
|
48
|
+
framework in PicoRuby
|
49
|
+
|
50
|
+
= VCENTER HCENTER XXLARGE
|
51
|
+
PRK Firmware
|
52
|
+
|
53
|
+
= Hardware became familiar
|
54
|
+
* You can design your PCB even on a web browser
|
55
|
+
* PCB manufacturers are willing to accept your PCB data via the internet
|
56
|
+
* You can receive your PCB or even PCBA (assembled PCB) that arrives from overseas
|
57
|
+
|
58
|
+
= When you build a keyboard
|
59
|
+
* You can choose
|
60
|
+
* Keycaps for appearance and touch
|
61
|
+
# image
|
62
|
+
# src = images/keycaps.png
|
63
|
+
# relative_width = 90
|
64
|
+
|
65
|
+
(('tag:xx-small'))(('tag:right'))
|
66
|
+
https://talpkeyboard.net/?category_id=59be183f428f2d49120007b1
|
67
|
+
|
68
|
+
= When you build a keyboard
|
69
|
+
* You can choose
|
70
|
+
* Keycaps for appearance and touch
|
71
|
+
* Switches for touch
|
72
|
+
# image
|
73
|
+
# src = images/switches.png
|
74
|
+
# relative_width = 90
|
75
|
+
|
76
|
+
(('tag:xx-small'))(('tag:right'))
|
77
|
+
https://talpkeyboard.net/?category_id=59cf8860ed05e668db003f5d
|
78
|
+
|
79
|
+
= When you build a keyboard
|
80
|
+
* You can choose
|
81
|
+
* Keycaps for appearance and touch
|
82
|
+
* Switches for touch
|
83
|
+
* Layout for usability and appearance
|
84
|
+
# image
|
85
|
+
# src = images/crkbd_2.jpg
|
86
|
+
# relative_height = 110
|
87
|
+
|
88
|
+
= When you build a keyboard
|
89
|
+
* You can choose
|
90
|
+
* Keycaps for appearance and touch
|
91
|
+
* Switches for touch
|
92
|
+
* Layout for usability and appearance
|
93
|
+
* Firmware for programmability
|
94
|
+
# image
|
95
|
+
# src = images/firmware_logos.png
|
96
|
+
# relative_height = 90
|
97
|
+
|
98
|
+
= Keyboard firmware
|
99
|
+
* QMK Firmware ... C
|
100
|
+
* KMK Firmware ... Python
|
101
|
+
* PRK Firmware ... ((*Ruby*))
|
102
|
+
# image
|
103
|
+
# src = images/firmware_logos.png
|
104
|
+
# relative_height = 90
|
105
|
+
|
106
|
+
= Keyboard firmware
|
107
|
+
# image
|
108
|
+
# src = images/qmk_kmk_prk.png
|
109
|
+
# relative_height = 103
|
110
|
+
# relative_margin_top = 0
|
111
|
+
|
112
|
+
= Stargaze at picoruby/prk_firmware!
|
113
|
+
# image
|
114
|
+
# src = images/qmk_kmk_prk_2.png
|
115
|
+
# relative_height = 103
|
116
|
+
# relative_margin_top = 0
|
117
|
+
|
118
|
+
= e.g.) picoruby/prk_pipigherkin
|
119
|
+
* Gherkin for the Raspberry Pi Pico
|
120
|
+
* PCB available on talpkeyboard.net
|
121
|
+
* Easy to explain but ((*hard for newbies*)) to build
|
122
|
+
|
123
|
+
# image
|
124
|
+
# src = images/pipigherkin_2.jpg
|
125
|
+
# relative-height = 90
|
126
|
+
|
127
|
+
(('tag:right'))\n\n
|
128
|
+
(('tag:xx-small:https://www.40percent.club/2021/02/pipi-gherkin.html'))
|
129
|
+
|
130
|
+
= e.g.) prk_pipigherkin/keymap.rb
|
131
|
+
# enscript ruby
|
132
|
+
# Initialize Keyboard
|
133
|
+
kbd = Keyboard.new
|
134
|
+
# Initialize GPIO pins
|
135
|
+
kbd.init_pins(
|
136
|
+
[ 12, 11, 10, 9, 8 ], # row0, row1,... respectively
|
137
|
+
[ 7, 6, 5, 4, 3, 2 ] # col0, col1,... respectively
|
138
|
+
)
|
139
|
+
|
140
|
+
= e.g.) prk_pipigherkin/keymap.rb
|
141
|
+
# enscript ruby
|
142
|
+
# Default keymap
|
143
|
+
kbd.add_layer :default, %i(
|
144
|
+
KC_Q KC_W KC_E KC_R KC_T KC_Y KC_U KC_I KC_O KC_P
|
145
|
+
KC_A KC_S KC_D KC_F KC_G KC_H KC_J KC_K KC_L KC_BSPACE
|
146
|
+
Z_LSFT X_LGUI C_LALT V_LCTL SPC_LOWER ENT_RAISE B_RCTL N_RALT M_RGUI UNDS_RSFT
|
147
|
+
)
|
148
|
+
kbd.add_layer :raise, %i(
|
149
|
+
KC_EXLM KC_AT KC_HASH KC_DLR KC_PERC KC_CIRC KC_AMPR KC_ASTER KC_EQUAL KC_PLUS
|
150
|
+
KC_LABK KC_LCBR KC_LBRACKET KC_LPRN KC_MINUS KC_LEFT KC_DOWN KC_UP KC_RIGHT KC_BSPACE
|
151
|
+
KC_RABK KC_RCBR KC_RBRACKET KC_RPRN ADJUST ENT_RAISE KC_BSLASH KC_COMMA KC_DOT KC_SLASH
|
152
|
+
)
|
153
|
+
kbd.add_layer :lower, %i(
|
154
|
+
KC_1 KC_2 KC_3 KC_4 KC_5 KC_6 KC_7 KC_8 KC_9 KC_0
|
155
|
+
KC_TAB KC_NO KC_QUOTE KC_DQUO KC_MINUS KC_GRAVE KC_TILD KC_PIPE KC_COLON KC_SCOLON
|
156
|
+
KC_ESCAPE KC_LGUI KC_LALT KC_LCTL SPC_LOWER ADJUST KC_RCTL KC_RALT KC_RGUI KC_RSFT
|
157
|
+
)
|
158
|
+
# Mode keys
|
159
|
+
kbd.define_mode_key :Z_LSFT, [ :KC_Z, :KC_LSFT, 150, 150 ]
|
160
|
+
# ...
|
161
|
+
kbd.define_mode_key :UNDS_RSFT, [ :KC_UNDS, :KC_RSFT, 200, 150 ]
|
162
|
+
kbd.define_mode_key :ENT_RAISE, [ :KC_ENTER, :raise, 150, 150 ]
|
163
|
+
kbd.define_mode_key :SPC_LOWER, [ :KC_SPACE, :lower, 300, 250 ]
|
164
|
+
|
165
|
+
= picoruby/prk_firmware/releases
|
166
|
+
# image
|
167
|
+
# src = images/release.png
|
168
|
+
# relative-height = 95
|
169
|
+
|
170
|
+
= Install into the microcontroller
|
171
|
+
* Connect USB cable while\npressing "boot button"
|
172
|
+
* RPI-RP2 will be mounted\nas storage, then
|
173
|
+
|
174
|
+
# image
|
175
|
+
# align = right
|
176
|
+
# src = images/boot_button_1.png
|
177
|
+
# relative-height = 83
|
178
|
+
# relative_margin_left = 7
|
179
|
+
# relative_margin_top = -3
|
180
|
+
|
181
|
+
(('tag:right'))
|
182
|
+
(('tag:xx-small'))\n\n\n\n\n\n\n\n\n\n\n
|
183
|
+
https://www.raspberrypi.org/documentation/rp2040/getting-started
|
184
|
+
|
185
|
+
= Install into the microcontroller
|
186
|
+
# image
|
187
|
+
# src = images/promicro_rp2040_boot_button.png
|
188
|
+
# relative-height = 80
|
189
|
+
|
190
|
+
(('tag:center'))Boot button on Pro Micro RP2040
|
191
|
+
|
192
|
+
= Install into the microcontroller
|
193
|
+
# image
|
194
|
+
# src = images/drag_and_drop_1.png
|
195
|
+
# relative-height = 95
|
196
|
+
|
197
|
+
= A new drive automatically mounted
|
198
|
+
\n
|
199
|
+
(('tag:xx-large'))๐
|
200
|
+
|
201
|
+
# image
|
202
|
+
# align = right
|
203
|
+
# src = images/msc.png
|
204
|
+
# relative-height = 95
|
205
|
+
# relative_margin_left = 5
|
206
|
+
|
207
|
+
= ((*Drag & drop keymap.rb*))
|
208
|
+
# image
|
209
|
+
# src = images/drag_and_drop_2.png
|
210
|
+
# relative-height = 95
|
211
|
+
|
212
|
+
= HCENTER VCENTER XXLARGE TITLE
|
213
|
+
(('tag:small:T H E'))
|
214
|
+
\n
|
215
|
+
KEYMAP
|
216
|
+
\n
|
217
|
+
RELOADED
|
218
|
+
|
219
|
+
= VCENTER HCENTER XLARGE
|
220
|
+
Unlike QMK Firmware,\n
|
221
|
+
You don't need\n
|
222
|
+
to ((*compile*))\n
|
223
|
+
anything!
|
224
|
+
|
225
|
+
= Demonstrations
|
226
|
+
# image
|
227
|
+
# src = images/meishi2.jpg
|
228
|
+
# relative-height = 60
|
229
|
+
|
230
|
+
* meishi keypad
|
231
|
+
* meishi means "name card"
|
232
|
+
* Four keys macro pad
|
233
|
+
|
234
|
+
= VCENTER HCENTER XLARGE
|
235
|
+
Fibonacci number
|
236
|
+
\n
|
237
|
+
(DEMO)
|
238
|
+
|
239
|
+
= Fibonacci in keymap.rb
|
240
|
+
# enscript ruby
|
241
|
+
class Fibonacci
|
242
|
+
def initialize
|
243
|
+
@a = 0 ; @b = 1
|
244
|
+
end
|
245
|
+
# Omits F0 and F1
|
246
|
+
def take
|
247
|
+
result = @a + @b
|
248
|
+
@a = @b
|
249
|
+
@b = result
|
250
|
+
end
|
251
|
+
end
|
252
|
+
fibonacci = Fibonacci.new
|
253
|
+
kbd.define_mode_key :FIBONACCI,
|
254
|
+
[ Proc.new { kbd.macro fibonacci.take },
|
255
|
+
:KC_NO, 300, nil ]
|
256
|
+
|
257
|
+
= VCENTER HCENTER XLARGE
|
258
|
+
Password generator
|
259
|
+
\n
|
260
|
+
(DEMO)
|
261
|
+
|
262
|
+
= Password generator in keymap.rb
|
263
|
+
# enscript ruby
|
264
|
+
class Password
|
265
|
+
def initialize(c = nil)
|
266
|
+
@c = c || 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ_!@#$%^&*()=-+/[]{}<>'
|
267
|
+
end
|
268
|
+
def generate
|
269
|
+
unless @srand
|
270
|
+
srand(board_millis) # generate rand()'s seed by board_millis
|
271
|
+
@srand = true
|
272
|
+
end
|
273
|
+
password = ""
|
274
|
+
while true
|
275
|
+
i = rand % 100
|
276
|
+
password << @c[i].to_s
|
277
|
+
break if password.length == 8
|
278
|
+
end
|
279
|
+
return password
|
280
|
+
end
|
281
|
+
end
|
282
|
+
passwd = Password.new
|
283
|
+
kbd.define_mode_key :PASSWD,
|
284
|
+
[ Proc.new { kbd.macro passwd.generate, [] },
|
285
|
+
:KC_NO, 300, nil ]
|
286
|
+
|
287
|
+
(('tag:center'))(('tag:x-small:Use it at your own risk'))
|
288
|
+
|
289
|
+
= Extend your keyboard
|
290
|
+
\n
|
291
|
+
If you wanna input ((*";"*)) with SHIFT and ((*":"*)) without SHIFT,
|
292
|
+
|
293
|
+
# enscript ruby
|
294
|
+
kbd.before_report do
|
295
|
+
kbd.invert_sft if kbd.keys_include?(:KC_SCOLON)
|
296
|
+
end
|
297
|
+
|
298
|
+
(('tag:center'))
|
299
|
+
You no longer need to modify .vimrc
|
300
|
+
|
301
|
+
= Extend your keyboard
|
302
|
+
# enscript ruby
|
303
|
+
class Keyboard
|
304
|
+
def invert_ctl
|
305
|
+
# KC_LCTL: 0b00000001 ๐
|
306
|
+
# KC_LSFT: 0b00000010
|
307
|
+
# KC_LALT: 0b00000100
|
308
|
+
# KC_LGUI: 0b00001000
|
309
|
+
# KC_RCTL: 0b00010000 ๐
|
310
|
+
# KC_RSFT: 0b00100000
|
311
|
+
# KC_RALT: 0b01000000
|
312
|
+
# KC_RGUI: 0b10000000
|
313
|
+
if (@modifier & 0b00010001) > 0
|
314
|
+
@modifier &= 0b11101110
|
315
|
+
else
|
316
|
+
@modifier |= 0b00000001
|
317
|
+
end
|
318
|
+
end
|
319
|
+
end
|
320
|
+
kbd.before_report do
|
321
|
+
kbd.invert_ctl if kbd.keys_include?(:KC_V)
|
322
|
+
end
|
323
|
+
|
324
|
+
= VCENTER HCENTER XLARGE
|
325
|
+
Ruby-mode key
|
326
|
+
\n
|
327
|
+
(DEMO)
|
328
|
+
|
329
|
+
= HCENTER VCENTER XXLARGE TITLE
|
330
|
+
(('tag:small:T H E'))
|
331
|
+
\n
|
332
|
+
KEYBOARD
|
333
|
+
\n
|
334
|
+
REVOLUTIONS
|
335
|
+
|
336
|
+
= Micon of PRK Firmware
|
337
|
+
* Target MCU is "RP2040"
|
338
|
+
* Raspberry Silicon
|
339
|
+
* Implemented on Raspberry Pi Pico
|
340
|
+
* 264KB RAM
|
341
|
+
* Arm 32bit Cortex-M0+ (dual)
|
342
|
+
|
343
|
+
(('tag:right'))
|
344
|
+
(('tag:xx-small'))
|
345
|
+
\n\n\n\n\n\n\n\n\n\n\n
|
346
|
+
https://pc.watch.impress.co.jp/docs/news/1301670.html
|
347
|
+
|
348
|
+
# image
|
349
|
+
# src = images/rpi_pico.jpg
|
350
|
+
# align = right
|
351
|
+
# relative-height = 90
|
352
|
+
# relative_margin_left = 2
|
353
|
+
|
354
|
+
= Micon of PRK Firmware
|
355
|
+
* RP2040 assembled\non Pro Micro\n((*SPARKFUN*))\n((*PRO MICRO - RP2040*))\n[model no. DEV-18288]
|
356
|
+
|
357
|
+
# image
|
358
|
+
# src = images/promicro_rp2040.jpg
|
359
|
+
# align = right
|
360
|
+
# relative-height = 85
|
361
|
+
# relative_margin_left = 10
|
362
|
+
|
363
|
+
(('tag:right'))\n\n\n\n
|
364
|
+
(('tag:xx-small:https://www.sparkfun.com/products/18288'))
|
365
|
+
|
366
|
+
= VCENTER HCENTER XXLARGE
|
367
|
+
PicoRuby
|
368
|
+
|
369
|
+
= https://ruby.or.jp/en
|
370
|
+
# image
|
371
|
+
# src = images/RAGrant.png
|
372
|
+
# relative_width = 94
|
373
|
+
|
374
|
+
= Multitasking
|
375
|
+
# image
|
376
|
+
# src = images/Multitasking.png
|
377
|
+
# relative_width = 100
|
378
|
+
# relative_margin_top = 0
|
379
|
+
|
380
|
+
= Multitasking
|
381
|
+
# image
|
382
|
+
# src = images/Multitasking_sandbox.png
|
383
|
+
# relative_width = 100
|
384
|
+
# relative_margin_top = 0
|
385
|
+
|
386
|
+
= HCENTER VCENTER XXLARGE TITLE
|
387
|
+
(('tag:small:T H E'))
|
388
|
+
\n
|
389
|
+
RUBY
|
390
|
+
\n
|
391
|
+
RESURRECTIONS
|
392
|
+
|
393
|
+
= Architecture
|
394
|
+
# image
|
395
|
+
# src = images/architecture_1.png
|
396
|
+
# relative_width = 100
|
397
|
+
# relative_margin_top = 0
|
398
|
+
|
399
|
+
* An mruby app generally consists of ((*VM code*)) and ((*VM*))
|
400
|
+
* mruby-compiler has somehow big footprint
|
401
|
+
* It isn't assumed to be embedded
|
402
|
+
|
403
|
+
= Architecture
|
404
|
+
# image
|
405
|
+
# src = images/architecture_2.png
|
406
|
+
# relative_width = 100
|
407
|
+
# relative_margin_top = 0
|
408
|
+
|
409
|
+
* Technically, you can embed also ((*Ruby script*)) and ((*mruby-compiler*))
|
410
|
+
* It makes sense if the computing resource is big enough
|
411
|
+
|
412
|
+
= Architecture
|
413
|
+
# image
|
414
|
+
# src = images/architecture_3.png
|
415
|
+
# relative_width = 100
|
416
|
+
# relative_margin_top = 0
|
417
|
+
|
418
|
+
* mruby/c is a smaller VM for one-chip microcontrollers
|
419
|
+
* Naturally, we don't embed mruby-compiler with it
|
420
|
+
|
421
|
+
= Architecture
|
422
|
+
# image
|
423
|
+
# src = images/architecture_4.png
|
424
|
+
# relative_width = 100
|
425
|
+
# relative_margin_top = 0
|
426
|
+
|
427
|
+
(('tag:center:PicoRuby = PicoRuby-compiler + mruby/cVM'))
|
428
|
+
|
429
|
+
= Architecture
|
430
|
+
* As you know, the syntax of Ruby is complicated
|
431
|
+
* Easy to imagine that a Ruby compiler consumes large memory
|
432
|
+
|
433
|
+
= Architecture
|
434
|
+
* You might think that you can use a microcontroller that has a big RAM
|
435
|
+
* The answer is "Yes and No"
|
436
|
+
* You should do it if you can
|
437
|
+
* The bigger RAM, the bigger electric energy consumption
|
438
|
+
* The bigger resource, the more expensive in general
|
439
|
+
|
440
|
+
= To make a small Ruby compiler
|
441
|
+
* mruby-compiler depends on mruby
|
442
|
+
* The main reason for big footprint
|
443
|
+
* PicoRuby compiler should be coded from scratch
|
444
|
+
* To make PicoRuby compiler small
|
445
|
+
* Every fine logic should be minimal
|
446
|
+
* Lemon parser generator instead of Bison/Yacc
|
447
|
+
* A part of SQLite project
|
448
|
+
|
449
|
+
= RAM consumption
|
450
|
+
$ valgrind \
|
451
|
+
--tool=massif \
|
452
|
+
--stacks=yes \
|
453
|
+
mrbc hello_world.rb
|
454
|
+
|
455
|
+
$ valgrind \
|
456
|
+
--tool=massif \
|
457
|
+
--stacks=yes \
|
458
|
+
picorbc hello_world.rb
|
459
|
+
|
460
|
+
$ ms_print massif.out.xxx | less
|
461
|
+
|
462
|
+
= hello_world.rb (20 bytes)
|
463
|
+
\n\n\n\n
|
464
|
+
(('tag:center:puts "Hello World!"'))
|
465
|
+
|
466
|
+
= mrbc hello_world.rb -> 133.5 KB
|
467
|
+
--------------------------------------------------------------------------------
|
468
|
+
Command: mrbc hello_world.rb
|
469
|
+
Massif arguments: --stacks=yes
|
470
|
+
--------------------------------------------------------------------------------
|
471
|
+
KB
|
472
|
+
133.5^ #
|
473
|
+
| #
|
474
|
+
| #
|
475
|
+
| #
|
476
|
+
| #
|
477
|
+
| #
|
478
|
+
| #
|
479
|
+
| #
|
480
|
+
| #
|
481
|
+
| @:::@#:
|
482
|
+
| :::@:::::::@:::@:::@:::@#::
|
483
|
+
| ::::::@:::::@::@:::@::@::@:: ::::@:::@:::@:::@#::
|
484
|
+
| @@@@::::::: :@:: ::@::@: :@: @::@:: ::::@:::@:::@:::@#::
|
485
|
+
| @ :: :::: :@:: ::@::@: :@: @::@:: ::::@:::@:::@:::@#::
|
486
|
+
| @ :: :::: :@:: ::@::@: :@: @::@:: ::::@:::@:::@:::@#::
|
487
|
+
| @ :: :::: :@:: ::@::@: :@: @::@:: ::::@:::@:::@:::@#::
|
488
|
+
| @ :: :::: :@:: ::@::@: :@: @::@:: ::::@:::@:::@:::@#::
|
489
|
+
| @ :: :::: :@:: ::@::@: :@: @::@:: ::::@:::@:::@:::@#::
|
490
|
+
| @ :: :::: :@:: ::@::@: :@: @::@:: ::::@:::@:::@:::@#::
|
491
|
+
| @@ :: :::: :@:: ::@::@: :@: @::@:: ::::@:::@:::@:::@#::
|
492
|
+
0 +----------------------------------------------------------------------->ki
|
493
|
+
0 936.3
|
494
|
+
|
495
|
+
= picorbc hello_world.rb -> 16.98 KB
|
496
|
+
--------------------------------------------------------------------------------
|
497
|
+
Command: picorbc hello_world.rb
|
498
|
+
Massif arguments: --stacks=yes
|
499
|
+
--------------------------------------------------------------------------------
|
500
|
+
KB
|
501
|
+
16.98^ #
|
502
|
+
| @::@# :::@:: @
|
503
|
+
| :@::@#::::@::::@ :::
|
504
|
+
| :@::@#::::@::::@::::
|
505
|
+
| :@::@#::::@::::@::::
|
506
|
+
| :@::@#::::@::::@::::
|
507
|
+
| :@::@#::::@::::@::::
|
508
|
+
| :@::@#::::@::::@::::@
|
509
|
+
| :@::@#::::@::::@::::@
|
510
|
+
| :@::@#::::@::::@::::@
|
511
|
+
| @@::@::@#::::@::::@::::@
|
512
|
+
| @ ::@::@#::::@::::@::::@
|
513
|
+
| @ ::@::@#::::@::::@::::@
|
514
|
+
| :: @ ::@::@#::::@::::@::::@
|
515
|
+
| : : @ ::@::@#::::@::::@::::@
|
516
|
+
| : : @ ::@::@#::::@::::@::::@
|
517
|
+
| : :: @ ::@::@#::::@::::@::::@
|
518
|
+
| : :: @ ::@::@#::::@::::@::::@
|
519
|
+
| : :: @ ::@::@#::::@::::@::::@
|
520
|
+
| :: :: :::::::::::::::::::::::::::@:::@: @ ::@::@#::::@::::@::::@:
|
521
|
+
0 +----------------------------------------------------------------------->ki
|
522
|
+
0 222.0
|
523
|
+
|
524
|
+
= keymap.rb of meish2 (2388 bytes)
|
525
|
+
#enscript ruby
|
526
|
+
while !$mutex
|
527
|
+
relinquish
|
528
|
+
end
|
529
|
+
kbd = Keyboard.new
|
530
|
+
kbd.init_pins(
|
531
|
+
[ 6, 7 ], # row0, row1
|
532
|
+
[ 28, 27 ] # col0, col1
|
533
|
+
)
|
534
|
+
kbd.add_layer :default, %i[ RUBY_GUI KC_1 RAISE_ENTER LOWER_SPACE ]
|
535
|
+
kbd.add_layer :raise, %i[ FIBONACCI PASSWD RAISE_ENTER ADJUST ]
|
536
|
+
kbd.add_layer :lower, %i[ KC_E KC_F RAISE_ENTER LOWER_SPACE) ]
|
537
|
+
kbd.add_layer :adjust, %i[ KC_SCOLON KC_LSFT RAISE_ENTER ADJUST ]
|
538
|
+
kbd.define_mode_key :RAISE_ENTER, [ :KC_ENTER, :raise, 200, 150 ]
|
539
|
+
kbd.define_mode_key :LOWER_SPACE, [ :KC_SPACE, :lower, 300, 400 ]
|
540
|
+
kbd.define_mode_key :ADJUST, [ nil, :adjust, nil, nil ]
|
541
|
+
kbd.define_mode_key :RUBY_GUI, [ Proc.new { kbd.ruby }, :KC_RGUI, 300, nil ]
|
542
|
+
class Fibonacci
|
543
|
+
def initialize
|
544
|
+
@a = 0 ; @b = 1
|
545
|
+
end
|
546
|
+
def take
|
547
|
+
result = @a + @b
|
548
|
+
@a = @b
|
549
|
+
@b = result
|
550
|
+
end
|
551
|
+
end
|
552
|
+
fibonacci = Fibonacci.new
|
553
|
+
kbd.define_mode_key :FIBONACCI, [ Proc.new { kbd.macro fibonacci.take }, :KC_NO, 300, nil ]
|
554
|
+
class Password
|
555
|
+
def initialize
|
556
|
+
@c = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ_!@#$%^&*()=-+/[]{}<>'
|
557
|
+
end
|
558
|
+
def generate
|
559
|
+
unless @srand
|
560
|
+
# generate seed with board_millis
|
561
|
+
srand(board_millis)
|
562
|
+
@srand = true
|
563
|
+
end
|
564
|
+
password = ""
|
565
|
+
while true
|
566
|
+
i = rand % 100
|
567
|
+
password << @c[i].to_s
|
568
|
+
break if password.length == 8
|
569
|
+
end
|
570
|
+
return password
|
571
|
+
end
|
572
|
+
end
|
573
|
+
password = Password.new
|
574
|
+
kbd.define_mode_key :PASSWD, [ Proc.new { kbd.macro password.generate, [] }, :KC_NO, 300, nil ]
|
575
|
+
kbd.before_report do
|
576
|
+
kbd.invert_sft if kbd.keys_include?(:KC_SCOLON)
|
577
|
+
end
|
578
|
+
kbd.start!
|
579
|
+
|
580
|
+
= mrbc keymap.rb -> 206.1 KB
|
581
|
+
--------------------------------------------------------------------------------
|
582
|
+
Command: mrbc keymap.rb
|
583
|
+
Massif arguments: --stacks=yes
|
584
|
+
--------------------------------------------------------------------------------
|
585
|
+
KB
|
586
|
+
206.1^ ##
|
587
|
+
| @#
|
588
|
+
| @#
|
589
|
+
| @#
|
590
|
+
| @#
|
591
|
+
| @#
|
592
|
+
| :@#
|
593
|
+
| :@#
|
594
|
+
| :@#
|
595
|
+
| ::::@#
|
596
|
+
| :: :@# :
|
597
|
+
| @::::::::::::::::::::: :@# :
|
598
|
+
| @::: :: ::: : :: ::::: :@# :
|
599
|
+
| @:::::@::: :: ::: : :: ::::: :@# :
|
600
|
+
| ::::::::@@::::::::@:: : @::: :: ::: : :: ::::: :@# ::
|
601
|
+
| @@::::::::: : :: @ :: : :: @:: : @::: :: ::: : :: ::::: :@# ::
|
602
|
+
| @ : :: : :: : :: @ :: : :: @:: : @::: :: ::: : :: ::::: :@# ::
|
603
|
+
| @ : :: : :: : :: @ :: : :: @:: : @::: :: ::: : :: ::::: :@# ::
|
604
|
+
| @ : :: : :: : :: @ :: : :: @:: : @::: :: ::: : :: ::::: :@# ::
|
605
|
+
| @ : :: : :: : :: @ :: : :: @:: : @::: :: ::: : :: ::::: :@# ::
|
606
|
+
0 +----------------------------------------------------------------------->Mi
|
607
|
+
0 1.476
|
608
|
+
|
609
|
+
= picorbc keymap.rb -> 61.98 KB
|
610
|
+
--------------------------------------------------------------------------------
|
611
|
+
Command: picorbc keymap.rb
|
612
|
+
Massif arguments: --stacks=yes
|
613
|
+
--------------------------------------------------------------------------------
|
614
|
+
KB
|
615
|
+
61.98^ #
|
616
|
+
| @#
|
617
|
+
| @ @@#
|
618
|
+
| @@:@@#
|
619
|
+
| : @ @@:@@#
|
620
|
+
| @::::@:@:::@@:@@#
|
621
|
+
| : @::::@:@:::@@:@@#
|
622
|
+
| @@:@:::@::::@::::@:@:::@@:@@#
|
623
|
+
| @@:@:::@::::@::::@:@:::@@:@@#
|
624
|
+
| ::::@:::::@@:@:::@::::@::::@:@:::@@:@@#
|
625
|
+
| ::: @: :: @@:@:::@::::@::::@:@:::@@:@@#
|
626
|
+
| @@@::: ::::::: @: :: @@:@:::@::::@::::@:@:::@@:@@#
|
627
|
+
| @@ :::@::::: ::: @: :: @@:@:::@::::@::::@:@:::@@:@@#
|
628
|
+
| @:::: ::::@@ :::@::::: ::: @: :: @@:@:::@::::@::::@:@:::@@:@@#
|
629
|
+
| @:::::::: @@ :::@::::: ::: @: :: @@:@:::@::::@::::@:@:::@@:@@#
|
630
|
+
| @@: :::::@:::::::: @@ :::@::::: ::: @: :: @@:@:::@::::@::::@:@:::@@:@@#
|
631
|
+
| @ ::: :::@:::::::: @@ :::@::::: ::: @: :: @@:@:::@::::@::::@:@:::@@:@@#
|
632
|
+
| @ ::: :::@:::::::: @@ :::@::::: ::: @: :: @@:@:::@::::@::::@:@:::@@:@@#
|
633
|
+
| @ ::: :::@:::::::: @@ :::@::::: ::: @: :: @@:@:::@::::@::::@:@:::@@:@@#
|
634
|
+
| @ ::: :::@:::::::: @@ :::@::::: ::: @: :: @@:@:::@::::@::::@:@:::@@:@@#
|
635
|
+
0 +----------------------------------------------------------------------->Mi
|
636
|
+
0 7.101
|
637
|
+
|
638
|
+
= Summary
|
639
|
+
# script size mrbc picorbc
|
640
|
+
====================================================
|
641
|
+
hello_world.rb 20 bytes 133.5 KB 16.98 KB
|
642
|
+
----------------------------------------------------
|
643
|
+
keymap.rb(meishi2) 2388 bytes 206.1 KB 61.98 KB
|
644
|
+
----------------------------------------------------
|
645
|
+
|
646
|
+
(('tag:center'))
|
647
|
+
(('tag:small'))
|
648
|
+
Note: Figures are measured in 64 bit Ubuntu
|
649
|
+
|
650
|
+
= Implementation
|
651
|
+
* Depending on only libc and less
|
652
|
+
* Considering paddings and Pooled allocation
|
653
|
+
* Freeing heap memory in a loop instead of recursion
|
654
|
+
|
655
|
+
= Depending on only libc and less
|
656
|
+
* glibc for desktop/server application
|
657
|
+
* newlib for embedded application
|
658
|
+
* Small code size
|
659
|
+
* Doesn't have regex.c
|
660
|
+
|
661
|
+
# image
|
662
|
+
# src = images/regex_light.png
|
663
|
+
# relative_width = 80
|
664
|
+
|
665
|
+
= Padding in a struct
|
666
|
+
struct LinkedList {
|
667
|
+
struct LinkedList *next; // 4 bytes (in 32-bit architecture)
|
668
|
+
uint8_t value; // 1 byte
|
669
|
+
}
|
670
|
+
|
671
|
+
sizeof(LinkedList);
|
672
|
+
=> 5 ๐
No
|
673
|
+
=> 8 ๐ Yes
|
674
|
+
|
675
|
+
(('tag:center'))
|
676
|
+
(('tag:small'))
|
677
|
+
โData structure alignment (at least in C99)\n
|
678
|
+
pointer[4] + uint8_t[1] + ((*padding[3]*)) = sum[8]\n
|
679
|
+
๐You need to pack them well
|
680
|
+
|
681
|
+
= Paddings waste memomy
|
682
|
+
# enscript c
|
683
|
+
LinkedList *top;
|
684
|
+
(...)
|
685
|
+
top->next->next->next->next; // 5 items in the list
|
686
|
+
|
687
|
+
* Consumes 40 bytes to store 5 values of uint8_t
|
688
|
+
* Total size of pointers will be 1 KB if there are 250 items in a list
|
689
|
+
|
690
|
+
(('tag:center'))
|
691
|
+
\nPooled allocation ๐ก
|
692
|
+
|
693
|
+
= Pooled allocation
|
694
|
+
# enscript bash
|
695
|
+
[n]: bytes
|
696
|
+
|
697
|
+
*next[4] -----------> *next[4] -----------> *next[4] ------------>
|
698
|
+
size[2] size[2] size[2]
|
699
|
+
index[2] index[2] index[2]
|
700
|
+
data[sizeof(Data)] data[sizeof(Data)] data[sizeof(Data)]
|
701
|
+
data[sizeof(Data)] data[sizeof(Data)] data[sizeof(Data)]
|
702
|
+
... ... ...
|
703
|
+
data[sizeof(Data)] data[sizeof(Data)] data[sizeof(Data)]
|
704
|
+
|
705
|
+
* Reduces paddings of data structure alignment
|
706
|
+
* Reduces the number of pointers
|
707
|
+
* Reduces fragmentation
|
708
|
+
|
709
|
+
= Before improvement -> 53.20 KB
|
710
|
+
--------------------------------------------------------------------------------
|
711
|
+
Massif arguments: --stacks=yes
|
712
|
+
--------------------------------------------------------------------------------
|
713
|
+
KB
|
714
|
+
53.20^ #
|
715
|
+
| #
|
716
|
+
| @# :::
|
717
|
+
| @# : :
|
718
|
+
| @# : :
|
719
|
+
| @@# : :
|
720
|
+
| @@# :: :
|
721
|
+
| @@#::: :
|
722
|
+
| @@#::: :
|
723
|
+
| @@::@@#::: :
|
724
|
+
| @@: @@#::: :
|
725
|
+
| @@:@:::@::::@@: @@#::: ::
|
726
|
+
| @::@::@ :@:: @:: :@@: @@#::: ::
|
727
|
+
| @:::@@@:@::@: @ :@:: @:: :@@: @@#::: ::
|
728
|
+
| @@:@::@:: @@ :@::@: @ :@:: @:: :@@: @@#::: ::
|
729
|
+
| ::@@@ :@: @:: @@ :@::@: @ :@:: @:: :@@: @@#::: ::
|
730
|
+
| :::::: :::::@ @ :@: @:: @@ :@::@: @ :@:: @:: :@@: @@#::: ::
|
731
|
+
| :::::@@:: :::::: ::@ @ :@: @:: @@ :@::@: @ :@:: @:: :@@: @@#::: ::
|
732
|
+
| : :: @ :: :::::: ::@ @ :@: @:: @@ :@::@: @ :@:: @:: :@@: @@#::: ::
|
733
|
+
| : :: @ :: :::::: ::@ @ :@: @:: @@ :@::@: @ :@:: @:: :@@: @@#::: ::
|
734
|
+
0 +----------------------------------------------------------------------->Mi
|
735
|
+
0 1.616
|
736
|
+
|
737
|
+
= After improvement -> 24.21 KB
|
738
|
+
--------------------------------------------------------------------------------
|
739
|
+
Massif arguments: --stacks=yes
|
740
|
+
--------------------------------------------------------------------------------
|
741
|
+
KB
|
742
|
+
24.21^ #
|
743
|
+
| @ @:@:@:#
|
744
|
+
| @:@@@:@:@:@:#: @
|
745
|
+
| @@:::@:@@@:@:@:@:#::::::@
|
746
|
+
| @ :::@:@@@:@:@:@:#::::::@
|
747
|
+
| @ :::@:@@@:@:@:@:#::::::@
|
748
|
+
| @ :::@:@@@:@:@:@:#::::::@
|
749
|
+
| @ :::@:@@@:@:@:@:#::::::@
|
750
|
+
| @@:::::::::::::::@::::: ::::@::@::::::@ :::@:@@@:@:@:@:#::::::@
|
751
|
+
| @ ::::::: :::: : @:: ::@:: :@::@:: :: @ :::@:@@@:@:@:@:#::::::@
|
752
|
+
| @ ::::::: :::: : @:: ::@:: :@::@:: :: @ :::@:@@@:@:@:@:#::::::@
|
753
|
+
| @ ::::::: :::: : @:: ::@:: :@::@:: :: @ :::@:@@@:@:@:@:#::::::@
|
754
|
+
| @ ::::::: :::: : @:: ::@:: :@::@:: :: @ :::@:@@@:@:@:@:#::::::@
|
755
|
+
| @ ::::::: :::: : @:: ::@:: :@::@:: :: @ :::@:@@@:@:@:@:#::::::@
|
756
|
+
| @ ::::::: :::: : @:: ::@:: :@::@:: :: @ :::@:@@@:@:@:@:#::::::@
|
757
|
+
| @ ::::::: :::: : @:: ::@:: :@::@:: :: @ :::@:@@@:@:@:@:#::::::@
|
758
|
+
| @ ::::::: :::: : @:: ::@:: :@::@:: :: @ :::@:@@@:@:@:@:#::::::@
|
759
|
+
| @ ::::::: :::: : @:: ::@:: :@::@:: :: @ :::@:@@@:@:@:@:#::::::@
|
760
|
+
| @ ::::::: :::: : @:: ::@:: :@::@:: :: @ :::@:@@@:@:@:@:#::::::@
|
761
|
+
| ::::@ ::::::: :::: : @:: ::@:: :@::@:: :: @ :::@:@@@:@:@:@:#::::::@
|
762
|
+
0 +----------------------------------------------------------------------->Mi
|
763
|
+
0 1.082
|
764
|
+
|
765
|
+
= Freeing in a loop
|
766
|
+
* Freeing long linked list in recursion causes "stack spike"
|
767
|
+
* Because the call stack becomes deep until the recursive call reaches the bottom of the list
|
768
|
+
* Freeing in a loop instead of recursion
|
769
|
+
* The call stack doesn't stack up at the cost of a bit complicated code
|
770
|
+
|
771
|
+
= Summary
|
772
|
+
# script size mrbc picorbc
|
773
|
+
====================================================
|
774
|
+
hello_world.rb 20 bytes 133.5 KB 16.98 KB
|
775
|
+
----------------------------------------------------
|
776
|
+
keymap.rb(meishi2) 2388 bytes 206.1 KB 61.98 KB
|
777
|
+
----------------------------------------------------
|
778
|
+
|
779
|
+
(('tag:center'))
|
780
|
+
(('tag:x-small:Note: Figures are measured in 64 bit Ubuntu'))
|
781
|
+
\n\n
|
782
|
+
(('tag:large:Finally, I could make'))\n(('tag:large:PicoRuby work on the Micon!'))
|
783
|
+
|
784
|
+
= VCENTER HCENTER XXLARGE
|
785
|
+
The (('del:Matrix')) Micon
|
786
|
+
\n
|
787
|
+
is Everywhere.
|
788
|
+
|
789
|
+
= HCENTER VCENTER XXLARGE TITLE
|
790
|
+
On a Keyboard
|
791
|
+
\n
|
792
|
+
Ruby on Board
|
793
|
+
|
794
|
+
= HCENTER VCENTER MONO
|
795
|
+
(('tag:x-small:written and presented by'))
|
796
|
+
\n
|
797
|
+
HASUMIKIN
|
798
|
+
|
799
|
+
= HCENTER VCENTER MONO
|
800
|
+
(('tag:x-small:supported by'))
|
801
|
+
\n
|
802
|
+
RUBY ASSOCIATION (('tag:x-small:and')) MONSTARLAB
|
803
|
+
|
804
|
+
= HCENTER VCENTER MONO
|
805
|
+
(('tag:x-small:mentor'))
|
806
|
+
\n
|
807
|
+
MATZ
|
808
|
+
|
809
|
+
= HCENTER VCENTER MONO
|
810
|
+
(('tag:x-small:follow the'))
|
811
|
+
# image
|
812
|
+
# src = images/picoruby.png
|
813
|
+
# relative_width = 20
|
814
|
+
|
815
|
+
= HCENTER VCENTER MONO
|
816
|
+
(('tag:x-small:an')) ESSENTIALLY RUBY (('tag:x-small:production'))
|