4.

浮いている小さなコードの葉っぱ

[o]

Impossibly deep in the caverns of Ambrose... the Elf with a pet ham!

ワイバーンのとても暗く邪悪な心の奥深く、セリス川のほとり、マル・アボクニーのグリフォンの庭を覆い、人の足を踏み入れたことのない森林帯の上、第六のアポカリプスで倒された巨人たちの死骸 が満たし、捻れた角のユニコーンが穴を開けてもぐり込み(そしてこれらの空っぽの死骸の中からもっとたくさんのユニコーンが生まれ、ぐったりした四肢を満たして命なき怪物を歩かせた!)、コケの生い茂るベルトコンベアを下っていき、本当の地へと、本当の、本当の、本当の(本当に思えるようになった? そうなら教えて欲しい)、洞窟の内部構造、つやつやした岩、1戸1400平方フィート、ウォークインクローゼット付き、価格は変動します、「アンブローズの洞窟」、エルフとペットのハムの仲間たち!

「私にはすごいペットがたくさんいるんだ!」

「おたくのペットだったらみんなバスに乗って行ってしまったよ!」

...and the cat Trady Blix.

「邪魔しないでくれ!
お客様の接待をしているんだ。お前はそこら辺で鳴きまわっていろ!」

「立ち去れ、お邪魔猫!」
「取り込んでいて申し訳ありません。小さなやつはよけて通ってください」

みなさん、みなさん!
アンブローズでの時を楽しく過ごしたいですか?
これが必見の名所とアクティビティです:

No.1: 私(ブリクス)
(私は猫です。黒い猫です。)

司会者、アンブローズカラオケ大会優勝歴5回、いたずら電話マニア、身振りギャグの名人、このリストはどこまでも続く・・・

No.2: ハム
ハムに何ができるかはお楽しみに!

注意! エルフはリストに載っていません。

私はハムが汁をしたたらせる以外のことをするのを見たことがない。今日、私たちがアンブローズ洞窟に来たのはエルフに用があってのことだ。彼は次のレッスンで重要な役割を果たす。彼 が機嫌良くなるようにしよう。あなたのリスニングハットをウォーミングアップして! (それからその変なあぶみ付きのズボンは履き替えた方がいい。)

注意: このレッスンはゆっくりしたものになる。我慢してほしい。これは長くて深い呼吸になる。あなたの教育において最も重要なステージなのだ。最初はあまり多くのコードを学んでいないように感じるかもしれない。 ここではコンセプトを学ぶのだ。章の終わる頃には、Rubyの美が分るようになっていると思う。コードの心地良さが、あなたを慰める羽毛の寝袋となるだろう。

1. アンブローズにおけるステータスシンボルとしての葉っぱ

いいよ、エルフ。君の王国が直面している通貨の問題について簡単に説明してくれ。

Blue Crystals got the shaft.

「我々は以前は(お金として)ブルークリスタルを使っていた。
しかしこの洞窟の中はすごく暗くて、何かが青いかどうかわからない・・・」

「だけどお金を水泳パンツに入れておいても心配せずに済んだよ」

「ともかく、昆虫や甲虫はみんな葉っぱをお金に使っている」
「彼らはブルークリスタルは重すぎるので受け取らないんだ。それで切り替えたのさ」

なんか私が聞いていたのとは違うようだ。エルフはひっきりなしにポケベルを鳴らしてきた。私が電話をかけ返さないと、彼は私のポケベルにメッセージを残す。つまり、2回鳴って、それから小さな紙片がプリントアウトされる。その紙には 実質的には「早く降りてきて!」ということが書かれていた。それから「起業家芋虫の損害を地上から一掃すべきだ。あのねじれた虫のバイキングは私のブルークリスタルを窒息させている!」とも書かれていた。

後に、葉っぱとクリスタルの交換レートは安定した。木に成る紙幣は5クリスタルの価値がある。だから基本的な通貨の状況は以下のようになっている:

 blue_crystal = 1
 leaf_tender = 5

この例は、まったく前の章といっしょみたいだ。まだ始めだからね。ここでは2つの変数を設定している。イコール記号代入に使われる。

さて、leaf_tenderは数5を表している(5ブルークリスタルということ)。この概念はRubyの半分に当たる。何かを定義している。何かを作っている。これは仕事の半分だ。代入というのは定義の最も基本的な形式だ。

しかし君は文句は言えないんじゃないか、エルフ?  君は森の生き物たちの新しい自由市場で、ブルークリスタルのキャッシングによって帝国を築いたのだから。(彼は私たちにはエルフでも、森の生き物たちには巨大なモンスターなのだ。)

Animal Perfect, LLC

「その通りだ、ホワイ・・・
スモッチキス、こちらへ」

「アンダーグランド・アニマル・パーフェクト有限会社にようこそ」

「持っていたクリスタルは全部アニマルパーフェクトに投資したんだ。スターモンキーを作るところを見たい?」

いやいや、ちょっと待って。あなたはこのエルフが洞窟でやっていることを見るのは早すぎる。きっとあなたはそれがまったく非人道的で、いやらしく、病的で、ねじれてい る、などと思うだろう。

さて、あなたはアニマルパーフェクトのミッションステートメントは読みたいよね?  これは本なわけだし、時間は十分にあるのだから。

昔、昔、スピードボートよりずっと昔、私は見事な競走馬を持っていたが、その馬はトラックで躓いた。馬は10回後足立ちになった後、壜いっぱいのマヨネーズを持った男にぶつかった。血とマヨネーズがトラック中に飛び散った。 その馬がひどいことになったのは言うまでもない。

獣医は馬を一目診て、二度と歩けないだろうと断言した。その馬の脚は駄目になってしまっていて、獣医は脚のない馬がのらくら暮らすなんてことを許そうとしなかった。私たち には安楽死させるしかなかった。獣医は自分の命とキャリアにかけて、みんなが2列に分かれることを求めた。彼の要求に反論できない者は一方に、あまりの頑固さゆえに獣医の間違い得ない医学的 判断を受け入れられないというものはもう一方に並べというのだ。エルフと、エルフのペットのハムと、それに私だけが、2番目の列に並んだ。

それで他の人たちがトロフィーや大きな花輪を馬のまわりに積み上げて、弾丸が馬の命を絶つ前にお別れをしようとしている間、エルフと私は狂ったように答えを求めてインターネットを叩い ていた。私たちはこの問題を私たち自身の手に引き取って、馬の脚の傷を生きたザリガニで切除した。それはすごくうまく行った! 私たちは馬を取り戻したのだ。まあ少なくとも、腹部に甲殻類の覆いのある馬の体を。

