小田急小田原線徒歩 (後編)

最近中断気味でしたが、久々に歩きました。新松田駅から小田原駅まで。8 時前から 11 時過ぎまでの約 3 時間。線路の距離で 10.7 km 、歩きの距離で 14.2km 。

駅間距離は 2 km 程度になり、復帰戦としては気楽でした。見所とかは特になかったかな。
小田急はあと多摩線江ノ島線です。距離は合計で 38 km ですが、移動が必要だったり駅数多めだったりするので、あと一回で行けるか難しいところです。

伊豆箱根鉄道大雄山線徒歩

続けて、小田原駅から大雄山駅まで大雄山線を歩きました。12 時前から 15 時前まで約 3 時間。線路の距離で 9.6 km 、歩きの距離で 11.6 km 。

単線だけど電車が頻繁に走ってました。古い田舎な感じの駅が多いけど秘境というわけでは全然なかったです。
五百羅漢駅和田河原駅が普通のマンションだったのが印象的でした。徒歩 0 分。
富士フイルム前駅の前の自動販売機で、最近見なくなった気がするなっちゃんを見かけました。買ってみたら賞味期限が 08 年 05 月でした。危ない。

exhaustive な switch

OCaml ではパターンマッチの抜けを警告してくれます。Haskell より OCaml の方が好きな点の 1 つです*1

type t = Foo | Bar | Baz
let f = function Foo -> "foo" | Bar -> "bar"
$ ocamlc pat-test.ml
File "pat-test.ml", line 2, characters 8-44:
Warning P: this pattern-matching is not exhaustive.
Here is an example of a value that is not matched:
Baz

今日気がついたのですが、gcc でも enum に対して同様のチェックをしてくれるようです。

enum t { foo, bar, baz };
char *f(enum t x) {
  switch(x) {
    case foo: return "foo";
    case bar: return "bar";
  }
  return NULL;
}
$ gcc -Wall -c pat-test.c
t.c: In function 'f':
t.c:6: warning: enumeration value 'baz' not handled in switch

ふーんと思った。それだけ。


追記: はてなブックマークより

sshi ghcでも-Wつけるとパターンマッチの抜けを警告してもらえるよ

おお知らなんだ。ありがとうございます。

module PatTest where
data Hoge = Foo | Bar | Baz

f Foo = "foo"
f Bar = "bar"
$ ghc -W -c -o pat-test.o pat-test.hs

pat-test.hs:4:0:
    Warning: Pattern match(es) are non-exhaustive
             In the definition of `f': Patterns not matched: Baz

これがデフォルトでオフなのは、Haskell では (ガードに加えて) non-exhaustive なマッチを意図的に書くことが多いからでしょうかね。無限リストとか。
OCaml でもそういう場合がないことはないけど、そういう場合はちゃんとマッチさせて assert false しようという風習がある気がする。

*1:ガードを使いまくる Haskell のスタイルに合わなさそうなのはわかるんだけど。

HDD がりがりプロセスを見つけたい

CPU より HDD が律速の時代です。マシンが重いとき、CPU を使いまくってるプロセスはタスクマネージャですぐに分かるんですが、HDD にアクセスしまくってるプロセスを簡単に見つける方法ってないでしょうか。タスクマネージャで不満なのは、読み・書き・その他の 3 種類があっていろいろ見ないといけないことと、通算回数/量が表示されているため目で差分を計算しないといけないこと。