1. index route
  2. show route with numeric id
  3. new form route
  4. edit route
  5. different resource posts
  6. posts edit
  7. unmatched 3-part returns 404
  8. root path returns 404
  9. trailing slash treated same as without
コース一覧
コンピューターサイエンス入門:理論編
URL ルーティング

コンピューターサイエンス入門:理論編

2 進数、論理演算、ビット演算、データ構造、計算量、メモリモデルなど、プログラミングの土台となるコンピュータサイエンスの理論知識を学べるコースです。プログラミングを始めたばかりの学習者や、CS の体系的な土台を作りたい現役エンジニアを対象としています。約 13 時間 (1 日 30 分 × 26 日) で 53 レッスンを修了でき、修了後はコードのパフォーマンスや設計判断の根拠を理解した上で実装できるようになります。

1
2進数とビット演算
01. 2進数から10進数への変換5分
02. 10進数から2進数への変換5分
03. ビットAND演算でフラグ判定5分
04. OR / XOR でフラグを操作する5分
05. popcount で 1 のビット数を数える5分
06. シフト演算で 2 倍 / 半分5分
07. 16 進数から 10 進数への変換5分
08. 第 1 章まとめクイズ5分
2
文字コードと真偽値ロジック
01. 文字 → ASCII コード5分
02. コード → 文字5分
03. UTF-8 のバイト長を返す5分
04. AND / OR の真理値表5分
05. NOT / XOR の真理値表5分
06. 含意 (→) を AND/OR/NOT で表現5分
07. ド・モルガンの法則5分
08. 第2章まとめクイズ5分
3
計算量とBig-O
01. forループの実行回数を返す5分
02. 入れ子ループの実行回数5分
03. 線形探索 (O(n))5分
04. 二分探索 (O(log n))5分
05. バブルソート5分
06. 配列の最大と最小5分
07. 累積和で範囲合計5分
08. 第3章まとめクイズ5分
4
データ構造 (基本)
01. スタック (push/pop) を実装する5分
02. キュー (enqueue / dequeue) を実装する5分
03. カッコのバランス判定 (スタック応用)5分
04. set で重複を除去する5分
05. map で出現回数を数える5分
06. 二数の和 (map で O(n))5分
07. アナグラム判定5分
08. 第 4 章クイズ — データ構造 (基本)5分
5
ファイル / メモリ / IO 概念
01. バイト → KB 変換5分
02. ディスクサイズフォーマット5分
03. キャッシュヒット率5分
04. LRU 簡易シミュレーション5分
05. エンディアンの入れ替え (uint32)5分
06. バッファ範囲チェック5分
07. 第5章まとめクイズ5分
6
ネットワークと符号化
01. Base64 エンコード後の長さ計算5分
02. URL エンコード対象文字数5分
03. IPv4 アドレスを 32bit 整数に変換5分
04. 32bit 整数を IPv4 アドレスに変換5分
05. CIDR プレフィックスからネットマスクを作る5分
06. 単純チェックサム5分
07. 第6章まとめクイズ5分
7
設計と DB 基礎
01. 重複データを 1NF に変換 (フラットなリスト化)5分
02. キーで join (map 利用)5分
03. 残高転送のトランザクション風処理5分
04. CAP の availability 模擬5分
05. URL ルーティング5分
06. 疎結合と密結合 — 依存性注入で設計を変える12分
07. コース総まとめクイズ5分

URL ルーティング

届くのは /users/42/edit という文字列 1 本だけ

ブラウザからサーバーに届くのは、/users/42/edit のような文字列です。これを見て、ユーザーの編集画面を組み立てる処理を呼ぶ。その対応を誰かが決めない限り、サーバーは何も呼べません。この振り分けをルーティングと呼びます。

MVC は、振り分け先の処理を Controller、データの読み書きを Model、画面の組み立てを View と呼び分けた整理です。ルーティングはその入口にあたる部分で、今回はここだけを扱います。

対応を 1 行ずつ手で書くこともできますが、それでは /users/1 /users/2 と ID の数だけ行が要ります。実際のルーターは URL を区切って、位置ごとに何が来ているかで行き先を決めます。

区切ると、先頭に空文字が生まれる

区切り文字はスラッシュです。ただし素直に区切ると、想定していないものが混ざります。

JavaScript

"/articles/7/edit".split("/") // ["", "articles", "7", "edit"]

