builderscon 2024がすごく面白かった

buildersconとは

2024/08/10にbuilderscon2024が5年ぶり開催されました。私の中で、最も好きだったテックカンファレンスだったので、rebootに非常に楽しみにしていました。

buildersconとは、『「知らなかった、を聞く」をテーマとした技術を愛する全てのギーク達のお祭り』とあります。特定の技術にフォーカスせず、しかし特定の技術に深掘りした方々の深淵の世界を覗かせてもらえる「私には知る機会がなかった技術を聞く」時間となっており、非常に面白く思っています。

誰が作成しても 1 つの構造になるモデリング技術

経験に依存しないモデリングを求めてたどり着いた、『Theory of Models(TM)』を解説する講演。

私自身、ソフトウェアアーキテクトを自称していて、事業課題やサービスを様々な形でモデルに落として実装することを日々やっていて、「何をモデル化すると良いのか」や「そのモデルが正しいのか」は非常に議論が難しく、えてして押しつけがましくなったりするので、非常に興味がそそられました。

各プロセスで「経験に依存しないように考慮しているポイント」を拾っているのを聴きながら、自分の開発は複雑さに戦うためにより戦略的DDD目指しているので、ちょっとこれだけでは戦えないよなとか、今までやってたアレはむしろやり過ぎ?とか、考えていました。

紹介したTMを補完する位置づけとして、多数の書籍を紹介していた、それもただの紹介ではなくこの書籍が解説しようとしていることを咀嚼した内容になっていたのも良かったです。モデリング銀の弾丸はなく様々な考えを適応していくことと捉えているのがよくわかって、その一次情報に触れさせてもらえるのは聴者に勉強を促す形になっていて、読まねば!という気持ちになりました。

法律に準拠した本人確認システムを0から作った話

タイトルの通り、B/43というサービスを作った際の、必要とされるドメイン知識、利用した技術とそのドメイン特有の課題、そして実装された運用と、サービス開発の全てが詰まっていた講演。

私自身も、過去マイナンバーが登場時にシステム開発をやっていたことがあり、政府サイトのQ&Aに実務に落とし込んだ設計が公開されているのをウォッチし続けていたのを思い出したりしていて、非常に面白く聞けました。

Amazon Rekognitionで写真の人間の同一性は結構正確に出るとか、今利用できる技術面の話も参考になりました。「今の時代はこれらが使える前提でサービス開発ができる」と認識するのはこういう講演でちゃんとキャッチしたいことです。

また、最後に残る「人による全数チェック運用」の部分も、本人認証システムのドメインからわかるように理由が解説され、どのように運用しているのかを説明されていて、聞き応えがありました。

React Server Component の疑問を解き明かす

今までのSSRなどから続く課題と発展の解説して、React Server Componentの概念にたどり着く講演。

ただ、Server Componentと言われるだけだと、わからない部分を丁寧に解説されていて、理解することができました。

このServer Componentのユースケースがあるのか、既にサーバサイドとして構築している部分のどれだけをServer Componentに移せばいいのか、悩みはつきないなと思いました。

個人的には、React、Next.jsは難しく扱いやすいとは言えないように思っていますが、フロントエンド技術の『概念』の最前線であり、「今実験的ながらもこの『概念』を受け入れるか」と言われると「大規模開発でなければ、常に受け入れるように考えるべき」と考えた結果、Vue.jsよりも積極的に使いたいと思っています。なので、今回『概念』にフォーカスしたセッションは非常にありがたいです。

健やかなサービス運営のための PWG

プロダクト開発チームとインフラチームの共有会 Performance Working Group(PWG)でやっている活動を紹介する講演。

具体的に「今」このような運用をしています、というのを紹介してくれて、課題感があるんでやってみねば!という気にさせられました。

ホー〇ページ・ビルダー 2024

エモ成分多めの、個人Webサイトやるモチベーションや技術に関する講演。

私も近い意識があるので、共感しっぱなしでした。

私のエモ部分を中心に紹介すると、

私も自分のアイデンティティ強化に100円ショップ推しグッズコーナーにあるキーホルダーキットを使って鞄に付けてたりとか。

