IoT勉強会に通い詰めて得られたもの

この記事は [IoTLT Advent Calendar 2017](https://qiita.com/advent-calendar/2017/iotlt) の12月22日の記事です。私の25歳の誕生日でした。1日遅刻してしまい申し訳ございません！

IoT勉強会に通い詰めて得たものを紹介したいと思います。

# 自己紹介
![FXY149Ke.png]
(https://qiita-image-store.s3.amazonaws.com/0/137045/51520cc0-30c0-a077-c439-831e828f217f.png)

mascii(ますきー)です。
今年3月までは数学を研究する大学院生兼Webサービス開発のインターン、今年4月からSIerのSEになりました。
Raspberry Piは2016年5月頃から触り始めました。好きな言語(現在)はJavaScriptです。

[IoT縛りの勉強会! IoTLT vol.33 @ LINE](https://iotlt.connpass.com/event/67583/)では「あなたのお家に眠るラズパイを救出したい」([スライド](https://speakerdeck.com/mascii/anatafalseojia-nimian-rurasuhaiwojiu-chu-sitai))というタイトルでLT登壇しました。

## 2017年に参加したIoT勉強会
* 12/10 [Arduinoファンもくもく会#015 with アトリエ秋葉原(Pepper開発体験)](https://arduinofun.connpass.com/event/72746/)
* 12/09 [IoT もくもく会 KOIL vol.14](https://kashiwano-ha-geeks.connpass.com/event/68458/)
* 11/16 [IoT縛りの勉強会! IoTLT vol.33 @ LINE](https://iotlt.connpass.com/event/67583/)
* 11/11 [IoT もくもく会 KOIL vol.13](https://kashiwano-ha-geeks.connpass.com/event/68457/)
* 10/19 [IoT縛りの勉強会! IoTLT vol.32 @ サポーターズ](https://iotlt.connpass.com/event/66838/)
* 10/14 [IoT もくもく会 KOIL vol.12](https://kashiwano-ha-geeks.connpass.com/event/67588/)
* 09/14 [IoT縛りの勉強会! IoTLT vol.31 @ リクルート](https://iotlt.connpass.com/event/65379/)
* 09/09 [IoT もくもく会 KOIL vol.11](https://kashiwano-ha-geeks.connpass.com/event/64716/)
* 08/24 [IoT縛りの勉強会! IoTLT vol.30 @ DMM](https://iotlt.connpass.com/event/58227/)
* 08/13 [Arduinoファンもくもく会#011](https://arduinofun.connpass.com/event/64050/)
* 08/12 [IoT もくもく会 KOIL vol.10](https://kashiwano-ha-geeks.connpass.com/event/61816/)
* 07/29 [International NodeBots Day 2017 in Tokyo](https://nodebots.connpass.com/event/61190/)
* 07/13 [IoT縛りの勉強会! IoTLT vol.29 @ サムライインキュベート](https://iotlt.connpass.com/event/56277/)
* 06/13 [IoT縛りの勉強会! IoTLT vol.28 @ サイボウズ](https://iotlt.connpass.com/event/56270/)
* 06/10 [IoT もくもく会 KOIL vol.8](https://kashiwano-ha-geeks.connpass.com/event/57113/)
* 05/19 [IoT縛りの勉強会! IoTLT vol.27 @ ヤフー（紀尾井町）](https://iotlt.connpass.com/event/52082/)
* 05/13 [IoT もくもく会 KOIL vol.7](https://kashiwano-ha-geeks.connpass.com/event/55662/)
* 05/02 [電子工作とisaaxファーストインプレッション with おいしいものパーティ](https://atnd.org/events/87729)
* 04/10 [IoT縛りの勉強会! IoTLT vol.26 @ 日本オラクル](https://iotlt.connpass.com/event/53132/)
* 04/02 [Arduinoファンもくもく会#005](https://arduinofun.connpass.com/event/53413/)
* 02/11 [IoT もくもく会 KOIL vol.3](https://kashiwano-ha-geeks.connpass.com/event/49902/)
* 01/29 [Arduinoファンもくもく会#002](https://arduinofun.connpass.com/event/49382/)
* 01/15 [Arduinoファンもくもく会#001](https://arduinofun.connpass.com/event/48248/)

今年は23回も行っていたようです。よく参加していたのは

* 毎回200人ほどが参加するLTイベントである[IoTLT](https://iotlt.connpass.com/)
* 柏の葉キャンパスにある[KOIL](http://www.31ventures.jp/ventureoffice/koil/)で開催されている[IoT もくもく会 KOIL](https://kashiwano-ha-geeks.connpass.com/)
* [kogurek1](https://twitter.com/kogurek1)さんが主催の[Arduinoファンもくもく会](https://arduinofun.connpass.com/)

でした。

# IoT勉強会に通い詰めて得られたもの
## 様々なポジション・年代の方々との交流
Web系の勉強会(JavaScriptの勉強会やフロントエンドの勉強会など)に比べて、自分と違う年代、ポジションの方と会って話す機会が多いと感じます。

IoTLTは平日の夜に開催されており、ソフトウェアのエンジニア以外にもハードウェア系のエンジニアや大学生といった方々も多く参加されている印象です。

[IoT もくもく会 KOIL](https://kashiwano-ha-geeks.connpass.com/)や[Arduinoファンもくもく会](https://arduinofun.connpass.com/)のようなもくもく形式の勉強会は、主に土日の昼に開催されており、小学生から60代でOSSにコミットされている方まで幅広い年代の方々が揃っている印象です。

![boy_and_elderly.png](https://qiita-image-store.s3.amazonaws.com/0/137045/8672601a-dd42-5bc6-7560-b0e90302e5b0.png)

Web系の勉強会で60代の方を見ることはほとんどなく、知識量に圧倒されることもあります。自分と年代もポジションも違う人と会うことは多くの学びを得ることができると思います。

## 趣味でプログラミングするきっかけ
**作りたいもの**がないとプログラミングをするモチベーションが高まらないと考えています。

Web系の勉強会だと業務で得た知見をアウトプットされている方が多く、SI系や組み込み系などに勤めている方が勉強会で聞いたことを業務で活用するのが難しかったり、趣味で活用するのが難しかったりします。

IoTの勉強会は趣味で得た知見をアウトプットされている方も多く、**これ作ってみたい！**というものに巡り会える可能性が高いです。趣味でプログラミングするきっかけが欲しい方はぜひ参加して欲しいです！

![kaizoku_takara.png](https://qiita-image-store.s3.amazonaws.com/0/137045/3bc3bede-bb56-3f55-caaa-def3ec932a45.png)

## Linuxを学ぶきっかけ
Raspberry Piに触れていると避けて通れないのが[Raspbian](https://www.raspberrypi.org/downloads/raspbian/)(Debian系Linux)なのですが、このOSをきっかけにLinuxのコマンドや動きを多く学ぶことができ、業務で活かすこともできました。Raspberry Piが**教育用コンピュータ**であったことを再確認しました。
![rasp_and_penguin.png](https://qiita-image-store.s3.amazonaws.com/0/137045/f90ab77f-e70f-4fca-ed30-f7fe88912313.png)

## 最新のJavaScriptを学ぶきっかけ
IoTLTではWeb系エンジニアの方々が多く参加されているためか、JavaScriptを活用した事例をLT発表されている方が多い印象です。

JavaScriptにもバージョンがあり、ES5, ES6(ES2015), ES2017などがあります。ブラウザで動く最新のJavaScriptを書く際は、[Babel](https://babeljs.io/)というツールを使って**トランスパイル**(ES5などバージョンの低いJavaScriptに変換)することがほぼ必須となっています。
このトランスパイルしたりする環境を構築すること自体が大変だったりします。

![website_normal.png](https://qiita-image-store.s3.amazonaws.com/0/137045/2a037ccc-3f32-96dc-06f5-85e32d730a92.png)

しかし、JavaScriptはブラウザ上だけでなく、**Raspberry Piでも**動かすことができます。
Raspberry Piに[Node.js](https://nodejs.org/ja/)をインストールすれば、最新のJavaScriptで書いたプログラムを**トランスパイルをしなくても**Raspberry Piで動かすことができます。

[Raspberry PiにNode.jsとnpmの最新版をインストールする](https://qiita.com/mascii/items/77c685df65c4cbca9315)

また、BabelといったツールはNode.js上で動くため、Node.jsの勉強は**ブラウザで動く最新のJavaScriptを書くための準備**にもなります。なので、Raspberry Pi + Node.jsで最新のJavaScriptで書いてみることは大変良い勉強になりますし、実際に私はRaspberry Pi + Node.jsから最新のJavaScriptを学びました。

## IoT + JavaScriptで世の中に貢献できたこと
### Raspberry Piの無線LAN設定ツールを作った
[Vue.js](https://jp.vuejs.org/index.html)といった今流行りのJavaScriptのフレームワークの勉強をしてみたいと思っていたのですが、なかなか作りたいものも思いつかず、"Hello, World!"や、LEDを点滅させる"Lチカ"のようにVue.jsの最初の一歩として紹介されることが多い「ToDoアプリの作り方」を見るだけではモチベーションが上がりませんでした。

![todo_flowers_blue.png](https://qiita-image-store.s3.amazonaws.com/0/137045/872ae453-d44c-9a54-314b-c982976cfc65.png)

そこで、IoTを絡めたMVP(Minimum Viable Product : 実用最小限の製品)を作って公開することを目標とすることを考えました。
JavaScriptの勉強会、IoTの勉強会、Qiitaでのフィードバックなどによって得られた知見により、ToDoリストのサンプルにちょっと機能を付け加えるとブラウザ上で動作するRaspberry Piの無線LAN設定ツールを製作することができることがわかり、これを製作することにしました。

<img width="480" alt="wpa-supplicant-conf-tool.png" src="https://qiita-image-store.s3.amazonaws.com/0/137045/67e67a87-27f1-2aef-43a5-739d6e0755d7.png">
[Raspberry Piの無線LANをmicroSDで簡単に設定するためのツールを作った](https://qiita.com/mascii/items/a43d71572e1919e56398)

このツールはブラウザ上でSSIDとパスフレーズを入力するだけで簡単にRaspberry Piの無線LAN設定ファイル(`wpa_supplicant.conf`)を作成でき、これをPCでMicroSDに書き込んでおくことでRaspberry Pi起動前から無線LANの設定ができてしまうというものです。
パスフレーズは**ハッシュ化**するので、セキュリティリスクが比較的低い設定ファイルを作ることができます。この**ハッシュ化**の操作をLinuxだと標準のコマンドでできますが、WindowsとMacではそれができず、このツールが必要であった理由の一つとなっています。

<img width="463" alt="pass_and_hash.png" src="https://qiita-image-store.s3.amazonaws.com/0/137045/3c9d5e0a-55a0-aa99-f769-e5823b5d7558.png">

このツールを作ることができることに気付いたおかげで、モチベーション高く[Vue.js](https://jp.vuejs.org/index.html)、[webpack](https://webpack.js.org/)、[Babel](https://babeljs.io/)などを学ぶことができ、製作したツールに対し良い評価をいただくこともありました。
IoTとJavaScriptのフロントエンド技術の勉強を結びつけられたことは偶然かもしれませんが、Raspberry PiでNode.jsを勉強しておいて本当に良かったと思いました。

### Arduino core for ESP32 WiFi chipにコミット
Raspberry Piでは無線LANの設定時にパスフレーズをハッシュ化したものを利用できるのに、ESP32をArduino IDEで使う際にはパスフレーズをハッシュ化したものを利用できないことに疑問を感じていました。
そこで、ESP32と似たような機能を持っているESP8266ではどうか調べてみたところ、ESP8266ではパスフレーズをハッシュ化したものを利用できること([esp8266/Arduino#1850](https://github.com/esp8266/Arduino/pull/1850))がわかり、ESP8266と同じコードを [espressif/arduino-esp32](https://github.com/espressif/arduino-esp32) にPull Requestを送ったところ、[マージ](https://github.com/espressif/arduino-esp32/pull/897)されました。

マージを記念(?)して、Raspberry Piの無線LAN設定ツールをESP32向けのパスフレーズのハッシュ化ツールとしてスピンオフしました。

<img width="480" alt="スクリーンショット 2017-12-23 15.43.54.png" src="https://qiita-image-store.s3.amazonaws.com/0/137045/6b1bf4dd-f8b7-0ae4-e50d-37fe504adcfc.png">
[ESP32のArduinoスケッチにWi-Fiのパスワードを平文で書くのはやめよう！](https://qiita.com/mascii/items/bbee7b7bff9cf5a2f833)


### Google Homeの弱点をJavaScriptで補う記事を書いた
Google Homeと[IFTTT](https://ifttt.com/)、[Trello](https://trello.com/)(タスク管理アプリ)を連携し、声でタスクの追加をすることができるのですが、無駄な半角スペースや「 を」が入ってしまい、日本語だとちょっと使いづらい感じでした。

<img width="561" alt="スクリーンショット 2017-12-16 12.53.50.png" src="https://qiita-image-store.s3.amazonaws.com/0/137045/d9e14836-7aad-71ec-74be-0a59a2ee9ef6.png">

そこで、IoT勉強会やJavaScriptの勉強会で知った "Google Apps Script" を間に挟むことで、理想的なタスク追加を実現することができました。

![構成図.png](https://qiita-image-store.s3.amazonaws.com/0/137045/87b129f8-8f7a-ef3d-b04b-54fed580e773.png)

[Google Homeを使ってToDoリストにタスクを追加してみた](https://qiita.com/mascii/items/cfdd28b63dbf4544bcda)

課題解決を実現するJavaScriptを書き、Qiitaに記事を書いて、誰かが記事を読んで役に立つ、という流れができ、JavaScriptの勉強に対するモチベーションを高く保つことができたと感じています。

## IoTLTでLT発表できたこと
今年の4月からIoTLTに行き始めましたが、常連になったからなのか**まだIoTLTで発表したことなかったの？**と言われるまでになっていました。
そこで、今まで[IoT縛りの勉強会! IoTLT vol.33 @ LINE](https://iotlt.connpass.com/event/67583/)で「あなたのお家に眠るラズパイを救出したい」([スライド](https://speakerdeck.com/mascii/anatafalseojia-nimian-rurasuhaiwojiu-chu-sitai))というタイトルでLT登壇してみることにしました。

[<img width="480" alt="slide_0.jpg" src="https://qiita-image-store.s3.amazonaws.com/0/137045/88193939-70fa-615f-9d50-5c45f290afa8.jpeg">](https://speakerdeck.com/mascii/anatafalseojia-nimian-rurasuhaiwojiu-chu-sitai)

![DSC_7633.jpg](https://qiita-image-store.s3.amazonaws.com/0/137045/669875ee-81b1-e0c7-8250-aa22423965bd.jpeg)
Photo by [@romromofficer](https://twitter.com/romromofficer)

LTではRaspberry Piをヘッドレス(ディスプレイ、キーボード、マウスなし)で利用するための手順を、OSイメージ書き込みに[Etcher](https://etcher.io/)、無線LAN設定に本ページで紹介した設定ツール、SSH接続の際にZeroconfを用いる方法で、初心者の方々に向けて紹介いたしました。
発表後、Twitterや懇親会で「ラズパイを救出したくなりました！」という声をいただき、大変嬉しかったです。

<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">RPiのセットアップの話、良かったなぁ。お家に帰ったら秒でやりたいレベル。 <a href="https://twitter.com/hashtag/iotlt?src=hash&amp;ref_src=twsrc%5Etfw">#iotlt</a></p>&mdash; ポキオ (@pokiiio) <a href="https://twitter.com/pokiiio/status/931130389023768576?ref_src=twsrc%5Etfw">2017年11月16日</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

LTを聞いてくださった皆さんがラズパイを救出し、勉強のきっかけを作ってくれたらいいなと思っています。

# まとめ
IoT勉強会という場所は勉強のきっかけを得る場所なのだと、私は考えています。