劇場の入口で、係員が人数を数えていることはありません。
やっているのは券のもぎりです。券には座席の番号が刷ってあって、その番号は開演の何週間も前から決まっています。刷った枚数が座席の数です。売り切れるのは券が無くなったときで、客席を見に行って数えた結果ではありません。
数えて判断する方式にしたら、どうなるか。窓口が二つあれば、両方が同じ瞬間に残り一席と数えて、二人に売ります。そして客席で二人が同じ番号の札の前に立ちます。
番号を先に刷るという順番は、数えなくて済むようにするためのものです。
翌朝、三十四件
十月の第二土曜、十三時から。会場の椅子は三十脚。
申し込みフォームを作って、金曜の夜に告知を出しました。翌朝コーヒーを淹れながら回答を見ると、三十四件入っています。
椅子は三十脚しかありません。四人にはすみません、満席でしたと個別に連絡することになります。その四人は前の晩に予定を空けてくれた人たちで、しかも自分が三十一番目だったのか三十四番目だったのかも分かりません。
作れることは分かっている。怖いのはその次
AI に申し込みフォームを作ってと頼めば、たぶん作れます。AI にコードを書かせたことがある人なら、そこは疑っていないと思います。
詰まるのはその先です。
他人の名前とメールアドレスを預かるものを、自分が公開していいのか。自分で中身を全部読んだわけではないコードに、参加者の個人情報が通ります。バグがあったら、申し込んだ人に他の人の連絡先が見えてしまうかもしれない。
上の三十四件の話が、その不安を裏づけます。動いたのに間違っていたという結果は、実際に起こるからです。
MulmoTerminal は AI に頼んで作業させるための画面で、npx の一行で立ち上げてブラウザで開きます。道具自体は無料で、AI の使用量は自分の契約から引かれます。そこで作れる共有アプリは、リンクで人に渡せるアプリで、フォルダ一つがアプリ一つです。
できあがるもの
返ってくるのはリンク三本です。それぞれ見えるものが違います。
公開ページ .../a/benkyoukai-10gatsu
┌────────────────────────────────┐
│ 10月の勉強会 申し込み │
│ お名前 [ ] │
│ メール [ ] │
│ ☐ 来られない場合、録画が欲しい │
│ [ 申し込む ] │
└────────────────────────────────┘
↓ 送ると
「12番の席が取れました」または「キャンセル待ち3番です」
あなたの画面 .../m/benkyoukai-10gatsu
┌────────────────────────────────┐
│ 席 12 / 30 待ち 0 │
│ 1 田中 tanaka@… 録画不要 │
│ 2 鈴木 suzuki@… 録画希望 │
│ … │
└────────────────────────────────┘
申し込んだ人が水曜に開くと .../p/benkyoukai-10gatsu
┌────────────────────────────────┐
│ あなたは 12番の席です │
└────────────────────────────────┘
↑ 他の11人の名前は出ません
三つ目が、普通のフォームには無い状態です。
なぜ三十四件になるのか
自分でフォームを作ると、こういう作りになります。いま何件申し込みがあるか数えて、三十件未満なら受け付けて、行を一つ足す。
土曜の朝十時ちょうどに、二人が同時に送信ボタンを押したとします。
一人目の数えるが走って、二十九件と出ます。その直後、行が足される前に、二人目の数えるも走ります。こちらも二十九件と出ます。二人とも三十件未満だから受け付けようと判断します。二人とも行を足すので、三十一件になります。
これは丁寧に作れば直るものではありません。数えてから書くまでのあいだが、必ず存在するからです。そこに他人が入り込めるので、同じことが何度でも起きます。告知直後の数分は、まさにそういう時間帯です。
窓口を二つ開けた劇場が、数えて売ったのと同じことです。
AI が書いたコードだから起きたわけでもありません。数えて判断するという作り方そのものが、この場面には向いていないという話です。
数えないで配る
共有アプリの定員つきの形は、数えません。
送信ボタンを押した人に返ってくるのは、件数ではなく番号です。十二番の席が取れましたか、キャンセル待ち三番です。
番号を配っているのはアプリのページではなく、その下のプラットフォームです。同じ番号を二人に渡すことがないので、二人が同じ秒に押しても答えは別々になります。
三十一番目の席は出ません。出そうにも、三十一番目の席が存在しないからです。刷っていない券は売れません。
ここが不安に対する一つ目の答えになります。定員を守っているのは、自分が書いた、あるいは AI が書いたページではありません。ページを読み返して確かめる必要がないところに、定員が置かれています。
申し込んだ人に、他の人の名前は見えるか
見えません。そして自分のページが間違っていても見えません。
アプリには入口が三つあります。
| 誰が | どこを開くか | 何が見えるか |
|---|---|---|
| リンクを送られた人 | 公開ページ | フォーム。送ると12番の席が取れましたと出る |
| あなた | メンバーページ | 全部の行。人数。待っている人 |
| 申し込んだ人が水曜に見に来たとき | 参加者ページ | 自分の行だけ |
三行目が肝心なところです。普通のフォームだと、送信したらもう見られないか、全部見られるのどちらかになります。自分の分だけ後から見られるという状態を作るのが難しいので。
これを決めているのは、ページの側ではありません。ページが自分の行だけ表示するというコードを持っているのではなく、そもそも他人の行がページに届いていません。
| どこで絞っているか | ページにバグがあったら |
|---|---|
| ページの中で絞る | 全部見えてしまう |
| その下のプラットフォームで絞る | 見えない(届いていないので) |
自分で中身を読み切っていないコードでも、他人の連絡先は漏れません。
効く範囲を書いておきます。効くのは配り方で、参加者のページに他人の行が届きません。効かないのは、自分が公開ページに出すと決めた内容です。申し込んだ人の一覧を出してと頼めば、それは出ます。
公開する前に自分で二件申し込んで、参加者のページを開きます。自分の一件しか出なければ、届いていないということです。
公開が必ず世界に見せるではない
もう一つの不安がここです。公開ボタンを押した瞬間に知らない人が来るのか。
これは作り方で決まります。
公開ページを作らなければ、名簿に載せた人しか開けません。社内の出欠や、決まったメンバーだけの申し込みなら、この形が素直です。
公開ページを作った場合は、公開した瞬間から知らない人の前にあります。勉強会の申し込みはこちらになるので、押す前に見ておくことになります。
見せる前に、自分の目で四つ見る
公開する前に、作ったページを自分で開けます。公開サイトと同じコードが動くので、本番より甘くはなりません。
データが出ているか。読み込み中で止まっていたら、まだ繋がっていません。
送信すると確認が出て、入っている値が正しいか。メールの欄の中身が名前として送られていないか。
入れてはいけないものが、ちゃんと断られるか。メールの欄に日本語を一文字書いて送ってみる。名前を空にして送ってみる。
仕上がって見えるか。ここは品質ではなく、使われるかどうかの話です。素っ気ない見た目のフォームは簡素ではなく未完成に見えて、人は未完成に見える申し込みフォームを閉じます。この形には最初から配色や余白が入っています。
キャンセルが出たら、誰が繰り上げるか
三十人埋まったあと、三十一人目はキャンセル待ち一番になります。一人がキャンセルしたら、その人が席を得ます。こちらは何もしません。
手でやるとこうなります。キャンセルのメールに気づいて、待っている人の一覧から先頭を探して、その人を席に移して、本人に空きましたと伝える。
四手です。しかも一手目の気づくが遅れると、席が空いたまま当日を迎えます。椅子が一つ余っていて、待っている人は家にいる。
先着順が公平になるには、二つ揃う必要がある
早い人が勝つを成り立たせるのは、意外に簡単ではありません。
時刻を誰が打つか。申し込んだ人のパソコンが打つと、そのパソコンの時計がずれていれば順番が狂います。そして時計は書き換えられます。この形ではサーバー側が打つので、全員が同じ一つの時計で測られます。
いつから受け付けるか。これが無いと、公開した瞬間から受付が始まります。金曜の夜に作って土曜の朝に告知するつもりでも、金曜のうちにリンクを見つけた人が先に埋めてしまいます。
二つ揃って初めて、先着順が公平だと言えます。いつからが全員同じで、どちらが早いかを同じ時計で測る。片方だけでは足りません。
十一月のを作るとき
同じフォルダを開いて、変わったところだけ言います。十一月、四十席。
去年のフォームをコピーして、日付を直したか、定員を直したか、去年の会場名が残っていないかを目で追う作業は要りません。アプリの形はファイルなので、どこが変わったかが機械的に出ます。
直すときに別のところを壊さないかは、差分が読めれば確かめられます。
当日、あなたは会場にいる
土曜の朝、椅子を並べています。パソコンは家で閉じたままです。それでも申し込みは進みます。
アプリは自分のパソコンが配信しているのではなく、公開済みのものが動いているので、三十番目の人も、キャンセル待ち一番の人も、そのあいだに番号を受け取ります。
自分のパソコンを立ち上げていないと動かないものは、人に渡せません。渡せるものになるかどうかは、ここで分かれます。
使ってみる
MulmoTerminal は、次の一行で立ち上がります。ターミナル(Windows なら PowerShell、Mac ならターミナル)を開いて、そのまま貼り付けます。
npx mulmoterminal@latest
ブラウザが開いて http://localhost:34567 が表示されれば成功です。インストールという作業はありません。npx はその場で取ってきて動かすだけなので、合わなければ閉じるだけで終わります。止めるときは、打ったターミナルで Ctrl + C を押します。そのターミナルが分からなくなったら npx mulmoterminal@latest stop です。
動かない場合、足りないものは次の二つのどちらかです。
| 確かめ方 | 無ければ | |
|---|---|---|
| Node.js 22.12 以上 | node -v |
nodejs.org/ja/download の LTS。入れたらターミナルを閉じて開き直す |
| Claude Code | claude --version |
macOS は curl -fsSL https://claude.ai/install.sh | bash、Windows は irm https://claude.ai/install.ps1 | iex。そのあと claude でログイン |
Claude Code は、AI をターミナルから使うためのコマンドです。使うには Claude の有料プラン(Pro / Max / Team / Enterprise)か API のアカウントが必要で、無料プランには含まれていません。MulmoTerminal 自体は無料で、AI の使用量はその契約から引かれます。
新しい空のフォルダを一つ作ります。デスクトップでいいです。
MulmoTerminal の空いているマスをクリックして、上のタブで Claude を選び、WORKING DIRECTORY にそのフォルダのパスを入れて、右の再生ボタンを押します。