馬はその後どこでも走り回るようになり、心地よい湿気のある地下の穴で何年も生き続けた。

アニマルパーフェクトは、動物の増進の未来だ。新しい動物を作り、旧来の動物はパーツで助けている。もちろん長い時間がかかった。アニマルパーフェクトが始まった当初 には、あなたが目にしただろうものは、完全に成長した熊がアニマルパーフェクトに入ってきて、サングラスをかけた完全に成長した熊が出て行くということだ。全然いんちきだ。

そこにいたら、ジェットパックをつけた蟹を見られるだろう。新しい2004年モデルのジェット蟹だ。

今ではシステム全体がフル稼働している。そしてこの場所のきれいさは驚くばかりだ。装置という装置が輝いている。すべてがクロムめっきされている。ああ、それからスタッフは全員武器を隠し持ってい る。彼らは無断で入ってきた人は誰でも殺すように訓練されている。そして弾が切れたときには、彼らは無断で入ってきた人は誰でもピストルでぶったたくように訓練されてい る。

エルフ、スターモンキーを作ってくれ。

First, the star is caught.

天井に星形の穴をあける。
星が落ちてきたところをつかまえる

「星はマシンの中でモンキーが来るのを待つ」

想像上のRubyコードを書いてみよう:

pipe.catch_a_star
( パイプ . 星をつかまえる )

変数pipe。メソッドcatch_a_star。ルビイストの多くはメソッドをメッセージとして考えるのを好む。ドットの前に来るものは何で あれ、メッセージを渡される。上のコードはpipecatch_a_starするようにと言っているのだ。

これがRubyの2番目の半分だ。ものに何かの動きをさせること。最初の半分で定義し生成したものが、あとの半分で行動し始めるのだ。

  1. ものを定義する。
  2. それに行動させる。

では、あの星をつかまえるコードが動くとどうなるのだろう? 星はどこへ行くのか?

captive_star = pipe.catch_a_star
( つかまった星 = パイプ . 星をつかまえる )

見ての通り、哀れな小さな星を集める仕事はあなたにかかっているのだ。あなたがやらなければ、それは単に消えてしまう。メソッドを使ったときはいつも何かが返ってくる。あなたはそれを無視してもいいし使ってもいい。

メソッドが返す答えを使えるようになると、あなたは支配できるようになる。

Star is ratcheted to the monkey's face.

ほら!
モンキーとスターだ。

「マシンの中のラチェットは、スターをモンキーの顔にはめ込むべく動く。うまくくっつくまで試していくのだ」

じゃあ、やってみよう。

starmonkey = ratchet.attach( captive_monkey, captive_star )
( スターモンキー = ラチェット . くっつける(つかまったサル, つかまった星) )

ratchetattachメッセージを受け取る。くっつける必要があるのは何か? メソッド引数で指定したcaptive_monkeycaptive_starだ。私たちはstarmonkeyを受け取り、それをつかまえておくことにする。

Frog on the hand.

「アニマルパーフェクト!」

「そうだ、それから彼らの右手に飾りとしてカエルを熱接着している。パセリの小枝みたいなものだ」

これはとても短い小さなプログラムなことが分かたので、全部1つのステートメントにまとめることにしよう。

starmonkey = ratchet.attach( captive_monkey, pipe.catch_a_star ) + deco_hand_frog
( スターモンキー = ラチェット . くっつける(つかまったサル, パイプ . 星をつかまえる) + 手の飾りのカエル )

pipe.catch_a_starがメソッドへの引数の中に入っているのを見てほしい。つかまえられた星は直接ラチェットに渡される。それを取っておく場所を用意する必要はない。そのまま行かせればいいのだ。

2. 小さくてほとんど価値のないもの

Law-va.
アンブローズ洞窟の休憩室で・・・

「はい、もしもし」
「シンコプティック & ウェルチ法律事務所ですか? ええ。どうも」

「誰かから聞いているか分りませんが、お宅の弁護士はみんな大きな火山事故に遭いまして。
ファイルキャビネットを調べてみてください! たぶん溶岩だらけになっていると思います」

「ごにょごにょ!
調べさせています!
アーイ アム チャーンピオーン!」

ここアンブローズのホテルはあまり良くない。ベッドはごつごつしている。エレベータは小さい。ある男がエレベータにバッグを全部入れたら、自分が乗れないことに気付いた。それで彼はボタンを押すと、エレベータを追いかけて階段を駆け上がることにした。しかし階段の幅が狭すぎて、上ろうとすると肩がつかえ てしまった。

彼らがくれる石けんはエルフ用に小さくしたものだ。だから泡立てることができない。あれは嫌いだ。私はいつもコンタクトレンズと間違う。

蛇口をひねっても何も出てこない。実は、アンブローズは魔法の特質のある場所なので、私はひとつ試してみることにした。私が蛇口の下に手を入れると、目に見えない暖かい湿り を、水が指の間を流れ落ちるのを感じた。手を取り出すと、乾いていてきれいになっていた。

これは驚くべき無の体験だった。それはまるでnilのようだった。

Nil
 

Rubyでは、nilは空虚を表している。これは値がないということだ。ゼロとは違う。ゼロは数だ。

これはRubyにおける歩く屍、死んだキーワードだ。それには何も加えることができず、成長もしない。しかしものすごく人気がある。この骸骨はあらゆる写真の中で笑っている。

plastic_cup = nil

このplastic_cup空っぽだ。plastic_cupは何かnilというものが入ってるんじゃないかと言うかもしれない。でもnilは空虚を表しているわけだから、話を進めて、それを空と呼ぶことにしよう。

プログラミングをしたことのある人は、plastic_cup未定義(undefined)だと言いたくなるだろう。そうは言わないことにしよう。変数が未定義という 場合、Rubyは単にその変数の記憶がなく、その変数のことを知らず、変数が存在しないということなのだ。

しかしRubyはplastic_cupのことを知っている。Rubyは簡単にplastic_cupの中を覗くことができる。それはではあるが、未定義ではない。

False
 

Shape of a cat.

猫のトラディ・ブリクス。空虚の中で凍り付いている。凍っているきれいな髭。湖のように穏やかな目。暖かいつららのしっぽ。超強力ポーズボタンの提供でお送りしました。

