今年は山に登りたい2009

山を垂直に登る的な達成感はなんともいえないものがあるのだろうけど、一方で、ゆるゆるとしたハイキングコースのような登山道を、木々や花、小動物の営みなどを楽しんだり愛でたりしているうちにいつの間にか登っていたという道もあると思うのだ。

螺旋階段を自分のペースで登っていっても、(それが自分にとって必要なマイルストンであれば)必ずたどり着くと思うんだよね。

避けなければいけないのは、結局たどり着かなかったという結果だけであって、鍛えなければいけないのはどの道を通るのが自分にとってベストかという判断力(直感?)なのかなぁと思ったのであった。

面倒くさがりやのあなたがうまくいく55の法則

レバレッジのひとの本。1000円というお手頃価格な割にはいいことがたくさん書いてある。

ProductName 面倒くさがりやのあなたがうまくいく55の法則
本田 直之
大和書房 / ¥ 1,050 ()
通常24時間以内に発送

  • 「出来ない理由」を考えない
  • 「変えられないもの」に執着しない
  • 運をあげない
  • 使えるアイデアと使えないアイデアの違いは「客観的な検証が加えられているか」
  • 時間を節約するためにお金をかけてもいい
  • しっかり眠る
  • 相手を変えようとしない
  • 仕事の判断基準は「成果」になるのか

あと、愚痴らないというのもあったのだけど、僕には無理そうです。愚痴というよりは現状の不満をぶつくさと言うのだけど、それって自分にゼンマイ巻いてるようなもんなので。なんつうか不満があるから、より良い方向にもっていこう的な、そんな感じの。 常に前向きってのはノーモーションからパンチを打つような気がするのです。発勁ってのは気が充実してないと打てないですよね。

ProductName 闘将!!拉麺男 コンプリートDVD【初回生産限定】

TOEI COMPANY,LTD.(TOE)(D) / ¥ 36,750 (2009-03-21)
近日発売 予約可

離散数学「数え上げ理論」

面白そうだったので買ってみたら、面白かった。

ProductName 離散数学「数え上げ理論」 (ブルーバックス)
野崎 昭弘
講談社 / ¥ 1,029 ()
通常24時間以内に発送

予備知識のいらないやさしい問題で分割数、フィボナッチ数、カタラン数に触れたあとには、数え上げ理論の三種の神器である包除原理、差分方程式、母関数の理論を紹介。その奥深い魅力が、充分に味わえる。

最初のほうはコンビネーションとかのクイズっぽくはじまる。で、確率とか計算して、賭博の仕組みを解説しつつ、上の包除原理とかやって、最後群論のさわりまで。結構テンポよく進む。

奇数の和は正方形(平方数)になる話とか、子供が大きくなったら偉そうに語るネタとしてストックされた。

AI::Prolog

perlの実装でAI::Prologというのがあるが、インストールするとaiprologというコマンドがついてくる。

階乗を計算してみる。

fact(0, 1).
fact(X, Sum) :-
    X > 0, X1 is X - 1, fact(X1, Sum1), Sum is X * Sum1.

aiprologを起動

$ aiprolog fact.swi

Welcome to AI::Prolog v 0.740
Copyright (c) 2005-2006, Curtis "Ovid" Poe.
AI::Prolog comes with ABSOLUTELY NO WARRANTY.  This library is free software;
you can redistribute it and/or modify it under the same terms as Perl itself.

Type 'help.' for for a list of built-ins or 'help("$builtin").' for help on a specific built-in.

?-fact(10,X).

fact(10, 3628800)

Yes

prologをいじってると宣言的ってのが「あーこういうことなのね」ってのがわかって楽しい。On LispでCommon Lispで実装するPrologとか読んである(継続とパターンマッチング)と内部でこういうことしてんのかなとか推測できるし。

ProductName On Lisp
ポール グレアム
オーム社 / 3990円 ( 2007-03 )


