Project Fx 2.0

怪文書と備忘録を書きます

セキュリティ・キャンプ2022全国大会 (X3: ハードウェア魔改造ゼミ) 参加記

セキュリティ・キャンプ2022全国大会の開発コース「X3: ハードウェア魔改造ゼミ」に参加してきました。 開発中に色々と難しい箇所にも遭遇しましたが、ゼミの目標をなんとか達成することが出来たので、参加記を公開します。

何をしたか

セキュリティ・キャンプとは、経済産業省の外郭団体である独立行政法人情報処理推進機構(IPA)」及び一般社団法人「セキュリティ・キャンプ協議会」が主催している、若年IT人材の発掘・育成事業として行われる無償のサマースクールです。 暗号・Web技術・低レイヤ開発・ハードウェア解析などの多様な分野の中から自分が希望するコースに応募し、その分野の専門家から指導を受けつつ、事前に設定されたカリキュラムに沿って座学や開発・実装を行います。

www.ipa.go.jp

参加者は書類選考によって決定されます。 参加希望者は興味のあるコースを最低1つ選んで、そのコースで扱う分野についてあらかじめ与えられている応募課題を提出します。 この課題の出来具合が一定の水準を満たしていると、選考通過となり、参加資格を得ることができます。

stepney141.hatenablog.com

例年は毎年8月に対面合宿形式で5日間の日程で開催されていますが、2020年からはオンライン開催が続いています。 去年・一昨年は講師・チューター・受講生全員がオンラインで参加し、数ヶ月の開催期間を取ってゆっくりと講義を進めていたそうです。 しかし今年はやや特殊なハイフレックス方式で開催され、講師・チューター陣だけは例年通り対面宿泊形式で、一般の受講生のみオンラインで参加するという形でした。 このため、開始時間・食事休憩・終了時間はどちかというと宿泊場所の時間の都合に合わせてあるような感じになっていました。

私が選考に通過したX3ゼミは「開発コース」と呼ばれるラインナップに属し、講師やチューターの指導の下、自分の手で実際に何かを開発・実装することに主眼を置くカリキュラムになっています。 中でもX3ゼミの開発内容は、市販の無線ルーターを「魔改造」して、スマホから操作できるラジコンに作り変えてしまおう!という一際異色なものです。 この過程で、

...というように低いレイヤから高いレイヤに上がっていくようにして開発を進め、様々な技術レイヤの基本的な内容に広く触れることがX3ゼミの目標です。 セキュキャンでは「特定の技術レイヤーについて狭く深く学ぶ」というカリキュラムが組まれることが多いですが、X3ゼミの講義内容はそれとは対照的になっています。

www.ipa.go.jp

一見すると「セキュリティと走るルーターに何の関係があるの?」と思われてしまいそう*1ですが、X3ゼミでこのようなカリキュラムが組まれている背景には、

  • 「セキュリティ」をやるからこそ、全てのレイヤに自分で触れて知っておくことが重要
    • なぜなら「悪意ある攻撃」のアプローチは幅広いので、全てのレイヤに対して様々な攻撃手法が存在するから
    • ソフトウェアの脆弱性を突いたり暗号を破ったりするだけがセキュリティではなく、例えば「マシンやパソコンケースの分解・物理的破壊」「コンピュータから漏れ出る電波の傍受」「乱数の生成方法」なども相手にしなくてはならない
  • セキュリティ以外のものづくりや趣味開発においても、幅広いレイヤに触れた経験は役に立つ

...という、講師の末田さん(puhitakuさん)の意図が込められています。

この他にも、協賛企業の社員の方々から事業内容について直接ご説明を頂くイベントや、受講生同士で今後も繋がろうという趣旨で行われる「グループワーク」、さらには参加者有志によるLT大会なども開かれ、期間は短いながらもかなり盛り沢山の日程が組まれていました。

技術的構成

※本講義は電波法の規定とその抵触リスクについて十分に配慮した上で改造を行っているという、講師からの案内がありました。また、講義内でも技術基準適合証明と電波法についての解説と注意があり、これを踏まえて作業を行いました。

完成品

アーキテクチャ

X3ゼミで制作するラジコンルーターシステム全体の肝になるのは、香港の GL.iNet が販売している小型無線ルーター「GL-MT300N-V2」です。 本機種の特徴は以下の記事にまとまっています。

internet.watch.impress.co.jp

