「Webを支える技術」内容メモ  第1部

## はじめに
有名な技術書「[Webを支える技術](https://www.amazon.co.jp/dp/B07JK7FZH2/ref=cm_sw_em_r_mt_dp_5d.bGb9MC39FB)」の内容について個人的に取りまとめたメモです。
9月に買った当初は内容が理解できなかったのですが、今改めて読み返してみると理解できるようになっている部分が多くなっていて感慨深いものがありますね。勿論未だに理解に苦しむ部分も沢山ありましたが・・・・

タイトルに「第1部」と書くことで、本書を継続して理解することを自分に義務付けました。

未来の自分頑張ってね


#### 第1章

###### Web(World Wide Web)について
現在の生活のほぼ全てに紐づいているWebの技術は、大きく3つ

- Webサイト
Amazon, Googleなど、普段使いするWebサイト

- UIとしてのWeb
ルータやテレビなどネットワークに接続するデバイスの設定もブラウザで行うものが多い
(リモコンなどより、キーボードで操作した方が効率的であるため)

- プログラム用API※としてのWeb
UIとしてのWebが人間用なら、こちらはプログラム用のWeb
jsonファイルなど、プログラムで解釈しやすいフォーマットが使われる

※API (Application Programming Interface)
自己のソフトウェアの一部を公開して、外部から利用できるようにしたもののこと？
例えば、レストランのWebページが存在していて、住所が記載されているWebページにGoogleMapが載っている
→Googleの公開する「GoogleMap」というWebAPIをレストラン側が利用しているイメージ

###### Webを支える技術
→「HTTP」と「URI」と「HTML」。

- HTTP (Hypertext Transfer Protocol)
本書が書かれた当時の最新バージョンはHTTP/1.1 (2021年1月現在の最新バージョンはHTTP/3)。
TCP/IPと呼ばれるプロトコルがベースとなっている

- URI (Uniform Resource Identifier)
Webに存在する全てのリソースを一意に表すことができる
厳密には異なるが、いわゆる「URL(... Locator)」もこれのこと


- HTML (HyperText Markup Language)
タグで文書構造を表現するコンピュータ言語。最新バージョンはHTML5.2。
Webの重要な側面であるハイパーメディア※フォーマットを実現する

※ハイパーメディア
テキストや画像、音声、映像などのメディアをリンクで結びつけて構成したシステムのこと
Webに関係する技術は「ハイパー」の文字が入っている場合、重要とされるみたい


#### 第2章

###### 集中/分散システム

- 集中システム
端末をホストコンピュータに接続し、ホストで集中して処理を行う手法

- 分散システム (Webはこっち）
複数のコンピュータを組み合わせて処理を分散させ、全体の性能をあげる手法
時代が進み端末1つ1つの性能が上がることで、この考え方が生まれた
端末とホストの間のインターフェースとして、HTTPというプロトコルが使われる

###### REST
数十年の歴史を持つWebの代表的なアーキテクチャ※。
過去に別のアーキテクチャ「SOAP」と優劣について議論があったが、最終的にRESTが受け入れられた

※アーキテクチャ
ITの分野での意味は、技術に関する共通の仕様だとか、考え方のこと


#### 第3章

###### RESTについて

- アーキテクチャスタイルとしてのREST
下記に記載した、「クライアント/サーバ」と呼ばれるアーキテクチャスタイルから派生したものがREST
各構成要素に制約をつけることで、構成要素が協調して動作するようになる
RESTの考え方はWeb全体に調和させる必要がある。個人的なWebサービスやWeb APIを作る場合でも守ることが大事！

- リソース
Web上に存在する名前を持ったあらゆる情報のことを表す。
リソースの名前 = URIのこと。世界中のリソースはURIで一意の名前を持っている
(例えばインターネット上のWebページで、URLが同じなのに全く違うコンテンツであることはない)
URIを用いることで、リソースが表現する情報に簡単にアクセスすることができるようになった


###### RESTのスタイル
以下の6つが採用されている
6つを採用したアーキテクチャスタイルをREST、または**ULCODC$SS**と呼ぶ。

- クライアント/サーバ
クライアントがサーバにリクエストを送り、サーバがレスポンスを返す仕組み
クライアントとサーバで別々に処理するため、クライアントはいろいろなものが使える(PCやスマホ、ゲーム機など）

- ステートレスサーバ
クライアントの状態をサーバが管理しないスタイル※のこと
サーバ側の実装を簡略化することができるというメリットがある
※Cookieを利用するWebサービスは、サーバがクライアントの状態を管理する体制をとっているためRESTの視点から見ると厳密には間違っているので、必要最低限の利用とすることを心がける

- キャッシュ
一度取得したリソースをクライアント側で使い回すこと
通信の読み込みにかかる時間が減ったりと効率的に処理ができる
読み込んだWebページを消して改めて表示した場合、初めよりも早く表示されるのはこのアーキテクチャスタイルが実装されているおかげ

- 統一インターフェース
URIで指定したリソースに対する操作を、8つの限定的なインターフェースで指定するスタイル
全体のアーキテクチャをシンプルにし、クライアントとサーバの実装の独立性が向上する

- 階層化システム
システムをいくつかの階層に分離するスタイルのこと

- コードオンデマンド
プログラムコードをサーバからダウンロードし、クライアント側で実行するスタイルのこと
JvaScriptやJavaアプレット、Flashなどが代表的
あらかじめ用意された機能だけでなく、新しい機能を追加できるのが特徴
プロトコルの可視性が低下してしまうことが欠点(通信の意味や、アクセス先のリソースがわかりづらい？)


###### RESTの側面

- RESTとハイパーメディア
普段Webを利用するときは、リンクを辿ってリソースにアクセスしていく。RESTではこれを「アプリケーション状態エンジンとしてのハイパーメディア」と定義している
リソースをリンクで接続することで1つのアプリケーションを構成するという考え方は、RESTの基幹となる考え方


- RESTと分散システム
上記で述べたように、RESTはリンクを辿ることでリソースにアクセスし、アプリケーションを実現する
RESTでリソースにアクセスすると、RPCやCORBAと呼ばれる分散オブジェクトでデータを呼び出すよりも、データの性能劣化を抑えることができる
また互換性の問題も発生しない

###### RESTの意義

RESTはWeb全体のアーキテクチャ。
個別のWebサービスやWeb APIがRESTful※になれば、Web全体が良くなっていく
サービスを作るときは、一度RESTの理論に基づいているかどうか考えてみることが大事

※RESTの考え方に基づいて設計されること

## 終わりに

第1部のメモでした。
書いてみて思ったことは、「文字に起こした方が書籍を流し見する何倍も理解できる」ということです。

インターネットに公開するという意識で書くと、間違ったことは記事にできませんからしっかり理解しようと努力できますね。
第2部以降も頑張りたいところではある・・・！