Haskellは安産するか?

日頃愛用している我ママチャリ。どうした事か、数日前から後輪の空気がすぐに 抜けてしまう。今日、多めに空気を入れた所、空気を入れる所からかすかに シューと言う音がするのを発見。

以前お世話になったチャリンコ屋さんへ行ってみた。そしたら、親父さんが 何やら楽しそうに、若いおねーちゃんのチャリを修理してたよ。時間がかかり そうだったので、預けてこようかと思ったら、「どうした?」って、聞いて くれた。

「空気入れたら、入れ口からシューと音がして、すぐに抜けちゃうんです」。 「だったら、これ替えてみな」って言われて、部品箱から、ほぃと、部品を 渡してくれた。

空気を入れて、「幾らですか?」って聞くと、「いいよ」との事。「また 抜けるようなら、パンクだから持ってきな」

いい親父さんだ。今乗っている、チャリが朽ちたら、親父さんのお世話に、 なっからね。あるいは、勇気を出して、親父さんが主催する、サイクリング・ クラブへ入れてもらおうか。

そのチャリ屋さんとこ、日曜日ともなれば、レーサー服に身を包んだ仲間達が わんさかと集まってくる。きっと、サイクリングの楽しみ半分、親父さんの 人柄に引かれてが、半分なんだろうな。

K3の電源

もう一つ大事な事を忘れていた。

電源はユーザーが用意する事になっている。DC13.8V 4A(@10W 送信時)の電源だ。 直流電源なんて一体幾らするか想像もつかないけど、トラ技を見て通販かな?

まてまて、へたなスイッチング電源じゃ、ノイズ発生器と共にオペレーションする 事になっちゃうな。ここは清く正しく、イエローハットへ飛んで行って、バッテリー と充電器を買ってこよう。

ワッチしてる時は、バッテリーから給電。QRTしてる時に充電だな。 40AHぐらいの バッテリーがあれば、十分かな。

あれ? 受信時は、0.9Aって書いてあるけど、すると大雑把に見積もると、送信時の ファイナルには3Aの電流が流れるのか、13V X 3A = 40W 。 40W注ぎ込んで10Wしか 空中線電力が得られないって、ちと効率悪過ぎない! 綺麗な波を出すために、終段 は、A級動作させてますってか? ああ、そうか、SSBも(オプション追加で)使える 事、忘れてたわ、テヘェ。

gccになった積もりで ...

前回、モールスのまとめをやって、終りにしようかと思っていたけど、改めて FFTルーチンを見直していたら、まだチューン出来る事に気づいた。

gccが幾ら賢くても(最近のgccは、賢く考えるので、コンパイル時間が長く なったと、一部で不評とか)、あのコードのチェーンはやらないだろう。

まずは、配列のサイズから、べき数(コード上では、Pを計算)を 求める部分。これは、DATAN が、固定だから、あらかじめ計算しておける。

もう一つは、sin,cosのtableを用意する部分。fftが呼ばれる度に、計算 してtableを埋めるのは無駄だ。プログラム起動時に、一度計算して、 それを使い回せばよい。

両者共、使用状況を考慮した上での、ループアンローリングならぬ、関数アンローリングだ。 こういうのは、自分が gccになった積もりで、支援してあげないと、だめなんだろうな。

糞CPUのコードをすらすら読めれば、確認してみたい所だけど、そこまでは 遠慮しておこう。

CiSE

8月末に行なわれた LLTV の資料が 公開されたり @ITのNewsで取り上げられたりしてる、CiSEだか、shiroさんが、手回しよく 一式丸ごと公開してくださっている。

どうやって使うかは、Makefileを見れば分かる。

#       @(#)Makefile    8.1 (Berkeley) 6/2/93
# $FreeBSD$

.SUFFIXES : .sc

.sc.c:
        ./cise $< $@

PROG=   ls
SRCS=   cmp.sc ls.sc print.sc util.sc
CSRCS=  cmp.c ls.c print.c util.c
GENERATED = cmp.c ls.c print.c util.c flags.h
DPADD=  ${LIBUTIL}
LDADD=  -lutil -lproc

DPADD+= ${LIBTERMCAP}
LDADD+= -ltermcap

$(PROG) : $(CSRCS)
        cc -o ls $(CSRCS) $(LDADD)

flags.h : ls.sc

cmp.c ls.c print.c util.c : flags.h ls.h extern.h

clean :
        rm -rf ls *.o *~ $(GENERATED)

.c ファイルは、.sc を元にして作られる。その作り方は、ciseを使えと言う事を 教えているんだな。ソースファイルは、*.sc ですよと宣言しておいて、作成物を使って lsを作れか。

Schemeのマクロの裏側を見ている思いだ。Cって、ひょっとしてSchemeと親和性が 高いんと違う? だってさ、

#define DATAN 128