機種名をネットで検索するとこの記事以外にも様々なレビュー記事がヒットしますが、どの記事も共通して挙げていた本機の最大の特徴は「OpenWrtを搭載していること」です。 OpenWrt とは、ルーター用などの組み込み機器のファームウェア用途向けに開発されている Linux ディストリビューションで、いわゆる組み込みLinuxと呼ばれるものの一つです。 本機は最初から OpenWrt で出来たファームウェアを搭載している状態で技適を取得していることから、無線通信に関する部分をいじらずにシングルボードコンピュータの要領でソフトウェアを導入できるので、ラジコンルーターに「魔改造」しても電波法の規定には抵触しないのです。

この小型ルーター「GL-MT300N-V2」に入っている OpenWrt 上で Python 製のREST APIサーバを動かします(計算資源の制約などを考慮し、処理系には MicroPython を使用します)。 スマートフォンやパソコンから REST API を叩くと、HTTP リクエストを受け取った REST APIサーバがシリアル通信で Arduino Nano Every に命令を飛ばします。 ここで Arduino には予め、シリアル通信の内容に従ってモータードライバに電圧を加えるような処理を書き込んでおきます。 こうすることで、端末から飛ばした操作指示に応じてモーターが動いて、タイヤが前後に回るという一連の仕組みが完成するわけです。

GL-MT300N-V2 のルーターとしての機能をそのまま使用することで、スマートフォンやパソコンなどの各種端末からの無線操作を容易としているところが特に面白いと思います。

私のバックグラウンド

  • 学部での専攻:数理経済学
  • 趣味・(実質的な)副専攻:CSおよびゲーム情報学、特にアブストラクトゲームのプログラミングと解析
  • 主な技術スタック:JavaScript/TypeScript を用いたフロント/バックエンド開発、初歩的な数値解析

はい、高いレイヤや抽象的なレイヤに経験がかなり偏っていますね。 組み込み分野のような低いレイヤ層の開発には以前から強い興味はあったものの、他のタスクで忙しく手を出せずにいました。

電子工作についてはほとんど触れたことがなく、高校物理の電磁気分野以外の知識は皆無です。 この記事を書く前に同じX3コースの受講生の@771-8bitさんによる参加記も拝読したのですが、電気回路周りの思考の道筋を見ていて「こういう事項を考えたり調べたり実行したりする背景にはどういう目的意識があるんだろう...?」という疑問でいっぱいになってしまい、レベルの違いを実感しました。 この辺の「自分が知らない分野での思考の道筋の立て方」については今回かなり色々な学びを得たので、本記事の最後にまとめて記述します。

時系列

開発コースの内容については、箇条書きの日記形式で当時の思考を再現します。

8/7 (0日目)

開講式前日です。車体は事前に製作しておいた方が時間に余裕が出来るという話が講師のpuhitakuさんから事前になされていたので、私はこの日に車体の製作を開始しました(この日だけでは終わりませんでした)。 人によるかと思いますが、自分の場合車体の工作には割と時間を取られたので、車体はキャンプの日程開始前にあらかじめ完成させておくことを個人的にはオススメします。

8/8 (1日目)

この日は、開講式・全員必修の共通講義・参加者有志によるLT大会・グループワーク初回が行われました。 私はLTを見ながら車体を組み立てていました。

グループワーク

「グループワーク」というのは、まず受講生全員をランダムに4人1組のグループへ分けた上で(メンターとして各グループにチューター1名が付きます)、グループごとに『セキュリティ・キャンプ修了後に参加者が取り組むこと』を決定し、修了後にそれを実践するというものです。 このシステムの趣旨は『キャンプ修了後に参加者がやりたい活動を「見つける・実行する・継続する」こと』を達成すること、らしいです。 グループワークについては下記の講義概要に詳しいです。

www.ipa.go.jp

グループワーク初回では、まずお互いに自己紹介をした上で「グループの名前」を話し合って決定します。 弊グループでは私が「一意な名前を付けたい」「少しぶっ飛んだ名前の方が面白そう」という観点から「各メンバーが好きな食べ物を1つ挙げ、それを繋げて1つの名前にする」という提案をしたところ、それが採用され、弊グループは「ハンバーグ抹茶ラーメンジェノベーゼ」という名前になりました。 この前参加した ISUCON 12 の予選で「チーム名」という概念のカルチャーショックを受け、これくらいユニークな名前じゃないと逆につまらないなあという感性が自分の中で構築されつつあります。 575はいい文明ですね。

