この記事では生成AIを使用しています。
その他不備等ありましたらお知らせください。
はじめに
こんにちは。@Log_ignoreです。最近はニュースを見ればAIバブルだの物価の
高騰だの、中学生の懐に(特にガジェットを漁る僕みたいなやつに)直撃してます。
衆院解散があって選挙があって、投票権はまだないので見守るばかりです。
それですよ。AIバブル。
今回はそんなAI(ChatGPT)を使ってクソアプリの開発をしていきたいと思います。
AIバブルとは?(クソアプリメインなので折りたたみ)
AIバブルは、ChatGPTの登場と業界全体の進歩(ソフト・ハードともに)による株の
値上がりのことです。この値上がりが実態を超えて進んでいるため、技術の将来性は
認めつつも、株価の急激な下落(バブル崩壊)が懸念されています。
1990年代後半のITバブルになぞらえたネーミングだそうです。
AIはバブルではなく、長期成長であるという見方もあります。
(ここで折りたたみ終了)
前提条件・補足事項
投稿者はGigaスクール構想で配布されたChromebookで作業することが主なので
今回はwebアプリを開発します。
投稿者にプログラミングの技能はないので(断言)、コードはAIに丸投げします。
つまり、アイデア勝負です。
製作開始
プロンプトと返答を見ていく形にします。
AIの案
クソアプリの開発をしましょう。なにか案はありますか?
GPTの返答(全文)
承知しました。 それでは、「クソアプリ」開発のアイデア出しから進めます。前提として今回は
・実用性は二の次
・実装はWebアプリ
・コードは基本的にChatGPT任せ
・「なぜ作ったのか分からない」が褒め言葉
という条件で考えます。
クソアプリ案(初期候補)
案1:押しても意味がないボタン
ボタンを押すと、それっぽい処理が走りますが、
最終的に何も起きません。
表示例
「処理中です…」
「サーバーと通信しています…」
「完了しました」
実際の成果
なし
UIはそれなりに凝ることで「無駄に本格的感」を演出できます。
案2:どうでもいいことを全力で判定するアプリ
入力された文章や単語に対して、
極めてどうでもいい評価を返します。
例
「今日の晩ごはん」→「それは晩ごはんとして妥当です」
「眠い」→「高確率で眠そうです」
AIを使っているのに、知能を感じさせない点がポイントです。
案3:使うほど不便になるタイマー
普通のタイマーですが、使う回数が増えるごとに仕様が悪化します。
回数を重ねると
表示が小さくなる
秒数がずれる
謎の待ち時間が入る
「学習型AI」を真逆に使う発想です。
案4:現在時刻をものすごく遠回しに教えるアプリ
現在時刻を直接表示せず、
回りくどい日本語で表現します。
例
「多くの人が昼食を終えている可能性が高い時間帯です」
「そろそろ寝た方がよさそうだと感じる人が出始める頃です」
無駄に知的な表現と無意味さのバランスを狙えます。
次のステップ
ここからやるべきことはシンプルです。
上記案から1つ選ぶ(または混ぜる)
「最低限の仕様」を決める
そのままChatGPTに
「この仕様でHTML/JSを書いてください」
と丸投げする
どれを採用するか決めていただければ、
次は実際に投げるプロンプト文を、記事にそのまま載せられる形で用意します。
方向性が決まらない場合は
「一番Qiitaで突っ込まれそうなやつ」で選ぶのも正解です。
(ここで折りたたみ終了)
面白いアイデアを出してくれました。
全文を読まない人のためにまとめておくと、
①それっぽい演出で何も無いボタン
②全力でどうでもいいことを返してくるAI
③使うほど壊れるタイマー
④よくわからん表現で時間を教えてくれる時計
という4つの案を出してくれています。
返答を見る限り、どれも面白いのですが既出してそう。
(特に小泉AIとか)
それを調べるためにクソアプリのアドベントカレンダーをあさるのはめんどくさい。
こんなときのために存在するwebアプリが、実はあります。
ありがとう、@mustle-hustleさん。
この検索エンジン「kusoogle」で過去のクソアプリとの類似度を確認してみましょう。
「それっぽい演出で何も無いボタン」の検索結果
「20件の類似クソアプリが見つかりました
あなたのアイデアは量産型クソアプリです。」
ボタンだと退会ボタン系が多いですね。
(ここで折りたたみ終了)
「全力でどうでもいいことを返してくるAI」の検索結果
「オリジナルなクソアプリですね!
類似のクソアプリは見つかりませんでした
Let's make a kuso-app! 🚀」
おお、やるじゃんか小泉AI。ちなみに現段階の評価はこれが一番。
(ここで折りたたみ終了)
「使うほど壊れるタイマー」の検索結果
「20件の類似クソアプリが見つかりました
あなたのアイデアは量産型クソアプリです。」
まああまり個人的に面白くなさそうだったので納得ではある。
検索結果に「キーボーddddddddddッドを壊してみた」が出てきて笑った。
(ここで折りたたみ終了)
「よくわからん表現で時間を教えてくれる時計」の検索結果
「12件の類似クソアプリが見つかりました
あなたのアイデアは量産型クソアプリです。」
面白そうだと思ったんだけどなあ。
(ここで折りたたみ終了)
自分で考えた案
私の案はこちらです。
2つの案、それぞれに対して改善点やいいところ、悪いところを教えてください。
①「乱数日記」
「いつ、どこで、誰が、何を、どうした」の5つの要素で文を作る。
それぞれの要素のパーツは乱数で決定される。文は保存され、読み返すことができる。
②「ぴったりカレンダー破り〜年越し編〜」
12月31日の12時59分40秒にタイムスリップして、年が切り替わるちょうどの
(少数第二位まで計測)タイミングでカレンダーを破る事ができれば成功
基本的には何も起こらない目押しで、一ループ終了後に何度でもやり直しできるが
以下のようなトラブルが起こる可能性がある。
①時計の電池が途中で切れる
②飼い猫が邪魔をする
③除夜の鐘が鳴りすぎてうるさい
④怪しい人が来て5円玉ではなく二重振り子で催眠(邪魔)してくる
⑤これまでの人生が不意にフラッシュバックする(走馬灯)
⑥急に暗転しナイトパーティーが始まる
いずれの場合でも0:00:00にカレンダーを破る必要がある。
気合いから分かる通り②が本命です。
さて、AIに意見を聞いてみましょう。
ChatGPTの返答(全文)
結論を先に言うと、
①は「完成度が高いクソ」
②は「思想が強すぎるクソ」
方向性がかなり違います。
案①「乱数日記」
いいところ
仕様が一瞬で理解できる
「5Wを乱数で作る」→説明コストが低い
実装が軽い
配列+乱数+localStorageで完結
“日記”なのに本人の意思が一切介在しない
クソアプリとして非常に美しい
保存・読み返し機能がある
「存在し続ける無意味さ」が出せる
悪いところ
クソ度がやや上品
Qiita民に「普通に面白いじゃん」と言われる危険
一回触ると満足してしまう
継続的な狂気が弱い
AI感が薄い
乱数だけだと「ChatGPT使った意味」が弱く見える
改善案
生成文に微妙な一貫性バグを混ぜる
同一人物なのに名前が微妙に違う
日付と内容が噛み合わない
未来の日記、存在しない曜日
「これはあなたの実体験の可能性があります」など
不安を煽る一文を毎回添える
→
「安全に成立するクソアプリ」
初回企画としては非常に堅実。
案②「ぴったりカレンダー破り〜年越し編〜」
いいところ
コンセプトが強すぎる
タイトルだけで勝っている
操作が完全に無意味な目押し
技術と成果が一切比例しない
トラブルイベントが支離滅裂
クソアプリの理想形
年越しという誰もが知っている文脈
説明しなくても伝わる
悪いところ
実装コストが高い
タイマー、乱数イベント、演出管理が必要
説明文が長くなりがち
読み手が置いていかれる可能性
Webアプリとしてはやや不自然
「タイムスリップ」の扱いをどう表現するか問題
改善案
成功・失敗の結果は完全に同じ
達成感を徹底的に潰す
トラブルはテキスト表示だけ
演出を削って狂気を文章に集中
成功率を内部的に固定
プレイヤーの腕は一切関係ない
→
「思想で殴ってくるクソアプリ」
Qiitaで刺さるが、荒れる可能性も高い。
比較まとめ
「まず完走したい」 → ①
「爪痕を残したい」 → ②
正直に言うと、
Qiita企画1本目としては①で肩慣らし、
ウケたら②を「続編」として出すのが一番賢いルートです。
次は
どちらを採用するか
もしくは①に②の狂気を少量混ぜるか
そこを決めましょう。
(ここで折りたたみ終了)
すごくメタいこと言ってますね。
全文読まない人向けのまとめpart.2です。
①は「5Wの乱数で文」といえば伝わり、実装が軽い
②は複雑で、ゲーム要素が強い
とのことです。
正直実装難易度などはすべてAIに丸投げするので気にしてないのですが、
②に関してAIが「成功率を内部レート(確率)にしてプレイヤーの腕を無視する」って
面白くない気がします。
っていうか②はもうゲームとしてアイデアが湧き上がってくるので
ゲームとして後日作ることにしましょう。
結局作るのはどっち?
「どうでもいいことを全力で判定するアプリ」と「乱数日記」、どちらがいいでしょうか。
ChatGPTの返答(全文)
結論からいきます。
Qiita企画として・完走率・読みやすさ・再現性を全部考えると、
今回は 「乱数日記」 のほうが明確に有利です。
以下、理由を分解します。
- Qiita記事としての強さ
どうでもいいことを全力で判定するアプリ
判定ロジックが曖昧になりやすい
→ 「その判定基準どこから来た?」と突っ込まれる
ChatGPTを使う必然性が薄い
→ ただのif文アプリに見えがち
ネタが言語センス依存
→ 書き手のキャラが前に出すぎる
乱数日記
仕様が完全に説明可能
→ 5W × 乱数 = 誰でも理解できる
AIに丸投げした構図が見せやすい
→ 企画タイトルと一致
成果物が「ログ」として残る
→ 記事内でスクショや出力例を貼れる
→ Qiitaでは「分かりやすく説明できる狂気」が正義
- 実装・事故率
判定アプリ
判定文の調整で沼りやすい
面白くしようとして無限に修正が発生
途中で「これ普通に便利では?」となる危険
乱数日記
配列+乱数+保存で終わる
バグっても「仕様です」で押し切れる
面白くなくても成立する
→ クソアプリとして強い
- コンセプトの純度
判定アプリ
「全力で判定」と言いつつ
実際はそれっぽい文章生成
AIが賢いほどクソ度が下がる
乱数日記
意味のなさが最初から仕様
AIが頑張るほど不安感が増す
人間の関与ゼロという美しさ
最終判断
初回記事・単発企画・完走重視
→ 乱数日記
キャラ勝負・炎上覚悟・連載向け
→ どうでもいいこと判定アプリ
今回は
「ChatGPTとクソアプリを開発してみる【AI】」
というタイトルなので、
ChatGPTに考えさせた結果、何も意味が生まれなかった
というオチを作れる「乱数日記」が一番きれいです。
次の一手としておすすめなのはこれです。
「では、この『乱数日記』を作ることにします。
まずはChatGPTに、仕様をそのまま投げてみます。」
この一文のあとに続く最初のプロンプト、用意しますが行きますか。
(ここで折りたたみ終了)
案の定めちゃくちゃメタいですね。
全文読みたくない人向けまとめpart.3です。
・「乱数日記」のほうが有利(メタ)
・「どうでもいいことを全力で判定するアプリ」には言い換えをするメカニズム
(端的に言えば言い換えAI)を作る必要がある(めんどくさ)
(↑作るのは自分じゃない定期)
・返答を見る限り多分ChatGPTは「AIと開発したクソアプリ」ではなく
「AIを使ったクソアプリ」を作ろうとしている?
認識の相違が生まれてますね。言語化能力のないだけ。ゆるして。
ちなみにkusoogleでの「乱数日記」の検索結果はこちら↓
「20件の類似クソアプリが見つかりました
あなたのアイデアは量産型クソアプリです。」
実装スタート
ChatGPTにプロンプトを投げます。
それでは「乱数日記」を作ってもらいたいと思います。
言語はhtmlです。ファイルのサイズ制限はありませんが、ワンファイルでお願いします。
AIの返答(全文)
了解しました。
それでは以下の仕様で 「乱数日記」Webアプリ を実装します。
仕様の整理(受領内容)
言語:HTML(CSS・JavaScriptを同一ファイル内に含める)
構成:ワンファイル
機能概要
「いつ・どこで・誰が・何を・どうした」の5要素を乱数で選択し、1文の日記を生成
生成された日記は保存され、後から読み返すことができる
ファイルサイズ制限:なし
外部ライブラリ:使用しない(純HTML / CSS / JS)
保存機能は、Webアプリかつワンファイル構成であることを踏まえ、
ブラウザの localStorage を使用します。
以下が完成コードです。
このまま random_diary.html などとして保存すれば動作します。
(略)
この時点で、
意味はない
自分の意思は介在しない
なぜ保存されているのか分からない
という クソアプリとして重要な条件は満たしています。
次に記事としてやると映えるのは
ChatGPTに丸投げした感想
実際に生成された日記のスクリーンショット
「思ったよりちゃんと動いた」オチ
です。
次は
「実際に動かしてみた結果」パートを書くか、
それとも
仕様をさらに歪めてクソ度を上げるか、
どちらに進みますか。
(ここで折りたたみ終了)
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<title>乱数日記</title>
<style>
body {
font-family: system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif;
background: #f4f4f4;
margin: 0;
padding: 20px;
}
h1 {
margin-top: 0;
}
button {
padding: 10px 16px;
font-size: 16px;
cursor: pointer;
}
.diary {
margin-top: 20px;
padding: 12px;
background: #ffffff;
border-radius: 6px;
}
.log {
margin-top: 30px;
}
.entry {
background: #ffffff;
margin-bottom: 10px;
padding: 10px;
border-radius: 6px;
font-size: 14px;
}
.date {
font-size: 12px;
color: #666;
}
</style>
</head>
<body>
<h1>乱数日記</h1>
<p>
この日記は、あなたの意思を一切反映しません。<br>
すべては乱数によって決定されます。
</p>
<button id="generate">日記を生成する</button>
<div class="diary" id="currentDiary" style="display:none;"></div>
<div class="log">
<h2>過去の日記</h2>
<div id="entries"></div>
</div>
<script>
const whenList = [
"ある平日の朝",
"深夜",
"休日の午後",
"雨が降っていた日",
"なぜか目が覚めた時間帯"
];
const whereList = [
"自室で",
"通学路で",
"知らない場所で",
"インターネットの向こう側で",
"布団の中で"
];
const whoList = [
"私が",
"友人が",
"知らない誰かが",
"過去の自分が",
"将来の自分が"
];
const whatList = [
"スマートフォンを",
"意味のないボタンを",
"昨日の出来事を",
"よく分からない装置を",
"この日記を"
];
const howList = [
"静かに眺めていた",
"突然破壊した",
"特に理由もなく放置した",
"深く反省した",
"なかったことにした"
];
function rand(arr) {
return arr[Math.floor(Math.random() * arr.length)];
}
function generateDiary() {
const sentence =
rand(whenList) + "、" +
rand(whereList) + rand(whoList) +
rand(whatList) +
rand(howList) + "。";
return sentence;
}
function loadEntries() {
const entries = JSON.parse(localStorage.getItem("randomDiary") || "[]");
const container = document.getElementById("entries");
container.innerHTML = "";
entries.forEach(e => {
const div = document.createElement("div");
div.className = "entry";
div.innerHTML = `
<div class="date">${e.date}</div>
<div>${e.text}</div>
`;
container.appendChild(div);
});
}
document.getElementById("generate").addEventListener("click", () => {
const text = generateDiary();
const now = new Date().toLocaleString();
const entry = { date: now, text };
const entries = JSON.parse(localStorage.getItem("randomDiary") || "[]");
entries.unshift(entry);
localStorage.setItem("randomDiary", JSON.stringify(entries));
const current = document.getElementById("currentDiary");
current.style.display = "block";
current.textContent = text;
loadEntries();
});
loadEntries();
</script>
</body>
</html>
現段階で5の5乗通りの組み合わせ(=3125通り!)が作れます。
リストを改造してもっとクソなアプリに改造します。
改造後の選択肢はこちら(視認性向上のため折りたたみ)
const whenList = [
"ある平日の朝",
"深夜",
"休日の午後",
"雨が降っていた日",
"なぜか目が覚めた時間帯",
"携帯の着信で起きた朝"
];
const whereList = [
"自室で",
"通学路で",
"知らない場所で",
"インターネットの向こう側で",
"布団の中で",
"自分の昨日書いたクソコードのせいで",
"このクソアプリのせいで",
"画面の向こうのお前のせいで"
];
const whoList = [
"私が",
"友人が",
"知らない誰かが",
"過去の自分が",
"将来の自分が",
"先輩が",
"上司が",
"母が",
"某緑頭が"
];
const whatList = [
"スマートフォンを",
"意味のないボタンを",
"昨日の出来事を",
"よく分からない装置を",
"この日記を",
"JAMを",
"私を"
];
const howList = [
"静かに眺めていた",
"突然破壊した",
"特に理由もなく放置した",
"深く反省した",
"なかったことにした",
"クソコードにした",
"STACKしていた",
"大声で叩き起こした。「先輩のクソコードのせいで本番が燃えてるのだ!」と"
];
(ここで折りたたみ終了)
Qiitaネタがいっぱい。
「JAMをSTACK」の元ネタ↓
「本番炎上目覚まし」の元ネタ↓
テストプレイ
十回試行してみます。
①雨が降っていた日、自室で知らない誰かが意味のないボタンをなかったことにした。
②なぜか目が覚めた時間帯、自分の昨日書いたクソコードのせいで友人が私を
大声で叩き起こした。「先輩のクソコードのせいで本番が燃えてるのだ!」と。
③ある平日の朝、インターネットの向こう側で私が昨日の出来事を
なかったことにした。
④ある平日の朝、画面の向こうのお前のせいで友人がよく分からない装置を
STACKしていた。
⑤深夜、インターネットの向こう側で将来の自分が私をクソコードにした。
⑥なぜか目が覚めた時間帯、自室で友人が意味のないボタンを突然破壊した。
⑦なぜか目が覚めた時間帯、インターネットの向こう側で上司がスマートフォンを
なかったことにした。
⑧深夜、通学路で某緑頭が昨日の出来事を深く反省した。
⑨携帯の着信で起きた朝、通学路で知らない誰かがよく分からない装置を
クソコードにした。
⑩雨が降っていた日、通学路で私がJAMをなかったことにした。
おわりに
今回は乱数で自動的に文章を生成するクソwebアプリをAIに開発させました。
公開はしていないのでhtmlをコピーして各々で実行してください。
2026/2/4追記:githubで公開しました!
面白いと思ってもらえたら嬉しいです。
アドバイスや訂正などありましたらお気軽にお声がけください。
以上終了解散!
シツレイシマース!