自分が保守する限りつかる自前短縮URLをつくってたりとか。

自分のやってきたことのコンテンツを確立するために、この"@74thの製作ログ"をつくってるとか。はてなブログいいよねとか。

自分のドメインのWebサイトを、つたないレイアウトながら運営していることに意義を感じているとか。

https://74th.tech/

それでも、アイデンティティを示すページとしては最近は github.com に移行した(つまり、この辺にパッションもって今でもアップデートしている)とか。

github.com

SNSは交流であり、自分の話としてレポートが書きたい気持ちがあるので、ブログ、個人サイトに必要性を感じているとか。

100年コンテンツが残るの意味だと、最近はgithub.comにおいとけば残らないかなー、とか考えてることとか。

CLI ジェネレータ「cyamli」によるコンソールアプリのスキーマ駆動開発

CLIツールを作るときの引数やフラグを、YAMLで定義して、型付きコードを出力させて、型付きで実装でき、かつマルチ言語対応のツール、cyamliの紹介。

4つの自分の要求を満たすツールがなく、作ったという話だけれど、その4つの要求のモチベーションから解説されていたのは良かった。

YAMLでの定義から、型付きコードを生成し、コード補完を活用しながら実装できるのを見せるデモも、実際に型があると言われつつも実際にコード補完が効いているのを見せられると、もうこれのない世界を見たくないという気にさせる魅力があった。

個人的には、話の最初のうちは、「プログラムとユーザのインターフェイスである引数、フラグでやる複雑性はそこまで大きいことは行わず、結局構造的な記述ができるconfig.jsonを定義して渡す形になるのだから、引数、フラグでそんなに頑張ってもなー、言語間に仕様の違いも今やCopilotくんがいい感じに出力してくれるしなー」と思って聞いていたのですが、「サブコマンドに対応している」「実際に定義通りに型補完効いている」というのを見せられて、やられました。CLIツールが許容できる複雑性の意味では「サブコマンド」でかなり満たされるけれど、作るには面倒すぎるところが大きく、それをやってくれるなら使いたくなるじゃないか、と心を動かされました。

1000行で実現する Linux on Browser

1000行で動くRISC-V Linuxを、RISC-VエミュレータをRustで実装することで動かす講演。

40分のコンパクトな講演で、RISC-VのISAとか、それを実際に実装したところとか、Linux起動やコンソール表示のところをやったところとか、一通りが詰まっているのがすごく良く、面白かったです。これ面白いんですよが伝わるパッション多めに話されていたのも、ノリよく聞くことができました。

自作CPUエミュレータに憧れはありましたが、大変そうというイメージが大きくトライしようと思っていませんでしたが、この山を登ってみたい!!!!と心動かされました。

その他感想

家族で一定のコロナピーク時は会食への参加を避けるように決めたため、申し訳ないですが懇親会は参加しませんでした。

今回5年ぶりのrebootで、小規模の1トラックながら、それでも濃い内容の世界ですごく楽しめました!

机のある会場、会場の音響、混み具合も非常に快適で、PCでメモやツイートをみながら、セッションに集中することができました。

過去の参加ログ

過去の参加ブログはこちら(2019書いてなかったことに気づきました、もったいない…)。

74th.hateblo.jp

74th.hateblo.jp

74th.hateblo.jp

最後に

いつかBuildersconに登壇するのが夢なので、来年もあれば必ず参加し、builderを名乗れるネタを温めておきます!

IR、温湿度計などのGroveデバイスをREST風API化して、活用するESP32C3-IoT-Server-Boardを作った

tl;dr

  • 複数のGroveデバイスを接続可能なESP32-C3基板を作って、REST風API化したよ
  • お家のインテリアに合うようにケースも作ったよ
  • IR、温湿度計を付けて、お家の複数箇所にデプロイしたよ
  • Streamlitから便利に制御して使っているよ、マイコンでやるよりも楽そうだよ
  • Boothで販売中、つくまたにも展示するよ

ESP32-C3が安くて便利で使いまくっている