弊グループの活動内容としては、議論の末「『RISC-VとChiselで学ぶ はじめてのCPU自作』の輪読会をする」ことに決定しました。

https://www.amazon.co.jp/dp/4297123053/www.amazon.co.jp

他のグループを見ていると「CTFコンテストに参加する」ことを掲げているところが結構多かった(例年に比べても特に多かったらしい)ようです。 弊グループでは

  • CTFをぜひともやりたいという人が特にいなかった
  • チューターさんから「CTFは全員のモチベーションが強く一致していない限り途中で挫折しやすいので、あまりオススメはしない」というアドバイスがあった

ことから、CTFは活動内容の候補から外しました。

8/9 (2日目)

開発コース1日目です。

  • 講師・チューター・受講生の顔合わせと自己紹介タイムから開始。私が「関数電卓からプログラミングに入った」と話したところ、講師のpuhitakuさんから瞬時にものすごく的確な返答がやってきて愉快な気分になる。

  • 講義。本ゼミの趣旨と全体的な工程の説明、電気回路・マイコン開発についての座学。

    • モーターを制御するためにモータードライバという部品を使う。その中にはダイオードトランジスタから成るHブリッジ回路が入っている
    • モータードライバを制御するためにマイコンから電圧を加える。出力する電圧を調整するためにはPWMという手法を使う
    • マイコンをパソコンなどから制御するためにはUARTという通信方式を使う
  • 開発。本日の最低限の目標は「パソコン+Arduinoからモーターを制御する」ところまで辿り着くこと。講義資料と各種ネット記事を見ながら、もくもく会状態で各自作業を開始。

電気回路との戦い・序

  • まず Arduino Nano Every の動作確認のため、パソコンと接続してLチカをしてみる。シリアルポート周りのエラーで一瞬つまづくが自己解決。その後、モーターにコンデンサをハンダ付けするところでかなり手こずる(ざっくり2時間はかかった記憶)。細い導線の被覆をうまく剥がすのにも苦労した。

  • Arduinoからモータードライバを制御するための回路をブレッドボードに実装し始める。この回路には「ツッコミどころ」があるので見つけたら改善策を吟味してみよう、とのこと。しかしパッと見した限りでは見当がつかないし、無知な自分がいくら考えたところで時間をただ浪費するだけになりそう。なのでまずはお手本を実装することに集中する。回路図とArduinoのピン配置図とモータードライバキットのデータシートを見ながら、手探り状態でジャンプワイヤーを挿していく。ここに挿すんで本当に合ってんだろうな?と図を確認してはミスを見つけて挿し直す、という「三歩進んで二歩下がる」を地で行くような作業を繰り返す。

  • 15:30、各自の進捗を報告。他の受講生のお2人と比べて自分が遅れ気味であることに気づき、焦り始める。お2人がナチュラルに私物のオシロスコープを活用していてビビった。

