rabbit-slide-hasumikin-RubyConfPoland2019 2019.05.14

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: aabacc738ae6ef77dc1319002d5920b0713853e98bc7020f8618e90e4fc96cc8
4
+ data.tar.gz: 737e9ff3a69327f462c0d8c88830249172ef0605e4ac988d0c671ae6ce925bba
5
+ SHA512:
6
+ metadata.gz: 122bfd7a79327479d2997b3a7795e280672fe541f009fd75f59137e17ec619ec53ac8fcd90bece8799055d7537bdb52be0e2748d8f8b024fde65fd0746aaad53
7
+ data.tar.gz: acdafb2d5fc2498e3b2755bb0723702c5e2faad56a22cbac2087e02e83ddef9e3bf457f0649d67ab9d0f58a243a99ab97544cb07893da542b1a820a547089f53
data/.rabbit ADDED
@@ -0,0 +1 @@
1
+ mrubyc---The-smallest-Ruby-implementation-for-microcontrollers.rab
@@ -0,0 +1,32 @@
1
+ = mrubyc - The smallest Ruby implementation for microcontrollers
2
+
3
+ The slide for [THE RUBY CONFERENCE OF CRACOW 2019](https://krk-rb.pl/) by [hasumkin](https://github.com/hasumikin)
4
+
5
+ It will cover:
6
+
7
+ - Introducing Ruby for microcontrollers and microcontrollers themselves
8
+ - Things in common and difference between mruby and mruby/c
9
+ - How mruby/c works
10
+ - Development sorroundings
11
+ - Some actual source code of firmware application
12
+
13
+ == for author
14
+
15
+ === presentation
16
+
17
+ rake
18
+
19
+ === publishment
20
+
21
+ rake publish
22
+
23
+ == for readers
24
+
25
+ === install
26
+
27
+ gem install rabbit-slide-hasumikin-RubyConfPoland2019
28
+
29
+ === browse
30
+
31
+ rabbit rabbit-slide-hasumikin-RubyConfPoland2019.gem
32
+
@@ -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("YOUR THEME")
11
+ end
12
+
13
+ desc "Tag #{spec.version}"
14
+ task :tag do
15
+ sh("git", "tag", "-a", spec.version.to_s, "-m", "Publish #{spec.version}")
16
+ sh("git", "push", "--tags")
17
+ end
@@ -0,0 +1,22 @@
1
+ ---
2
+ id: RubyConfPoland2019
3
+ base_name: mrubyc---The-smallest-Ruby-implementation-for-microcontrollers
4
+ tags:
5
+ - mruby
6
+ - mruby/c
7
+ - IoT
8
+ presentation_date: 2019/05/14
9
+ version: 2019.05.14
10
+ licenses: []
11
+ slideshare_id:
12
+ speaker_deck_id:
13
+ ustream_id:
14
+ vimeo_id:
15
+ youtube_id:
16
+ author:
17
+ markup_language: :rd
18
+ name: HASUMI Hitoshi
19
+ email: hasumikin@gmail.com
20
+ rubygems_user: hasumikin
21
+ slideshare_user:
22
+ speaker_deck_user:
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
@@ -0,0 +1 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 739.03 574.87"><defs><style>.cls-1{fill:#182943;}.cls-2{fill:#afbdff;}.cls-3{fill:#c2cdff;}.cls-4{fill:#dde4ff;}.cls-5{fill:#8b9fff;}.cls-6{fill:#f34611;}.cls-7{fill:#c9260a;}.cls-8,.cls-9{fill:none;stroke-linecap:round;stroke-linejoin:round;stroke-width:2px;}.cls-8{stroke:#f34611;}.cls-9{stroke:#c9260a;}</style></defs><title>Asset 3</title><g id="Layer_2" data-name="Layer 2"><g id="Layer_1-2" data-name="Layer 1"><path class="cls-1" d="M553.41,239.39C529.24,97.89,346.38-5.49,259.59,36.18c-33,15.85-61.9,57.39-59.86,97.32,3.77,73.68,110.92,105,101.07,148-8.39,36.62-88.24,23.2-114.43,70.13C155.52,406.92,210.12,526.21,283,545.11,388.1,572.38,581.44,403.48,553.41,239.39Z"/><polygon class="cls-2" points="375.5 364.35 503.93 315.42 415.42 485.23 333.16 543.39 243.71 532.32 290.59 479.56 375.5 364.35"/><path class="cls-2" d="M739,288.92s-168.15-61.28-238.51-52.2S336,310.48,307.05,326.93s-105.26,54.64-105.26,54.64,21,27.49,55.37,13.38,66.06-28,86.48-24.07,51.63,17.33,104.68-17.28S739,288.92,739,288.92Z"/><path class="cls-2" d="M375.5,364.35S260.81,483.81,248,492s-99.57,1.7-112.91,3.4-27.51,7.66-31.2,13.62,127.66,18.72,145.25,13.62,56.73-37.45,56.73-37.45Z"/><path class="cls-2" d="M120.52,513.76c-16.67.55-36.48,1.19-34.18,10.09,10.4,8.47,51.8,16.17,49.17,15.47l96.5,4.07s78.73-14.47,96.6-34.33-22.7-23.83-22.7-23.83-46.86,32.61-56.17,33.66S137.19,513.22,120.52,513.76Z"/><path class="cls-3" d="M319,558.61s-56.45,16.26-86.81,16.26-120.28-26.38-120.28-32.34,20.71-16.21,37.45-16.21S239,541.39,239,541.39Z"/><path class="cls-4" d="M719.53,418.28S688.89,363,628.75,382.71,432.44,513.6,397.26,545.37s-162.77,7.14-170.5-6c0,0,9.11-17.12,34.05-16.22s63.81,3.72,83.1-.84,55.27-36.45,68.6-60.38S472.15,266.22,565.2,259.41,739,288.92,739,288.92Z"/><path class="cls-5" d="M185,117.74v21l-1.63,1.63L166.7,128.11a17.84,17.84,0,0,1-8.89-15.44V111.6c-2.12-1.85,4.57-6.88,8.24-4.77Z"/><path class="cls-3" d="M183.39,119.37v21l-18.32-10.65a17.84,17.84,0,0,1-8.89-15.44v-1.08a5.5,5.5,0,0,1,8.24-4.76Z"/><path class="cls-5" d="M185,160.93v21l-1.63,1.63L166.7,171.31a17.85,17.85,0,0,1-8.89-15.44v-1.08c-2.12-1.84,4.57-6.87,8.24-4.76Z"/><path class="cls-3" d="M183.39,162.56v21l-18.32-10.64a17.85,17.85,0,0,1-8.89-15.44v-1.08a5.5,5.5,0,0,1,8.24-4.77Z"/><path class="cls-5" d="M185,204.13v21l-1.63,1.63L166.7,214.51a17.85,17.85,0,0,1-8.89-15.44V198c-2.12-1.85,4.57-6.87,8.24-4.77Z"/><path class="cls-3" d="M183.39,205.76v21l-18.32-10.64a17.85,17.85,0,0,1-8.89-15.44v-1.08a5.5,5.5,0,0,1,8.24-4.77Z"/><path class="cls-5" d="M185,247.33v21L183.39,270,166.7,257.7a17.82,17.82,0,0,1-8.89-15.44v-1.07c-2.12-1.85,4.57-6.88,8.24-4.77Z"/><path class="cls-3" d="M183.39,249v21l-18.32-10.65a17.84,17.84,0,0,1-8.89-15.44v-1.08a5.5,5.5,0,0,1,8.24-4.76Z"/><path class="cls-5" d="M201.23,309.7l18.08,10.12,0,19c-3.26,8.87-6,9-10.8,6.23h0a14.58,14.58,0,0,1-7.28-12.63l-1.61-21.08Z"/><path class="cls-3" d="M199.59,311.34l18.08,10.1v19a7.2,7.2,0,0,1-10.79,6.24h0A14.59,14.59,0,0,1,199.59,334Z"/><path class="cls-5" d="M231.66,327.08l18.07,10.11v19c-3.27,8.88-6,9-10.8,6.23h0a14.56,14.56,0,0,1-7.28-12.63L230,328.7Z"/><path class="cls-3" d="M230,328.71l18.09,10.11v19A7.2,7.2,0,0,1,237.3,364h0A14.56,14.56,0,0,1,230,351.42Z"/><path class="cls-5" d="M264.48,345.54l18.08,10.12v19c-3.27,8.87-6,9-10.81,6.22h0a14.59,14.59,0,0,1-7.28-12.62l-1.61-21.08Z"/><path class="cls-3" d="M262.84,347.18l18.09,10.1v19a7.2,7.2,0,0,1-10.8,6.23h0a14.56,14.56,0,0,1-7.29-12.62Z"/><path class="cls-5" d="M294.91,362.91,313,373l0,19c-3.27,8.87-6,9-10.8,6.23h0a14.56,14.56,0,0,1-7.28-12.63l-1.61-21.08Z"/><path class="cls-3" d="M293.26,364.55l18.09,10.1v19a7.21,7.21,0,0,1-10.8,6.24h0a14.58,14.58,0,0,1-7.29-12.62Z"/><path class="cls-5" d="M190.15,287.84,185,74.57c8.64-7,12.46-12.83,18.37-9.47l128.53,73.12a21.81,21.81,0,0,1,11,18.94V372.21c0,6.79-10,13.34-13.77,17.12l-128-82.55A21.78,21.78,0,0,1,190.15,287.84Z"/><path class="cls-3" d="M179.89,297.56v-215a8.86,8.86,0,0,1,13.24-7.7l128.54,73.13a21.79,21.79,0,0,1,11,18.94V381.93a8.86,8.86,0,0,1-13.24,7.7L190.91,316.5A21.78,21.78,0,0,1,179.89,297.56Z"/><path class="cls-5" d="M195,279.53l-4.11-170.85c6.92-5.62,10-10.28,14.71-7.59l103,58.58a17.46,17.46,0,0,1,8.82,15.17V347.11c0,5.44-8,10.69-11,13.71L203.79,294.7A17.46,17.46,0,0,1,195,279.53Z"/><path class="cls-3" d="M186.75,287.31V115.05a7.09,7.09,0,0,1,10.6-6.17l103,58.58a17.43,17.43,0,0,1,8.82,15.17V354.9a7.09,7.09,0,0,1-10.6,6.16l-103-58.57A17.48,17.48,0,0,1,186.75,287.31Z"/><path class="cls-5" d="M206.66,74.84l-1.58-18.59c0-4.58,6.53-9,10.5-6.67h0a17.12,17.12,0,0,1,8.56,14.83V84.92l-1.57,1.58Z"/><path class="cls-3" d="M205.08,76.42V56.31A6,6,0,0,1,214,51.16h0A17.1,17.1,0,0,1,222.57,66V86.5Z"/><path class="cls-5" d="M238.44,93.61,236.87,75c0-4.58,6.53-9,10.5-6.67h0a17.12,17.12,0,0,1,8.56,14.83v20.51l-1.58,1.58Z"/><path class="cls-3" d="M236.87,95.19V75.08a5.94,5.94,0,0,1,8.92-5.15h0a17.09,17.09,0,0,1,8.56,14.82v20.52Z"/><path class="cls-5" d="M271,110.45l-1.58-18.59c0-4.58,6.54-9,10.5-6.67h0A17.12,17.12,0,0,1,288.5,100v20.52l-1.58,1.58Z"/><path class="cls-3" d="M269.43,112V91.92a6,6,0,0,1,8.93-5.15h0a17.09,17.09,0,0,1,8.56,14.82v20.52Z"/><path class="cls-5" d="M302.8,129.22l-1.58-18.59c0-4.58,6.53-9,10.5-6.67h0a17.11,17.11,0,0,1,8.56,14.82V139.3l-1.57,1.58Z"/><path class="cls-3" d="M301.22,130.79v-20.1a6,6,0,0,1,8.92-5.15h0a17.1,17.1,0,0,1,8.57,14.82v20.52Z"/><path class="cls-5" d="M339.14,192.19l-1.62,1.63,1.62,19.39,16,11.57c4.73,1.46,11.25-2.74,11.25-8.21h0a15.11,15.11,0,0,0-7.58-13.1Z"/><path class="cls-3" d="M337.52,193.82v21l16.56,9.52a7.11,7.11,0,0,0,10.65-6.16h0a15.11,15.11,0,0,0-7.58-13.1Z"/><path class="cls-5" d="M339.14,238.29l-1.62,1.63,1.62,19.39,16,11.57c4.73,1.46,11.25-2.74,11.25-8.21h0a15.12,15.12,0,0,0-7.58-13.1Z"/><path class="cls-3" d="M337.52,239.92v21l16.56,9.52a7.11,7.11,0,0,0,10.65-6.16h0a15.11,15.11,0,0,0-7.58-13.1Z"/><path class="cls-5" d="M339.14,284.39,337.52,286l1.62,19.39,16,11.57c4.73,1.46,11.25-2.74,11.25-8.2h0a15.13,15.13,0,0,0-7.58-13.11Z"/><path class="cls-3" d="M337.52,286v21l16.56,9.52a7.11,7.11,0,0,0,10.65-6.16h0a15.12,15.12,0,0,0-7.58-13.1Z"/><path class="cls-5" d="M339.14,330.49l-1.62,1.63,1.62,19.39,16,11.57c4.73,1.46,11.25-2.74,11.25-8.2h0a15.13,15.13,0,0,0-7.58-13.11Z"/><path class="cls-3" d="M337.52,332.12v21l16.56,9.52a7.11,7.11,0,0,0,10.65-6.15h0a15.13,15.13,0,0,0-7.58-13.11Z"/><path class="cls-6" d="M105.2,322.75,83.34,308.43h0a4.76,4.76,0,0,0-.49-.28l-.29-.14-.22-.1-.34-.12-.19-.06-.33-.08-.22-.05-.29,0-.27,0H79.9l-.34,0-.28,0-.27.05a5.09,5.09,0,0,0-.56.14h0l-31.54,10a5.75,5.75,0,0,0-3.62,3.36L33.6,345.34a5.77,5.77,0,0,0,2.41,7.1L78.7,377.81h0l.4.21.15.08h0a4.87,4.87,0,0,0,.53.21l.21.06c.12,0,.23.07.35.09l.22,0,.35.05.22,0,.35,0h.58l.19,0,.41-.06.15,0a5.36,5.36,0,0,0,.54-.14h0a5.55,5.55,0,0,0,.52-.2l.14-.06.37-.18.16-.1.32-.2.16-.12a3.15,3.15,0,0,0,.29-.22l.16-.14.26-.25.15-.16.24-.28.13-.17a5.72,5.72,0,0,0,.32-.48h0l.08-.15c.07-.14.15-.27.21-.4v0l20.39-45.28A5.75,5.75,0,0,0,105.2,322.75Z"/><path class="cls-7" d="M430.39,38.27l-9.47-24.36h0a4.9,4.9,0,0,0-.24-.52c0-.09-.1-.18-.15-.27l-.12-.21-.21-.3-.12-.16-.22-.26-.15-.17-.21-.2-.2-.19-.2-.15a2.43,2.43,0,0,0-.25-.2l-.19-.12-.29-.18-.25-.12-.25-.13a4.81,4.81,0,0,0-.53-.2h0L385.88.28A5.79,5.79,0,0,0,381,.92L359,15a5.76,5.76,0,0,0-2.16,7.18l20,45.45v0l.2.4s.05.11.08.16h0a4.9,4.9,0,0,0,.31.48l.13.17.23.28.16.17.25.24.16.15.28.22.17.12.32.2.16.1.36.19.14.06a5.55,5.55,0,0,0,.52.2h0a5.44,5.44,0,0,0,.54.15l.15,0,.4.06.19,0,.38,0h.56l.22,0,.35-.06.22,0a3.58,3.58,0,0,0,.35-.09l.21-.06.53-.2h0a.8.8,0,0,1,.16-.08c.13-.07.27-.13.39-.21h0l42.9-25A5.76,5.76,0,0,0,430.39,38.27Z"/><path class="cls-8" d="M343,449C156.55,435.26,109,407.64,105.26,382.64c-4.18-27.82,45.32-55.65,35.5-88-6.6-21.74-35.94-32-57.1-37"/><path class="cls-8" d="M31.87,409.74s53-32.13,72,19.67,229.31,35,229.31,35"/><path class="cls-8" d="M145.06,365.33s53.68-61.4,0-95.35"/><line class="cls-8" x1="124.48" y1="258.56" x2="103.85" y2="252.94"/><line class="cls-8" x1="320.28" y1="485.23" x2="248.04" y2="492.04"/><line class="cls-8" x1="230.03" y1="495.6" x2="196.51" y2="495.6"/><path class="cls-8" d="M20.24,416.21S4.77,424.93,1,437.55"/><path class="cls-8" d="M145.06,437.55s26.16,15.31,51.45,11.45"/><path class="cls-9" d="M402.3,240.9s-71.06-75.55-30.87-100,43.16-37.09,30.87-46.61"/><path class="cls-9" d="M383.91,182.25c-16.15-26,0-32.73,0-32.73"/><line class="cls-9" x1="389.3" y1="192.19" x2="398.22" y2="205.54"/><path class="cls-9" d="M376.73,87.2S391,88,389.3,100.31"/></g></g></svg>
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
@@ -0,0 +1,866 @@
1
+ = mruby/c\nThe smallest Ruby implementation for microcontrollers
2
+
3
+ # : subtitle
4
+ # サブタイトル
5
+ : author
6
+ HASUMI Hitoshi @hasumikin
7
+ # : institution
8
+ # 所属
9
+ # : content-source
10
+ # イベント名
11
+ : date
12
+ May 6, 2019 in Warszawa
13
+ : date
14
+ May 14, 2019 in Kraków
15
+ : allotted-time
16
+ 47m
17
+ : theme
18
+ theme
19
+
20
+ = hide-title
21
+ (('tag:center'))\n\n\n\n((*(('tag:xx-large:Cześć!'))*))
22
+ == プロパティ
23
+ : hide-title
24
+ true
25
+
26
+ = about me
27
+ * HASUMI Hitoshi\n@hasumikin
28
+ * live in Matsue city,\na holy place of Ruby
29
+ * Sake 🍶\nSoba 🍜\nCoffee ☕
30
+ # image
31
+ # src = images/hasumi.jpg
32
+ # align = right
33
+ # relative-height = 80
34
+
35
+ = about me
36
+ # image
37
+ # src = images/monstarlab.png
38
+ # relative_width = 120
39
+ # relative_margin_top = -1
40
+
41
+ = about me
42
+ # image
43
+ # src = images/m2.png
44
+ # relative_width = 106
45
+ # relative_margin_top = -1
46
+
47
+ = about me
48
+ # image
49
+ # src = images/松江城_Matsue.rb.jpg
50
+ # relative_width = 106
51
+ # relative_margin_top = -3
52
+ == prop
53
+ : hide-title
54
+ true
55
+
56
+ = message from Matz
57
+ # # video
58
+ # # src = images/video.mp4
59
+
60
+ = agenda
61
+ * terminology
62
+ * about my IoT project
63
+ * mruby and mruby/c
64
+ * how does mruby/c work
65
+ * actual source code of my project
66
+ * development environment
67
+
68
+ = terminology
69
+
70
+ = terminology
71
+ * mruby/c
72
+ * tha language I will talk about today
73
+ * I say mrubyc as /c is hard to pronounce
74
+ * microcontroller
75
+ * small computer contains CPU, memory and programmable I/O peripherals
76
+ * in this talk, microcontroller is distinguished from single board computer like Raspberry Pi
77
+
78
+ = terminology
79
+ * RTOS
80
+ * Real-time OS. usually used for microcontroller
81
+ * task
82
+ * almost equivalent to `Thread` in linux. we say `task` in microcontroller world
83
+
84
+ = terminology
85
+ * 旭日酒造(Aasahi-shuzo)
86
+ * shuzo means Sake brewery
87
+ * one of the best Japanese Sake brewery
88
+ * Asahi-beer(famous for SUPER DRY) has no concern with Asahi-shuzo
89
+ * Aasahi-shuzo and I make IoT system using mruby/c
90
+
91
+ = why microcontroller?
92
+ * I never use single board computer like Raspberry Pi for production environment.
93
+
94
+ = why microcontroller?
95
+ * it starts immediately right after plugged in
96
+ * end users, brewery workers in my case, can use it simply like home electical things
97
+ * you can narrow security issue list
98
+ * many a malware aims at Linux or Windows platform as a target
99
+ * you don't need to consider unnecessary deamon
100
+ * you don't need to do `apt upgrade`
101
+
102
+ = why microcontroller?
103
+ * low energy
104
+ * rarely overheated
105
+ * many choices of power supply
106
+ * mass production
107
+ * you can choose appropriate chipset(number of GPIOs, memory size, etc.) for your application
108
+ * cost advantage for parts supply and subcontractor manufacturing
109
+
110
+ = which microcontroller?
111
+
112
+ = which microcontroller?
113
+ # image
114
+ # src = images/psoc5lp_chip.jpg
115
+ # align = right
116
+ # relative-height = 60
117
+ * CYPRESS PSoC5LP
118
+ * 32 bit Arm Cortex-M3 CPU
119
+ * Flash: 256KB
120
+ * SRAM: 64KB
121
+ * 64KB is the target size\nof mruby/c
122
+
123
+ = which microcontroller?
124
+ # image
125
+ # src = images/esp32.jpg
126
+ # align = center
127
+ # relative-height = 50
128
+ * Espressif ESP-WROOM-32 (ESP32)
129
+ * 32 bit dual core LX6 CPU
130
+ * Flash: 4MB
131
+ * SRAM: 520KB
132
+
133
+ = about my IoT project
134
+
135
+ = about my IoT project
136
+ * IoT system for Asahi-shuzo
137
+ * delivered to actual brew work in January 2018
138
+ * devices post temperature of Sake materials in brewing, surrounding temperature and humidity to server
139
+ * data is displayed on smartphone app
140
+
141
+ = about my IoT project
142
+ # image
143
+ # src = images/kamos.jpg
144
+ # align = center
145
+ # relative-height = 95
146
+
147
+ = about my IoT project
148
+ # image
149
+ # src = images/collage01.jpg
150
+ # align = center
151
+ # relative-height = 95
152
+
153
+ = about my IoT project
154
+ : what were difficult about mruby/c?
155
+ * we can neither do step execution nor look into appropriate memory address of mruby/c's variables
156
+ * so many troubles in IoT
157
+ * hard to find why the application doesn't work well
158
+ * mruby/c was growing
159
+ * bugs, lack of features, docs and examples
160
+
161
+ = about my IoT project
162
+ : so, was mruby/c bad?
163
+
164
+ = about my IoT project
165
+ : so, was mruby/c bad? - NO
166
+ * IoT at work makes you hurry
167
+ * you have to go back and forth between dark 10℃ storage cellar and humid 35℃ manufacturing room
168
+ * brewery workers run around
169
+ * you have to amend your firmware with your small laptop in 10 minutes
170
+ * you will thank Ruby's descriptiveness and agility
171
+
172
+ = today's demo
173
+ * CO(('sub:2')) concentration
174
+ * 400ppm : atmospheric
175
+ * 1000ppm : your programming speed decreases
176
+ * 1500ppm : tomatoes ((*🍅*)) may grow well
177
+ * > 2000ppm : sleepy, headache
178
+ * > 40000ppm : 💀
179
+
180
+ = today's demo
181
+ * my device keeps taking CO(('sub:2')) concentration
182
+ * I will prove that it is due to CO(('sub:2')) if someone slept while I speaking
183
+
184
+ = so many troubles in IoT
185
+
186
+ = so many troubles in IoT
187
+ * peripheral equipments (☆)
188
+ * circuit and wiring design
189
+ * printed circuit board = PCB
190
+ * soldering (☆)
191
+ * C, mruby and mruby/c (☆)
192
+ * network
193
+ ☆...I will explain these topics today
194
+
195
+ = peripheral equipments
196
+
197
+ = peripheral equipments
198
+ * it is very important to check the following before writing application code
199
+ * equipment like sensor or communication module works as its spec sheet
200
+ * whether the equipment is not broken (sometimes broken by soldering 😭)
201
+ * unless you will regret
202
+ * so...
203
+
204
+ = peripheral equipments
205
+ # image
206
+ # src = images/raspberrypi.jpg
207
+ # relative-height = 55
208
+
209
+ * Raspberry Pi & CRuby are great for pre-prototyping
210
+ * use breadboard or make PCB for test like this photo
211
+
212
+ = peripheral equipments
213
+ ex) CRuby for serial communication test
214
+ # enscript ruby
215
+ # notice this is CRuby for RasPi
216
+ require 'rubyserial'
217
+ require 'timeout'
218
+ BAUDRATE = 9600 # match with your instrument
219
+ sp = Serial.new '/dev/serial0', BAUDRATE, 8
220
+ loop do
221
+ puts '[command]'
222
+ command = gets
223
+ sp.write command.sub("\n", "\r") # replace LF if needed
224
+ sleep 0.1
225
+ result = ''
226
+ begin
227
+ Timeout.timeout(10) do
228
+ loop do
229
+ line = sp.read(128)
230
+ break if line == '' && result != ''
231
+ result << line
232
+ sleep 0.1
233
+ puts '=> ' + result
234
+ rescue Timeout::Error
235
+ puts 'timeout!'
236
+
237
+ = peripheral equipments
238
+ ex) CRuby for serial communication test
239
+ # enscript bash
240
+ $ serial_communication_test.rb
241
+ [command]
242
+ AT # command
243
+ => OK # response
244
+ [command]
245
+ AT+CIMI # command
246
+ => 123456789012 # response
247
+ [command]
248
+ AT+XXX # command
249
+ => error # response
250
+
251
+ = soldering
252
+
253
+ = soldering
254
+ # image
255
+ # src = images/unsoldered.jpg
256
+ # relative-width = 35
257
+
258
+ * it may work even if you leave a pin unsoldered on surface mounting
259
+ * because the pin touches circuit's surface
260
+ * then, it will not work one day
261
+
262
+ = soldering
263
+ # image
264
+ # src = images/unsoldered-2.png
265
+ # relative-width = 35
266
+
267
+ * discovering this kind of bug is much more difficult than software bug
268
+ * my teacher said\n"all the cause of failure, it is ((*impatience*))"
269
+
270
+ = what is mruby?
271
+
272
+ = what is mruby?
273
+ * github.com/mruby/mruby
274
+ * another implemantation of Ruby for embedded usage
275
+ * easily being called from C/C++
276
+ * ngx_mruby is a popular one
277
+ * good for command line tools as one-binary executable
278
+
279
+ = what is mruby/c?
280
+
281
+ = what is mruby/c?
282
+ * github.com/mrubyc/mrubyc
283
+ * yet another implementation of mruby
284
+ * `/c` symbolizes compact, concurrent and capability
285
+ * especially dedicated to one-chip microcontroller
286
+
287
+ = mruby and mruby/c
288
+ # RT
289
+
290
+ mruby, mruby/c
291
+
292
+ v1.0.0 in Jan 2014, v1.0 in Jan 2017
293
+ for general embedded software, for one-chip microcontroller
294
+ RAM < 400KB, RAM < 40KB
295
+
296
+ * sometimes mruby is still too big to run on microcontroller
297
+
298
+ = ((*both*)) mruby and mruby/c
299
+ * bytecodes are compiled by `mrbc` and VM executes the bytecode
300
+ # image
301
+ # src = images/mruby_and_mrubyc.png
302
+ # align = center
303
+ # relative-height = 100
304
+
305
+ = bytecode
306
+ * a kind of intermediate representation
307
+ * virtual machine dynamically interprets the bytecode and processes the program
308
+ # image
309
+ # src = images/bytecode.png
310
+ # align = center
311
+ # relative-width = 100
312
+
313
+ = mruby on microcontroller
314
+ * RTOS (Real-Time OS) manages mruby VMs. RTOS has features like multi tasking
315
+ # image
316
+ # src = images/mruby_and_mrubyc-mruby.png
317
+ # align = center
318
+ # relative-height = 100
319
+
320
+ = mruby/c on microcontroller
321
+ * mruby/c has its own mechanism to manage the runtime: ((*rrt0*))
322
+ # image
323
+ # src = images/mruby_and_mrubyc-mrubyc.png
324
+ # align = center
325
+ # relative-height = 100
326
+
327
+ = mruby/c - virtual machine (VM)
328
+ * much smaller than mruby's one
329
+ * that's why mruby/c runs on smaller RAM
330
+ * accordingly, mruby/c has ((*less*)) functionality than mruby
331
+
332
+ = how ((*less*))?
333
+
334
+ = how ((*less*))? - for example
335
+ * mruby/c doesn't have module, hence there is no Kernel module
336
+ * then you must wonder how can you `#puts`?
337
+ * in mruby/c, `#puts` is implemented in Object class
338
+
339
+ = how ((*less*))? - for example
340
+ * mruby/c doesn't have #send, #eval, nor #method_missing
341
+ * moreover, mruby/c neither have your favorite features like TracePoint nor RubyVM::AST 😞
342
+
343
+ = how ((*less*))? - actually
344
+ * the full list of mruby/c's classes
345
+ * Array, FalseClass, Fixnum, Float, Hash, Math, Mutex, NilClass, Numeric, Object, Proc, Range, String, Symbol, TrueClass, VM
346
+
347
+ = despite the fact,
348
+ * no problem in practical use of microcontroller
349
+ * as far as IoT go, mruby/c is enough Ruby as I expect
350
+ * we can fully develop firmwares with features of mruby/c
351
+
352
+ = how does mruby/c work
353
+
354
+ = how does mruby/c work
355
+ # enscript bash
356
+ ~/sample_project
357
+ ├── main.c
358
+ ├── mrblib
359
+ │ ├── task_1.rb
360
+ │ └── task_2.rb
361
+ └── src
362
+ ├── task_1.c
363
+ └── task_2.c
364
+ * task_*.c are compliled code from task_*.rb
365
+
366
+ = how does mruby/c work
367
+ # enscript c
368
+ /* main.c */
369
+ #include "src/task_1.c"
370
+ #include "src/task_2.c"
371
+ // use 30KB RAM for VMs in this case
372
+ #define MEMORY_SIZE (1024*30)
373
+ static uint8_t memory_pool[MEMORY_SIZE];
374
+ int main(void) {
375
+ mrbc_init(memory_pool, MEMORY_SIZE);
376
+ mrbc_create_task(task_1, 0);
377
+ mrbc_create_task(task_2, 0);
378
+ mrbc_run(); // 2 tasks run concurrently!
379
+ return 0;
380
+ // we will not write `main loop` in main.c
381
+ }
382
+
383
+ = how does mruby/c work
384
+ * we can run easily multiple VMs with ((*concurrency*)) due to ((*rrt0*))
385
+ * you might be disappointed to know you have to write C
386
+ * yes, we have to write ((*main.c*))
387
+ * don't worry, it's almost boilerplate code
388
+
389
+ = how does mruby/c work
390
+ # enscript bash
391
+ ~/mrubyc $ tree src -P *.h
392
+ src
393
+ ├── alloc.h
394
+ ├── c_array.h
395
+ ...
396
+ ├── console.h
397
+ ├── errorcode.h
398
+ ├── global.h
399
+ ├── hal_posix
400
+ │ └── hal.h
401
+ ├── hal_psoc5lp
402
+ │ └── hal.h
403
+ ├── hal_esp32
404
+ │ └── hal.h
405
+ ├── load.h
406
+ ├── mrubyc.h
407
+ ├── opcode.h
408
+ ├── rrt0.h
409
+ ├── static.h
410
+ ├── symbol.h
411
+ ├── value.h
412
+ ├── vm.h
413
+ └── vm_config.h
414
+
415
+ = how does mruby/c work
416
+ # enscript bash
417
+ ~/mrubyc $ tree src -P *.h
418
+ src
419
+ ├── alloc.h
420
+ ├── c_array.h
421
+ ...
422
+ ├── console.h
423
+ ├── errorcode.h
424
+ ├── global.h
425
+ ├── hal_posix
426
+ │ └── hal.h # hal for POSIX
427
+ ├── hal_psoc5lp
428
+ │ └── hal.h # hal for PSoC5LP
429
+ ├── hal_esp32
430
+ │ └── hal.h # hal for ESP32
431
+ ├── load.h
432
+ ├── mrubyc.h
433
+ ├── opcode.h
434
+ ├── rrt0.h
435
+ ├── static.h
436
+ ├── symbol.h
437
+ ├── value.h
438
+ ├── vm.h
439
+ └── vm_config.h
440
+
441
+ = how does mruby/c work
442
+ # enscript bash
443
+ ~/mrubyc $ tree src -P *.h
444
+ src
445
+ ├── alloc.h
446
+ ├── c_array.h
447
+ ...
448
+ ├── console.h
449
+ ├── errorcode.h
450
+ ├── global.h
451
+ ├── hal_posix
452
+ │ └── hal.h
453
+ ├── hal_psoc5lp
454
+ │ └── hal.h
455
+ ├── hal_esp32
456
+ │ └── hal.h
457
+ ├── load.h
458
+ ├── mrubyc.h
459
+ ├── opcode.h
460
+ ├── rrt0.h # runtime scheduler
461
+ ├── static.h
462
+ ├── symbol.h
463
+ ├── value.h
464
+ ├── vm.h
465
+ └── vm_config.h
466
+
467
+ = how does mruby/c work
468
+ # enscript bash
469
+ ~/mrubyc $ tree src -P *.h
470
+ src
471
+ ├── alloc.h
472
+ ├── c_array.h
473
+ ...
474
+ ├── console.h
475
+ ├── errorcode.h
476
+ ├── global.h
477
+ ├── hal_posix
478
+ │ └── hal.h
479
+ ├── hal_psoc5lp
480
+ │ └── hal.h
481
+ ├── hal_esp32
482
+ │ └── hal.h
483
+ ├── load.h
484
+ ├── mrubyc.h
485
+ ├── opcode.h
486
+ ├── rrt0.h
487
+ ├── static.h
488
+ ├── symbol.h
489
+ ├── value.h # this gives you hints about variable
490
+ ├── vm.h
491
+ └── vm_config.h
492
+
493
+ = how does mruby/c work
494
+ # enscript bash
495
+ ~/mrubyc $ tree src -P *.h
496
+ src
497
+ ├── alloc.h
498
+ ├── c_array.h
499
+ ...
500
+ ├── console.h
501
+ ├── errorcode.h
502
+ ├── global.h
503
+ ├── hal_posix
504
+ │ └── hal.h
505
+ ├── hal_psoc5lp
506
+ │ └── hal.h
507
+ ├── hal_esp32
508
+ │ └── hal.h
509
+ ├── load.h
510
+ ├── mrubyc.h
511
+ ├── opcode.h
512
+ ├── rrt0.h
513
+ ├── static.h
514
+ ├── symbol.h
515
+ ├── value.h
516
+ ├── vm.h
517
+ └── vm_config.h # edit this if needed
518
+
519
+ = debugging
520
+
521
+ = debugging
522
+ * we can neither do step execution nor look into memory to see variables when we use mruby/c in general
523
+ * we should prepare a way of debugging before writing app code
524
+ * let's go with ((*old-fashioned 'print debug'*)). it'll be almost enough
525
+
526
+ = debugging
527
+ # enscript c
528
+ /* a part of main.c */
529
+ // create serial console with UART for debug print
530
+ static void c_debugprint(mrb_vm *vm, mrb_value *v, int argc){
531
+ int total, used, free, fragment;
532
+ mrbc_alloc_statistics(&total, &used, &free, &fragment);
533
+ console_printf(
534
+ "Memory total:%d, used:%d, free:%d, fragment:%d\n",
535
+ total, used, free, fragment);
536
+ unsigned char *key = GET_STRING_ARG(1);
537
+ unsigned char *value = GET_STRING_ARG(2);
538
+ console_printf("%s:%s\n", key, value);
539
+ }
540
+ int main(void) {
541
+ ...
542
+ mrbc_define_method(0, mrbc_class_object, "debugprint", c_debugprint);
543
+ ...
544
+ }
545
+
546
+ = debugging
547
+ # enscript ruby
548
+ # mruby
549
+ pi = 3.14
550
+ debugprint('Pi', pi.to_s)
551
+
552
+ => # print in serial console like 'PuTTY' connecting USB
553
+ Memory total:30000, used:20000, free:10000, fragment:3
554
+ Pi:3.14
555
+
556
+ = actual source code
557
+
558
+ = actual source code
559
+ (('tag:center'))\n\n\n\n
560
+ github.com/hasumikin/co2-demo
561
+
562
+ = actual source code
563
+ # enscript bash
564
+ ~/co2-demo
565
+ ├── main.c
566
+ └── mrblib
567
+ ├── loops
568
+ │   ├── master.rb
569
+ │   └── slave.rb
570
+ └── models
571
+ ├── co2.rb
572
+ ├── led.rb
573
+ └── thermistor.rb
574
+
575
+ = actual source code
576
+ # enscript ruby
577
+ # loops/master.rb
578
+ $co2 = Co2.new # Makes it global so that another task
579
+ # can use it
580
+ led = Led.new(19) # 19 is a pin number which LED connects
581
+ while true
582
+ co2 = $co2.concentrate
583
+ if co2 > 2000 # When CO2 reaches fatal level
584
+ 5.times do # Turning LED on and off
585
+ led.turn_on
586
+ sleep 0.1
587
+ led.turn_off
588
+ sleep 0.1
589
+ end
590
+ elsif co2 > 1500 # CO2 reaches warning level
591
+ led.turn_on # Just keeps turn it on
592
+ sleep 1
593
+ else # Safe level
594
+ led.turn_off # Turns off
595
+ sleep 1
596
+ end
597
+ end
598
+
599
+ = actual source code
600
+ (('tag:center'))\n\n\n\n
601
+ how does ((*Led#trun_on*)) work?
602
+
603
+ = actual source code
604
+ # enscript ruby
605
+ # models/led.rb
606
+ class Led
607
+ def initialize(pin)
608
+ @pin = pin
609
+ gpio_init_output(@pin)
610
+ turn_off
611
+ end
612
+ def turn_on
613
+ gpio_set_level(@pin, 1)
614
+ end
615
+
616
+ = actual source code
617
+ # enscript c
618
+ /* a part of main.c */
619
+ #include "models/led.c"
620
+ static void c_gpio_init_output(mrb_vm *vm, mrb_value *v,
621
+ int argc) {
622
+ int pin = GET_INT_ARG(1);
623
+ gpio_set_direction(pin, GPIO_MODE_OUTPUT);
624
+ }
625
+ static void c_gpio_set_level(mrb_vm *vm, mrb_value *v,
626
+ int argc){
627
+ int pin = GET_INT_ARG(1);
628
+ int level = GET_INT_ARG(2);
629
+ gpio_set_level(pin, level);
630
+ }
631
+ int main(void){
632
+ ...
633
+ mrbc_define_method(0, mrbc_class_object, "gpio_init_output",
634
+ c_gpio_init_output);
635
+ mrbc_define_method(0, mrbc_class_object, "gpio_set_level",
636
+ c_gpio_set_level);
637
+ ...
638
+ }
639
+
640
+ = actual source code
641
+ # enscript c
642
+ /* a part of main.c */
643
+ #include "models/co2.c"
644
+ static void c_get_co2(struct VM *vm, mrbc_value v[], int argc){
645
+ uint8_t command[] = { // Command to take CO2
646
+ 0xFF, 0x01, 0x86, 0x00, 0x00, 0x00, 0x00, 0x00, 0x79
647
+ };
648
+ uart_write_bytes(uart_num, (const char*)command, 9);
649
+ // ↑Write then ↓Read data
650
+ uint8_t data[10];
651
+ int length = 0;
652
+ ESP_ERROR_CHECK(uart_get_buffered_data_len(uart_num, (size_t*)&length));
653
+ length = uart_read_bytes(uart_num, data, length, 10);
654
+ int i;
655
+ mrb_value array = mrbc_array_new( vm, 9 ); // mrubyc's variable
656
+ for( i = 0; i < 9; i++ ) {
657
+ mrb_value value = mrb_fixnum_value(data[i]);
658
+ mrbc_array_set( &array, i, &value ); // Adding a value to array
659
+ }
660
+ SET_RETURN(array); // Returning the array to mruby
661
+ }
662
+ int main(void){
663
+ ...
664
+ mrbc_define_method(0, mrbc_class_object, "get_co2", c_get_co2);
665
+ ...
666
+ }
667
+
668
+ = actual source code
669
+ # enscript ruby
670
+ # models/co2.rb
671
+ class Co2
672
+ def concentrate
673
+ res = get_co2
674
+ # checks if the sensor works
675
+ if res[0] == 255 && res[1] == 134
676
+ res[2] * 256 + res[3]
677
+ else
678
+ 0
679
+ end
680
+ end
681
+ end
682
+
683
+ = actual source code
684
+ * by the way,
685
+ * C function can return String instead of mruby/c Array
686
+ * `mrbc_array_new` will allocate larger memory than `mrbc_string_new`
687
+ * so, you can use String instead of Array if memory becomes short
688
+
689
+ = actual source code
690
+ # enscript ruby
691
+ # loops/slave.rb
692
+ while true
693
+ co2 = $co2.concentrate
694
+ temperature = $thermistor.temperature
695
+ if co2 > 0
696
+ data = "co2=#{co2}&temperature=#{temperature}"
697
+ puts "DATASEND:#{data}"
698
+ sleep 300
699
+ else
700
+ sleep 3
701
+ end
702
+ end
703
+
704
+ = development environment
705
+
706
+ = development environment
707
+ * PSoC Creator for PSoC5LP
708
+ # image
709
+ # src = images/IDE.png
710
+ # align = center
711
+ # relative-width = 100
712
+
713
+ = development environment
714
+ * the env depends on microcontroller
715
+ * IDE is your env if you use ((*PSoC5LP*))
716
+ * you can code mruby on any text editor
717
+ * IDE is almost mandatory to configure hardware
718
+ * terminal based work is the one if you use ((*ESP32*))
719
+
720
+ = dev tools for mruby/c
721
+
722
+ = dev tools for mruby/c
723
+ * mrubyc-utils
724
+ * mrubyc-test
725
+ * mrubyc-debugger
726
+
727
+ = mrubyc-utils
728
+ * github.com/hasumikin/mrubyc-utils
729
+ * one-binary tool made with mruby
730
+ * helps to install boilerplate of application
731
+ * shows mruby/c's classes and methods
732
+
733
+ = mrubyc-utils
734
+ your_project $ mrubyc-utils --help
735
+ Usage: mrubyc-utils COMMAND [ARGS]
736
+
737
+ install Install mruby/c repo into your local and setup templates.
738
+ Please run this command at the top directory
739
+ of your firmware project.
740
+ update Update mruby/c repo to the newest **master** branch.
741
+ checkout Checkout specified tag or commit of mruby/c repo.
742
+ -t | --tag [required] You can specify anything that
743
+ `git checkout` will accept.
744
+ tag Show all tags of mruby/c repogitory that you installed.
745
+ classes Show all the classes that are defined in
746
+ mruby/c's virtual machine.
747
+ methods Show all the methods that are available
748
+ in a class of mruby/c.
749
+ -c | --class [required] You have to specify class name
750
+ compile Compile your mruby source into C byte code.
751
+ This command is for PSoC Creator project. Use make command instead
752
+ if your project is dedicated to ESP32 or POSIX
753
+ -w | --watch [optional] Monitoring loop runs and will
754
+ compile mruby source every time you touched it.
755
+
756
+ -v | --version Show version.
757
+ -h | --help Show usage. (this message)
758
+
759
+ Dependencies:
760
+ git
761
+ mrbc (mruby compiler)
762
+
763
+ = mrubyc-utils
764
+ your_project $ mrubyc-utils classes
765
+ - Array
766
+ - FalseClass
767
+ - Fixnum
768
+ - Float
769
+ - Hash
770
+ - Math
771
+ - Mutex
772
+ - NilClass
773
+ - Numeric
774
+ - Object
775
+ - Proc
776
+ - Range
777
+ - String
778
+ - Symbol
779
+ - TrueClass
780
+ - VM
781
+
782
+ = mrubyc-utils
783
+ your_project $ mrubyc-utils methods --class=array
784
+ Array
785
+ - + - inspect
786
+ - << - join
787
+ - [] - last
788
+ - []= - length
789
+ - at - max
790
+ - clear - min
791
+ - collect - minmax
792
+ - collect! - new
793
+ - count - pop
794
+ - delete_at - push
795
+ - dup - shift
796
+ - each - size
797
+ - each_index - to_s
798
+ - each_with_index - unshift
799
+ - empty? < Object
800
+ - first - !
801
+ - index ...
802
+
803
+ = mrubyc-test
804
+ * github.com/mrubyc/mrubyc-test
805
+ * unit testing framework
806
+ * RubyGem implemented with CRuby instead of mruby
807
+ * supports stub and mock
808
+ * official tool of mruby/c dev team
809
+
810
+ = mrubyc-test
811
+ * gathers information of test cases by CRuby metaprogramming power
812
+ * generates stub and mock methods
813
+ * makes all-in-one script: ((*test.rb*))
814
+ # image
815
+ # src = images/how-mrubyc-test-works.png
816
+ # align = center
817
+ # relative-width = 100
818
+
819
+ = mrubyc-debugger
820
+ * github.com/hasumikin/mrubyc-debugger
821
+ * RubyGem
822
+ * debugger for infinite loop
823
+
824
+ = (anime gif DEMO)
825
+ (('tag:center'))\n\n\n\n
826
+ github.com/hasumikin/\nmrubyc-debugger
827
+
828
+ = summary
829
+
830
+ = summary
831
+ * mruby/c is the smallest implementation of Ruby
832
+
833
+ = summary
834
+ * mruby/c is the smallest implementation of Ruby
835
+ * we can write firmwares for microcontrollers with mruby/c
836
+
837
+ = summary
838
+ * mruby/c is the smallest implementation of Ruby
839
+ * we can write firmwares for microcontrollers with mruby/c
840
+ * it has a short history though, it's ready for production with the Rubyish ecosystem like testing tool
841
+
842
+ = (DEMO)
843
+ (('tag:center'))\n\n\n\n
844
+ CO(('sub:2'))
845
+
846
+ = (added after conference)
847
+ # image
848
+ # src = images/co2_demo.png
849
+ # align = center
850
+ # relative-height = 95
851
+
852
+ = (added after conference)
853
+ (('tag:center'))\n\n\n\n
854
+ the ventilation facility\nof Browar Lubicz is pretty good 👍
855
+
856
+ = conclusion
857
+
858
+ = conclusion
859
+ (('tag:center'))\n\n\n\n
860
+ (('tag:x-large:You should refresh air'))
861
+
862
+ = thank you!
863
+ # image
864
+ # src = images/juji-asahi.jpg
865
+ # align = center
866
+ # relative-height = 95
@@ -0,0 +1,99 @@
1
+ # puts font_families.sort
2
+ @xx_large_font_size = screen_size(10 * Pango::SCALE)
3
+ @x_large_font_size = screen_size(7.5 * Pango::SCALE)
4
+ @large_font_size = screen_size(6 * 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(2.8 * Pango::SCALE)
9
+
10
+ @default_headline_line_color = '#888888'
11
+ @font_family = find_font_family('Rockwell')
12
+ @foreground = "#d9333f" # タイトルスライドの文字色
13
+ #@background = "#000000"
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
+ #@title_background_color = "red"
43
+ #include_theme("title-background-color")
44
+ @title_slide_background_image = 'images/krkrb-main.png'
45
+ include_theme("title-slide-background-image")
46
+
47
+ #@slide_logo_image = 'images/NEW_ML_LOGO.png'
48
+ #include_theme('slide-logo')
49
+
50
+ @slide_background_image = 'images/slide-background.png'
51
+ include_theme("slide-background-image")
52
+
53
+ @item_image = 'images/mark32.png'
54
+
55
+ include_theme("default-item-mark")
56
+
57
+ add_image_path("rabbit-images")
58
+
59
+ slide_body = [Slide, Body]
60
+ item_list_item = [ItemList, ItemListItem]
61
+
62
+ indent = 30
63
+
64
+ match(*(slide_body + (item_list_item * 1))) do |items|
65
+ name = "item1"
66
+ items.delete_pre_draw_proc_by_name(name)
67
+ items.delete_post_draw_proc_by_name(name)
68
+ draw_image_mark(items, @item_image, name, indent: indent)
69
+ end
70
+
71
+ match(*(slide_body + (item_list_item * 2))) do |items|
72
+ name = "item2"
73
+ items.delete_pre_draw_proc_by_name(name)
74
+ items.delete_post_draw_proc_by_name(name)
75
+ draw_image_mark(items, @item_image, name, indent: indent)
76
+ end
77
+
78
+ match(*(slide_body + (item_list_item * 3))) do |items|
79
+ name = "item3"
80
+ items.delete_pre_draw_proc_by_name(name)
81
+ items.delete_post_draw_proc_by_name(name)
82
+ draw_image_mark(items, @item_image, name, indent: indent)
83
+ end
84
+
85
+ enum_list_item = [EnumList, EnumListItem]
86
+
87
+ match(*(slide_body + enum_list_item + item_list_item)) do |items|
88
+ name = "enum-item1"
89
+ items.delete_pre_draw_proc_by_name(name)
90
+ items.delete_post_draw_proc_by_name(name)
91
+ draw_image_mark(items, @item_image, name, indent: indent)
92
+ end
93
+
94
+ match(*(slide_body + enum_list_item + (item_list_item * 2))) do |items|
95
+ name = "enum-item2"
96
+ items.delete_pre_draw_proc_by_name(name)
97
+ items.delete_post_draw_proc_by_name(name)
98
+ draw_image_mark(items, @item_image, name, indent: indent)
99
+ end
metadata ADDED
@@ -0,0 +1,101 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: rabbit-slide-hasumikin-RubyConfPoland2019
3
+ version: !ruby/object:Gem::Version
4
+ version: 2019.05.14
5
+ platform: ruby
6
+ authors:
7
+ - HASUMI Hitoshi
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2019-05-21 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: |-
28
+ The slide for [THE RUBY CONFERENCE OF CRACOW 2019](https://krk-rb.pl/) by [hasumkin](https://github.com/hasumikin)
29
+
30
+ It will cover:
31
+
32
+ - Introducing Ruby for microcontrollers and microcontrollers themselves
33
+ - Things in common and difference between mruby and mruby/c
34
+ - How mruby/c works
35
+ - Development sorroundings
36
+ - Some actual source code of firmware application
37
+ email:
38
+ - hasumikin@gmail.com
39
+ executables: []
40
+ extensions: []
41
+ extra_rdoc_files: []
42
+ files:
43
+ - ".rabbit"
44
+ - README.rd
45
+ - Rakefile
46
+ - config.yaml
47
+ - images/IDE.png
48
+ - images/bytecode.png
49
+ - images/co2_demo.png
50
+ - images/collage01.jpg
51
+ - images/esp32.jpg
52
+ - images/hasumi.jpg
53
+ - images/how-mrubyc-test-works.png
54
+ - images/juji-asahi.jpg
55
+ - images/kamos.jpg
56
+ - images/krkrb-main.png
57
+ - images/krkrb-main.svg
58
+ - images/krkrb-main.svg.png
59
+ - images/m1.png
60
+ - images/m2.png
61
+ - images/mark32.png
62
+ - images/mark48.png
63
+ - images/mark64.png
64
+ - images/monstarlab.png
65
+ - images/monstarlab_global.png
66
+ - images/mruby_and_mrubyc-mruby.png
67
+ - images/mruby_and_mrubyc-mrubyc.png
68
+ - images/mruby_and_mrubyc.png
69
+ - images/psoc5lp_chip.jpg
70
+ - images/raspberrypi.jpg
71
+ - images/slide-background.png
72
+ - images/unsoldered-2.png
73
+ - images/unsoldered.jpg
74
+ - images/松江城_Matsue.rb.16x9.jpg
75
+ - images/松江城_Matsue.rb.jpg
76
+ - mrubyc---The-smallest-Ruby-implementation-for-microcontrollers.rab
77
+ - pdf/RubyConfPoland2019-mrubyc---The-smallest-Ruby-implementation-for-microcontrollers.pdf
78
+ - theme.rb
79
+ homepage: http://slide.rabbit-shocker.org/authors/hasumikin/RubyConfPoland2019/
80
+ licenses: []
81
+ metadata: {}
82
+ post_install_message:
83
+ rdoc_options: []
84
+ require_paths:
85
+ - lib
86
+ required_ruby_version: !ruby/object:Gem::Requirement
87
+ requirements:
88
+ - - ">="
89
+ - !ruby/object:Gem::Version
90
+ version: '0'
91
+ required_rubygems_version: !ruby/object:Gem::Requirement
92
+ requirements:
93
+ - - ">="
94
+ - !ruby/object:Gem::Version
95
+ version: '0'
96
+ requirements: []
97
+ rubygems_version: 3.0.3
98
+ signing_key:
99
+ specification_version: 4
100
+ summary: mrubyc - The smallest Ruby implementation for microcontrollers
101
+ test_files: []