はじめての“動くアプリ”を1本作る|メモ帳をステップバイステップで【入門4】

バイブコーディング

はじめての“動くアプリ”を1本作る|メモ帳をステップバイステップで【入門4】

ここまでは準備運動。この記事で、あなたは初めて“自分で動くアプリ”を1本完成させる。題材は、ブラウザで動く小さなメモ帳。コードは1行も書かない。AIに頼んで、出てきた物を動かすだけ。10分後、あなたの画面には「自分が作ったアプリ」が表示されているはずだ。

今日のゴール:ブラウザで動く「ミニメモ帳」

作るのは、こんな道具だ。文字を打って「追加」を押すと、下にメモが並ぶ。たったこれだけ。でも、これが立派な「動くアプリ」の第一号になる。なぜメモ帳かというと、①作りやすく、②動いたのが一目で分かり、③自分で毎日使えるからだ。最初の成功体験には、これ以上ない題材だ。

準備は 【入門2】で作った AIチャット(Claude・ChatGPT・Gemini など)だけ。では始めよう。

ステップ1:AIに「いちばん小さい形」を頼む

チャットに、こう打ち込む。

「プログラミング未経験です。ブラウザで動く小さなメモ帳を作りたいです。テキスト入力欄と『追加』ボタンがあり、押すと下にメモが一覧表示されるだけの、いちばん小さい形を、1つの HTML ファイルだけで作ってください。コピーして使えるよう全文を出してください。」

ポイントは「1つのHTMLファイルだけで」と指定すること。こうするとファイルが1個で済み、初心者でも動かすのがぐっと簡単になる。

ステップ2:出てきたコードを「ファイル」にする

AIが <html>…</html> で始まる長い文字(コード)を出してくれる。これを保存して動かす。怖くない、手順はこれだけだ。

  1. AIの出したコードの全文をコピーする(多くの場合、コード枠の右上に「コピー」ボタンがある)。
  2. パソコンの「メモ帳」(Windows)や「テキストエディット」(Mac)を開く。
  3. 貼り付ける。
  4. 「名前を付けて保存」で、ファイル名を memo.html にして保存する(拡張子を .txt でなく .html にするのがコツ)。

保存場所は、デスクトップに myapps のようなフォルダを1つ作って、そこにまとめるのがおすすめだ。2本目・3本目と増えてきたとき、自分の作品をひと目で見渡せる「作品棚」になる。

ステップ3:ダブルクリックして、動かす

保存した memo.htmlダブルクリックする。すると、いつものブラウザ(Chrome など)が開いて、あなたのメモ帳が表示される。文字を打って「追加」を押してみよう。下にメモが並んだら、おめでとう。あなたは今、自分で作ったアプリを動かした。

この「打つ→押す→並ぶ」が動いた瞬間の感覚を、よく覚えておいてほしい。これがバイブコーディングの“効いた”瞬間だ。

ブラウザで動くミニメモ帳。入力欄と追加ボタンの下に、追加したメモが並んでいる
ステップ3まで進んだ状態。文字を打って「追加」を押すと、下にメモが並ぶ。これが最初の「動くアプリ」だ。