ブリクスを囲む闇は負の空間と呼べる。このフレーズをしっかり持っていよう。空虚には負の意味合いがあるのを指摘しておこう。nil が口笛を吹くとき若干不機嫌な響きがあるのと同じように。

一般的に言って、Rubyのすべては、正電荷を持っている。このスパークは文字列や、数や、正規表現を流れている。2つのキーワードだけが、影のあるマントを身にまとっている。nilfalse は、私たちを引きずり下ろす。

あなたはif キーワードを使って、その電荷を確認することができる。これは前の章で見たdo とよく似ており、endで終わっている。

 if plastic_cup
   print "プラスチックカップは株を上げている!" 
 end

plastic_cupnilfalseを持つ場合、画面には何もプリントされない。彼らはif の招待客リストには載っていないのだ。だからif は自分の守っているコードを実行しない。

しかしnilfalseは面目をなくして立ち去る必要はない。彼らは疑わしい人物ではあるが、小さな会社をやっているunlessは、薄汚いところも相手にする。unlessキーワードは負電荷を持ったものだけを受け入れるというポリシーだ。つまりnilfalseということだ。

 unless plastic_cup
   print "プラスチックカップはずっと低いところにある 。" 
 end

ifunless1つのコード行の末尾で使うこともできる。守るべきものがその1行だけという場合には。

 print "ああ、プラスチックカップは再び上がっている!" if plastic_cup
 print "全然。落ち目だ。" unless plastic_cup

もうひとつ気の利いたトリックがある。ifunlessは重ね られるのだ。

 print "私たちがプラスチック製を使っているのは、ガラス製のがないからだ。" if plastic_cup unless glass_cup

このトリックは、「a が正しくbが正しくないときだけこれをしろ」ということを表現する見事な方法だ。

さて、あなたはfalseに会ったので、次に何が来るか想像がついているに違いない。

True
 

approaching_guy = true
(近づいてくるやつ = true)

私は今日ホテルのビュッフェでtrueを見かけた。私はあいつが我慢ならない。彼の態度はでかすぎる。だいたい足をあれくらい地面にしっかり踏ん張って立っている人というのはまず 見たことがない。彼は貝でできたださいネックレスをしている。彼の顔からは生意気な自信がにじみ出ている。(彼 が自制というものを使うのは、ネオみたいに空に飛び出さないようにするためくらいのものだ。)

正直に言って、私はいつでも正しくなければならないような人には近づきたくない。このtrue はいつも言っている。「A-OK」。光るハンテン。そして本当に、彼はあのネックレスを気に入っているのだ。いつでも身につけている。

ご想像の通り、if によるイベントスケジュールのすべての舞台裏には彼がいる。

print "ヒューゴボス" if true print "ヒューゴボス"と同じように振る舞う。

ときどきif はベルベットのロープを張って群衆整理をする。二重の等号は赤いカーペットのわきに張られた短いロープで、trueだけが通ることを許されている。

 if approaching_guy == true  # 近づいてくるやつ == true 
   print "あのネックレスは古風だ。" 
 end

二重の等号は単なるIDチェックだ。ロープの両端にいる紳士は一致しているか?

このようにして、if に誰を通させるかコントロールできる。私みたいにtrue と上手くやっていくのが難しくなったら、falseを心から歓迎すればいい。

 if approaching_guy == false  # 近づいてくるやつ == false
   print "ここから入んな、見逃しといてやるよ、悪党。" 
 end

unlessを使う人もいる。入り口はあなたのものだ。好きなようにするといい。

再び、あなたに支配してもらいたい

精神を刺激されるような体験がしたい? 二重の等号はメソッドなのだ。それがどんな風に働くのかわかる?  ほら、ドットと括弧をつけてやってみて。

approaching_guy.==( true )

Rubyではショートカットが使える。ドットは落としてそっと後ずさりできる。

ところでRubyの世界を支配するために何が必要だったか覚えてる? メソッドが返す答えを使うということだ。

 if nil.==( true )
   print "これが表示されることは決してない。" 
 end

ここで、メソッドの答えはどう使われているのか?

ステートメントnil == trueを見てみよう。これは必ず失敗する。けっしてマッチしない。マッチ しない場合、二重の等号メソッドはfalseを返す。首を振るのだ。この答えがifに渡され、iffalseを受け入れないので、printが実行されることは決してない。

 at_hotel = true
 email = if at_hotel # ホテルにいるなら 
           "why@hotelambrose.com" 
         else
           "why@drnhowardcham.com" 
         end

ifはメソッドではないが答えを返す。上のコードでat_hoteltrueのとき何が起きるか考えてみて。

ifは実行することにしたコードが返す答えを返す。at_hotelがtrueの場合、上の方の文字列、ホテルアンプローズのe-mailアドレスが返される。else キーワードは、if が失敗する場合に実行されるコードを示している。at_hotelがfalseの場合、ifは私が修行しているドクター・N・ハワード・チャムのオフィスのe-mailアドレスを返す。

ifunlessの間にコードが何行かある場合、最後のステートメントの答えが使われる

 email = if at_hotel
           address = "why" 
           address << "@hotelambrose" 
           address << ".com" 
         end

このif文は中に3行のコードがある。最初の行は変数に私の名前の文字列を代入している。2番目と3番目の行は、私のe-mailアドレスの残りを文字列の末尾に追加している。二重の小なり<< は連接オペレータだ。連接というのは末尾に追加するという意味だ。

等価チェッカー==と同様、連接オペレータもメソッドだ。文字列の末尾に追加した後、連接オペレータはその文字列自体を返す。だから3行目のコードはaddress.<<( ".com" )と読め、これはaddressを返す。それをifemailへの代入文に渡す。

ここでの疑問はifが失敗したらどうするかということだ。上の例でat_hotelがfalseだったらどうなるのか? 何が返されるのか? emailには何も代入されないのだろうか?

そう、何も返されないのだ。その意味はつまり、nilが返されるということだ。そしてnilというのは時にとても有用な答えなのだ。

 print( if at_hotel.nil?
          "彼がホテルにいるかどうかわからない。" 
        elsif at_hotel == true
          "間違いなくホテルにいる。" 
        elsif at_hotel == false
          "彼は外に出ている。" 
        else
          "システムはフリーズしている。" 
        end )

Rubyのどんな値に対してもnil?メソッドは使うことができる。これもまたメッセージだと思うことにしよう。値に対して、「君はnil? 君は空なの?」と聞くのだ。

