フィンローダのあっぱれご意見番

第72回:ほころびだらけの網

初出: C MAGAZINE 1998年04月号
Updated: 1998-05-20

[一覧] [ホームページ]


 NIFTY SERVEからもホームページが公開できるようになって、WWWもさらに広がったかといえば、実はそんな気がしないのも確かだが、最近CG作家の皆さんのページをリンクとして集め始めた。このリンク集は裏ページに置いてあるのだが、調子に乗ってバナーを付け過ぎたせいで、猛烈に重いページになってしまった。大顰蹙である。これならついでにバナーもリンクにして該当ページにアクセスするようにしようか、というアイデアもあって、どちらが重くなるか見ものかもしれない。

 バナー画像をコピーするのがよいかリンクにするのがよいか、という問題は長年(^^)議論されていたようだが、明確な結論は出ていないような気がする。いずれにしても、数が多いと重くなる点は同じことだが。

 リンクといえば、リンクを禁止しているWeb pageがあるようだ。何かのポリシーがあって、あえてそう主張するのは構わないと思うが、インターネットの思想としてはどうだろうか。例えばアダルト対象のページの場合、トップページで警告を表示し、18才未満かそうでないかでメインページに飛べるかどうか自主判断させるものが多い。この場合、途中のページにリンクされたら警告自体が無意味になってしまう。

 しかし、インターネットの性質上、トップページとその他のページを区別すること自体が不毛であるというのも確かである。URLを直接指定すれば見えてしまうのに、リンクするのはいけない、というのは根拠が弱い。

 また、画像を埋め込むのもいけないという人がいる。このような人達は、何か勘違いしているように思える。つまり、画像を表示するというのは、あくまで指定された画像そのものがアクセスの対象となって表示されるのである。このことを理解していないのではないだろうか。

 インターネットが公共性の極めて高いメディアであることは重要である。誰からでも見える所にわざわざ画像を置きながら他から見るなというのがおかしいのである。海に手紙を入れた瓶をどんどん浮かべて「この順序で見てください」と強制しているようなものだ。自分のページだけから特定の構成だけで見えるようにしたいという気持は分らなくもないが、それならそのような手段を取ればよい。認証機能を使うとか、全体でまとめてPDFのデータにするとか、それならまだ分るのだが。

 そもそも、WWWの最大の特徴は、個々のコンテンツをどこからでも参照可能にした結果コンテンツの作成者の管理を強化できるという所にある。例えば新聞の誤報。紙メディアは買ったらそれまでだ。後で訂正記事が小さく出るかもしれないが、それに気付かないと、クリッピングした最初の記事をいつまでも真実だと思い続けることになる。訂正記事はクリッピングした内容までは修正してくれないのだ。何かうまい方法はないのか。実は既にある。それがWWWというシステムである。コンテンツを一個所にまとめ、他からはリンクという手段で参照することで、元情報の訂正は全世界のどこから見ていても全て同時に反映される。

 個人的には、リンクを禁止するというページをリンクする気は全然ないが、もしそのページの内容が必要になった場合はどうしようか。引用するしかなさそうだ。引用なら法律で認められた範囲で複製可能である。ただ、複製したら、元の情報が誤っていたら、誤情報を増殖させることになる。しかし、それはリンクを禁止した人が望んだ世界なのだから、別にそれで構わないだろう。情報のコントロールをあえて放棄しようというのだから、引用するのに遠慮はいらないはずだ。もっとも、そんなページを見るよりリンクokのページを探した方が、ずっと現実的だし、情報も確実になるから、実は私も引用するよりもurlを示すことがだんだん増えてきた。


 私のページはPhinloda is hereという最近更新をサボっているメインのページの他に、裏ページ、さらに真の裏ページ、さらに謎の…という感じであちこちに分散し始めている。一つでも大変なのに複数ページにしたら収拾が付かないのではないかと思われるかもしれないが、付かないのである。裏ページというのはurlが秘密だと以前から何度も書いているので、さっき書いたインターネットの公共性云々という主張に矛盾していると言われるかもしれないが、それは読みが浅い。ページ自体が秘密だとか非公開だとかリンク張るなと言った覚えはない。実はindex.htmlのかわりにhimitu.htmlを指定してくれという話なのだ。せっかくurlが「秘密」だと公開しているのにあまり見てくれないものだからFPROGで明白にurlを書いてしまったのは興醒めだったかもしれない。しかし、secret.htmlとかbookmark.htmlというファイルが置いてあるページって意外とあるような気もするのだが、勝手に見てしまっていいのかというと、いいのだろう、多分。

 なお、真の裏ページというのはNIFTY SERVEにあるから、urlを書かなくてもそれだけで分ると思う。NIFTY SERVEにはハンドルとurlを合わせている人も結構いるので、何となくurlを想像したら当たることもあって面白い。

 裏ページに置いてあるCGリンクのページはデータファイルからperlのスクリプトを使って生成したHTMLデータである。以前、本誌のCGI特集の時にランダムリンクの処理を紹介した。これに手を入れたら、ランダムにCGリンクを選択するCGIも作れそうだ。実際、デバッグがちょっと大変だったが、結局1時間もかけずに作っている。リンクを選択するためのデータは、perlのスクリプトでリンクページを作る時についでに作ってしまえばよいのである。このデータは、1行に1つのリンクが対応していて、即ちそこから1行選べばどこかのページへのリンクになっている、という仕組みだ。CGIのプログラムは、このデータからランダムに1行選んで、前後にヘッダやフッタを付ければよいだけだ。

 さて困ったのは、このデータファイルに入っているリンクの数である。それが分らないとランダムに選択できないからだ。実はNUTSHELLのPerlという本には、ファイルから1行をランダムに選択するエレガントなスクリプトが出ている。このスクリプトは全部の行を読んで1行を取り出すのだが、どうせ個人ページに書く程度のリンク数など知れているのだから、その通り全部読んでしまえばよかったのである。ところが、リンクページを生成する時に実はリンク数を求めているので、これを利用すれば途中まで読むだけで済むと思ったのがヤバかった。結構面倒になったのである。全部読まずに済むから効率がよいかというと、いまいち自信がない。

 とりあえず作ったものをRIMNETに転送してコンパイル、テストしたら動かない。コンパイルする時に「-static」オプションを忘れたのである。CGIを最近更新していないので、やり方を忘れているのである。気を取り直して再コンパイルしてから実行したらバナーが出ないのは何故?

 実は、cgiのプログラムはcgi-binというディレクトリに置いてある。URLはここを指しているから、cgiを実行すると、このディレクトリを基準にしてimages/banner.jpgというファイルを読もうとする。そんなディレクトリがないので、表示できなかったのだ。このディレクトリはトップディレクトリのすぐ下にあるのである。(fig.1)