あとでHOPの9章の宣言的プログラミングのとこも読み返そう。Prologを知ってると面白く読めるのかも。

ProductName Higher-Order Perl: Transforming Programs with Programs
Mark Jason Dominus
Morgan Kaufmann / 5692円 ( 2005-03-28 )


HOP 9.4.1は連立方程式を制約システムで

久しぶりというか、ちょこちょこ読んでいるのだけどなかなか進まない。

ProductName Higher-Order Perl: Transforming Programs with Programs
Mark Jason Dominus
Morgan Kaufmann / 5976円 ( 2005-03-28 )


写経してみたけど、また戻ってきそうな予感。

制約システムで連立方程式を解く。

macbookにswi-prologをインストール

初Prolog

sudo port install swi-prolog

linuxだとplなんだけどmacだとswiplというコマンド。

parent(kzfm,yuki).
parent(uko,yuki).
parent(ako,uko).
parent(yum,kzfm).
parent(chiyo,yum).
parent(kzfm,hana).
parent(uko,hana).

上のファイルをtest.swiという名前で保存しておいて、

swipl -f test.swi

で起動

?- parent(A,yuki).
A = kzfm ;
A = uko . 

?- parent(A,B),parent(B,yuki).
A = ako,
B = uko ;
A = yum,
B = kzfm ;
false.

parentのparentつまり祖父母だ。もちろん再帰もできる。On Lispの言葉を借りるならPrologは規則を追加したデータベースだ。

ということは、ミニ言語としてperlとかに組み込んであっても良さそうなものだと思って探してみたら、ズバリな記事を見つけた。

Logic Programming with Perl and Prolog

あとで読む。

今のところ入門的な内容しかやってないのでアレなんだけど、ファクトが固いというか、True,Falseからしかルールを導いてないので、もうちょっと確率的なものを扱いたい。8割くらい正しいのでTrueとかそんな感じの緩いルール。

これも気になるが、なか見検索できないので躊躇している。

追記

これ見たら、この本よりも、Prolog Programming for Artificial Intelligenceを買うべきな気がしてきた。

ProductName Prolog Programming for Artificial Intelligence (International Computer Science Series)
Ivan Bratko
Longman Group United Kingdom / ¥ 7,091 ()
通常11~13日以内に発送

「京都型ビジネス」を読んだ

持続可能性とかそっちに通じるのかな。フェアトレードとかじゃなくて、文化、伝統の継承としての持続可能性みたいな。

ProductName 京都型ビジネス―独創と継続の経営術 (NHKブックス)
村山 裕三
日本放送出版協会 / ¥ 966 ()
通常24時間以内に発送

菊乃井の話がよく出てくる。露庵また行きたいなぁ。

  • 文化の芯
  • テクノロジーの中に伝統の技を入れ込む
  • 文化が競争力
  • 京都は人に尽きる

macbookでaserveを動かす(失敗)

macbook+sbcl+aserve(asdfで入れた)で起動するとSB-THREADがないというエラー。

* (net.aserve:start :port 8888)

debugger invoked on a SIMPLE-ERROR:
PROCESS-PRESET: Calling a multiprocessing function on a single-threaded sbcl build

Type HELP for debugger help, or (SB-EXT:QUIT) to exit from SBCL.

restarts (invokable by number or by possibly-abbreviated name):
0: [ABORT] Exit debugger, returning to top level.

SB-THREAD付きでコンパイルしろということらしい。ソースのINSTALLに書いてある通りに customize-target-features.lispってファイルを作って、中に以下のように書いておく

(lambda (features)
  (flet ((enable (x)
           (pushnew x features))
         (disable (x)
           (setf features (remove x features))))
    ;; Threading support, available only on x86/x86-64 Linux, x86 Solaris
    ;; and x86 Mac OS X (experimental).
    (enable :sb-thread)))

で、インストール。これでOK。

さて、Common Lisp と AllegroServe(Aserve) で作る Web アプリケーションのサンプルを実行してみた。

