【Webプログラミング - enterprise.002】Perlでネットワークプログラミングをはじめよう!

                                                          2002年06月17日発行
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
■Webプログラミング - enterprise.002
                                              http://www.ichikoro.com/webp/
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

        【 Subject:Perlでネットワークプログラミングをはじめよう! 】

                   01. Special. 「データベースアラカルト」
                   02. Tips.「ネットワークプログラミング」
                   03. News.「ネット業界の一週間」


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

携帯も2年以上使っていると、だんだん動作が怪しくなってきます。
他の人の同キャリアの端末は圏内(3本)なのに、私のだけ圏外だったりする何て事は
しょっちゅうで、今にも真っ二つになりそうな勢いでギシギシとキシミ声を上げてい
るのを聞くと、額から嫌な汗が出そうになります。

かといって紙に書いておくような几帳面な性格ではないので、携帯が壊れるとホトン
ドの人間に連絡が取れなくなることに気がつき、速攻で携帯のメモリ編集・管理ソフ
ト(パソコンでいじれるやつ)を買ってきました。

ケーブルをつないでパソコンにバックアップし、一安心といった感じでしたが、今度
はハードディスクが吹っ飛んだ時のことが心配になりました(笑) ああ、安息の地はい
ずこに。

  ・F502i
    http://www.personal.fujitsu.com/products/mobile/syohin502.html
        ※デザインも悪くなく、初めてのカラーiモードとして、
         当時注目されていたのが昨日のようですな(^^;

 ・携快電話
    http://www.sourcenext.com/products/kei6/
        ※使い勝手は悪くないです。使わない機能もたくさんついてますが(^^;
          この手のソフトは初めてだったので、結構ワクワクしながら使って
          ました。おお、携帯の画面も変化するのね。それにしても、ソース
          ネクストの商品名を決めている方には一度お会いしてみたいですね(笑)

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


━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
 01. データベース アラカルト:「簡単検索システム」
──────────────────────────────────────

では、前回(enterprise.001)のプログラムを利用し、かんたんなデータベースにして
みましょう。まずは、このメルマガの一番最後についているソースを、easydb.plな
どとして保存してください。ちなみにこのプログラム、問題を単純化するために色々
と手を抜いていますが、「エラー処理してないじゃん」とか突っ込まないでください
ませ(^^;
    ★注意!
      Perlが動作する環境が必要です。Windows環境への導入方法は、
      この下の新連載「ネットワークプログラミング」で解説してい
      ます。


    ■まずは動かしてみよう
        コマンドライン上(Windowsの場合はDOS窓)から以下のように
        実行してみてください。

            C:\WINDOWS\デスクトップ>perl easydb.pl
            -------------------------------
            ■かんたんデータベース
            -------------------------------
            使い方:perl easy.pl <命令> <指定文字1> <指定文字2(置換の場合のみ)>
            命令部分は下記のように指定します。
              add ...... データを追加します。指定文字1に追加する単語を入力します。
              search ... 検索します。指定文字1に検索する単語を入力します。
              update ... 検索・置換します。指定文字1に検索する単語を、指定文字2に
                         置換する文字を入力します。
              dell ..... 削除します。指定文字1に削除する単語を入力します。

        このように表示されれば、インストール(?)は無事成功です。


    ■データを操作してみよう
        とりあえず、先ほど表示された使い方(ヘルプ)に従ってこのデータベースを
        使ってみることにしましょう。

        ・データの追加
            まだインストール時点でDBの中にデータはありませんから、まずはデータ
            の入力が必要です。以下のようにすることで、データを追加することがで
            きます。

                C:\WINDOWS\デスクトップ>perl easydb.pl add りんご
                「りんご」を追加しました

        ・データの検索
            検索はDBの機能の中でも頻繁に使われる機能の一つですよね。
            データの検索は以下のように行います。

                C:\WINDOWS\デスクトップ>perl easydb.pl search りんご
                ○:DBに「りんご」は存在します
                C:\WINDOWS\デスクトップ>perl easydb.pl search みかん
                ×:DBに「みかん」は存在しません

        ・データの更新(置換)
            DBですから、既存のデータを更新することもできなければなりません。

                C:\WINDOWS\デスクトップ>perl easydb.pl update りんご みかん
                ○:1件置換しました

        ・データの削除
            削除することも、もちろん可能です。

                C:\WINDOWS\デスクトップ>perl easydb.pl dell みかん
                ○:1件削除しました


    ■ファイルと見比べながら
        これらの操作をすると、easydb.plと同じ階層にeasydb.txtというファイルが
        出来るハズです。そのファイルをテキストエディタで覗きながら操作すると、
        ダイレクトに反映されている様子が手にとるようにわかります。

        例えばこんな感じのファイルになっていたとします。
            ※typeはファイルの中身を表示させるDOSのコマンドです。
              UNIX系OSの場合はcatを。もちろんテキストエディタで
              開いてもかまいません。

            C:\WINDOWS\デスクトップ>type easydb.txt
            りんご
            パイナップル
            いよかん

        このファイルにデータを追加してみましょう。

            C:\WINDOWS\デスクトップ>perl easydb.pl add マスカット
            「マスカット」を追加しました
            C:\WINDOWS\デスクトップ>type easydb.txt
            りんご
            パイナップル
            いよかん
            マスカット

        「マスカット」が新たに追加されているのが分かります。
        このDB(ファイル)から今度は削除をしてみます。

            C:\WINDOWS\デスクトップ>perl easydb.pl dell パイナップル
            ○:1件削除しました
            C:\WINDOWS\デスクトップ>type easydb.txt
            りんご
            いよかん
            マスカット

        ファイルが更新されている様子がわかるでしょうか?
        削除の他にも、更新などをした時も同様です。

            C:\WINDOWS\デスクトップ>perl easydb.pl update マスカット デラウェア
            ○:1件置換しました
            C:\WINDOWS\デスクトップ>type easydb.txt
            りんご
            いよかん
            デラウェア


    ■基本はこれだけ
        「データベース」と言うと難しく感じますが、基本的には

            ・検索
            ・追加
            ・更新
            ・削除

        この4つを多少複雑にしたことを行っているだけです。

        今回は分かりやすいようにテキストファイルを用いましたが、これが
        メモリの上であったり、独自の形式のファイルであったりと色々なケー
        スがありますが、最終的に行われていることは全く一緒なのです。

        といっても、本当にそうなのか解説していないわけですから、
        まだまだ肩の力は抜けていない感じでしょうか(^^;


さぁ来週は「住所録」や「在庫管理」など、実際の問題と照らし合わせて考えて
みることにしましょう。
    ※プログラムは理解しておいてくださいね〜。

                                                                 〜つづく〜

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
 02. Tips:「ネットワークプログラミング:」
──────────────────────────────────────

今回から何回かにわたって「Perlではじめるネットワークプログラミング」講座が
はじまります!

この連載ではHTTPやソケットなどの根本的なところよりも生産性を重視したいと思
います(笑) そういう解説も別途やろうかと思っていますので、ここでは「ああ、ネ
ットワークプログラミングってエキサイティングだなぁ」と感じ取っていただけれ
ばと思います。

    ■まずはPerlをインストール!
        UNIX系のOSには大低最初から入っていたりしますが、WindowsやMacには
        もちろん(?)入っていません。そこで、まずはインストールからはじめま
        しょう。

        ・Windows
            以下のサイトからActivePerlのインストーラーを
            ダウンロードしてください。(95/98/ME用で1.62Mくらいです)
                http://www.activestate.com/Products/Download/Get.plex?id=ActivePerl&_x=1

            その後、画面に従ってインストールを行ってください。

        その他の詳しい情報ついては、各自で調べてください。
        ここでは割愛させていただきます。


    ■Perlは資産がザックザク!
        Perlにはこれまでどこかの誰かが作った資産が大量に転がっています。
        しかも私たちは、インターネット上からそれをいとも簡単に、しかも
        大抵の場合は無料で入手することができるのです!

        CPANというサイトが世界中で最も有名です。
        Perlプログラマで知らない人はもぐりでしょう。

            CPAN
             http://www.cpan.org/
                ※英語ですが、何となくわかりますよね?
                  無論、わかんない所もたくさんありますが(笑)

        もしあなたが「こんなこと出来ないかな?」と思いついたほとんどのことは
        どこかで誰がすでに作っていることでしょう。そしてそれらはCPANで取得
        できるのです。

        今回の連載でも、このCPANにあるモジュールをフル活用したいと思います。


    ■Webページを取得しよう!(下準備編)
        早速簡単なプログラムを作ってみましょう。
        の前にまずはCPANから「LWP」いうモジュールを入手&インストールしてください。

            http://www.perl.com/CPAN/modules/by-module/Net/
                ※下の方にあります。

        解凍して、その後*.readmeを参考にインストールしてください。
        ここでも詳細は割愛いたします。ご了承くださいませ。

        ActivePerlの場合、PPMという仕組みがあります。
        こちらを利用するのが楽チンです。

            ・パッケージのインストール(PPMの使い方)
              http://member.nifty.ne.jp/hippo2000/perltips/ppm.htm


    ■Webページを取得しよう!
        ここまで無事終わったでしょうか?多少苦戦するかもしれませんが、
        ぜひともがんばってください。一度乗り越えると後は楽チンですよ!

        では、がんばった方の特権です。
        以下のソースを実行してみてください。

            use LWP::Simple;
            getprint("http://www.yahoo.co.jp/");

        何とわずか2行でWebページを取得し、表示することが出来てしまい
        ました!初めての方はビックリされたのではないでしょうか?

        例えば気になるページのURLをファイルにまとめておいて、
        それを自動的に巡回するなんてことも、これを応用すれば、
        簡単に出来てしまうのです。

        これが使いこなせると楽しいですよ〜。



次回はLWPをもっと使いこなしてみましょう。

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

───────
  6月10日(月)
───────
・Microsoft、企業間でユーザー認証技術を共有できる「TrustBridge」を発表
  http://www.watch.impress.co.jp/internet/www/article/2002/0610/tb.htm

・Apple、新広告キャンペーン「Real People」立ち上げへ
  http://www.zdnet.co.jp/news/0206/10/xedj_apple.html

───────
  6月11日(火)
───────
・OperaがWAP、iモード両方に対応した携帯電話用ブラウザーを発表
  http://www.watch.impress.co.jp/internet/www/article/2002/0611/opera.htm

・インターネットの利用時間や接続回数がこの1年間に2桁増加〜米調査
  http://www.watch.impress.co.jp/internet/www/article/2002/0611/nn.htm

───────
  6月12日(水)
───────
・米Yahoo!がトップページのデザイン変更を検討中  〜ユーザーからの声を募集
  http://www.watch.impress.co.jp/internet/www/article/2002/0612/yahoo.htm

・ブラウザー「Mozilla 1.1」α版がリリース
  http://www.watch.impress.co.jp/internet/www/article/2002/0612/mozi.htm

───────
  6月13日(木)
───────
・W3Cが「XML適合性試験スイート」を公開
  http://www.watch.impress.co.jp/internet/www/article/2002/0613/xmlts.htm

・ストリーミング市場はオンデマンド優勢へ〜IDC Japan調査より
  http://www.watch.impress.co.jp/internet/www/article/2002/0613/idc.htm

・さようなら、フル機能のFOMA「D2101V」
  http://www.zdnet.co.jp/mobile/0206/13/n_fomad.html

───────
  6月14日(金)
───────
・JPEGを媒介として感染するウィルス「W32/Perrun」が発見される
  http://watch.impress.co.jp/internet/www/article/2002/0614/perrun.htm

・Yahoo!JAPAN、書籍を検索・購入できる「Yahoo!ブックス」
  http://www.zdnet.co.jp/news/0206/14/njbt_12.html

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

前書きで書いたように、携帯の動きが怪しいため、先月くらいから機種変更を
考えています。今の狙いは、もちろん504iです!503をすっ飛ばしたためにずっ
とiアプリを我慢してきたのですが、もう限界です(笑)
  ※251(ドコモ版写メール)は、もうちょっと
      待ちかなぁという感じです。

ラインナップもようやく揃いましたが、私は P(Panasonic)に一目ぼれでした。
というか504で注目していたのは、後SO(ソニー)くらいでしたが。
(Fはディスプレイが4000色なんですよね)

    ・P504i
      http://www.mci.panasonic.co.jp/pcd/p504i/prdct/

なんと言ってもその薄さにビックリしました。
写真で見た時もビビリましたが、実機は声を上げそうになるくらいの驚きです。

アンテナはP503から継承した独特の形で、これは以前から好きだったのですが、
伝統通り真ん中に「i」マークが無いのはいただけません。でも、ああ、純粋
に欲しいと思わせる魅力ある機能がたまりません。


土曜日、もうこらえきれずに新宿 → 有楽町 → 池袋 とビックカメラめぐりを
したのですがどこも機種変更は在庫切れとのこと。入荷も未定だそうです。

新規分は結構余っているらしいのですが、システム的に機種変にまわすのは無理
だとの事。このボーナス商戦に、しかも携帯に4万出してもいいという人間がいる
のに、かなりもったいない事してるね(笑)>ビックカメラ

とはいっても、ポイント使って半額くらいで買う予定だったのですが(^^;
う〜ん、今月中には買いたいなぁ。


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

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

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

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

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







#--------------------------------------------------------------------------#
#            ▼データベースアラカルトのプログラムはこちら▼                #
#--------------------------------------------------------------------------#

use strict;

;#
;#かんたんデータベース
;#


{
    my $action = $ARGV[0] || showhelp();    #動作を指定する(add|search|update|dell)
    my $argv1  = $ARGV[1] || showhelp();    #指定文字1
    my $argv2  = $ARGV[2];                  #指定文字2
    my $file   = "easydb.txt";    #ファイルは固定

    #------------------------------------#
    #            データを追加            #
    #------------------------------------#
    if( $action eq "add" ){
        #-- 追加する --#
        add_db( $file, $argv1 );

        print "「$argv1」を追加しました";
    }
    #------------------------------------#
    #            データを検索            #
    #------------------------------------#
    elsif( $action eq "search" ){
        #-- 検索する --#
        if( search_db( $file, $argv1 ) ){
            print "○:DBに「$argv1」は存在します";
        }
        else{
            print "×:DBに「$argv1」は存在しません";
        }
    }
    #------------------------------------#
    #         データを検索・置換          #
    #------------------------------------#
    elsif( $action eq "update" ){
        my $count;

        #-- 引数チェック --#
        showhelp() if( $argv2 eq "" );        #入力が無ければヘルプを表示し終了

        #-- 検索・置換する --#
        $count = update_db( $file, $argv1, $argv2 );
        if( $count > 0 ){
            print "○:$count件置換しました";
        }
        else{
            print "×:置換対象がありませんでした";
        }
    }
    #------------------------------------#
    #            データを削除            #
    #------------------------------------#
    elsif( $action eq "dell" ){
        my $count;

        #-- 削除する --#
        $count = dell_db( $file, $argv1, $argv2 );
        if( $count > 0 ){
            print "○:$count件削除しました";
        }
        else{
            print "×:削除対象がありませんでした";
        }
    }
    #------------------------------------#
    #       よくわからん指定がきた       #
    #------------------------------------#
    else{
        showhelp();
    }

    exit(0);
}


#----------------------------------------------------------#
#■DBに追加
#      目的:指定ファイルの末尾にデータを追加する
#      引数:(1)ファイル名
#            (2)記録する単語
#    戻り値:なし
#----------------------------------------------------------#
sub add_db
{
    my $file = shift;        #ファイル名
    my $word = shift;        #追加する単語

    #-- ファイルに記録 --#
    open(DAT, ">>$file");        #ファイルを開く
    print DAT $word . "\n";      #ファイルに記録
    close(DAT);                  #ファイルを閉じる
}


#----------------------------------------------------------#
#■DBを検索
#      目的:指定ファイルの中に指定した単語があるか検索
#      引数:(1)ファイル名
#            (2)検索する単語
#    戻り値:真 = 1
#            偽 = 0
#----------------------------------------------------------#
sub search_db
{
    my $file = shift;        #ファイル名
    my $word = shift;        #追加する単語
    my $buff;

    #-- ファイルから検索 --#
    open(DAT, "$file");       #ファイルを開く
    while( $buff = <DAT> ){   #データを一行取得(取得できなくなったら終了)
        chomp $buff;          #改行を削除

        #-- 検索する言葉と、ファイルから取得したデータが一緒かチェック --#
        if( $buff eq $word ){
            close(DAT);
            return(1);            #一緒だったら真を返す
        }

    }
    close(DAT);        #ファイルを閉じる

    return(0);
}


#----------------------------------------------------------#
#■DBを更新
#      目的:指定ファイルの中の指定した単語を置換
#      引数:(1)ファイル名
#            (2)検索する単語
#            (3)置換する単語
#    戻り値:真 = 1以上の整数(置換回数)
#            偽 = 0
#----------------------------------------------------------#
sub update_db
{
    my $file = shift;            #ファイル名
    my $search_word  = shift;    #検索する単語
    my $replace_word = shift;    #置換する単語
    my $buff;
    my $count;

    #-- ファイルから検索 --#
    open(DAT, "$file");         #ファイルを開く
    open(TMP, ">$file.tmp");    #一時的に記録するファイルを開く

    $count = 0;                    #置換回数カウンターを初期化
    while( $buff = <DAT> ){        #データを一行取得(取得できなくなったら終了)
        chomp $buff;               #改行を削除

        #-- 検索する言葉と、ファイルから取得したデータが一緒かチェック --#
        if( $buff eq $search_word ){
            print TMP "$replace_word\n";    #一緒だったら置換後を記録
            $count++;                       #置換回数を+1
        }
        else{
            print TMP "$buff\n";            #違ったら取得データをそのまま書き込み
        }

    }
    close(TMP);     #ファイルを閉じる
    close(DAT);

    #-- ファイルの置き換え --#
    rename("$file.tmp", "$file");

    return($count);
}


#----------------------------------------------------------#
#■DBから削除
#      目的:指定ファイルの中の指定した単語を削除
#      引数:(1)ファイル名
#            (2)削除する単語
#    戻り値:真 = 1以上の整数(削除回数)
#            偽 = 0
#----------------------------------------------------------#
sub dell_db
{
    my $file = shift;        #ファイル名
    my $word = shift;        #削除する単語
    my $buff;
    my $count;

    #-- ファイルから検索 --#
    open(DAT, "$file");         #ファイルを開く
    open(TMP, ">$file.tmp");    #一時的に記録するファイルを開く

    $count = 0;                 #削除回数カウンターを初期化
    while( $buff = <DAT> ){     #データを一行取得(取得できなくなったら終了)
        chomp $buff;            #改行を削除

        #-- 検索する言葉と、ファイルから取得したデータが一緒かチェック --#
        if( $buff eq $word ){
            $count++;           #削除回数を+1
        }
        else{
            print TMP "$buff\n";    #違ったら取得データをそのまま書き込み
        }

    }
    close(TMP);
    close(DAT);                 #ファイルを閉じる

    #-- ファイルの置き換え --#
    rename("$file.tmp", "$file");


    return($count);
}


#----------------------------------------------------------#
#■使い方(HELP)を表示して終了
#      目的:使い方を表示
#      引数:なし
#    戻り値:なし
#----------------------------------------------------------#
sub showhelp
{
    print <<"END_OF_HELP";
-------------------------------
■かんたんデータベース
-------------------------------
使い方:perl $0 <命令> <指定文字1> <指定文字2(置換の場合のみ)>
命令部分は下記のように指定します。
  add ...... データを追加します。指定文字1に追加する単語を入力します。
  search ... 検索します。指定文字1に検索する単語を入力します。
  update ... 検索・置換します。指定文字1に検索する単語を、指定文字2に
             置換する文字を入力します。
  dell ..... 削除します。指定文字1に削除する単語を入力します。

END_OF_HELP

    exit(0);
}