目次
第1章 技術の学び方
1.1 技術の学びはなぜ難しくなったのか
- 1.1.1 要件の多様さと複雑さ
- 1.1.2 技術的選択肢の増加と進化
- 1.1.3 クラウドサービスの普及による要求スキルの広がり
1.2 「技術の引き出し」を作ろう
- 1.2.1 歴史を知って「点」の理解を「線」にする
- 1.2.2 技術のつながりを把握して「線」の理解を「面」にする
- 1.2.3 技術の「面」を階層としてとらえ「立体」的に理解する
第2章 Webシステムの全体像
2.1 Webシステムの構造
2.2 Webコンテンツ
2.3 クライアントサイドの構成要素
- 2.3.1 デバイス
- 2.3.2 Webブラウザ
- 2.3.3 HTTPクライアント
- 2.3.4 レンダリングエンジン
- 2.3.5 JavaScriptエンジン
2.4 サーバサイドの構成要素
- 2.4.1 Webサーバ
- 2.4.2 Webアプリケーションのはじまり
- 2.4.3 Webアプリケーションの実行方式
- 2.4.4 Webアプリケーションのソフトウェアスタック
2.5 ネットワークとインターネット
- 2.5.1 大量アクセスをさばくロードバランサ
- 2.5.2 CDNで縮まる世界
- 2.5.3 ネットワークに対する理解は必要か
2.6 Webシステムの実行環境と開発環境
- 2.6.1 クライアントサイドの実行環境
- 2.6.2 サーバサイドの実行環境
- 2.6.3 Webシステムの開発環境
2.7 Webシステムを実現するための技術
第3章 WWWの基本要素とその発展
3.1 World Wide Webの始まり
- 3.1.1 WWWの基本要素
- 3.1.2 連続的変化の維持
3.2 URIとハイパーリンク
- 3.2.1 Memexとザナドゥ
- 3.2.2 リンクの単純化
- 3.2.3 ハイパーメディアの実現
3.3 HTTP
- 3.3.1 HTTPを試してみよう
- 3.3.2 HTTP設計時の工夫
- 3.3.3 スキーム
- 3.3.4 フォーマットネゴシエーション
3.4 SGMLから生まれたHTML
- 3.4.1 汎用マークアップ言語・SGML
- 3.4.2 SGMLと文書構造
- 3.4.3 論理構造と体裁の分離
3.5 CSSによる視覚情報の分離
- 3.5.1 WWWの普及とブラウザ戦争
- 3.5.2 CSSの考え方
- 3.5.3 CSSのさまざまな指定方法
- 3.5.4 さまざまなCSSセレクタ
3.6 データ構造を記述するXML
- 3.6.1 データ表現に適さないHTML
- 3.6.2 XMLの登場
- 3.6.3 スキーマによるデータ構造の規定
- 3.6.4 XHTMLの登場と衰退
3.7 HTML5策定とHTML Living Standardへの統一
- 3.7.1 WHATWGの発足
- 3.7.2 HTML 5の登場
- 3.7.3 HTML Living Standardへの統一
第4章 HTTPクライアントとHTTPサーバ
4.1 Webアプリケーションの根本を学ぼう
- 4.1.1 フレームワークに隠されたWebアプリケーションの本質
- 4.1.2 Webアプリケーションの根本はシンプル
4.2 最小のHTTPサーバを実現する
- 4.2.1 ncコマンドで実現するHTTPサーバ
- 4.2.2 リクエストの待ち受け
- 4.2.3 レスポンスの返却
- 4.2.4 パイプによるサーバ実行の効率化
4.3 レンダリングエンジンの働きを確認する
- 4.3.1 レスポンスを保存してブラウザで開く
- 4.3.2 HTMLファイルの準備
4.4 HTTPクライアントをブラウザに変更する
- 4.4.1 仕組みを理解して問題解決に役立てよう
- 4.4.2 正しいレスポンスを返す
4.5 動的なコンテンツの生成
- 4.5.1 fortuneコマンドによる動的コンテンツ
- 4.5.2 CGIの登場
- 4.5.3 テンプレートエンジンの元祖・SSI
- 4.5.4 テンプレートエンジンへの進化
4.6 Webアプリケーションへの発展
第5章 URLとHTTP
5.1 URLの基本構造
- 5.1.1 スキーム
- 5.1.2 ホスト
- 5.1.3 パス
5.2 URLの詳細構造
- 5.2.1 ユーザとパスワード
- 5.2.2 ポート
- 5.2.3 オーソリティ
- 5.2.4 クエリ
- 5.2.5 フラグメント
- 5.2.6 URLに使える文字
- 5.2.7 パーセントエンコーディング
5.3 HTTPの基本
- 5.3.1 HTTPリクエスト
- 5.3.2 HTTPレスポンス
5.4 HTTPリクエストの実践
- 5.4.1 サーバが受信したリクエストを確認しよう
- 5.4.2 GETリクエストの確認
- 5.4.3 POSTリクエストの確認
- 5.4.4 Content-Typeによる送信形式の違い
- 5.4.5 GETとPOSTの使い分け
第6章 従来型のWebアプリケーション
6.1 GoによるWebアプリケーション
6.2 Goによる簡単なWebサーバの作成
- 6.2.1 文字列を返すアプリケーション
- 6.2.2 ファイルの内容を返すアプリケーション
6.3 ToDoアプリケーションで学ぶ基礎
- 6.3.1 アプリケーション本体(main.go)
- 6.3.2 テンプレートファイル(todo.html)
- 6.3.3 ToDo項目の追加
6.4 Webアプリケーションの画面遷移
- 6.4.1 画面遷移の問題点
- 6.4.2 リダイレクトによる安全な画面遷移
- 6.4.3 Post-Redirect-Getの実装
- 6.4.4 Post-Redirect-Getの動作確認
6.5 Webアプリケーションの状態管理
- 6.5.1 ステートレスなHTTP
- 6.5.2 ブラウザの情報保管庫「クッキー」
- 6.5.3 セッションの考え方
- 6.5.4 セッションの実装
- 6.5.5 セッション管理不備の危険性
6.6 セッションとユーザ管理
- 6.6.1 ユーザ認証の必要性
- 6.6.2 ユーザ認証に対応したTiny ToDo
6.7 ユーザ認証の実装
- 6.7.1 セッション情報を保持する構造体
- 6.7.2 セッションを管理する構造体
- 6.7.3 ユーザ情報を保持する構造体
- 6.7.4 ログイン画面の表示
- 6.7.5 /loginのリクエストハンドラ
- 6.7.6 認証処理
- 6.7.7 Post-Redirect-Getでのメッセージ受渡
- 6.7.8 ハッシュ値によるパスワードの照合
- 6.7.9 認証のチェック
6.8 Webアプリケーションの複雑性をカバーするフレームワーク
- 6.8.1 Webアプリケーションの複雑さ
- 6.8.2 Webアプリケーションフレームワークが提供する機能
- 6.8.3 Webアプリケーション・フレーワークの裏側を知ろう
第7章 SPAへの進化
7.1 SPAへの潮流
- 7.1.1 従来型Webアプリケーションの問題点
- 7.1.2 Ajaxによるブレイクスルー
7.2 JavaScriptの起源と発展
- 7.2.1 JavaScriptの誕生
- 7.2.2 クライアントサイドJavaScriptとサーバサイドJavaScript
- 7.2.3 簡単なクライアントサイドJavaScript
- 7.2.4 Document Object Model
- 7.2.5 イベントドリブンプログラミング
- 7.2.6 JavaScriptの不遇
- 7.2.7 JavaScriptの発展
7.3 Tiny ToDoのUIを改善する
- 7.3.1 編集のUIを考える
- 7.3.2 JavaScriptによる編集UIの改善
7.4 サーバとの非同期通信
- 7.4.1 form要素によるPOSTリクエストの送信
- 7.4.2 同期通信と非同期通信
- 7.4.3 XMLHttpRequestによる非同期通信
- 7.4.4 Fetch APIによる非同期通信
7.5 Tiny ToDoに非同期通信を実装する
- 7.5.1 ToDoリストの管理方法を改善する
- 7.5.2 Fetch APIによるToDoの更新
- 7.5.3 編集処理の実装
- 7.5.4 編集処理の動作確認
7.6 JSONによるデータ交換
- 7.6.1 XMLとJSON
- 7.6.2 ToDoの追加をJSONでやりとりする
- 7.6.3 ToDoリストをJSONで返す
- 7.6.4 SPA化されたTiny ToDoの動作確認
7.7 フラグメントによる状態の表現
- 7.7.1 変化しないURLの課題
- 7.7.2 フラグメントによる状態表現
- 7.7.3 Tiny ToDoでのフラグメント活用
7.8 SPAの課題とサーバサイドレンダリング
- 7.8.1 初期のSPAが抱えた課題
- 7.8.2 History APIによる画面遷移とルータ
- 7.8.3 サーバサイドレンダリングへの回帰
第8章 Web API
8.1 APIのWeb化
- 8.1.1 URLの役割の変化
- 8.1.2 APIとはなにか
- 8.1.3 ネットワーク越しのAPI
- 8.1.4 SOAPに頼らないWeb APIの課題
8.2 REST
- 8.2.1 RESTの登場と論争
- 8.2.2 RESTとWeb API
8.3 リソース指向アーキテクチャ
- 8.3.1 アドレス可能性
- 8.3.2 接続性
- 8.3.3 統一インターフェース
- 8.3.4 ステートレス性
- 8.3.5 RESTful Web API
8.4 Tiny ToDoのWeb API設計
- 8.4.1 ToDoのリソース設計
- 8.4.2 リソースに対する操作の抽出
- 8.4.3 ToDoリストの取得
- 8.4.4 ToDo項目の新規追加
- 8.4.5 ToDo項目の編集
- 8.4.6 ToDo項目の削除
- 8.4.7 Tiny ToDo Web API仕様のまとめ
- 8.4.8 HTTPメソッドとCRUD
- 8.4.9 HTTPメソッドの「安全」と「べき等」
8.5 Tiny ToDoのWeb API化
- 8.5.1 ToDoの追加
- 8.5.2 ToDoの編集
- 8.5.3 サーバサイドのWeb API化
- 8.5.4 パスパラメータの解析
8.6 Web APIの公開
- 8.6.1 Web APIを直接呼び出す
- 8.6.2 API公開で広がるWebの世界
- 8.6.3 クロスオリジン通信
- 8.6.4 同一オリジンポリシー
- 8.6.5 CORSによるクロスオリジン制限の回避
- 8.6.6 CORSに対応したTiny ToDo
8.7 再注目されるRPCスタイル
- 8.7.1 APIの粒度
- 8.7.2 小粒度APIの課題
- 8.7.4 GraphQL
第9章 サーバプッシュ技術
9.1 サーバプッシュ技術の歴史
- 9.1.1 メタリフレッシュによる疑似サーバプッシュ
- 9.1.2 通信量の削減
- 9.1.3 Ajaxによるポーリング
- 9.1.4 Comet(ロングポーリング)
9.2 Server-sent eventsによるプッシュ配信
- 9.2.1 チャンク転送
- 9.2.2 Server-sent events
9.3 Server-sent eventsの実践
- 9.3.1 Tniy ToDoをSSEに対応させる
- 9.3.2 SSEの実装(クライアント側)
- 9.3.3 SSEの実装(サーバ側)
9.4 WebSocket
- 9.4.1 WebSocketの登場
- 9.4.2 WebSocketの概要
- 9.4.3 WebSocketのハンドシェイク
9.5 WebSocketの実践
- 9.5.1 WebSocket通信の確認
- 9.5.2 WebSocketの実装(クライアント側)
- 9.5.3 WebSocketの実装(サーバ側)
- 9.5.4 WebSocketの課題
付録A コンピュータの基礎
A.1 2進数と16進数
- A.1.1 2進数を扱いやすく表現する16進数
- A.1.2 16進数の利用例
A.2 テキストとバイナリ
- A.2.1 テキストデータとバイナリデータ
- A.2.2 テキストデータの符号化方式
- A.2.3 テキストとバイナリの効率
A.3 文字コード
- A.3.1 文字の取り扱いの難しさ
- A.3.2 符号化文字集合
- A.3.3 フォント
- A.3.4 Unicode
- A.3.5 文字符号化方式(エンコーディング)
- A.3.6 文字符号化方式はなぜ生まれたか
- A.3.7 改行コード
A.4 Base64エンコーディング
A.5 ハッシュ値
- A.5.1 ハッシュ関数の特徴
- A.5.2 ハッシュ値の用途
A.6 IPアドレスとドメイン名
- A.6.1 IPv4アドレスとIPv6アドレス
- A.6.2 ドメイン名とDNS
A.7 TCP/IP
- A.7.1 通信レイヤ
- A.7.2 TCPコネクション
- A.7.3 UDP
- A.7.4 ポートとファイアウォール
A.8 標準入力と標準出力
A.9 構造化データの表現
- A.9.1 CSV/TSV
- A.9.2 プロパティファイル/INIファイル
- A.9.3 XML
- A.9.4 JSON
- A.9.5 YAML
付録B WSLのインストール
B.1 環境の確認
- B.1.1 Windowsのバージョン確認
- B.1.2 仮想化支援機能の有効化確認
B.2 WSLのインストールと実験の準備
- B.2.1 WSLとUbuntuのインストール
- B.2.2 ncコマンドのエイリアス設定
B.3 WSLの使い方
- B.3.1 WSLの起動と終了
- B.3.2 ディストリビューションの再インストール
付録C Go言語入門
C.1 Goのインストール方法
- C.1.1 Windows環境へのインストール
- C.1.2 macOS環境へのインストール
C.2 はじめてのGoプログラム
- C.2.1 hello, worldを表示するプログラム
- C.2.2 プログラムの実行
- C.2.3 実行ファイルのビルド
- C.2.4 Goプログラムの基本要素
- C.2.5 A Tour of Go
- C.2.6 Go Playground
C.3 Go学習時の注意点
付録D 補足資料
D.1 telnetコマンドのインストール方法
- D.1.1 Windows環境へのインストール
- D.1.2 macOS環境へのインストール
D.2 サンプルコードのダウンロードと実行
- D.2.1 サンプルコード
- D.2.2 サンプルコードの実行
- D.2.3 利用ポートが重複して起動できないときの対処
- D.2.4 プログラムを修正したときの実行方法
- おわりに
- 謝辞
- 索引