at_hotelが空の場合、Rubyは私がホテルにいるのかどうか全然わからない。だからifは「わからない」という答えを返す。truefalseかという可能性を扱うためにelsifキーワードが使われている。ifelseは1つずつしか入れられないが、その間にいくらでもelsifキーワードを入れることができる。それぞれのelsifは、追加のifテストとして働く。正電荷をチェックするのだ。

ここまでOKなら、この本の残りを読むのに十分な準備ができているということだ。最後のいくつかの例ではかなりタフなコードを見てきた。君は強いやつだよ。

3. 妄想をつなぎ合わせる

55,000 starmonkeys and one spirited Olympic hopeful.

「すんません、この55,000匹の星顔のサルの製造を命じたのってあなたですか?」
「そうだ・・・えーと・・・」

「今オーブンから出てきたとこです」
「すばらしい・・・えーと・・・君は誰?」

「うっかりしました。俺はオリンピックで有望な アンドルー・メタイリです。あなたの新しい有能な製造アシスタントです」
「うーん・・・じゃ、とりあえず・・・スナックカウンタへ棒高跳びで飛んでいって、チェリーパイを取ってきてもらえるかな?」

上のコミックを読み終えたあなたは、寝台兼用の長いすに休んで熟考する。それはあの天蓋付きのやつで、枕がいくつも積まれている。その山の上に座り、世界を見渡す。高い煙突が、煙ともやの幅広い筋をはき出している。ちらちら光る交通をまき散らした縺れたフリーウェイは、あなたの見晴らしのいい場所からは穏やかに脈動する目の筋肉のように見える。

すべてがとても素晴らしい。風景に拡がる地平の色は、バターと脂とテーブルスプーン一杯のバニラエッセンスを混ぜたかのようだ。

そんな美しいものがあなたの注意を引きつけようとするかもしれないが、エルフとオリンピックで有望な選手のイメージが戻ってくる。特にあの55,000匹のスターモンキーの 製造を命じたことだ。55,000匹のスターモンキーだって? とあなたは考える。55,000匹だぞ

あなたはただ数字のことだけを考えている。55,000。それが道を歩いていく。それは森の中 かもしれないが、数字だけを目で追っているあなたにはよくわからない。それは立ち止まり、人々と話す。テニスプレーヤー や、男声合唱隊と。そこには陽気さと、いいフィーリングがある。それが笑うときには、後ろの方のゼロが笑みにふるえる。

あなたはそれと話したいと思う。森の小道をそれといっしょにスキップしたいと思う。それとブラジル行きのジェット機に乗り込みたいと思う。そして5日4晩のんびりしたコスタ・ド・サウイーペ・マリオット・リゾート&スパで 過ごした後、それと結婚し、55,000匹のスターモンキーの家族を持つ。それと一緒にナイジェリアを手に入れるのだ。

あなたは ひとっ飛びに孤高の枕の山から飛び降りる。鍵をひったくり、ロールトップデスクの鍵を開け、一枚の紙を取り出し、それを机の上にしっかり押さえると、書き殴りはじめる。

新しい55,000匹のスターモンキーでナイジェリアを支配する・・・
そのあと、ナイジェリアサイズのベジタリアン専用のカジノとゴーカートアリーナを作る・・・
羽・・・羽に独自の特別ソースをつけたら何か違ったものになるかも・・・
マスタード + コデイン = スモッチキスの星空のスターモンキー・輝くソース・・・
フランチャイズ、フランチャイズ・・・ロゴ・・・
従業員教育ビデオ・・・
顧客に釣りを渡すときには、手の甲のカエルの中に手を入れて取らせること・・・
釣りがない場合でも、レシートをどこか彼らがカエルに触らざるを得ない所に置くこと・・・
競技場を整地しているところだ・・・
安いピザを宣伝し、ソーダで金を儲けるのだ・・・
凍ったグラスを4つ全部集めよう・・・

ワオ、アイデアがほんとにあふれてくる。止めようと思ったら文字通り自分をひっぱたいてやる必要があるだろう。これをどこか安全な場所にしまっておく必要がある。実際、これをあなたのコンピュータに格納して、言葉をごちゃごちゃにし とかなきゃいけない。窓の外を見てFBIがいないか確認してくれ。私の方はスクリプトに取りかかるから。

ひっくり返すスクリプト
 

 print "何か極悪非道なことを入力して: " 
 idea_backwards = gets.reverse

このスクリプトをあなたが秘密を打ち明ける相手にしよう。これは悪巧みを聞き、文字を逆順にする。getsRubyの組み込みのメソッドだ。printと同じようにカーネルメソッドだ。このメソッドはRubyを一端止めて、あなたに入力を促す。あなたがEnterキーを押すと、getsはその あとのキーボード入力は無視してあたなが入力した文字列をRubyに返す。

そうするとgetsの返してきた文字列に対してreverseメソッドが適用される。reverseメソッドはStringクラスの一部だ。それはつまり、文字列であるものには何でもreverseメソッドが使えると いうことだ。次の章でクラスについてもっと詳しい話をするが、今のところは、多くのメソッドは特定のタイプの値に対してしか使えないということを知っていればいい。

しかしreverseだけでうまくごまかせるとは思えない。当局はただ“airegiN fo noissessop ekaT”(るす配支をアリェジイナ)を鏡を使って読めば済む。スターモンキーがラゴスに到着したところで、私たちは逮捕されてしまうだろう。

大文字のところでばれそうだ。だから文字列を逆にする前に文字を全部大文字にしてしまうといいかもしれない。

 idea_backwards = gets.upcase.reverse

あなたのくどさが報われる

あなたは読みにくい走り書きのされたリーガルパッドを私に渡す。私はそれに目を通していて、あるパターンに気付く。あなたは物思いの中でひと組の同じ言葉を繰り返し使っているように見える。たとえばスターモンキーとか、ナイジェリアとか、火炎瓶とか。繰り返し現れるフレーズというのさえある。 「とどめをさす」というのは何度も出てくる。

こういうやばい言葉は誤魔化すことにしようぜ、兄弟。私たちの精巧な計画をあばき、私たちがすごい楽しみとたくさんのゴーカートを享受するのを妨げようと待ちかまえている目から隠すのだ。私たちはこれらの言葉をもっとも罪のなさそうな言葉に 置き換える。秘密の意味を持った新しい言葉だ。