URL はスラッシュで始まるので、その手前に「何もない」部分があると解釈され、空文字が 1 つ増えます。この状態で「1 個目がリソース名」と数えると、全部 1 つずつずれます。末尾にスラッシュが付いた /articles/ でも同じことが後ろで起きます。

空の要素を落としてしまえば、どちらの書かれ方でも同じ形になります。

JavaScript

"/articles/7/edit".split("/").filter(p => p.length > 0) // ["articles", "7", "edit"]

こうすると、要素が何個あるかと、何個目に何が入っているかだけで判断できます。今回の課題で返す文字列は次の対応です。

URL返す文字列
/usersUsers#index
/users/newUsers#new
/users/42Users#show
/users/42/editUsers#edit

2 個に割れたときだけ、2 個目の中身を見ないと決まりません。new なら新規作成の画面、それ以外は ID とみなして詳細です。/users/new を先に詳細と判定してしまうのがいちばん多い間違いなので、new の確認を ID とみなす処理より前に置いてください。

リソース名を Controller の名前に直す

URL には articles と小文字で書かれていますが、返す文字列の側は Articles です。先頭の 1 文字だけを大文字にします。

Python

"member".capitalize() # 'Member'

JavaScript

const s = "member"; s.charAt(0).toUpperCase() + s.slice(1); // 'Member'

JavaScript には 1 つで済むメソッドがないので、先頭 1 文字と 2 文字目以降を分けてつなぎます。Python の capitalize は 2 文字目以降を小文字に直してしまうので、userProfile のような綴りを渡すと Userprofile になります。今回の入力は全部小文字なので、そのまま使えます。

やってみよう

route(url) を完成させてください。

  1. スラッシュで区切り、空の要素を捨てる
  2. 残った要素の個数で分ける。3 個のときは末尾が edit かどうかまで確かめる
  3. リソース名の頭文字を大文字にして、# の後ろに続く名前とつなぐ
  4. 上の表のどれにも当てはまらなければ 404 を返す

/users/42/delete のように、3 個に割れても末尾が edit ではない URL がありえます。個数だけで edit と決めつけないでください。

要件

  1. URL を / で分割し、空要素を捨ててから判定する
  2. リソース名の頭文字を大文字に変換する(users → Users)
  3. ルールにマッチしない URL は '404' を返す

入出力例

route("/users") → "Users#index" route("/users/42") → "Users#show" route("/users/new") → "Users#new" route("/users/42/edit") → "Users#edit" route("/posts/9") → "Posts#show" route("/posts/9/edit") → "Posts#edit" route("/users/42/foo") → "404" route("/") → "404" route("/users/") → "Users#index"

ヒント

Python なら `url.strip('/').split('/')` で分割するのが簡単

`/users/new` の判定は、`/users/42` の判定よりも先に行う

頭文字大文字化は Python なら `.capitalize()`、JS なら `s[0].toUpperCase() + s.slice(1)`

生田 陸人
監修生田 陸人
ゆめさくエンジニア / 現役ソフトウェアエンジニア監修者プロフィールを見る →
編集 ゆめさく編集部·公開 2026/05/19·更新 2026/08/26

関連レッスン

  • 疎結合と密結合 — 依存性注入で設計を変える

    疎結合と密結合の違いを比喩・図・コードで理解する。依存性注入(DI)で結合度を下げると、テスト容易性と変更耐性が同時に上がる。

  • コース総まとめクイズ

    cs-theory コース全 7 章の応用問題。2 進数からビット演算、計算量、データ構造、ネットワーク、DB 設計まで横断的に振り返ります。

  • CAP の availability 模擬

    CAP 定理の Availability(可用性)を、複数ノード上の最新値を多数決で返す関数として実装します。

  • 残高転送のトランザクション風処理

    口座間の残高転送を、ACID の Atomicity(原子性)を満たすように実装します。残高不足ならロールバックして変更しません。

このレッスンに出てくる用語

意味があいまいなまま進んだ語は、ここから読み直せます。

  • ブラウザユーザーから見たWebのクライアント
  • サーバークライアント(ブラウザなど)がリクエストを送り、サーバーがレスポンスを返す。
  • 処理計算や代入を表す長方形
  • ルーティングURLパスとHTTPメソッドに応じて処理を振り分ける仕組み。
  • ルーターURL ごとの処理を束ねたモジュール
  • URLページの住所全体
  • 判断YES/NO 分岐を表す菱形
  • JavaScriptWeb で動的な振る舞いを担う言語
main.py
学習モード
エディタを読み込んでいます

メモ

URL ルーティング

⌘S で保存