重力に縋るな

モノが動くのがすき

KiCad の diff、kicadiff

基板設計してる時にも diff を見たいです。見たいよね?

KiCad は Git との相性がよい(KiCad 9 からは本体にも連携機能が組み込まれている)ですが、それはあくまでファイル管理の話でしかなく、git diff しても、GitHub Pull Request の Files changed を見てもそこには無慈悲な S 式の差分があるだけです。

ということで diff 可視化ツールを作りました。

github.com

使い方

git diff みたいなかんじで、Git 管理した状態で編集して kicadiff すると、差分を可視化した HTML が生成されます。 kicadiff --open すれば xdg-open で勝手によしなにブラウザなどで開いてくれます。

HTML 出力での差分表示

VSCode で開いているときに kicadiff --open vscode すると生成された HTML のタブが開かれます。 Simple Browser extention とかを使っていれば VSCode で KiCad を弄るとき(?)にも VSCode で完結して diff を見ることができます。 Claude Code に基板設計させたいときなどにどうぞ((やってみたなんとも言えない結果は examples/ に置いてあります))。

Claude Code の編集時に使うための kicadiff hook サブコマンドもあります。 Edit/Write tool とかの PostToolUse hook から呼ぶ想定です。 具体的には examples/blink/.claude/settings.json を見てください。

GitHub Action も用意したので、Pull Request でこんなこともできます。

PR description や PR comment での表示
github.com

実装

Bun でババーン

仕組み

kicad-cli で svg/png をレイヤーごとに生成して重ねる、以上

おわりに

3D CAD だけでなく基板設計もいまだにかなり人間の仕事で大変

エーアイ、3D CAD もやってほしい 2026

Claude Code などの Coding Agent を使っていると本当に便利です。 特に最近のモデルの性能は本当に高いですし、最近だともはや普通の話ですが手で直接コードを書くことの方が少ないというかもはやほとんどなくなっています。

で、それはいいとして。じゃあもうエーアイでなんでもかんでもできる、と言われるとんなわけないだろとなります。 その中でも特に顕著なのが、時空間認識能力の欠如です。

まあこれは仕組みを考えてみると仕方のないことです。今一番 AI と呼ばれているものは基本的に LLM をベースにしている技術なので、これは「言語」モデルなわけです。 そのため、「言語」の空間内に収まる問題を扱うのは非常に得意ですが、そこに収まらない問題は不得意です。 もちろん「言語」の空間に収まる問題はとても広範に渡るのでそれでも十分に有用ではありますし、だからこそ今とても持て囃されているわけです。 特にコード書く時に多くの問題は「言語」の中に収まりがちですし。

しかし、なまじ「言語」の空間に収まる問題がエーアイで薙ぎ倒せるようになったので、他もどうにかなってほしいものです。 あと、そもそも「言語」に問題が収まるかどうかはグラデーションでしかないということもあり、自然と適用範囲を拡大していったら突然性能がガタ落ちして風邪を引くような感覚があります。

例えば時間感覚のなさでいうと、普通にソフトウェア開発をしているときでも、短時間のうちに色々操作をしたらうまくいかない、みたいな挙動の調査というか発見とか苦手ですよね。あととりあえず sleep 5 してみるやつとか。sleep してない時以外の Agent との会話ラリーの間にも時間経ってるんですよね、エーアイ君はあんまりご存知無いと思うんですが......

ただ、時間の方の問題は、しばらくやってるといくらかやりようはあるのかなと思えるようになってきました。まあ機敏な computer use みたいなやつはまだまだ大変そうな気はしつつここはかなり投資が入ってきていそうですし、応答が速いモデルみたいなのもできてきています。......というのは基盤モデルの応答が速くなれば Agent の認識のズレが軽減される方向での解決ですが、それ以外にも、脊髄反射的な役割を持たせた小さいモデルを別で動かしておく*1とか、ずっと録画的なことをしておいて即座に反応する必要をなくす/タイミング情報を残して Agent に伝えやすくするハーネスを作るとか、結構実用的なパターンが発生してきている気がします。ロジックアナライザのログ取っておいて渡すとかね。

なんですが、空間認識能力の欠如は結構厳しいなとずっと思っています*2。そしてどうにかなってほしい。 ハーネス(物理)かしめてほしいし、コンポーネントの組み立て(物理)してほしい......というのは高望みだとしても*3。CAD 設計とか基板のアートワーク設計とかしてほしい*4です。してくれ。

ということで(?)、どうにかなんないかなあと思う度にエーアイに CAD やらせる実験を去年あたりからちまちまやっていました。 世の中には OpenSCAD や CadQuery という、コードで 3D CAD が可能な物体があるので、これは OpenSCAD でやっていました。

まあめんどくさいですね。構造設計みたいなやつってあんまり設計意図から最終的な出力の間にあんまり言語が挟まっていないような感覚があります。なのでこれをあんまり三次元空間に気持ちが無い相手に、言語という手段だけで設計意図を伝えてコードで開発させるのはだいぶしんどいです。言語化が大変すぎる。特に去年ぐらいのモデルだと自分でコード書くのとほとんど変わらないぐらいの言語化が必要で、これは非実用的だなあと思ったのでした。

その後、Opus 4.5 にだいぶ感動していたので、年始にまた試してみていました。 ただ、これも意図の汲み取り力が上がったことによって一発目の出力は多少はマシになったようななってないような、という印象でした。

OpenSCAD は CLI からレンダリング結果を出力できることに気付いたので、これでフィードバックループを組んだりもしてみたんですが、Opus 4.5 の視力は深海魚並みなので効果はいまひとつでした。Z fighting を一生理解してくれません。

ただ、この時はモデルの性能が上がったというよりは僕が(Fusion 360 で)3D CAD とそれの設計のカンをだいぶ得られていたのもあり、トータルでは多少は実用的にはなりました。OpenSCAD を手で書くのと手で parametric なことをやるのがめんどいのをやや仲介できることを実用的と呼ぶならですが...... あともちろん強い制限はあり、(OpenSCAD の利点が活きる)parametric な設計や、modular な設計に利点がある、ないしはそのような作り方をしても困らないようなモノの設計にのみ使っていました。 具体的にはコネクタがめっちゃ付いてる箱、みたいな治具をたくさん作る、みたいなやつです。

......というのが前座で、その後 Opus 4.7 が出て視力が多少はマシになったりしたのと、そういえば Gemini は multi-modal だけはいいよなと思って Gemini 3.1 Pro preview で適当なモデルを作らせてみたらそんなに悪くないモデルが出てきたな、と思うなどしていました。

そこで、エーアイの空間認識能力ないしは OpenSCAD 力をその時なんとなく試しただけで測りたくないなと思い、大量に比較して一覧できる Web サイトを作ってみた、というのが今回の話です。

vibe-openscad.sksat.dev github.com

ここでは、色々なモデルプロバイダの色々なモデルに対して色々な OpenSCAD タスクを色々なカタチで投げてその結果を一覧できるようにしてあります。 立方体に穴開けるカンタンなタスクだとこんなかんじです。さすがに多くのモデルが平然とできますね。 単なるモデル違いだけでなく、Claude Code みたいなハーネスをつけたときにはどうか、みたいな区別をするために、何もしていないものは bare と呼んでいます。また、reasoning effort ごとでの違いや、ここに表示している OpenSCAD のレンダリング結果の png を注入してイテレーションを回した時なども出しています。

中央に貫通穴を持つ立方体

vibe-openscad.sksat.dev

で、こんなタスクでも、ほとんどのモデルが平然とこなす一方で、gpt-5-nano-2025-08-07gemini-flash-lite-3.1-preview とかは Z fight 起こしたりしています。3D プリントする時とかにはどうせ厚さ0の板とか存在しないに等しいのでまあ悪くはないんですが、ちょっと怪しさがありますね。

Z fight してる

vibe-openscad.sksat.dev

階段状のピラミッドを作るのも、gemini flash-lite 2.5 の thinking off の時以外は悪くないです。

階段状のピラミッド

問題はその次です。エーアイにはどうやらマグカップを作るのはかなり難しいタスクのようです。

Claude 作マグカップ
GPT 作マグカップ
Gemini 作マグカップ
vibe-openscad.sksat.dev

gemini flash-lite 2.5 はだいぶ前衛的なマグカップを作りました。マグカップとは。 vibe-openscad.sksat.dev

ちなみに、各試行ごとの詳細ページもあり、単発のレンダリング結果だけでなく、STL をグリグリして眺めることや、コードの中身を見ることもできます。openscad-wasm なる物体を見つけたので、パラメータを動的に弄って STL を変えられるようにもしておきました(あんまり安定はしてないです)。

各タスクに対するモデルごとの試行詳細画面

また、イテレーションさせた時の diff 表示などもあります。gemini flash-lite 2.5 は例によって頓珍漢なことをずっとやっていますが。

他 variant/iteration との比較表示

そして、ここまではまだモデルごとの差はそこまで大きくなかったのですが、金具の設計のような実務的なタスクをやらせてみるとだいぶ差がついてきます。

皿穴付き L 字金具を設計するタスク

これを見ると、ちょうど直近リリースされたモデルである GPT 5.5、Opus 4.7、Gemini 3.1 Preview あたりはまあまあ実用的かもなという印象を受けます。他のタスクを見ても GPT 5.5 と Gemini Pro 3.1 Preview はだいぶマシな印象です。

vibe-openscad.sksat.dev vibe-openscad.sksat.dev

蝶番とか作らせてみるととより顕著に差が出ますね。

バット蝶番を設計するタスク

さらにより実務的な課題として、データシートにある外形情報からモデリングをさせるタスクなども与えてみています。

データシートの外形情報からモデリングさせるタスク

https://jp.sharp/products/device/doc/opto/gp2y0d413k_e.pdf

データシート内の外形情報(一例)

これがちゃんとできると、データシートもらってから 3D CAD 内でのフィットチェックであったり 3D プリントして組み立て性を確認したりするやつがだいぶラクになるんですよね。特に最近の 3D プリンタはメンテフリーで安定した造型を高速に行うことができますし、ものによっては自動でスライスしたりジョブ投げたりもできるので、やろうと思えば人間は「**のモデル作って刷っといて」とエージェントに言って、プリント完了通知がきたらビルドプレートからモデルを剥がすだけ、みたいな体験も作れそうです。

ちなみに、データシートとかは Google Drive に突っ込んでおくと、最近だと Google Workspace CLI でファイル検索してダウンロードさせて読ませる、とかもできて便利ですね。まあシンプルに検索とダウンロードができればなんでもよくはあるんですが。仕事だとメールも読ませられるのも結構便利ですね。メール下手人間なんで。

github.com

それはそれとして、こういうベンチマーク的な遊び、金かかりますね。

マネ~

あと、この記事を公開するかと思ってタイムラインを見たら Claude に Autodesk Fusion connector がきていました。ホンマかいな。

*1:Devin のブラウザ操作とかはこれやってるんじゃないですかねえ。ブラウザ操作得意すぎるし速すぎると思う。まあ単純に VM が海の向こうにあるから全部レイテンシが小さいというオチもまあまあありますが......