私はRubyのHashのワードリストを用意して、それにあなたの良く 使う危険な言葉を入れておこう。このハッシュによってそれぞれの危険な言葉が、コードワード(ないしはフレーズ)へと対応づけられる。コードワードによって本当の言葉 が入れ替えられるのだ。

 code_words = {
   'スターモンキー' => '新帝国の神経質な閣僚のフィルとピート', 
   'カタパルト' => 'chuckyゴーゴー', '火炎瓶' => '暖房つきのリビング', 
   'ナイジェリア' => "Ny and Jerry'sドライクリーニング(ドーナッツ付き)",
   'とどめをさす' => 'コンセントをさす'
 }

矢印の前に置かれた語はキーと呼ばれる。矢印の後にある言葉、定義の方は、しばしば単にと呼ばれる。

Ny and Jerry'sドライクリーニング(ドーナッツ付き)のまわりにある二重引用符に注意してほしい。一重引用符はアポストロフィとして使われているので、文字列を囲うのに一重引用符が使えないのだ。(アポストロフィの前にバックスラッシュを入れれば、 一重引用符を使うことができる。こういう具合に: 'Ny and Jerry\'sドライクリーニング(ドーナッツ付き)')

特定の語をルックアップするには、角カッコメソッドが使える。

code_words['カタパルト'] に対しては文字列'chuckyゴーゴー'が返ってくる。

角カッコを、言葉が載せられた木の荷台と思うといい。フォークリフトが角を荷台の両脇に滑り込ませ、棚から下ろして倉庫に持っていく。荷台に載っている言葉はインデックスと呼ばれる。私たちはフォークリフトにインデックスを見つけて、対応する値を持ってきてくれるように頼んでいるのだ。

あなたが倉庫を見たことがないなら、あなたは角カッコをハンドルだと思ってもいい。作業手袋をつけた熱心な作業者が、インデックスを取り上げ、あなたの荷物を取りに行く。あなたがハンドルを使ったことがないなら、30秒あげるから、ハンドルを見つけてきて使ってみなさい。私が怒りはじめる前に。

最近あなたが目にした他のオペレータ同様、インデックスの角カッコはメソッドの略記法になっている。

code_words.[]( 'カタパルト' )は文字列'chuckyゴーゴー'を返す。

入れ替えを実行する

私は先回りしてコードワードのハッシュをwordlist.rbというファイルに保存しておいた。

 require 'wordlist'

 # 邪悪なアイデアを取ってコードワードと入れ替える 
 print "新しいアイデアを入力してください: " 
 idea = gets
 code_words.each do |real, code| 
   idea.gsub!( real, code )
 end

 # 暗号文を新しいファイルに保存する
 print "ファイルはエンコードされました。このアイデアの名前を入力してください: " 
 idea_name = gets.strip
 File::open( "アイデア-" + idea_name + ".txt", "w" ) do |f|
   f << idea
 end

(訳注: code_wordsを別なファイルで定義するなら、$をつけてグローバルに変えるか何かする必要がある。)

スクリプトはワードリストを読み込むところから始まる。getsprintと同様にrequireメソッド もカーネルメソッドだ。これはどこでも使うことができる。私はこのメソッドに'wordlist'を渡しており、そうするとそれはwordlist.rbという名前のファイルを探す。

そのあとに2つのセクションが続いている。私はこれらのセクションを#記号で始まるコメントで印をつけた。コメントというのはコードに付けておく有用なメモだ。あなたのコードを見る人はそのヒントをありがたく思うだろう。しばらく時間が経ったあとに自分のコードを見る場合にも、コメントは思い出すための役に立つだろう。それにコメントからドキュメントを生成するソフトウェア というのもある。(RDocとRiだ——拡張パックNo1を見て!)

私がコメントを好きなのは、大きなコードの山をざっと見て、重要なところを見つけられるからだ。

コメントが教えてくれているように、最初のセクションではユーザから邪悪なアイデアを聞いて、コードワードへの置き換えをする。2番目のセクションではエンコードされたアイデアを新しいテキストファイルに保存 する。

 code_words.each do |real, code| 
   idea.gsub!( real, code )
 end

eachはわかる? eachメソッドはRubyのいたる所に現われる。これは配列、ハッシュ、それに文字列にも使える。私たちのcode_words辞書はハッシュに保持されている。このeachメソッドは、危険な語をコードワードに対応づけているハッシュのすべてのペアを急いでたどっていき、gsub!メソッドにそれぞれのペアを渡して置換をさせる。

Rubyではgsubglobal substitutionを意味する。このメソッドは検索して置換するのに使われる。ここでは、出現するすべての危険な言葉を、対応する安全なコードワードに置き換えたい。gsubには最初の引数で探す言葉を2番目の引数で入れ替える言葉を指定する。

どうしてgsubの答えを取っておかないのか? gsubは私たちが取っておくべき答えを返さないのか? あなたはこの行を次のような意味と考えたかもしれない。

 safe_idea = idea.gsub( real, code )
( 安全なアイデア = アイデア . gsub( real, code ) ) 

その通りだ。gsubでは答えをつかまえておく必要がある。私たちはgsubの変種を使っており、これはまったくすごいのだ。eachブロックの中で使われているgsub!感嘆符に注意してほしい。この感嘆符はgsub!が少し ばかり狂信的 であることを示している。gsub!ideaの中の言葉を直接置換するのだ。それが済んだときにはideaは新しい置換済みの文字列 になっており、以前の文字列はなくなっている。

gsub!破壊的メソッドと呼ばれる。これは値を直接変えてしまう のだ。一方gsubの方は値をそのまま変えずにおき、変更された新しい文字列を答えとして返す。(だからgsub!は獲物に飛びかかるときに叫びをあげるのだ。 残酷な襲撃者!)

狂人のテキストファイル

ではエンコードされたアイデアをファイルに保存することにしよう。

 # 暗号文を新しいファイルに保存する
 print "ファイルはエンコードされました。このアイデアの名前を入力してください: " 
 idea_name = gets.strip
 File::open( 'アイデア-' + idea_name + '.txt', 'w' ) do |f|
   f << idea
 end

このセクションはアイデアにつける名前をユーザに聞くところから始まっている。この名前はアイデアを保存するときに使うファイル名を組み立てるところで使われる。

stripは文字列のメソッドだ。これは文字列の頭と尻についているスペースや空行をカットする。これにより文字列をタイプしたときのEnterが取り除かれる。たまたまスペースを余計に付けていた場合も取り除かれる。

アイデアに名前が付けられた後、新しい空のテキストファイルを開く。ファイル名は文字列をつなぎ合わせて作る。ユーザがタイプしたのが'マスタード-プラス-コデイン'なら、私たちの式は'アイデア-' + 'マスタード-プラス-コデイン' + '.txt'となる。Rubyはこれを1つの文字列につなぎ合わせる。'アイデア-マスタード-プラス-コデイン.txt' がファイル名になる。

