Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Speaker Deck
PRO
Sign in
Sign up for free
SoCの上にも三年
株式会社ビットキー / Bitkey Inc.
PRO
November 30, 2022
Technology
0
60
SoCの上にも三年
株式会社ビットキー / Bitkey Inc.
PRO
November 30, 2022
Tweet
Share
More Decks by 株式会社ビットキー / Bitkey Inc.
See All by 株式会社ビットキー / Bitkey Inc.
デイリースクラムの”守破離” - 日々をより楽しく有意義にするヒント -
bitkey
PRO
0
6
IoT × 不動産業界のPMF
bitkey
PRO
0
110
OpenTelemetry入門へGo
bitkey
PRO
0
120
Goから学ぶ脆弱性対応ポリシー
bitkey
PRO
0
110
システム全体の一部としてFWを考える
bitkey
PRO
0
55
たまにはオンプレもいいぞ?GKE と Armadillo IoT で実現するハイブリッドクラウド
bitkey
PRO
0
32
EMの役割とは何か、TLやICの役割と合わせての考察
bitkey
PRO
0
170
常設アプリ運用で遭遇した珍トラブル
bitkey
PRO
0
240
Firestoreとうまく付き合うために
bitkey
PRO
0
140
Other Decks in Technology
See All in Technology
CUEとKubernetesカスタムオペレータを用いた新しいネットワークコントローラをつくってみた
hrk091
0
220
データベースの発表には RDBMS 以外もありますよ
maroon1st
0
230
ステート管理を超えるRecoil運用の考え方
uhyo
7
5.3k
Oktaの管理者権限を適切に移譲してみた
shimosyan
2
240
Technologies for developing editors / Webエディタ開発を支える技術
shuta13
1
230
Raspberry Pi Camera 3 介紹
piepie_tw
PRO
0
100
私見「UNIXの考え方」/20230124-kameda-unix-phylosophy
opelab
0
150
Astroで始める爆速個人サイト開発
takanorip
12
8.3k
GitHub Codespaces が拡げる開発環境、いつでもどこでも Visual Studio Code で!
dzeyelid
0
150
創業1年目のスタートアップでAWSコストを抑えるために取り組んでいること / How to Keep AWS Costs Down at a Startup
yuj1osm
3
1.6k
WINTICKET QA における Autify 活用
kj455
1
180
OVN-Kubernetes-Introduction-ja-2023-01-27.pdf
orimanabu
1
180
Featured
See All Featured
Refactoring Trust on Your Teams (GOTO; Chicago 2020)
rmw
22
1.7k
Side Projects
sachag
451
37k
How to Ace a Technical Interview
jacobian
270
21k
Teambox: Starting and Learning
jrom
124
7.9k
Designing the Hi-DPI Web
ddemaree
273
32k
Learning to Love Humans: Emotional Interface Design
aarron
263
38k
Done Done
chrislema
178
14k
Mobile First: as difficult as doing things right
swwweet
213
7.8k
A Tale of Four Properties
chriscoyier
149
21k
Faster Mobile Websites
deanohume
295
29k
Bootstrapping a Software Product
garrettdimon
299
110k
Typedesign – Prime Four
hannesfritz
34
1.5k
Transcript
IoTぶっちゃけNight SoCの上にも三年 No. 1 Web・アプリの開発者が組込開発をはじめたら
津島 雅俊 Masatoshi Tsushima 2004 ソフトウェア開発との出会い Webサイトや携帯アプリを作って遊んでいました 2015 社会人のスタート 情報系の大学院を卒業、ERPベンダーに就職
社内クラウドをKubernetes/Go/Vue.jsで構築 2018秋 Bitkeyに参画 当初はbitkey platformの開発を担当 主にGoでサーバサイドを開発 2019秋 ファームウェアチームを立ち上げ bitlock LITEのファームウェアを内製化 現在に続く開発スタイルを構築 2020夏 第二世代ロックデバイスの開発 内製を前提としたファームウェア開発 2021春リリース 2022春 スマホアプリ開発 FlutterのAndroidネイティブ部分を担当 DroidKaigi 2021 スポンサー寄稿:餅は餅屋、BLEはBLE屋
No. 3 (んー、競技プログラミングぐらいなら) はい C 言語書ける?
No. 4 ほう ファームウェアのソース もらってきたよ
No. 5 よろしく! しゃーない
まず main.c からか。3,000 行あるな。この switch のブロックどこ までスクロールしたら終わるんや?ここbreakが無いのは正し…そ う。セーフ…。なんか改行コードがCR/LF/CRLF混ざっとるしどん なエディタ使ったんだ…。タブとスペースのインデントが混ざって るし…。ん、このソースは
BOM あるな。 UTF-8 か。あれ、こっち は文字化けしてる。 Shift-JIS …?とりあえず nkf かけとけ。そう いえば SDK の zip ごともらったんだけど、公式が配布してるやつと ディレクトリ名一緒…。何か手をいれてるのか…?あ、ヘッダに const の無い static int がある。まさか本当は extern にするべき なのでは…?えっ、これで正しいの!?それとこのあらゆる場所で 読み書きされる巨大な構造体 info は超重要そうな匂いが…あー、ブ レークポイント張ったら IDE がクラッシュした。謎の “delay_ms(3000) // Don’t remove” ← なぜ? atuo_lock ← 熱男? 駆動する部分も無い製品なのに rotate_motor?一体何が回るん だ?デッドコード?んー、じゃぁまぁヨシ!って思ったけど付属の time.h の difftime の引数が標準と逆なの!?なぜ!?!? No. 6 とりあえず読んでみるか
No. 7 C言語でスタートアップやるって こういうことか…
No. 8 いや、C言語が悪いわけじゃなくない?
ちなみに:CI/CD・開発環境の改善はこんなかんじ No. 9
ちなみに:CI/CD・開発環境の改善はこんなかんじ No. 10 スライドのタイトル Code 慣れたものを使いたい →CLIで構築、自分の使うエディタと連携 Build 状況に応じて工夫したい →コード化されたビルドに機能を追加
Release 自動化したい →開発環境のCLI化でCI/CDパイプラインも構築可能に Test スマホアプリとの相互依存を解消したい →仕様からクライアントを自動生成、デバイス単独でテスト
No. 11 そして次期モデルは最初から内製することに…
No. 12 Web・アプリの開発者が デバイス開発をはじめたら
次期モデルのファームウェアに対する要求と無限に湧き上がる懸念 No. 13 結局マルチユーザーとマルチタスクからは逃れられない 無線は同時に接続されるし、他にも相手がいようとすぐ反応して欲しい。単に断 るだけだとしても。 BLE 同時接続 素早い 動作
接続ごとのデータの分離… ノンブロッキングッ! 全てCallbackで! リソースの排他制御 時計のI/Oは1s間 キャッシュで共有 タイムアウトしなきゃ… リクエストに応じた メモリの確保と開放…! でもメモリは 限られてる… Flashへの永続化は トランザクションを順番待ちさせて… 並行処理する ということは… I/Oをブロックしたら 他の接続に応答できない この処理、絶対止まるのか…? メモリリークしない…? キューは確実に捌かれる? ロックは開放される?
でもそれなんか似てない? No. 14 BLEでコマンドを実行 →バイナリで操作するシェルが欲しいのでは? 1つのCPU(≒シングルスレッド)でノンブロッキング →Node.jsでは?
BLEのシェル No. 15 • BLEコマンド = Shellコマンド ◦ コマンドとその実行はメモリ上区別すべき •
BLEコマンドの実行 = プロセス ◦ 切断:返信先を切り離す ◦ 実行完了:削除 ◦ Linked Listで管理すれば良さそう ▪ あれ、task_struct…? A 返信先:1 B 返信先:1 A 返信先:2
もしNode.jsで書くなら No. 16 • 入力側:WebフレームワークのBLE版が欲しい ◦ BLEのExpress.jsみたいなやつ ◦ 初期フェーズの最初の目標 •
出力側:Promise以前のCallbackスタイルで考える ◦ エディタでジャンプできればそれほど怖くない fs.lstat(path, (err, stats) => { // write 完了 }); fs.lstat(path) .then((stats) => { /* 完了 */ }) .catch((err) => { /* エラー */ }); try { const stats = await fs.lstat(path); } catch (err) { // エラー } Cに代わるasync/awaitできる言語はやく来てくれー
ちなみにC++17ならconstexpr lambdaが関数ポインタになる 無名の関数を直接引数に書ける • 簡単なデモとかの書き捨てのコードに便利 • キャプチャはコンパイル時定数のみ可能 No. 17 start_mortor(duty,
[](auto code) { // start_mortor が完了すると呼び出される });
最終的な設計のWebシステム的解釈 No. 18 Service Application Engine Device Touch BLE Auth
Smart Lock Sensor Storage ADC NOR Flash 入力を解釈して機能を呼び出す • TCP/IP の Socket API • リバースプロキシ • MVC の Controller と View 機能を実現する • Framework に依存しない Service, ViewModel • MVC の Model • ミドルウェア 機能間のリソース共有を解決する • ファイルシステム • 外部 API 周辺回路を操作する • デバイスドライバ TCP Controllers Presenters Gateways DB Use Cases Entities Devices Web の製品に例えたら… Logger Database BLE
まとめ:Web・アプリ→デバイス開発で転生しませんか? No. 19 「何って…俺はただ〇〇を参考にしただけだが…」 汎用製品に含まれるアイディアはとても有用 • プロセス、JavaScript、CleanArchitecture • 参考になるものを見つける ◦
OS無しで書く ← OS/ミドル/アプリの垂直統合 ◦ 「良いこと思いついた」 ← だいたいヤバい ▪ 型破りではなく型無し • そこまでやるなら組み込みOS乗せれば?