*2:今回の話のスコープ外ですが、座標変換とかもかなり苦手なタスクの印象があります。まあ変な座標系を生やさない限りは丁寧にやれば testable にするのは割と自明なので、TDD でやれば収束はするんですが。これの前の記事のシミュレータの座標変換ライブラリもそうやって作っています。

*3:まァ†Physical AI†なのかもしれません

*4:まあ基板設計は KiCAD あるからまだやる気になるんですが、マトモに使いやすい 3D CAD が全部プロプライエタリで自動化ないしは趣味との相性が悪くてしんどい

orts: 人工衛星シミュレーションプラットフォームを作りました

人工衛星向けのシミュレーションプラットフォームである orts をリリースしました。

github.com

単一のツールではなく monorepo になっており、数値計算や座標変換、地球周辺環境などのライブラリの集合体のような実装になっています。計算ロジック部分はすべてフル Rust 実装です。

また、Web viewer も付属しており、計算結果をリアルタイムないし後からブラウザで簡単に可視化することができます。

Realtime Viewer

各ライブラリを使ってもらうのでもよいですが、まずはじめは orts-cli を使ってみてもらうのがよいと思います。あまり込み入ったユースケースでなければこれで十分な場合が多いかもしれません。

cargo-binstall に対応しているので、ビルド済みバイナリを簡単にセットアップすることができます。

$ cargo binstall orts-cli
$ orts serve   # open http://localhost:9001 with browser

Realtime Viewer

この cli バイナリには Realtime Viewer を同梱しているので、serve サブコマンドを走らせてブラウザを開くだけで簡単なシミュレーションを行うことができます。Configure から Preset もしくは TLE などで軌道を設定すると、バックエンドでシミュレーションが開始され、その様子をブラウザからリアルタイムで軌道や姿勢の様子を観察することができます。

ISS Preset のシミュレーション

この Viewer では可視化をどのような座標系でやるかを動的に選択でき、ECI/ECEF の切り替えや機体中心での可視化を高速に行うことができます。

機体中心での表示

このプロジェクト内の座標変換ライブラリである arika を WebAssembly ビルドして Viewer でも使っているため、可視化のための座標変換をシミュレーション本体から分離した上で、ブラウザ内で高速に、かつミスなく・一貫性をもって行うことができます。

また、Viewer では時系列グラフも提供しており、様々なメトリクスをさっと確認することができます。 これには DuckDB-Wasm と uPlot を活用しています。 duckdb.org github.com

github.com

さらに、この2つの組み合わせとその Web worker 化、time range を切り替えた時の downsampling などを組み合わせたライブラリとして uneri というものを用意しており、Viewer でもこれを使っています。 sksat.github.io

データフォーマット(Rerun ベース ECS データモデル)

シミュレータを作る時にいつも悩まされるのがデータ保存のフォーマットです。 より正確には、悩まされるというよりは CSV でエイっと作ってしまって CSV に苦しんだり、大量の浮動小数点数を文字列にする効率が悪すぎたり精度が落ちてしまったりして困ることがまあまあよくあります。

このために注目したのが Rerun というデータプラットフォームです。

rerun.io

これは Robotics など向けのデータロギング・可視化のためのプラットフォームで、Rust を含む複数の言語向けのライブラリが整備されています。最近はめちゃめちゃ Physical AI を意識していそうです。

Entity Component System(ECS)のコンセプトや、Apache Arrow ベースの Chunk を使っているといったコンセプトがちゃんとイマドキで効率もよくていいなと思って採用しています。ただ、Viewer に関してはあんまり気持ちが合わなかったりどうにも不安定なことが多いので自作しました。

また、可視化プラットフォームあるあるとして、場合によって/ユースケースによって見たいデータの性質がまったく異なるので、ハンズフリーというかノーコードなプラットフォームだけで頑張るのは根本的に無理があるという問題があると思います。よくあるところだと、Grafana は痒いところに微妙に手が届かない、みたいなやつです。

ただこれに関しては、今の時代はプラットフォーム部分はライブラリないしはテンプレートという形で用意しておき、その場その場でエーアイパワーで viewer を濫造してしまえばいいと思っています。 実際、ここ数ヶ月ぐらいは仕事でも様々な Dashboard を濫造しています。みなさんがどのぐらいエーアイ使ってるか可視化するやつとかね。

そのため、orts-cli に同梱している Viewer も別にこれだけを使ってもらうのではなく、とりあえずさっとリアルタイムで簡単なことが見られて便利、という用途を想定しています。

さらに、rrd だとそれはそれで雑に別のスクリプトで解析するのが面倒だったりもするので、orts-cli には convert サブコマンドがあり、CSV への変換もサポートしています*1。 CSV から matplotlib で雑に可視化する Python スクリプト書くのはどのエーアイも超得意ですからね。

$ orts convert --format csv hoge.rrd --output hoge.csv

example の紹介

「で、何ができるの?」という疑問にお答えするために、example を色々紹介しようと思います。 色々できる単一のシミュレータ、というよりは汎用的なシミュレータライブラリという側面の方が強いので、方向性の違う具体から考える方がわかりやすいためです。

アポロ11号の軌道計算

sksat.github.io

これは単にやってみた以上のことはないですが、ナイーブな軌道計算です。 ただこういう複数の天体の重力を受けるようなある程度長時間の計算って、雑にやるのはそんなに難しくないんですが高精度にやるのは結構難しいので、ある種のベンチマークとしてよいなと思っています。 そして NASA がデータを公開しているので評価もしやすいです。

軌道寿命解析

sksat.github.io

https://raw.githubusercontent.com/sksat/orts/main/orts/examples/orbital_lifetime/altitude_history.png

これは見た目的にはあんまりおもしろくないですが、仕事ではまあまあやるやつですね。 仕事で作っている人工衛星はほとんどが地球低軌道と呼ばれる比較的低高度の軌道に投入する人工衛星なので、薄いとはいえしっかり存在している大気抵抗の影響でだんだん高度が落ちていってしまいます。

そのため、これがどのくらいのペースで落ちてくるのかが人工衛星の寿命に直結します。 これが宇宙活動法の申請書類やら衛星コンステレーションの設計やらで結構重要なんですよね。

また、地球周辺環境ライブラリである tobari の内部で NRLMSISE-00 などの大気モデルをフル Rust で再実装したため、これの正確性の E2E での検証にもなっています。

この例では某弊社の人工衛星 AE1b の公開情報から計算・検証を行っています。

WebAssembly Controller Plugin

これはかなり特徴的な機能だと思います。人工衛星側の姿勢制御などのロジックを WASM の Plugin として動的にシミュレーションに組み込むことができる機能です。 これにより、制御則を単体で検証するようなことが非常に容易になります。

以下は例えば Bdot という角速度を減衰させるのによく使われる制御則を実装したものです。

struct Component;

impl bindings::Guest for Component {
    fn run(config: String) -> Result<(), String> {
        let cfg = Config::from_json(&config)?;

        let gain = cfg.gain;
        let max_moment = cfg.max_moment;
        let mut prev_b: Option<[f64; 3]> = None;
        let mut prev_t: f64 = 0.0;

        loop {
            let input = match wait_tick() {
                Some(input) => input,
                // ホストが shutdown を要求している。
                None => return Ok(()),
            };
            let b = input
                .sensors
                .magnetometers
                .first()
                .ok_or("magnetometer not available")?;

            let b_mag_sq = b.x * b.x + b.y * b.y + b.z * b.z;
            if b_mag_sq < 1e-60 {
                send_command(&zero_moment());
                // prev_b/prev_t を更新しない — near-zero サンプルは無視
                continue;
            }

            let cmd = match prev_b {
                Some(prev) => {
                    let dt = input.t - prev_t;
                    if dt < 1e-15 {
                        // dt ≈ 0: prev_b/prev_t を更新せず zero command のみ送る
                        send_command(&zero_moment());
                        continue;
                    }
                    let db_x = (b.x - prev[0]) / dt;
                    let db_y = (b.y - prev[1]) / dt;
                    let db_z = (b.z - prev[2]) / dt;
                    Command {
                        mtq: Some(MtqCommand::Moments(vec![
                            clamp(-gain * db_x, -max_moment, max_moment),
                            clamp(-gain * db_y, -max_moment, max_moment),
                            clamp(-gain * db_z, -max_moment, max_moment),
                        ])),
                        rw: None,
                    }
                }
                None => zero_moment(),
            };

            send_command(&cmd);
            prev_b = Some([b.x, b.y, b.z]);
            prev_t = input.t;
        }
    }
}

bindings::export!(Component with_types_in bindings);

本当に B を dot しているだけであることがわかります。このシンプルさが Bdot 則の魅力です。

これと binding だけの crate を cargo component build --release すると bdot_fnitite_diff.wasm がビルドできます。

そして、orts.toml に以下のような設定を書いて orts run します。

body = "earth"
dt = 0.1
output_interval = 1.0
duration = 55500.0  # ~10 orbits at 500 km altitude

satellites
id = "bdot-demo"
sensors = ["magnetometer", "gyroscope"]

[satellites.orbit]
type = "circular"
altitude = 500

[satellites.attitude]
inertia_diag = [1, 1, 1]
mass = 50
initial_quaternion = [1, 0, 0, 0]
initial_angular_velocity = [0.1155, 0.1155, -0.1155]  # |ω| ≈ 0.2 rad/s

[satellites.controller]
type = "wasm"
path = "bdot.wasm"

[satellites.controller.config]
gain = 1e6
sample_period = 1.0

[satellites.magnetorquers]
type = "three_axis"
max_moment = 10.0

Bdot が動いている様子

sksat.github.io

RW を使った姿勢制御ももちろんできます。

sksat.github.io

RW を使った姿勢制御

推進器も使えるので軌道制御もできます。 sksat.github.io

ホーマン遷移のシミュレーション結果

WASM Component の仕組みを使った AOCS FSW SILS (Software-in-the-Loop-Simulation)

SILS という概念があります。実際に搭載するソフトウェアないしそれに近しいロジックを実装したソフトウェアをクロスコンパイルかなにかしてシミュレータにリンクすることで、単なる制御則を検証するのではなく、その実装を検証しよう、みたいな概念があります。*2 *3 *4

別にこれも下回りを mock した AOCS FSW 実装を WASM にビルドしてやれば繋がるだろうと思ったのでやってみました。 WASM Component にさえばなればいいのでプログラミング言語非依存で、C言語で作られた FSW とも繋げられます。 ただ公開されているシンプルな AOCS FSW 実装があんまりなかったので、今回は NOS3 というシミュレータ向けに作られている generic な AOCS FSW(もどき)実装を組み込んでいました。

sksat.github.io

これは SILS なので、本体の実装は一切弄らず、build.rs で clone してきた上で、センサやアクチュエータといったインターフェース部分を繋ぎ込む wrapper 部分だけを Rust で書いたものを WASM Component にビルドしてテストしています。

NOS3 ADCS Bdot

これもちゃんと動いていそうですね。

複数衛星の模擬

もちろんできます。

衛星4機の軌道面内位相調整

sksat.github.io

衛星ひとつひとつに個別の WASM plugin を割り当てることもできますし、ひとつの WASM plugin を大量の衛星群に割り当てるようなこともできます。

これで衛星コンステレーションの模擬も色々できるでしょう。

計算の正確性/妥当性検証

