Hatena::ブログ(Diary)

[・ _ゝ・]日記を書くはやみずさん このページをアンテナに追加

インフォメーション

公開書架

読み終わったり、近いうちに読む予定がない本をいくつか。読みたい人には貸します。
神は沈黙せず〈上〉 神は沈黙せず〈下〉 Binary Hacks ―ハッカー秘伝のテクニック100選 Ruby on Rails入門―優しいRailsの育て方 The Art of Computer Programming Volume1 Fundamental Algorithms Third Edition 日本語版 プログラミングRuby 第2版 言語編 ふつうのHaskellプログラミング ふつうのプログラマのための関数型言語入門 はじめて読む486―32ビットコンピュータをやさしく語る Subversion実践入門〓達人プログラマに学ぶバージョン管理 ハッカーと画家 コンピュータ時代の創造者たち

計算論の展開をSchemeで → インデックスページ
いっぱい本を読みたい→ 読書マラソン
ついったー → Twitter / hayamizu

2007-06-10

[] 引き続き最適化

String.compare と = だとString.compareのほうが遅いので、同じ値が多い場合は = で比較してからcompareするようにしたら早くなるかな、と思ってコードを書く。すると早くなった!しかし、よくコードを見ていると意図しているアルゴリズムとは別のアルゴリズムを間違って実装していた。そこで意図しているアルゴリズムに改めて書き直したら遅くなった(´_`;) 間違ったほうの実装でどうして早くなるのかが全く謎。

[] 飯吹いた

オレオレマージソートの一部

  let rec merge_two ls1 ls2 ret =
    match ls1, ls2 with
      | x1 :: xs1, x2 :: xs2 ->
	  if (comp x1 x2) then
	    merge_two xs1 ls2 (x1 :: ret)
	  else
	    merge_two ls1 xs2 (x2 :: ret)
      | ls1, [] -> rev_append ls1 ret
      |	[], ls2 -> rev_append ls2 ret in
  let rec merge_two_rev ls1 ls2 ret =
    match ls1, ls2 with
      | x1 :: xs1, x2 :: xs2 ->
	  if (comp x2 x1) then
	    merge_two_rev xs1 ls2 (x1 :: ret)
	  else
	    merge_two_rev ls1 xs2 (x2 :: ret)
      | ls1, [] -> rev_append ls1 ret
      |	[], ls2 -> rev_append ls2 ret in

標準ライブラリの(マージ)ソートの一部

  let rec rev_merge l1 l2 accu =
    match l1, l2 with
    | [], l2 -> rev_append l2 accu
    | l1, [] -> rev_append l1 accu
    | h1::t1, h2::t2 ->
        if cmp h1 h2 <= 0
        then rev_merge t1 l2 (h1::accu)
        else rev_merge l1 t2 (h2::accu)
  in
  let rec rev_merge_rev l1 l2 accu =
    match l1, l2 with
    | [], l2 -> rev_append l2 accu
    | l1, [] -> rev_append l1 accu
    | h1::t1, h2::t2 ->
        if cmp h1 h2 > 0
        then rev_merge_rev t1 l2 (h1::accu)
        else rev_merge_rev l1 t2 (h2::accu)
  in

なんかまる写ししたみたいだ。

[] ちょっとだけ最適化

OCamlでひきつづきソーティング。camloptに-pオプションをつけるとgprofでネイティブコードのプロファイリングができるので試してみたら、全体の40%の時間がGC関係のコードに使われていた。リストをガンガン組み換えていく作業が、かなりのゴミを発生させている模様。こういう関数型的なメモリをじゃぶじゃぶ使ってゴミ捨て、みたいなのはやっぱり富豪的で、大量のデータのソーティングには不利に働く。

関数呼出し1回あたりメモリのアロケーションを少しでも減らせばそれなりに高速化できそうな気がする。

[] よくわからない夢

夢の中で、Ruiさんからお茶に塩を混ぜたらオレンジジュースの味がするのを教えてもらって飲んだ。更にお茶の量を増やすとクレープフルーツジュースの味になった。

2007-06-09

[] OCamlの罠

ソフトウェアの授業の課題のソーティングプログラムOCamlで書き始めてから、度重なるStack overflowに悩むこと1週間。ファイル読み込み時のstack overflowは普通に末尾再帰に書き直してうまくいったけど、2つのリストをマージする関数に2,000,000要素くらいのリストを渡すとどうやってもstack overflowになってしまう。末尾再帰の書き方を変えてもダメ。なんなんだー!と思ってocamloptでネイティブコンパイルしてobjdumpして自分自身をcallしていないか探すが見つからず。ふとcamlList__appendに目が停まる。というのも、"OCaml 末尾再帰"でググったときに"...するとなんとかして末尾再帰なappendが書ける..."みたいな文章を目にしていたから。これはもしや、と思ってOCamlマニュアル読んだら案の定appendは末尾再帰じゃなかった\(^O^)/結果返すときにappend使ってるから確実にstack overflowするようになってます本当に(ry

List.rev_append使ったら普通にStack overflowの問題解決。大きなデータのソーティングみたいなある種の極限状態では、組み込み関数を疑うことも重要ってことか。要はRead the F**king Manualということですね。

2007-06-08

よゆーがない

最近家に帰ったころにはへとへとどろどろの状態。mixiの人の日記とかみて思わずコメントしたくなっても頭の中に浮かんだ文章は、普通の人が読んだとうとう本格的に狂ったか、と思われるような感じになったりするのでコメントしないくらいでろでろの状態。

[] LANケーブルの使い方

ほげほげふがふがな経緯によって、普段からチョークバッグにLANケーブルを入れて常に携帯しているんだけど、いつも無線ばっかり使っていてなかなかケーブルを活用することがなかった。で、今日はじめて活用した。

食べかけのお菓子の袋に封をするために。

LANケーブルいいよLANケーブル。

[] なんとなく

math.runge-kutta とか作ろうかと思った。思っただけ。

2007-06-07

[] レポートが終わらない

とりあえず誘導電動機の勉強。理論だけならわかってしまえばわりと簡単だった。

xcircuitで回路図書きまくる。

2007-06-06

[] 日立製作所の見学

工学部電気系専攻の行事である工場見学が始まった。今日はバスに揺られて、東北地方と呼ばれて久しい茨城県日立製作所に行ってきた。

でかい

モーターとかジェレネーター(発電機)を作っている工場を見学させてもらった。内部は当然撮影禁止なのであの迫力を伝えられないので残念だけど、とにかく全部でかかった。スモールライトで小さくなった気分。モーターの大きさが、2階立てのアパートくらいあったり、重量200tのものを運べるリフトが天井を動いていたり。モーターの実験をした後で、若干モーターにはうんざりしていたけど、予想を超えたモーターの迫力にwktkしてしまった。1機あたりの値段を聞いてみたら、ピンキリだけど、まああの大きさならそのくらいはするよね、という感じの値段だった。

こういう半端じゃなく大きな規模でモノとかカネを動かすというのは、大企業じゃないとできない経験だろう。カッコイイ。

コイル

超伝導でソレノイドコイルを作って、強力な磁場を発生させているNMRの研究室にお邪魔する。14テスラの磁力線が体を貫く!*1。やってることはよくわからなかった。

いいひと

日立中の人はいい人ばかりだった。学生の相手なんて面倒な仕事なのに、とても丁重にもてなしていただいた。

ちなみに、日立中の人は大体ノートパソコンはLet's noteを使っているらしい。

*1ピップエレキバンの100倍の磁束密度

Connection: close