ESP32は非常に安価なWiFi、BLE付きマイコンモジュールですが、その中でも特に安いシリーズであるESP32-C3があります。秋月では310円で販売されています。安価ながらArduinoフレームワークに対応し、IOの数やメモリ、Flashが若干少ないですが、小さい用途であれば十分です。

akizukidenshi.com

加えて、汎用的なUSBデバイスコントローラ機能はありませんが、USB Serialのコントローラを付属しています。これにより、別のUSB Serialを用意しなくても、書き込みを行うことができます。非常に手軽です。

基本戦略、制御処理の多くは自宅サーバ(SBC)に持って行く

我が家には、OrangePi5+を自宅サーバとして使っています(かつてはミニPC(MacMini)を使っていましたが、ラズパイ4の頃からSBCに移りました)。そこではメディアサーバ等と動かしており、いつでもスマホから利用できるサーバリソースとして活用しています。

この背景から、確かに全ての処理をマイコン上のファームウェアで実現すると便利ですが、慣れているサーバサイドプログラミングで行った方が自在にクラウド連携や制御を記述できると思い、マイコン側はシンプルなHTTPサーバとして実現することを思いました。

Firmware設計: ArduinoでREST風APIを実現する

ESP32のArduinoを使って、HTTPサーバを立てるのは非常に簡単できます。このあたりは「アナログ電圧計を使って、ヘッドレスPCのCPU使用率表示を作る」という記事で軽く紹介しました。この記事ではArduinoJsonというライブラリを使って、JSONのパースの処理もしています。

74th.hateblo.jp

これと同じ要領で、REST風APIを設計しました。

  • POST /ir/send : 赤外線リモコンの送信
  • GET /sht31 : 温湿度センサの読み取り

実際に以下のようなデータを/ir/send にPOSTで送ります。

{
  "type": "MITSUBISHI_AC",
  "hex": "0x23CB260100205808164000000000080000F3"
}

すると、ESP32-C3に繋がれたM5 IRモジュールからエアコンの電源を制御できるようになりました。

今回のコード自体は、以下のリポジトリにMITライセンスで置いてあります。

github.com

基板設計: Grove3ポートと、インジケータがほしい

GroveデバイスをつなぐIoTを作るのであればM5Stack製品を用いるのが簡単です。 しかし、画面等を必要としない、電池も使う予定はないため、もっと安価に家中にばら撒きたく、専用の基板を設計することにしました。

  • Groveは3ポート用意し、I2C用のプルアップもできるようにする
  • Groveはデバイスに応じて、5V/3.3Vの電源を接続可能にする
  • インジケータ用のRGB LEDを付ける
  • おまけでボタンを追加しておく
  • 取り付け用の穴を開けておく

以下のものができました。

基板自体は、OSSとして以下で公開しています。

github.com

特に、注意したところとしては以下があります。

  • ESP32のガイドの通り、アンテナエリアの左右のベタを一定以上取り除く

設計に当たり、躓いたところは以下がありました。最終バージョンでは全て解決済みです。

  • USB電源保護ICのCH213Kを入れてみたのですが、電流過多でリセッタブルフィーズが働いてしまうのか期待通り動作せず、CH217Kに変更しました。
  • USB DM/DPのピンをマイコンに直結させていたのですが、安定しませんでした。ダンピング抵抗10Ωを付けたところ、安定しました。データシートにもその指摘がありました。
  • SK6812-MINI-Eに、データシート通りVDDに5Vで接続していたのですが、3.3Vの信号では制御できませんでした。VDDに3.3Vを繋いだところ制御できました。

インテリアになじませるようにケースを作る

このプロダクトは、「お家のそこら中に実際にデプロイする」ことを目的にしていました。そのため、家族に怒られないようにインテリアになじむケースに収めることにしました。

このケースの製作については、別途既に記事にしています。

74th.hateblo.jp

Streamlitから制御する

Streamlitはデータ可視化Webツール作成フレームワークです。本業はデータエンジニアであり、本業でとても活用しているものです。

streamlit.io