電気回路との戦い・破

  • 16:00頃、とりあえずお手本の回路図がブレッドボード上に再現されたような気がする。まず、Arduino言語のレファレンスを見ながら、パソコンとArduinoの間でシリアル通信ができることを確認する。次にお手本やネット資料を見ながら、Arduinoからモーターを制御するためのコードを書く。そして、Arduinoにコードを書き込んでパソコンからモータードライバを制御する。

  • あれ、パソコンから命令を送ってもモーターが動かないな。Arduino単体のLチカは動くから、Arduinoが壊れて動かなくなったというわけではなさそう。ブレッドボードの接触不良とかかしら? 回路図を見ながらジャンパワイヤを全て取り外して別のワイヤで挿し直し、Arduinoを書き込み直して再接続する。しかし状況は変わらず。

  • 17:30〜18:30、夕食時間。と言っても時間帯が早すぎて喉を通らないし、さっきまでぶっ続けで作業してた人間にとっては、いきなり夕食を準備・消費して片付けまで済ませるには時間が足りなさすぎる。仕方ないので軽食で済ませる。IPAさん、この点どうにかならなかったんでしょうか。

  • 作業再開。動かないのは回路をどこかで挿し間違えているからではないかと考え、全てのジャンパワイヤと基板を外してブレッドボードに挿し直す作業を再度行う。しかしモーターは動かない。キエーッ。

  • テスターを起動してみるが、電子回路やマイコンにおける不具合原因の切り分け方が分からず、どの辺の部分からチェックしていけば良いのか見当がつかない。とりあえずモーターと導線を外して単3乾電池に繋げると、勢い良くモーターが回り出した。つまりモーター部分の問題ではなく、Arduinoまたは回路部分の問題であることは分かった。

  • 20:20、本日やったことの報告。他の受講生のお2人が最低限の目標を遥かに超え、本来明日やるはずの範囲まで辿り着いていたことを知り、一人で内心ビビり散らす。回路が動かないことについて手元をカメラで映しつつ皆さんに相談し、間違った箇所に挿さっているジャンパワイヤがまだ残っていたこと、モータードライバキットの基板にピンヘッダとターミナルブロックをハンダ付けしなくてはならなかったことを知る。

    • 蜘蛛の糸が垂れてきた時のカンダタの気持ちがわかった気がした
    • ちなみにこの時、私がDroidcamの設定をミスっていたためにカメラ映像が左右反転してしまうというトラブルがあった
  • 入浴・食事を済ませた後、今日の作業でかなり疲労困憊したのでしばらく休む。今日はとりあえず回路が動くようになるまで作業を続けることにする。

  • 23:20過ぎ、作業再開。ピンヘッダとターミナルブロックのハンダ付けを始める。細かい箇所にうまくハンダごてを当てるのにかなり神経をすり減らす。フラックスを塗ってもハンダが全然基板に乗ってくれない、なぜだ。上手なハンダ付けの仕方をGoogle検索しつつ色々とやってみるが、特に状況は改善しない。俺はこんなに不器用だったっけ、厳しいなぁ、と思いつつハンダの煙を吸い込み続ける。

  • 午前2時台、やっとハンダ付けが完了した。意気揚々とArduinoとパソコンを接続するが、Arduinoのオレンジ色のパイロットランプが点灯するばかりでモーターは動かない。なぜだ。モータードライバの基板やモーターのハンダ付けの接触不良を疑い、ハンダを吸い取って付け直す。が、動く気配はない。ハンダ付けした部分をテスターで調べてみても、短絡している様子はないし、接着部分も通電している。

  • 結局、5時過ぎになって気力が尽き、今日の最低限の目標が達成できないまま横になる。

8/10 (3日目)

開発コース2日目です。開発コースの日程は一応全部で3日間となっていますが、終日開発できるのは実質的にこの日が最後です。早すぎる。

電気回路との戦い・急

  • 8:00、起床。徹夜や朝寝は自分にとって日常茶飯事だが、3時間睡眠でこれほどすっきりと疲れが取れたことは今までになかった。しかしそれが余計に「早くデバッグを終わらせなくては」という焦りを加速させる。

  • 8:30、講義開始。OSS技適と改造の関係性・ルーターREST API・フロントエンド画面などについての座学。

  • 9:30、作業開始。まずは自分の昨夜の状況を報告し、モーターを動かせない原因が分からない件について相談する。カメラでブレッドボードを映し、皆さんから「回路自体にミスはなさそう」というコメントを頂く。puhitakuさん「Arduino自体が破壊されているという可能性もある」。

  • チューターさん*2「テスターでArduinoのピンにかかっている電圧を調べてみて下さい」。テスターでArduinoのGNDピンと他のピンにどれだけの電位差があるか、導通していないかを調べる。しかし、データシートと照らし合わせても異常な兆候は見られなかった(=Arduino自体が壊れているということはなさそう)。

  • チューターさん「次はモータードライバの基板をテスターで調べてみて下さい」。電源を供給しない状態で基板の端子同士が短絡していないかを調べた後、Arduinoから基板にモータードライバのデータシート通りの電圧を入力し、モータードライバからどれだけの電圧が出力されているかを調べる。期待通りの入出力がなされている。あれ?じゃあなんで動かないんだ?

  • 一旦整理をするとこうなる。

    • 乾電池に直接繋げるとモーターは動く(=モーターは正常)
    • Arduinoのピンは短絡もしていないし、異常な電圧も掛かっていない。Lチカも動く(=少なくともArduinoが完膚なきまでにぶっ壊れた訳ではない)
    • モータードライバの端子は短絡もしていないし、異常な電圧も掛かっていない(=少なくともモータードライバは破壊されてはいない)
    • 回路を繋げてArduinoからモータードライバに特定の電圧を加えると、データシート通りの出力が得られる(=回路もモータードライバも期待通りの動作をしている)
  • もしかして、モータードライバに加わっている電圧が小さすぎたせいでモーターが動かなかったのでは...? ということはPWMのデューティー比が小さすぎてモーターが回らなかったのかな。とりあえずArduinoのコードを全面書き直した方がいいなコレ。

  • 11:00過ぎ、Arduinoのコード内で指定しているPWMのデューティー比を色々と調整しつつ、モータードライバのデータシート通りの電圧を加えてみたところ、回路に繋げられたモーターが勢い良く回転を始めた。ここに至って1日目の最低限の目標をやっとクリア。オシロスコープがあったらこの辺の原因究明もスムーズに出来てたんだろうか。

