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

フィンローダのあっぱれご意見番 第167回「次に来るもの」

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

ネットと雑誌というと、 かなり前からコラボレーションはできないのか、 というような模索をしようと試みたものだ。 どれ位昔かというと、 パソコン通信というアレがあった時代からそうだったわけだが、 これがなかなか難しい話で、 ネット側はネットだけでやろうとするし、 雑誌側は、ネットに出したら雑誌売れなくなるという考えなのか、 コンテンツはネットに出したくないというスタンスで、 これではコラボレーションどころではない。

 

※ 実はこのページ、 手違いで上書きして消滅してしまったので復刻した、みたいな。

とか思っているうちに、 何かバタバタしたなと思ったらフォーラムがなくなって、 雑誌が休刊になって、 これで仕事もなくなったら完璧(なにが)みたいな?

実際に、ネットを見て本を買ってみた、という人もいるわけだから、 岐路の中には、相乗作用をうまく使って両方の人気を高めるという選択肢もあるはずなのだ。

この「あっぱれご意見番」の連載だが、 比較したことのある方なら、 かなり編集の手が入って雑誌に掲載されていることをご存知だと思う。 これは私の原稿がかなり大雑把なことも一因だと思う。 特に、分量は適当というか、アバウトすぎる。 他の執筆者の皆さんはどうなのか知らないが、 最初から、私の場合、 どの程度の分量書けばいいのか、というのは大雑把な指示しかなかった。 ちなみに「あっぱれご意見番」の場合、2ページという量だったが、 これは約7~8KB 程度、という見積もりで書いている。 文字数とかではないのだ。

しかも、この連載は、最初からネットでも出すという前提で書いているものだから、 細かいところを勝手に修正されても、ほとんどそのままスルーしていて、 意味が違うとか、こっちの方がもっといい(つまり、自分の書いた箇所に対する修正)とか、 ソースが間違っていた、みたいな訂正しか校正で手を加えない。 表現にこだわるなら、 ネットで勝手に公開できるのだから、 雑誌として表現を統一させたいといった狙いがあれば、 そちらを優先させて構わないというスタンスなのだ。 特に「欲しい」とか「訳だ」のような漢字交じりの表現は、 基本的には、雑誌ではひらがなに修正されていたと思う。 こういうのは出版側のルールというか指針のようなものがあるはずなので、 それに合わせて校正するとそうなるのだろう。

§

Iterator パターンというのは有名なので、 今更説明のしようがない。 Java なんかだと、 そのものずばり、 Iterator という interface がある。

余談だが、 interface というのは Java の予約語である。 だから、わざとアルファベットで書いているのだが、 これをカナで表記したときに、 インタフェースなのか、 インターフェースなのか、 それともインターフェイスなのか、 とか悩み始めるときりがない。 こうやって何種類も書いておいたら、 google で検索するときに楽だったりするが、 まあこの話はまたの機会に。

Iterator を使った処理は、 例えばこんな感じ。

    Iterator it = set.iterator();
    while (it.hasNext()) {
        hoge(it.next());
    }

これはこれで別に難しくないような気がするが… 何か気になることはないだろうか? 一般に、慣れてしまったら最初に気になっていたことは忘れてしまうことが多い。 UIの世界では「慣れたら使いやすい」という言葉もあったりする。 他のやり方で慣れたらもっと使いやすいということにはなかなか気づかない。 まあこの話もまた別の機会にして、 とにかく Iterator の話に戻そう。

私が Java とかで Iterator を使い始めたころ、 どうしても気になってしょうがないことがあった。 先のソースにも出てきたように、 Iterator は、まず hasNext() を呼び出す。 最初にいきなり「次はあるのか?」と尋ねるのだ。

次もなにも、まだ一つも要素を取り出していないじゃないか、と思ったりしません? 私の感覚だと、 まず最初に何かしておいてから、「次」なのだ。 いきなり「次いこう」というのはおかしくないのか?

まあこれも、解釈というか、気分の問題なのかもしれない。 「次いこう」ではなくて、 こんな感じなら抵抗はなかったと思う。

    XIterator xit = set.xiterator();
    while (it.hasValue()) {
        hoge(it.getValueAndCountUp());
    }

ロジックは同じなのだから、 まさに気分の問題である。 こういうのはどうでもいい話で、 今回紹介したいのはもっと本質的な話だ。 その昔、C言語の本が1冊しかなかった頃、 つまり、K&Rという伝説の本があった頃、 C言語では、こういう処理を書くことがあった。

  
    int c;

    while (c = getchar()) {
        putchar(c);
    }
 