StreamlitはPythonで記述し、Pythonのコードで取得したデータをst.write(df)とか書くとそれを表示したり、st.button("OK")とか書くとPythonプログラムを実行するためのボタンが簡単に記述できます。以下は実際に私の家で動作するコードです。

# pages/sample.py
import requests

import streamlit as st

sht31 = requests.get("http://192.168.1.109/sht31").json()
st.text(f"""温度: {sht31["data"]["temperature"]:.1f} ℃""")
st.text(f"""湿度: {sht31["data"]["humidity"]:.1f} %""")

if st.button("TV ON"):
    requests.post("http://192.168.1.104/ir/send", json={"type": "SONY", "hex": "0xA90"})
    st.success("TV ON 信号を送信しました")

基本はこのようなコードを、使いやすいように作り込んでいきます。

エアコン操作画面

Pythonマイコンの外でできることにより、より複雑な命令を記述することができます。たとえば、 以下のようなユースケースを考えています。

  • 室温と一緒に、外気温や、天気をWebAPIから取得して表示する
  • 出かけるので、全てのエアコンをオフにする
  • TVの画面を、TV横PCに変更するため、「チャンネル1」「入力切り替え」「入力切り替え」を順に送る。現在何番目の入力が表示されているかわからないため、「チャンネル1」を介して、入力切り替えで確実に期待の画面を表示できるようにする。

これを構築していきました。

なお、Streamlitは家の外からもアクセスできるように公開サーバになっていますが、Streamlit自体には認証の仕組みはありません。そのため、Google認証がかかるOAuth2 Proxyを介するようにしました。ちなみにこのStreamlit自体はOCIコンテナ化してあり、OrangePi5+に構築したKubernetes(k3s)上で動かしています。このOAuth2 ProxyとKubernetesについては、これを構築したときにQiita記事にしています。

qiita.com

ESP32C3-IoT-Server-Boardがデプロイされた姿

実際に寝室のエアコンにデプロイされている様子を写真に撮りました。

インジケータLED用のケース窓の裏には紙がはってあるため、LEDが眩しすぎることはありません。

既に以下の箇所にデプロイしています。

  • リビングのエアコン
  • 寝室のエアコン
  • 客間のエアコン
  • リビングのTV前

超便利! 応答速度はGoogle Homeには勝てない…

リモコンを探す手間もなく、スマホから操作で対応した家電が操作でき、非常に便利になりました。

Streamlitによって、マイコンだけでは難しかった(面倒だった)制御もすることができました。

ただ、よくよく考えてみると、今まで家電の電源を消すだけであれば「OK Google、リビングのエアコン消して!」と指示していました。この便利さにはなかなか勝てませんね。

このESP32C3-IoT-ServerとケースはBoothにて販売中! 『つくまた』にて展示、販売予定

今回作成したESP32C3-IoT-Serverのキットと、対応ケースはBoothにて販売中です。

74th.booth.pm

また、2024-08-03に開催される『つくまた』でも、展示、販売します!以下のような使い方を想起させる展示も行います。ぜひ寄っていただければと思います。

w.atwiki.jp

次の展望

組み合わせたくなる使いたくなるGroveデバイスを増やしていきたいと思います!

できればGoogle Homeから動かせるようにMatterデバイス化したいですね。

つくまたに出展します!!

「つくまた」とは

w.atwiki.jp

※画像は公式URLより転載

「つくまた」とは「necobit/猫とロボット社」が主催するMaker系創作物即売会です。コンセプト「Makeなどのものづくりをする人たちの展示会ではなく、即売会をやりたい」「自分で作ったさまざまなものを売ったり買ったりする場所が欲しい」「とりあえずやってみましょう」とある通り、初の試みで、即売会をやってみようというものです。

即売会の色を強めに出しているように感じました。

74th の出展

運良くサークル出展できる運びとなりました。

おもに3点を出展しようと思っています。

ESP32C3 IoT Server Boardケース付きキット

最近、ESP32-C3で作ったGroveポートを3つもつデバイスを作り、赤外線LEDと、温湿度計を付けて、TVの前や、寝室、リビングのエアコンの前に取り付けています。REST API風リクエストを送ると、赤外線信号を飛ばしてTVやリモコンを操作したり、温湿度計のデータがとれます。