このアプリのHTMLコード全文を見る(読めなくても大丈夫)
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>メモ帳</title>
<style>
  body{ font-family:"Hiragino Kaku Gothic ProN","Yu Gothic",sans-serif;
        max-width:460px; margin:40px auto; padding:0 16px; color:#222; }
  h1{ font-size:22px; }
  input{ font-size:16px; padding:8px; width:65%; }
  button{ font-size:16px; padding:8px 16px; }
  ul{ padding-left:20px; }
  li{ margin:8px 0; font-size:16px; }
</style>
</head>
<body>
  <h1>メモ帳</h1>
  <input id="text" type="text" placeholder="メモを入力">
  <button id="add">追加</button>
  <ul id="list"></ul>
<script>
  const input = document.getElementById('text');
  const list = document.getElementById('list');
  document.getElementById('add').onclick = function(){
    const v = input.value;
    if(v === '') return;
    const li = document.createElement('li');
    li.textContent = v;
    list.appendChild(li);
    input.value = '';
  };
</script>
</body>
</html>

いま何が起きたのか(30秒だけ仕組みの話)

魔法に見えるので、種明かしを少しだけ。memo.html の中身は、ブラウザへの指示書だ。「入力欄を置け」「ボタンを置け」「押されたら下に文字を並べろ」という指示が、HTMLとJavaScriptという言葉で書いてある。ダブルクリックすると、ブラウザがその指示書を上から読んで、画面を組み立てる。それだけのことが起きている。

例えるなら、AIが書いたのは「舞台の台本」で、ブラウザは「劇団」。あなたは台本を劇団に渡した(ダブルクリックした)だけだ。台本が読めなくても、舞台は上演される。この感覚が掴めると、「コードは分からないけど怖くない」に変わる。台本の中身が気になったら、ファイルを右クリック→メモ帳で開けば、いつでも眺められる。読めなくても、上演には何の支障もない。

ここでつまずく人が多い、3つの罠

ステップ2〜3は簡単そうに見えて、実は最初の脱落ポイントでもある。うまくいかないときは、たいていこの3つのどれかにはまっている。

  1. ファイル名が memo.html.txt になっている … Windows は標準設定だと拡張子(.txt)を隠すので、見た目は memo.html でも中身は .txt のまま、ということが起きる。エクスプローラーの「表示」メニューで「ファイル名拡張子」にチェックを入れ、本当の名前を確かめる。
  2. ダブルクリックしたらメモ帳が開いた … 壊れていない。開くソフトの割り当てが違うだけだ。ファイルを右クリック→「プログラムから開く」→ Chrome などのブラウザを選べばいい。
  3. 日本語が文字化けした … 保存時の文字コードが原因のことが多い。「名前を付けて保存」の画面で文字コードを「UTF-8」にして保存し直す。直らなければ、AIに「日本語が文字化けします」とそのまま伝えれば、対策入りのコードを出し直してくれる。

3つとも、あなたのせいでもコードのせいでもない。パソコン側の“初期設定の癖”だ。一度越えれば、次からは起きない。

もう1つ、AI側の癖も知っておくと慌てない。長いコードを頼むと、出力が途中で切れることがある。画面の最後が </html> で終わっていなければ切れているサインで、「続きを出してください」と打てば残りが出てくる。切れたまま貼ると、それこそ動かない原因になる。コピーの前に「最後まで出ているか」をひと目確認する。

動いたら、この3つだけ確かめる

「動いた気がする」で先へ進まず、30秒だけ触って確かめる癖を、最初の1本から付けておこう。

  1. 追加できるか … 文字を打って「追加」を押すと、下に並ぶ。
  2. 連続で使えるか … 2件目・3件目も同じように追加できる。空っぽのまま押したらどうなるかも見ておく。
  3. 再読み込みするとどうなるか … F5 を押すと、いまのメモは消えるはずだ。壊れたのではない。まだ「保存する仕組み」を足していないだけで、これは次に足す機能の最有力候補になる(入門6で扱う)。

この「触って確かめる30秒」が、後の入門6で出てくる「1つ足したら動かして確かめる」の原型になる。

ステップ4:小さく1つだけ、機能を足してみる

動いたら、欲が出てくる。それでいい。ただし一度に1つだけ足すのが鉄則だ。AIにこう続ける。

「いいですね。次は、各メモの右に『削除』ボタンを足して、押したらそのメモだけ消えるようにしてください。さっきのコードを全部書き直して、全文を出してください。」

新しいコードをまた memo.html に貼り直して保存し、ブラウザを更新(F5)すれば反映される。「1つ足す→動かす→また1つ」。この小さな往復が、未経験者を完成まで運ぶ唯一の道だ。

各メモの右に削除ボタンが付き、背景がクリーム色・ボタンが深緑に変わったメモ帳
ステップ4で「削除ボタン」を足し、さらに背景をクリーム色・ボタンを深緑にした“自分仕様”のメモ帳。機能は同じでも、色と名前が変わると愛着がまるで違う。

このアプリのHTMLコード全文を見る(読めなくても大丈夫)
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>わたしのメモ帳</title>
<style>
  :root{ --cream:#fbf6e9; --green:#1f5c3d; --green-dark:#17492f; }
  *{ box-sizing:border-box; }
  body{ margin:0; font-family:"Hiragino Kaku Gothic ProN","Yu Gothic",sans-serif;
        background:var(--cream); color:#2b2b2b; display:flex; justify-content:center;
        padding:48px 16px; min-height:100vh; }
  .app{ width:100%; max-width:460px; }
  h1{ font-size:26px; margin:0 0 22px; text-align:center; color:var(--green); }
  .row{ display:flex; gap:8px; margin-bottom:22px; }
  #text{ flex:1; padding:13px 14px; font-size:16px; border:2px solid #e3dcc4;
         border-radius:10px; background:#fff; }
  #text:focus{ outline:none; border-color:var(--green); }
  button.add{ padding:13px 22px; font-size:16px; font-weight:bold; color:#fff;
        background:var(--green); border:none; border-radius:10px; cursor:pointer; }
  button.add:hover{ background:var(--green-dark); }
  ul{ list-style:none; margin:0; padding:0; display:flex; flex-direction:column; gap:10px; }
  li{ display:flex; align-items:center; gap:10px; background:#fff; padding:15px 16px;
      border-radius:10px; box-shadow:0 1px 3px rgba(0,0,0,.08); }
  li span{ flex:1; word-break:break-word; }
  button.del{ border:none; background:#f2e9cf; color:var(--green); border-radius:8px;
      padding:7px 13px; font-size:14px; cursor:pointer; }
  button.del:hover{ background:#e7dab0; }
  .empty{ text-align:center; color:#a99f7d; padding:24px 0; }
</style>
</head>
<body>
  <div class="app">
    <h1>わたしのメモ帳</h1>
    <div class="row">
      <input id="text" type="text" placeholder="メモを入力…" />
      <button class="add" id="add">追加</button>
    </div>
    <ul id="list"></ul>
  </div>
<script>
  const KEY = 'watashi-no-memo';
  const input = document.getElementById('text');
  const list = document.getElementById('list');
  let memos = JSON.parse(localStorage.getItem(KEY) || '[]');
  function save(){ localStorage.setItem(KEY, JSON.stringify(memos)); }
  function render(){
    list.innerHTML = '';
    if(memos.length === 0){
      const p = document.createElement('li');
      p.className = 'empty'; p.textContent = 'まだメモはありません';
      list.appendChild(p); return;
    }
    memos.forEach((m, i) => {
      const li = document.createElement('li');
      const span = document.createElement('span'); span.textContent = m;
      const del = document.createElement('button');
      del.className = 'del'; del.textContent = '削除';
      del.onclick = () => { memos.splice(i,1); save(); render(); };
      li.appendChild(span); li.appendChild(del);
      list.appendChild(li);
    });
  }
  function add(){
    const v = input.value.trim();
    if(!v) return;
    memos.push(v); save(); input.value=''; render(); input.focus();
  }
  document.getElementById('add').onclick = add;
  input.addEventListener('keydown', e => { if(e.key==='Enter') add(); });
  render();
</script>
</body>
</html>

2個目・3個目の「足す」の実例

削除ボタンの次に何を足すか。定番の進化ルートを2つ挙げておく。頼み方ごと真似してほしい。

  • 「閉じても消えないようにする」 … いまのメモ帳は、ブラウザを閉じるとメモが消える。「ページを閉じてもメモが残るように、ブラウザに保存する仕組みを足してください。全文を出してください」と頼む。ブラウザには localStorage という小さな保存箱があり、AIはそれを使ったコードを返してくる。名前は覚えなくていい。「閉じても残る」が実現することだけ確かめる。
  • 「見た目を自分の物にする」 … 「タイトルを『◯◯のメモ帳』にして、背景をクリーム色、ボタンを深緑にしてください」。機能が同じでも、色と名前が自分仕様になると、道具への愛着がまるで違ってくる。

どちらも「1つ足したら動かして確かめる」は同じ。3回この往復をやれば、頼む→貼る→確かめるのリズムが手に馴染む。

メモ帳の次は、あなたの生活から選ぶ

この記事の型は、題材を差し替えてもそのまま使える。例えば「今日やること3つだけを書くToDoリスト」「飲んだ水の回数を数えるカウンター」「子どもの寝た時間を記録するメモ」。どれも作りは今日のメモ帳とほぼ同じで、入力して・押して・並ぶ、の変形だ。頼み方の冒頭を「ブラウザで動く小さな◯◯を、1つのHTMLファイルだけで」に差し替えれば、2本目が始まる。

コツは、メモ帳より少しだけ複雑な物を選ぶこと。同じ物を作り直しても学びは薄く、いきなり大物だと折れる。「半歩だけ先」が一番伸びる。

うまくいかなくても、それが普通

もし表示が崩れたり、ボタンが効かなかったりしても、落ち込む必要はない。つまずくのは正常運転だ。次の記事では、その「エラーが出たとき」にAIへどう聞けば一発で直るか、詰まりを自分でほどく方法を扱う。今日はまず、「自分にも動くアプリが作れた」という事実だけ持ち帰ってほしい。


👉 前へ: 【入門3】AIへの伝え方 ・ 次へ: 【入門5】エラーが出たらどうする?記事一覧

AIに「作りたい」を正しく伝える3つのコツ|プロンプト入門【入門3】AIに「作りたい」を正しく伝える3つのコツ|プロンプト入門【入門3】前のページ

エラーが出たらどうする?AIへの聞き方とデバッグの基本【入門5】次のページエラーが出たらどうする?AIへの聞き方とデバッグの基本【入門5】

ピックアップ記事

  1. 競艇予想AIの作り方 — LightGBMで「当たる順位」を学習させる実装ガイド…

  2. Claude Mission Control の作り方 — Tauri+Pyth…

  3. New Eden Intelligence Hub の作り方 — EVE Onl…

  4. 高精度OCRデスクトップアプリの作り方 — PaddleOCR-VLとPyIns…

関連記事

  1. 都市開発シミュを作る③|需要・成長・経済の決定論シミュレーション(MVP完成)【Aurum City制作】

    アプリの作り方

    都市開発シミュを作る③|需要・成長・経済の決定論シミュレーション(MVP完成)【Aurum City…

    需要・成長・経済で街を動かす決定論シミュレーションの作り方。種から回す…

  2. バイブコーディングのやり方 — AIで「動くアプリ」を最後まで完成させる進め方を、実例7本で全部見せる
  3. 都市開発シミュを作る②|AIでドット絵タイルを生成+道路オートタイリング【Aurum City制作】
  4. エラーが出たらどうする?AIへの聞き方とデバッグの基本【入門5】

    バイブコーディング

    エラーが出たらどうする?AIへの聞き方とデバッグの基本【入門5】

    赤いエラー、真っ白な画面、反応しないボタン。ここで多くの人が止まる。エ…

  5. 作ったアプリを公開する|ローカルから人に使ってもらうまでの最短ルート【入門7】

    バイブコーディング

    作ったアプリを公開する|ローカルから人に使ってもらうまでの最短ルート【入門7】

    自分のパソコンの中で動くアプリを、URL1本で世界に出す。無料の公開サ…

  6. バイブコーディングの始め方|AIツールの選び方と最初のセットアップ【入門2】

    バイブコーディング

    バイブコーディングの始め方|AIツールの選び方と最初のセットアップ【入門2】

    最初に必要な道具はたった1つ。ブラウザのAIチャット(Claude/C…

注目

AIで、ここまで作れる

AIで作った2D RPGを、ブラウザでそのまま遊べます。その「作り方=最後まで完成させる進め方」も実例つきで公開中。

▶ ゲームを遊ぶやり方を読む

PR

ロリポップ!レンタルサーバー(PR)

レンタルサーバ:ロリポップ!(本サイトの稼働環境・PR)

  1. Claude Cowork がデバイス横断 — 端末を閉じても続くリモート実行

    AI・テック動向

    Claude Cowork がデバイス横断 — 端末を閉じても続くリモート実行
  2. 背景除去アプリを作る②|AIなしでここまで抜ける — FloodFill・クロマキー・Color-to-Alphaの古典CVエンジン【背景除去Studio制作】

    アプリの作り方

    背景除去アプリを作る②|AIなしでここまで抜ける — FloodFill・クロマ…
  3. Claude Code のスクリーンリーダーモード — 機械処理に流用しようとして間違えた

    AI・テック動向

    Claude Code のスクリーンリーダーモード — 機械処理に流用しようとし…
  4. AIアセットでゲームマップを作る — 生成スケッチの透過切り出しからレベルセレクトまで

    アプリの作り方

    AIアセットでゲームマップを作る — 生成スケッチの透過切り出しからレベルセレク…
  5. 都市開発シミュを作る③|需要・成長・経済の決定論シミュレーション(MVP完成)【Aurum City制作】

    アプリの作り方

    都市開発シミュを作る③|需要・成長・経済の決定論シミュレーション(MVP完成)【…
PAGE TOP

TAG CLOUD

ドラッグで回転・クリックでそのタグの記事一覧へ