夜行月報

“夜更かし”から“新しい”をみつけるためのブログ

「プロになるためのWeb技術入門 ――なぜ、あなたはWebシステムを開発できないのか」を読んだまとめ(1/2)

Webの世界を知る


お久しぶりです、シロネコ書房です。

文系 & 未経験からWebエンジニアになってはや一年。
去年の今頃は、全てが初めての環境にてんやわんやな日々を送っていましたが、ようやくエンジニアとして基本的なプログラミング周りの知識は付いてきたかなーというところです。

しかし、その範囲は恐ろしく限定的......!

特にネットワークやWebのなんたるかなど、インフラ分野に関する知識は、ふわっともやっとなんとなーくしか理解していない現状。

そこに危機感を抱かずしてどうして一人前のエンジニアになれようか!

というところで、そのあたりの知識を学習できそうな教材を探していたところ、

「プロになるためのWeb技術入門 ――なぜ、あなたはWebシステムを開発できないのか」

という書籍の評判が良さげだったので、早速購入。

一通り読めたので、脳みそへの定着も兼ね、学んだことのアウトプットを行っていこうと思います。

内容ですが、書いていたらとても長くなってしまったので、今回は前半部分として書いていこうかと思います。

 

Web技術を学ぶということ

日本のWebアプリの開発現場では、新人でも即戦力として使えるように、フレームワークなどの表面的な部分だけの教育が行われることが多い。

なぜなら、「Webアプリケーション」というシステムの歴史が浅く(ここ二十年くらい)、かつ急激に進歩しているため、まだ体系化された教育プログラム等が存在していないから。

しかし、開発における根本の技術を理解していなければ、問題が発生した時にその解決ができないし、そのための」新しい技術を生み出していくこともできない。

それはIT技術者とし て致命的。知らなくても開発に支障はないかもしれないが、Web技術の根っこを知り、その奥深さと面白さを知ることはとても重要。

「Webアプリケーション」とは何か

MicrosoftのWordやExcelなどは、デスクトップアプリケーション。以下のような特徴を持つ。

  • 手元のPC上で処理が行われる。
  • OSの機能を使用して画面が表示される
  • アプリケーションをPCへインストールする必要がある。

対して、GoogleのGmailなどがWebアプリケーション。以下のような特徴を持つ。

  • 主な処理は手元のPCではなくサーバ上で行われている
  • 画面はHTML等で表現され、Webブラウザ上に表示される。
  • アプリケーションをPCへインストールする必要がない

Webの歴史

WWWの誕生と普及

アメリカ国防総省で研究されていた、ARPANET(アーパネット)というネットワークがインターネットの原型。当初は、大学や研究機関の関係者など、ごく一部の限られた人々のみの利用していた。

その後、欧州原子核研究機構(CERN)におティム・バーナーズ=リー博士が考案したWWW(World-Wide Web)と、ウェブブラウザの祖となるMosaicの登場によって、インターネットを介した情報の交換が広く行われるようになった。(情報共有のフォーマットとして、HTMLがここで誕生)

 Webを支える技術の発達

クライアント・サーバモデル

WWWにおける情報の公開と閲覧は「Webサーバ」と「 Webクライアント」のやりとりによって実現されている。(クライアント・サーバモデル)

クライアントはサーバに対して「これちょうだい!」とリクエストを投げ、サーバはそれに対して「はいよ!」と対応するHTMLをレスポンスをレスポンスとして返す。

オープンソースの「Apache HTTP Server」やMicrosoftの「Internet Information Services」などがWebサーバとして有名。

Webクライアント(ウェブブラウザ)として「Internet Explorer」や「Google Chrome」などがある。

 

 URL

インターネット上の各コンテンツの場所は、URL(Uniform Resource Locater)によって一意に定められている。URLは、リソース取得方法を示す「スキーム」、リソースを保有するコンピュータの名前を示す「ホスト名」、そのコンピュータのリソースの位置を示すパスの3つで構成される。

 

HTTP

HTMLをはじめとするコンテンツを、異なるコンピュータ間でどのように送受信するかという取り決めがHTTP。通信プロトコルの一つ。

 

