For Beginners

はじめての
システムづくり 入門

「家族旅行プランナー」で実際に使った技術を、ゼロからやさしく
📖 このテキストについて
プログラミング未経験の方が、今回作ったシステムの「中身」を理解するための読み物です。 会計のお仕事にたとえながら、専門用語を一つずつ解説します。所要 約25〜35分。 通勤の電車で、上から順にどうぞ(途中でやめてもOK)。

1システムって何? 全体像をつかむ

最初に、いちばん大事な「全体像」をつかみます。ここが分かると、後の細かい話が一気にラクになります。

用語:システム
いくつかの部品(プログラム・データ・外部サービス)が連携して、ひとつの仕事をやり遂げる仕組み全体のこと。

会計の世界に「会計システム」がありますよね。仕訳入力・元帳・試算表・帳票出力…と、別々の機能が連携して 「経理」という1つの仕事をこなします。今回作ったものも同じで、複数の部品が連携して「旅行プランを作って届ける」 という1つの仕事をします。

登場する部品(これだけ覚えればOK)

部品役割会計でいうと
LINEボット注文を受けて結果を返す「窓口」受付担当
Claude(AI)行き先を選び文章を書く「執筆者」外注ライター
HTML/CSSきれいな成果物(ページ)清書した報告書
Netlifyネットに公開しURLを発行する「棚」提出先サーバー
JSON家族情報・訪問履歴などの「記録」マスタ台帳

仕事の流れ(5ステップ)

① データを読む(誰の・どんな条件か)
   ↓
② Claudeが行き先を選び、文章を書く
   ↓
③ それをHTML(きれいなページ)にする
   ↓
④ Netlifyに公開してURLを作る
   ↓
⑤ LINEでそのURLを届ける

このあとの章は、この5ステップに出てくる部品を1つずつ、ていねいに見ていきます。 「今どの部品の話か」を意識すると迷子になりません。

↑ もくじへ

2インターネットとWebの基礎

Webページがスマホに表示されるとき、裏で何が起きているのか。ここは全ての土台です。

「お願いする側」と「応える側」

用語:クライアントとサーバー
クライアント=お願いする側(あなたのスマホ・ブラウザ)。 サーバー=お願いに応えて返す側(ページを持っているコンピュータ)。

あなたがブラウザでURLを開く=「このページください」とサーバーにお願い(リクエスト)し、 サーバーが「どうぞ」と返事(レスポンス)でページを返す。この往復がWebの基本動作です。

たとえると
レストランの注文と同じ。あなた(客=クライアント)が「カレーを」と注文(リクエスト)し、 厨房(サーバー)が作って提供(レスポンス)する。

住所のしくみ:URL

用語:URL
インターネット上の「住所」。例:https://sss-family-trips.netlify.app/seiha.html

分解すると――
https:// … 通信の方式(sは「暗号化=安全」の印)
sss-family-trips.netlify.app … どのサーバーか(ドメイン名=建物の名前)
/seiha.html … その中のどのページか(部屋番号)

結果は数字で返る:HTTPステータス

用語:HTTPステータスコード
お願いの結果を表す3桁の数字。200=成功、403=拒否(権限なし)、404=見つからない、500=サーバー側の故障。

今回のLINE設定中、「403」が出ました。これは「鍵が合わず受け付けを拒否」という意味。 鍵を正しく直したら「200(成功)」に変わり、設定完了が確認できました。 数字の意味を知っていると、トラブルの原因がすぐ絞れます。

↑ もくじへ

3ページの作り方(HTML・CSS)

旅行プランの「雑誌みたいなページ」は、HTMLとCSSという2つの言葉でできています。役割がはっきり分かれています。

HTML=中身と構造

用語:HTML
ページの「中身」と「構造」を書く言葉。見出し・段落・画像・リンクなどをタグで囲んで表します。
<h1>箱根の旅</h1>        ← 大見出し
<p>涼しい高原へ。</p>       ← 段落
<img src="写真URL">        ← 画像

<h1>のように、タグで要素の種類を示します。開始タグと終了タグ(</h1>)で挟むのが基本です。

CSS=見た目(デザイン)

用語:CSS
色・余白・文字サイズ・配置などの「見た目」を整える言葉。HTMLが「内容」、CSSが「体裁」。
h1 { color: green; font-size: 30px; }
   ↑どの要素に  ↑何を   ↑どうする
たとえると
会計報告書で、HTML=「数字と文章そのもの」、CSS=「フォント・罫線・レイアウトの体裁」。 中身と体裁を分けておくと、体裁だけ後から一括変更できて便利、という発想です。
このプロジェクトでは
あなたが「左右が詰まって読みにくい」と指摘した不具合は、まさにCSSの余白(padding)の設定ミスでした。 中身(HTML)はそのままに、CSSの余白を直すだけで読みやすくなりました。

