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

第55回:フィードバック

初出: C MAGAZINE 1996年11月号
Updated: 1996-11-14, 1999-03-31

[1つ前] [1つ後] [一覧] [ホームページ]


WWWにしろネットにしろ、は自分から情報を提供できるという特徴があるわけだが、実際に何か行動を起こすという人よりも、単に眺めているだけの人の方が圧倒的に多いようだ。 ホームページの参照数が10,000あるのにメールが10通しか来ないとか、会員が7,000人いるフォーラムの会議室に書いている人が70名であるとか、それが一つの実態ではあるが、もしかすると、メールが来ない理由は単に私のページが面白くないだけで他のページはそうでもないのかもしれないし、会議室に書く人が100人に一人なのはFPROGだけで他のフォーラムでは10人に一人なのかもしれない。 このようなデータはあまり表に出てこないので真相は闇の中なのだ。 (*1)


諸般の事情により、割と唐突に「初級C言語Q&A」が終わったが、ちょうど最終回の原稿を出した頃に「Q&Aをいつも読んでいる」というメールを何通かいただいた。 それまで、そういうリアクションは殆どなかったのので不思議な話だ。 終了になってからこちらにお便りが来た所でどうしようもないのだが、幸い、今ならWWWという便利なものがあるので、連載が終わっても勝手にWebで続けることができそうである。 とはいっても、実は元の記事の更新すらうまく行っていないというのが現実で、時間がないのが厳しい状況である。

Q&A第11回の【相互に参照する構造体】の説明が根本的に間違っていた。 List 1のように構造体を宣言したらうまく行かないと書いたのだが、全然問題ないのである。 うまく行く。p2を宣言した時点ではstruct list2は未定義だが、このようにポインタとして宣言する場合には、後から宣言が現れても構わないからだ。 お詫びの上訂正させていただきたい。WWWの方では修正したものを掲示してある。

---- List 1 ----
struct list1 {
    struct list2 *p2;
    int i;
};

struct list2 {
    struct list1 *p1;
    char *s;
};

このご指摘は電子メールでいただいたのだが、この方は私のミスの原因を、もしかするとPascalと混同したのではないか、と想像されている。 そうかもしれないが、もしかすると、エラーになるコンパイラを使ったことがあるのかもしれない。自分でも原因はよく分からない。 (*2)

一般に、出版物へのリアクションというのは、編集部宛てに送れば実際に書いた人に回想してもらえるのが普通だが、最近はこのように直接コンタクトが取れるようになって、フィードバックという点では有利な環境になってきた。


fj Newsgroupで「レス」という言葉を使う人がいると、すかさず「レスって何ですか?」というような質問が入ることがよくある。 何度も何度も同じ質疑応答を繰り返してよく飽きないものだと思うかもしれないが、ちゃんとした回答がなかなかないのである。 (*3) フォーラムの場合、これでは困るので、プログラマーズフォーラムでは「俗語辞典」というものを用意して、語の意味を定義してしまうという方向に走った。 つまり、「レス」の語源だとか一般的用法は一切無視して、プログラマーズフォーラムではこのように定義した、という事実をまず作るのである。 後は、「レスって何ですか」と質問されたら「俗語辞典ではこうだ」と言うだけだ。 なぜそう表現するかという理由よりも、要はコミュニケーションが成立するかどうかである。 もちろん、Copyright留保のソフトウェアをPDSと呼んだりするのは困るが、自己矛盾していたり悪影響がある場合は別にすれば、結構俗語も役に立つものだ。 「レス」の意味はどうかというと、こうなっている。

れす【レス】
レスポンスの略。ある発言に対して、コメントとしての関係となる発言のこ と。ニフティサーブではコメントと呼ぶ。

よく分からない説明だ。 しかも「コメントとしての関係となる発言」という表現も変だ。 しかし、これに対してクレームが付いたとしても、「そりゃ間違っている」という異議は通用しないのである。 なにしろ、これは一般的な用法ではなくて、FPROGという場ではこう解釈するという宣言なのだ。 int l;と定義してあるのを見て「違う、intならiで定義するのだ」と言われても、こう定義したんだからしょうがない。 FPROGではレスといえばレスポンスの略でコメントのことであり、レイといえば綾波レイのことに決まっているのである。 (*1)

レスという言葉は認知度が高いらしく、スラングにしては頻繁に見かけるが、少し頻度が低いものとして「浦島レス」というものがある。 俗語辞典では、忘れさられた昔の発言へのコメント、という感じの説明になっている。 浦島太郎の物語から想像すると、何百年もたってからコメントする、といった感じなのだが、さて、この表現を初めて使ったのは誰なのだろうか。 いつごろから現れたのだろうか。 類語には「亀レス」「化石レス」という表現がある。何となく雰囲気は分かると思う。 「浦島レス」だけがちょっと凝っているような気がする。 ネットの発言を一括して保存する文献センターでもあれば、文化的な資料として結構面白 いと思う。 ただ、NIFTY-Serveのような場合は、著作権の問題があるのでそうもいかないかもしれない。 Netnewsなら、来た物はとりあえず全部保存しているサイトもあるかもしれない。


さて、FPROG俗語辞典だが、WWWから見ることもできる。FPROGのホームページは、

