Code024: Q&A式 CGI入門:アクセスカウンターを作ろう!

この記事は2002年に書かれたものです。


■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
【 Webプログラミング Code Sample 】                          Since2001/11/23

              Code024: Q&A式 CGI入門:アクセスカウンターを作ろう!

■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
                                                    Produced by ichikoro.com

           ▼毎週月曜日と金曜日に配信しています。
           ▼等幅フォントでご覧いただくとキレイに見えます。
           ▼登録・解除はこちらから可能です。
               < http://www.ichikoro.com/webp/ >
                  ※バックナンバーへのリンクもあります。
                  ※お友達にもぜひお勧めください(^^)/


─【Contents】───────────────────────────────
    01.Answer ............... 前回の回答
    02.Tips ................. Q&A式 CGI入門(Perl編)
    03.News ................. ネット業界の一週間
    04.From Editor .......... 編集後記


                   【 Webプログラミングは毎週2本立て! 】

             ・月曜日版はWebの実際の活用方法などを特集します。
             ・金曜日版はHTMLやCGIなど一つの分野について最初から
              解説する講座になっています。現在はC言語入門です。


こんにちは、編集者の勝部です。

先週、今年分の手帳用のスケジュールを新しくセットしていたのですが、いかんせん
厚くなりすぎ、これまでずっと綴じてきた数年分の予定を手帳からハズしました。何
だか懐かしくて、色々なことがこみ上げてきました。

学生時代、一年中バイトしてたのですが文字通り食うのに困っていました。納得がい
かなくて最終的に自主退学しちゃいましたが。その後ひょんなことから今の会社に就
職し、色々な人に出会うことができました。

今年の4月で上京5年目、今週21日で入社3年目を迎えます。
「いいひと。」の主人公ゆーじは、入社3年目にして誰もが嫌がるリストラを担当しま
す。その後、全社を上げての大イベントのプロジェクトリーダーに抜擢されます。そ
して、長い間付き合ってた彼女にプロポーズもしました。さて、私の就職三年目には
何が待っているんでしょうか。楽しみです。思えば遠くに来たもんだ。


ではでは、今週も行ってみましょう!

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
  01.Answer  「前回の回答」
──────────────────────────────────────

金曜日版で出題した問題の回答例です。
今回は随分と正統派の問題でした。


    Q. 一回目のprintfから返却される値が、1234(byte) になるように下記のプログ
       ラムを“一箇所”修正しなさい。
           ※必ず一箇所だけの修正に留めること。

            #include<stdio.h>

            int main(void)
            {
                int  a = 100;
                long result;

                /* 普通に表示 */
                result = printf("a = %d\n", a);        /* printfの実行結果を変数に代入 */

                /* さっきの実行結果を表示 */
                printf("result = %d\n", result);

                return(0);
            }

    A. 方法は色々ありますが、一番簡単と思われる方法を紹介します。
       そう、最小フィールド幅で調整を行えばOKなのです。

            #include<stdio.h>

            int main(void)
            {
                int  a = 100;
                long result;

                /* 普通に表示 */
                result = printf("a = %1229d\n", a);        /* printfの実行結果を変数に代入 */

                /* さっきの実行結果を表示 */
                printf("result = %d\n", result);

                return(0);
            }


        【 実 行 例 】

            C:\>bcc32 ctrl_size.c
            Borland C++ 5.5.1 for Win32 Copyright (c) 1993, 2000 Borland
            ctrl_size.c:
            Turbo Incremental Link 5.00 Copyright (c) 1997, 2000 Borland
            
            C:\>ctrl_size
            a =
            
            
            
            
            
            
            
            
            
            
            
            
            
            
                                          100
            result = 1234


━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
  02.Tips  「ちょっとがんばれば分かる FAQ式CGI入門 Perl編」
──────────────────────────────────────

前回は簡単なCGIを動かすところまで行きました。
さてさて今回取り上げるのは、アクセスカウンターです。