スマホ対応=レスポンシブ

用語:レスポンシブデザイン
画面の幅に応じて、レイアウトが自動で最適化される作り。PCでは横3列、スマホでは縦1列、のように。

このページ自体もレスポンシブです。文字幅を読みやすい幅に抑え、スマホで自然に縦に流れるようにしています。

↑ もくじへ

4ネットに公開するしくみ(Netlify)

作ったHTMLは、そのままでは自分のPCの中だけ。みんなが見るには「公開」が必要です。

用語:ホスティング
作ったページを、誰でもアクセスできる場所に「置く」こと。場所を貸す業者をホスティングサービスという。
用語:Netlify(ネットリファイ)
HTMLを置くと、自動でURLを発行して公開してくれるサービス。今回は無料枠で利用。
たとえると
自分のPCの報告書=自分の引き出しの中(自分しか見られない)。 Netlifyに置く=全社共有フォルダに置く(URLを知る人は誰でも見られる)。
用語:デプロイ
作ったものを公開環境に「配置・反映」する作業のこと。「デプロイする」=「公開する」と思ってOK。

今回は publish.py というプログラムが、できたHTMLを全部まとめてNetlifyへデプロイし、 https://...netlify.app という固定URL(毎回同じ住所)を保ちます。 だから、一度妻に送ったURLは、中身が新しくなってもそのまま使えます。

↑ もくじへ

5データの持ち方(JSONという台帳)

「誰の・どこに行った・予算は」という情報は、JSONという形式のファイルに記録しています。

用語:JSON(ジェイソン)
プログラムが読み書きしやすい形で情報を書いた、ただの文字ファイル。メモ帳で開けます。

たとえば訪問記録 visited.json はこんな形です:

{
  "prefectures": ["東京都", "福岡県", "石川県"],
  "countries": ["シンガポール", "グアム"]
}

読み方のルール(これだけ)

このプロジェクトでは
あなたが旅行に行ったら visited.json の一覧に地名を足すだけ。 すると次の公開時に制覇マップが自動で塗られ、その場所は今後の提案から自動で除外されます。 データを1か所で管理し、複数の機能がそれを参照する――会計の「マスタ一元管理」と同じ考え方です。
なぜデータベースでなくJSON?
本格的なシステムは「データベース」を使いますが、家族用の小さな記録なら、メモ帳で開けて中身が見えるJSONの方が シンプルで安心。規模に合った道具を選ぶ、という判断です。
↑ もくじへ

6プログラムを動かす(Python)

「自動でやってくれる手順書」を書く言葉が、プログラミング言語です。今回はPythonを使いました。

用語:Python(パイソン)
読みやすく人気の言語。自動処理・データ処理・AI連携が得意。
用語:スクリプト
「これをこの順でやって」と書いた自動実行の手順書ファイル(.py)。
たとえると
Excelのマクロ(VBA)に近いです。手作業の繰り返しを書いておき、一発で実行させる。 例:publish.py=「HTMLを集めてNetlifyへ送る手順書」。

専用の道具箱:仮想環境

用語:仮想環境(venv)
このプロジェクト専用の「道具箱」。必要な追加部品をここにだけ入れ、PC全体を汚さない。
用語:ライブラリ/pip
ライブラリ=よく使う機能をまとめた「既製部品」。pip=それを取り寄せるツール(通販の注文係)。

今回は requests(ネット通信)、python-dotenv(鍵の読み込み)、Pillow(画像作成)などを 道具箱(.venv)に取り寄せて使いました。ゼロから作らず既製部品を組み合わせるのが、現代の開発の基本です。

↑ もくじへ

7AIに作らせる(Claude・サブスク)

行き先を選び、文章を書き、HTMLまで作る「執筆者」がAI(Claude)です。ここで重要なコスト判断もしました。

用語:Claude(クロード)
文章や画像を理解・生成するAI。今回は行き先選定とページ作成を担当。
用語:プロンプト
AIへの「指示書・依頼文」。良いプロンプト=良い成果物。auto/gen_prompt.md などがそれ。

プロンプトには「子は2歳」「未訪問から選ぶ」「写真は実在のものを」「夫婦の年齢は書かない」など、 細かい条件を全部書いてあります。AIはこの指示書に従って毎回ゼロから作るので、指示書の質がそのまま品質になります。

いちばん大事な判断:サブスク vs API

