Home日記コラム書評HintsLinks自己紹介
 

フィンローダのあっぱれご意見番 第130回「門前払い」

← 前のをみる | 「フィンローダのあっぱれご意見番」一覧 | 次のをみる →

Webの話。 以前から気になっていたのだが、 宗教関係のサイトからのリンクを禁止しているサイトがたまにある。 アダルト系のサイトからのリンクを禁止したくなる気持ちは、 とりあえず何となく分かる。 特にCG系のサイトだと、 画像だけを直リンクした有料サイトとかあるので(なぜ知っている?)、 そういうのは作者として当然イヤだろう。 もっとも、無断転載ならともかく、 イヤだという話とリンクを禁止できるかという話は別なのだが、 それはそうとして、 最近、直リンク対策をしたサイトも見かけるようになった。 多分、すぐ思いつくのがCGIを使って画像データを返すという方法なのだが、 単にデータを返してしまったら意味がないから、 条件を満たした時だけデータを返すという仕組みにすることになる。 最近使っているブラウザは Netscape 7.01なのだが、 画像中心のページを見る時には何となく重いので、 あえて Netscape 4.7 を使ったりすることがあって、 ブラウザを替えた途端に 見ようと思ったページが出てこなかった、ということがあった。 実際に見た感じでは、 リクエストヘッダーの refer 情報を見て、 直前のページが何なのか調べてから画像を返しているらしい。 クッキーを使った実装もできそうだ。

というのはおいといて、 問題は宗教関係のサイトである。 宗教関係のサイトから画像系のサイトにリンクする意図もよく分からないのだが、 それを禁止するという理由がこれまた分からない。 日本は現実的には無宗教に近いような国だから分かりにくいかもしれないが、 これは勘だが、 地球上に生きている人の非常に多くが特定の宗教の信者ではないのだろうか。 信教の自由という言葉は皆様もご存知だろう。 日本国憲法にも当然のごとく「信教の自由」という項目があるのだ。 もっともこれも建前で、 運用上は、例えば政府関係者には信教の不自由を強いているのかもしれないが、 それはそうとして、 どちらかというと「2ちゃんねるからリンクされて困った」 という話ならありそうな気もするのだが、 実際に宗教関係のサイトからリンクされて困った、 というケースはよく分からないのである。

§

もっとありそうなのは、 違法サイトとか公序良俗に反するサイトからのリンクを禁止する、 というサイト。 実際は、これが一番意図が分からない。 何を勘違いしているのか分からないが、 現実社会を理解していないとしか思えない。 ちょっと考えてみた。 例えば、 玄関に「セールス・勧誘お断り」のように書いたシールが貼ってある家がある。 何故わざわざそういうシールを貼るのだろうか。

ここで一つはっきりしているのは、 セールス自体は限りなく合法的行為であるという事実だ。

  

どこの家にも「強盗お断り」とか 「泥棒は来ないでください」のようなシールは貼らない。 そんなのは明らかに非合法だから断わる必要もない? 違うのだ。 例えば、 セールスお断りというシールは貼らない方がいいという説がある。 セールスマンが、そのシールを見てやってくるというのだ。 つまり、セールスお断りというシールをわざわざ貼る位の家なのだから、 セールスマンが押しかけるような、何かオイシイ要素があるのだろう、 と判断するのである。 あえてそういうシールを貼ることで、 裏の情報を暴露してしまうのだ。 一説によれば、「猛犬注意」だとか、 警備会社のシールとか、 そういうのを貼っておいた方がいいという意見もあるようだが。 では、強盗お断りというシールを貼らないのはなぜか。 そんなシールを貼ったら 「金目のものがあるぞ」と宣伝しているようなものだからだ。

 

※ 警備会社が契約している家庭の玄関に貼るシールがあるのだが、 この「シール」を貼るだけ、というサービスがあるという噂。

セールスマンは合法的行為という一線を超えない所があって、 「お断り」と書いておけば遠慮してもらえるのでは、 という甘い期待がまだ絶対に意味がないわけでもない。 しかし、強盗というのはかなりの犯罪である。 捕まったら懲役になるのを覚悟でやってくる相手に、 「お断り」と書いたら遠慮してもらえるとでも思っているのだとしたら、 世間知らずというか、非常識としか思えないのである。

  

ところが、サイト管理者の常識がどうなっているのかは知らないが、 「違法サイトからのリンクを禁止」と書いてあるサイトは割とあるのだ。 相手は法律を無視したサイトを作るような神経の持ち主なのだ。 その相手に向って、リンクを禁止すると主張して、 それに従ってもらえると考えているのなら、どこか間違っている。 まあ違法サイトの立場になって考えてみてください。 検索サイトで「違法サイト」 というキーワードでサーチして出てきたサイトをターゲットにする、 というのは結構いいアイデアだと思いませんか?

 

※ 違法サイトからのリンクお断り、 と明記しているサイトにリンクすれば、 何かおいしいことがあるだろう、と想像するわけだ。

インターネットの場合、違法というキーワードにはもう一つ大きな問題がある。 法律は国によって違う。 例えばその人のサイトが18禁とか、 もしかしたら15禁あたりのCGサイトだったら、 ある種の宗教国から見たら、 そのコンテンツは明白な違法行為かもしれないのだ。

