woshidan's blog

そんなことよりコードにダイブ。

Webを支える技術を読みました

先月はちょびちょび電車の中や家の近くで「Webを支える技術」を読んでいました。 何かにまとめておかないとふんわりと忘れてしまいそうなので、各章ごとの感想をメモしておきます。

第一部

Webを支えるRestfulと呼ばれるアーキテクチャスタイルが、1つずつ制約を足していくなかで生まれた事、 制約がある事(あるいは基本的なフォーマットがきちんと定められている事)によって、 いろんな媒体でやり取りが出来る、普及した、の流れがとても面白かったです。

難しいことは考えなくていいように踏み切る、その思いっきりぶりに感嘆したり、 仕様策定戦争の辺りを昨今のJavaScriptフレームワーク情勢と重ねてみたりしていました。

第二部

複雑なURIのスキームの話がとても勉強になりました。 たとえば、引用させていただくとこういう部分。

http://yohei:pass@blog.example.jp:8000/search?q=test&debug=true#n10
  • URIスキーム : http
  • ユーザ情報 : yohei:pass
  • ホスト名 : blog.example/jp
  • ポート番号 : 8000
  • パス : /search
  • クエリパラメータ : q=test&debug=true
  • URIフラグメント : #n10

最近だと、FTPサーバに直接ログインしたりとかしないし、ベーシック認証もURIの入力ではしないでしょう。 sshでサーバに入る時もコマンド等の手順として覚えておけば十分ではあるのですが、 設定ファイル書いて外部サービスからgitでコード引っ張ってきたりアップロードしたりしたいときに、 知っていると地味に楽なような気がしました。

また、ユーザの意志の部分をクエリパラメータに、制作側の意志の部分をURIに、 という話も勉強になりました。

第三部

インターネット層がIP、トランスポート層UDPTCPということが未だに慣れません。

IPが行き来している網みたいな層がインターネット層で、 その網を使って、あそこからあそこまでね、と伝達を管理するのがトランスポート層ということなのでしょうが。 アプリケーション層はRailsなどでアプリケーションを書くときURIを通して叩く部分、と想像すると 少し分かりやすい気がしました。

HTTPメソッドの部分はすでに別の本でも触れた事があったため、そこまで難しく感じなかったのですが、 ステータスコードの頭の数字でクライアント側のデフォルトの処理が決まっているように実装されている話が面白かったです。

(たとえば、3xxが返ってきて、知らないステータスコードだったらデフォルトの処理で locationヘッダのURIへリダイレクトする、みたいな)

また、MIMEタイプのMIMEが何の略かMultipurpose Internet Mail Extensionなのですが、 これはWebの仕様を策定するときメールの仕様から策定する時の名残だそうです。 こういう話を聞くと、現在当たり前のものとして自分たちのところへ降ってくる規則も 人がつくっていたのだなぁ、と感じました。

ダイジェスト認証はベーシック認証よりちょっとよい認証です、程度の理解だったのですが、 読み直さないと正確に説明できる自信が無いのですが、 読み返したら仕組みが分かる程度に理解できてよかったな、と思いました。

キャッシュや条件付きGETの話も見返さないといけませんが、 きちんと目にしてよかったです。

第四部

AndroidXMLにあったときに割ととまどっていた、XMLの属性の名前空間の話が分かりやすかったです。 あとは、画像の埋め込みは

<img src="uri">

タグですが、動画の埋め込みが

<object data="uri">

なのを知らなくてびっくりしました。

<link rel="stylesheet" href="xxx.css" />

のrel属性がリンク関係(指定したURIが元の要素に取って何なのか)を意味する属性というのをきちんと知らなかったので、ここは目から鱗でした。

フォームの働きをURI/リクエストパラメータの組み立てと認識したり、 Atommicroformatsの部分はAtomとしてというよりデータ構造の用意の仕方として いつか参考にしたいな、と思いながら読んでいました。

第五部

実際の設計の話。 勉強になったな、と思ったことは、

  • リソースとはweb上に存在する名前のついた情報である事(データベース上に存在するとは限らない)
  • HTTPメソッドとして上手く表現できない事はリソースとして表現できないか(たとえば検索結果など)と考える事
  • 適切なメソッドが見つからないがどうしても必要な処理についてはPOSTを使ってでも実装する事

でした。

データベースに入っている階層構造とリソースの階層構造が必ずしも一致しない、という話や、 リソース間のむすびつきを意識して設計するという話が面白かったです。

全体として

前半は、Webの個々の技術、たとえば、サーバサイドのAPIであったり、クライアントサイドのAPIであったり、を学んでいてもやもやしていた部分をすっきりさせてくれる、という感じでした。

第三部と第五部は、Web APIの設計について、リソースとは何か、リソースという観点から述べられていて、以前読んだWeb APIの蛇の本と少し違う視点から眺める事が出来て面白かったです。