■アクセスカウンターを作ろう!

    [Q]. アクセスカウンターとはどんなものですか?
    [A]. 来訪者の数をカウントするものです。


    [Q]. アクセスカウンターにはどんな種類がありますか?
    [A]. よく見かけるのは、画像を表示するタイプと、テキストを表示する(埋め
         込む)タイプです。今回は前者を取り上げます。


    [Q]. HTMLからはどうやって呼び出すのですか?
    [A]. IMGタグを利用する方法がよく使われます。

            <IMG src="counter.cgi" alt="アクセスカウンター">


    [Q]. じゃぁ早速プログラムを教えてください。
    [A]. イヤです。
         読者パンチ!!( -_-)=○()゜O゜)アウッ!


    [Q]. 教えてくれますよね?(笑顔)
    [A]. はう、喜んで(^-^;
         0 とだけ書かれた "count_value.dat" という名前のファイルを
         ご用意していただき、コードを“直接”ブラウザから実行してく
         ださい。

            #!/usr/bin/perl

            #-------------------------------------#
            #           前回の値を取得            #
            #-------------------------------------#
            open(DAT, "count_value.dat");
            $count = <DAT>;
            close(DAT);

            #-------------------------------------#
            #        前回の値に+1して保存         #
            #-------------------------------------#
            $count = $count + 1;                #取得した値に+1する
            open(DAT, ">count_value.dat");
            print DAT $count;
            close(DAT);

            #-------------------------------------#
            #              値を表示               #
            #-------------------------------------#
            print "Content-type: text/html\n\n";
            print "<H2>$count</H2>\n";

            exit(0);

    [Q]. お〜、リロードするたびにカウントアップするんですね!
    [A]. はい、その通りです(^-^)/



■ファイルから値を取得しよう!

    [Q]. じゃぁ早速解説してください。
    [A]. では、部分ごとに解説していきましょう。
         まずは最初にファイルから値を取得するところです。

            #-------------------------------------#
            #           前回の値を取得            #
            #-------------------------------------#
            open(DAT, "count_value.dat");
            $count = <DAT>;
            close(DAT);

         openというのは「ファイルを開け!」と言う命令のことです。
         この意味は下のようになります。
         
                 open(ハンドル名, ファイル名);
         
         開いた後はハンドル名で指定した名前に対して色々な操作をします。ファイ
         ル名の部分は、正確にはパスです(URLとは異なります)。後述。

    [Q]. ここではどんなファイルを開いているんですか?
    [A]. 前回のカウント値が保存されているファイルを開いています。プログラム
         は実行し終えると、そこで使われた値はすべて消えてなくなってしまうの
         です。そこで、次回も使うような値は、ファイルに保存してから終了する
         ことになります。


    [Q]. 例えばワードやエクセルで、保存せずに終わると、作業した中身が消えて
         なくなるのと同じなんですか?
    [A]. その通りです。


    [Q]. 次の行は何ですか?

            $count = <DAT>;

    [A]. ファイルの最初の一行を読み込んでいます。
         読み込んだ内容は $count に保存されます。


    [Q]. この $count っていうのは何者ですか?
    [A]. 変数です。変な数ではありません(^^;<ダカラヤメロ


    [Q]. 変数って何ですか?
    [A]. 一時的に値をとっておく、箱のようなものです。
         (あー、この説明大嫌い!)


    [Q]. 最後のこの行は何ですか?

            close(DAT);

    [A]. closeの文字通りファイルを閉じています。
         用が無くなったら、キチンと閉じましょう。


■ファイルに値を書き込もう!

    [Q]. じゃぁ次の部分を教えてください。
    [A]. では、今度はファイルに書き込む方法をご紹介しましょう

            #-------------------------------------#
            #        前回の値に+1して保存         #
            #-------------------------------------#
            $count = $count + 1;                #取得した値に+1する
            open(DAT, ">count_value.dat");
            print DAT $count;
            close(DAT);


    [Q]. お、最初のこの行は、上で取って来た値に+1してるんですか?

            $count = $count + 1;                #取得した値に+1する

    [A]. そうです。


    [Q]. ん?今度は最初に ">" がついていますね?

            open(DAT, ">count_value.dat");

    [A]. ファイルを開くのには、色々なモードが用意されています。
         ファイル名の最初に ">" をつけると、今後ファイルハンドル(DAT)を
         操作することで書き込みができるようになります。例えばまさにこの
         下で

            print DAT $count;

         として、ファイルに向かって、プリントしているわけです。


■最後には必ず表示をするのだ!

    [Q]. 最初の行は、どんなデータかをブラウザに教えてるんですよね?
         ここではHTMLだってことですよね?

            #-------------------------------------#
            #              値を表示               #
            #-------------------------------------#
            print "Content-type: text/html\n\n";
            print "<H2>$count</H2>\n";

    [A]. その通り!詳しくは前回のメルマガを読んでね。
          http://ichikoro.com/webp/back_list/?cd=00022

    [Q]. ん?HTMLの中に変数がありますよ?
    [A]. こうしておくと、自動的に変数の中身と置き換わるのです。


■ところで、

    [Q]. 下のやつは何ですか??
    
            #-------------------------------------#
            #              値を表示               #
            #-------------------------------------#

    [A]. これはコメント文です。
         HTMLでは <!-- --> としますよね?
         Perlでは、# から行末までがコメントとみなされます。


■今度は一人でできるかな?

    では、もう一回プログラムを見て見ましょう。


        #!/usr/bin/perl

        #-------------------------------------#
        #           前回の値を取得            #
        #-------------------------------------#
        open(DAT, "count_value.dat");
        $count = <DAT>;
        close(DAT);

        #-------------------------------------#
        #        前回の値に+1して保存         #
        #-------------------------------------#
        $count = $count + 1;                #取得した値に+1する
        open(DAT, ">count_value.dat");
        print DAT $count;
        close(DAT);

        #-------------------------------------#
        #              値を表示               #
        #-------------------------------------#
        print "Content-type: text/html\n\n";
        print "<H2>$count</H2>\n";

        exit(0);


    完璧ですか〜?
    さぁ、来週はいよいよ画像でのカウンターに挑戦です。



---【PR】-------------------------------------------------------------------
                CGIで困った、腕を上げたいならまずはココ
                  『CGIプログラミングメーリングリスト』

                   < http://www.ichikoro.com/cgi/ml/ >
                                                    Produced by ichikoro.com
-------------------------------------------------------------------【PR】---

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
  03.News  「今週の気になるニュース
                インターネット業界の一週間」
──────────────────────────────────────

今週はバラエティーにとんだラインナップです。
そうそう、何だかまたウィルスが蔓延していますね。
私の周りでも騒然としていました。


───────
  3月11日(月)
───────
・@nifty、個人間決済サービス「@pay」を開始
  http://www.watch.impress.co.jp/internet/www/article/2002/0311/pay.htm

・ブロードバンドコンテンツはライフスタイルを変えられるのか? 〜DCJシンポジウム
  http://www.watch.impress.co.jp/internet/www/article/2002/0311/dcj2.htm
    この中で面白かったのはSo-netの藤乗氏の発言。
    私もこの意見には賛成です。以下引用。

>    「ブロードバンド時代のキーワードは、コミュニティではないか。動画だけでは、
>      ユーザーからお金を頂く水準に達していない」と語った。So-netが狙っている
>      コミュニティとは、いわゆるマスなコミュニティではなく、数万人単位のコア
>      なファングループだ。例えば、総合格闘技「PRIDE」のファン層向けには、360
>      度の視点切り替えやズームイン/アウトが任意にできる動画コンテンツの配信な
>      どを行なう。

    余談ですが、このPRIDE中継はいいですねぁ。プロレスは全然見ないのですが、
    PRIDE、K-1系はたまに見てます。思わず見入っちゃうんですよね。という話は
    またするとして、せっかく集めた会員を上手く収益に結びつけるかどうかが一
    番の問題なのですが、それについて、

>    また、「すでにバナー広告は頭打ちの状態になっている。今後は、マーケティン
>    グビジネスへシフトすべきだ」といい別の事例として「ソネットタウン」の紹介
>    を行なった。これは、So-net会員に対してEC、コンテンツ、コミュニティが一体
>    となったサービスを無料で提供しているものだ。クレジットカード情報など身元
>    がはっきりとしたユーザーを囲い込むことで、情報提供に対してユーザーがどの
>    ような反応を示したかというマーケティングデータを販売することができる。

    なるほど!そういえば以前BIGLOBEが、会員向けに調査を有料で行いますというリ
    リースを流していましたが、このSo-netの戦略の方が的を得ているような気がし
    ます。プロバイダも本格的な変革期に来ているようです。

・松下・DTIなど4社、ISP事業で提携を発表〜ノンPC接続に向け体制強化
  http://www.watch.impress.co.jp/internet/www/article/2002/0311/hiho.htm

・PGPは儲からない——Network Associatesの結論
  http://www.zdnet.co.jp/news/0203/11/e_pgp.html

・伝説の「カーネルハッカー」がLinuxを語る
  http://www.zdnet.co.jp/enterprise/0203/11/02031101.html

・auも第3世代携帯電話 4月からサービス 
  http://www.mainichi.co.jp/digital/internet/200203/11/index.html

・KDDI、カメラ付きGPSケータイなど、
  CDMA2000 1x対応携帯電話5機種を発表 
  http://pcweb.mycom.co.jp/news/2002/03/11/15.html


───────
  3月12日(火)
───────
・プロバイダー責任法が導入されると、何が変わるのか? 〜DCJシンポジウム
  http://www.watch.impress.co.jp/internet/www/article/2002/0312/dcj3.htm
    昨年の11月に公布された「プロバイダー責任法」。実はプロバイダだけで
    なく個人サイトの運営者もこの規定の影響を受けるのです。実際に効力が
    出るのは今年5月くらいとのこと。ホームページを公開することへの“責任”
    を、今後強く意識させられそうです。

・コピーガード機能付きCD登場 エイベックスのサポート体制は万全?
  http://www.zdnet.co.jp/news/0203/12/boa.html

・総務省調査:DSL 加入者数200万を超える 
  http://japan.internet.com/public/news/20020312/6.html

・zlib圧縮ライブラリに脆弱性,Linuxほか多数のプログラムに影響
  http://www.zdnet.co.jp/news/0203/12/e_linux.html


───────
  3月13日(水)
───────
・検索エンジンのLookSmart、“Googleの対抗馬”「WiseNut」を買収
  http://www.watch.impress.co.jp/internet/www/article/2002/0313/looks.htm

・慶大と東大、ユビキタス環境実現に向け共同研究を開始
  http://www.watch.impress.co.jp/internet/www/article/2002/0313/ubiq.htm
    最近よく耳にするこの“ユビキタス”という言葉。
    意外に意味を知らなかったりするのですが、

>    ユビキタスの語源はラテン語で、いたるところに存在する(遍在)という意
>    味。インターネットなどの情報ネットワークに、いつでも、どこからでもア
>    クセスできる環境を指し、ユビキタスが普及すると、場所にとらわれない働
>    き方や娯楽が実現出来るようになる。
    http://www.fri.fujitsu.com/hypertext/fri/cyber/hotkey/ubi/ubi.html

                            出典:「サイバービジネスの法則集」(富士通総研)
                                        FUJITSU RESEARCH INSTITUTE (C)2001 

    ということだそうです。
    おお、何だかドコモの2010年構想みたいですね。
    
        ・MAGIC
          http://www.nttdocomo.co.jp/corporate/company/vision/index.html


・米Sun、ソフトとハードを合わせたネットワーク認証ソリューション発表
  http://www.watch.impress.co.jp/internet/www/article/2002/0313/sunone.htm

・チップを体内に埋め込むアーティストたち
  http://www.hotwired.co.jp/news/news/culture/story/20020313202.html
    むー(^^;
    実は今週一番衝撃的なニュースでした。


───────
  3月14日(木)
───────
・ジャストシステム、1冊から製本を申し込めるサービスを開始
  http://ascii24.com/news/i/serv/article/2002/03/14/634393-000.html
    これスゴクいいですね!
    ジャストシステム製品で作られているという条件を除けばですが(^^;
    高校生のころ、芝居やってた時に印刷所にポスター作りにいってたので
    すが、初めてだとやっぱり敷居が高いんですよね。ネットから気軽に、
    しかも安価にこういうサービスが利用出来ると、ほんとに便利ですね。

・Webサイト構築もバリアフリーを念頭に
  http://www.zdnet.co.jp/news/0203/14/free.html
    少なくとも今まで企業のホームページは「作ってある」ことが最低条件
    でしたが、今後はこの最低条件に「使いやすい」「人にやさしい」が加
    わってくるのでしょうねぇ。

・新ワーム“patch.exe”に注意!
  http://biztech.nikkeibp.co.jp/wcs/show/leaf?CID=onair/biztech/gen/174720

・“迷惑メール対策”に見直しの声──メールビジネスへの影響も
  http://www.zdnet.co.jp/mobile/0203/14/n_mail.html

・NTT東西、電話回線線路情報をユーザーに公開
  http://www.watch.impress.co.jp/internet/www/article/2002/0314/line.htm

・高速無線LANを使って、バスにニュースや動画コンテンツを配信する実験
  http://www.watch.impress.co.jp/internet/www/article/2002/0314/yrp.htm

・職場の男女の間にデジタルデバイドが生じている〜米NetRatings調査
  http://www.watch.impress.co.jp/internet/www/article/2002/0314/nn.htm

・「脳でカーソルを動かす」実験、サルで成功
  http://www.hotwired.co.jp/news/news/technology/story/20020314302.html

・Microsoft,次世代Windowsでファイルシステムを刷新
  http://www.zdnet.co.jp/news/0203/14/e_longhorn_m.html

・Yahoo! が史上最大?のセールを開催中 
  http://japan.internet.com/ecnews/20020314/11.html


───────
  3月15日(金)
───────
・ネットオークションへの法規制が閣議決定〜オークション事業者は反発
  http://www.watch.impress.co.jp/internet/www/article/2002/0315/npa.htm
    もちろん「法規制の趣旨には賛成しているが、その内容に問題がある」
    という意味での反発です。ただ、利用者からしてみれば法的な整備がさ
    れるわけですから、大変いいことなんですよね。

・ハイパーリンク特許訴訟,予備審理でBTに黒星
  http://www.zdnet.co.jp/news/0203/15/e_bt.html
    世界中の誰もが絶句してしまいそうな、この言いがかりとしか思えない訴訟。
    もし勝ってしまったらと考えるとゾッとしますが、あり得ないでしょう。
    というかあって欲しくないですね。勝ったとしても企業イメージをかなり損
    なうと思うのですが(^^;GIFの圧縮技術に関するライセンスを保有するUNISY
    S社に対しても、私自身は正直良いイメージがないんですよね。間違ったこと
    は何もしてないのですけどね。<UNISYS

        【関連記事】
         ・冗談としか思えないBTのハイパーリンク特許
           http://www.zdnet.co.jp/news/0006/22/westbrook.html

・AOLがIEからNetscapeベースの新ブラウザに乗り換え?
  http://www.zdnet.co.jp/news/reuters/020315/e_aol.html
    あくまで噂の段階で、乗り換える可能性は低いとの見解が強いようです。
    しかし乗り換えるとしたら、AOL的にどういうメリットがあるのでしょう
    か?移行するだけで結構な投資が必要でしょうに。

・「Fbound」の被害が拡大〜ベンダー各社が続報を掲載
  http://www.watch.impress.co.jp/internet/www/article/2002/0315/fbound.htm

・三井物産がDSL事業に再挑戦、アッカに25億円の出資
  http://www.watch.impress.co.jp/internet/www/article/2002/0315/mitsui.htm

・ドコモ、商用化に向け公衆無線LANのモニターサービスを開始
  http://k-tai.impress.co.jp/cda/article/news_toppage/0,,8714,00.html

・Oracle、第3会計四半期の業績ダウン
  http://japan.internet.com/finanews/20020316/12.html


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

「走りたいぞ〜!」と、警察に捕まって以来満足に乗っていなかったクルマにシビレ
を切らし、久々に風を切ってきました。うーん、この季節になってくるとサンルーフ
が嬉しいですね。中途半端な時間に出発してしまったのであまり遠出できなかったん
ですが、何とか欲求解消(笑)

川越のICから関越に乗り所沢ICまでとちょっと(かなり?)短距離(^^;
今捕まるわけには行かないので、制限速度(100k)より一回り下の速度で我慢しつつ高
速走行を楽しんでました。そろそろ若葉マークはずそうかと考えていたのですが、車
線変更もバッチりだし来週外そう(笑) しかし関越、料金高いぞ...。

所沢で降りてから、しばらく航空公園の周りをグルーとまわってから日芸近くの道を
通って帰ってきました。家族連れがワイワイと騒いでいるのが見え、幸せそうでいい
感じです。後一月もすれば、木の下でのほほんとできそう。

    ・航空公園(街並みウォッチャーが行く!)
      http://www.towa-fudosan.co.jp/keyakidai/watcher/koukuukouen.html


こうやってクルマに乗っていると、今年の夏休みにどうやって帰省しようか、そろそ
ろネタが欲しいと思い始める季節です。2年前は青春18切符で思いもしなかった“奇跡”
を体験し、昨年はクルマを運転し始めて半年経っていない(乗ってたのは近所に土日だ
け)という状態で往復1800kmちょっとを無事に完走。最高でした!

そういえば、昨年の夏に札幌へ行った時、大通り公園で、三輪車で道内一周しようと
している人を見かけましたが、彼は無事にたどり着いたんだろうか。でもこれはマネ
できないなぁ(^^;

    ・大通り公園
      http://sapporo.cool.ne.jp/photos/h/oodori.htm
        ※とうきびがたまりませんでした(^-^)/
         北海道弁が聞きたかったのですが出会えなかったなぁ。生“なまら”が聞
         きたかったのに(笑)みなさんキレイな標準語なんですよね。


うーん、船もいいんですよねぇ。「海の上で風を浴びながら、ただ満点の星空を眺め
るのがたまらない」とか話を聞くと、もう何も考えずにチケット買いそうにになりま
す(^^; バイクも面白そうですね。ただ今から免許とってと考えると1800kmはちと怖
いいなぁ。来年かな? とりあえず中免は取りたいなぁ。学生の頃乗りたくてしょう
がなくて、実はちょこっと通ってたのですが、お金が続かなくなり悔しかったですが
無念のリタイア。リベンジしなきゃ。


何だか書きたくなって、つらつら長くなってしまいました。すみませぬ(^^;
ではでは、今度は金曜日にお会いしましょう! (^-^)/~~


■Information 
 「Webプログラミングからのお知らせ」

    【相互広告募集のお知らせ】
      読者数を増やしたいメルマガ発行者さんを募集しています。お互いに一定期間(1〜
      3回程度)広告を掲載し合いませんか?詳細はご相談ください(無料)

         お問い合わせ: mm-webp@ichikoro.com

    【コラム募集のお知らせ】
      Webプログラミングでは、寄稿していただけるコラムやプログラムなどを募集して
      います。たくさんの読者の方にあなたをアピールする場にもなります。ぜひ有意義
      な情報やご意見をお送りください。

         お問い合わせ: mm-webp@ichikoro.com


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

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

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

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

コメント

コメントを入力. Wiki文法が有効です:
S Y E W U