って、括弧でくくってやれば

(#define DATAN 128)

となって、もろにS式じゃん。それに

#define DUMP(fmt,val) do{ if (argc == 2 ){ printf(fmt, val); } } while(0)

だって、置き換えモデルを使えば

DUMP("%s", onoff);

は、

 do {if (argc == 2 ){print("%s", onoff); } } while(0);

に、置き換えられ、最終的に、gcc の最適化により do { ... } while(0); は、不要と して除去されるから、中身の if (..){ ... } だけが、残る事になる。なぜdo .. while(0);で 囲っておくかと言うと、エラーの防止のためだ。

これのからくりを利用して Schemeっちくに書けるようにしたのが、ciseコマンドか。

残念ながら、この機能はgaucheの headでしか使えないが、次期リリースでは普通に使える ようになるのかな。そしたら、C言語をSchemeチックに書けるようになるな。

shiroさん、新しいgaucheはクリスマスプレゼントですか? それともお年玉?

Haskell 6.10.4

FreeBSDの portsでは、長らくHaskell 10.8.3で、悔しい思いをしていた。しかし、 どんな風の吹き回しか、9月5日付けで、6.10.4 へいきなりJumpしてしまった。

Windowsには、既に 6.10.3が入っているので、系統を合わせておくのが望ましい。 でも、portupgrade って、時間がかかるんだよなぁ。

意を決して、夜のバッチに投入してみた。開始時間は、20時ぐらいだったかな。 あらかじめ必要な材料(50Mぐらいだろうか)を取り寄せておいたので、すぐに 更新にかかってくれた。

系統が違うので、途中でオプションを再設定させられたけど、頑張って私色の やつを作っていたよ。22時ぐらいに確認してみたけど、まだstage1だった。 とても終りまではつき合いきれないので、途中で寝ちゃった。

朝起きて確認したら、深夜1時過ぎに完了してた。やれやれ、時間がかかるなあ。

でも、この6.10.4とMacの組み合わせでSEGVするなんて話があり、調査依頼のチケットを 発行したくださった方がおられるようです。(ありがたい事です)

個人的には

・+RTS -Bオプションで、GCのときにビープ音が出せるようなので実行してみると、最初のビープのタイミングでSegmentation faultになる。
・ダミーのC関数void* free()をmyfree.cに書いてghc --make ei_3.hs myfree.cのようにリンクすると落ちなくなる。(freeで解放された領域にアクセスしていると考えられます。)
・ghc-6.10.4のソースにprintfを埋め込んで追っていくと、GarbageCollect(rts/GC.c)->scheduleFinalizers(rts/Weak.c)->runCFinalizer(rts/Weak.c)ときて、Segmentation faultになる。
・上記ei_3.hsのようにloopをaccを使って書くと(スタックを消費しない?)Segmentation faultが発生しない。

こういうのも、大好きだったりします。で、-Bオプションの事知らなかったので、調べてみたら

  -B

    GC(メジャー)が始まるたびにベルを鳴らす。

    実に奇妙なことだが、実際にこのオプションを使う人々が存在する。
    ダラム(イギリス)にいる我々の仲間、ポール・キャラハンは次のように書いている。
   「ここには色んな目的のためにこれを使う人々がいる?これは本当だ?
    例えば、コード/機械が何かをしているということを確認したり、無限ループを発見したり、
    最近付け加えたコードのコストを量ったりだ。ある種の人々はビープのパターンから
    プログラムがどの段階にいるかを聞き分けることさえできる。
    しかし最も重要な使いかたは、同じオフィスにいる他の人を鬱陶しがらせることである…」

奇妙な人は日本にも居たって事か。

Haskellは安産するか?

こうして、FreeBSDのそれも新しくなったけど、世間では、Haskellの次版が 着々と準備されてるはず。

予定日は9月16日とか。予定通りに無事に産まれるかなあ。

FreeBSDのReleaseは遅れる事で有名だけど(8は8月末の予定だったけど、現時点で 1月遅れがアナウンスされてる)、Haskellはどうか? やきもきさせないでね。

それと、FreeBSD用のHaskellもすぐに 6.12.X に追従するのだろうか? こちらも 注視ですね。もし実現したら、FreeBSD用の 6.10.4 は、寿命が短い不憫な子に なってしまう。

そう言えば、秋は出産ラッシュ。既に Vineが5になったし、次は予定通り出す ので有名なあれが、09.10を出すのかな。

後、何と言っても大物のWindows 7が控えているな。Vistaの放蕩ぶりに一般消費者 から見放されていたけど、挽回なるか? 小判鮫のアプリ類も、7対応を9月迄に やれば、お安くしときまっせと、五月蝿い事しきり。

馬肥える秋とは言うものの、財布はやせ細る秋なのね。まあ、おいらには関係ない 話ではありますが。。。