開いた画面に、こう打ちます。
10月の勉強会の申し込み。30席。名前とメールと、来られない場合に録画が欲しいかどうか。 30人埋まったらキャンセル待ちに回して。
三十席とキャンセル待ちが入っていれば、それで形が決まります。
公開する前に自分で見ます。そのマスでコレクションのパネルを開いて、ヘッダーの Previews を押します。そこで上の四つを確かめます。
よければ AI に公開してと頼みます。三つのリンクが返ってきます。
公開ページのリンクを自分のスマホで開いて、一件申し込んでみてください。一番の席が取れましたと出れば成功です。そのあと同じリンクをもう一度開くと、自分の行だけが見えます。
社内だけで使うなら、公開ページは作らないでと言っておきます。
やめたくなったら、申し込みの受付を止めてと頼みます。開いても送信できなくなります。公開そのものを取り消すなら、このアプリの公開をやめてと頼みます。集まった申し込みを消すなら、レコードを全部消してと頼みます。消すと戻らないので、先に受付の画面で中身を見て、必要なら書き出してから頼んでください。
まとめ
劇場は人数を数えてから客を通すのではなく、番号を刷った券を先に作ります。数えて売ると、窓口が二つあれば同じ席が二人に売れます。
三十四件になるのも同じ構図です。数えてから書くまでのあいだに他人が入れるので、丁寧に作っても直りません。
共有アプリの定員つきの形は数えず、番号を配ります。三十一番目の席は、存在しないので出ません。そして他人の行は、ページが絞っているのではなくそもそも届いていません。