動的なコンテンツとCGI

Webサーバは本来、もともと用意されていた(静的な)コンテンツをクライアントからの要求に応じて返すのが仕事。つまり、サーバ自体がコンテンツを生成することはできない

そこで、動的にHTMLを生成するプログラムをWebサーバと連携させ、Webページに変化を生じさせるCGI(Common Gateway Interfase)という仕組みが考案された。

コンテンツを生成するプログラムには、PerlやCが用いられた。

サーブレットの登場

Perlでは難しかった大規模なアプリケーションの開発や、性能の問題を解決するプログラミング言語としてJavaが登場。

もともとWebアプリケーションを開発するための言語ではなかったが、JavaEE(企業システム向けJava)の一部として、Webアプリケーション開発をサポートするサーブレットという機能が提供された。

サーブレットは、Javaで作られたHTMLなどのコンテンツを生成するためのプログラム。Webサーバと同じプロセスの中でコンテンツを生成するプログラムが動作するため、CGIのように新たなプロセスを都度起動する必要がない。つまり高速に動作する。

また、JavaはJavaVMによってハードウェアに依らずに動作するため、大規模なWebアプリケーションを開発に大きく貢献した。 

JSPの誕生

Javaのコードから出力するHTMLの内容が複雑になると、プログラムからその内容の想像がしにくく、また修正が大変な作業になった。さらに、画面のデザインとプログラム部分の分離が行われていないことで、作業効率が悪化するという問題があった。

そこで、HTMLの中にJavaコードを埋め込むという逆転の発想から、JSP(Java Server Pages)が誕生した。

JSPによって、開発者はJavaコードの部分に集中し、WebデザイナはHTMLの部分に集中するという、Webアプリケーションの分業が可能になった。

Webアプリケーションフレームワークの時代

大規模なアプリケーションを効率よく開発するため、再利用できるライブラリ群を整備し、開発の土台として使用できる「Webアプリケーションフレームワーク」が生まれた。

スポンサーリンク

 

 HTTPとは

WWWの世界で、HTMLをやり取りをするために定められたプロトコル。

WebサーバとWebクライアントの通信の根幹となる技術であり、また、Webアプリケーション開発がデスクトップアプリケーションと違って難しい大きな要因の1つ。 

HTTPリクエスト

 HTTPを用いてWebサーバにリクエストを送った時、その一行目を「リクエスト・ライン」と呼ぶ。HTTPリクエストの中で一番重要な部分。

リクエストラインは、メソッド、URI、HTTPバージョンの3つに分けられる。

メソッド

リクエストの種類を表す。GET、DELETEなど。

GETメソッドでは、サーバに渡したい情報をクエリ文字列で渡し、サーバはそこにふくまれるパラメータをCGIなどで起動されるアプリケーションに渡す。

ただ、URLの中にパラメータが含まれるため、どのような情報を送信したのかが第三者に漏洩しやすい。

これをPOSTメソッドにすると、パラメータはメッセージ・ボディに含まれるため、GETメソッドで生じていたパラメータ渡しの問題を解決できる。

URI

Uniform Resource Identifer。

リクエストの中で「何が欲しいのか」を表す。

HTTPバージョン

使用しているHTTPのバージョンを表す。バージョンによって利用できるメソッドの種類やリクエスト・ヘッダの種類が異なる

メッセージ・ヘッダ

2行目以降の部分はメッセージ・ヘッダと呼び、リクエストの付加的な情報を表す。

代表的なヘッダには、AcceptやUser-Agentなどがある。

Accept

Webクライアントが受けることのできるデータの種類を表す。

データタイプはContent-Typeという形式で表され、クライアントで受け取ることのできるContent-Typeがコンマ区切りで指定されている。

例:text/plain(テキストファイル)、image/jpeg(JPEG画像)

Accept-language

Webクライアントが受け取ることのできる自然言語(日本語、英語等)の種類を示す。

例:ja-JP(日本語)

User-Agent

 Webクライアントが使用しているブラウザのバージョンや種類を示す。

