はじめに
「自分の体重や体組成データは、誰にも渡したくない。でも、科学的な予測は手軽にやりたい」
そんな矛盾する願いを、1枚のHTMLファイルで解決しました。
今回、記念すべき10個目のプロジェクトとしてリリースした『WASM-PFC Simulator (The Body Projection)』は、サーバーレス、維持費0円、そして 情報漏洩リスク物理的0% を実現した、WebAssembly(WASM)ベースの本格ボディメイク支援ツールです。
本記事では、marimo v0.19.0 というリアクティブなノートブック型開発環境を用い、いかにして「業務アプリとしての品質」を追求したか、その設計思想の舞台裏を公開します。
1. 「Scipy を捨てて、オイラー法を実装した理由」:起動速度への執念
通常、体重推移の微分方程式を解くには scipy.integrate などの強力なライブラリが定石です。
しかし、WASM (Pyodide) 環境下では、Scipy のような巨大なC拡張ライブラリをロードするだけで、数十秒のロード遅延(コールドスタート問題)が発生します。
「ブラウザを開いて、一瞬でシミュレーションを始めたい」
このUXを死守するため、私は Scipy を捨てました。
人間の体重変化は、ロケットの軌道計算とは異なり、1日単位の緩やかなステップです。
1日を1ステップとする オイラー法(数値積分) を標準ライブラリ(math/numpy)のみで自作実装することで、実用十分な精度を保ちつつ、起動速度を数秒から数ミリ秒へと劇的に短縮しました。
さらに、marimo の有向非巡回グラフ(DAG)の純度を保ち、一時変数の漏洩(Loop Leak)を防ぐため、動的ループは副作用のない「純粋リスト内包表記マッピング」へと昇華させています 。
# 代謝適応とForbesモデルを統合した1日単位の数値積分(Euler Method)
# セル内のグローバルスコープを汚染しないための内包表記マッピング
_proj_data = [
_calculate_next_state(
_day,
_target_kcal,
_current_params
) for _day in range(_simulation_days + 1)
]
2. 「Decimal 徹底による数値の整合性」:業務アプリとしての矜持
「$0.1 + 0.2 \neq 0.3$」
浮動小数点誤差は、栄養学や健康管理を扱う業務アプリにおいて、ユーザーの信頼を損なう致命的なノイズです。
本プロジェクトでは、内部計算ロジックの全工程で decimal.Decimal を一貫して使用する「Financial Precision(金融精度)」設計を徹底しました。
入力値を取得した瞬間から、マクロ栄養素の算出、エネルギーバランスの積分計算に至るまで Decimal で精度を保護。
可視化ライブラリ(Altair)に渡す直前まで float キャストを許容しないことで、100% の計算整合性を担保しています。
3. 「UI/UX のパラノイア」:スライダーを廃した指先の哲学
モダンなUIといえば「スライダー」ですが、スマホの小さな画面で「タンパク質 2.1g/kg」や「脂質 24%」といった微細な数値を狙い撃ちするのは、指が画面を隠すこともあり、ストレスの温床となります。
私は、開発の利便性よりもユーザーの操作精度を優先しました。
主流の mo.ui.slider をあえて捨て、mo.ui.number(step指定あり)に統一。
直接入力とスピンボタンによる確実な操作感を、モバイル環境の「指先」に提供しました。
また、モバイルでの表示崩れを防ぐため、ラベル名は 1 文字単位で削り、hstack(wrap=True) を駆使した Semantic Compression(意味論的圧縮)を施しています。
なぜ、今 WASM なのか?
情報漏洩が叫ばれる時代、最も安全なデータ管理とは「データを預からないこと」です。
WASM は、あなたの PC やスマホを強力な計算サーバーに変えます。データはブラウザの外へ一歩も出ません。
この「完全ローカル実行」という選択は、ユーザーに「プライバシー」という究極の自由を与えるための必然でした。
実機の動作を確認する
今回解説した設計思想に基づき、1枚のHTMLファイルで完結させたシミュレータの動作は、以下のページから確認いただけます。
[ WASM-PFC Simulator (The Body Projection) ]
技術スタック:
- marimo v0.19.0 (WASM / Pyodide)
- pandas / numpy / altair
- Kevin Hall 博士の動的エネルギーバランスモデル