新しいファイルを作るのにはFile::openを使っている。これまでにいくつかのカーネルメソッドを使ってきた。printメソッドに文字列を渡すと、それが画面に表示された。printのようなカーネルメソッドの秘密は、それが実際にはクラスメソッドだということだ。

Kernel::print( "55,000匹のスターモンキーが会釈する!" )

この意味することはなんだろうか? なぜそれが重要なのか? それはKernelがRubyの宇宙の中心だということだ。スクリプトのどこにいようと、いつでもKernelはあなたの側にいる。RubyのためにKernelと書いてやる必要すらない。Rubyは心得ていて、言われなくともKernelをチェックする。

多くのメソッドはprintgetsよりもっと特殊化されている。File::openを例に見てみよう。Rubyの作者のMatzは、ファイルを読み、名前を変更し、削除するたくさんのメソッドを 作ってくれた。それらはすべてFileクラスの中に整理されている。

File::read( "アイデア-マスタード-プラス-コデイン.txt" ) はあなたのアイデアファイルの中のテキストすべてを含んだ文字列を返す。

File::rename( "古いファイル.txt", "新しいファイル.txt" ) 古いファイル.txtをリネームする。

File::delete( "新しいファイル.txt" ) はファイルを削除する。

これらのFileメソッドはすべてRubyの中に組込まれている。全部Fileクラスと呼ばれるコンテナの中に格納されているのだ。だからカーネルメソッドを呼ぶときにはKernelとタイプしなく て良かったが、Fileクラスの方は自動的にはチェックされない。だから省略なしでメソッド名を書く必要がある。

 File::open( 'アイデア-' + idea_name + '.txt', 'w' ) do |f|
   f << idea
 end

File::openには2つの引数を渡している。最初のは開くファイルの名前だ。2番目のはファイルモードを含む文字列だ。ここでは'w'を使っているが、これは新しいファイルに書き込むという意味だ。(他のオプションとしては、ファイルから読む'r' と、ファイルの末尾に追加をする'a'がある。)

ファイルが書き込むために開かれ、そのファイルが変数fとして返される。それが滑り台でブロックの中に滑り降りてくる。ブロックの中でこのファイル への書き込みをしている。ブロックがendで閉じられると、ファイルもまた閉じられる。

ファイルに書き込むときに連接オペレータ<<を使っているのに注意して。そうすることができるのは、ファイルが文字列同様、<<というメソッドを持っているからだ。

落ち着いて、あなたのアイデアは捕捉されてない

今度はあなたのアイデアをオリジナルの言い回しに戻し、その素晴らしさを反芻できるようにしよう。

 require 'wordlist'

 # それぞれのアイデアを、言葉を元に戻した上で出力する
 Dir['アイデア-*.txt'].each do |file_name|
   idea = File.read( file_name )
   code_words.each do |real, code| 
     idea.gsub!( code, real )
   end
   puts idea
 end

今では、この例の大部分はわかるようになっていると思う。つまらない細部を説明して退屈させたりしないようにしよう。これがどう動くかを自分で理解 できるか試してごらん。

しかしここでは面白いクラスメソッドも使っている。Dir::[]メソッドは、ディレクトリ(「フォルダ」と呼ぶ人もいる)を探す。ハッシュで見た のと同じように、インデックスの角カッコはクラスメソッドだ。(Rubyの輝く、キラキラした素晴らしさを感じ始めたんじゃない?)

それで私たちはフォークリフトを使ってディレクトリの中の'アイデア-*.txt'にマッチするファイルを取ってきている。Dir::[]メソッドでは、アスタリスクをワイルドカードとして使える。これは基本的には「アイデア-で始まり、.txtで終わるものすべてにマッチ する」ということだ。フォークリフトはディレクトリへと降りていって、マッチするファイルのリストを持って帰ってくる。

ファイルのリストは芋虫のArrayの形になっていて、それぞれのファイルに対応するStringが入っている。興味があってDir::[]で遊んでみたいというなら、これを試してみるといい:

p Dir['アイデア-*.txt'] の表示はこうなる:

['アイデア-マスタード-プラス-コデイン.txt'] (ファイル名の配列だ!)

(訳注: エンコードを指定しないと日本語のファイル名は文字コードで表示される。日本語で表示されるようにするには、Windowsであれば-Ksオプション付きでruby/irbを実行する。)

pメソッドはprintのように働く。printは文字列を表示するようにデザインされているのに対し、pの方は何でも表示する。これを試してみて。

p File::methods の表示はこうなる:

["send", "display", "name", "exist?", "split", ... すべてのメソッド名のリストだ! ]

4. ブロックの奇跡

Flowerboyz?  Heard it before.

「もしもし、スナッチャム花店ですか? ええ、小さくて上品なブーケを注文したいんですが、しかし最初に・・・最初に・・・」

「お宅のフラワーボーイがみんな溶岩流に閉じこめられたって・・・えっ! 前にも電話したことがあるんじゃないかって?・・・ いやー・・・」

「電話を他の人とかわってもらうことってできますか?」

あなたと私はこの時をともに過ごすうちに親しい友達になったので、私はたぶんここで起きてきたことについて少し説明すべきだろうと思う。一休みするのにちょうどいい頃合だ 。

最初にブリクスが私の猫だということを言っておくべきだろう。ビゲローの次の私のペットだ。私たちはもはや互いにほとんど会うことがなくなった。彼は完全に自立している。最近では彼がどこで暮らしているのかもよくわからない。私の家の控えの間ではもはや暮らしていないのは確かだ。彼は預金口座を7ヶ月ほど前に空にしていた。

彼は家と車の鍵を1セット持っている。彼が途方にくれたなら、私は喜んで私たちの間にある違いには一歩譲り、彼が私の家でまた気まぐれな様子を見せるのを楽しむつもりだ。

間違わないでほしいのだが、私は彼が身近にいないことを寂しく思っている。彼が私の不在を寂しく思っているとは想像しにくいが、私は寂しく思っている。

サイレンと祈り

私が最初にブリクスを見たのは、子供の頃、テレビでだった。彼は「サイレンと祈り」というすごく骨のある刑事ドラマに出演していた。この番組は信心深い警官 たちが仕事をし、いい仕事をし、奇跡を見るという内容だった。つまり、番組に出てくる警官はすごい男たちで、信心深く、事実上聖職者だった。聖職者 は行き過ぎた男を殺す良識を持たないが、この男たちはどこに線を引けばいいのかわかっていた。彼らは毎日その線の上を歩いていたのだ。

