2021/11/13 に実施した TinyGo ハンズオンの振り返り

f:id:sago35:20211122083850p:plain

2021/11/13 にオンラインで開催された Go Conference 2021 Autumn Online の中で TinyGo ハンズオン (Workshop) を開催しました。 13:10-14:10 と 14:20-15:20 の 2 コマで、各 5 名の参加者に対してハンズオンを実施、という形でした。 このページでは、 TinyGo ハンズオンの振り返りとして、企画段階、本番に向けた準備、実際の本番の様子などをまとめていきます。

gocon.connpass.com

gocon.jp

TinyGo ハンズオンの企画段階

私自身は umeda.go という関西 (主に大阪) の Go コミュニティの運営の一人だったわけですが、今回の Go Conference 2021 Autumn Online が kyoto.go を中心として準備が進む中 umeda.go もお誘いいただき 2021/05/20 に一緒に Go Conference を準備していくことになりました。 で、参加したその日のうちに以下のようなやり取りがあって、よし TinyGo ハンズオンをやるぞ!となりました。

f:id:sago35:20211118210929p:plain

なんだか振り返ると懐かしい。

ターゲットボードの選定と Seeed さんとのやり取り

ハンズオンを実施するという事でターゲットボードを何にするかを決める必要がありました。 この時点で以下の理由より、 Seeed さんの Wio Terminal が第一候補となりました。 自分自身が TinyGo への Wio Terminal 対応の PR を作っていたこともあり Wio Terminal を良く知っていた、というのもあると思います。

  • TinyGo で 2021/08 時点で最も手厚くサポートされている atsamd51 マイコンを搭載していること
  • ネットワークに接続できるため IoT 機器としての活用が可能であること
    • ※2021/08 時点で WiFi 対応、 BLE 未対応
  • 組込み初心者でも扱いやすいデバイス (画面、ボタンセンターが一体) であること
  • 購入しやすい値段であること
  • Grove および背面端子により、今後の拡張性が高い事
  • Grove のエコシステムにより、ハンズオン後に十分に想像性を発揮できる事

f:id:sago35:20211118212255p:plain f:id:sago35:20211118212302p:plain

この時点ではターゲットボードは各自で購入してもらって参加してもらう、その際買いやすい価格帯である事、というのを条件としていました。 が、 Go Conference という日本最大の Go のイベント内で TinyGo ハンズオンを行うというせっかくの機会でもあり Seeed さんに今回はスポンサーをしていただけないかを打診しました。 諸々の調整を行い、合計 10 台を提供いただくことが決定しました。

これが 2021/08/31 の時点でした。

Go のイベントで Seeed さんのスポンサーロゴが掲載されている、ってのは割とセンセーショナルで界隈 (どこ?) がややざわついてました。

最終的には 「Go x Wio Terminal ジャンプスタート企画 by Seeed」 という企画として、参加者 (当選者) に Seeed さんから Wio Terminal を事前送付する形で実施しました。 Seeed さん本当にありがとうございます。

f:id:sago35:20211118210310p:plain

www.seeed.co.jp

TinyGo に Wio Terminal の対応を追加したのは私なのですが、そこからまさかこのような形になるとは夢にも思わず。

github.com

ハンズオンの構成の検討

Go のカンファレンスなので Go は体験済みの人が多い一方、組み込みの経験者は少ないだろう、という予測の元、最低限以下を満たすようにしました。

  • 環境の立ち上げ
  • (Hello World 代わりに) L チカ
  • 自身のプロジェクトを書き始めて、動作確認、 printf debug が出来る
  • 外部 package を使用したプロジェクトを作成できる

一方で、時間や機材の関係で以下は検討段階で省きました。 恐らく以下の項目があれば、もっと楽しく TinyGo で遊べるようになるとは思うので、今後別の機会/記事で紹介していきたいと思います。

  • I2C や SPI といった機能を使った driver の作成方法
  • 外部端子を使ったデバッグ

ハンズオン資料の作成とリハーサル

ハンズオン資料の初版を 2021/08/26 に作成し、 Go Conference 運営メンバーでハンズオンのリハーサルというか、ハンズオンのイメージ合わせ、時間配分などを確認していきました。私自身は WindowsLinux (ubuntu 20.04) 環境はあるが macOS が無い事、そして Intel チップ以外に M1 チップ版が発売された事、などからそのあたりも確認をしていきました。初回の TinyGo ハンズオン素振りは luccafort さん、 senoue さん、 uji さんに手伝ってもらいました。何と皆さんリハーサルに向けて Wio Terminal を購入しているという準備の良さ。

