親子丼

晩秋である。それを証拠に菊である。菊は今の季節。菊祭りなんてのをやっている。 昔、二本松だったかの菊人形祭りだったかに行って、見事な菊の芸術を見てるけど、この地 のやつはどうかな?

誰も居なかった。朝早かったからか? よしずの屋台に沢山並べられていた。基本は一輪鉢からだ。 これは、超ビギナーだな。普通のビギナーだと一輪の鉢から3本に枝別れした菊。その上は、4鉢、 、9鉢セットへとアップグレードしてくみたい。枝分かれだからフォークじゃなくて、メインスレッド から、サブスレッドが3つかな。そして、そのスレッドの先端で同期して(花を)爆発させる んだから難しいだろうに。3本のスレッドぐらいなら、Rubyでも出来るだろうけど、これが、50本 ぐらいのスレッドになると、どうなんすかね?一時流行った、アーランぐらいを持ち出さないと だめでしょうか。菊では実現されてましたよ。

中級になると、盆栽バージョンの菊。針金で矯正して、松の盆栽のようにしたり、変わった所 では、目出度い鶴と亀を造詣しちゃったりで、よくぞここまでやるわいと思うぐらい。

更に上は、これらを組み合わせて、菊だけで庭園を造っちゃう。盆栽菊の松があったり、小菊で 草を表現したり、白い可憐な菊で滝をイメージしたり。。出来上がりを想像して、それぞれの パーツを作って行くって、どれぐらいの手間と時間がかかっているのやら? 想像も付きません よ。

変わった所では、だるまと呼ばれるのがあった。薬品の力を借りて、枝が伸びないようにして 花を咲かせるのやら、福助と言う、頭でっかち(の花)のやつやら。おいらなんか、こんな 奇形はちょっとなあと思うんだけど、どうなんでしょうね?

近くに菊クラブのテントが張ってあって、菊の素材を売っていた。小さい鉢が3000円ですって。 結構高いのね。(安いのは、一鉢300円)菊って挿し木で増えて行くんだっけ? 血統書とかあるのかな? きっと、馬さんみたいにあるんだろうな。XX年の菊祭りで優勝した菊から枝を分けましたとか。 血統が良いですから、丹精込めて育てれば、優勝間違い無し。

見て楽しむだけじゃなくて、食べる菊も売ってた。黄色と薄紫のバージョンが有ったので、黄色 バージョンを買った。一緒に居た女房は、除虫菊もないかしらですって。どうやらおいらの事を どっかのプロジェクトに寄生して甘い蜜(ソース)を横取りする輩と思ってるみたい。それで そんな虫を退治したいと思ったのかも?

花弁をさっとゆがいて、大根の千切りと一緒にポン酢で食べたら、とってもおいしゅうございました。

メンテナンス

今までずっと、ArchLinuxのアップデートを続けて来たけど、最近BootメッセージにFAILが出る ようになって来た。まあ、真剣に使う事もなく惰性でアップデートしてたって方が正確な言い方 かな。

でも、FAILが出てるのに知らないふりをするのは、ちと忍びない。ちゃんとメンテナンスするかな。 取っ掛かりは、/etcの下を更新する事だな。Archの場合、confファイルのスケルトンが更新される ので、現在のファイルとのdiffを取ってあげればいいんだ。

途中まで、何個か更新したけど、まだ少し残っている。

[sakae@arch etc]$ ls *.pacnew */*.packnew
ls: cannot access */*.packnew: No such file or directory
fstab.pacnew  gshadow.pacnew  inittab.pacnew  shadow.pacnew

後4つ残っているな。そろりそろりと更新しておこう。 rc.confを更新したら、ネットに繋がらなくなって焦ったよ。んでもって、netstat -nr なんて コマンドもすっかり忘れている始末。安住してるとだめですな。(決して、安住アナの事では ありませんので、そこんとこ誤解無き様)

たまにはXでも起動してみっかと、startxしたら、見慣れないのが出てきた。もう1年も起動して ないから、最後に変なウィンドウ・マネージャーを使ってそのままになってたんだな。使い方を 思い出したよ。で、何とかemacsを起動したはいいんだけど、さっぱりemacsの画面が出てこない。

何で? マネージャが心変わりして、悪マネージャにでもなってしまたんだろうか? こういう時は マネージャを解任して、確認するのが一番だな。

teratermでssh接続して、そこからemacsを起動するもさっぱりemacsが上がってこない。で、暫く そのままにしておいたら、やっとemacsが起動してきた。ちょっと不思議。世の中には、摩訶不思議 な現象があって、shiroさんがそういうのを集めていました。 面白いので、読み漁ってしまったぞ。Bugなんですねぇ。