だからこの番組はすごく血なまぐさいものだった。しかし彼らはいつも最後にはいい教訓をつかんでいた。多くの場合、その教訓は「ワオ、俺たちはあいつを早く挙げたよな」みたいなことだった。しかしそのような発言には深い友愛があった。

番組は基本的に1人の警官を中心に展開していた。"マッド"・ディック・ロビンソンだ。みんな彼をマッドと呼んでいたが、それは彼が基本的にまともじゃなかったからだ。私は彼が実際医学的に精神異常だったのか 覚えていないが、みんないつも彼の判断には疑問を呈していた。マッドはしばしばカンカンに怒り、他の警官を叱りつけたが、そのほとんどは申し分のない人格の人だった。しかし 私たちはみんな、そこがタフな世界であり、責任が重いのだと知っており、番組を見ている人はみんなマッドのことを高く買っていた。私は警官たちみんながマッドの情熱のおかげで人としてとても成長したと思う。

しかし警官たちはすべて自分たちで解決することはできなかった。それぞれの話で、彼らはより大きな力の助けを求めた。そしてそれぞれの話で、彼らは(ブリクス演じる)テリーという名の猫から情報をもらっていた。彼は当時はまだ子猫で、「サイレンと祈り」 を見る少年だった私は、犯罪を嗅ぎつける猫が 自分もほしいと思った。テリーは男たちを地下鉄のトンネルへと導き、見捨てられたマリーナの悪臭を通り抜け、 高い煙突の工場の裏口に入っていった。

ブリクスは 時に話の間中出ていて、駆け回り、罠を仕掛け、交通整理した。しかし他の時には、話の間中全然顔を出さなかった。番組を巻き戻し、何度も何度も何度も見直して、それからあきらめる。彼はその話に出ていない のだ。

それでも、そのまま放っておくことが耐えられず、リモコンを操作して話の全体を綿密にチェックし、それぞれのシーンを詳しく見ていく。そして彼を見つける。 ずっと高いところ、あまりに高いところにある投光照明の背後にいる。マッドの視力に恒久的なダメージを与えたやつだ。なぜ? なぜ自分の同僚の網膜を焼いたりしたんだ、テリー?

しかしシリーズが中断されたため、この疑問が答えられることはなかった。彼らは猫で特殊効果をやり始め、そして失敗に終わったのだ。番組の最後の話で、テリーがクレーンの先に捕らえられ、鉄精錬所の炉の燃えたぎるスラグの中に落とされようとする瞬間がある。彼は振り返る。後はない。下を見る。前足で目を覆 い(冗談でなく!)、クレーンから飛び、空中でロープをつかみ、揺すぶって安全な場所へ、やわらかいアンテロープの革の上へと着地する。どうやら工員の誰かがその午後になめしていたものらしい。

そのシーンが放映された瞬間にみんなテレビのスイッチを切った。彼らは番組の名前を変えようとした。最初のは「神は我らに分隊を与えたもう」、それから「痛みのキス」、それから「 メーンの痛みのキス」。これは管轄がメーンに移転されたためだ。しかし魔法は去ってしまった。私はその年いくつかのクラスの補習をするためサマースクールに行ったが、子どもたちの話題はみんなフットボール鉛筆に変わっていた。

ブロック

2年ほど前、私はブリクスにRubyを教えはじめた。私たちがブロックを扱うパートまで来たとき、ブリクスが私に言った。「ブロックはマッド・ディック・ロビンソンを思い出させる」

「そう?」その名前を聞くのは久しぶりだった。「どうしてなのかわからないけど」

「ブロックは理解するのが難しいかもしれないと言ったよね」

「別に難しくはないよ」と私は言った。「ブロックは単にひとまとめにされたコードというだけのものだ」

「マッドはただの警官で、自分の義務に従っていただけだ」とブリクスは言った。「しかし彼を現場で見ていると本当の奇跡だった。君が見せてくれた最初の例だけど・・・」 彼は私が彼のために書いた例を指さした。

 kitty_toys =
   [:shape => '靴下', :fabric => 'カシミア'] +
   [:shape => 'ネズミ', :fabric => 'キャリコ'] +
   [:shape => '春巻', :fabric => 'シェニール']
 kitty_toys.sort_by { |toy| toy[:fabric] }

「これはちょっとした奇跡だ」と彼は言った。「僕はこの美を否定することができない。見て、僕の子猫のおもちゃがあって、その性質が添えてある。その下には ブロックがあって、素材(fabric)でソートしている」

「おもちゃのリストが少し分かりにくかったのならごめんなさい」と私は言った。ブリクスはあなた方と同じように配列については学んでいた。コードにホッチキスで留められた芋虫だ。両端に角カッコがあり、それぞれの要素がカンマで区切られている(1つ例を挙げると、['靴下', 'ネズミ', '春巻'])。彼はまたハッシュについても習っていた。これは辞書みたいなもので、小さな開いた本のように見える中括弧が両端にあ る。ハッシュの中のそれぞれのペアをカンマが区切っている。辞書のそれぞれの語は、矢印でその定義と対応づけられている({'ブリクス' => '', 'ホワイ' => ''})。

「うん、まごつくね」と彼は言った。「これは配列みたいな角カッコがあるけど、ハッシュのような矢印もある。うまく行かない気がする」

「少し破壊的に見えるかもしれないね」 私は彼をスプーンでつつきながら言った。「私は君のおもちゃのリストに2つを混ぜて使った。近道したんだ。配列の中で矢印を使うと、配列の中にハッシュがあることになるんだ」

「ああ、なるほど」と彼は言った。「クロスワードしたんだ。うまいね!」

「ああ、分かったみたいだね」と私は言った。ブリクスは分度器を使うのもうまかった。「3つの配列にはそれぞれ中にハッシュが入っている。+記号に気づいた?  つなげて1つの大きな配列にしているんだ。こういう書き方もできる…」。私は手早く書いた。

 kitty_toys = [
   {:shape => '靴下', :fabric => 'カシミア'},
   {:shape => 'ネズミ', :fabric => 'キャリコ'},
   {:shape => '春巻', :fabric => 'シェニール'}
 ]

1つの配列、かじるおもちゃのリストだ。配列の中の3つのハッシュが、それぞれのおもちゃを記述している。

命を救うためにソートとイテレートをする

