rabbit-slide-hasumikin-RubyConfPoland2019-Workshop 2019.05.15

Sign up to get free protection for your applications and to get access to all the features.
Files changed (71) hide show
  1. checksums.yaml +7 -0
  2. data/.rabbit +1 -0
  3. data/IoT-workshop-for-firmware-programming-with-ESP32-and-mrubyc.rab +558 -0
  4. data/README.rd +34 -0
  5. data/Rakefile +17 -0
  6. data/config.yaml +25 -0
  7. data/images/180425_mruby-c_fix_color_data-04.png +0 -0
  8. data/images/Corleto_thermistor1.jpg +0 -0
  9. data/images/LED-anatomy-1024x455.png +0 -0
  10. data/images/LED.jpg +0 -0
  11. data/images/LED.png +0 -0
  12. data/images/RWC2018-2.png +0 -0
  13. data/images/alexandru-zdrobau-176844-unsplash.jpg +0 -0
  14. data/images/andrew-santellan-311033-unsplash.jpg +0 -0
  15. data/images/annie-spratt-330560-unsplash.jpg +0 -0
  16. data/images/bb_wiring_01.png +0 -0
  17. data/images/beer-pouring-from-can-to-glass_925x.jpg +0 -0
  18. data/images/black-background.png +0 -0
  19. data/images/blinking_led_breadboard.png +0 -0
  20. data/images/bytecode.png +0 -0
  21. data/images/esp32_block_diagram-2.png +0 -0
  22. data/images/esp32_block_diagram.png +0 -0
  23. data/images/esp32_devboard.png +0 -0
  24. data/images/esp32_module.png +0 -0
  25. data/images/esp32_module_block_diagram.png +0 -0
  26. data/images/esp32_onechip.jpg +0 -0
  27. data/images/esp32_onechip.png +0 -0
  28. data/images/esp32_original.jpg +0 -0
  29. data/images/esp32_pcb_layout.png +0 -0
  30. data/images/hasumi.jpg +0 -0
  31. data/images/jj-ying-230105-unsplash.jpg +0 -0
  32. data/images/led_circuit.png +0 -0
  33. data/images/led_datasheet.png +0 -0
  34. data/images/m2.png +0 -0
  35. data/images/mark32.png +0 -0
  36. data/images/mark48.png +0 -0
  37. data/images/mark64.png +0 -0
  38. data/images/mcp3002.jpg +0 -0
  39. data/images/mnm-all-551345-unsplash.jpg +0 -0
  40. data/images/monstarlab.png +0 -0
  41. data/images/mruby_and_mrubyc-mruby.png +0 -0
  42. data/images/mruby_and_mrubyc-mrubyc.png +0 -0
  43. data/images/mruby_and_mrubyc.png +0 -0
  44. data/images/pdf/1.pdf +0 -0
  45. data/images/pdf/2.pdf +0 -0
  46. data/images/pdf/3.pdf +0 -0
  47. data/images/pdf/4.pdf +0 -0
  48. data/images/pdf/5.pdf +0 -0
  49. data/images/pdf/6.pdf +0 -0
  50. data/images/pdf/7.pdf +0 -0
  51. data/images/pdf/8.pdf +0 -0
  52. data/images/pdf/9.pdf +0 -0
  53. data/images/resistor.jpg +0 -0
  54. data/images/sorasak-252182-unsplash.jpg +0 -0
  55. data/images/thermistor.eps +2236 -0
  56. data/images/thermistor.jpg +0 -0
  57. data/images/thermistor.png +0 -0
  58. data/images/thermistor_approximation.eps +2271 -0
  59. data/images/thermistor_approximation.png +0 -0
  60. data/images/thermistor_breadboard.png +0 -0
  61. data/images/thermistor_circuit.png +0 -0
  62. data/images/thermistor_circuit_resistance.png +0 -0
  63. data/images/thermistor_datasheet.png +0 -0
  64. data/images/thermistor_resistance.eps +1330 -0
  65. data/images/thermistor_resistance.png +0 -0
  66. data/images/title_slide_background.png +0 -0
  67. data/images//346/235/276/346/261/237/345/237/216_Matsue.rb.jpg +0 -0
  68. data/pdf/RubyConfPoland2019-Workshop-IoT-workshop-for-firmware-programming-with-ESP32-and-mrubyc.pdf +0 -0
  69. data/theme.rb +89 -0
  70. data/workshops.md +16 -0
  71. metadata +136 -0
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: b405d2e727e9bdf9a97abafa789721d74b6745a8778e39c3f0eb67ce9062120f
4
+ data.tar.gz: d39e0fb8abf7e62826bbbaac065e06229efd7882fe96f3270dee51674b07219e
5
+ SHA512:
6
+ metadata.gz: b4ed7960e3725d6d00ae33b9d1cf8f54d54dd31a01ef93109d06f08a04cf3cea575a854b2c0b52016b2cd02983217abfbe8f38b2e78d91caff82c062673085c5
7
+ data.tar.gz: cc059e8425cc13e5830883835d71ca8dc18209fcaba186f40500eac71509d9acd15b62d265d012be1cac9527caf7b2f3339775493ad14387756bcdee5ef3f879
data/.rabbit ADDED
@@ -0,0 +1 @@
1
+ IoT-workshop-for-firmware-programming-with-ESP32-and-mrubyc.rab
@@ -0,0 +1,558 @@
1
+ = IoT workshop for firmware programming with ESP32 and mruby/c
2
+
3
+ # サブタイトル
4
+ : author
5
+ HASUMI Hitoshi (@hasumikin)
6
+ : institution
7
+ Monstar Lab, Matsue
8
+ # : content-source
9
+ # イベント名
10
+ : date
11
+ March 16, 2019 in Matsue, Japan
12
+ : date
13
+ May 6, 2019 in Warszawa, Polska
14
+ : date
15
+ May 15, 2019 in Kraków, Polska
16
+ : allotted-time
17
+ 3h
18
+ : theme
19
+ theme
20
+
21
+ = hide-title
22
+ (('tag:center'))\n\n\n\n((*(('tag:xx-large:Cześć!'))*))
23
+ == プロパティ
24
+ : hide-title
25
+ true
26
+
27
+ = about me
28
+ * HASUMI Hitoshi\n@hasumikin
29
+ * Ruby ((*💎*))\nSake 🍶\nSoba 🍜\nCoffee ☕
30
+ # image
31
+ # src = images/hasumi.jpg
32
+ # align = right
33
+ # relative-height = 80
34
+
35
+ = about me
36
+ == prop
37
+ : background-image
38
+ images/monstarlab.png
39
+ : background-image-relative-height
40
+ 100
41
+
42
+ = about me
43
+ == prop
44
+ : background-image
45
+ images/m2.png
46
+ : background-image-relative-height
47
+ 100
48
+
49
+ = about me
50
+ == prop
51
+ : background-image
52
+ images/松江城_Matsue.rb.jpg
53
+ : background-image-relative-width
54
+ 100
55
+
56
+ = message from Matz
57
+ # # video
58
+ # # src = images/matz.mp4
59
+
60
+ = agenda
61
+ * we will learn how to start to make IoT product with Ruby
62
+ * assumed attendees are software programmers
63
+ * ESP32 microcontroller as the platform
64
+ * mruby/c (and C) as the firmware language
65
+ * we will iterate some combinations of lecture and hands-on
66
+
67
+ = agenda
68
+ * we have 3 to 4 hours 😨
69
+ * no worry, we will take several breaks
70
+
71
+ = break
72
+ \n\n\n(('tag:center'))a short break
73
+ == prop
74
+ : hide-title
75
+ true
76
+ : background-image
77
+ images/annie-spratt-330560-unsplash.jpg
78
+ : background-image-relative-height
79
+ 100
80
+
81
+ = enquête
82
+
83
+ = enquête
84
+ (('tag:center'))\n\n\n\n✋ please raise your hand ✋\n✋ if you are a ✋\n✋ firmware programming ((*newbie*)) ✋
85
+
86
+ = enquête
87
+ (('tag:center'))\n\n\n\n✋ please raise your hand ✋\n✋ if you don't have ✋\n✋ ((*any*)) experience of mruby ✋
88
+
89
+ = enquête
90
+ (('tag:center'))\n\n\n\n✋ please raise your hand ✋\n✋ if you don't have ✋\n✋ ((*much*)) experience of C language ✋
91
+
92
+ = setup your laptop
93
+ * we have to install ESP-IDF and some dependent tools in order to develop mruby/c firmwares for ESP32
94
+ * the most important thing will be ((*USB*)). we will write our firmware into ESP32 through USB cable
95
+
96
+ = setup your laptop - Linux or macOS
97
+ * using ((*Linux distributions*)) or ((*macOS*)) (as a host machine) is the easiest way
98
+ * less USB problem
99
+ * I'm not sure but docker will not work because of USB problem
100
+
101
+ = setup your laptop - Windows
102
+ * you can choose both ((*Windows Subsystem for Linux*)) (WSL) and ((*MSYS2*))
103
+ * I recommend you to use WSL if your OS is Windows10 (64 bit) as compiling on WSL is much faster than MSYS2
104
+ * ((*WSL*))
105
+ * you should use WSL if your OS is 64bit of Win10 Pro
106
+
107
+ = setup your laptop - Windows
108
+ * ((*MSYS2*))
109
+ * strongly recommended of using zipped one which Espressif Systems maintenances
110
+ * besides, note that only 32 bit version of MSYS2 is available regardless of whether your Windows is 64 bit or 32 bit
111
+ * Docker for Windows
112
+ * it appears not to work so far
113
+ * but please tell me if it works
114
+
115
+ = setup your laptop - VM
116
+ * I (hasumi) use Linux Mint with VirtualBox on Windows 10 Professional
117
+ * but some people say that virtual environments tend to have problems around USB
118
+
119
+ = setup your laptop
120
+ \n\n
121
+ (('tag:center'))more information on
122
+ \n\n
123
+ https://github.com/hasumikin\n/IoT_workshop
124
+
125
+ = setup your laptop
126
+ \n\n\n\n
127
+ (('tag:center'))please tell me if you have any doubt
128
+ \n
129
+ during the hands-on
130
+
131
+ = Hands On 01
132
+ \n
133
+ (('tag:center'))Hello mruby/c World!
134
+ \n\n
135
+ open the URL
136
+ \n
137
+ (('tag:center'))github.com/hasumikin/IoT_workshop
138
+ \n\n
139
+ and find the link
140
+ \n
141
+ (('tag:center'))((*Hands on 01*))
142
+ == prop
143
+ : background-image
144
+ images/black-background.png
145
+ : background-image-relative-width
146
+ 100
147
+ : background-image-relative-height
148
+ 100
149
+
150
+ = what is microcontroller?
151
+ * if you are not familiar with microcontroller, this section is very important to grab overview what we do in this workshop
152
+
153
+ = one-chip microcontroller
154
+ * a single IC chip\nconsists of CPU(MPU),\nRAM, ROM and\nprogrammable GPIOs
155
+ * `programmable`\nmeans user can\nconfigure the role\nof the pins
156
+
157
+ # image
158
+ # src = images/esp32_onechip.png
159
+ # align = right
160
+ # relative-height = 90
161
+
162
+ = moduled microcontroller
163
+ * additional instruments\nlike WiFi communication\nmodule combined\nwith one-chip\nmicrocontroller
164
+
165
+ # image
166
+ # src = images/esp32_module.png
167
+ # align = right
168
+ # relative-height = 90
169
+
170
+ = moduled microcontroller
171
+ # image
172
+ # src = images/esp32_module_block_diagram.png
173
+ # align = center
174
+ # relative-height = 90
175
+
176
+ (('tag:left'))(('tag:xx-small:"esp32_hardware_design_guidelines_en.pdf esp32_datasheet_en.pdf"'))
177
+
178
+ = development board (devkit)
179
+ * useful equipments like\nUSB adaptor and power\nregulator combined\nwith microcontroller\nfor experimental work
180
+ * generally has 2.54mm\n(=1/10inch) pitch pins\nto be fit with\nbreadboard
181
+
182
+ # image
183
+ # src = images/esp32_devboard.png
184
+ # align = right
185
+ # relative-height = 90
186
+
187
+ = what is microcontroller?
188
+ * what we call as `microcontroller` depends on the situation
189
+ * I call the development board as `microcontroller` in this workshop
190
+ * you may have to treat `one-chip microcontroller` as `microcontroller` if you plan for producing an IoT hardware
191
+
192
+ = Hands On 02
193
+ \n
194
+ (('tag:center'))Hello ESP32 World!
195
+ \n\n
196
+ open the URL
197
+ \n
198
+ (('tag:center'))github.com/hasumikin/IoT_workshop
199
+ \n\n
200
+ and find the link
201
+ \n
202
+ (('tag:center'))((*Hands on 02*))
203
+ == prop
204
+ : background-image
205
+ images/black-background.png
206
+ : background-image-relative-width
207
+ 100
208
+ : background-image-relative-height
209
+ 100
210
+
211
+ = break
212
+ \n\n\n\n\n\n\n(('tag:center'))a short break
213
+ == prop
214
+ : hide-title
215
+ true
216
+ : background-image
217
+ images/andrew-santellan-311033-unsplash.jpg
218
+ : background-image-relative-height
219
+ 100
220
+
221
+ = peripherals
222
+ * ((*peripheral*)) is an important concept of microcontroller
223
+ * high-end microcontroller has rich peripherals and low-end one has less
224
+
225
+ = peripherals
226
+ # image
227
+ # src = images/esp32_block_diagram-2.png
228
+ # align = center
229
+ # relative-height = 90
230
+
231
+ (('tag:center'))(('tag:xx-small:"esp32_datasheet_en.pdf"'))
232
+
233
+ = peripherals
234
+ * GPIO (General Purpose Input/Output)
235
+ * GPIO is a defining characteristic of microcontroller
236
+ * GPIO basically has values of only 0 and 1 (digital value)
237
+ * analog value will be mentioned later
238
+ * usecases of Input:
239
+ * switch as an user interface, getting sensor value
240
+ * usecases of Output:
241
+ * LED as a display, sending message to modem
242
+
243
+ = peripherals
244
+ * ADC (analog to digital converter) and\nDAC (vice versa)
245
+ * ADC converts analog value such as microphone input into digital value that computer can deal with
246
+ * DAC converts digital value such as sound data of MP3 into analog output in order to play back the music on loud speaker
247
+
248
+ = peripherals
249
+ * Raspberry Pi does neither have ADC nor DAC
250
+ * we can add an independent ADC part if we need it
251
+ # image
252
+ # src = images/mcp3002.jpg
253
+ # align = center
254
+ # relative-height = 90
255
+
256
+ (('tag:center'))(('tag:xx-small:from "http://akizukidenshi.com/catalog/g/gI-02584/"'))
257
+
258
+ = today's parts
259
+ * breadboard
260
+ * resistor
261
+ * LED
262
+ * thermistor
263
+
264
+ = breadboard (protoboard)
265
+ * wired internally by 2.54 mm pitch so that we can experiment without soldering
266
+
267
+ # image
268
+ # src = images/bb_wiring_01.png
269
+ # align = center
270
+ # relative-height = 90
271
+
272
+ (('tag:center'))(('tag:xx-small:from "https://ht-deko.com/arduino/breadboard.html"'))
273
+
274
+ = registor & Ohm's law
275
+ * if the voltage across the both ends of 10kOhm resistor is 3V, the current will be 0.3mA
276
+
277
+ (('tag:center'))3 / 10k = 3 / 10000 = 0.0003A = 0.3mA
278
+
279
+ # image
280
+ # src = images/resistor.jpg
281
+ # align = center
282
+ # relative-height = 100
283
+
284
+ = LED
285
+ # blockquote
286
+ # title = WIKIPEDIA
287
+ A light-emitting diode (LED) is a semiconductor light source that emits light when current flows through it.
288
+
289
+ # image
290
+ # src = images/LED.png
291
+ # align = center
292
+ # relative-height = 100
293
+
294
+ = LED - datasheet
295
+ # image
296
+ # src = images/led_datasheet.png
297
+ # align = center
298
+ # relative-height = 90
299
+
300
+ (('tag:center'))(('tag:xx-small:from "http://akizukidenshi.com/download/ds/optosupply/OSXXXX3Z74A_VER_A1.pdf"'))
301
+
302
+ = LED & Ohm's law
303
+ (('tag:center'))(3.3 - 2.1) / 330 = 0.0036A = 3.6mA
304
+
305
+ # image
306
+ # src = images/led_circuit.png
307
+ # align = center
308
+ # relative-height = 100
309
+
310
+ = LED & GPIO
311
+ * small LED can be lighten by GPIO
312
+ * but instruments like huge LED which requires high current can not be driven even if its nominal voltage is less than 3.3V
313
+ * because microcontroller has some limit of supplying amount of electric current
314
+ * incorrect usage may break your microcontroller
315
+
316
+ = Hands On 03
317
+ \n
318
+ (('tag:center'))Blinking LED
319
+ \n\n
320
+ open the URL
321
+ \n
322
+ github.com/hasumikin/IoT_workshop
323
+ \n\n
324
+ and find the link
325
+ \n
326
+ ((*Hands on 03*))
327
+ \n\n
328
+ hint: you should use a ((*blue*)) resistor
329
+ == prop
330
+ : background-image
331
+ images/black-background.png
332
+ : background-image-relative-width
333
+ 100
334
+ : background-image-relative-height
335
+ 100
336
+
337
+ = break
338
+ \n\n\n\n\n(('tag:center'))a short break
339
+ == prop
340
+ : hide-title
341
+ true
342
+ : background-image
343
+ images/jj-ying-230105-unsplash.jpg
344
+ : background-image-relative-height
345
+ 100
346
+
347
+ = today's parts (again)
348
+ * breadboard
349
+ * resistor
350
+ * LED
351
+ * thermistor
352
+
353
+ = thermistor
354
+ # blockquote
355
+ # title = WIKIPEDIA
356
+ A thermistor is a type of resistor whose resistance is dependent on temperature, more so than in standard resistors.
357
+ \n
358
+ # image
359
+ # src = images/thermistor.jpg
360
+ # align = center
361
+ # relative-height = 110
362
+
363
+ = thermistor
364
+ # image
365
+ # src = images/Corleto_thermistor1.jpg
366
+ # align = left
367
+ # relative-height = 90
368
+
369
+ (('tag:center'))(('tag:xx-small:from "https://www.allaboutcircuits.com/projects/measuring-temperature-with-an-ntc-thermistor/"'))
370
+
371
+ #= thermistor - approximation
372
+ # # LaTeX
373
+ #
374
+ # $\;$
375
+ #
376
+ # $R=R_{ref} \times e^{(B(\frac{1}{T+273}-\frac{1}{T_{o}+273}))}$
377
+ #
378
+ # hence,
379
+ #
380
+ # $T=\frac{1}{\frac{1}{B}\log \frac{R}{R_{ref}}+\frac{1}{T_{o}+273}}-273$
381
+
382
+ = thermistor - approximation
383
+ # image
384
+ # src = images/thermistor_approximation.png
385
+ # relative_width = 80
386
+ # relative_margin_top = 10
387
+
388
+ = thermistor - datasheet
389
+ # image
390
+ # src = images/thermistor_datasheet.png
391
+ # relative_width = 100
392
+
393
+ (('tag:center'))(('tag:xx-small:from "https://www.mouser.com/datasheet/2/362/semitec_atthermistor-1202913.pdf"'))
394
+
395
+ = thermistor - approximation
396
+ # enscript ruby
397
+ # this is CRuby
398
+ include Math
399
+
400
+ # according to the datasheet
401
+ B = 3_435 # from datasheet
402
+ To = 25 # from datasheet
403
+ Rref = 10_000 # arbitrary but fixed
404
+
405
+ def temperature(r)
406
+ 1.to_f / ( 1.to_f / B * log(r.to_f / Rref)
407
+ + 1.to_f / (To + 273) ) - 273
408
+ end
409
+
410
+ # if resistance of thermistor is 12kOhm
411
+ puts temperature(12_000)
412
+
413
+ => 20.35988998853088
414
+
415
+ #= thermistor - circuit
416
+ # # LaTeX
417
+ #
418
+ # $R=\frac{V-V_{ref}}{\frac{V_{ref}}{R_{ref}}}$
419
+
420
+ = thermistor & Ohm's law
421
+ # image
422
+ # src = images/thermistor_circuit_resistance.png
423
+ # relative-height = 100
424
+
425
+ = Hands On 04
426
+ \n
427
+ (('tag:center'))Taking temperature
428
+ \n\n
429
+ open the URL
430
+ \n
431
+ github.com/hasumikin/IoT_workshop
432
+ \n\n
433
+ and find the link
434
+ \n
435
+ ((*Hands on 04*))
436
+ \n\n
437
+ hint: you should use a ((*brown*)) resistor
438
+ == prop
439
+ : background-image
440
+ images/black-background.png
441
+ : background-image-relative-width
442
+ 100
443
+ : background-image-relative-height
444
+ 100
445
+
446
+ = break
447
+ \n\n\n\n\n\n(('tag:center'))a short break
448
+ == prop
449
+ : hide-title
450
+ true
451
+ : background-image
452
+ images/mnm-all-551345-unsplash.jpg
453
+ : background-image-relative-height
454
+ 100
455
+
456
+ = what is mruby/c?
457
+ * github.com/mrubyc/mrubyc
458
+ * yet another implementation of mruby
459
+ * `/c` symbolizes compact,\nconcurrent and capability
460
+ * especially dedicated to\none-chip microcontroller
461
+
462
+ = mruby and mruby/c
463
+ # RT
464
+
465
+ mruby, mruby/c
466
+
467
+ v1.0.0 in Jan 2014, v1.0 in Jan 2017
468
+ for general embedded software, for one-chip microcontroller
469
+ RAM < 400KB, RAM < 40KB
470
+
471
+ * sometimes mruby is still too big to run on microcontroller
472
+
473
+ = ((*both*)) mruby and mruby/c
474
+ * bytecodes are compiled by `mrbc` and VM executes the bytecode
475
+ # image
476
+ # src = images/mruby_and_mrubyc.png
477
+ # align = center
478
+ # relative-height = 100
479
+
480
+ = bytecode
481
+ * a kind of intermediate representation
482
+ * virtual machine dynamically interprets the bytecode and processes the program
483
+ # image
484
+ # src = images/bytecode.png
485
+ # align = center
486
+ # relative-width = 100
487
+
488
+ = mruby on microcontroller
489
+ * RTOS (Real-Time OS) manages mruby VMs. RTOS has features like multi tasking
490
+ # image
491
+ # src = images/mruby_and_mrubyc-mruby.png
492
+ # align = center
493
+ # relative-height = 100
494
+
495
+ = mruby/c on microcontroller
496
+ * mruby/c has its own mechanism to manage the runtime: ((*rrt0*))
497
+ # image
498
+ # src = images/mruby_and_mrubyc-mrubyc.png
499
+ # align = center
500
+ # relative-height = 100
501
+
502
+ = mruby/c - virtual machine (VM)
503
+ * much smaller than mruby's one
504
+ * that's why mruby/c runs on smaller RAM
505
+ * accordingly, mruby/c has ((*less*)) functionality than mruby
506
+
507
+ = how ((*less*))?
508
+
509
+ = how ((*less*))? - for example
510
+ * mruby/c doesn't have module, hence there is no Kernel module
511
+ * then you must wonder how can you `#puts`?
512
+ * in mruby/c, `#puts` is implemented in Object class
513
+
514
+ = how ((*less*))? - for example
515
+ * mruby/c doesn't have #send, #eval, nor #method_missing
516
+ * moreover, mruby/c neither have your favorite features like TracePoint nor Refinements 😞
517
+
518
+ = how ((*less*))? - actually
519
+ * the full list of mruby/c's classes
520
+ * Array, FalseClass, Fixnum, Float, Hash, Math, Mutex, NilClass, Numeric, Object, Proc, Range, String, Symbol, TrueClass, VM
521
+
522
+ = despite the fact,
523
+ * no problem in practical use of microcontroller
524
+ * as far as IoT go, mruby/c is enough Ruby as I expect
525
+ * we can fully develop firmwares with features of mruby/c
526
+
527
+ = Hands On 05
528
+ \n
529
+ (('tag:center'))Multi-tasking with mruby/c
530
+ \n\n
531
+ open the URL
532
+ \n
533
+ (('tag:center'))github.com/hasumikin/IoT_workshop
534
+ \n\n
535
+ and find the link
536
+ \n
537
+ (('tag:center'))((*Hands on 05*))
538
+ == prop
539
+ : background-image
540
+ images/black-background.png
541
+ : background-image-relative-width
542
+ 100
543
+ : background-image-relative-height
544
+ 100
545
+
546
+ = conclusion
547
+
548
+ = conclusion
549
+ \n\n\n\n
550
+ (('tag:center'))(('tag:large:All you need is')) ((*(('tag:large:Ohm's law'))*))
551
+
552
+ = ((' '))
553
+ \n\n\n\n
554
+ (('tag:center'))(('tag:xx-large:Thank you!'))
555
+ == プロパティ
556
+ : hide-title
557
+ true
558
+