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ならば引き続く計算処理が失敗しないかを、推定できるかのように機能しなければならない

週末読んだ本

金魚生活

ジャケ買いみたいなもん。

ProductName 金魚生活
楊 逸
文藝春秋 / ¥ 1,400 ()
通常24時間以内に発送

最後のオチがそう来たか、みたいな。芥川賞作家なんだと読み終わってから知った。

IT達人の仕事術

その当時の技術みたいな。

ProductName IT達人の仕事術

ブックマン社 / ¥ 1,400 ()
通常24時間以内に発送

一方で今読むと、ライフハックのコモディティ化もすごいなぁと。

バカな人事

あんま面白くなかった。

ProductName バカな人事 なぜ御社の人事は社員のやる気を失わせるのか?
中村 壽伸
あさ出版 / ¥ 1,470 ()
通常24時間以内に発送

働いた報酬とそのシステムっていう視点がね。自分の労働力を幾らで売るかっていう視点じゃないとこれからダメなんじゃないかなぁ。前者の視点であーだこーだとこねくり回しても難しいんじゃないかなぁとは思うんだけどなぁ。

lispでバイナリファイルのパース(実践Common Lisp 24-25章)

バイナリファイルのパースがあまり面白さを感じられないのでちょっと遠のいていたのだけど、週末でまとまった時間が取れたのでやってみた。バイナリファイルのパーサーを買いて、その流れでMP3のID3タグを読み書きしていくという。

ProductName 実践Common Lisp
Peter Seibel
オーム社 / ¥ 4,410 ()
通常24時間以内に発送

バイナリファイルの読み書きのあたりは面白かったのだけど、途中からついていけなくなってしまい、いい加減に読み進めてしまった。さらに後の章でこれを使ってMP3ストリーミングサーバーを実装するらしいので、また読みなおすことになりそうだ。

白隠正宗の特別本醸造とかFlying Lotusとかgawaのジビエとか

酒のいわせ営業日記より、燗でもつけるかとのこのこ出かけていって購入。誉富士は臥龍梅とか高砂とか色々飲んではみているんだけどどうも、なんか甘い感じがして、これはうめぇってのに出会ってないんですよね。なので、少汲水と悩んだんだけど、特別本醸造で。

1232782496

燗つけてもいいけどひやで吞むのがいい感じ。室温かそれよりちょっと高い温度が好み。ということは燗冷ましあたりも試す価値があるのかな。若々しさみたいなのは感じるけど、濃厚な味わいが良い。

余談だけど、いわせさんの奥さんにbistro gawaのジビエが良かった的な話を聞いて、いまだにディナーに行ったことのない僕は非常に行きたくなったのであった。

さらに余談だけど、蔵元日記で知ったFlying Lotusが調子良いですな。ちょっと低音効かせるとたまらん感じに落ちる。

ProductName Los Angeles
Flying Lotus
Warp / ¥ 1,503 (2008-06-10)
通常9~11日以内に発送

machinedrumみたいっていうか、微妙にIDMっぽくて好き。しかもレーベルwarpじゃん(知らなかった。)Potisheadみたいに内向きな感じも良い。

bounce.comのインタビューみたら、あーなるほどとか思った。

なんかそっち系のスイッチがはいっちゃったみたいでzero dbとかportishead聴いたりとか。machinedrumはヴァイナルなんで、mp3で取り込まなきゃとおもってるんだけど面倒ですのう。

ProductName Bongos, Bleeps & Basslines
Zero dB
Ninja Tune / ¥ 1,033 (2006-10-31)


とまぁ、なんとなく僕の観測範囲は意外に狭いネットワークでつながっているのかなぁと思った次第。

田ぶし

沼津のIYの地下に入ってた。というわけで初めての田ぶし

1232782500

つけ麺は、ツルツル麺でごく普通の味わい。

1232782493 1232782502

U隊長の頼んだ普通のラーメンのほうが節の香りが効いてて旨かったかな。若干濃いけど。

1232782498

子供に飴くれたりとか全般的なサービスは良かった。IYに買い物行く時には寄ると思うな。

「繁盛商店街の仕掛け人」を読んだ

途中で読むの飽きたので、拾い読みっぽくなったけど。

ProductName 繁盛商店街の仕掛け人―街に人を呼び込んだ全国成功事例20
鶴野 礼子
ダイヤモンド社 / 1680円 ( 2008-11-14 )


コミュニティ系の話しが多かったけど、上乃裏商店街の

  • 下手に組織化して協調するより、それぞれが切磋琢磨して競い合って頑張ってもらえばいい

っていうやり方がこころに残った。

入門mercurial

Appendixのコマンドリファレンスが便利だし、個人で使う場合、チームで使う場合、カスタマイズと構成が分かれていて読みやすかった。特にmercurialのマージのやり方が分かりやすく解説されていておすすめ。5.3の未コミットベースとコミット済成果ベースの話も非常に参考になった。

あと、12章のオープンソースベースのプロジェクトにオレオレパッチを当てながら快適に使う方法がよかった。職場用にカスタマイズしているツールもこれを参考にソースコード管理してみようと。

mercurialとの連携の部分ではtracみたいなBug Tracking Systemとの連携に関しては触れられてなかった。

ProductName 入門Mercurial―Linux/Windows対応
藤原 克則
秀和システム / ¥ 2,310 ()
通常24時間以内に発送

  • hg annnotate
  • hg rollback
  • hg copyでコピーした場合-fオプションで複製前のファイルの履歴までさかのぼれる。
  • --style changelogでChangeLog形式の出力

アップユーザー

製薬系のアプリケーションの充実っぷりはなかなか凄くて、コードなんかかけなくてもGUIのアプリをいじっているだけで労働ができる(not研究)。さらにアイコンをつなぎあわせるだけで、ワークフローが構成できるyahoo pipesみたいなのもあって、スクリプトなんて書く必要もなかったりとか。

そういう人達を(コードなんて書かないで)アプリケーションを専門に使うヒトという意味を込めてアップユーザーとか言ったりする。昔はアップユーザーにもノウハウが必要だったり経験がないとうまく結果を出せなかったりしたのでジョブとしても重要だったりしたんだけど、アプリケーション自体がどんどん賢くなってきててノウハウなんかなくてもボタン押すだけである程度だれでも使えるようになっている。で、そういう機械に使われる系の労働力はものすごいコモディテイ化してるよなぁっていう話はたまにされていたり。

上のエントリを見てふと思い出した。