「今度はおもちゃを形(shape)でソートしてみよう」と私は言った。「それからその順でプリントすることにしよう」

 kitty_toys.sort_by { |toy| toy[:shape] }.each do |toy|
   puts "ブリクシーは#{ toy[:fabric] }でできた#{ toy[:shape] }を持っている" 
 end

sort_byはどう動くの?」とブリクスが聞いた。「それが配列に対して使えるメソッドだということは分かる よ。kitty_toysは配列だからね。だけどtoyって何?」

「ああ、toyブロック引数だ」と私は言った。「toyの両端にある細いパイプが滑り台になっているのを思い出して」

「うん、だけど君はそれをハッシュのように使っているみたいだ。ブロックの中にtoy[:shape]というのが出てくる。これはハッシュみたいだ」

sort_byメソッドはイテレータなんだ、ブリクス。これは何かのリストをイテレート、ないしは循環するものだ。あのエピソードを覚えているかな? マッドが・・・」

「エピソード?」と彼は言った。そう、彼はテレビドラマというコンセプトが理解できないのだ。それで私は説明しようと努めた。

「ああ、目撃者の話で、マッドが狂ったスペリング競争の参加者を大学図書館の窓の出っ張りから降りてくるように説得したやつだよ」

「君よりも良く覚えているよ。僕はそのときリモコン飛行機に乗っていたんだから」。ああ、確かにそのエピソードだ。

「マッドがそのときどうやって降りて来させたか覚えている?」と私は聞いた。

「スペリング競争の参加者は文字が好きだ」どブリクス。「だからマッドはここでうまい手を使った。彼は文字Aからはじめて、アルファベットの文字のそれぞれを使って、その男がビルから安全に地上に降りてくるべき理由を説明したんだ」

「AはビルのArchitectureだ」とマッドのしわがれ声で私は言った。「それはこのばらばらな世界の中にあって我々に希望を与えてくれる」

「BはBig Guysだ。君の友達の警官マッドみたいな」とブリクス。「男たちはいつも人々を助けていて、スペリングはあまりできないが、それでもスペリングがすごく良くできる人たちを助けている 」

「彼は文字を1つずつ順に、ずっと続けていった。彼はアルファベットをイテレートしていたんだ」。イ・テ・レー・トだ。

「だけどその男は結局飛び降りたんだよ、ホワイ。彼はQか、そのあたりで飛び降りたんだ」

「QはQuiet Momentsで、心を落ち着かせ、あらゆる人生の小さな喜びについて考えさせてくれる。そして私たちは大きな悪いビルの縁を爪先立ちで怒って歩き回ったりしなくなる」

「それから彼は飛び降りた」とブリクス。彼は頭を振って「マッドを悪く言うことはできない。彼は最善を尽くしたんだから」

「彼が大きな心を持っていたのは確かだね」と私はブリクスの肩をたたきながら言った。

 kitty_toys.sort_by { |toy| toy[:shape] }.each do |toy|
   puts "ブリクシー#{ toy[:fabric] }でできた#{ toy[:shape] }を持っている" 
 end

sort_byはリストの頭からはじめて、それぞれの項目を一度に1つずつたどっていく。だからtoyにはその項目の1つが入る。それぞれの項目について、sort_byは立ち止まり、そのアイテムをtoyという名前で滑り台から落とす。するとどうなるか考えてみて」

「いいよ。つまりtoyには僕のおもちゃが交替で入るんだ」

「その通り」と私は答えた。「メソッドが返してきた答えを使うことの力を私はいつも強調してきたよね? ほら、ここではブロックの中で、ただおもちゃの形(:shape)を見ている。するとブロックはsort_byに対して"ねずみ"とか"靴下"といったおもちゃの形を表す文字列で答える。リストをすべて巡回し終わったら、sort_byはそれぞれの形の文字列を アルファベット順で比較して、新しいソートされた配列を返す」

終わらなかったレッスン

「今日はもう十分だよ」とブリクスが言った。「新鮮なミルクをお皿に一杯もらえるかな?」

私は彼の皿をなみなみと満たし、彼はしばらくがぶがぶと飲んでいた。その間私は暖炉の石炭を火かき棒でつついていた。私の心はさまよい、ブロックの先のことを考えずにはいられなかった。ブリクスに次は何を教えようか。

彼にnextについて教えるといいかもしれない。リストをたどっているとき、スキップして次のアイテムに進むのにnextが使える。このコードでは、形が春巻でないおもちゃを数えるのにnextによるスキップを使っている。

 non_eggroll = 0
 kitty_toys.each do |toy|
   next if toy[:shape] == '春巻'
   non_eggroll = non_eggroll + 1
 end

私はまたbreakについて教えたらいいかもしれない。これは繰り返しループの中から放り出すのに使う。下のコードでは、素材がシェニールのおもちゃに行き当たるまで、おもちゃを1つひとつ(pを使って)プリントしている。breakによってeachは突如として終わる。

 kitty_toys.each do |toy|
   break if toy[:fabric] == 'シェニール'
   p toy
 end

私がこういったことをブリクスに教える機会はなかった。私は暖炉の鉄柵についた頑固な石炭をつつき続けていて、アンテロープ皮のラグの上に落としそうになった。

私が黒い石をひどく刻んでいる間に、ブリクスはいなくなった。あるいは動物経済の活気ある中心地であるウィグズル行きのバスに乗ったのかもしれない。ひょっとすると途中のアンブローズかリアスナかどこかの村で降りたのかもしれない。私の直感では、ウィグズルが彼の最終的な目的地だという気がする。

指導し、導いていく生徒がいなくなり、私は孤独で家に引きこもっている自分に気が付いた。がらんとした廊下の静寂の中で、私は自伝としてこのガイドを書き始めた。

私は退屈したときはいつもこれを書いていた。そして退屈でないときには、いつも「ファントムメナス」をつければ、書く気になることができた。

Someone let them all out.

「ダム ダラ ダム! スターモンキーを受け取りに来たぞ」
「行ってしまったよ。君のペットのハムが逃がしたんだ」

「そんなはずない! ハムはずっと私と一緒にいたんだ」
「さあね、きっと嫉妬したんだろう。さあ、どいてくれ。テレビで
殺戮を見てるとこなんだ」
「殺戮?」

「ごらんになっている場面は、スターモンキーがミニバンを走らせているところです・・・港に向かっているようです・・・実際・・・」
「あいつには体中に円盤が書かれてるぞ」

 

 ページをめくる。