公序良俗に反するサイトからリンクするなというサイト。 これもどうだかと思うのだが、 最近、私のサイトにも 「公序良俗に反するサイトからのリンクはご遠慮ください」 程度の警告を入れようかと思っていたりする。 この場合、「公序良俗に反する」とは具体的に何なのか、 というのが大問題となる。 もちろん、 WWWの世界においては、最も公序良俗に反するサイトの一つが 「他からの無断リンクを禁止するサイト」であることはまず間違いない。 だったらそんな文言を入れたら自己矛盾するような気もするが、 相手も勝手に「リンクを禁止する」と主張する位だから、 その特定の相手に限って「だったらオマエもリンクするな」 と主張する位は公序良俗に反しないような気もするわけだ。 ちなみに、ここでのポイントは 「禁止」ではなく「遠慮してもらう」という所にある。 「お断り」程度でもいいかもしれない。 「セールスマンお断り」という表現があるが、 セールスマンそのものは合法的存在だとして、個人的に断るというのはアリかな、みたいな。 もちろん、これにも問題はある。 遠慮しろという権利が本当にあるのか、ということだ。 ネットと無関係な世界に喩えるなら、 リンク禁止という行為は、 公道に看板を出しておいて、「ここに看板があった」という事実を紹介することを禁止する、ということである。 ここに看板を置きますが、内緒にしておいてください、といったところか。 そんなの知るか、と言われたらそれまでの話なのだが。

§

C言語Q&Aには、今でも質問がたまに来る。 ただ、最近はC言語に関する質問は極めて稀で、 殆どの質問は、 特定の環境に大きく依存するか、 全く言語に依存しないか、どちらかである。

言語に依存しないというのは、 例えば「1から10までの数を合計した結果を表示するにはどうしたらよいか」 のような質問だ。 これなら 55 と表示するプログラムを書けば解決する話だが、 冗談抜きにして、 1からnまでの数を合計した結果を返す関数を書けといわれたらどうすればよいか。

---- List 1 (単純に足し算する) ----

int sum(int n)
{
    int total = 0;
    int i;
    for (i = 1; i <= n; i++)
        total += i;

    return total;
}

---- List 1 end ----

演習問題なら、これでも正解なのだろう。 一見簡単そうだが、結構深い問題が隠されているのだ。 皆さんは、 多分中学校あたりで1からnまでの和を求める公式を習っているのではないか。 それを使えば List 2 のようになる。

---- List 2 (公式で和を求める) ----

int sum(int n)
{
    return (n + 1) * n / 2;
}

---- List 2 end ----

1から一つずつ加算するのではなく、 1回の足し算と1回の掛け算と2で割るという割り算、 それだけで済むあたりは、 足し算を何度もするよりも効率がよさそうに見える。 そういう意味では、 List 2 は List 1 よりも優れた解法だという意見があるかもしれない。 ただ、List 2には、一つ欠落していることがある。 この関数が有効な値を返すのは一体どういう範囲の引数を与えたときなのか、 ということだ。 List 2 の関数に -2 を与えたら、1という値が戻って来る。 -3 を与えたら 3 が戻って来る。 それは意味のある値なのかというと、 数学的には、そのように定義したという解釈も不可能ではない。 ただ、プログラムとしてはどうかというと、 実際に1からnまでの和が欲しいような処理がどの程度あるのか分からないが、 とりあえず、sum(-3) が 3になるよりは、 範囲外の場合は例えば 0 という値を返してもらって、 呼び出した側が戻り値が 0 かどうか判断すれば、 何かおかしなことがあったことがわかる、 という仕組みの方が便利なことが多いものである。

List 1 はどうなっているか。 負の値を指定した場合、List 1 の関数は必ず 0 を返す。 それが偶然なのか意図的なのかは不鮮明だが、 この関数では範囲チェックはどこでやったのかというと、 実は for ループの中の継続条件判断の式、 「i <= n」が負の数の範囲チェックを兼ねていたのだ。 0以下の引数で呼ばれた場合にはループの中の足し算が一度も実行されないので、 初期化された total の 0 という値がそのまま戻る、という仕組みになっている。

もちろん、 List 2 をそのように改造するのは極めて簡単で、 まさに範囲チェックを追加すればいいだけの話だ。 例えば List 3 のようになる。

---- List 3 (処理前に値を確認する) ----

int sum(int n)
{
    if (n < 1)
        return 0;

    return (n + 1) * n / 2;
}

---- List 3 end ----

これらの関数にはまだ、 計算した結果がintの範囲内なのかというチェックが抜けているわけで、 完全だとは言えないが、 とりあえず、怪しい呼び出しには帰っていただく、 という定石は覚えておいた方がいいと思う。

(追記)

int が32ビットだと、 65536 * 65535 / 2 の計算でおかしくなるから、 この関数が正しい値を返せるのは引数が 65534 以下のときである。 65535 を与えたときにも正しい値を返すような処理が書けないわけではない。

int sum(int n)
{
    if (n < 1)
        return 0;
        
    if (n % 2) {
        return (n / 2) * (n + 1);
    } else {
        return ((n + 1) / 2) * n;
    }
}

しかし、 おそらく殆どの場合、ここまでする意味はないだろう。

  

(C MAGAZINE 2003年4月号掲載)
内容は雑誌に掲載されたものと異なることがあります。

修正情報:
2006-03-02 裏ページに転載。

(C) Phinloda 2003-2006, All rights reserved.