mitsu's techlog

Customer Reliability Engineerになりました。備忘録も兼ねて技術ネタを適当に。技術以外はこっち→http://mitsu9.hatenablog.com/

「Webを支える技術」を読んだ(/・ω・)/

「Webを支える技術 -HTTP、URI、HTML、そしてREST-」を読んだ(/・ω・)/

これまでWebサービスを使ったり、実装したりとしてきたけど、改めて体系的にWebについて勉強するといろいろ良かった。 就職前に読んでおいて良かったなーと思った。 Webサービス作り始めの頃とかに読んでおきたかった。

各章で書いてあったことと感じたことをメモしておく。 (自分のメモ書きなのでこれを読めば本一冊読んだことになる的なやつではありません)

1部

1章 Webとは何か

Webっていろんなところで使われてるねって話。

2章 Webの歴史

  • Web以前のインターネット・ハイパーメディアの紹介・問題点
  • Webの登場と標準化の歴史

Web以前のインターネットとか知らないことが多くておもしろかった。

3章 REST - Webのアーキテクチャスタイル -

  • REST = アーキテクチャスタイル
    • クライアント/サーバ
    • ステートレスサーバ
    • キャッシュ
    • 統一インターフェース
    • 階層化システム
    • コードオンデマンド

Web世界の秩序を守るためにもRESTfulなサービスやAPIを作ろう。

2部 URI

4章 URIの仕様

  • URI = Uniform Resource Identifier
    • URIスキーム
    • ユーザ情報
    • ホスト名
    • ポート番号
    • パス
    • クエリパラメータ
    • URIフラグメント
  • 絶対URIと相対URI
    • 相対URIを使うときはベースURIが必要
    • ベースURIはHTMLので指定できる
  • URIで使用できない文字を使うときはUTF-8で%エンコーディングする

相対URIとかは気にしたことなかったので勉強になった。

5章 URIの設計

  • 良いURI = 変わらないURI
  • URIが変わるときはリダイレクトする
  • URIの重要性
    • URIはリソースの名前
    • URIは寿命が長い
    • URIはブラウザがアドレス欄に表示する

リンク先に飛んだら404とか悲しい気持ちになるし、Web的にも良くないよね。 良いURIをつけられるようになろう。

3部HTTP

6章 HTTPの基本

  • TCP/IP上で動作するアプリケーション層のプロトコル
  • HTTP 1.1が今広く使われている
  • リクエストメッセージ
    • リクエストライン
    • ヘッダ
    • ボディ
  • レスポンスメッセージ
    • ステータスライン
    • ヘッダ
    • ボディ
  • ステートレス
    • 利点:サーバはアプリケーション状態を覚える必要がない→シンプル、スケーラブル
    • 欠点:パフォーマンスの低下、通信エラーへの対処

HTTPは凄いシンプルなプロトコル。だからこそここまで広く使われているんだろうなーと思った。 一方でシンプルだからこその欠点もあるのでそれは知っておく必要があるしいい勉強になった。

7章 HTTPメソッド

  • 8つのメソッド
    • GET、POST、PUT、DELETE、HEAD、OPTIONS、TRACE、CONNECT
  • POSTとPUTの使い分け
    • POST:クライアントはリソースのURIを指定できない
    • PUT:リソースのURIはクライアントが決める
  • べき等性と安全性
    • べき等 = ある操作を何回行っても結果が同じ
    • 安全 = 操作対象のリソースの状態を変化させない

べき等と安全は意識しないと、使い勝手の悪いサービスを作ってしまうなーと感じた。

8章 ステータスコード

良くみるステータスコードは勝手に覚えてるけど、それ以外のものはいつかゆっくり見てみたい。

9章 HTTPヘッダ

  • ヘッダにのせられる情報
    • 日時
    • MIMEメディアタイプ
    • 言語タグ
    • コンテントネゴシエーション
    • Content-Length、チャンク転送
    • 認証
    • キャッシュ
    • 持続的接続