で、おいらのemacs。何となく同様な現象をFreeBSDで観測した事があるのを思い出した。 そう、昔、telnetでリモートマシンに接続する時、暫く待たされてから、プロンプトが出て来る って現象と酷似してるんだ。その原因は、外にDNSを引きに行ってしまい、タイムアウトするまで ブロックされちゃうって奴。解決方は、/etc/hostsにマシンを登録するってやつね。

今回もこれじゃなかろうか? /etc/hostsを点検したら、やっぱり自ホストが登録されてなかった。 騙されたと思って、登録したら、すっとemacsが上がってくるようになったよ。 昔はこんな事無かったと思うんで、途中でemacs(でも)進化したんすかね? どうやって確認すればいいのかな? ちょっと考えてみよう。久しぶりの頭の体操になるかも。

にわとりと卵

にわとりと卵、どっちが先かなんて話を出す訳じゃありません。前週は、Javaを食った訳だが、いささか消化不良で欲求不満が募ってしまった。よって今回は消化に 良さそうな物を食してみる。と、言う事です。

鶏と卵と言えば、おのずと知れた『親子丼』ですな。有名な所では、玉ひで とかあるようだけど、おいらのお勧めは、CHICKENだ。たまごは、 いろいろ有って、よりどりみどり だよ。併せて味わえば親子丼。無料で、食べ放題、組み合わせ自由。これなら、おこずかいの 少ないサラリーマンな人でもお手軽に試せるだろう。

一応、暖簾と言うか家紋があって、それを見るのも楽しいぞ。

まずは、親鳥から

世の中、便利な事に親鳥になったのが提供されてる。いろんな環境で飼えるように、しつけられた のが置いてあるんで、取ってくるだけ。

tar玉子から孵化させて行くんなら、READMEを参照。やっぱり自分で飼育したのは愛おしいですよ。 私は勿論、ArchLinuxで、tar玉から育てましたよ。FreeBSDには、何故か入ってた。

で、今まで、ルビーとかにしき蛇で生計を立てていた人には、 転職プログラムが用意されてます。 蛇屋さんの手記もお勧め。

setup emacs for chicken

毎度々、恒例の型から入ります。

おすすめEmacs設定Using CHICKEN with emacs を合体させてみました。久しぶりにquackを使います。これだと、schemeの切り替え器を内蔵して ますから、ラクチンです。でも、schemeと言うだけで、slimeが使えないのは、ちと痛い。 共通リスプ派(産業系)と、scheme派(学術系と勝手においらが思ってるだけ)は、もっと歩み寄ろうよ。日本発で、産学協同が 実現するといいな。