f:id:sago35:20211118213559p:plain

この時点で、 2021/11/13 実施分とおおよその流れは同じ形に仕上がっていました。ただ、この時点ではハンズオンの目玉を何にするか、が決まっていませんでした。

ハンズオンの告知

Seeed さんから提供いただいた 10 台の抽選、会場入りの人を決めるべく、 Go Conference 本編とは別で connpass を立ち上げました。 connpass の機能により自動的に抽選も実施できるので楽でした。

gocon.connpass.com

告知は以下の Tweet にて。

Seeed さんからスポンサーしていただくにあたり TinyGo ハンズオンの参加者を「Wio Terminal を持っていない人」に絞って募集していたこともあり、以下のような発言がありました。この発言をみて YouTube 配信を検討していくことになりました。この時点で本番一か月前の 2021/10/04 でした。 (ちなみにこの発言を見るまでは、 Remo で残り 3 席あるし、そこでいいかなぁ、などと思っていました)

YouTube にも配信することを決定

YouTube にも配信することにしたので構成を検討しトライアルを行いました。最終的には以下のような構成となりました。

  • connpass の参加者 (Wio Terminal を送付済み) の人は Remo で双方向のやり取り
  • それ以外の人は YouTube Live で配信を行う
    • この時、参加者への配慮として YouTube には私の画面と映像と声だけが入るようにしました

YouTube Live への配信は Go Conference としては StreamYard を使っていたので特に違和感なく準備が可能でした。 ただ、 Remo への配信、 YouTube (StreamYard) への配信、カメラ 2 台の合成、といった形だったため配信 PC の処理負荷が思ったよりも高く Ryzen 7 3700X で常時 CPU 使用率が 90% ~ 100% というような状況でした。 いつもはすぐに終わる TinyGo の build がなかなか終わらないという初めての体験ができました。

ハンズオンの目玉を本番前日に作り始める

元々以下の example の静止画バージョンを目玉?にしようと思っていたけどインパクト足りないよなぁ、という事で急遽前日である 2021/11/12 に作り始めました。

で完成した、と思って最終確認してたらハンズオンで使う予定の TinyGo 0.20.0 だと何故か crash するという問題が発生しました。自分がメインで使ってる最新の開発版 (dev branch) だと発生しないので気づくのが遅れました。何とかパッチできる程度だったので事なきを得ましたが危ない。

ちなみにこの example では瞬きは goroutine + channel で実装しているため、とてもすっきりした実装になっています。 この程度の処理だと別に goroutine 使わなくても簡単に書けますが、 goroutine を使うとさらに楽、って感じで書けます。 ↑ で crash する、と書いたのは以下でいう eyeCh に eyeClosed とかの状態を送るようにすると発生していました。 色々試してると struct{}{} を送るだけなら crash しなかったのでこちらを採用、となりました。 ちょっと意図が伝わりにくいコードにはなってしまいますが。

11_spi_ili9341/main.go#L79-L86

   go func() {
        for {
            eyeCh <- struct{}{}
            time.Sleep(1500 * time.Millisecond)
            eyeCh <- struct{}{}
            time.Sleep(300 * time.Millisecond)
        }
    }()

TinyGo ハンズオン本番

当日の様子 (↓ は 13:10 - 14:10 のコマ) は以下のような感じでした。 途中 mattn さんが Remo 席に来てくれて つい話しかけてしまうシーンがありましたが、全体的にスムーズに進行することができました。 都合 2h というのか準備含めて当日 3h ぐらい集中し続けてたのもあり非常に疲れましたが、それもまた良し。

www.youtube.com

ハンズオン内で使用した資料は以下です。

github.com

最後に

Go Conference 2021 Autumn のスタッフとして運営をしながらハンズオンの作り込み、という形で後半は割と大変な状況でしたが、何とか無事に終わりました。

特に、参加者のほとんどが Gopher 表示まで進むことができたのが、とても良かったと思います。 そこまでいかなかった人も、外部パッケージを使用したコードを動かす所までは進んだので最低限自走できる状態にはなったと思います。

あと、以下のように、面白かった、と言ってもらえてとても嬉しかったです。

ってことで、皆さん、 Go Conference 2021 Autumn Online は終わりましたが、 Blog を書くまでがイベントなので感想などどしどし書いてくださいね。 次回は Go Conference 2022 Spring で会いましょう。