ルーターの設定

  • 1日目の内容を何とかクリアしたので、急いで2日目の内容に入る。まずルーターを開梱・分解し、講義資料を見ながら基板にどういう部品が付いているのかを確認。ルーターをUSB Ethernetアダプターでパソコンと接続して初期設定を行う。講義資料を見ながらやっていたら20〜30分ほどで完了し、パソコンから無線でルーターに接続できるようになった。

ルーターマイコンに接続

  • ルーターに無線接続できるようになったので、本格的にルーターを改造する準備に入る。まずルーターsshし、シリアル通信を使うためにパッケージマネージャで minicom を導入する。minicom を ssh 越しに起動しようとしたが、普段使っている urxvt というターミナルエミュレータでは minicom を起動できず、代わりに xterm を開く。

  • xterm のデフォルトのフォントやスタイルが見づらかったたため、xterm -fa "xft:TerminessTTFNerdFontMono-20, xft:IPAGothic" -fg PapayaWhip -bg "rgb:00/00/80" とオプションを付ける。xterm から ssh して再度起動を試みると、今度は問題なく minicom を開くことができた。

  • ルーターの USB Type-A ポートにArduinoを接続し、ルーター上の minicom から Arduino に命令を送る。すると期待通りにモーターが回ってくれたので、次の工程に進む。ルーターの設定完了からここまでで約15分。

REST APIサーバ・フロントエンド画面の開発

  • 次は、curl を叩きながら HTTP 通信と REST API について学ぶ。この辺は割と馴染みがあるので特に苦労はしなかったが、考えてみると自分にはネットワーク周りの知識がだいぶ欠けているんだよな。自分が知っているのはアプリケーション層の話だけで、それより下の層のことは何も知らないなあということに改めて気付く。

  • HTTPの話を踏まえて、ルーター上で動かすREST APIサーバを作る。講義資料の通りに MicroPython と各種ライブラリをルーター上に導入し、ファイアウォールを設定する。講義資料では vim も導入することでルーター上で全ての開発を行うようになっていたが、自分は VSCode でコードを書き、更新する度に逐一 scp でルータにファイルを送信するようにした。個人的にはこの方が楽に感じる。

  • サーバのお手本コードは予め提示されていたので、これを参考にしつつ自前で実装する。REST APIを叩くのは日常的にやってるけど、Python でバックエンドのREST APIサーバを組むのは地味にこれが初めてなんだよな。MicroPython を使う関係上、お手本も Python で書かれていたが、個人的にはできれば書き慣れている Node.js を使いたいところ。しかしユーザーが自由に使えるストレージ領域はかなり小さいから、node_modules みたいな巨大な代物を入れられる余地はなさそうである。とりあえずは講義資料の通りに Python での実装を進める。サーバが形になってきた段階で curl から REST API を叩き、期待通りに HTTP 通信が行えていることを確認。

  • ブラウザからREST APIを叩くための操作画面を作る。お手本の HTML ファイルには Bootstrap 5 が使われていた。サーバが形になってきて、もう少しでフロントエンドからAPIを叩けるようになりそうかな?という段階になった辺りで本日の日程は終了。

  • 22:30頃、「フロントエンドからREST APIを叩くと、それに応じてルーターが動く」という挙動ができるようになる。とりあえずX3ゼミ全体の最低限の目標にはこれで行き着いたことになる。

  • お手本のHTMLファイルには、前後左右への方向転換ボタン・停止ボタンこそ備えられていたが、速度を調整する機能はなく全速力で走行するようになっていた。これは不便だし、自分なりの工夫も付け加えておきたかったので、<input type="range">で速度を調整できるようにする。Bootstrap を使うのは高校の文化祭のサイトを作らされた時以来である。懐かしいなーと思いつつ公式ドキュメントを開き、HTMLファイルを編集する。

  • 振り返ってみると、REST APIは元々の実装だと「前・後・左・右・停止」の命令しか受け取らないようになっているし、Arduinoも速度を調整可能なような実装にはなっていない。つまり、「速度を変えられるようにする」という一つの仕様変更が、全てのレイヤーに連動して影響を与えるということになる。結局 <input type="range"> でモーターのデューティー比を直接指定し、それがREST APIサーバを介してArduinoに直接送られるように全体を書き換えることにした。

  • 昨日の徹夜でそこそこ体力を消耗していたため、今日は早めに(当社比)2時頃に寝る。