(setq load-path (append '("~/.emacs.d") load-path))

(setq backup-inhibited t)
(setq delete-auto-save-files t)
(column-number-mode t)
(line-number-mode t)
(menu-bar-mode -1)

(require 'quack)
(autoload 'scheme-smart-complete "scheme-complete" nil t)
(eval-after-load 'scheme
  '(define-key scheme-mode-map "\t" 'scheme-complete-or-indent))

(autoload 'scheme-get-current-symbol-info "scheme-complete" nil t)
(add-hook 'scheme-mode-hook
  (lambda ()
    (make-local-variable 'eldoc-documentation-function)
    (setq eldoc-documentation-function 'scheme-get-current-symbol-info)
    (eldoc-mode)))

(setq lisp-indent-function 'scheme-smart-indent-function)

(custom-set-variables
 '(quack-default-program "csi")
 '(quack-programs (quote ("csi" "gosh" ))))

(require 'w3m-load)
(setq browse-url-browser-function 'w3m-browse-url)

goshにも関わっていた(はずの)AlexShinn'sさんのscheme-completeを使えるようにしてます。

そうそう、quackのキーバインド忘れそうなので、晒しておく。

;;         C-c C-q m   View a manual in your Web browser.
;;         C-c C-q k   View the manual documentation for a keyword
;;                     (currently only works for PLT manuals).
;;         C-c C-q s   View an SRFI.
;;         C-c C-q r   Run an inferior Scheme process.
;;         C-c C-q f   Find a file using context of point for default.
;;         C-c C-q l   Toggle `lambda' syntax of `define'-like form.
;;         C-c C-q t   Tidy the formatting of the buffer.

ラムダが、λ になったりして、ちょっとキュート。嗚呼、chicken用にマニュアルの 在り処をちょっと編集したな。

    (chicken
     "Chicken User's Manual"
     ;;"http://wiki.call-cc.org/man/4/The%20User%27s%20Manual"
     "file:///usr/local/share/chicken/doc/manual/The User's Manual.html"
     nil)

eggs

eggsって、Rubyで言う gemね。あれ? gemって何の略かな?よう知らん。それに対して、こちらは にわとりとたまごがから、非常に分かりやすい。

たまごの取り込みとか管理プログラムは親鳥と一緒に入ってくるので、すぐに利用出来る。 早速、やってみる。

[sakae@cdr ~]$ chicken-install -sudo readline
retrieving ...
resolving alias `kitten-technologies' to: http://chicken.kitten-technologies.co.uk/henrietta.cgi
connecting to host "chicken.kitten-technologies.co.uk", port 80 ...
requesting "/henrietta.cgi?name=readline&mode=default" ...
reading response ...
HTTP/1.1 200 OK
Date: Wed, 26 Oct 2011 07:04:24 GMT
Server: Apache
Connection: close
Transfer-Encoding: chunked
Content-Type: text/plain
reading chunks ..
reading files ...
  ./readline-egg.c
  ./readline-test.scm
  ./readline.meta
  ./readline.scm
  ./readline.setup
 readline located at /tmp/tempe354/readline
checking platform for `readline' ...
checking dependencies for `readline' ...
install order:
("readline")
installing readline: ...
changing current directory to /tmp/tempe354/readline
  /usr/local/bin/csi -bnq -setup-mode -e "(require-library setup-api)" -e "(import setup-api)" -e "(setup-error-handling)" -e "(extension-name-and-version '(\"readline\" \"\"))" -e "(sudo-install #t)" /tmp/tempe354/readline/readline.setup
trying: -lreadline
  /usr/local/bin/csc -feature compiling-extension -setup-mode    readline-test.scm -lreadline
  /usr/local/bin/csc -feature compiling-extension -setup-mode    -s -O2 readline.scm -lreadline
  /usr/local/bin/csc -feature compiling-extension -setup-mode    -c -O2 -d0 -j readline readline.scm -o readline-static.o -unit readline -lreadline
  /usr/local/bin/csc -feature compiling-extension -setup-mode    -s -O2 -d0 readline.import.scm
  sudo cp -r readline.so /usr/local/lib/chicken/6/readline.so
Password:
  sudo chmod a+r /usr/local/lib/chicken/6/readline.so
  sudo cp -r readline.import.so /usr/local/lib/chicken/6/readline.import.so
  sudo chmod a+r /usr/local/lib/chicken/6/readline.import.so
  sudo cp -r readline-static.o /usr/local/lib/chicken/6/readline-static.o
  sudo chmod a+r /usr/local/lib/chicken/6/readline-static.o
  sudo mv /tmp/tempe354.tmp /usr/local/lib/chicken/6/readline.setup-info
  sudo chmod a+r /usr/local/lib/chicken/6/readline.setup-info

どうやら入ったようなので、状況を確認。

[sakae@cdr ~]$ chicken-status
readline ...................................................... version: 1.993

ここを確認しつつreadline玉子を使ってみます。 (全てのたまごっちの説明はここに有ります)

[sakae@cdr ~]$ csi

CHICKEN
(c)2008-2011 The Chicken Team
(c)2000-2007 Felix L. Winkelmann
Version 4.7.0
freebsd-unix-gnu-x86 [ manyargs dload ptables ]
compiled 2011-08-30 on cdr.kuma.net (FreeBSD)

#;1> (use readline)
; loading /usr/local/lib/chicken/6/readline.import.so ...
; loading /usr/local/lib/chicken/6/scheme.import.so ...
; loading /usr/local/lib/chicken/6/chicken.import.so ...
; loading /usr/local/lib/chicken/6/foreign.import.so ...
; loading /usr/local/lib/chicken/6/ports.import.so ...
; loading /usr/local/lib/chicken/6/data-structures.import.so ...
; loading /usr/local/lib/chicken/6/posix.import.so ...
; loading /usr/local/lib/chicken/6/readline.so ...
#;2> (current-input-port (make-gnu-readline-port))
#<input port "(gnu-readline)">
#;3> (with-
with-error-output-to-port  with-input-from-string
with-exception-handler     with-output-to-file
with-input-from-file       with-output-to-pipe
with-input-from-pipe       with-output-to-port
with-input-from-port       with-output-to-string
#;3> (with-

矢印キーで履歴も辿れるし、TABキーで、chicken特有の関数を含め、補間が出来るように なりました。ちゃんと、補間用のデータベースが入ってるのね。感心。

どんな仕組みか謎解きしたかったら、ソースを御取り寄せ。

[sakae@cdr ~]$ chicken-install -r readline
retrieving ...
resolving alias `kitten-technologies' to: http://chicken.kitten-technologies.co.uk/henrietta.cgi
connecting to host "chicken.kitten-technologies.co.uk", port 80 ...
requesting "/henrietta.cgi?name=readline&mode=default" ...
reading response ...
HTTP/1.1 200 OK
Date: Wed, 26 Oct 2011 07:40:50 GMT
Server: Apache
Connection: close
Transfer-Encoding: chunked
Content-Type: text/plain
reading chunks ..
reading files ...
  ./readline-egg.c
  ./readline-test.scm
  ./readline.meta
  ./readline.scm
  ./readline.setup
 readline located at /usr/home/sakae/readline

取り寄せたファイルをざっと見ると、setupファイルは、scheme流のmakeファイルでした。meta ファイルは、メタファイルだわな。(って、説明になってないじゃん)

fact

dmrも亡くなってしまったので、毎度お馴染みの こんにちわ世界って標語も影が薄れた感がする。 Lisp系における、こんにちわ世界は、そりゃ、factでしょう。Archでやってみる。

[sakae@arch ~]$ csi

CHICKEN
(c)2008-2011 The Chicken Team
(c)2000-2007 Felix L. Winkelmann
Version 4.7.0
linux-unix-gnu-x86 [ manyargs dload ptables ]
compiled 2011-10-24 on  (Linux)

#;1> (use readline)
; loading /usr/local/lib/chicken/6/readline.import.so ...
; loading /usr/local/lib/chicken/6/scheme.import.so ...
; loading /usr/local/lib/chicken/6/chicken.import.so ...
; loading /usr/local/lib/chicken/6/foreign.import.so ...
; loading /usr/local/lib/chicken/6/ports.import.so ...
; loading /usr/local/lib/chicken/6/data-structures.import.so ...
; loading /usr/local/lib/chicken/6/posix.import.so ...
; loading /usr/local/lib/chicken/6/readline.so ...
#;2> (current-input-port (make-gnu-readline-port))
#<input port "(gnu-readline)">
#;3> (define (fact n)
---> (if (= n 1)
---> 1
---> (* n (fact (- n 1)))))
#;4> (fact 10)
3628800
#;5> (fact 100)
9.33262154439441e+157
#;6> ,t (fact 150)
0s CPU time, 25 mutations, 0/4 GCs (major/minor)
5.71338395644585e+262
#;7> ,q
[sakae@arch ~]$

これで、取りあえず儀式は終了。factの結果が浮動小数点形式ってのが面白いな。まあ、普通の 用途には、この方が適してるかも。

たまごの作り方

取りあえず 動いたので、安心してマニュアルをパラパラしてたら、たまごの作り方が出てたのでメモしとく。

Here we create a simple application:

;;;; hello2.scm

(print "Hello, ")
(for-each (lambda (x) (printf "~A " x)) (command-line-arguments))
(print "!")

We also need a setup script:

;;;; hello2.setup

(compile hello2.scm)  ; compile `hello2'
(install-program 'hello2 "hello2") ; name of the extension and files to be inst$

;;;; hello2.meta

((author "Me")
 (synopsis "A cool hello-world application")
 (license "proprietary")
 (files "hello.scm" "hello.setup"))

To use it, just run chicken-install in the same directory:

$ chicken-install

(Here we omit the extension name)

Now the program hello2 will be installed in the same location as the other
CHICKEN tools (like chicken, csi, etc.), which will normally be /usr/local/
bin. Note that you need write-permissions for those locations and may have to
run chicken-install with administrative rights or use the -sudo option.

The extension can be used from the command line:

$ hello2 one two three
Hello,
one two three !

De-installation is just as easy - use the chicken-uninstall program to remove
one or more extensions from the local repository:

$ chicken-uninstall hello2

gemより簡単(かな?)。gemの事は全く知らんけど!

doc

おまけです。ここに沿って、ちょっと追加すれば マニュアルが検索出来て便利。

#;1> (require-library chicken-doc)
 :
#;2> ,?
Toplevel commands:

 ,doc PATHSPEC     Describe identifier or path with chicken-doc
 ,toc PATHSPEC     List contents of path with chicken-doc
 ,wtf RE           Regex search with chicken-doc ("where to find")
#;2> ,doc car
path: (scheme car)

-- procedure: (car pair)

Returns the contents of the car field of pair. Note that it is an error to
take the car of the empty list.

  (car '(a b c))                  ===>  a
  (car '((a) b c d))              ===>  (a)
  (car '(1 . 2))                  ===>  1
  (car '())                       ===>  error
#;2> ,toc car
path: #<chicken-doc-node>
#;2> ,wtf car
(mpi MPI:cart-coords)                    MPI:cart-coords:: COMM * RANK -> COORDS
(mpi MPI:make-cart)                      MPI:make-cart:: COMM * DIMS * PERIODS * REORDER -> COMM
(byte-blob byte-blob-car)                (byte-blob-car BYTE-BLOB) => X
(byte-blob-stream byte-blob-stream-car)  (byte-blob-stream-car STREAM) => X
(scheme car)                             (car pair)
(srfi-1 car+cdr)                         (car+cdr pair) -> [x y]
  :