シミュレータでもっとも重要なところでありながら、いくらでもナアナアにできるので意外とごまかされていることが多いか、既存実装に乗っかるためにビルドが複雑怪奇になっていたりすることの多い部分です。デカい無意味なレゴブロック*5を積み上げるのってカンタンなんですよね。 orts ではフル Rust 実装によるシンプルなビルド・テストのしやすさ・型安全性を優先したため、基本的な概念のほとんどを再実装しました。

まず、数値積分については汎用 ODE Solver crate である utsuroi を作りました。 RK4 / Dormand-Prince 4(5) / DOP853 / Störmer-Verlet / Yoshida 4次・6次・8次などのソルバーを実装しています。 これの妥当性は解析解が存在する調和振動子や2体問題などを使って検証しています。

docs.rs

次に、座標変換については arika という crate を作りました。 ここでは IAU2006/2000A による precession-nutation、ERA、polar motion、EOP (IERS finals2000a.daily の取り込み)、WGS-84、天体の Meeus 解析 ephemeris、JPL Horizons からの ephemeris 取得などを実装しています。 この検証は、IAU SOFA の互換実装である ERFA や、Orekit での計算結果を oracle fixture とした E2E test によって行っています。

docs.rs

また、LEO(地球低軌道)ではかなり大きな影響が出る地球周辺環境については、地球周辺環境モデル群を tobari という crate を作りました。ここでは Harris-Priester / NRLMSISE-00 などの大気モデル、IGRF のような磁場モデル、CSSI / GFZ からの宇宙天気データ取り込みなどを実装しています。

docs.rs

tobari は wasm ビルドして色々グリグリ可視化できるようにもしておいたのでよかったら見てみてください。

tobari Live Demo
sksat.github.io

そして、orts crate 本体ではこれらのライブラリを組み合わせて、姿勢・軌道のダイナミクス計算をしています。 ここでも Orekit を oracle とした E2E test をたくさん組んでいるため、(Orekit などを信じれば)E2E でのシミュレーションシステムとしての正確性は完全新規実装にしてはある程度確保できているといえるでしょう。

ちなみに、arikatobari などのライブラリはある程度 no_std 対応しています。

Capability-based 力学モデル

こういうシミュレータを作ろうとすると、†すべて†を計算できるようなシミュレータを組もうとしてしまいがちで、組んだら組んだで色々な概念が密結合になってしまって個別での検証がやりにくくなってしまい、結局何を検証したかったのか/検証できているのかがよくわからなくなる、という本末転倒なことが構造的に起きてしまいがちです。

たとえば、しばらく前に紹介した Bdot 則は磁場・角速度・MTQ さえあれば最低限の制御則としての検証はクイックにできるはずですが、シミュレータが密結合だと微妙にバグっているときになぜか SRP や大気モデルの実装を疑わないといけない、というヘンテコなことになりかねませんし、いざなってしまうとここの切り分けは至難の技です。実用的な例では多くの場合机上で簡単に検討できないから数値計算しているわけですし、なおさらです。

そのため orts では、用途に応じて軽い系と複雑な系を載せ替えやすい設計を型レベルで行っています。 具体的には、力学モデルを Model<S, F> というひとつの trait に統一した上で、モデル側が「自分が必要とする状態」を capability として型に書く設計にしています。

impl<S: HasAttitude> Model<S> for PdController { ... }            // 姿勢だけ必要
impl<S: HasOrbit> Model<S, F> for AtmosphericDrag<F> { ... }      // 軌道だけ必要
impl<S: HasAttitude + HasOrbit + HasMass> Model<S> for Thruster { ... }  // フル

orts 自体の開発について

フル Rust 実装なので、特段面倒な依存関係は無く、Rust toolchain のみでビルドできます(Viewer は React/Typescript)。

ただ規模が規模なので、しばらく開発しているとこんなことになります。毎週 disk full の勢い。 まあだいたい Rerun SDK が datafusion を引き連れてくるのが悪い。

この問題もあって、衛星側のロジックの検証をするときは制御則側を WASM Component にビルドしてもらってビルド済みの CLI と組み合わせてシミュレーションしてもらうのがよいだろうなと考えています。もしくは CPU とストレージを買いましょう(今買うのはやや癪ですが必要経費です)。*6

開発期間は約2ヶ月(趣味開発なので土日が中心)ですが、LoC はプロジェクト全体だとちょうど10万行ほど、Rust 部分に限定しても8万行ほどです。これは完全に Coding Agent 大活用の成せる技ですね。あくまで LoC だけの話をすれば最初の数日で3万行ぐらいはあった覚えがありますし。そしてこのほとんど(crate などにもよるんですが30~70%)はテストコードです。

まあでも年始にもシミュレータ作っててそこでの経験でアイデアが固まったところがあるので、実態としては3ヶ月強ぐらいでしょうか。エーアイパワーのおかげで side-project が大量に同時進行してしまっているとはいえ、集中的にやったにしてはだいぶかかってしまったかな、ぐらいの印象です。とはいえ開発の律速は主に CPU/RAM *7と、レビュアーとして酷使していた Codex (GPT-5.4) の rate limit ですが。

ちなみに CI はこんなことになっています。

test がたくさんあるということは、Actions の実行時間が増えるということ

さいごに

Claude Design がリリースされたので、Opus 4.7 に orts のロゴを作ってもらいました。 Orbit とオーツ麦の言葉遊びです。

orts logo

また、今回ちゃんとリリースしたのは趣味でやっていたつもりが十分以上に実用的になってしまったので仕事で使いたく/同僚に使ってほしくなってしまったからです*8。マトモで使いやすいシミュレータ(プラットフォーム)が全然無いというのは正直この4年以上ずっと困っていた問題だったんですよねえ。そしてなぜ長いこと(完全には)解決できていなかったのかと言えば、シミュレータを「ちゃんと」作るのってすごい面倒だからなんですよね。言い訳ですがモノを作ったりチームを作ったりしていると時間が溶けがち。そういった問題が主に Opus 4.6 の腕力で解決したのは本当に便利でした*9

そして、色々書いたもののまだだいぶ荒削りなので、今後も引き続き開発していければと思います。というかたぶん必要なのでします。よかったら star とかしてくれるとうれしいです。

*1:シミュレーション時の CSV への直接出力もそれはそれでできるようにはしてあります

*2:と僕の中では整理しているんですが、正直そこも一般的に合意できるものなのか未だによくわかっていません。「なんかシミュレーターとくっつけたらシミュレーションができるらしいから、なんかうれしそう」ぐらいの意味の無い発言すら見かけることがあるように感じています。

*3:一方で、FSW: Flight Software をクロスコンパイルしておくと、ろくすっぽ姿勢制御とかに関心がなかったとしても、なんとなく FSW の挙動を確認したりテストできて便利ではあります。しかしそれは雑に下回りを mock してクロスコンパイルしておくと、セマンティクスや通信プロトコルなどのシステム的に上位の概念を手動ないし自動でテストできるとうれしいという話です。しかし、日本の「宇宙」のみなさんはどうにもソフトウェア技術がなぜ・なにを・どのように問題を解決しているのかの解釈が浅く、ゴチャついた概念に責務ではなく雑な性質を元に名前を付けてゴチャついたまま会話をしてこんがらがっていることがやたら多いように感じています。まあこれがソフトウェアだけなら別にそこに専門性がない人々が積み上げてきた分野だからなと思うこともあるんですが、果たしてそれはどうかなという気持ちになることもままあります。"AOCS" とかも大概そういうかんじです。

*4:"HILS" とかいう、より何も言っていない、なんの責務も明らかでないし人によって思い描いているものがまったく違う、結果として結局何をなんのためにどのように検証したかったのかもよくわからないまま曖昧に謎のモジャモジャの通信線がたくさん PC に繋がりまくって「ループが回って......ループが回るとうれしい!」みたいなことになっていることがしばしばある最悪の言葉もあります。駆逐したい。この世から一匹残らず。

*5:デジタルツインと呼ばれていることもあります

*6:僕のメインマシンと Devin の VM のストレージは溢れました。かなしい。

*7:並列開発があんまりできない!!!とはいえ僕の VSCode には plan だけとか途中までとか走らせた Claude Code session のタブが常にめちゃめちゃ並んではいました。

*8:あと、private repo でやってたら後半エーアイぐらい Actions に金かかり始めたから(?)

*9:ただ Opus 4.6 は視力が深海魚並みなので可視化結果の検証とか Viewer のデバッグとかが微妙にずっと効率上がりませんでした。Opus 4.7 は深海魚よりはだいぶマシな目玉持ってるのでそこに期待したいのと、最近 mizchi から Visual Regression Test のための目玉用のモデルは別のを使っていてちょうどよいものを探しているという話を聞いてまあそうだよなあと思ったりしていました。

Kernel/VM 探検隊@つくば No.3 の運営をやった

Kernel/VM 探検隊 @ つくば No.3 が 03/20 があり、これの運営をやっていました。

https://kernelvm.connpass.com/event/381371/

これはかなり久しぶりのつくば開催でした(というか僕は前回を知らない)。なのでどんな体制でやるかといった企画から運営までを新規で考えてやる必要がありました。

どうやら Kernel/VM 探検隊 @ つくば No.2 は 2014 年開催だったようです。

https://connpass.com/event/7293/