8/11 (4日目)

この日は開発コース内での成果発表会がありました。最終日に各コースの代表者が1名ずつ「自分のコースでやったこと、自分が工夫したこと、自分が得た学び」などを発表する時間が設けられていますが、今日の成果発表会はその準備あるいは予選のようなもので、参加者全員が自分で作ったスライドで発表を行います。

  • 8:30、作業開始。この日は座学はなし。午後は成果発表会のスライド制作をしなくてはならないので、作業が可能なのは事実上この午前中いっぱいに限られる。フロントエンド・REST APIサーバ・Arduinoのコードの書き換えと調整に時間を費やす。

  • 13:30頃、成果発表会のスライドを作り始める。ゼミ発表のためにスライドを Marp で作る習慣が元からあったので、この辺は特に苦労せずいつも通りにスライドを作る。デザインはゼミ発表のためにいつも使っているスライドテンプレートをそのまま流用した。Marp はまあまあ綺麗な見た目のスライドが Markdown でパッと作れて便利なのでオススメです。

  • 16:30〜17:30、成果発表会。電気回路周りの話に関しては自分よりも他の受講生のお2人の方が明らかに深く理解されていると思ったので、自分は「このゼミからどういうことを学んだのか」に主眼を置いた発表をした。X3コースの受講生全員が Marpを使ってスライドを作っていたことが判明し、「Marpいいですよね」という話で盛り上がった。

  • 他の開発コースの発表を聞くと、どのコースも面白そうなことをやっているなあと感じる。最後まで応募を迷っていたCコンパイラゼミ・CPU自作ゼミの発表が聞けたのは良かった。また、応募は特に検討していなかったが、暗号のままで計算しようゼミ・無線通信ハッキングゼミの発表が個人的に特に面白かった。「理論的な話に興味を惹かれる」という自分の興味の傾向によるものだろう。

夜の日程として、再びのLT大会とグループワークがありました。LT大会は3つのトラックに分かれ、各時間に開かれる3つの発表の中から好きなものを選んで視聴するという形式でしたが、どれも面白そうな内容でどれを見るかかなり迷いました。 日程終了後、0時が期限の期末レポートを一気に仕上げて提出するなどしていました。

  • 2時過ぎ、講義資料の最後に「発展的内容」として紹介されていたOpenWrtのビルドをやってみる。

  • 色々いじっていると、理論上は OpenWrt で Node.js などを動かせるっぽい、ということに気付く。REST APIサーバはNode.jsで書きたかったけど、組み込み環境だし厳しそう。

  • するとpuhitakuさんからDiscordで「ストレージの容量がカツカツな場合、USB フラッシュメモリのような外部ストレージを rootfs にできる extroot というテクニックを使えば広大な領域が手に入ります」「DRAM は余裕なはずだから、あとは rootfs の容量さえ extroot とかで手に入れれば Node.js, gcc, CPython も夢じゃないですね 」というアドバイスを頂いた。

openwrt.org

  • extroot ってこれかぁ。楽しそうだな。しかし今はとりあえず講義資料の最後まで行き着くことを優先させたい。extroot は後でやることにして、今は講義資料で書かれていた設定でビルドしてみることにした。

  • ビルド完了を確認した後、4時過ぎに就寝。

8/12 (5日目)

午前8時過ぎに起床後、グループワーク・成果発表会・閉講式がありました。 ビルドしたOpenWrtのバイナリをルーターに書き込み、しばらく遊びました。

完走した感想

獲得した学び①:様々なレイヤを知ることの大事さ

