【Webプログラミング - academic.003】Web基礎知識「プロトコルのお話」 ブラウザが陰で何やってるか知ってますか?他

                                                          2002年07月08日発行
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
■Webプログラミング - academic.003
                                              http://www.ichikoro.com/webp/
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

  ───────────
   What's WebPrograming
  ───────────
   ▼毎週月曜日に配信しています。
   ▼等幅フォントでご覧いただくとキレイに見えます。
   ▼登録・解除はこちらから可能です。
      < http://www.ichikoro.com/webp/ >

   ▼以下の2種類を毎週交互に配信しています。
    (諸所の事情により変更になる場合もあります(^^;)
      (1)academic版
          入門者向け。比較的丁寧な解説。
          C言語入門、Web基礎知識など

       (2)enterprise版
          上級者向け。「分からんことは自分で調べろ」的な解説。
          データベース入門、ネットワークプログラミングなど。

  ──────────
     Editor's Voice
  ──────────
    こんにちは、編集者の勝部です。

    先週、仕事で携わっているWebサイトがついにリニューアルいたしました。
    いやーめでたいめでたい。これでしばらくは安泰...などといかないのがこの業
    界の常と言いますか(^^; 大方の期待を裏切らず(たまには裏切ってくれ)、C/O
    (カットオーバー)当日は、トラブルや調整に追われ、不眠不休の人間がフロア
    にゴロゴロと転がっていました。

    どんなサービスもC/Oしてからの方が大変なのです。
    クオリティーを高め、競合に見劣りしないように。そして一番大事なのは日々の
    運用を怠らないこと。不測のトラブルは待ち構えていたかのように次々とやって
    きます。また仕事でやっている以上は利益も出さなければなりません。

    いや〜、厳しいですね。みなさんが普段何気なく使っているWebサイトもこうし
    た沢山の人の努力によって成り立っているのです。そう考えると、いつも訪れて
    いるサイトも、ちょっとだけ違って見えませんか?

    と、たまにはキレイにまとめてみました(笑)
    では今週も行って見ましょう!

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
 01. プログラミング入門:「C言語入門」
──────────────────────────────────────

今週は「define」について解説したいと思います。
まずは前回(academic.002)のプログラムを思い出してください。

    #include<stdio.h>

    #define MIN_VAL     (100)
    #define STEP        (100)
    #define ARRAY_SIZE  (5)
    #define ARRAY_MIN   (0)

    int main(void)
    {
        int array[ARRAY_SIZE];
        int val;
        int i;

        /*--------------------------------------*/
        /*           配列の値を初期化           */
        /*--------------------------------------*/
        val = MIN_VAL;                              /* 最小値を代入 */
        for( i=ARRAY_MIN ; i<ARRAY_SIZE ; i++ ){        /* 配列の個数分ループする */
            array[i]  = val;                            /* 配列に代入 */
            val      += STEP;                           /* 値をSTEP分増やす */
        }

        /*--------------------------------------*/
        /*           配列の値を表示する         */
        /*--------------------------------------*/
        for( i=ARRAY_MIN ; i<ARRAY_SIZE ; i++ ){        /* 配列の個数分ループする */
            printf("%d \n", array[i]);
        }

        return(0);
    }

ポイントは、もちろん今回の主役である彼、defineです。
Cでプログラムを組む上で、defineは無くてはならない存在の一つです。

>    #define MIN_VAL     (100)
>    #define STEP        (100)
>    #define ARRAY_SIZE  (5)
>    #define ARRAY_MIN   (0)



    ■defineは「置き換え」をする物
        defineの動作は非常にシンプルです。
        下記のプログラムを実行してください。

            ・ソース
                #include<stdio.h>

                #define PI 3.14

                int main(void)
                {
                    printf("PI=%3.2f\n", PI);

                    return(0);
                }

            ・実行結果
                C:\>bcc32 define.c
                Borland C++ 5.5.1 for Win32 Copyright (c) 1993, 2000 Borland
                define.c:
                Turbo Incremental Link 5.00 Copyright (c) 1997, 2000 Borland

                C:\>define
                PI=3.14

        簡単に言うと、defineは「置き換え」の作業をしてくれるのです。
        上のプログラムで言えば、

            PI  →  3.14

        という具合に、プログラム中にdefineで定義した "PI" という文字列が
        あれば、コンパイル時にPIを3.14に置換してくれるというわけです。
        この際の文法は

            #define 名前  置き換える文字

        となります。それぞれの間はスペースやタブなどで区切ります。
        変数などと区別するために、(少なくとも私の周りでは)名前には大文字を使う
        ことが一般的とされています。


    ■試してみよう!
        さて、もう一本動かしてみてください。

            ・ソース
                #include<stdio.h>

                #define MAX  (10)

                int main(void)
                {
                    int a = 100;

                    if( MAX < a ){
                        printf("a(%d)がMAX(%d)よりも大きい", a, MAX);
                    }
                    else{
                        printf("MAX(%d)がa(%d)よりも大きいか同じ", MAX, a);
                    }

                    return(0);
                }

            ・実行結果
                C:\>bcc32 define.c
                Borland C++ 5.5.1 for Win32 Copyright (c) 1993, 2000 Borland
                define.c:
                Turbo Incremental Link 5.00 Copyright (c) 1997, 2000 Borland

                C:\>define
                a(100)がMAX(10)よりも大きい

        実感できたでしょうか?


    ■「マジックナンバー」と「汎用性」のために
        では、これが何の役に立つのかと言うと、その理由は二つあります。

        (1)マジックナンバーの阻止
            プログラム中に突如として

                a = 100;

            と言う一文が出てきたとします。
            また、

                int a[730];

            などと宣言したとします。
            このプログラムを三ヶ月くらいに見直した際に、おそらくこの
            一言が飛び出ることでしょう。

                「これは何の数字?」

            “とりあえずこれだけあれば大丈夫だろう”と適当に割り当てた数字
            なのか、それとも厳密に計算した末の数値なのか、この一部分だけで
            判断することは難しいでしょう。そもそも何の数値なの?とう疑問で
            頭が一杯になると思います。

            このように、プログラム中に突如として出てきた意味のわからない数
            値の事を「マジックナンバー」と言います。

            ところが、

                a = MAX_WEIGHT;        /*最大重量*/

            や、

                int a[TWO_YEAR_DAYS];        /*2年分の日数*/

            などのように意味のある文字が使われていたらどうでしょう?
            これは、プログラムの規模が大きくなるほどに重要視される
            ことの一つです。


        (2)汎用性を高める
            プロは常に「汎用性」の高いプログラムを組むことを心がけています。
            なぜなら、大抵の場合使い捨てプログラムで無い限り、メンテナンスや
            移行作業などが作った後にほぼ間違いなく発生するからです。その際に
            汎用性の低いプログラムを組んでいると、コーディングする量が無駄に
            増えたり、デバグで涙を流すことになります。

            次のプログラムを見てください。

                #include<stdio.h>

                int main(void)
                {
                    int a[10];
                    int i;

                    /* 配列に値を代入 */
                    for( i=0 ; i<10 ; i++ ){
                        a[i] = i * 100;
                    }

                    /* 配列の値を表示 */
                    for( i=0 ; i<10 ; i++ ){
                        printf("%d", a[i]);
                    }

                    return(0);
                }

            ここで、配列の数を10から100に変更する必要が発生したとします。
            変更しなければならないポイントは合計3つです。
            ところが、

                #include<stdio.h>

                #define MAX 10

                int main(void)
                {
                    int a[MAX];
                    int i;

                    /* 配列に値を代入 */
                    for( i=0 ; i<MAX ; i++ ){
                        a[i] = i * 100;
                    }

                    /* 配列の値を表示 */
                    for( i=0 ; i<MAX ; i++ ){
                        printf("%d", a[i]);
                    }

                    return(0);
                }

            defineを使用した場合、変更する箇所は一箇所だけです。
            これは作業量を減らすとともに、直し忘れを防げるところが大きいですね。


defineはこの他にも様々な使い道があるのですが、今回はここまでです。
実は使い方を誤ると、とんでもないバグの原因になったりすることもある、
意外に奥の深い物だったりもします(詳しくは後日)。

さて、前回のプログラムから出てきている次の構文、

>    for( i=ARRAY_MIN ; i<ARRAY_SIZE ; i++ ){

これは一体何なのでしょうか?
また、

>    i++

って何??
今回のサンプルを実際に実行されていれば、ピン!と来ると思いますが(^^;


というわけで、次回は「i++」について取り上げましょう。
ちなみに某有名地図企業の社名の由来もここからだそうです。
意外に知られていない??
    http://www.incrementp.co.jp/ipc/name.html


    【 確 認 】
        ・あなたがこれまでに作ったプログラムからマジックナンバーを
          無くすことが出来ますか?(実際にやってみましょう)
                Yes / No

        ・defineの利点を二つとも理解していますか?
                Yes / No


        Noがあったら、しっかりと見直しましょう〜。

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
 02. Web基礎知識「プロトコル」
──────────────────────────────────────

前回、WWWを取り上げるといっていましたが、あまりに初歩すぎるのではないかと
思いまして変更いたします。せっかくこのメルマガを取っていただいているので、
多少なりとも関わりのある物を取り上げます。

というわけで今回は「プロトコル」について軽くお話したいと思います。


■プロトコルってなんじゃい
    コンピューター同士が通信を行う際に用いる言葉の総称を「プロトコル」
    といいます。ここで言う言葉とは、私達人間が何かしらの言葉(日本語とか
    英語とか)を喋って他人と意思の疎通(そつう)を図るのと、イメージ的には
    ほぼ同じと考えて大丈夫です。

    例えば、みなさん何気なく叩いている「http」。
    これは「HyperText Transfer Protocol」の略称です。

    そう、あなたのパソコンとURLの中に記述されるサーバの間では「Hyper
    Text Transfer」なる言葉で会話されており、その結果として画像が表示
    されたり、時にはファイルが無くなっている(404 NotFound)などと表示が
    行われてるワケです。

    またWebサイトを運営されている方はFTP(File Transfer Protocol)を使わ
    れている事でしょう。Eメールを送信する時はSMTP(Simple Mail Transfer
    Protocol)、受信時にはPOP(Post Office Protocol)が使われています。
        ※受信する際には同様にAPOPやIMAPの場合もあります。
         それぞれ特性が異なります。

    ちなみに、ココで上げたプロトコルは、基本的にサーバとクライアント
    (ブラウザやメーラー)の間で行われる物です。


■サーバとのやり取り
    私達は普段、このプロトコルについて全く意識することがありませんし、
    する必要もありません。それは全てInternetExplorerやOutlookなどの
    ブラウザやメーラー(つまりクライアント)が行ってくれているおかげです。

    そこで、実際には彼らがどんなことをしてくれているのか、サーバとの
    やり取りを分かりやすく再現してみることにしましょう。

        ---------------------------------------------------------------------
        ブラウザ)サーバさんこんにちは!(サーバに接続)
        ---------------------------------------------------------------------
        Webサーバ)はいはい、こんにちは。
                  あなたは私に何がして欲しいのですか?
        ---------------------------------------------------------------------
        ブラウザ)Webサーバさん、私はあなたの中にあるindex.htmlという
                 ファイルが欲しいのですが、いただけますか?
        ---------------------------------------------------------------------
        Webサーバ)そのファイルなら持っていますよ。
              お渡しすることも可能です。

              では、まずこのファイルの情報(更新日付、ファイルサイズなど)を
              お送りしますね。続いて、このファイルの中身を渡しますね。
        ---------------------------------------------------------------------
        ブラウザ)ありがとうございました!さようなら〜。
        ---------------------------------------------------------------------
        Webサーバ)はい、さようなら〜。
        ---------------------------------------------------------------------

    もちろん実際にはもうちょっと簡略化されたやりとりがされています(^^;
    こんなにフレンドリーだったらそれはそれで面白いのでしょうが(笑)
        ※ちなみに、ファイルが無い場合はその旨が返って来ます。
          404 Not Foundってやつですな。他にも移動したり(30X)、
          エラーが出て渡せなかったり(50X)様々です。

    ブラウザは「ファイルを見る」というあなたの意思を受け取って、
    それをHTTPという言葉に翻訳しサーバとやり取りしてくれている
    わけです。つまりブラウザは通訳家さんか、あなたの代弁者であ
    ると言えます。


■必要不可欠なプロトコルの存在
    ここまでに上げたプロトコルは全て全世界共通です。
    その内容(お約束)はRFCという文書にまとめられており、メールソフトや
    ブラウザの作者(製作会社)は、基本的にこれにそって作ることが暗黙の了
    解となっています。(RFCについては後日解説します)。

    日本からアメリカのサイトが問題なく見ることが来たり、イギリスの友人
    にEメールを送ることが出来るのは、これによる功績が非常に大きいとい
    えます。

    もし、このお約束(プロトコル)が存在せず、皆が勝手に好きな言葉をしゃ
    べっていたら、今のインターネットの普及は無かったのかもしれません。

    このように、インターネットの世界においてプロトコルがいかに日常的に
    使われているか、そして重要な部分を担(にな)っているか、ちょっとは
    感じていただけたでしょうか?

    ただ、この根底にあるTCP/IP(UDP/IP)のお話を先にしなければならないの
    ですが、ちょっと複雑なお話になりますので、それはまた今度。


次週はサーバとクライアントの関係についてお話したいと思います。


━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
 03. インタネット業界の一週間
──────────────────────────────────────

う〜ん、間にあいませんでした( ^.^)( -.-)( _ _)
来週にご期待ください。

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
                           編    集    後    記
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

いやー、久しぶりに「脱ぎ」ました。
先日、今度転勤になる方の送別会があったのですが、C/O翌日でしかも金曜日という
こともあってか壊れ出す人が続出。2次会のカラオケでは当人を差し置いて周りの人
間が跳ね回る、脱ぎまくる、踊りまくる。って冷静に考えると思いっきりセクハラ
なのですが(^^; 社風のような気もします(笑)

結局AM2時前にお開きになった後タクシーで帰宅(銀座からだと高い(泣))。
とりあえず楽しかったから良し(笑)
本人も喜んでいたのが幸いです。

しかし北海道は遠いなぁ...。
いいとこなんですけどね。<一回行っただけ


ああ、そういえばこの号が配信される月曜日はパートナーさん向けの謝恩パー
ティーでした。う〜ん、どうなってしまうのか今から戦々恐...もとい、大変楽
しみです(笑)

ではでは、また来週お会いしましょう (^-^)/~~

■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■

                   【 Webプログラミング Code Sample 】

                    発  行 : ichikoro.com
                発行責任者 : 勝部 麻季人
                              < katsube@ichikoro.com >
                  発行部数 : 2138部(前回)
                 Webサイト : < http://www.ichikoro.com/webp/ >
            お問い合わせ先 : < mm-webp@ichikoro.com >

                            Powerd by まぐまぐ
    All Right Reserved, CopyRight(C) 2001 Webプログラミング Code Sample
■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■