今回のつくば開催は、「つくばで k/vm やりたいよなあ」という話をつくば周辺のオタク(要出典:誰?)でたまに話していたものが、去年夏の Kernel/VM 探検隊 @東京 No.18 の後あたりから主に id:koba789 が発起人となって曖昧に Kernel/VM Discord にスレ(#event-org/つくば説)が立ったところから始まりました。

とはいえ、その時からいた id:koba789n.takana も僕も正直ずっと忙しかったのであんまり話は進まずでした。その後 Kernel/VM 探検隊 @ 北陸 Part 8 の後にエイヤで大雑把な時期を3月末に決めました。あんまり記憶が無いんですが、投稿時間からして懇親会でしこたま日本酒を飲んだ*1後ですねこれは。

曖昧な開催時期決定

その後もずっと全員普段は忙しい面子でやっていたため、年明け後は定期的に同期的な打ち合わせを入れながら話を詰めていきました。飯喰いながらとか。本格的な企画が始まったのは 01/12 とかですね。

大学のラウンジで考えた初期タイムスケジュール案

このタイミングから、僕は共有の Google drive を整理して議事録作ったりとかロジ寄りのことをするようになっていました。 あと、元の3人だけだと当日の運営やネットワーク敷設などの調整がつけられないので、適切な現役生(現在の大学の技術的側面やその調整先に精通ないし所属している休学ないし事実上の休学を繰り替えしたりしていないものを指す)を見繕って巻き込むなどしていました。

議事録とか ToDo とかを単一の Google Docs に突っ込んでいた

この翌日には n.takana が大学支援室に出向き、教室の予約状況を確認してもらったり、彼の指導教員経由で教室を借りるための依頼を開始してもらったりしていました。

3日後からは id:maseBB などによる大学探検隊が開始され、「この教室は流石にキャパが少ないかも」「この教室は名目上のキャパは多いが Jetstar すぎる」「プロジェクターって借りられるんだっけ?」などを話しながら具体的な教室の候補を考え始めていました。

ただ、その後は大学探検隊や大学当局とのやりとりといった I/O 待ちでストールしていました。 そのため、条件は変わるがいずれかの教室が確保できるだろうことは確実であり、その確認はしていること、どうせ大学内(それも第3エリアのどこかになるのは確実)なので学内の人間はどうとでもなる・学外の人間からは「筑波大」の時点で移動コストや認知負荷のオーダーが変わらないことなどから、01/24 に見切り発車で connpass でイベントを公開しました。そうしないと人々のネタ準備の時間が減ってしまうのでな。

(なお、僕はここで応募をしそびれて一瞬で枠が埋まって異常な状態に突入していました)

で、その後思ったよりもあまりにも応募が多かったので、元の70人規模の教室から200人規模の教室に変更し、connpass の定員も拡張しました。

結局150人以上ちゃんと来ていた気がする。すごい。

ネットワーク

ここは完全に人々に任せていたので何が起きていたので、僕自身は細かいことはあんまり把握できてないです。id:maseBB や centra や野良の筑波大生が色々やってくれて助かりました。

しかしなぜかコンソールケーブルが自作されたり、id:hikalium さんがめちゃめちゃ手伝ってくれたりしていました。

当日準備など

ネットワーク敷設・配信準備などで id:KOBA789, id:maseBB, centra などがてんやわんやしていたので、僕はそれ以外の仕事というか、「実はやらないとダメでは?」みたいなところを気付き次第スポット的にやっていました。 具体的には、

  • 発表者からタイトルを回収して connpass や内部タイムテーブルに反映
  • 色々作る
  • 運営記録用の写真を撮る
  • 集金準備と集金
  • 懇親会の案内

などをやっていました。色々作るというのは、

会場案内のたまによくあるアレ

こういうやつとか、

準備中とかにスライドに案内を映すやつ

こういうやつとかのことですね。

あと、単なる参加はともかく懇親会はちゃんと集金状況確認しないといけないじゃんとなって集金確認用の名簿を作ったり、そういや OtakuAssembly のためにそこそこ真面目な金庫持ってたなということを思い出して発表中に一時帰宅して金庫を確保するなどしていました(車出してくれたりした totsugekitai もありがとう)。たぶん現地にいた人からはずっと集金係として見えていたと思います。だいぶ時間は経っていたものの、OtakuAssembly の会計で鍛えた札束整理筋みたいなものは結構残っていた気がします。

集金用の名簿は Claude Code で作りました。connpass の ID が普段と違う人なども多少いたので、登録順でのソート・アイコン併記などをしつつチェックボックスなども html で作ってもらいました。べんり。

vibe 集金名簿

懇親会

懇親会は百香亭筑波大学店で実施しました。筑波大学関係者ならこの一文で「それはそう」と思ってくれるでしょう。そのぐらい大規模な懇親会に最適な店です。大学からも近い。

どのくらい最適なのかというと、80人の予約を涼しい顔で平然と受けてくれます。さらに、元々は2700円のコースがあったんですが、端数があると集金が大変なので「これってちょうど3000円とかになりませんかねぇ」と言ったら「じゃあ2、3品足しとくね」で受けてくれました。かなり原文ママです。慣れすぎだろ。

あと結局定格80名から6人ほど溢れて希望者が存在したので追加できないかの連絡を当日の数時間前にしたんですが、対応してくれました。すごすぎる。 電話応対してくれた centra もとても助かりました。

ただまあ定格は本当に物理的な上限という感はあり、懇親会参加者には(物理的に)無理を強いてしまいました。そこは申し訳ないところでもありつつ、結果的には†柔軟な対応†により不幸なく充実した懇親会になったのかなとも思います。

そしてなにより、あれだけの人数いても百香亭の異常な飯の出力帯域により(席位置によっては間欠的になったとしても)喰いっぱぐれて腹を空かせる人を発生させることはなかったと思いますし、百香亭店主は金庫にゴロっと入ったほとんど千円札の金での支払いも普通に対応してくれました。ありがとう......

とくに関係のない終わり

ということで Kernel/VM の運営をやったんですが、参加はこれまで散々しているし運営もやったのに発表はしたことが無いこと、そして LT 枠がちょっと増えてることに気付いたので、次の関西ではなんかやります。たぶん。

仕事でもこういうのでもなんだかんだで裏方業をやりがちなので、なんというか正面からのアウトプットみたいなのはここ数年やや欠けているところかもしれません。あとなんというか広い意味で「やるべきこと」とかをやりがちなので、ヘンなことをしたいですね。

*1:僕は普段の日常生活では基本的にまったくといっていいほどアルコールを摂取しないんですが、飲酒自体はそこそこの量が technically possible ですし、飲むか飲まないかに関わらず概念としての懇親会ないし飲み会はかなり好きな方なので適宜誘ってもらって全然 OK です。脚注で表明することなのか?これ

全自動考証機械

Claude's C Compiler

今月頭に、Anthropic が Opus 4.6 のエージェントを並列でループさせることによって Linux 6.9 を複数のアーキテクチャターゲット向けにコンパイルすることが可能な C コンパイラを作るというブログとそのリポジトリを公開していました。

www.anthropic.com github.com

とても面白い試みだと思います。

ちなみに、以下 Issue が話題になってなんだ大したことないな、みたいな受け取り方をされていることもありましたが、これは単に include path が通っていないだけで、自作 C コンパイラとしてはそこまで違和感は無いかなと思います。 github.com

まあ、そういう easy さは無いのに intrinsics 関係のヘッダだけは結構丁寧に書いてあるのはいい意味で愚直な Opus 4.6 らしいなとは思いました。おそらくビルドする Linux の構成の中で使われている最小限のセットとかなんでしょう。 github.com

エージェントループの設計は本当にシンプルです。 ここは Claude Code と同じく Anthropic の Geek らしさというか、UNIX 哲学っぽさを感じるところですね。

#!/bin/bash

while true; do
    COMMIT=$(git rev-parse --short=6 HEAD)
    LOGFILE="agent_logs/agent_${COMMIT}.log"

    claude --dangerously-skip-permissions \
           -p "$(cat AGENT_PROMPT.md)" \
           --model claude-opus-X-Y &> "$LOGFILE"
done

また、この実験ではエージェントの並列化に主眼が置かれていたため、このループを Docker コンテナに押し込め、複数のコンテナで複数のループを同時並列させている点も面白いところです。 あくまでシンプルかつ初期の実験として割り切ってそれ以上の並列化のための仕組みは作らず、conflict は許容して push に失敗したら自分で直させるようにしているのはなるほどなと思ったところです。まあ奴等変更の意図を汲んで conflict を適切に解消するのかなり上手いですからねぇ。

得られた教訓として書かれている高品質なテストハーネスとテストの設計が重要であること、エージェントのためにテストハーネスを作る(コンテキスト消費を抑える、時間感覚の無さを補うように作る)、参考にできる既存実装があるならそれをオラクルとするテストを作る、という話は趣味・仕事での個人的な経験とも整合していたので、まあそうですよねとなりました。

SOLAR LINE

急に文脈が接続していない話をします。 ニコニコ動画などで活動されているゆえぴこさんという方が作る動画がとても好きです。

個人的には大統領りりせシリーズやムネオハウスも重厚でめちゃめちゃ好きです。 www.nicovideo.jp www.nicovideo.jp www.nicovideo.jp

これを Unity で一人で作っているの、何事?

何事?と思っていると中の話が同時並行で投稿されたりもします。何事?

www.nicovideo.jp

ハコワールドやゆるいと見せかけて風刺が効いてたりするやつも本当にいいです。 www.nicovideo.jp

www.nicovideo.jp

最近は SOLAR LINE という長編が投稿されていて、今季覇権アニメ(?)としてずっと観ていました。そして数日前に完結しました。よかったです。

www.nicovideo.jp

SOLAR LINE は太陽系内を駆け巡るタイプの SF 作品です。

どうでもいい補足をしておくと、僕は意外なことに(?)宇宙っぽい SF 作品が大好きとかではあんまり無いです。こんな仕事 とか、こんなゼミ とかを常日頃やっているので勘違いされてることがたまにありますが、ガンダムとか STAR WARS とかのよくあるやつも全然知らないです*1

この理由は単純に幼少期にそういう作品を読んだり観たりしていないからでもありつつ、なまじ「宇宙」のことを知っている状態が先にあったということもあって、不思議部分の整合性が中途半端だったり、特に不思議要素として描かれていないヘンな描写に対してスルーできない面倒な人間として育ったという部分が大きいです。

明確に好きだと言える宇宙っぽい SF 作品(?)(そもそもカテゴリ分けがあまり分かっていない)は今のところ

  • 『宇宙への秘密の鍵』:これだけは小学生の時に読んでた
  • 『2001: A Space Odyssey』:はい
  • 『The Martian』:イモ喰え
  • 『Contact』:SETI
  • 『ツインスター・サイクロン・ランナウェイ』:百合

みたいなかんじです。書いてみるといくつかあるものの、厳選した結果とかではなくそもそもの分母がめちゃめちゃ小さいないしは1:1ぐらいです。

そんな僕ですが、SOLAR LINE はちゃんと楽しむことができました。太陽系内の惑星から惑星(たまに衛星)へ次々と軌道遷移していくテンポの良さと、その際の違和感の無い物理的な描写のバランスが取れていてとてもよかったです。各所にふんだんに出てくる数値も、パッと見では条件さえ整えばオーダーは合っていそうに思えます。

ここで疑問がひとつ。これどれぐらい整合性取れてるんだろう。 ゆえぴこさんのいつもの丁寧な仕事™振りのことも考えると、もしやこれ結構ちゃんと考証されているのでは?

全自動考証機械

ということでようやく本題です。考証の考証、してみたいですよね。

自分でやってみてもよかったんですが、最近はやっぱりエーアイが便利です。 そして何よりエーアイは Web 開発がかなり得意なので、自分で何か検証みたいなことをする時も、最近はもっぱら横に Claude Code を置いてリアルタイム可視化のための Web app を同時に作る、みたいなことはかなり日常的になっています。

リッチな、特にインタラクティブな可視化ができるとかなり便利で、単純に手触りがいいだけでなく、ちょっとパラメータを変えてまた可視化、みたいなフィードバックループの遅さを改善することができますし、それによって現状の人間の大きな優位性のひとつである視覚・そこからの「直感」の獲得・「直感」による誤りの高速な発見というメリットを最大限に活かすことができます。

それはそれとして、あと単純に Claude's C Compiler がまだ記憶に新しかったので、せっかくなのでやってみたくなったんですよね。エージェントの無限ループ。ここでようやく話を繋げることができました。

ということで、Claude Code を使った AI Agent のループによる SOLAR LINE (ほぼ)全自動考証をやってみました。

sksat.github.io

リポジトリはこれです。 github.com

所々不自然な部分はあるものの、おもしろい物体にはなったのではないかと思います。

最初に用意したのは Claude's C Compiler とほとんど同様のシェルスクリプトとそれを突っ込む用の Docker コンテナの設定と簡素な Design Doc です。

github.com

今回の実験には主に Opus 4.6 を用い、レビュー用途に Codex CLI 経由で GPT 5.2 を使いました。 これは普段の Claude Code での個人的な開発でもよく取る構成です。GPT はコードを書くのには不便極まりない*2ですが、なんというか「地頭の良さ」のようなものはとてもあるので、レビューはとても鋭くて便利です。

あと、エージェントループの並列化は行わず、1ループのみの実験としました。 並列はまあ、適切な環境分離と conflict が小さく済むようなアーキテクチャ分離ができてれば、後は UI とかの問題かな、と Devin とかを酷使しながら感じています。 今回の実験においては、C コンパイラのような「正解」の無い問題に対してエージェントに主導権を渡した時にどうなるのかが個人的な関心事項でした。

他に意識していたことは、LLM は直接動画を読むことはできないということです。 VLM みたいなものを頑張ればあるいは、ということはあるかもしれませんが、いずれにしろその分野はまだまだという印象があるのと、一方で「言語」の世界にさえ落ちてしまえば今の frontier model の性能ならかなりの情報を察することができるだろうなという感覚があるのと、単純に手元に Claude Max subscription があるのでそれぐらいしか手段が無いためです*3。 そのため、最初に動画からの文字起こしをさせることにしていました。

結果

エージェントがタスクを整理してどんどん進めていく、ということそのもので困ることはあまりありませんでした。 本質的にプロセスをどうこうする必要もあまりないタスクなので、Anthropic のブログ記事にあったような pkill -9 bash のように自爆することもありませんでした。

ただ、最初はずっと文字起こしで問題を起こしていましたね。 YouTube での自動文字起こしと whisper での文字起こしを併用していたんですが、動作させていたコンテナに GPU リソースを渡していなかったのでずっと CPU ベースで whisper を走らせていて、エージェントが whisper を待っている時間の方が明確に長かったです。

さらに、文字起こしの精度が微妙で、それに引き摺られて誤った解釈を引き回し続けていることがそこそこありました。 ライって誰だよ。 ここは GPU を与えるか、gpt-4o-transcribe か gemini あたりの token を与えて LLM ベースの文字起こしをさせるか迷ったんですが、途中でループを止めたりするのもなんか違う気がしたのでそのままやらせてみることにしました。他の手段として動画に焼かれている字幕の認識などもタスクとしては積んであるものの、これは記事を書いている今もまだ道半ばというかんじなので、そのためにも見守ることにしていました。

しかし、それ以外の Web 開発的なところは特に詰まるところはなく、さすがの Opus 4.6 というかんじでした

アニメーションする軌道遷移図

とはいえ考証として見ると問題はかなり多く、途中でかなり人間による介入を行いました。 人間による介入は claude -p で指定している AGNET_PROMPT.md 内に追加指示用の場所を設けることで行ったのですが、これにも課題がありました。

最大の問題は、Claude が以前のセッションで生成した誤りや勘違いに引き摺られてミスり続けることです。 特に今回の場合は『正解』や『仕様』の設定しにくい問題設定だったので、AI Agent に実装の後にテストを書かせると単にパスするだけの無意味なテストを書く(なので TDD が効く)ように、微妙な物体の山が積み上がっていくようなやつが発生しやすかったです。 中でも、各エピソードごとの分析を元にエピソード間の整合性を分析する部分においてそのような挙動が見られました。

この対策として、途中の介入では以下のような指示を行いました。

  • 分析のためのコードは使い捨てにするのではなく CLI から操作しやすいインターフェースにする
  • 各エピソード分析記事内の各分析の再試をしやすいデータ構造にして、常に各分析を走らせる

これはようは「分析」をテストとしてみてテストハーネスを作るようなことですね。 これによって分析の修正の容易さや分析の修正からの他への影響の検知などはだいぶマシになっていた印象があります。

一方で、こういった追加指示は端的な方向性のみ指示して設計は Claude に任せるスタイルだとどうしてもイマイチな印象も正直ありました。 というかまあ、分析の中身とか可視化のやり方については結構な頻度で具体的な追加の指示を突っ込んでいました。なので全自動というのは実態としてはかなり FAKE です。

普段のやり方との差分を考えると、じっくり plan してから作業とかしていないのでまあそうかなとは思いつつ、じゃあどうするとよいのかまではあんまり見えてないです。AskUserQuestion をいいかんじにファイル化して適当な非同期インターフェースで聞きつつ、情報が集まるまでは他のタスクを実行する、ぐらいのループの制御はするといいんですかねぇ。

ただ、「その軌道遷移は成立するけど物語としてそんなに時間かかるのは不自然だろ」みたいなやつとかに気付けない、みたいな問題は仕組みの問題というよりは LLM の時間感覚のなさというか、物理世界接地していなさを感じる部分でもありました。

後日談というか、今回のオチ

で、どうなったかというと、2~3日で 200 USD Max の weekly rate limit が売り切れました。かなしい。 Anthropic 社員には rate limit とかなくてこういう実験をしやすくてズル(それはそう)

You've hit your limit

微妙に関係ないですが、Opus 4.6 fast とかはああいう社内での色々な実験のフィードバックループ速度を上げるのに便利なんだろうなと思うなどもしました。

しかし、自動分析という今回の実験自体にはまだまだ課題はあったものの、SOLAR LINE 自体の描写の正確性はやはり高いなとやりながらも感じていました。もちろん、ものすごく複雑な軌道設計とかがあるわけではないですし、規模の都合上かなり惑星の位置関係の都合が良さそうな想定ではあるなとは思ったものの、専門でない人間がナイーブに考えたらよくやるようなミスというか、詰めの甘さみたいなものは感じず、結果として自動分析自体のデバッグもしやすくて便利でした(分析レポートを読んで違和感を覚えたら分析側が大体おかしい)。

まだ分析としてヘンであったり詰めの甘いところは多々あるのと、この記事を書いている間に weekly rate limit がリセットされたので、またたまにループを回して中身のブラッシュアップをしていければと思います。

*1:正確にはガンダムは最近水星の魔女とジークアクスは観ました。ゆえぴこさんの更新待ちの間に AbemaTV の無料公開期間とかで......あと後者はタイムラインでの連日のネタバレ合戦がウザすぎて......でも結局 not for me かなあとは思いました。わざわざ言うことでもないんですが。

*2:これは用途や使う人によっても印象が分かれているところではあると思いますが、GPT 系は勝手にすべてを一撃でやり切ろうとするのでフィードバックループの構築には明らかに不向きで、それは human in loop みたいな場合でもそう、という印象が強いです。あくまで「回答」を生成する対話のために訓練されており、問題解決能力はあまり無いという印象です。ここまで LLM が盛り上がって競争が激化して、各社のモデルが似たようなところに収斂するのではなく明確に「個性」が出る方向になっているのは面白いなと思っています。

*3:GPU は RTX 3090 一枚ぐらいしかないので、最近また多少盛り上がりがあるとはいえ Local LLM でやるのはまだしんどいです

GNSS ログをいいかんじに可視化する

みなさん移動してますか?

僕は油断すると引きこもり的な状態になってしまいがちです。理由としては、生活リズムが一般的な位相からズレがちなことによって、外出できる気力のあるタイミングと外界が便利であるタイミングがあまり揃わないからです。以前はそれでよく食事が fail していたんですが、最近は冷凍食品のレベルが高くて助かっています。一方で食事による生活リズム矯正圧は弱まってしまったとも言えます。なんの話だ。

それはそれとして、移動することはあります。身体性があるため。言語モデルにできないことをやっていきましょう。 一方で、身体性をが必要なタスクはヒューマンがやらされるということでもあります。ハーネス作りとかハーネス作りとか。なんの話だ。

移動の話に戻ると、普段はかなり引きこもり一歩手前ぐらいの状態になりがちなんですが、僕は移動する時は結構な距離を移動しがちです。 一番頻度が高いのはオフィスへの物理出社で、これは家がつくばでオフィスが有明なんで結構距離があります。TX が十分に高速なので物理距離 / 論理距離のパフォーマンスはだいぶいいんですが、まあ遠くはあります。往復したら「宇宙よりも遠い場所」ですね、とか適当なことを言いがち。

他にも、(最近全然行けてないですが)旅行でもやや距離ガバの気があるような気がしています。車と免許は無い癖に、気持ちが出ると急に新千歳に飛んで札幌と洞爺湖でそれぞれ一泊して函館から帰る(全部無計画)、みたいなことをする場合があります。ちなみに函館は空港に着いたのが本当にギリギリで手荷物検査場しか記憶にありません。この話を元道民の友人にしたら困惑されました。周辺の人間の挙動を見ていると、普通自動車運転免許が無いためにこの程度で済んでいるような気はうっすらしています。

他には、出張にもちょいちょい行きます。特にここ数ヶ月は月イチぐらいで北海道・長野・福井とかに行っていて、よく考えたらソフトウェアエンジニアとしては結構珍しいことかもなとなるなどしました。正確には最近入ってくれた同僚に驚かれて気付きました。

微妙に関係ないですが、ここ数ヶ月くらいの Devin の性能がかなりいいかんじになっていて、仕事ではかなり使い倒しています。 やっぱり向こうに VM があって自走力が高くなるようチューニングされてるのは便利ですね。高いけど。 これがどう元の話に接続するかというと、移動中に使うのに便利なんですよね。

トンネルに入ると手元の Claude Code では何もできなくなるけど Devin ならやれる、これは大きな違いですよ(そうかな?)

あと、出張中みたいな焦りやすい状況下での on call 対応っぽいところでも便利。奴ら焦りませんからね。*1

ということで(?)、そこそこの距離を移動することがちょくちょくあるんですよね。 このようにそこそこの距離を移動していると、自分がどのように移動してきたかというメトリクスが気になってきます。 あと、経費清算とかする時に「結局実際はいつどうやって移動したんだっけ?」みたいなことが気になったりします。景色とかの映像記憶はあるのだけど駅名とかは覚えていないがちなどもある。

この問題に対して何かを自作しようかなあとかじんわりと数年ぐらい思っていました。思っていたんですが、思っているだけだとどうにもならないので、一旦プライバシーとかはさておいて長い物に巻かれようと考え、ここ数年ずっと Google map の timeline 機能を愛用していました。

k-tai.watch.impress.co.jp

はい、というわけで事実上使えなくなりました。データ管理を自作するのが面倒だから長い物に巻かれていたのに、Web から使えないなら個人的にはほぼ無意味といっても過言ではありません。デバイスも複数ありがちですし。

なので、そろそろ重い腰を上げるかな、と思っていたのでした。近年はやるだけ距離が長いだけのものはやるだけ距離縮地機械であるところの coding agent ってやつがありますし。

......と思っていたんですが、思ったより作りたいモノが多くて、ヒューマンがボトルネックになっていてずっと手を付けていませんでした。あと、最初はデバイスの自作に気持ちがあって、省電力設計と QZSS 対応のいいかんじの GNSS モジュールの選定がめんどくて手が止まっていました。

で、そんなことを思いながら、たまにデータの収集自体は試していました。これも実はよく考えてみるとあんまり単純な話ではなくて、仕事で人工衛星の姿勢制御系とかやっていることもあって、GNSS の信号や測位の品質とかも気になってきてしまいました。難儀。なので、「とりあえずスマホで取れるデータ全部取れるやつないのかな」と思って探した結果、Google が GnssLogger App という直球のモノを出していました。

play.google.com

これは本当にちゃんと色々なデータを取ってくれるのでずっと動かしているとストレージと消費電力がアレではあるんですが、十分に電池持ちのよいスマホと、どうせ長距離移動する時にはデカいモバイルバッテリーとか持ってるだろうということで、たまの出張の移動時とかに思い出したらデータを取るだけ取っておく人になっていました。

ちなみに、新幹線とか飛行機でも、窓にスマホを押し付ける奇行をすると側面方向からでも結構測位できることにはできます。 変な人ではある。このようにしてチマチマ貯めていたデータだけはありました。

さて、そんな中つい先日、人に誘われて(?)筑波山に登りました。 ここでも例によって思い出したようにログを取っていたんですが、帰宅途中に「今の Opus 4.6 の性能なら可視化・分析だけにスコープ絞れば数時間で結構そこそこのモノができそうだよなあ」と思いつき、帰宅してからこの GnssLogger App のログを可視化するツールを作り始めました。

で、真にその日中にできたものがこれです。

どうやら帰宅したのが18:30とかっぽいので、これは開発開始5時間半後ぐらいの状態ですね。 なお、最初の 0->1 では API の互換性とか何もあったものではないので並列作業とかはほとんどしていないです。

データ管理部分はあとからやるにしても最初に手を付けたくは絶対に無いのでフロントエンドのみ、デプロイも GitHub Pages にしています。 そして、ほとんどのロジックは Rust で実装し、デプロイ時には WebAssembly ターゲットにビルドして組み込んでいます。

この理由は2つあり、

  • GnssLogger のデータが結構大きく、筑波山登山~下山くらいでも1GB長のファイルをパースする必要があり、ある程度のパフォーマンスが必要
  • unit test がしやすい(#[test])だけでなく、ロジック部分を CLI などでも扱えるようにすることで、ブラウザ(Playwright)まで持ち出さなくても E2E 的なテストが高速かつシンプルにできる

からです。特に後者は、Agentic Coding では解区間を抑え続けるために TDD のアプローチが非常に有用である一方で、Web app で E2E test をやりすぎると Actions で破産しフィードバックループの速度も落ちるため、これに限らずやはり重要だなあと最近強く思っています。AI Agent 関係の小手先テクニックは正直モデル性能の進化でほぼ解決するだろうと思っていたし、ここ数ヶ月の様子を見ているとやはりそうだったなと思うところではあるんですが、これだけはまだ明確に効きがいいですね。むしろここ数ヶ月のモデル性能の向上で「一発正答率」みたいなものがだいぶ上がったからこそ価値が上がっているように見えます。変わるとしたら context window ってやつがどうにかなる時ぐらいなんですかね。

それはそれとして、こういう Web ベースの可視化ツール、ないしはそういうクライアント付きの物体を作ることが最近かなり多い*2んですが、DuckDB-wasm と uPlot の組み合わせが激便利でいつも助かっています。

あと、標高の3次元データをもとに立体的な可視化をすると、登山してる時とか飛行機乗ってる時みたいな高度変化があるケースはエモいかんじになっていいですね。

筑波山登山(全体俯瞰)
新千歳空港から成田空港(全体俯瞰)

山頂付近から急に直上に上昇しているやつはたぶん展望台です。高度の精度がガバガバなのと、IMU の補正も入れてるのでそれが大きく出すぎた気はしてます。ただ、IMU の補正やスムージングをある程度ちゃんとやらないとだいぶガクガクするのでそこのトレードオフが少し難しいですね。そこらへんのロジックも Rust 側にあるのでテスト自体はだいぶやりやすいです。適切なエッジケースのデータがあればもっと詰められると思います。

スマホから直接見られるとよいなと思ってスマホ対応もしてあります。割とヌルヌル動く。

筑波山登山
新千歳空港から成田空港

今回作った物体はここに置いておきます。

sksat.github.io

github.com

*1:焦る振る舞いをしろと書いたら焦りそうで、それはそれでヘンテコな気もしつつ

*2:今年だけでもこれで5個目か6個目ぐらいな気がする

2025年ふりかえり

気が付いたら年末というか、大晦日になってしまっていたのでさっと今年の振り返りをしておきます。 去年の大晦日も慌ててブログを書いていましたね......

sksat.hatenablog.com

そうだったんだ。そうかも。

来年はもう少し外行きの文章(?)を残していきたいですね。

1月

OtakuAssembly Vol.3

1月で一番印象に残っている、というか大変だったのは OtakuAssembly Vol.3 ですね。 やるやる詐欺を繰り返し......てはなかったけれど、一度存在自体が落ちた Vol.3 をついに出すことができました。

果たして我々は学生だったのか

技書博への参加を決めたのが2024/09/28のこと。

しかしまあこうなるわけです。

なお、first commit は 2025/01/03 のことでした。

ちなみに、過去の自分の陰謀によって default branch name がひどすぎるものになっていました。

ところで、1月に作業開始しているということは、作業時間が1ヶ月未満だということです。たいへんですね。 最初の締切は01/15でした。ちなみに衛星の打ち上げも01/15でした。なんてことだ。

ちなみに01/05に id:pepepper を引き入れました。書くって言ったからね。

ただ、この後にも少し書くんですが、この時期は衛星運用というやつが本当に大変で、平日は仕事でコンテキストを喰い尽くし、深夜と土日にサークル準備・執筆・編集をやるのは命が削れました。マジで。

01/12~01/14は id:hsjoihs をつくばに幽閉して原稿合宿的な状態になっていました

ところで01/15というのは元々想定していた印刷所の真の締切です。 そして、原稿はまったくできていないということはないけれど、これだと結構薄いかも、という状態でした。

僕は僕で、ページ数はあるけれど全然書き切れていない、という状態でした(01/13: 41p)。

そこで、01/14に印刷所を変更しました。もう前回から5年も経っており、社会人や事実上の社会人も多く資金力のある集団が、金で締切を伸ばす権利の存在を知った時にどうなるかは自明の理でしょう。 こうして締切が01/21になりました。なんと一週間近く伸びました。金はすべての問題は解決しないが、あらゆる問題を癒す。

そして、この頃になって表紙・裏表紙の素材が無いことに気付きました。 あの写真は毎回なんかテックな様子をオタクのいいカメラで撮っているんですが、僕はフィルムカメラしか持っていないですし、つくばにいるので他のみなさんからはちょっと遠いです。 PG_MANA も忙しそうにしていたので、アイツに撮ってもらうのもちょっと大変です。

そこで id:puripuri2100拉致誘いました。原稿まで書いてくれるなんてうれしいなあ(すっとぼけ)。

こうして表紙・裏表紙と執筆者は確保できたわけなんですが、01/15に仕事が打ち上がってしまったので僕の執筆状況はより険しいものとなっていました。頭が動かなくなってきたら他人の原稿の校正・校閲をして戦略的に数時間だけ寝てまた書くみたいな、そういうやつです。

ちなみに執筆中に Falcon9 Transporter だけでなく Starship も飛んだので情緒もヤバかったです。

マージ済みの原稿は、記録が残っている限り以下のような状態でした。 - 01/18 23:53: 171p - 01/19 20:37: 228p - 01/20: 12:31: 258p - 01/20 12:39: 258p(入稿)

01/19 に表紙・裏表紙の撮影を実施しました。

ダウンロードカードは技書博前日夜から作り始めました。 ダウンロードカードは技書博前日夜から作り始めない方がいいです。 ダウンロードカードを裁断するためのハサミとかを買いに行ったスーパーで会った id:namachan10777 を拉致してにダウンロードカードの作成を手伝ってもらいました。 あと、大量の千円札とかももうちょい前に用意しておいた方が寝られます。

ちなみに奨励賞をいただきました。なんかウッカリ学生扱いで貰ってしまったような気がうっすらしているんですが、学籍はあるので許してください。

余談ですが、ドアがあるタイプの地下駐車場の制限時間はよく確認しておいた方がいいです。

命が削れるとよく眠れます。削れない方がいいです。

ただ、無茶と引き換えに Vol.3 はだいぶいい出来になったと思うので、みなさんぜひ買ってください。 booth.pm

衛星運用

OtakuAssembly の次に大変だったのが衛星運用です。 なんなら執筆中に AE1c、AE1d が打ち上がってしまったので個人的には火の車でした。

arkedgespace.com

ちなみに、うちの衛星が増えると arkmap という Web アプリにも表示されるようになります。 はやくこの地図を動く点で埋め尽くしたい。

arkedge.github.io

仕事の話なので何がどう大変だったとかはあんまり書けないですが、端的には、我々がすべてを自前で作った 6U 衛星の運用は 2024年末打ち上げの AE1b が始めてで、まだ衛星運用そのものにもそこまで慣れていない、なんとか慣れつつあるところ、という状態で2機追加され、コンテキストが一気に3倍になった、みたいな大変さです。大変でした。

2月

会社がシリーズBで80億円調達していました。 arkedgespace.com

この時は数字だけ見ても実感湧かないなと思っていたんですが、今見るとやっぱり多少ヒリつきます。大きい金額に見えても(いや大きいんですが)、ハードウェアは本当に金がかかる。

この月は久しぶりに会社説明会もやりました。 アークエッジ・スペース 会社説明会(衛星組み込みソフトウェア・衛星管制システム・他ソフトウェア開発) - connpass

ソフトウェアエンジニア、引き続き採用中です。 宇宙とか人工衛星のことは入ったら嫌というほどやるし、幅広い分野の同僚がいて、全員聞いたら色々教えてくれるので、知らなくて大丈夫です。興味すらなくてもいいです。物理から事業までレイヤーを跨ぐ複雑な問題を解きたい人はぜひ。

ちなみにこの説明会では僕は話はせず、完全に裏方役をやっていました。あれはかなり AD 業だった。アドリブですが。 VR の会社でもないのにオフィスで Valve Index と Vive Tracker の調整することあるんですね。

この頃、僕が所属している(というか、作った)姿勢制御チームに id:Lugendre が入ってくれました。入ってくれたというか、僕が引き込みました。 このときはまだうちのチームは組織図上は非公式のチームだったんですが、全社共通のオンボーディングの途中からしれっと誘拐して呼んで、うちのチームのオンボーディングを丸一日かましていました。 今では衛星運用や姿勢制御に使う座標変換周りの検証・実装などで活躍してもらっていて、本当に助かってます。

あと、なんかやたら hsjoihs と会っていました

深夜テンションでよくわからない動画を作ったりもしました。なんなんですかねこれ。 Davinci Resolve、触る度にバージョンが上がっている気がする。 www.youtube.com

3月

Coding Agent

mizchi 氏が魂震わせてるなーと思って、隙を見て Cline を触るなどしていました。あと OpenHands とか。 zenn.dev

今思うと正直 Cline はかなり過去のものという認識になっていて、あそこからまだ1年も経っていないと思うとやはり LLM の進歩はすさまじいです。

流石に片手間の趣味に 500USD / month は払えねえよと思って会社に Devin を導入するなどもしていました。*1

この頃から、「会社で一番エーアイ詳しい人」ポジになっていった気がします。

謎の 1on1 活動

あと、Twitter で謎の出会い厨(?)ムーブをして、何人かと謎の 1on1 をやったりしていました。みなさんその節はありがとうございました。 人と話すのは全然得意ではない(特に話題を振るのが下手)んですが、組織とか問題解決みたいな話題は得意(?)です。引き続きじんわり募集しています。

Bigscreen Beyond 2e

その他では、Bigscreen Beyond 2e を衝動買いしていました。 Beyond 初代は既に持っていて愛用していたので、"e" の部分に惚れ込んで買ったはずなのに、まだ全然試せてないですね。脳内 ToDo スタックのかなり奥深くにあります。

4月

実は休学していて、復学しました。

つくばは大体鬱屈とした空気を纏っているのですが、春の一瞬すごく桜になるのは綺麗だけどちょっと躁鬱ムーブすぎるなと思っています。

5月

4~5月あたりは仕事と講義とセキュキャンの準備*2の間で振動しまくっていたこともあり、他はぼちぼちでんな、というかんじでした。 朝起きて大学行って講義受けて TX 乗ってオフィス行って仕事して帰ってきて深夜にセキュキャンの話をする生活は、毎日でこそなかったとはいえ、かなり無理がありました。二度とやりたくない。せめて二つ。

タコス

ごくまれにソフトウェアとハードウェアだけでなくタコスも自作します。いや、タコスはハードウェアかも。 コンビニでライム売ってほしい。

一人でやるとトルティーヤ作りがまあ結構大変なのでそんなに続かないかなと思ったんですが、7月あたりに Morino Campo Noble という店を知り、ここで冷凍のトルティーヤを入手できるようになったので、頻度はものすごく低いものの続いてはいます。

たまに余裕があるときはハムとチーズを挟んで焼いて食べたりしています。ケサディーヤ(Quesadilla)というやつ。手軽でおいしい。 molinocamponoble.com

Google map timeline (Web)

Google map のタイムライン機能が事実上死んで悲しかったです。 気分によってはプライバシーにかなり気持ちがあるのでクラウドにこんなにプライベートなデータが保存されてほしくない、それが勝手に使われてほしくないという気持ちはすごく分かります。 ただ、すごく分かるからこそ、そういった気持ち悪さやリスクより使いやすさというメリットを取って使っていたので、そんなにどっちつかずな物体になられると困る。

時間のあるときに†vibe coding†で適当な代替を作ろうかなとは思っているんですが、時間のあるときに作りたいものの枠がいつもパツパツなので未だに作っていないなということをこれを書いていて思い出しました。

VRC-LT

VRC-LT で久しぶりに登壇しました。あんまり外に出せるおもしろい話が無いなあと思ってだいぶ惰性かつ直前になってスライドを作っていたんですが、意外とウケがよかったです。 VRC-LT はかなり広範な話題が飛び交う VRChat 上のイベントで、雰囲気はゆるいのに質は高いものが多くて、好きなイベントです。ある意味で Kernvl/VM みたいな少し独特の雰囲気があります。

speakerdeck.com

6月

技術書典

技術書典18にサークル参加しました。 とはいっても、1月に作った Vol.3 と既刊を頒布しただけなので、大したことはしていません。 というかこの時期に大したことをするのは不可能 of 不可能でした。

売り子してる横で id:pepepper がずっとリアルモードのデバッグをしていました。なんで? なぜかというとワープロにおしながきを表示していたからですが......

関数型まつり

るじゃんどるに誘われて、関数型まつりに行きました。 普段馴染み深い低レイヤのコミュニティとは接点はあるもののだいぶ異なるコミュニティのイベントだったので、視点が違っておもしろかったです。

このセッションが関数型の布教にべんりそうでよかったです。

セキュリティキャンプ選考

例によってつくばに id:hsjoihs を幽閉し、しました。 セキュキャンの選考、仕事でもそうそうないタイプの重い意思決定なので毎回大変なんですよね。 あと単純に締切がいつも激短い。パツパツに仕事してるとね、1週間というのは2日なんですよ。

打ち上げ

仕事の方では、AE2a、AE3Va が Transporter-14 で打ち上げられ、運用を開始しました。 prtimes.jp

これも仕事なんであんまり詳しいことは書けないですが、AE1b、AE1c、AE1d でだいぶ今の会社のメンバーが衛星運用というものに慣れてきていたので、かなりスムーズに初期運用が進んでいました。 やはり細かく多いイタレーションは正義。

仕事とは直接は関係ないですが、H-IIAロケット50号機が有終の美を飾っていたのもよかったです。 ほとんど自分と同い年ということもあって、ずっと(勝手に)馴染み深さを感じていたロケットでしたし、何より近年の日本のロケットの様子を見ていると本当にちゃんと安定していたのだなと思います。 まあ、それはそれとしてユーザー目線では年30回くらい安価に上がるロケットが欲しいなとは思いますが。 www.youtube.com

AI

あと、この頃あたりから Claude Code がようやくまともに Rust を書けるようになり、仕事での AI 活用がだいぶ進めやすくなった気がします。

僕の(メインの)チームは AOCS、姿勢制御系というやつなんですが、このチームはとにかくやることが多いということもあり、会社で最も Coding AI Agent、というか Claude Code を活用しているチームになりました。*3

ただ、ハードウェアをやっていると(≒ Web だけをやっているわけではないと)、エーアイ最強、もう仕事だいぶ無くなった/変わった、と思える日はだいぶ遠いなと思う。

LLM が大規模"言語"モデルである以上仕方ないとは思いつつ、あいつら現実世界に接地していなさすぎるんですよね。 ヒューマノイドとか自動運転も盛り上がっていることだし、バブルの崩壊の前までにどうにかならんもんなんでしょうか。

7月

ふと会社の Slack を見たら4周年お祝い表示になっていて驚きました。

あと、徹夜でセキュキャンの教材のハンダ付けと発送をやっていたら25歳になっていました。 なんならそのまま成田空港に行って出張というめちゃくちゃな瞬間でした。

この同僚はあっという間にあらゆることを吸収していって PM になっていて本当にすごかった。

リュック

8年振りにリュックを買い換えました。容積がちゃんとある上で PC の出し入れがしやすくてとても便利です。

webshop.montbell.jp

今年のベストバイ賞を与えるとしたらコイツかもしれません。

大学とか

大学に関しては、復学はしたものの結局単位を取るのはずっと下手なままでした。 ただ、講義の予定をすべて Google Calendar に突っ込むことによって、そこそこ講義にちゃんと出席することができたのはよかったです。休学前よりはだいぶマシでした(休学前がひどかった)。 得るものはあったと思うし、(ハードルがものすごく低くなっているけれど)単位も少しは取れました。 しかし、課題の期限さえ見誤っていなければ救えた単位がかなりあったので、大学生としては微妙なかんじでした。単位取るの下手すぎる。 あと講義受ける度に謎のツールが生まれがち。課題やれ。

ただ、色々と無理はあったので、10月からはまた休学しています。大学をバンバン制御するな。

8月

だいたいセキュキャンの月だったと言っても過言ではありません。 今回は「探査機自作ゼミ」としては2回目だったのと、今年全体のふりかえりにマージしてしまったこともあるので、Togetter 方式で簡単にまとめておきます。

ゼミの設計や意図などについては去年の記事をどうぞ。 sksat.hatenablog.com

今年の教材スライドも公開してあります。 speakerdeck.com

1日目

例によって _Alignof の車で会場まで乗り付けました。

今年は台車があってとても便利でした。あって、と書きましたが前日ぐらいに id:totsugekitai に借りました。

初日はとりあえず開発コースの部屋にモノを展開し、3Dプリンタを動かしたり例によって当日になって当日の教材スライドを作ったりしていました。

今年は色々あって講師が会場に泊まることができなかったので、近くにホテルを取っていました。 しかしあの会場の近くにはろくに宿泊施設が無いので本当に苦労しました。 途中までホテルより距離が近いウィークリーマンションを狙っていたのですが、あんまり前からは予約できなかったためタイミングを逃して予約できず、結局直前にホテルを取ることになり、2人扱いでなら予約できた、会場からの直線距離が短いホテルを取りました。

これによって空間と金が一人分ダブついていたので、最悪家からも行けるのでホテルを取っていなかった id:hsjoihs を誘って運命共同体になりました。 直線距離の短さを選定理由にしたのは、余裕を持った起床はだいぶ諦めており、タクシーで会場まで乗り付けるつもりだったためです。場所同じ人間がいるとタクシー代も割れるし。

2日目

elf2uf2 が Rust のバージョンが新しいと破滅していてすごく困りました。 一旦みなさんの Rust バージョンを固定して凌いだんですが、より深淵な理由でなくて本当によかったです。 あの場でツールチェーンのデバッグをするのは焦るしタイムロスも痛いので。

3日目

3日目午後にして PM が自然発生し、やらないことを決め始めたのがとても印象的でした。

4日目

マージ大臣が発生していました。

時間内に、なんとかシステム全体を統合した上での中庭での走行実験まで辿り着きました。

ホワイトボード

今年は正直ホワイトボードは不足していました。去年がありすぎただけともいう。

ポータブル秋月

今年は他の講師から秋月電子通商の派出所か何かと思われていた気配がありました。 せっかくマキシマリストとして†すべて†を持ち込んでいるので、それが活用でき、他のゼミの体験も向上したなら何よりです。 もちろん、完全にそれをアテにされると流石にちょっと困りますが。

総評など

今年は会場の変更やそれに伴ったり伴わなかったりする運営のゴタつきがあったため、当日に辿り着くまでがだいぶ大変というか、正直しんどかったです。その上で宿泊施設が分かれているのは本当にキツかった。これは他の講師陣も(たぶん全員)感じていたところだと思うので、改善を切に願いたいです。手伝えることがあるなら手伝いたいところですが、どうなんですかねといったところ。セキュキャンは年に一度のお祭りなので良い意味でも悪い意味でも「文化祭」っぽいところがあって、1年経つと前回からのフィードバックがスッポリ抜け落ちている部分がかなり大きいと感じています。それでもみなさんの熱量あってあの他では再現不能なクオリティに到達するのは良いところですけどね。しかしだからこそ、運営上の問題はとても勿体ない結果を産んでしまうと思っています。

辛気臭い話はさておいて、中身の方に話を戻すと、今年も幣ゼミの受講生はとてもよくやってくれたと思います。 特に、公式の時間内にすべての統合を完了して、地上局からテレメトリを見ることもでき、その様子をトラック内発表でも話してくれたことは本当にうれしかったです。偉業です偉業。

偉業なので、シャポコさんの「偉業」スタンプを3Dプリントして、hikalium さんに偉業をみなさんに授けていただきました(?)

www.thingiverse.com

探査機自作ゼミの教材は3日ではすべてを作りきることはまったくできないように作っています(オイ)*4。そのためチームでどうゴールを設定し、時にはゴールや設計を根本から考え直し、やらないことを決めながらどこに辿り着くのか、ということがテーマになってくるわけです。

そういうゼミ設計なので、ここまで到達したのは本当にすごいことだと思っています。 みなさん誇っていいですよ。本当に。

ただ、これにはカラクリもあって、今年の受講生はものすごく LLM を活用していました。 4人の受講生全員の PC をいつ見ても、ChatGPT が開かれたブラウザか、terminal に gemini-cli がいる VSCode かのどちらか、次点で GitHub が全画面で開かれているんですよね。 実際時系列を振り返ってみると、何か新しいことをやる時にとりあえず走り始めるまでは本当に速かったです。

そして、同時にすごく LLM に振り回されてもいました。 これには時期的な要因もすごくあると思っていて、あの時期に普通に学部生だと、たぶん大学の講義のわからないところを調べるのとか、課題をやるのとか、趣味で Web 開発をするのとかだと、(学生が無料で使える ChatGPT、Gemini とかでも)ちょうど LLM に全乗っかりできてしまうぐらいの時期だったんですよね。ChatGPT も GPT5 が出たぐらいのタイミングでした。

しかし、組み込み開発はまだそこまでできるというわけではありませんでした。 これはモデルの学習データが少なかったり、モデルの問題解決能力の性能の問題ももちろんありつつ、組み込み開発ってコンテキストが絶対にローカル PC 内だけに収まらないので、LLM を活用する場合、如何に適切なコンテキストを人間が解釈・選択して LLM に渡すかが Web 開発の比ではないくらい重要になるんですよね。

これが組み込み開発初心者には非常に難しい。さらに、モデルはできるだけ早く(それっぽい)ベストな回答を出力することを目的に学習されているので、すぐテキトーに「原因が完全に確定しました」みたいなことを言い、その妥当性を確認する経験や手段が無く、それを盲目的に信じてしまうと、人間と LLM の両方が exponential にハルシネーションしていきます。

その状態でプロジェクトを進めていくと、いわゆる「PM が技術分かってなさすぎて大炎上」みたいな現象が、プロジェクト全体と各個人の手元で同時多発的に発生するんですよね。あれはあれでおもしろい現象でした(他人事)(オイ)。 個人的には「使えるものはできるだけ使え、だから LLM が有用ならどんどん使え」というスタンスではあったのですが、ああいう教育の場での扱いというか、向き合い方はちゃんと考える必要がありそうです。

とはいえ、今年の受講生のみなさんも、どういう時には LLM が活用でき、どういう時には活用できないか、ないしは、LLM 任せでは太刀打ちできなくなったときに、どういう能力を身に着けておかないと振り回されるばかりになってしまうのか、ということを身をもって体感できたのはよい経験になったのではないかとも強く思っています。

その後

めちゃめちゃ疲れていたんですが、テンション上がっているので逆にすぐには休めないということもあり、なぜか講師集団で会場の目の前にあったサンリオピューロランドに行きました。

9月

白虎

油虎の白虎は本当にすごいと思います。油虎に行く度に設計について考えさせられることになる。 設計に悩んだ時には食べに行きたいのですが、無限遠*5にあるので、無免許が行くのには少々ハードルが高いのが難点です。

アストロキャンプ成果報告会

サークルの後輩でうちの会社でインターンもしてもらっている 771_8bit 氏が企画したアストロキャンプ衛星開発ゼミの成果報告会を聞きに行くなどしていました。

よくわからないけどアストロキャンプ運営方面の人々から思想家扱いを受けています。たすけてくれ。

まあ、たまにこういうことやってるからなんだとは思う。

4年割と本気でやるとだいぶ色々見えはするので解釈というか、コンテキストはだいぶ飲み込めたかなとは思ってはいるものの、(こういうこと言うとそれはそれで雑すぎはするのですが)「作った、上がった、動いた」以上の実を結ぶところまではまだまだ到達していないので、実を伴わせていきたいところですね。

洗濯乾燥機

洗濯乾燥機を買いました。なぜ今まで買っていなかったのか。 洗濯から解放されてはじめて人は自由になれると思う。

映画 大長編 タローマン 万博大爆発

なんだこれは

作って理解する仮想化技術

レビューに参加していた、 PG_MANA 著の『作って理解する仮想化技術』が発売されました。 gihyo.jp

10月

なんだこれは

仕事の方では、AE2a というリモートセンシング実証衛星がフルサクセスを達成したり、なんか知らないうちに自社地上局が増えたりしていました。

arkedgespace.com prtimes.jp

11月

第69回宇宙科学技術連合講演会、通称うかれんに行きました。

去年は聴講だけだったんですが、今年は会社のオーガナイズド・セッションで登壇しました。 朝だったのと思ったより部屋が大きかったのもあって緊張してあんまりハッキリと話せなかったのが少し心残り。 人前で話すやつって本当に場数の問題なので、来年はもうちょい機会増やしていきたいところです。 speakerdeck.com

何日目かの昼にあった、中須賀先生主催の「失敗学」のディスカッションはよかったです。 ただ、生意気ソフトウェア野郎としては、「失敗」に対してはあの話よりもっと前のめりになるべきだと個人的には思っています。 「失敗」という事象の経緯ではなくそれ自体が解釈されることが少なく、「起きたらどうするか」「次起こさないためにはどうするか」という話ばかりがフィーチャーされて、一歩ずつは進むが問題の構造が変わらないままでは片手落ちではないかと。

なお、今年のうかれんは札幌開催だったので、仲良くさせてもらってる札幌の会社の人と飲みに行きやすかったのが便利でした。 うかれんの本番は毎日夜の懇親会なので*6この週は毎日のように酒を飲んでいたわけですが、普段は全然アルコールを摂取しない人間なので珍しく酔ったなこれは、となるなどしていました。まあ、飲まないだけで弱くはないので別にヘンな状態にはあまりならないのですが。

また、微妙に打ち上げが延期し続けてうかれん期間には間に合いませんでしたが、Transporter-15 でうちの会社の衛星の AE5Ra、AE5Rb、AE5Rc が打ち上げられ、運用が開始されました。

12月

KernelVM 探検隊@金沢 Part 8 に行きました。 k/vm はここ何回かは物理的な都合があまり付かず、YouTube 配信だけ見る状態になっていたので、久しぶりに現地に行けてよかったです。 元々行ったことがあるのも東京開催のときのみだったので、地方開催はいい意味でだいぶ雰囲気違うんだなーと思いました。 金沢に行くの自体もだいぶ久しぶりだったので、色々と新鮮でした。 k/vm はなんだかんだで今まで登壇したことはないので、登壇もしたいですね。

Google Summer of Code Meetup

Google Summer of Code Meetup が珍しく日本で開催されるとのことだったので遊びに行ってきました。 GSoC やってたの、もう5年も前なので今更ではあるんですが、毎年 ML に「今年は**で開催します(海外)」というメールが来るのを脳内フィルターが濾過していて若干もどかしい気持ちがあったのと、 id:gpioblink が誘ってくれたので行ってみました。

なんだかんだで Google のオフィスに行くのは初めてだったので、なんというか、資本を感じました。 金があると東京にも世界を作ることができるんですねえ。 単純にあの空間に入ると急に英語になるみたいなのもありますが。 あと、帰りがけに横目で見ただけですが、噂の DDR もありました。あるんだ。

今年は海外出張はしなかったこともあり、英語やらんとなという気持ちにも久しぶりになりました。 出張はしないでもたまに英語のミーティングとか面接とかもありますし。*7

仕事

仕事の方は、今関わっているプロジェクトがだいぶちゃんと回り始めたかな、というかんじです。 組織改編後の働き方が周囲も自分も段々見えてきたということでもあるのだけど、今まであった最も大きな構造的な問題がある程度整理された上で、自分が1年以上主張していた問題解決にようやく本腰を入れることができる場が整ったので、だいぶ感慨深いです。 その代わり、自分の主張がかなりダイレクトにプロジェクトの行く末に大きな影響を産むのは少し怖さもあります。

4年いたとはいっても、インターン生だった期間もそこそこ長いですし、何より取り組んでいた問題や自分の性質の噛み合わせ上、今まではボトムアップに隙間から割れ窓の補修をしまくるタイプの働き方が多かったので、まだ全然慣れません。慣れすぎてもいけないやつな気もしつつ。 とはいえ首を突っ込んだのはある程度自分からのことですし、何より色々なコンテキストを吸収するのに4年もかかってしまったということでもあるので、そろそろなんらかの責任を取るべきかな、みたいな気持ちでいます。

まとめや今後など

年齢のインクリメントが成長というよりは加齢だなと感じるようになったのは25歳っぽいところかもしれません。 まあ、誕生日に徹夜作業からの出張とかしてたので気にするも何もあったもんではなかったんですが。

物心ついた時には身長や話し方のために周囲からは実年齢より高く見られがちだったので、年齢というカテゴリを気にしなく/気にされなくなってきたのは、「実は若い」みたいなカードが使えなくなってきて少し不便でもありつつ、ようやく自分の輪郭に実感が持てるようになってきたようにも感じます。

ただ、それを成長しない言い訳にはしたくないですね。特に仕事に関しては、いわゆる Indivisial Contributor 的な動き方というよりは、人と人、チームとチームを繋ぐような立ち回りをしがちというのもあり、今まで吸ってきたコンテキストの多さで殴ってしまえば惰性でもそこそこバリューが出てしまう局所最適にハマってしまっているような感覚が夏~秋ぐらいにはありました。 機会に恵まれたことと、やはり衛星開発のめんどくささとコンテキストの多さには未だに目を瞠るものがあるために脱出はできたのかなあとは思っていますが、油断せずにやっていきたいところです。

大学に関しては、入り直してからずっとそうなのですが、どうしたもんかなというかんじです。 そういうテキトーな在り方を否定しない、なんなら肯定してくれる場であるからこその国立大学の居心地のよさみたいなものも感じていますし、なんならそこが大きな価値だとも思います。 しかし、いくら完全に自分の責任でやっているとはいえ、曖昧に時間だけ引き伸ばしても色々ともったいないので、何を得る場とするかは整理しておこうと思います。

来年に向けては、心にゆとりを持たせていきたいです。 アドレナリンジャンキーということもあり、何かに勢いよく集中するのは得意だし楽しいんですが、疲れるし、疲れみたいなそこで犠牲にしたナニカに足元を掬われて本体のおもしろさが激減してしまうみたいなこともあります。

よくあるのが、食事を疎かにして QoL が下がって家もゴタついてメンタルもゴタつく、というやつです。 今年はチームやエーアイの進歩によってできた隙間を勿体ないと言いながら埋めまくる、みたいなムーブをしてたまに破綻していました。 人間はパターン学習器なので、典型的なパターンには典型的なパターンで、ということで、「こういう状況下に陥ったらとりあえずこうする」みたいな最悪回避ルーチンを設計しておかないとな、と思います。

とりあえず、心のゆとりは環境のゆとりからということで、ここ数日は家を整理しています。IKEA の SKÅDIS が便利。

*1:その後 20 USD / month のプランができて個人でも契約したのは秘密

*2:準備とはやや形容しがたいナニカなどにも追われていた

*3:Anthropic console の課金額を見るとうちのチームのメンバーだけ桁が違って寒気もします

*4:弊社の組み込みめっちゃできる人間でも、一人なら数日は遊ばせられる自信があります。余白がとても大きいということもあり、複数人ならできることが増える分より遊べるかもしれません。

*5:平行なはずの東大通りと西大通りが交わる点のこと。京都にも同様の地点が存在するらしい: 現地に行けるタイプの無限遠点 - prime's diary

*6:そもそも本体のはずの発表は発表時間10分とかでかなり LT 会の様相を呈しているので、あれは実態としては宇宙連合懇親会だと思います

*7:一方で、Google Meet のリアルタイム文字起こしには本当に感動しています。アレは間違いなく技術で世界がよりよくなっている部分だと思う。