---- fig.1 ディレクトリ構造 ----
  / public_html ----+---- cgi-bin --- randcg.cgi
                    |
                    +---- images ---- banner.jpg

 ということは、<IMG>の参照先を ../images/banner.jpg にすればokなのだが、実はCGIのプログラムの再コンパイルとか結構面倒だったので、ln -s ../images imagesを実行してシンボリックリンクを作ってしまった。安易である。こういうその場しのぎは良くないかもしれないが、とりあえず動いているのでよしとする。

 後で思ったのだが、こういう処理は「今日のCGページ」として、毎日cronで変更させるという手もある。負荷を考えると、その方がよかったかもしれない。いろいろアイデアは浮かぶのだが、忙しくてなかなか手を入れられないのが残念ではある。

---- List 1 (HTMLの生成、抜粋) ----
    fp = fopen(database, "r");
    if (fp == NULL) {
        cgi_error("can't open database\n"); /* exitするため戻ってこない */
    }

    /* 入っているデータの数を得る */
    while (fgets(mybuf, MY_BUFSIZE, fp) != NULL) {
        if (strncmp(mybuf, "link count:", 11) == 0)
            break;
    }

    link_count = atoi(mybuf + 11);

    /* 乱数で選択 */
    srand(time(NULL));
    link_count = rand() % link_count;

    while (link_count-- >= 0) {
        pos = ftell(fp);
        if (fgets(mybuf, MY_BUFSIZE, fp) == NULL) {
            fclose(fp);
            cgi_error("database format error\n");
        }
    }

    /* ヘッダと本文先頭を出力。これらはデータファイル先頭に書いておく。 */
    /* 先頭に戻す */
    fseek(fp, 0L, SEEK_SET);

    while (fgets(mybuf, MY_BUFSIZE, fp) != NULL) {
        if (strncmp(mybuf, "link count:", 11) == 0)
            break;
        printf("%s", mybuf);
    }

    /* 選択したデータの出力 */
    fseek(fp, pos, SEEK_SET);

(フィンローダ ニフティサーブ FPROG SYSOP)


(C) 1998 Phinloda, All rights reserved
無断でこのページへのリンクを貼ることを承諾します。問い合わせは不要です。
内容は予告なく変更することがあります。