親子丼(3)
17日に新酒のワインが解禁された。いわゆるボジョレーヌーボーってやつだ。これワイン業界の 悪巧み。円高だと言うのにお高いぞ。人の足元見てる。
TPPも始動した事だし、もうフランスは見切って、カロフォーニアとかチリとかオーストリアの ワインに期待ですかね。頑張れドジョウ。
時々造り酒屋の前を通るんだけど、新酒ができたぞーの看板、杉玉はまだ架け替えられていない。 もう少し寒くなってからかな。
おいらは新○○に弱いんだなあ。今なら新蕎麦って事で、2週続けて新蕎麦を食べに行ってきた。 最初に行った店では、とろろ、大根、きのこの3種混合版を頼んだ。上品な店だったので量は 少なめ。蕎麦も上品に色白の細麺だった。
二回目の店では天ざるを頼んだ。地元の野菜と大降りな海老2本の天麩羅。蕎麦は色黒の太めで 大地にどっしりと言った感がしたよ。この店の蕎麦湯が独特だった。非常に濃いのだ。濃いと 言うよりトロミがかってた。こんな蕎麦湯は初めてですよ。病み付きになりそう。
土産を売っていた。蕎麦パスタ、蕎麦のクッキー、蕎麦かりんとう、そして蕎麦粉とつなぎに 使う綿穂って言う綿のような繊維。ひょっとしたらススキの仲間かな? この地では土壁を作る時、土のつなぎとしてわらを混ぜる けど、それと一緒だな。
おいらの甥っ子が村の蕎麦打ち大会で中学校の頃、優勝したとか。なんでも祖母の手伝いを してるうちに覚えたらしい。今度、蕎麦打ちやってね。材料は用意しておくから。
色白蕎麦と色黒蕎麦、違いは蕎麦の花で見分けられるそうな。白い花を付けるのが色白になり、 赤い花を付けるのが色黒になるとか。種類が違うのね、そんな事初めて知りましたよ。
寒くなる前に、3軒目の蕎麦屋を目指してみるかな。今度はどんな蕎麦に巡り合えるのだろうか。 楽しみだな。
numbers
もう暫く前だけど、Jobsの伝記が出たみたいだ。近くの本屋へ行ったら、田舎には珍しくJobsの コーナーもどきが出来ていた。でも、Jobsはおろか林檎マークは、いつの頃からか嫌いになった んだな。
んでもって、XX嫌いなんてのを面白半分で調べていたら(XXの部分には好きな(嫌いな)語句を 入れる)、面白いのに出合ったよ。
Excelの馬鹿さ加減と言うか重箱の隅を 集めた人だ。そこからリンクされてた EXCELで階乗が面白かったですだ。 ganmaを使えとな。
親子丼のCHICKENで普通にやると、
#;2> (fact 20) 2.43290200817664e+18 #;3> (fact 300) +inf
こんな具合に(あろう事か)浮動小数点で答えが返ってきてしまいます。これじゃSchemeらしく ないですなあ。おまけにオーバーフローまでしてしまって、正にEXCEL並みです。気を取り直して FAQを見たら、普通の人にはそれで十分でしょ、ですって。変な人はnumbersってのを卵から 孵せとな。
#;6> (use numbers) ; loading /usr/local/lib/chicken/6/numbers.import.so ... Note: re-importing already imported identifier: + Note: re-importing already imported identifier: - : Note: re-importing already imported identifier: finite? ; loading /usr/local/lib/chicken/6/numbers.so ... #;10> (fact 50) 30414093201713378043612608166064768844377641568960512000000000000 #;11> (make-rectangular 3 4) 3+4i
これで普通のSchemeに成りました。なお、普通になって複素数も普通に使えます。でも、eとかpiが 入っていないなあ。ちょっと不親切。(まあ、計算出来ますけどね)
#;13> (exp 1) 2.71828182845905 #;14> (* (acos 0.0) 2) 3.14159265358979
PIと言えば、10兆桁まで計算しちゃった人が居ますね。(ギネス認定で、ギネスビール1年分とかの 賞品は貰えないのかな)その方の 奮闘の記録(去年度版) が、EXCELアルバムで公開されてます。
compile-file
CHICKENをemacsから使っているんだけど、C-c C-k (compile-file) しようとすると、
#;1> Error: unbound variable: compile-file Call history: <syntax> (compile-file "/home/sakae/chi/fact.scm") <eval> (compile-file "/home/sakae/chi/fact.scm") <--
こんな風にエラーになっちまう。そんな関数無いとな。ほんとーか? 目を皿のようにして、 マニュアルを流し読みしてたら、(use utils) しろとな。
#;1> (use utils) ; loading library utils ... #;2> ; compiling /home/sakae/chi/fact.scm ... ; loading /tmp/temp3af8.so ... ; loading /usr/local/lib/chicken/6/numbers.so ... "/tmp/temp3af8.so"
コンパイラ(chicken and gcc)が裏で走るので、一瞬息が詰まります。soファイルが一時的に 作られて、それがロードされてパワー10倍になります。正しく、セッションを終了すると、終了時に 一時ファイルは削除されるけど、強制終了しちゃった場合は、残骸が残っちゃうから、自分でGC しましょ。
apropos
追加で玉子を孵しておくと、何かと便利。
#;1> (use apropos) ; loading /usr/local/lib/chicken/6/apropos.import.so ... ; loading /usr/local/lib/chicken/6/scheme.import.so ... : #;2> (apropos 'car) car procedure (p) car+cdr procedure (pair223) set-car! procedure (x262 y263) type-checks#check-cardinal-fixnum procedure (loc67 obj68 . args69) type-checks#check-cardinal-integer procedure (loc89 obj90 . args91) type-checks#check-cardinal-number procedure (loc111 obj112 . args113) type-errors#error-cardinal-fixnum procedure (loc339 obj340 . tmp338341) type-errors#error-cardinal-integer procedure (loc373 obj374 . tmp372375) type-errors#error-cardinal-number procedure (loc305 obj306 . tmp304307) #;3> ,a cons alist-cons procedure (key817 datum818 alist819) cons procedure (x255 y256) cons* procedure (first87 . rest88) constantly procedure xs88 xcons procedure (d62 a63)
これらの玉子をcsi起動直後から使いたかったら、.csircに書いておけばよい。
[sakae@cdr ~]$ cat .csirc (use apropos) (use readline) (current-input-port (make-gnu-readline-port))
compile and debug
はて、chickenはその大部分がSchemeで書かれていて、そいつをCに変換して、アプリケーションを 作っている。そのあたりがどうなっているか、見てみたい。
と言っても、いきなりでは討ち死にするに決まっているので、 東京大学院通信講座 を取ってみる事にした。(本当はハワイ大学の方がいいんだけど。。。)
手を動かせ(写経)ってのが流行っているみたいなので、取りあえず手を動かしてみる。 ああ、違った、gdb動かして追ってみよう。
普通にやろうとすると、DEBUGBUILD=1 としてchickenをコンパイルし直さないと、深い所まで 潜っていけないので、ちょっと別の手を考えてみた。(偉そうに書いたけど、配布パッケージを 作る時のやり方をパクッただけです)
簡単なSchemeスクリプトをCにしてgdbにかけられるように、Makefileを書いた。
.SUFFIXES: .scm .c SRC = t.c OBJS = runtime.o library.o eval.o expand.o $(SRC) CFLGS = -g #CFLGS = -static -Os -fomit-frame-pointer me: $(OBJS) gcc $(CFLGS) -o $@ $(OBJS) -lm # strip $@ .c.o: gcc $(CFLGS) -c $< .scm.c: chicken -to-stdout $< | indent > $@
t.scmをt.cに(chickenで)変換して、それと最低限必要なファイルを、デバッグオプション付きで コンパイルするやつだ。コメントを外してあげると、可搬のバイナリーファイルが出来るよ。
[sakae@cdr ~/t]$ echo '(print "Ans = " (+ 123456 654321))' > t.scm [sakae@cdr ~/t]$ make gcc -g -c runtime.c gcc -g -c library.c gcc -g -c eval.c gcc -g -c expand.c chicken -to-stdout t.scm | indent > t.c gcc -g -o me runtime.o library.o eval.o expand.o t.c -lm [sakae@cdr ~/t]$ ./me Ans = 777777
debug情報が付いているとは言え、たかが足し算の結果を表示するだけで、3Mのファイルに なりました。可搬のために、chickenライブラリを内蔵してますからねぇ。
[sakae@cdr ~/t]$ gdb me GNU gdb 6.1.1 [FreeBSD] (gdb) b main Breakpoint 1 at 0x81b8ec0: file t.c, line 48. (gdb) run Starting program: /usr/home/sakae/t/me Breakpoint 1, main (argc=Error accessing memory address 0x2: Bad address. ) at t.c:48 48 C_main_entry_point (gdb) n main (argc=1, argv=0xbfbfe758) at t.c:48 48 C_main_entry_point (gdb) n CHICKEN_run (toplevel=0x0) at runtime.c:1323 1323 if(!return_to_host) (gdb) n 1324 (C_restart_trampoline)(C_restart_address); (gdb) n 1323 if(!return_to_host) (gdb) n 1324 (C_restart_trampoline)(C_restart_address); (gdb) n 1323 if(!return_to_host) (gdb) n 1324 (C_restart_trampoline)(C_restart_address); (gdb) n 1323 if(!return_to_host) (gdb) n 1324 (C_restart_trampoline)(C_restart_address); (gdb) n Ans = 777777 1323 if(!return_to_host) (gdb) n 1324 (C_restart_trampoline)(C_restart_address); (gdb) n Program exited normally.
Uum ....
windowsとか
ChickenもWindowsで動く。ソースを見れば、cygwin用とかのレシピが載ってたりする。そして おいらも昔やった(そして疲れた)こちらにも、 Windowsで頑張っておられる方が 居た。頑張ってくらはい。
Windowsは一般の代名詞、Schemeはまあ、ニッチな業界の代名詞、Javascriptは一般名詞っつう事で、 SchemeとJavascriptの対応表 をまとめておられる方がいた。こちらも、貴重なお人だ。