Panda Noir

JavaScript の限界を究めるブログでした。最近はいろんな分野を幅広めに書いてます。

ChatGPTにパーソナルトレーナーになってもらう

めっちゃ簡単なアプリを作って1ヶ月半ほどトレーニングしているのだが、今のところ不満がほぼない。

Muscle Memory

動作原理、コンセプト

(動作原理ってほどでもないが)

このアプリの基本コンセプトは 「プロンプトと記録をまとめて保存してしまおう」 って感じ。とにかくシンプル。記録を外部に保存しておいて、使うときは記録ごと全文送信する。ハルシネーションもほとんど起きてない。

これは筋トレの記録です。

このプロンプトが送られてきたら、まず過去の記録を分析し、本日のトレーニングメニューを提案してください。その後、記録の更新を待ってください。

(略)

=====

records:
  - date: 2026-07-14
    exercises:
      - name: ワンハンドダンベルローイング
        weight: 24kg/手
        reps: [10, 10, 10]
        rest: 2分
        note: 左→右で実施

こんな感じのを送信すると、プロンプトに従ってメニューを考えてくれる。あとはやるだけ。

使い方

細かい使い方はこんな感じ。

  1. アプリを開く
  2. 「コピーしてChatGPTを開く」を押す
  3. ChatGPTが立ち上がるので、プロンプトのところで貼り付ける
  4. 今日のメニューが生成される
  5. それの通りにメニューをこなす

超カンタン。これだけで、前回までの記録を踏まえて今日やるべきメニューを考えてくれる。めっちゃ便利。さらに、「今日は別の種目にしてみようかな〜」と相談すればそのメニューも考えてくれる。

youtu.be

記録するほうもカンタン。

  1. 記録内容を適当に書く (結構いい感じに解釈してくれる)
    • 「インクライン 15 15 12 腕立て 20 20 15」とか書くと「インクラインベンチプレス 20kg 15,15,12」「腕立て伏せ 20,20,15」みたいによしなに解釈してくれる
  2. yamlが吐き出されるのでコピーする
  3. アプリに戻って「貼り付けて記録」を押す
  4. ペーストを押す

割と雑に書いても結構ちゃんと記録形式に直してくれる。

試行錯誤とか

当初はほんとうに 記録を出力する時にも全文出させて丸ごと保存していた。 まさに脳筋仕様。ただ、これだと3週間分くらいの記録で出力限界に引っかかってしまった。なので仕方なく差分だけ出して保存するようにした。出力時間も短くなったし今のところはこれで困ってない。

また、MCPにする計画もしていたのだが(貼り付けが手間なので)、これはあまりうまくいかなかった。 実際に「Google driveから前回の記録を読み出してそれを元にメニューを考案、保存も勝手にやってくれる」って構成で作ってみたが、 driveへの接続時間が長くて使いものにならなかった。 (←書いてて思ったが、毎日定時で提案してくれるようなアプリであればdriveへの接続時間も問題にならないし、それで良くないか?)

グラフ機能も一応ある

yamlで保存してあるのでグラフもシュッと作れた。なかなか便利。まあそこまで見てはないけどたまにみてモチベが上げられてる。

まとめ: どの筋トレアプリより続けやすい

筋トレアプリは「入力しづらい」「今回のメニューを考えるのがめんどい」という問題がずっとあった。このアプリはそれらをAIを使うことで解決できている。シンプルなアイデアだったがちゃんとワークして嬉しい。みんなも筋トレやろう!

Gridfinityがよい感じ。自分だけの最強収納をつくる。

収納、好きですか。みんな大好きですよね。僕もです。

そして3Dプリンタ界隈にはGridfinityという最強ツールが存在します。今回はそれによっていかに収納が楽になるのか紹介します。

Gridfinityとは?

Gridfinityは、3Dプリンタで作れる収納用品のための規格です。

42mm角の基本単位グリッドと、グリッド上に載せる収納ケースの底面などが規定されています。

実際に印刷したグリッドを設置したのがこんな感じです↓ (ケースと同じ色なので分かりづらいですが…)

上に置くパーツは底面さえ規格に則っていればサイズ含めて自由に設計できるのが最大のポイントです。持ってるノギスがシンデレラフィットするケースを作って格納するなどもできます。

例えば「持ってる工具を入れるために1x4のサイズの箱を印刷しよう」とか「長ものを立てて入れるために1x1で高めのケースを印刷しよう」みたいな感じですね。

実際に作ったもの

僕はあんま凝ったことはせず、単にベースプレートに箱を載せるだけのシンプルなものにしてます。これだけでもかなり便利です。