HTTPがシンプルに設計され、かつ広く使われているのはこのヘッダが大きな役割をしてるなと感じた。 上手く使いこなせるようにまずはどんなヘッダがあるかを知らないとなーと。

4部 ハイパーメディアフォーマット

10章 HTML

  • HTML = Hypertext Markup Language
  • XML名前空間
    • 複数のXMLフォーマットを組み合わせる時に名前の衝突を防ぐ

HTMLの本当の基本しか書かれていなかったので知ってることが多かった。 XML名前空間の話とかは見たことあったけどよくわかってなかったので勉強になった。

11章 microformats

  • セマンティックWeb
    • セマンティクス = 意味論
    • リソースが持つ意味を確定させる
    • 人間が読んで解釈するだけでなくプログラムも解釈できるようにする
  • 標準化済みのmicroformats(一部)
    • hCalendar:イベント情報
    • hCard:プロフィール情報
    • rel-lisence:ライセンス情報

イベントとかよく使うものは標準化しておくとスクレイピングなどするときに統一感があって楽になるって感じなのかな。 標準化されててもそれを使うか独自実装するかは個々人の勝手やけど、標準化されたものに従えばWeb世界は整理された綺麗なところになる。 ここらへんは知ってるか知らないかで大きく変わるからいろいろ知っておきたい。

12章 Atom

  • Atomの目的 = RSSの標準仕様策定
  • AtomRSS(ブログ)だけでなく検索エンジンや写真管理など様々使える
  • Atomのリソースモデル
    • メンバリソース
      • エントリリソース
        • メタデータ:ID、タイトル、著者、更新日時が必須。他には概要説明やカテゴリなど。
        • 内容:text、htmlなどを入れられる
      • メディアリソース
    • コレクションリソース(フィード)
      • メタデータ:ID、タイトル、著者、更新日時が必須
      • フィード独自のメタデータ:サブタイトル、生成プログラム、アイコン、ロゴ
  • Atomの拡張

RSSとかでAtomって文字は見たことあったけど、今回初めてきちんと勉強した。 拡張もいろいろされていて、広く使われているんだろうなーという印象。 便利やとは思うけどどういう時に適しているかまではわからなかったので、一回自分で書くなりして触ってみたいなと感じた。

13章 Atom Publishing Protocol

AtomのエントリーをGETとかPOSTとかできるよーぐらいの理解しかしてない。 ブログサービスとかはこういう風にして設計・実装されてるのかなーとか思った。

14章 JSON

JSONAPI叩く時に良く見てたし便利だよねって感じ。

5部 Webサービスの設計

15章 読み取り専用のWebサービスの設計

  • リソース設計
  • リソース指向アーキテクチャ
    1. Webサービスで提供するデータの特定
    2. データをリソースに分ける
    3. リソースにURIで名前をつける
    4. クライアントに提供するリソースの表現を設計する
    5. リンクとフォームを利用してリソース同士を結びつける
    6. イベントの標準的なコースを検討する
    7. エラーについて検討する

郵便番号検索サービスの例をあげて説明されてたのでイメージしやすくわかりやすかった。 設計に関しては場数踏むしかないのかなとは思ってるので、本に書かれていたことを意識しながらいろいろ作っていきたいなと思った。

16章 書き込み可能なWebサービスの設計

バッチ処理トランザクション排他制御まで考えて実装したことがなかったので、大規模なサービスとかエラーが許されないサービスとかだといろいろ考えないといけないんだなと感じた。 また、これらを実現するために特別なプロトコルなどは利用しておらずHTTPのみで実現されているのは凄いなと思った。 ここらへんはある程度手法が確立されていてデザインパターンみたいになっているのかなと思うので、そこらへんも勉強していかなきゃなーと感じた。

17章 リソースの設計

設計手法は様々知っていると適切なカードが切れて将来便利かもしれないと思った。