X3ゼミでは「様々な技術を自分で触り、それを互いに組み合わせることで一つの物を作る」という体験をします。 これを経て気付かされたのは「現代のプロダクトは、抽象的な高レイヤ層から工学的な低レイヤ層まで、幅広い技術が膨大な単位で集まった上で、それらが互いに組み合わさることによって動いている」ということでした。 人はともすれば「自分の専門分野」「自分が今知っている技術」だけに閉じこもってしまいがちな生き物ですが、それでは様々な技術を投入されて精巧に作り上げられている現代のプロダクトについて学んだり、遊んだり、それこそ攻撃に備えたりするためには支障が生じます。

また先程触れたように、現代のプロダクトは様々なレイヤ層の幅広い技術を組み合わせて作られている以上、自分で何か新規性のあるプロダクトを作るには、それを構成する要素となる各レイヤについて自分自身が手の動かし方を心得ておく必要があります。 これは既存のプロダクトをリバースエンジニアリングしてその上に自分なりの改造を施すにせよ、自分で一から設計してプロダクトを作るにせよ、どちらにしても変わらないことです。 むしろ前者の方が、他者が設計したものをゼロから読み解く必要がある以上、各レイヤに通じておく必要性もより強くなると言えるかもしれません。 私はこのセキュキャン講義を通じて、様々なレイヤのお気持ちを幅広く知ってこそ自分の力で面白いことができるようになるということを学びました。

獲得した学び②:「お気持ち」の大事さ

上の獲得した学び①のところで「お気持ち」という言葉を使いましたが、そもそも「各レイヤの技術を学ぶ」とは一体どういうことなのでしょうか。 自分が今回苦戦した電気回路を例に考えてみます。

電気回路を組む上では「上手なハンダ付けの仕方」のような専門的技能も非常に重要ですが、それ以上に大事と感じたのは「なぜコンデンサをここに入れるのか」「回路が動かない時、どういう方向に思考を働かせて、どういう風に原因を切り分けたら良いのか」といった『その分野の思考法に関する知識』です。 頭の使い方・手探りの仕方・これの何が嬉しいのか...といった「お気持ち」を会得することが、新しい技術を学ぶ上で重要であると感じました。 考えてみれば至極当然のことなのですが、やったことのない分野に改めて入門してみるということをしばらくしていないと、「お気持ち」の重要性を忘れてしまうようです。

電子工作の中で自分が今回詰まったポイントとして、例えば「基板にターミナルブロックやピンヘッダをハンダ付けする必要があることを知らなかった」という点があります。 しかしこれも「ブレッドボードや基板の端子がどのようにして通電しているのか」をちゃんと調べながら演繹していれば「端子とブレッドボードを接続するために、ピンヘッダやターミナルブロックをハンダ付けする必要がある」ということをすぐに導き出せていたはずです。

私には昔から「触れたことのない分野に弱く、蛇の道程度の細い道を通すだけでも、ゼロ知識からやり始めると時間がかかる」「一度蛇の道を開拓した後はまあまあ習熟が早い」という性質があり、これが今回モロに出てしまったように思います。

その他所感

  • 「自分の全ての思考リソースと体力を、何か1つのものを開発することにのみ全振りする」という体験は初めてで、とても楽しかった
  • 開発を通じて、未知のレイヤと既知のレイヤを自分の手で接合させていく感覚が面白かった
  • 低めのレイヤの歩き方の第一歩を踏んだので、以前からの趣味(関数電卓のプログラミング)における目標(関数電卓のハックとリバースエンジニアリング)に活かしたい
  • 組み込みLinuxに興味が湧いた
  • 自分が思ってた以上に自分が電気周りのことをなにも知らないことに気づいた
    • 電気回路はコンピュータの実装と動作のために切っても切り離せないレイヤなので、電気そのものを専門的にやる必要はないにせよ、もう少し知っておくべきだなと実感
    • グループワークのCPU自作本輪読会を通してこの辺の理解を少しずつ深めたい(でもあの本でやるのはエミュレータ実装なんだよな)
  • ネットワークについても、自分はアプリケーション層より下の話のことをなにも知らないと実感
  • Discordのボイスチャットで何度か話が出ていた llvm も、今はボヤっとしか知らないが既知にしたい

*1:実際に、企業イベント中に某社の方からこれを質問されました

*2:チューターとして参加されていることをネット上で公開されていないようだったので、ハンドルネームの開示は避けます