http://www.niftyserve.or.jp/CM/Forum/fprog/index.htm
というURLになっているので (*4) 、ここからリンクをたどればいい。 こちらはもちろんHTMLで書かれた内容になっているが、FPROGにはテキスト版も公開している。 順序としてはテキスト版を作って、そこからHTMLを起こす、というのが一般的かもしれないが、これが割と面倒な話である。 特に俗語辞典の場合、HTML版は、語ごとに<A NAME>を指定してあるのだが、これをテキスト版から自動生成するのはちょっと無理がある。 テキスト版には「ローマ字の読み」という奇妙な情報は入っていないからだ。

そこで、FPROG俗語辞典は、まずネタになるファイルを作成しておいて、そこからテキスト版とHTML版の二種類のデータを生成する、というような手順で処理している。 この処理のために最初awkを使っていたのだが、アンカー・タグを配置したり、クオートしなければならない特殊コードを置き換えたり置き換えなかったり、という処理を追加しているうちにどんどん面倒になってきて、結局C言語で処理するものを書いてしまった。 リストをお見せしたい…かというと、割と雑なのであまり見せるレベルではない。一、二日程度で書いた600行程度のプログラムである。

一部だけ紹介すると、List 2のようになっていて、つまりHTMLの場合とそうでない場合とで出力する内容が違う、というただそれだけの感じであることが分かると思う。

---- List 2 ----
static void footer(void)
{
    if (html) {
        fprintf(fp_out, "</DL>\n<HR>\n<P>\n");
        fprintf(fp_out, "<H2>用語解説者</H2>\n<DL>\n");
    } else {
        fprintf(fp_out, "%s\n\n", bar);
        fprintf(fp_out, "用語解説者\n");
        fprintf(fp_out, "−−−−−\n\n");
    }
これに食わせるデータというのは、最初、次のように書いてある。 この内容を処理して先に紹介したテキスト形式にするのは簡単だ。 awkなら、ちゃちゃっ、と数分もあれば書けそうだ。

 index:れす
 【レス】
 anchor:res
    レスポンスの略。ある発言に対して、コメントとしての関係となる発言のこ
    と。ニフティサーブではコメントと呼ぶ。

これに対して、HTML形式を出すように指定すると、次のような出力を生成する。

<DT><B><A NAME="res">れす【レス】</A></B>
<DD>レスポンスの略。ある発言に対して、コメントとしての関係となる発言のこ
と。ニフティサーブではコメントと呼ぶ。
<P>

この程度なら何もC言語の出番じゃなくて、awkだけでも…と思われるかもしれないが、ま、それもそうだ。 実際のコードには、言葉の解説をした方々の情報とか、参照先のリンクとか、そのような情報も入ってくるので、もう少し面倒な処理が加わる。 例えば、言葉の解説者は元データだとそれぞれの言葉の位置に書かれているが、公開データに変換すると、最後に一括して表示するようになっている。 誰がどの語の解説をしたかを記憶しておき、最後に一度に表示するのだ。 一つの単語に対して複数の解釈があり、解説者も複数で、しかも一部の人がWWWへの公開を未承諾、というようなケースになると結構ややこしいことになる。

すると、ちょっとした問題がないわけでもない。 普段使っている環境だとawkは重過ぎるのだ。ま、環境が貧弱なわけだが。

私の場合、このように、元になるデータを作っておき、プログラムで処理をしてHTMLファイルを生成、またはTXT形式を生成、というような手順にすることがよくある。 この原稿もそうだし、Q&Aの連載の場合は、もう少しややこしい処理になっている。 処理が複雑になるのは、本文にタグを付けたり、インデックスファイルに対応するリンクを追加したり、それらを更新したという情報をホームページに反映させるためである。 これらを一括してやってしまわないと、手作業でやろうとしても、やはり間違える。 1〜2日程度でできるコードなら、一回作ってしまえば、後のことを考えるとトータルコストは得になる。 C言語なんて個人で用途があるのかという人もいるようだが、使い慣れるとこういう役にも立つ。


補足

(*1) この表現はエヴァンゲリオンの放送中のセリフを意識している。“綾波レイ”は同アニメに出てくるヒロイン。当時、このアニメが大ブレークしていた。

(*2) JIS X3010 6.5.2.3「タグ」の例2に次のように記述されている。これと勘違いしたのかもしれない。

例2.相互参照構造の組を宣言するために、タグを前もって宣言して使用する例を説明する。
宣言
    struct s1 { struct s2 *s2p; /* ... */ }; /* D1 */
    struct s2 { struct s1 *s1p; /* ... */ }; /* D2 */
は、互いに他を指すポインタを含む構造体の対を指定する。 しかし、s2がそれを囲む有効範囲でタグとして既に宣言されている場合、宣言D1はそれを参照し、D2で参照されるタグs2を参照しない。 この文脈の影響を除くために、宣言
    struct s2;
をD1の前に挿入する方法がある。 これは、内側の有効範囲で新しいタグs2を宣言する。宣言D2で新しい型の仕様を完全にする。

(*3) 最も大きな問題は「レス」の意味する内容が実際に不確定だという所にある。 典型的な異なる意味として「ある投稿・発言を意識してそれに対して行われた投稿・発言」をレスとする場合と、「ある投稿・発言の感想として送られるe-mail」をレスとする場合がある。 「レスを期待します」という表現があっても、リアクションとして投稿してよいのかe-mailにすればよいのか判断できない。

(*4) その後、URLが変更になった。次を参照してほしい。 プログラマーズフォーラムホームページ


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