* (net.aserve:start :port 8888)

#<NET.ASERVE:WSERVER port 8888 {12085CC9}>
* (net.aserve:publish
 :path "/"
 :content-type "text/html; charset=euc-jp"
 :function
 #'(lambda (req ent)
     (net.aserve:with-http-response
      (req ent)
      (net.aserve:with-http-body
       (req ent)
       (net.html.generator:html
        (:html
         (:head (:title "Hello World!"))
         (:body "Hello World!"
         :br "こんにちは!")))))))

#<NET.ASERVE:COMPUTED-ENTITY {12E5B679}>
* aserve-accept-6: 01/26/09 - 20:44:57 - accept: error 0 on accept invalid \
keyword argument: :AUTO-CLOSE (valid keys are
                          :INPUT, :OUTPUT, :ELEMENT-TYPE, :EXTERNAL-FORMAT,
                          :BUFFERING, :TIMEOUT).

なにがinvalid keyword argumentなのかわからん。linuxに入れたsbclだと快適に動いている(日本語は表示されないけど)。

これが動かないと実践Common Lispが先に進まないんだよなぁ。

slimeでwindowを二つにわけたい

Gaucheだとこんな感じに設定しておけば、C-cSでウィンドウを2つに分け、一方でgoshインタプリタを実行するコマンドを定義する。

これをSlimeでもやりたかったので調べてみたところ、

(global-set-key "\C-cs" 'slime-selector)

と.emacsに書いておけばC-cs[?cdeilt]でバッファを切り替えられるらしい。

?:  Selector help buffer.
c:  SLIME connections buffer.
d:  *sldb* buffer for the current connection.
e:  most recently visited emacs-lisp-mode buffer.
i:  *inferior-lisp* buffer.
l:  most recently visited lisp-mode buffer.
t:  SLIME threads buffer.
v:  *slime-events* buffer.

とりあえずこれでいいかな。

Common Lispで非決定性計算

On Lisp 22章

まずはschemeでの非決定性計算のコードを解説してから、マクロ使って実装していくという流れで、継続の時と同じ構成。schemeは継続をサポートしているのでコードが分かりやすくていい。

マクロの写経。継続マクロは前書いたヤツを使う。

(defparameter *paths* nil)
(defconstant failsym '@)

(defmacro choose (&rest choices)
  (if choices
      `(progn
     ,@(mapcar #'(lambda (c)
               `(push #'(lambda () ,c) *paths*))
           (reverse (cdr choices)))
     ,(car choices))
      '(fail)))

(defmacro choose-bind (var choices &body body)
  `(cb #'(lambda (,var) ,@body) ,choices ))

(defun cb (fn choices)
  (if choices
      (progn
    (if (cdr choices)
        (push #'(lambda () (cb fn (cdr choices)))
          *paths*))
    (funcall fn (car choices)))
      (fail)))

(defun fail ()
  (if *paths*
      (funcall (pop *paths*))
      failsym))

これを使って二つの数の和が与えられた数になるような組み合わせを見つける

(=defun two-nubers ()
  (choose-bind n1 '(0 1 2 3 4 5 6 7 8 9)
    (choose-bind n2 '(0 1 2 3 4 5 6 7 8 9)
      (=values n1 n2))))

(=defun parlor-trick (sum)
  (=bind (n1 n2) (two-nubers)
    (if (= (+ n1 n2) sum)
    `(the sum of ,n1 ,n2)
    (fail))))

実行

* (parlor-trick 5)

(THE SUM OF 0 5)
* (parlor-trick 15)

(THE SUM OF 6 9)

ちゃんと動いている。

尚、後半にカットの説明があった。要するにやらなくてもよい計算をカットする仕組みってことね。これも継続を使っている。

ProductName On Lisp
ポール グレアム,野田 開
オーム社 / ¥ 3,990 ()
通常24時間以内に発送

chooseはどのnならば引き続く計算処理が失敗しないかを、推定できるかのように機能しなければならない