サイトの利用者がどのようなブラウザを利用しているのかのデータを取るのにも利用される。

Host

リクエストの送信先ホスト名やポート番号が示されている。

HTTPレスポンス

HTTPレスポンスの一行目を「ステータス・ライン」と呼び、HTTPバージョンとステータス・コード、レスポンス・フレーズの3つに分かれている。

HTTPバージョン

リクエストの時と同様に、使用しているHTTPのバージョンを表す。

ステータス・コード

リクエストが成功したかどうかなどの情報を示す。

  • 200......OK - リクエストが正常に完了した。
  • 302......Found - リソースが一時的に他のURIに属している。
  • 401......Unauthorized - ユーザー認証に失敗。
  • 403......Forbidden - アクセス権限が無く、リクエストが拒否された。
  • 404......Not Found - URIに対するリソースが見つけられなかった。
  • 500......Internal Server Error - サーバー内部のプログラム実行エラー。

など。

メッセージ・ヘッダ

ステータス・ラインに続く二行目 ~ 空行までの部分。

HTTPリクエストのメッセージ・ヘッダと同じ形式で、レスポンスに関する付加的な情報が入っている。

メッセージ・ボディ

要求したコンテンツの内容。HTMLファイルを要求した場合は、その内容がそのまま入っている。ブラウザは、この内容を解釈して画面上に表示している。

GIFやJPEGなどの画像ファイルを要求した場合は、バイナリ形式でそのデータが格納されている。

スポンサーリンク

 

 
情報がインターネットの大海原を超えるまで

IPアドレス

ピリオドで区切られた4組の数字。これが分かると宛先のホストが特定できるため、そのホストへ任意の情報を届けることができる。

ICANN(The Internet Corporation for Assigned Names and Numbers)という非営利法人が世界のIPアドレスの管理を行っている。

IPアドレスは、グローバルIPアドレスとプライベートIPアドレスに分かれている。

グローバルIPアドレス

インターネットで唯一のアドレスとなるように割り当てられたIPアドレス。

コンピュータをはじめとするネットワーク機器が互いに情報をやり取りするために必要なもの。

プライベートIPアドレス

インターネットなど、他のネットワークに繋がっていないプライベート・ネットワークにおいて、一定範囲のIPアドレスをプライベート・ネットワーク内で自由に利用できるように予約したもの。

DNS

アドレスバーに入力したドメイン名から、IPアドレスへの変換する仕組みをDNS(Domain Name System)という。

DNSはドメイン名とIPアドレスの対応表を持ったコンピュータ(DNSサーバ)で、そこに問い合わせれば、ドメイン名に対応するIPアドレスを教えてもらえる。

 

TCP/IP

インターネットにおいて上記役割役割を担うのが、TCP/IPというプロトコル。

現実世界での郵便配達の位置付けとよく似ている。

TCP/IPはブラウザなどから受け取ったHTTPリクエストなどの情報をパケットと呼ばれる単位に分解して送信し、受け取った側でそれらを組み立ててからWebサーバなどのアプリケーションに渡している。

そうすることで、効率的な情報の伝達を行うことができる。

ポート

受信した情報が、どのようなプロトコルによるものなのか、どのようなアプリケーションが処理すべきものなのかは、TCP/IPには分からない。

そこで、情報を受け取るアプリケーションは、必ず「待ち受けポート」というものを決めて情報を待つ。

ポートは0 ~ 65535までの数字で表され、同じポートを複数のアプリケーションで共有することはできない。

インターネットで情報を届けるには基本的にIPアドレスとポート番号を指定する必要があるが、よく使われるプロトコルのポート(Well-known ports)は番号の取り決めが行われているため、普段は意識せずに利用することができる。

代表的なWell-known portsは以下の通り

  • 20, 21......FTP
  • 22......SSH
  • 23......Telnet
  • 25......SMTP
  • 53......DNS
  • 80......HTTP
  • 110......POP3
  • 443.......HTTPS

 

というところで、今回はこの辺りまで!

続きは、近日中にまとめようと思います。

 

ではでは、またまた。