このようにREST API化することで、ESP32上で動く処理は単純なもので良くなります。 これらを組み合わせた複雑な制御(例えば、TVの電源オン、チャンネル切り替え2回でPS5に切り替える)などを、Linuxサーバ(OrangePi5+)上に構築したStreamlit(Python)からできるようにしました。これで、自宅内外からリモコンを使わずにスマホでいろいろできるようになりました。

このようにESP32C3でREST API化すると、制御の幅が広がってWebエンジニアの方法で拡張できる面白さを伝えていきたいです。

当日は以下のボードを展示し、デバイスがケース付きでなじむ感じとかを見てもらえれば嬉しいです。

なお、既にBoothにて販売中です。同価格で販売いたします。

74th.booth.pm

SparrowDial 自作キーボードキット

M5Dial、M5StackCore2をトラックパッドとして組み合わせた自作キーボードキットです。

「キーケット」でも、Androidタブレットで実際にトラックパッドとして体験可能な形で展示しました。つくまたでもスペースがあれば操作可能にする予定です。M5Dialを普段のマウスのようにグリグリするのを味わっていただければと思います。

youtu.be

こちもBoothでは既に販売中です。同価格で販売いたします。

74th.booth.pm

他の出品物

一応、74th.booth.pmで販売しているものを、持って行こうと思っています。キーボード系はSparrowDialだけですが、それ以外のマイコンボードキット、電子工作便利部品も展示します。

一覧は、ビラを見ていただけると助かります。

https://showcase.74th.tech/paper.pdf

このように完成品にラベルを付けてボックスに入れて持って行きます。気になったら、眺めていただいたり、話を聞いて、さらに購入いただければと思います。

これだけ「RP2040(x2種)」「CH32V203」「CH32V003」「STM32F103」「STM32G030」「STM32G431」「ESP32」「ESP32-S3」「ESP32-C3(x2種 )」「ESP32-H2」「ESP32-C6」の小さいマイコンボードが並んでいると壮観です。ProMicroサイズのこだわりが伝わるかと思います!

書籍は数冊持って行くか悩んでいます。

類似イベントに少し思いをはせる

電子工作、Maker系の即売会を含むイベントとして、「ピコケット」には過去に出展したことがあります。そちらでも作ってみたものを販売してはいましたが、どちらかというと展示会の認識で来場される方が多く、作ったものについて話を聞いたり触れたりする、そして良ければ買ってみる、という感じでした。

pikoket.seesaa.net

「スイッチサイエンス 年度末大感謝祭」では、スイッチサイエンスマーケットプレイスで出展されている方の販売ブースがありました。そこでは、私自身実際に触れて購入にまで至った商品が3つありました。どうしてそのようなものを作ったのか聞いて、実際に触れるとほしくなることが多くありました。

www.switch-science.com

「キーボードマーケットトーキョー」という自作キーボードの同人即売会にサークル出展しました。

www.itmedia.co.jp

こちらは、「自作キーボードわいわい会」が展示を目的としたものであるのに対応するように、即売会を目的としたイベントとして明確設定されています。ブログ記事でも触れていますが、キーボードという実用品がここでしか販売されるということで「かなり購入する気概のある方が来場されていた」ように感じています。

74th.hateblo.jp

つくまたに対する期待

既に、参加サークルは公開され、見てみると新商品の準備を進めている方もおられます。

よりMakerに近いメンバーだろうと思われ、どのような面白いと思っているものが展示されるか楽しみにしています。

共有されて、この価格なら買いたいと思えるもに出会ってお持ち帰りできればと思っています。

私自身の販売のスタンス

私自身は、電子工作で一儲けしたいというよりも、自分が面白がって作ったものを、買った人が面白がってくれたら嬉しい、というスタンスです。 値は低い方になるのかもしれません。多くの人が手に取るためにやっているのもあり、大量生産の依頼も基本的には受け付けていません。

まとめ

出展予定物についてまとめました。

当日は秋月による折に、ご来場いただき、他のブースを回って私のブースも見ていただければと思います!