グリッドに沿わせて図示するとこんな感じになってます。

9x4のベースの上に1x1や4x3、3x3みたいな異なるサイズのケースを積んでる感じです。

サイズが異なるものを重ねたいときは、フタを作っておくと積み重ねできて便利です。

僕はやってないですが、机の中の収納とかもこれで整理しやすいそうです。

便利ツール

グリッドフィニティジェネレータ | インタラクティブツール

これを使うと幅、奥行き、高さの異なるbinがサクッと作れます。これだけで8割くらいはカバーできてしまいます。

ラベル付きbin

これ印刷しておいてペンとかでラベルを書くとネジとかを収納するのに便利です

(実際に印刷したのがこれだったか忘れたんですが)

stackable lid これ印刷しておくとフタの上にbinを積めるので便利です

3Dプリンタを買った

3Dプリンタを買った

創作欲が爆発して色々と作ってしまっている

1. ペグボードを斜めに固定するパーツ

前面

背面

ペグボードは基本的にグッズを飾るために使ってるので、机に斜めに設置しないと見づらい問題があった。けど、デフォルトのクランプだと斜めに固定しようとするとやや不安定になったので、パーツを追加して斜めに固定できるようにした。

2. 卓上カレンダーフレーム

電子ペーパーで卓上カレンダーをつくる - Panda Noir

一昨年作った卓上カレンダーのフレームを、CAD書いて自作してみた。

前面

背面

中身

ちなみに昔のバージョンがこれ↓

昔のバージョン

…昔の方が良かったか?

3. ウェブカメラカバー

備え付けのカバーはフタ式なので、いつもフタがどっかに行く問題があった。スライドカバーにすることでフタがなくなる心配が消えたのでかなり便利になった。

(なんかライトの設定ミスって変な色味になってしまった)

使ったモデル: Elgato Facecam Privacy Shade - Free 3D Print Model - MakerWorld

まとめ: めっちゃ楽しい

CADで書いたものが意図通りに作れるとすごい興奮するし、印刷している様子を眺めてるだけでも結構楽しい。しばらくは3Dプリンタで遊ぶ日々が続きそう(3連休ほぼ全部使った)。

上で紹介したのは実用のものだけど、実は3Dプリントを快適にするためのグッズも結構印刷している。

これだけでも結構楽しい。何も作りたいものない人でもこれらは作れるのでおすすめ。

git workspace 間で変更を受け渡す

あるworkspaceで作業していたけど別のworkspaceにやるべき変更だったみたいなこと、あると思います。なんでなんですかね。

cd path/to/workspace1
git stash

cd path/to/main
git stash pop

これで受け渡せる。.gitが共有されているってことはstashも共有できる。言われてみれば当たり前なんだけど、さっき気づいておおーってなった。

just-cliでzsh関数をまとめる、簡単に選べるようにする

こんな感じで選択でき、troubleshoot kill-port 8080 みたいな感じで実行できる。

モチベ: 似ているローカル関数が増えてきた

最近、トラブルシューティング用のzsh関数を乱造しているのだが(shoot-kill-portみたいな)、増えすぎて流石に視認性が悪くなってきた。どれが何かコメントなしでは分からない(上の例はサンプルで作ったものなのでパッと見でギリ分かるが)。

just-cliを使ってローカル関数をまとめる

やり方はカンタン。以下のようなレシピファイルを用意してエイリアスを設定するだけ。

alias troubleshoot="just -f $HOME/just/troubleshoot.just --"

troubleshoot.justの中身

# ポートを使用中のプロセスを終了する
kill-port port:
    lsof -ti:{{port}} | xargs -r kill

# ローカルDBを作り直して初期データを投入する
reset-db:
    docker compose down db
    docker volume rm app_db_data || true
    docker compose up -d db
    pnpm db:migrate
    pnpm db:seed

# コンテナ内でシェルを起動する
shell service:
    docker compose exec {{service}} sh

# 使えるコマンド一覧を表示する
[default]
help:
  @just -f {{justfile()}} --list

これで補完とかも効くようになる(justのセットアップはしておく必要ある)。

コマンドを指定しなければhelpが表示される(↓)。

余談

just-cli、ずっと前から存在は知ってたんだけど、「ちょっといいmakeじゃねえか」の気持ちが拭えずに使ってなかった。今回zsh関数をまとめるものとして再定義してようやく腹落ちした。本来のユースケースっぽい、プロジェクトローカルの関数を定義する用途としてはどうなんですかね。