速い・安い・うまい!プログラム力0.1の私が「ノーコード開発」でBGMマシンを作り続けた話 〜コードは公開しない、プロンプトを公開する〜
TL;DR
これは、「ノーコード開発」というキーワードを耳にした筆者が、正しい定義を一切調べないまま、自らの欲望だけを燃料にミュージックアプリをバージョンアップし続けた、事実に基づく5分で読めるデフォルメポエムである。
コードは1行も書いていない。さらに、1行も読んでいない。
使ったキーは Ctrl+A, Ctrl+C, Ctrl+V だけ(ほぼ)である。
記事の最後に置くのはソースコードではなく、逆算仕様書と逆算プロンプトだ。
あなたもAIに貼り付ければ、今夜からノーコード開発者になれる。なってみてほしい。
プロフィール
- プログラマではない。エンジニアでもない。それに憧れる素人
- プログラム力: 0.1(単位は不明。とにかく0.1)
- 武器: 日本語と、あきらめの悪さと、欲望に対する素直さ
- 弱点: カタカナの専門用語(3歩あるくと忘れる)
経緯 〜なんじゃらほい編〜
ある日、「ノーコード開発」という言葉を耳にした。
なんじゃらほい。
正しい定義を調べる気はない。調べたら負けな気がする。字面から想像するに、
- きっと、コードを1行も書かない開発だ
- それどころか、コードを見もしないはずだ。だって「ノーコード」って言うくらいだから
- 最近はAIが発達してるし、AIに全部やらせるんだろ、(たぶん)
じゃあクロード(AI)に全部やらせて、なんか作ってみたいな。そのうちやろ。
(若干の時が流れる)
経緯 〜欲望駆動開発編〜
※ここから先は事実に基づくデフォルメです。バージョン番号は筆者のプログラム力の推移(自己申告)。刻みます。
v0.001 「BGMかけっぱなしにしたい」
作業中にBGMかけたい。でも曲を選ぶのがめんどい。YouTubeのMixリストでいいか。
……なんかこのMixリスト、微妙に好みじゃないな。しかもPC再起動で止まる(それはそうだ)。かけなおすのがうざい。
そうだ。転がってたOrange Pi Zero(手のひらサイズの小さいコンピュータ)で、かけっぱなしマシンを「ノーコード開発」してしまえ。リモコンはWebで。
AIに日本語で「YouTubeの曲を流し続ける箱を作って。ブラウザから操作したい」と伝える。すると、なんか、動くものが出てくる。私はそれをコピペして実行するだけの機械になる。エラーが出たらエラー文をそのままAIに投げ返す。壁打ちの壁すらAIにやらせる。 これがノーコード開発(自称)。
気づけば小さな箱から音楽が流れていた。プログラム力 0.001 上昇。人類の進歩とは、こういうことを言うのではないか(言わない)。
v0.002 「自分の好みを入れたい」
流れてはいる。流れてはいるが、微妙に好みじゃない曲が混ざる。
そうだ、自分の好みを混ぜられるようにしよう。 好きな曲のリストを箱に覚えさせて、そこから流す。AIに「このリストから再生して。シャッフルとリピートも」と言うだけ。あと、スピーカーのボリュームいじるのすらめんどくさいから、音量ボタンもつけて。言うだけで実装される。恐ろしい時代である。
v0.0021 「反応がだるい」
なんか、反応だるい。曲飛ばしてもすぐ飛ばない。音量ボタンもタイムラグあってだるい。何とかして。
(AI「〇〇が原因と考えられます。△△という方式に変更しましょう」)
(筆者「それで。」)
(なんか動く。よくなった。)
私は原因を理解していない。だが直った。理解と解決は、別々に売っている。
v0.0022 「たまに止まる」
たまに止まる。このアプリ、品質悪い感じで印象悪い。よくして。作ったの私だけど、注文したのも私なので、文句を言う権利はある(ない)。
(AI「ログを見せてください」)
(筆者、ログの場所を聞き、コピペで貼る)
(AI「原因は〇〇です。対策を入れます」)
(筆者「それで。」)
v0.0023 「まだ止まる」
止まった。おい。
(AI「先ほどとは別の原因です」)
(筆者「そういうのいいから。止まらないようにして。」)
(AI、黙って直す)
v0.0024 「今度は音が出ない」
再生してるのに音が出ない。無音を流すマシンと化した。哲学か?
(エラー文コピペ)
(AI「〇〇を再起動してください」)
(コピペ実行。直る。)
v0.0025 「この曲、音でかい。この曲、聞こえない」
曲によって音量がバラバラ問題。静かなバラードに合わせて音量を上げると、次の曲で爆音が家を揺らす。深夜である。家族が起きる。曲ごとの音量、そっちで揃えて。
(AI「ラウドネス正規化というものがあります」)
(筆者「それで。」)
以後、箱は全曲を同じくらいの音量で流すようになった。世の中には名前のついた解決策が大抵あるらしい。名前は3歩あるいて忘れた。
このへんで気づく。私は開発をしていない。クレームを入れているだけだ。 しかし箱は着実に強くなっていく。クレーム駆動開発である。
v0.003 「スマホでリモコンしたい」
PCの前まで行って曲送りするの、だるい。寝転んだままスマホで操作したい。
AIに言ったら「PWAにしましょう」と返ってきた。ピーダブリューエー。知らん単語だが、スマホのホーム画面にアプリみたいに置けるらしい。置けた。もはや市販のアプリと見分けがつかない(親バカ)。
v0.0031 「ボタンが小さい」
寝転んで押すにはボタンが小さい。親指がスキップと音量を同時に押す。デカくして。
(デカくなる)
v0.0032 「今なんの曲か知りたい」
「おっ、この曲いいな。……で、誰の何て曲?」となる。画面に曲名出して。
(出る)
v0.0033 「曲名が見切れてる」
出た曲名が、途中で切れている。最近の曲名は長いのだ。副題がつき、feat.が続き、(〇〇Remix)で締まる。1行表示では、いちばん知りたいところで切れる。3行にして。
(3行になる。全部読める。満足。)
読者はそろそろ思っているだろう。「この素人、うざ」と。その通りである。 だがAIは一度も嫌な顔をしない。嫌な顔をする機能がないからだ。ノーコード開発、最大の発見はこれかもしれない。
v0.004 「知らない曲にも出会いたい」
好みの曲だけ流してると、世界が狭くなる。ラジオの「次なんの曲かわからんワクワク」が欲しい。
「たまに知らない曲を混ぜる『発見枠』を作って」 と依頼。何曲かに1回、リスト外の曲が流れてくるようになった。自分の箱に「おっ、いい曲」と言わされる日が来るとは。
v0.0041 「発見枠、多すぎ」
知らん曲ばっかり流れる。ここは私の家であってフェス会場ではない。頻度下げて。
v0.0042 「発見枠、今度は少なすぎ」
下げすぎた。もうちょい上げて。
(AI「頻度を設定にして、あとから変えられるようにしました」)
(筆者「最初からそうして。」)
(読者「お前が言うな。」)
v0.0043 「同じアーティスト、三連続は勘弁して」
シャッフルしてるのに、同じアーティストが三連続で来た。確率的にはあり得るらしい。あり得るのは分かった。でも勘弁して。 適度に散らして。
(散る)
v0.0044 「頼んだアーティストは、ちゃんとかけて」
「散らして」と言った舌の根も乾かぬうちに、「このアーティストをリクエストしたんだから、ちゃんとかけて」と要求する筆者。
(AI「先ほど『散らして』とのことでしたが」)
(筆者「リクエストは別。散らすのは箱の勝手な選曲のほう。」)
(AI、黙って両立させる)
矛盾した注文が、いつのまにか整合して返ってくる。これぞノーコード開発の醍醐味である(暴論)。
v0.0045 「同じ始まり方をしないで。飽きるから」
同じキーワードで曲を探させると、毎回同じ曲から始まる。3回目で気づき、5回目で飽きた。同じお願いでも、毎回違う入口から始めて。
(AI「候補の中からランダムに選ぶようにします」)
箱に「マンネリ禁止」を言い渡した瞬間である。情緒を求め始めている。相手は箱である。
v0.0046 「海の向こうの曲も聴きたい」
ふと気づく。発見枠が国内で回っている。世界は広い。海の向こうにもヒットチャートはある。外国のヒット曲も混ぜて。
かくして箱の守備範囲は地球規模になった。電気代は据え置きである。
v0.0047 「ついでに、ナビゲートして」
知らない曲が流れると「誰の何て曲?」となる(v0.0032参照)。画面を見ればいい。だが寝転んでいる。目を開けたくない。
「ラジオみたいに、曲の合間にひとこと紹介して」
(AI「DJ風のナビゲーションを入れます」)
かくして箱は、深夜にひとりでしゃべり、ひとりで選曲する、私専用のFMラジオ局になった。開局費用、ほぼゼロ円。リスナー、私ひとり。
v0.005 「二度と流さないで、を覚えてほしい」
発見枠、たまにハズレを引く。同じハズレを二度聴きたくない。
「苦手リストを作って。一度NGにした曲は二度と流さないで」。箱が私の好き嫌いを記憶し始めた。もはや箱ではない。相棒である。ちなみに好き嫌いの中身は永久に非公開である。箱だけが知っている。
v0.006 「この感動を世界に叫びたい」
いい曲に出会った瞬間、誰かに言いたい。「今流れてる曲をX(旧Twitter)にポストするボタンつけて」。ついた。深夜の私の「この曲最高」が、ワンタップで世界に放流されるようになった。世界は迷惑かもしれない。
v0.01 「電源ぶち抜いても復活してほしい。他の部屋に持っていくから」
この箱、他の部屋でも聴きたい。ケーブルごと引っこ抜いて移動する。当然、音楽は止まる。悲しい。
「電源入れたら勝手に再開して。しかも止まった曲の続きから」 と要求。人間のバイト君なら「そこまでやります?」と言われそうな注文も、AIは黙って実装する。ついでに「アプリが固まったら自動で再起動する見張り番(watchdog)もつけときました」とか言ってくる。頼んでないのに。有能か。
こうして箱は、電源をぶち抜かれても、抱えて廊下を運ばれても、コンセントに刺した数十秒後には何事もなかったかのように続きから歌い出す、不死身のBGMマシンになった。ちょっと感動した。ぶち抜いたのは私だが。
そして現在 v0.1
(なお、今後どれだけバージョンアップしても、プログラム力はたぶんかなり長期間0.1である)
欲望が湧く → 日本語で言う → 実装される → 次の欲望が湧く。
この無限ループを回し続けて、プログラム力は0.1に到達した。コードは、1行も書いていないし、読んでいない。このポリシーは守る。
公開へ 〜ここで筆者は悩む〜
この体験、何かの形でQiitaにアウトプットしたい。
でも、待て。ノーコード開発しといて、どや顔でコードを公開するのはおかしくないか? 私はそのコードを書いてないし、正直、読んでもいない。他人の褌でどや顔する度胸はない。
……せや。
現物から逆算した「仕様書」と「プロンプト」を公開すればいいんだ。 コードじゃなくて、コードの一歩手前を渡す。読者は自分のAIにそれを貼り付けて、自分の箱を産む。私と同じノーコード開発を、読者にも体験してもらう。これだ。
逆算仕様書(現物からリバース)
完成品を眺めながら(眺めるだけ。ポリシーに従い、中身は読まない)、「こいつは何者か」をAIに言語化してもらったもの。私は注文しただけ。
ただし、さすがに出てきた仕様書は読んだ。そして、読んで初めて気づく仕様が多々あった。 へえ、このアプリ、そういう仕様だったんだ。作った本人(?)が仕様書で自分のアプリと初対面する。設計してから作ったのではない。作ってから設計書ができた。 順番が逆だが、ノーコード界ではよくあることと思われる(たぶん)。
【BGMかけっぱなしマシン 逆算仕様書 v0.1】
■ なにもの
小型Linuxマシン上で常時稼働する、YouTube音源のBGM連続再生機。
スマホ/PCのブラウザから操作するWebリモコン付き。
一度セットアップしたら、日常運用でキーボードに触れないことを目指す。
■ ハードウェア
- 小型Linuxボード1台(常時通電、WiFi可)
筆者はOrange Pi Zeroだが、一番普及しているRaspberry Piならもちろん可。
Qiita読者なら大抵持っているであろう、余ってる自宅サーバやNASでも可
- スピーカーまたはアンプ(本体の音声出力に接続)
- 消費電力は数W程度。つけっぱなし前提
■ ソフトウェア構成(中身。読まなくても動くが、一応)
- Webアプリ本体: Python (Flask)。スマホからの操作を受け付ける窓口
- 再生エンジン: mpv。音を実際に鳴らす職人。Flaskとは常時通話(IPC)している
- 音源取得: yt-dlp。YouTubeから音声ストリームのURLを取ってくる係
- 常駐化: systemd。OS起動と同時にアプリを立ち上げる仕組み
- 状態保存: JSONファイル数個。プレイリスト、設定、苦手リスト、
「どの曲の何秒目まで聴いたか」を随時書き出す
■ コア機能
1. 再生エンジン
- 登録プレイリスト(YouTube URL群)を連続再生
- シャッフル / リピート切り替え
- 手動スキップ可。操作への反応は体感1秒以内であること
- 曲ごとの音量ばらつきを自動で揃える(ラウドネス正規化)
- シャッフル時、同一アーティストが連続しないよう分散する。
ただし利用者が明示的にリクエストした曲はこの限りではない
- 同じキーワードからの選曲でも、毎回同じ曲から始めない
(候補からランダムに選ぶ。マンネリ禁止)
2. Webリモコン
- 同一LAN内のブラウザからアクセス
- 再生/一時停止/スキップ/音量/現在の曲名表示
- 長い曲名も見切れないよう、曲名は3行まで表示
- ボタンは寝転んだ親指で押せる大きさ
- スマホのホーム画面に追加できる(PWA対応)
3. 不死身性
- OS起動時に自動でアプリ起動(systemd)
- 電源断からの復帰時、前回の曲の続き(秒単位)から再生再開
- アプリ異常時は見張り番が検知して自動再起動(watchdog)
- つまり「コンセント抜いて別の部屋へ運ぶ」が正規の運用手順
4. 発見枠
- N曲ごとに1回、登録リスト外の関連曲を自動で混ぜる
- 国内だけでなく、海外のヒット曲も候補に含められる
- Nは設定画面から変更可能(注文主の気分は変わるため)
5. ナビゲート
- 曲の合間に、ラジオDJ風のひとこと紹介を挟む
- 要するに「私専用FMラジオ局」化。オン/オフ可
6. 好みの学習
- NG指定した曲は苦手リストに記録され、以後再生されない
- 設定・履歴・再生位置はすべてファイルに永続化(再起動しても消えない)
7. 共有
- 「今流れている曲」をXに投稿するボタン
■ 非機能要件(という名の筆者のわがまま)
- 日常運用はすべてスマホで完結すること。SSHは緊急時のみ
- 家族が誤操作しても壊れないこと
- 深夜でも静かに動くこと(ファンレス)
- 止まらないこと。止まったら自力で立ち直ること
- 筆者がコードを読まなくても運用できること(最重要)
逆算プロンプト(コピペ用)
読者のためのメインディッシュ。お手持ちのAI(Claudeなど)にこのまま貼り付けてほしい。 あとはAIとの会話で、あなた専用の箱が育つ。筆者の「うざさ」も再現できるよう、進め方の注文まで込みにしてある。
あなたはノーコード開発の伴走者です。
私はプログラムが書けない・読めない・読む気もない素人です。
それでも以下の「BGMかけっぱなしマシン」を完成させたいので、
私の代わりに全部考えて、全部書いてください。
【環境】
- 手元の小型Linuxマシン(筆者はOrange Pi Zero。Raspberry Piでも、
余ってる自宅サーバやNASでも、普通のPCでも可)
- OSはLinux。SSHでコマンドは打てる(コピペで)
- スピーカーは本体に接続済み
【最終的に作りたいもの】
- YouTubeの音源をプレイリストから連続再生するBGMマシン
- ブラウザから操作するWebリモコン
(再生/停止/スキップ/音量/現在の曲名表示。ボタンは親指サイズ、
長い曲名も見切れないよう3行まで表示)
- スマホのホーム画面に追加して使いたい(PWA)
- 操作したら1秒以内に反応してほしい。もっさりは受け付けない
- 曲ごとの音量バラバラは嫌。そっちで揃えて(深夜に爆音が来ない程度に)
- シャッフルで同じアーティストが連続するのは勘弁。ただし私が
リクエストした曲はちゃんとかけて(矛盾してるのは分かってる。両立して)
- 同じキーワードで探させても、毎回同じ曲から始めないで。飽きるから
- 電源をいきなり引っこ抜いても壊れず、挿し直したら自動起動して、
さっきの曲の続き(途中の秒数)から再生
- アプリが固まったら自動で復旧する見張り番つき
- 数曲に1回、リスト外の「発見枠」の曲を混ぜる。海外のヒット曲も候補に。
頻度はあとから設定画面で変えたい
- 曲の合間に、ラジオDJ風のひとこと紹介(ナビゲート)を挟んでほしい
- NGにした曲は二度と流さない「苦手リスト」
- 今の曲をXに投稿するボタン
- プレイリストや設定は再起動しても消えないこと
【進め方のお願い(ここ重要)】
- 一気に全部作らず、まず「1曲流れてブラウザから止められる」最小構成から。
動く喜びを小刻みに味わいたい
- 私はコードを書けないので、コマンドもファイルも全部コピペで済む形で。
「ここを編集して」ではなく「これを丸ごと貼って」でお願いします
- ファイルの作り方も毎回教えて。私はnanoがせいいっぱいの人間です
- エラーが出たら全文貼るので、原因と次の一手を教えて。
原因の説明は3行まで。ただし私が「詳しく」と言ったら詳しく
- 専門用語には一言の説明を添えて
- 各ステップの最後に「今どこまでできたか」を一行でまとめて
- たまに褒めて。コピペしかしてないのは知ってますが、褒めて
では、最初のステップからお願いします。
秘めた思い
「ノーコード開発」って、言葉だけが独り歩きして、身近な実例をあまり見たことがなかった(あんたが調べないだけ、というツッコミは甘んじて受ける)。
だからこれは、定義もツールの比較も出てこない、ただの一実例だ。素人が欲望を日本語でAIに投げ続けたら、手のひらの箱が音楽を流し、好みを覚え、深夜にDJまで始めた。それだけの話。
読者には「へぇ」「ほうほう」と読んでもらえたら、筆者は満足である。
そして100人に1人くらいは、上のプロンプトを実際に貼り付けてほしい。
(高望み)
追記: この記事もまた、AIとの共同作業で書かれた。記事の初期コンセプトは示したが、あとはクレームを入れただけである。どこまでがノーコードで、どこからがノー執筆なのか、筆者にはもうわからない。
追記2: 箱への欲望は現在も湧き続けている(設定を歯車アイコンからいじりたい、曲間の無音を短くしたい、「いいね」と「超いいね」を分けたい、等)。v0.2の物語は、また別のポエムで。
追記3: AIの進歩は、そら恐ろしくもある。筆者はいつのまにか「クレーマー顧客」(この表現はClaude AIの創作です!筆者は言ってない!)と化してしまった。この進歩はもう止まらないだろうし、Claudeに限らず、ChatGPTでもGeminiでもCopilotでも、他のAIでも同じことができるはずだ(そのうち検証してみる)。