ブログトップ 記事一覧 ログイン 無料ブログ開設

Hatena::Diary::pi8027

 

2010-03-10

MacBook Pro に Debian を入れると起動に失敗する話

色々な記事に書いてあるのと同様に grubインストールしようとする直前に Control+Option+F2 でコンソールを開き、refit,gptsync を入れてごにょごにょして、LILO を入れてみた所、起動時に以下のようなメッセージが出た。

PCI: Not using MMCONFIG.
PCI: BIOS Bug: MCFG area at f0000000 is not reserved in ACPI motherboard resources
PCI: Not using MMCONFIG.
PCI: Cannot allocate resource region 0 of device 0000:00:03.5
i8042.c: No controller found.
Kernel panic - not syncing: VFS: Unable to mount root fs on unknown-block(8,3)

もうそろそろ開発環境だけでも Debian に戻りたいのだけど、どうすればいいんだろう。

2010-03-01

PostScript によるコッホ曲線

PostScript でコッホ曲線を書くという不毛な事をしてみた。

%!PS-Adobe-2.0 EPSF-2.0

/nextpos {
    3 index 2 index add 2 div
    3 index 2 index sub 12 sqrt div sub
    4 index 3 index sub 12 sqrt div
    4 index 3 index add 2 div add
    mark 7 3 roll cleartomark
} def

/kochrec {
    1 index 0 eq {
        pop pop lineto pop pop
    } {
        6 copy exch pop { 4 2 roll } if nextpos
        7 index 7 index 3 index 3 index 7 index 1 sub 7 index not kochrec
        5 index 5 index 5 index 1 sub 5 index not kochrec
        mark 7 1 roll cleartomark
    } ifelse
} def

/koch {
    4 index 4 index moveto
    true kochrec
    stroke
} def

100 100 600 600 12 koch
  • f:id:pi8027:20100301220019p:image

2010-02-13

Haskell のコードで型推論が通るように"後で書く"を表現する方法

私はプログラムを書く時に、書きたい所から書くような傾向がある。すると、ソースコード中にはまだ書いていない部分というのが現れる。

その一方で、Haskell で書かれたプログラムというのは型推論を通す事である程度の妥当性検証ができる。Haskell では、この特性を生かす事で数倍楽にコードが書ける。

しかし、まだ書いていない部分を明示するために{-後で書く-}などといったコメントを残しておくと、型推論を通す事ができない。ではどうすればいいのか。

でまあ言われれば当然だとは思うのだけど、Haskell には標準ライブラリに undefined :: a という怪しい物があって、これでどんな型の値でも表現できる。因みに undefined を評価した場合は多くの処理系は例外を発生させます。但し型推論は通ります。便利ですね。

ただ、これだけだとちょっと不便な部分もあって、エディタで undefined を検索してまだ書いていない部分を探そうとした時に、書き換える必要の無い undefined があるかもしれない。別の名前を割り当てておくとか、別の例外を返すようにするとかが有効な対策だと思うのだが私はやっていない。

2010-02-05

Haskell でエラトステネスの篩

以下の方法が定番の方法である。

sieve (x:xs) = x : sieve [y | y <- xs, y `mod` x /= 0]
primes = sieve [2..]

しかしこれはとても遅いらしい。

という事でなんか良い方法無いのかなぁと考えた結果、現時点での素数の積を持っておいて、最大公約数を取ってどうにかすると良いのかなぁという感じになった。

sieve n (x:xs) = case gcd n x of
    1 -> x:sieve (n*x) xs
    _ -> sieve n xs
primes = sieve 1 [2..]

いやーでも対象となる数が大きければ大きい程遅くなるのは変わらんし、なんか大した事無いなぁ。ちょっとした改善にしかならなかった。