用語:API
プログラム同士が会話する「窓口」。AIをAPIで使うと、1回呼ぶごとに料金がかかる(従量課金)のが一般的。
用語:サブスク(定額制)
月額を払えば範囲内は使い放題。今回は claude.ai のサブスクを使い、使うたび課金を避けた。
たとえると
外注を「1件いくら(API)」で頼むか、「月額顧問契約(サブスク)」で頼むか。 たくさん使うなら顧問契約の方が安心――今回はそれを選び、コストを月額で固定しました。
用語:ヘッドレス実行
画面を出さず、裏でプログラムが自動でAIを呼んで仕事させること。定期配信・LINE依頼はこれで動きます。
実際にあったトラブル
古いAPIの鍵が設定に残っていて、サブスクで動かすべき所に間違って渡り「鍵が無効」で失敗しました。 「正しい鍵を、正しい窓口へ」――鍵の取り違えは初心者がよくやるミスです(第11章で詳述)。
↑ もくじへ

8LINEと連携する(ボットの心臓部)

「LINEで地名を送ると返ってくる」――この自動応答のしくみを、順を追って。

用語:Messaging API
LINE公式アカウントを、プログラムから操作するための窓口。これで送受信します。

3つの「送り方」

送り方意味使いどころ
ブロードキャスト友だち全員へ一斉定期配信
プッシュ特定の人へ依頼への返信
リプライ受信直後の即返信「作成中です🧳」

依頼の流れはこうです:地名を受信 → すぐリプライで「作成中」→(裏でAIが数分かけて生成)→ 完成したらプッシュでURLを送る。生成に時間がかかるため、即レスと完成連絡を分けているのがポイントです。

受信のしくみ:Webhook

用語:Webhook(ウェブフック)
「相手が、こちらの決めたURLへ自動で通知してくる」しくみ。 LINEは「ユーザーがメッセージを送った」を、こちらの公開URLに知らせてきます。
大事な気づき
LINEの受信は、こちらから「取りに行く」のではなく「向こうから来る」。 だから受け取るための公開URLが必要になり、これが第9章「トンネル」の話につながります。

本物か確かめる:署名チェック

用語:チャネルシークレット/署名チェック
シークレット=照合用の鍵。届いた通知が「本当にLINEから来た本物か」を、この鍵で計算して確認すること。
たとえると
会計の「印影照合」。届いた書類のハンコ(署名)が、登録印(シークレット)と一致するか確かめ、偽物を弾く。 今回の「403拒否」は、この照合に失敗していた(鍵が設定漏れだった)ためでした。
用語:リッチメニュー
LINEトーク画面の下に常駐するタップメニュー(今回の「制覇マップ/旅プラン一覧」)。 画像と「どこを押したら何が起きるか」をAPIで登録します。
無料枠の注意
LINEの無料プランは送信が月200通まで(配信+返信の合計)。家族利用なら十分ですが、上限がある点は意識を。
↑ もくじへ

9自宅PCを世界とつなぐ(サーバー・トンネル)

第8章で「受け取る公開URLが要る」と分かりました。でも、家のPCは普通インターネットから直接見えません。その解決策です。

用語:サーバー
「来た要求に応えて結果を返す」プログラム(やそれを動かすPC)。今回は line_server.py が受付サーバー。
用語:ポート
1台のPCの中で、サーバーがどの「窓口番号」で待つかの番号。今回は 8788番

なぜ直接つながらないのか

家庭のPCは、いわば「大きなビルの中の一室」。ビルには代表住所(プロバイダ)はありますが、 個々の部屋(PC)には外から届く表札がありません。だから外(LINE)から直接ノックできないのです。

用語:トンネル(ngrok/エングロック)
あなたのPC内のサーバーに、インターネットからアクセスできる「臨時の公開URL」を作ってくれる道具。 LINE → ngrokの公開URL → あなたのPCのサーバー、と橋渡しします。
たとえると
社内の内線電話(PC内サーバー)に、外線番号(公開URL)を一時的に割り当てるイメージ。 外から外線にかければ、ちゃんとその内線につながる。
実際にあったトラブル
ngrokの無料プランは「自分に割り当てられた住所」しか使えません。勝手な名前を指定して「ERR_313(有料プラン専用)」エラーに。 正しい割り当て住所(...ngrok-free.dev)を使って解決しました。サービスごとの「無料の範囲」を知るのも大切です。
↑ もくじへ

10自動で動かす(スケジューラ・常駐)

「何もしなくても月・木の12時に届く」――この自動運転のしくみです。

用語:常時起動/バックグラウンド
プログラムを画面に出さず、ずっと裏で動かし続けること。受付サーバーは常に待機している必要があります。
用語:スケジューラ
「毎週 月・木の12時になったら、これを実行」と予約しておくしくみ。

今回は受付サーバーの中に「時計を1分ごとに見る」処理を組み込み、 月・木の12時になったら自動で配信を始めます。別々の仕組みを増やさず、すでに常駐しているサーバーに役割を持たせた形です。

