<a href="http://blade.nagaokaut.ac.jp/ruby/ruby-list/thr42416-42472.html#42454">ファイルを全部読み込んでから処理するか、一行ずつ読ませるか</a>

ruby-listで、最初は複数の正規表現を使って、どの表現にどのデータがマッチしたか区別しながら処理するにはどうしたら…みたいな話題が、途中から、でっかいファイルを逐行処理させる方法、という話に重点が移っていった。今まさにそういうコードを何度も何度も書いているので、かなり興味深く読んでいる。いろんなやり方があるのね。個人的には、

  • 小さなファイルはIO.readlines.each
  • 大きなファイルはfile=File.newしてからfile.each_line

と分けている。メモリにあまり負担をかけたくないという気持ちがあるので。なにしろたくさんの人間が同時に使っているサーバだからなあ…。とか貧乏臭いことを気にしているのです。どっちみちブロックになるから、処理の中身、書き方は一緒というか。気分が変わればイテレータを書き直すだけだし。いい加減だな俺。
ていうか、IO.foreachなんてものがあるんですか!知らなかったよ!closeをensureしてくれるとわ!いいねこれ!早速いま書いてるコードを見直そう!

ちょっと違うな

上の使い分けはちょっと良くないなあ。

  • IO.readlinesは後で全体を(何か加工したにしても全体の結果を)後でまた使いたいとき
  • IO.foreachは全体を使って一度だけ何かをやり、ファイルの内容自体は使い捨てにしたいとき

という風に使い分けるのかな、と、漠然と思った。

裏紙メモのすすめ

最近、A4ミスプリントの裏紙を4等分してA6サイズにしてクリップでまとめ、メモ用紙として愛用している。そんなものを使うことによって得られるメリットを簡単にまとめておく。これを読んで興味を持った方は、ぜひまねしてみてください。

持ち歩きが楽

小さいから。100枚くらい持ち歩いても負担にならない。A4サイズの1/4の重量(わら

たくさん書けない

これはデメリットのように見えてそうではない。たくさん書けると、情報量が多すぎたり、きれいに図とか表とか書いちゃったりして、捨てられないで手元に溜まるメモが増える。メモ用紙はそもそも整理に向いたデバイスではないため、溜まれば溜まるほど困る。困らないためにメモしたのに困るとはこれ如何に。
というわけで、メモ用紙は小さくしておくことが重要。

捨てやすい

裏紙利用なので基本的にはコストがかかっていない。そのため、市販のきれいなメモ用紙に比べて、捨てることに躊躇がいらない。ビリビリと細かく(2〜3回?)やぶいてごみ箱へポイするだけなので、手間もかからない。

組み換えやすい

裏紙なのでたくさん使って1枚ずつに大きな字を書き、順番を入れ換えたりできる。小さいとハンドリングもしやすい。この効果は意外に大きい。A4サイズの紙の順番を入れ換えるのと、A6サイズの紙の順番を入れ換えるのはどっちが楽か?
しかし小さすぎてもいけない。トランプは小さすぎるとシャッフルしづらい。ワタシの手のサイズではA6がちょうどいいみたい。

レビュー必至、ノートではダメな理由

小さいのですぐに溜まってしまう。先に述べたように溜めるとろくなことにならないので、さっさとどこかに書き写さなければならない。まあ今の世の中、メモはまとめてパソコンに入力するのがよかろう。入力するときに必ずメモを見て、その内容をレビューして、適切な保存先を検討することになる。
これが普通のA5サイズのノートとかだと、「とりあえずそこに情報が置いてある」ということと、ハンドリングが容易であることから、書いたらそのままになってしまって後で「どこに書いたっけ?見つからないよ!ウキー!」、ということになる。
メモした内容はレビューすべし。これ鉄則。

ノートPCやPDAや携帯電話ではだめな理由

ノートPCは広げるのにどうしても場所を選ぶ。ひざの上とか、机の上とか、安定してキーボードを叩ける場所が必要なのだ。しかも立ち上げに時間がかかり、ちょっと書きたいだけなのに、それに要する時間がバカにならない。
PDAや携帯電話もあまり良くない。立ち上げは早いが、こんどは入力デバイスが貧弱であり(あの小さいキーボード!あのばかげた携帯電話の入力メソッド!)入力すること自体に時間がかかる。携帯電話でメールを書くことに生活時間の多くを割くことになっている理由を、そろそろ日本の若者は気づくべきだ。
メモ用紙なら、ある程度の枚数をまとめておくことで、それ自体が下敷になり、安定して字を書くことができる。しかも後で捨てることが分かっているので、丁寧に書く必要がない。保存すべき内容を思い出せる最小限の内容にとどめることができて、ささっと書けて、メモする作業が早く済むのだ。
ローマ帝国の崩壊・一八八一年のインディアン蜂起・ヒットラーのポーランド侵入・そして強風世界」
と書くのに、それぞれのデバイスでどのくらいの時間がかかるか、考えてみてほしい。

その他ダメ押し

必要なものは紙と鉛筆(個人的には間違えたときに消しゴムとか迷わず、即書き直せるボールペンの方がお薦め)、バッテリーの心配がいらず、必要なものは随時供給できる(そのへんのコンビニで売っているもので急場をしのげる)、などなど、快適な裏紙メモ用紙ライフへ、あなたもようこそいらっしゃいませ!

制御構造はスコープを作らない

while や for がスコープを作らないのに対し、loop や each などのイテレータはスコープを作ります。

な、なんですとー!コード見直さなきゃ!

重複したループを抜けるには、break ではなく catch/throw を使用します。

catch(:last) {
  while true
    (1..5).each{|x|
      throw :last if x == 3
      print "#{x}\n"
    }
  end
}

参考になる +1…まあそもそも、ネストするループから抜けないといけないというコードの構造に問題がありそうな気もするけど。