※ この処理は 0 が出現するまで putchar する、 というものである。 普通は EOF と比較するので、この例自体があまり適切ではない。

今だと、こう書きなさいと諭されるであろう。

    int c;

    while ((c = getchar()) != 0) {
        putchar(c);
    }
  

最初の書き方でも間違っていないのだが、 == と = を間違えるというのはバグの原因の一つだったから、 後者のように書くことが推奨されるようになったわけである。 それはそうとして、 この制御構造は、Iterator の構造と似ているように見えるが、 本質的なところが大きく違っている。

 

※ 書き方としては間違っていないが、 0が出てくる前に EOF が出現するとどうにも止まらない、 という意味ではどちらも間違っている。

Iterator の場合、 「次の要素」があることを判定する hasNext が条件判定部分に書かれている。 この処理は、状態を何も変化させない。 すなわち、hasNext を呼んでも、 it 側の状態は見かけ上は変化しない。 それに対して、 next を実行すると、it 側のカウンタか何か分からないが、 状態が一つ先に進んで、次の何かを受け取る準備ができる、 という仕組みになっている。 つまり、hasNext と next は独立した処理なのだ。

getchar で書かれた処理はどうか。 状態を一つ先に進めるのは getchar そのものである。 putchar というのは、受け取ったデータを出力しているだけで、 状態は見かけ上変化しない。 つまり、全ての状態は while の条件判定の式内で完結しているのだ。

もう一つ有名な例を示す。

    while (*dst++ = *src++)
        ;

条件判定の式内で全てが完結している。 その外には何もないから明白だ。 厳密にいえば、while の後の空文があるわけだが、 src の指している先の内容を dst に、0が出現するまで(0を含めて)コピーする、 という処理は、全て条件判定式の中で行われている。

この種のイディオムは、 「一連の処理」をどこまで凝縮できるか、 というのがポイントで、 これなんかも、 src から取り出して dst に入れて…とか細かく考えるのではなく、 「srcからdstにまとめてコピる」といった感じで理解するのがコツ。 熟練すると、一連の作業がパターン化して一個の作業として認識できる、 というメカニズムはいろいろな分野で見られるもので、 特にこのようなコーディング作業に限ったものではない。

§

今書いているこのコラムだが、 ネタはかなり前から持っているわけで、 百回以上も連載コラムを書いていると、 何となく次にまわそう、みたいなネタがどんどんたまってきて、 お蔵入りになったりするものだって、 結構ある。

そういうのを捨てるのはもったいないという話もあるけど、 ちゃんと読めるように書いて世の中に出すのはそれなりに大変だ。 今回は本に出ないということで、 雑誌原稿だと、もう少し時間をかけて推敲するという意味では、 ちょっと手抜きしていたりする。 その分、気楽に書いているが、意味不明なところがあるかもしれない。

何か考えて、 このネタいいな、というのを思いついたらどこかにメモしておく、 というような手順は、結構定番化しているような気がする。 つまり、そういう「ひみつメモ」を持っている人は結構いるのではないか。 手帳を持ち歩くとか、 夢日記をつけるとか、そういった類の話である。

プログラミングの世界は、 昔からそうなのだが、 今でも口伝・秘伝がわんさかあるような気がする。 なぜドキュメント化されていないのか、 する気がないのか、 してはいけないのか。 こんなの表に出したらヤバいだろ、というような情報も確かにあったりする訳だ。 真相は定かではないが、 口コミで初めて知った重要な情報というのも結構ある。 口コミというのも、 最近だと IRC だったりするから、厳密にいえば全然口コミではないのだが。

そういう情報が入りやすいのがネット、 そのまま出すのはちょっとマズくないですか、というのがペーパーメディア、 みたいな暗黙の切り分けがあって、 その辺りで展開すれば結構面白いメディアができるのではないかな、 というのは今でも思っているのだが、 なかなかそれを実現するには世の中厳しい。

いずれにしても、 いきなり「次はあるか」から入るような手順が現実にあるのか、 と考えてみたら、 原稿のメモというのは、まさに「次」から書いているのだ。 灯台下暗しというべきか。

  

(2006-04-18 Web に公開)
連載先募集中【謎】

修正情報:
2006-04-20 補足を追加
2006-05-18 消滅していた内容を復元。

(C) Phinloda 2006 All rights reserved.