用語:スタートアップ
Windowsに「ログインしたら、これを自動起動して」と登録する場所。 ここにボット起動を登録したので、PCを立ち上げるたびに受付+定期配信が自動で動き出します。
用語:二重実行の防止
同じ配信を1日に2回出さないよう、「今日はもう出した」という印(last_auto.txt)を残して確認する工夫。
用語:ログ
プログラムが「いつ・何をしたか」を記録したファイル(auto/logs/)。 うまく動かない時は、まずここを見れば原因の手がかりが分かります。
たとえると
会計の「仕訳の証跡(エビデンス)」。後から「何が起きたか」を追えるように記録を残す、という同じ習慣です。
↑ もくじへ

11つまずき大全(今回ハマった話)

初心者がよく出会う「あるある」を、今回の実例で深掘りします。ここを読むと“なぜ”が腹落ちします。

① 日本語が「萓・」に化ける(文字コード)

用語:文字コード
文字をPCが保存するときの「符号の規格」。同じ文字でも規格が違うと別の数値で保存される。

コンピュータは文字を「数値(バイト)」で記録します。「あ」を何番にするかの取り決めが文字コード。 代表がUTF-8(世界標準)と、Windows日本語の古いcp932(Shift-JIS系)書いた時と読む時で規格がズレると、数値の解釈が食い違い、文字化けします。

今回の実例
設定ファイルをUTF-8で保存したのに、Windowsの古い仕組みがcp932として読み、日本語コメントが化けてエラーに。 対策は3つ:(1)UTF-8で統一 (2)ファイル先頭に「これはUTF-8です」の目印(BOM)を付ける (3)コメントを英語にする。 今回は状況に応じてこれらを使い分けました。

② 鍵の取り違え

「サブスクで動かすべき所」に「古いAPIの鍵」が渡ってしまい失敗(第7章)。 鍵は種類と用途があり、正しい鍵を正しい窓口へ渡すのが鉄則です。

③ ポートのバッティング

同じ窓口番号(8788)で2つのサーバーを起動しようとして衝突。「1つの窓口に受付は1人」。 古い方を止めてから起動して解決しました。

④ 順番の罠

LINE設定で「Webhookを有効化」しようとしたら「先にURLを登録して」と言われ、 逆に「URL登録」には「先に有効化」が要りそう…という“鶏と卵”に。 正解は「固定URLを先に決めておけば、URL登録 → 有効化 の順で進める」でした。 手順の前後関係を見抜くのも実務スキルです。

↑ もくじへ

12セキュリティの基本

いちばん大事な話。鍵の管理を間違えると、他人にサービスを悪用されます。

用語:トークン/シークレット(=鍵)
サービスを操作する権利の「パスワード」。漏れると悪用される。
たとえると
会計の「機密書類は施錠棚へ、持ち出し禁止」「印鑑は厳重管理、紛失したら改印」。まったく同じ感覚です。
↑ もくじへ

13用語ミニ辞典

用語ひとことで
システム部品が連携して1つの仕事をする全体
クライアント/サーバーお願いする側/応える側
リクエスト/レスポンスお願い/返事
URLネット上の住所
HTTP 200/403/404成功/拒否/見つからない
HTML / CSSページの中身/見た目
レスポンシブ画面幅に合わせて最適化
ホスティング/Netlify公開する場所/今回の公開サービス
デプロイ公開環境に反映する作業
JSONプログラム用の台帳ファイル
Python/スクリプト言語/自動実行の手順書
仮想環境(venv)/ライブラリ/pip専用道具箱/既製部品/取り寄せツール
Claude/プロンプトAI/AIへの指示文
API/サブスク従量課金の窓口/定額使い放題
ヘッドレス画面なしで裏で自動実行
Messaging APILINEをプログラムで操作する窓口
Webhook相手から自分のURLへ来る自動通知
ブロードキャスト/プッシュ/リプライ全員/特定/即時 の送り方
シークレット/署名チェック照合用の鍵/本物か確認すること
リッチメニューLINE下部の常駐タップメニュー
サーバー/ポート応えるプログラム/その窓口番号
トンネル(ngrok)PCに臨時の公開URLを作る道具
スケジューラ/スタートアップ時刻予約実行/ログイン時自動起動
ログ動作の記録ファイル
文字コード(UTF-8/cp932/BOM)文字の保存規格/その目印
トークン/.gitignore操作用の鍵/公開対象から外す指定
最後に
全部を一度に覚える必要はありません。「こういう部品が、こう連携している」という地図さえ頭にあれば、 細かい用語は必要なときに辞典で引けば十分です。今回あなたは、その地図をもう手に入れました。おつかれさまでした。
↑ もくじへ