K.Sasada's Home Page

Diary - May 2003

研究日記

皐月

_31(Sat)

神保町の学術総合センターってところでの発表だったんですが、お昼ご飯食べにそこらを彷徨っていたらなぜか武道館とかに出て。んで、さらに歩いたらいつのまにか明倫館書店にいました。噂に聞いていたんだけれど、たしかに凄い品揃えだと思ったんだけど、欲しい本がなかった。たしかに、3つくらいの棚に欲しい本全部あるわけねーよなぁ。

(結局その日は昼飯が食えなかった)

結局、最終日にそこで買った本。

初めて洋書を買った気がする。技術書の。後者は350円だったからという単純な動機で。awk って未だに書けないんで、いい機会なのかなと。

そういえば、最終日にはドーナツ出てなかったな。残念。


最終日のHPの方の英語の発表、全然わけわからんかったー。


難しい話はよくわからないんですが、ソースを公開する理由をその「難しい話がよくわからないから」にしてはいけないのかしらん。私はそうです。

_29(Thu)

今日もドーナツを2個食べてきました。

夕飯はなんと寿司です。酒もあります。何より無料です! よかったです。


というか、今まで論文とかその辺でしか見たことが無いような偉い人たちのご尊顔を直に拝見できることができて非常に嬉しかったです。

いやー、あこがれの人ばかりですよー。まさか直に話できる機会があるとは思わなかった。

(頂いた研究についての痛烈なコメントはこのさい忘れてしまおう(忘れちゃダメぢゃん・・・))


なんというか、最近幸せです。RHG / SICP reading とかで、雲の上の人だと思ってた人とかと会えてみたり。今回みたいに学会でお会いできてみたり。

このような方々と向き合えるように、精進しないとなぁ、とか思ったりするわけです。

_笹川 賢一(Thu May 29 23:11:55 JST 2003)

 雲上人って誰でしょう?竹内先生とか武市先生とか、だったらサインもらいたいな。

_ささだ(Fri May 30 07:05:53 JST 2003)

 笹川さんみたいな人です :-)

_み(Fri May 30 12:02:31 JST 2003)

 もっと話せるように精進してね。ちなみに「今のエライ人も昔はみんな学生だった」

_ささだ(Fri May 30 12:56:06 JST 2003)

 やっぱ研究者は研究より話術ですねえ(ぇ。

_み(Fri May 30 20:25:45 JST 2003)

 いやぁ〜、研究者(というより[プログラミングは特に])は体力でしょう。別名、気力かもね。本当は知力でいたいけど。飲み会は酒の強さかもね。

_28(Wed)

ドキドキドキドキ


発表なのに、相変わらずノートに充電できない。残りの電池だけで、発表、もつかなぁ・・・。もう一台くらいノートPCを買うくらいの甲斐性が欲しいぞ。


絨毯がフカフカで3時のおやつにドーナツが出て、しかも指し棒が届かないような画面でのプレゼンでした。緊張した・・・。

明日もおやつを食べに行こうと思います。授業さぼって。

_27(Tue)

コーヒーとブラックブラックで相当気持ち悪かったのも、一回寝れば直った。よかったよかった。徹夜はするもんじゃないな。

ひげを剃ったら派手に唇を切ってしまった。なれないことはするもんじゃないな。

外歩いたら絶対おまわりさんに連れ去られてしまうな、この風情は・・・。ティッシュが邪魔で茶が飲めない。ストローで茶は嫌だな・・・。


(define (f1 f)
  (define (f2) 'f2)
  (f)
  )
(f1 (lambda () (f2)))

Scheme では、このコードはエラー。f2 ってのは、f1 の中からしか参照できない。

(defun f1 (f)
  (defun f2 () 'f2)
  (funcall f)
  )
(f1 #'(lambda () (f2)))

emacs-lisp ではこれはOK。まぁ、そうなるわな。

んで、xyzzy でも、OK。うーん、common-lisp 的にオッケーなんだろうか。

って、そうか。結局 S式を渡して eval してるだけなのか、funcall って。うーん、よくわからん。

うーん、やっぱり scheme がイイナァ。

そうか、#'f と f は違うのか。うーん、不思議だ common-lisp。

(defun mk ()
  (defun f (y) y)
  f)

これが出来ずに悩んだ。

(defun mk ()
  (defun f (y) y)
  #'f)
(funcall (mk) 'test) ;> test

こっちが正解。


明日、見世物になってくるわけですが、なんかネタないかな・・・。


やばい、笑ってしまった。そうか、Amazonに意外なプライバシー漏洩に関する脆弱性が・・・。でも、そもそも X Box あるのかな。


やばい、なんかこの2年間ほど東京都から離れていないことが発覚。ほぼ、学校と家との往復してない。やばい、やばい。研究なんかしてる場合じゃない。


ぉ、日記のトップページが1万ヒット越えてる。というわけで、見事1万番を獲得した 10000 2003-5-27-2-19-57-40 Mozilla/5.0 Gecko rv:1.0.2 Windows NT 5.0 なK社の方、なんか下さい。


まつもとさんのプレゼンテーションを拝見させていただきました。C++ についての言語による曲線が面白かったです。C ってどういう曲線になるのかな。

言語のカッコヨサってなんだろ。やっぱりそれでプログラミングしてると女の人にもてたりする言語なんだろうか。

しかし、やっぱりプレゼンがうまいなぁ。明日の発表でなんか使えないかな(使えません)。


おお、これで中田さんの日常が明らかになっちゃったりするんでしょうか。


python ぜんぜんわかんねー。うわーん。

パイソニックという言葉を初めて知りました。他の言語だと、なんて言うんだろう。


システム設計21円で落札(/.j)。ソフトウェアってやすいんだな・・・。

_26(Mon)

昨日の続き。ちょっと揃えてみると、

(define (myabs  x) (        (if (< x 0)       -  (else  +))  x)   ) ; scheme
(defun   myabs (x) (funcall (if (< x 0)      '-  (else '+))  x)   ) ; xyzzy
 def     myabs (x)  x.send  (if (x.< 0) then :-@  else :+@ end) end # ruby

いや、だから何だ、とか言われるとアレなんですが。揃え方が卑怯な気がしなくもない。

でも、scheme が funcall っぽいことが必要ないってのが目立つ。だからって、

3.(:abs) => 3.__send__ :abs

と解釈して欲しい、とかは誰も思わないんだろうなぁ。

 def myabs (x)  x.(if (x.< 0) ? :-@  : :+@ end) end # not ruby X(

こんなん。

そもそも意味的に違うか、:+@'+ は同じで + は別もん。+ にあたるものは、Schemeにしか無い、のかな。

Perl とかってどうなるのかな。Perl は全然わからない。


勘違い発覚。Scheme において、 values(call/cc (lambda (c) ...)) と同様だと思っていて。


(display
 (let ((c1 values))
   (display 
    (let ((c2 values))
      (display
       (let ((c3 values))
         (c1 3)
         ))))))

(newline)

(display
 (call/cc (lambda (c1)
            (display
             (call/cc (lambda (c2)
                        (display
                         (call/cc (lambda (c3)
                                    (c1 3)
                                    )))))))))

2つのS式は同じモノだと思ったら、結果は(DrSchemeにて)

3#<void>#<void>
3

そうだよなぁ、そうしないと values を特別扱いしないとあかんもんなぁ。values は現在の continuation に対して複数の値を渡すためのもの、かね。


ブラックブラック4袋目。うーむ。


地震コワ。コワ。

_あひる(Mon May 26 02:18:50 JST 2003)

 興味深い...

_ささだ(Mon May 26 02:28:06 JST 2003)

 先生、そのネタは旬が過ぎています!(ぉ

_たはら(Tue May 27 16:54:23 JST 2003)

こんにちは。召喚されてきました。

python で myabs を一行で書く方法を思いつきません。 複数行で書くと全然面白くないですが、こんな感じです。

def myabs(x):
    if x<0:
        return -x
    return x
_ささだ(Tue May 27 17:00:04 JST 2003)

 どうもありがとうございます。やっぱこれ以上無理ですかねぇ。メソッドを if で選択できる、みたいなものがあると面白いと思ったのですが。

_たはら(Tue May 27 19:11:38 JST 2003)

 def myabs(x):return filter(lambda x:x>0, (x,-x))[0] #思いつきました。けど、こういうのはパイソニックじゃないですね。

_ささだ(Tue May 27 21:07:25 JST 2003)

 うーん、何やってるんだかわからない ^^;

_25(Sun)

PukiWiki を導入してみる。

理由。

  • YukiWiki2 を使っていたから
  • YukiWiki2 に機能不足を感じたから
  • インストールが楽そうだった

YukiWiki => PukiWiki のデータの移行は結構楽だった。作業自体は、

  • ファイル名規則(WikiName に [[]] を付加。この仕様変更は腑に落ちん)
  • テーブル規則(行頭に , => カラムを | で囲む)

プラグインとか入れると楽しい、サイドバーが楽しい。動作は意外と速い。BTSプラグインが、どう活用できるかが楽しみ。


学校に来てみるとサーバの不調。外につながらない。調べてみると、ゲートウェイマシンが落ちている。なんで? と思ったらUPSが死んでる。んで、UPSにつながってる機器が全部落ちてる。

なんか、UPSには嫌な思い出ばかりあるな。死ぬなら死ぬで、一人で死んでくれ。


しかし、読書会、RHG も SICP もそうなんですが、やっぱり飲みにまで行かないと面白くないなぁ。全然喋れないし。

Scheme に慣れてしまうと、関数の扱いで emacs とかで混乱。私は xyzzy ですけど。

; for scheme
(define (myabs x) ((if (< x 0) - +) x))
(myabs 3)  ;> 3
(myabs -3) ;> 3

こういうのは emacs とか common-lisp でどうやってかくのかしらん。勉強しないとなぁ。

(defun myabs (x) (funcall (if (< x 0) '- '+) x))

で、いいのかなぁ。

ruby だとこんな感じ?

class Numeric
  def myabs
    0.send((0 > self ? :- : :+), self)
  end
end

p 3.myabs
p -3.myabs

顔文字みたい。こう見ると common-lisp とかみたい。

_あおき(Mon May 26 00:22:59 JST 2003)

 def myabs()__send__(self>0 ? :+@ : :-@) end でしょう

_ささだ(Mon May 26 00:34:13 JST 2003)

 おお、ますます顔文字ちっくに。+@ なんてあるんですね。

_24(Sat)

今日は分数なので私でもわかります。多分。

部品化力ってなんかの発表で言ったら怒られるだろうなぁ、きっと。

コンストラクタとセレクタ(ゲッター)があれば、抽象は完了する。うーん。

やヴぁい、また眠くなってきた。

葉の数を数えるSchemeプログラム。CPS版。shiroさんのより。

(define (count-leaf t) 
  (define (count-leaf-rec t cnt cont) 
    (cond ((null? t)(cont cnt))
          ((pair? t)
           (count-leaf-rec 
            (car t) cnt 
            (lambda (cnt)
              (count-leaf-rec (cdr t) cnt cont))))
          (else (cont (+ cnt 1)))))
  (count-leaf-rec t 0 values))
;  (call/cc (lambda (cont) (count-leaf-rec t 0 cont)))) と同じ

valuescall/cc で、似たような話ってやつ。うーん、values ってのはこういうことだったのか。うう、詐欺くせー。実装依存は話な気がするんだがなぁ。

未だに valuesがわかってないからなんとも言えんが。

Alyssa P. Hacker、いいなぁ。

うーん、飲みに行きたいなあ。


scheme uk

We are a group of Schemers, the majority of whom are in the Greater London region, but including people spread throughout the UK. Our interests cover just about anything vaguely related to Scheme, covering both practical and theoretical aspects.

うーん、Schemers ってのがかっこういいなぁ。日本にもこういうのってないのかなぁ。んで、ときどき合宿やんの。川合さんのところに(結局ハワイ行ってみたいだけかい!)。

_23(Fri)

なんか、前にバカが征くで書かれていたような気がするんだけど、日記システムのが結構統一されてきてますよね。日記システムの統一は、まぁどうでもいいんだけど、テーマ(見た目)がまったく同じなのが困る。

何が困るって、私は記憶力がないから見た目とか色とか雰囲気とか、そういうので誰々の日記だー、そういえばあんなこと言ってたよなー、とか思い出します。

要するに私の頭をもっと良くしてくださいって話。そういえば、人の顔を覚えるのも髪型とかで覚えてしまって、その人が髪切ったりするとわからなくなってしまう罠。あと服装とか。


少し整理。

素材更新 from 幻影素材工房。しかし、このサイト、素材へのアクセスが難しすぎる。いや、ENTER という文字を見つけるのが大変だったというだけですけど。


そういえば明日は sicp 読む日か。一ヶ月が早いなぁ。


さて、コメントの編集機能をつけてみました。人のコメントを改竄できます。さて、どうなるかなー。


某R計画終り。なんか、結局よくわからんまま終わった気が。二酸化炭素どうなったんじゃ。

_nobsun(Fri May 23 18:11:02 JST 2003)

 行頭に*置くとどうなるの。ああやってみたいぃぃ。ぅずぅず

_ささだ(Fri May 23 19:21:42 JST 2003)

 「編集させろ」を見てみるとわかるんじゃないかと思います :)

_あひる(Sat May 24 04:24:35 JST 2003)

 前ミスった奴がいつのまにか修正されている...

_ささだ(Sat May 24 10:16:50 JST 2003)

 なおしたもん。

_22(Thu)

nmake 初心者の話。ruby 1.8 cvs版を mswinでコンパイル、な話。

win32/configure.bat をすると、

### Makefile for ruby mswin32 ###
srcdir = .

MAJOR = 1
MINOR = 8
TEENY = 0
PROCESSOR_ARCHITECTURE = x86
PROCESSOR_LEVEL = 6

# OS = mswin32
# RT = msvcrt
# RUBY_INSTALL_NAME = ruby
# RUBY_SO_NAME = $(RT)-$(RUBY_INSTALL_NAME)$(MAJOR)$(MINOR)
# prefix = /usr
# CFLAGS = -nologo -MD $(DEBUGFLAGS) $(OPTFLAGS) $(PROCESSOR_FLAG)
# CPPFLAGS = -I. -I$(srcdir) -I$(srcdir)/missing -DLIBRUBY_SO=<<CONT>>quot;$(LIBRUBY_SO)<<CONT>>quot;
# STACK = 0x2000000
# LDFLAGS = $(CFLAGS) -Fm
# XLDFLAGS = 
# RFLAGS = -r
# EXTLIBS =

!include $(srcdir)/win32/Makefile.sub

というのを作っていただけます。ここで、RUBY_INSTALL_NAME を、1.8であることがわかるように、次のように変えました。

### Makefile for ruby mswin32 ###
srcdir = .

RUBY_INSTALL_NAME = ruby18d

MAJOR = 1
MINOR = 8
TEENY = 0
PROCESSOR_ARCHITECTURE = x86
PROCESSOR_LEVEL = 6

# OS = mswin32
# RT = msvcrt
# RUBY_INSTALL_NAME = ruby
# RUBY_SO_NAME = $(RT)-$(RUBY_INSTALL_NAME)$(MAJOR)$(MINOR)
# prefix = /usr
# CFLAGS = -nologo -MD $(DEBUGFLAGS) $(OPTFLAGS) $(PROCESSOR_FLAG)
# CPPFLAGS = -I. -I$(srcdir) -I$(srcdir)/missing -DLIBRUBY_SO=<<CONT>>quot;$(LIBRUBY_SO)<<CONT>>quot;
# STACK = 0x2000000
# LDFLAGS = $(CFLAGS) -Fm
# XLDFLAGS = 
# RFLAGS = -r
# EXTLIBS =

!include $(srcdir)/win32/Makefile.sub

nmake をすると、

 ... /ruby/ext/dl/extconf.rb:154:in `initialize': 
     wrong number of arguments(2 for 1) (ArgumentError)
        from C:/ko1/tmp/rubycvs/ruby/ext/dl/extconf.rb:154:in `initialize'
        from C:/ko1/tmp/rubycvs/ruby/ext/dl/extconf.rb:154:in `open'
        from C:/ko1/tmp/rubycvs/ruby/ext/dl/extconf.rb:154:in `update'
        from C:/ko1/tmp/rubycvs/ruby/ext/dl/extconf.rb:163
        from ./ext/extmk.rb:85:in `load'
        from ./ext/extmk.rb:85:in `extmake'
        from ./ext/extmk.rb:227
        from ./ext/extmk.rb:224:in `glob'
        from ./ext/extmk.rb:224
NMAKE : fatal error U1077: '.\miniruby.exe' : リターン コード '0x1'

RUBY_INSTALL_NAME = ruby18d の書く位置を PROCESSOR_LEVEL = 6 の下に置いたら、エラーが出ずに通りました。

世の中には不思議が一杯です。

また、RUBY_INSTALL_NAME の位置が一番上でも、なかださんに教えていただいた、ruby-dev:20265のパッチをあてる方法でもエラーが出ませんでした。

こういうものは見なかったことにするのが一番、なんでしょうかね。


うーん、朝日が・・・。

あと1時間。


オブジェクトの広場 6月号。今月はあの川合史朗さん。なぜかずっと河合さんだと思ってた。

最近 rucheme 触ってないなぁ・・・。


現実逃避に文字が化ける原因を探してみよう。

原因はわかった(URLな文字列に URI.escape をかけていただけ)が、対処方法がわからん。なんで URI.escape をかけていたかというと、変なリンク貼れないように、ということだったんだけど、% を %25 にしてしまうなぁ。どないしよ。

  require 'uri'
  def validuri uri
    begin
      URI::parse uri
    rescue
      uri = '#'
    end
    uri
  end

結局こんなふうにしてみる。発見が遅れるかもしれんから、素直に例外を投げてしまったほうがいいのかもしらんなぁ。うーん。


ネットワークにつながらない原因がケーブルがささってなかったってオチ。よくあることですね・・・。

(う)(Thu May 22 19:18:00 JST 2003)

 RUBY_INSTALL_NAMEの件は再現できませんでした。謎。

ささだ(Thu May 22 19:55:03 JST 2003)

 今ノートPCでやってみたんですが、再現しませんでした。見なかったことにしたほうが良さそうですね。

お名前 / 一言
もっと書かせろ / 編集させろ

_21(Wed)

初めてホイホイさんを見て、かっこいー、とか思う夜中。

S/390 って結局どうなったのかな。オークションページにアクセスできないし。


肩とか、体中が重い・・・。なんか変なもん憑いてきたんかなぁ・・・。


p take(10,zip inflist(2){|x|x+1},inflist(3){|x|x-1})
#=> syntax error

というのは、ruby 1.8 だとエラーになるんですねぇ。

cond = yield(car lst)
#=> warning: parenthesize argument(s) for future version

これが警告。ふむふむ。Lispは嫌い、と(違)

1.6 ばっか使ってちゃだめだなぁ。これから 1.8 を使うようにしようか。


はて、Google でホイホイさんをひいたリンクが変。どこの問題だろう。う、エスケープしてるところの問題か。どこでエスケープしたんだろう。CGIでひっぱってきたときにそのままになってるのかな?


道化は嫌です。道化なら、せめて自分が道化だと気づかせないで。

そのたった一言があれば道化にならずにすんだのに。


おにいちゃんMLって、いったいなにをするのだろう・・・。兄としてのあるべき姿を探求する、とか。兄の呼び方について、その新しい方式の模索や従来の方式との研究、評価を行い、文化人類学的な(略)。

とりあえず、128人までは大丈夫にして下さい(何を)。

あ、兄 -> 妹、という発想からして駄目なのか、もしかして。

なかだ(Wed May 21 22:36:43 JST 2003)

 兄貴としてのあり方、では。ポージングとか。

ささだ(Wed May 21 22:40:38 JST 2003)

 ああ、なるほど、それは出てこなかったです。

さかい(Thu May 22 11:25:40 JST 2003)

「おにぃちゃん」というのは現在富士ゼロックスと共同研究をしている某プロジェクトのコードネームです。……なんて事はなくて、ある人物の仇名で「兄 -> 妹、という発想」は極めて正しかったりします。(^^;

お名前 / 一言
もっと書かせろ / 編集させろ

_20(Tue)

うーん、寝すぎた。あぁ、登校拒否したい。


世界のインターネット放送ガイド。たくさんあるなぁ。今更なんですが、ライブでインターネットラジオをやっているところがあるんですね。日本では他にあるのかな。

英語のなんかをダラダラ聞いていたら、英語に馴れるかなー、とか思っていたら、聞き流す癖がついてしまいそう。なんか英会話ができるようになる手はないものか。


Google で RAA でさくっとひけないのは不便(Google依存症)

簡単に使える diff と、簡単に使える ruby script への色付ける何か、を探したいのだけれど、どうもコレというのがみつからないな。tikiのソースでもパクらせて使わせてもらおうかなぁ。


なんで楕円曲線の話がでてくるのかなー、とずっと不思議だったんですが、そうか、x**n+y**n の形か。いや、n=2 しか知らないんですけど。


なぜか体が震えて止まらない。別に風邪のようでもなく、酒や薬が切れたとか、そういうことでは多分ないと思うんだけど。はて?

nobsun(Tue May 20 20:58:06 JST 2003)

 英語しか話せない相手と燃えるような恋とか。

ささだ(Tue May 20 21:32:26 JST 2003)

 ぜひ紹介してください(違)

笹川 賢一(Tue May 20 23:26:17 JST 2003)

 武市先生の論文コピーもっていくね。全数探索しかないのか?

お名前 / 一言
もっと書かせろ / 編集させろ

_19(Mon)

今日、4時のupdatedbが気になって、 /etc/cron* を見ていたら、webalizerという存在を初めて知りました。毎晩毎晩アクセス解析をやっていたことにショック、というか、それを httpd で全開に公開していたことにショック。うぁ、ファイル名まで並べてる・・・、やべー。URLを一般に公開していなかったのが救いか。やっぱ、なんちゃってサーバは怖いなぁ・・・。

うーん、これって常識なのかなぁ。常識なような気もするなぁ。きっと、まだまだ知らないことがあるに違いない。いや、ASUMIさんなんですが。

S390 でcvsサーバとかやらないんだろうか、とかふと思ってみる。


The Athene Operating System(/.)。商用なんだ。こういう商売も面白いな。


今日もTAだったんですが、いろんな人が居て面白い。

C マガジン、いつのまにか6月号出てるし。先月の全然読んでないよ・・・。


「時間がないから」というのは、「それをするために時間がとれないから」、つまりは「そんなことをするための時間なんぞ取らん/取れんから」という意味で。もちろん免罪符になるものじゃなく、自分の中の優先度について、その用件がどの位置にあるのか、ということを相手に伝える行為に他ならないわけで。


よくわからないものについては渋い顔をして、得になりそうになったら前からそれを応援していたような顔をして、協力を惜しまない、みたいなことを言う。賢いなぁ。


すみません、愚痴ばっか。あぁ、時間が無い(ぉ。

勿論自戒です。自戒。特定の何があるわけではありません。多分。

お名前 / 一言
もっと書かせろ / 編集させろ

_18(Sun)

S390、51万円だと、もう手が出ないなぁ・・・。どこまで上がるのかな。


機動警察パトレイバー THE MOVIE3 WXIII を見てみる。何がいいたいのかようわからんなぁ。

み(Sun May 18 17:41:40 JST 2003)

 欲しい[気はする]*けど、ネットオークションなんて絶対**伝票受け付けないよな

ささだ(Sun May 18 20:08:38 JST 2003)

 2,3万のころだったらしゃれで買えたんですけどねぇ ^^;

お名前 / 一言
もっと書かせろ / 編集させろ

_17(Sat)

ko1@lalune:~/tmp/gcc-3.3$ time make
(略)
real    131m13.523s
user    108m50.950s
sys     18m47.290s

2時間かー。殆ど gcj の実行だった気がする。


たくさん寝る。朝寝て、昼に寝て、夜にも寝るかもしれない。


各所で話題になっている(らしい)、オークション至上最大!?IBM S/390。うーん、是非学校で買って貰えないかなぁ。まだ実物をお目にかかったことがないんで、見てみたいなぁ。

この値段なら、個人で買ってもいいけど、置くところ無いしなぁ。


WebDAV でファイルを置くと、umask 067な状態。うーん、この設定を変える方法は無いものか。なんか、Google様に聞いたらソース書き換えろとか書いてあるし。RPMで入っている私のマシンにどうしろと。

put には umask 設定するところがあるのになぁ。こういう利用用途は考えていないんだろうか。


最近地震が多いなぁ・・・。

お名前 / 一言
もっと書かせろ / 編集させろ

_16(Fri)

森山和道の「ヒトと機械の境界面」。メモ。

情報処理学会の情報処理2003 Vol.44 No.5 Rubyの真実 を見ました。さすがにこういうところではお名前は漢字なのですね。ネイティブスレッドと共存できる保守的なガベージコレクションを移植性を高くして実装できるもんなのかな。どうやるんだろう。

eval.c は何度も挑戦しては敗れ、って感じなのですよね。ヨワ。というか、私はなんのために RHGを持ってるんだ、って気がする。


なんか、アレなんで(謎)、gcc3.3 を ./configure ; make してみたんだけど、終わらない。全然終わらない。

延々と何やってるのかと思ったら、gcj で *.java をコンパイルしてる。うーん、さすが。

libjava/java/lang/Object.java の最初のコメントが笑った。

// Object.java - The root of all evil.

nobsun(Fri May 16 15:23:44 JST 2003)

 しかも、読んでる真最中というプレッシャー:-)

なかだ(Fri May 16 16:15:32 JST 2003)

 block_pass()だろうってことは分かったんですけどねぇ。eval.cはなかなか。

お名前 / 一言
もっと書かせろ / 編集させろ

_15(Thu)

ほんとうは、eval.c のコードを見てから投稿しようかとか思ったんですが、見てもよくわからないんで投げました・・・。すんません・・・。

今週のPrologはProlog で関数型言語を実装しよう、というもの。型のないMLみたいな感じ。うー、難解。APL ってこんな言語なんですか。

というわけで、お酒のみに行ってきます。

お名前 / 一言
もっと書かせろ / 編集させろ

_14(Wed)

んー、どうやったら mod 6 な条件を試せるのかな。ちっちゃい順にするには、結局三乗和を求めなければならないし。

まずいー、ゼミの準備が全然できてないー。Ramanujan を解いてましたー(というか、解法をRubyとschemeに落としてました)って書くのもアレだしな。一応OS研究室だし。

SPECInt のアプリケーションの名前の 164.gzip とかの、164 っていう数字はいったい何を表しているんだろう。うーむ。

なんというか、さぼっていた分のいろいろな用事が襲ってくるー。

[ruby-talk:71386]、おお、まつもとさんの説明綺麗だ・・・。

しかし、ruby-talk って、なんでSubjectに通し番号とかのヘッダが付かないんだろう。


あのHaskellのコード を大体そのまま ruby におとしました。

def f x
  x[0]**3+x[1]**3
end

def fsort k
  r = [[k,k]]
  j = k
  prc = lambda{
    j+=1
    [[k,j],prc]
  }
  
  r.push lambda{
    fmerge(prc,fsort(k+1))
  }
end

def fmerge xs,ys
  if xs.kind_of? Proc
    x,xs = xs.call
  else
    x,xs = xs
  end

  if ys.kind_of? Proc
    y,ys = ys.call
  else
    y,ys = ys
  end
  if f(x) <= f(y)
    [x,lambda{fmerge xs,[y,ys]}]
  else
    [y,lambda{fmerge [x,xs],ys}]
  end
end


def ramanujan r
  b,r = r
  r = r.call
  found = 0
  while found < 100
    a,r = r
    #p a
    r = r.call
    if f(a) == f(b)
      p "#{a.inspect},#{b.inspect}"
      found += 1
    end
    b = a
  end
end

ramanujan fsort 1

さすがに長くなるなぁ・・・。というか、何やってんだ、俺。

def f x; x[0]**3+x[1]**3 ; end
def inc1(k)
  j = k
  prc = lambda{k+=1;[[k,j],prc]}
end
def fsort k
  [[k,k],lambda{fmerge(inc1(k),fsort(k+1))}]
end

def fmerge xs,ys
  x,xs = (Proc === xs) ? xs.call : xs
  y,ys = (Proc === ys) ? ys.call : ys
  f(x) <= f(y) ? 
    [x,lambda{fmerge xs,[y,ys]}] :
    [y,lambda{fmerge [x,xs],ys}]
end

def ramanujan r
  b,r = r
  r = r.call
  found = 0
  while found < 100
    a,r = r
    r = r.call
    if f(a) == f(b)
      p "#{a.inspect},#{b.inspect}"
      found += 1
    end
    b = a
  end
end

ramanujan fsort 1

なんというか、無理やり短くしてみる。

ramanujan 自体の短縮はめんどうになったんでヤメ。zip 書くとしたらどうなるかな・・・。


調子に乗ってみる。Ruby で Haskell っぽく。

def inflist x,&b ; lambda{[x,inflist(b.call(x),&b)]}   ;end
def car(lst)     ; car,cdr = (Proc === lst) ? lst.call : lst ; car ; end
def cdr(lst)     ; car,cdr = (Proc === lst) ? lst.call : lst ; cdr ; end
def zip(xs,ys)   ;[[car(xs),car(ys)],lambda{zip cdr(xs),cdr(ys)}]  ; end

def take n,lst
  r = []
  n.times{
    r  << car(lst);lst = cdr(lst)
  } ; r
end

def filter lst
  cond = yield(car lst)
  while !cond
    lst = cdr lst
    cond = yield(car lst)
  end
  [car(lst),lambda{filter cdr(lst),&proc}]
end

# take 10 zip([2..],[3,2..])
p take(10,zip inflist(2){|x|x+1},inflist(3){|x|x-1})
# take 10 [x| x<-[0..], x % 2 == 0]
p take(10,filter(inflist(0){|x| x+1}){|x| x % 2 == 0})

ramanujan のアレを、こいつで解いてみる。


def inflist x,&b ; lambda{[x,inflist(b.call(x),&b)]}   ;end
def car(lst)     ; car,cdr = (Proc === lst) ? lst.call : lst ; car ; end
def cdr(lst)     ; car,cdr = (Proc === lst) ? lst.call : lst ; cdr ; end
def zip(xs,ys)   ;[[car(xs),car(ys)],lambda{zip cdr(xs),cdr(ys)}]  ; end

def take n,lst
  r = []
  n.times{
    r  << car(lst);lst = cdr(lst)
  } ; r
end

def filter lst
  cond = yield(car lst)
  while !cond
    lst = cdr lst
    cond = yield(car lst)
  end
  [car(lst),lambda{filter cdr(lst),&proc}]
end

# take 10 zip([2..],[3,2..])
#p take(10,zip inflist(2){|x|x+1},inflist(3){|x|x-1})
# take 10 [x| x<-[0..], x % 2 == 0]
#p take(10,filter(inflist(0){|x| x+1}){|x| x % 2 == 0})

def f x; x[0]**3+x[1]**3 ; end
def fsort k
  [[k,k],lambda{fmerge(inflist([k,k+1]){|x| [k,x[1]+1]},fsort(k+1))}]
end

def fmerge xs,ys
  x = car(xs); xs = cdr(xs)
  y = car(ys); ys = cdr(ys)
  f(x) <= f(y) ? 
    [x,lambda{fmerge xs,[y,ys]}] :
    [y,lambda{fmerge [x,xs],ys}]
end

#p take 20,zip(fsort(1),cdr(fsort(1)))
p take 10,filter(zip(fsort(1),cdr(fsort(1)))){|x|  f(x[0]) == f(x[1]) }

おわりませーん。誰か、いいマシンを持っている人試してください(笑)。


単純な勘違いかと思っていたら、なんか根がふかそう?

def f x
end
def m x
  b = proc
  f yield,&b
end

prc = m(3){|x|
  p 'test1'
}

これは通らない。1.6.8 だと segv する。上でも、エラーが出る?

確認しようとしても、コンパイルにはautoconf のバージョンアップが必要らしい。めんどいなぁ。コンパイル済みのをもってくるか。

def f x
  yield
end
def m x,&b
  f(b.call,&b)
end

prc = m(3){|x|
  p 'test1'
}

これで回避。しかし、なんで?

追試。

def f x
  yield
end
def m x
  f(proc.call,
    &proc)     # 7行目
end

prc = m(3){|x|
  p 'test1'
}

#=> Exception `ArgumentError' at c:/ko1/src/rb/t.rb:7 
      - tried to create Proc object without a block

うーん、なんか知らない概念があるんだろうか。

[ruby-dev:12311] までの議論ってことなんだろうか? 最新版入れて試そうっと。

kjana(Wed May 14 14:40:20 JST 2003)

 付けないでという要望が多かったから。海外ではそれがふつうらしい。

kjana(Wed May 14 14:41:36 JST 2003)

 さらに comp.lang.ruby とのゲートウエイもあるってことで。

maya(Wed May 14 16:35:28 JST 2003)

 背景は分かりませんが、fmlでは付けないのが推奨されてますね。自分は付ける設定してますけど:-p

ささだ(Wed May 14 18:38:49 JST 2003)

 なるほど、価値観の違い、なのかなぁ。NetNews は使ったことがないのでよくわかりませんが。

はら(Wed May 14 21:59:28 JST 2003)

 おお、ruby-math へどうぞ。

ささだ(Wed May 14 23:24:32 JST 2003)

 明日、学校に行ったら投稿してみます。

お名前 / 一言
もっと書かせろ / 編集させろ

_13(Tue)

誰かscheme版でもっと素敵な解法書いてくれないかなー。

ふと、require_from 'http://nantoka/kantoka.rb' とかいうのがあると面白いかも、とか思ってみる。proxyとかあると面倒そうだなぁ。

[ruby-math:00859] より。

なるほど、A**3 + B**3 == C**3 + D**3 なら A + B ≡ C + D (mod 6)

なんでー、なんでなんでー。数学はわからなーいー。


掲示板のほうに笹川さんに研究日誌、と言われてなんのことか全然わからなかった。ヤヴァイ、全然研究のこと書いてないぞ。

でも、研究のことは、いろいろ書けないことも多そうなんだけど。うーん、どうなのかな。そもそも研究なんてやってるのか、という噂もあるが。


あぁ、MD5まで、さすがでございます。さすがに net-require のrequire はネットではできない、と。


恥ずかしながら、合同の定義からして覚え違いをしておりました。いやー、はっはっは(笑い事じゃない)。やっと理解できました。

Haskell版の答え、やっと理解できた。そうか、遅延リストの遅延リストを作ってるのか。2次元に広がっていくリスト?


曰く「貧乏人は unless を使え」だそうです。(これだけじゃ全然わかんねーな)

私はこれから if を捨てないといけないのかー(違)。


class Hue;end
class Hoe < Hue
  def m; p '1' ;end
end
class Hoe < Hue
end
p Hoe.ancestors
Hoe.new.m

#=> ok

class Hue;end
class Hoe < Hue
  def m; p '1' ;end
end
class Hoe < Object
end
p Hoe.ancestors
Hoe.new.m

#=> error

ふむふむ。


要するに、「貧乏人はelseを使うな」ということらしいです(さらに違う)。

ぼーっと考えていたんですが、ruby って def =(v) ってできないんですね。いや、あたりまえっちゃぁあたりまえですけど。自分的にはヒットだったもんで、つい。

いや、C++ じゃできたよなー、なんでRuby でできないんだろー、とぼけーっと考えていただけなんですが。'=' はオブジェクトへなんかするわけでなく、変数(いれもの)に対してなんかするもん、と。

リファレンスを仮想化するような言語ってないんだろうか。(C?(笑))


架空風景「遺書」。やばい、笑いすぎた。

Io(ruby-talk:71331)。言語がどうの、というより、ページのデザインが素敵。BNF からああいう図を作るソフトってのがあるんじゃろうか。

やまだあきら(Tue May 13 18:33:13 JST 2003)

 これはどうでしょうか: http://raa.ruby-lang.org/list.rhtml?name=net-require

はら(Tue May 13 18:55:20 JST 2003)

 mod 2 でも mod 3 でも x**3 ≡ x だからです。

笹川 賢一(Tue May 13 21:12:10 JST 2003)

 ヒントをありがとうございました。(^^)

お名前 / 一言
もっと書かせろ / 編集させろ

_12(Mon)

タクシーかけご飯が昨日から頭から離れず、眠れないのでちょこちょこと。

問題の定義を明確にしておくと、a,b,c,d は自然数で、a<c<d<b とする。で、x = a**3 + b**3 == c**3 + d**3 となる x を、小さい順に求める。また、x を作る a,b,c,d も同時に答える。ということにしておく。

とりあえず ruby でこちょこちょと。

def sumcube e
  e[0]**3+e[1]**3
end

def taxi_nums n
  b = yield ; found = 0
  while found < n
    a = yield
    #puts "#{a.inspect} => #{sumcube a}"
    if sumcube(a) == sumcube(b)
      a,b = b,a if a[0] > b[0]
      puts "#{a.inspect} , #{b.inspect} => #{sumcube(a)}"
      found += 1
    end
    b = a
  end
end

queue = [[9,[1,2]]]

taxi_nums(30){
  r = queue.shift
  queue << [r[0],r[1]+1]
  queue << [r[0]+1,r[1]] if r[0]+1 < r[1]
  
  queue.sort!{|a,b|
    sumcube(a) <=> sumcube(b)
  }
  queue.uniq!
  r
}

うーん、まだまだ長いし非効率だ。セミコロンつかってるのは卑怯かなぁ。

というか、状態を持つってこと自体、これをそのままschemeに落としたらまずい気がする。

・・・queue を引数で渡してしまえばいいんかな。


def sumcube e
  e[0]**3+e[1]**3
end

def taxi_nums n
  b = yield ; found = 0
  while found < n
    a = yield
    #puts "#{a.inspect} => #{sumcube a}"
    if a[0] == b[0]
      a,b = b,a if a[1][0] > b[1][0]
      puts "#{a.inspect} , #{b.inspect} => #{a[0]}"
      found += 1
    end
    b = a
  end
end

queue = [[1,2]]

taxi_nums(30){
  r = queue.shift
  a = r[1][0]
  b = r[1][1]
  c = [a,b+1]
  queue << [sumcube(c),c]
  if a+1 < b
    c = [a+1,b]
    queue << [sumcube(c),c]
  end
  
  queue.sort!{|a,b|
    a[0] <=> b[0]
  }
  queue.uniq!
  r
}

22秒から3秒。って、これは前がひどかっただけな気が・・・。uniq 外せれば速くなるんだろうけどなぁ。

def sumcube e
  e[0]**3+e[1]**3
end

def taxi_nums n
  b = yield ; found = 0
  while found < n
    a = yield
    #puts "#{a.inspect} => #{sumcube a}"
    if a[0] == b[0]
      a,b = b,a if a[1][0] > b[1][0]
      puts "#{a[1].inspect} , #{b[1].inspect} => #{a[0]}"
      found += 1
    end
    b = a
  end
end

queue = [[9,[1,2]]]

taxi_nums(30){
  r = queue.shift
  a = r[1][0]
  b = r[1][1]
  c = [a,b+1]
  queue << [sumcube(c),c]
  if a+1 == b
    c = [a+1,b]
    queue << [sumcube(c),c]
  end
  
  queue.sort!{|a,b|
    a[0] <=> b[0]
  }
  r
}

2秒。あとはsortが速くなることを期待するだけ(ぉ。rubyの組み込みソートが何使ってるか知らんけど。priority queue を作ろうかと思ったけど血迷ってるよなぁ、と考えて辞め。

記念(何の)に、100個答え。を書いていたのだけど、あまり面白くないので削除。


児玉さんの priority queue for Ruby. を利用したら、30個を0.5秒。100個を2秒。ハヤ。

GHC だともっと速かったりするのかしらん。


[ruby-math:00851] Ramanujan Number。お、たいむりー?

if a+1 == b じゃなくて a+2 だなぁ・・・。


priority queue 利用版も書いておこうっと。

def sumcube e
  e[0]**3+e[1]**3
end

def taxi_nums n
  b = yield ; found = 0
  while found < n
    a = yield
    #puts "#{a.inspect} => #{sumcube a}"
    if a[0] == b[0]
      a,b = b,a if a[1][0] > b[1][0]
      puts "#{a[1].inspect} , #{b[1].inspect} => #{a[0]}"
      found += 1
    end
    b = a
  end
end

require 'pqueue'
queue = PQueue.new lambda{|x,y|
  x[0] < y[0]
}
queue.push [9,[1,2]]

taxi_nums(30){
  r = queue.pop
  a = r[1][0]
  b = r[1][1]
  c = [a,b+1]
  queue.push [sumcube(c),c]
  if a+2 == b
    c = [a+1,b]
    queue.push [sumcube(c),c]
  end
  r
}

pqueue.rb内、微妙に loop をつかうと遅いっぽいので、while true ; ... ; end に書き換えた。


今TA(さすがにTerminalAdapterはできないですが。2台あるんだけど、今売っても捨て値だよなぁ・・・)やってるんですが、Javaの実験で。いやー、なんかソースが書ける、わかるって凄いなぁ。


ruby-math に投稿してみようかとか思ったけどなんかネタ晴らしになりそうなのでやめとこう。


で、ですねぇ。RHG飲み会をさぼったのは(金が無いのと)ケースを買いに行くためだったんですよ。

というわけで、ケースを買いました。自宅サーバ用ケース。今までは電源込みで5000円。店頭で投売りのアレです。

今度はちゃんとしたやつを買いました。3.5インチベイが6個も入ります。電源も別々に買いました。ケースファンについても、初めてその存在を知りました。しかも、前面にも着けられるらしいです。というわけで、着けました。

・・・前面ファンうるせー。夏まで止めとこう。

金が無いのでSICP飲み会も微妙な感じが。うーん、どうしようかな。飲み会に行かない代わりに K本さんに言語処理系の講義をしてもらったりなかったり。


編集追加、っと。


scheme版がやっと出来た。

; ((sum-of-cube a . b) ...)
(define (taxi-numbers)
  (define (sumcube a b) (+ (expt a 3) (expt b 3)))
  (define (insert lst e)
    (if (or (null? lst) (>= (caar lst) (car e)))
        (cons e lst)
        (cons (car lst) (insert (cdr lst) e))))
  ; next list
  (define (next lst e)
    (let ((a (car e)) (b (cdr e)))
      (insert (if (= (+ a 2) b)
                  (insert lst (cons (sumcube (+ a 1) b) (cons (+ a 1) b))) ; then
                  lst) ; else
              (cons (sumcube a (+ b 1)) (cons a (+ b 1))))))
  (define (iter lst b)
    (let ((a (car lst)))
      (if (= (car a) (car b))
          (cons (cons (cdr a) (cdr b)) (lambda () (iter (next (cdr lst) (cdr a)) a)))
          (iter (next (cdr lst) (cdr a)) a))))
  (iter '((28 1 . 3)) '(9 1 . 2)))

(define (display-taxi-nums max)
  (define (iter lst m)
    (if (= 0 m)
        #t
        (begin
          (display (car lst)) (newline)
          (iter ((cdr lst)) (- m 1)))))
    (iter (taxi-numbers) max)
  )

(display-taxi-nums 1000)

なんか、根本から考え方が間違えてる気がしなくもない。自分でも全然よみずらすぎるし。


NArray って、ウワ・・・それは卑怯じゃ。しかし、こんなのがあるんですね。今度使おうっと。

なんつうか、数学の理論屋さんと、代数屋さんの違いなんだろうか。

nobsun(Mon May 12 17:04:34 JST 2003)

 GHCしても速くならんでしょうなぁ。hugs よりは速いという程度でしょう

笹川 賢一(Mon May 12 19:05:17 JST 2003)

 SICP第2章の写像の入れ子がタクシーの雰囲気に似てますね。

はら(Mon May 12 19:25:32 JST 2003)

 ぜひ ruby-math に送ってください。複数パターンで。明日ならもういいでしょう。(^^

はら(Mon May 12 19:26:43 JST 2003)

 笹田さんのこのページ、ウチの大学からアクセスできません。もしかして、*.ac.jpをはねてる?(^^;

ささだ(Mon May 12 19:42:20 JST 2003)

いや、そんな素敵な設定はしてないはずなんですが。というか、これCGIじゃなくてHTMLなので、弾くならサーバ側でしか無理です(.htaccessも置いてないし)。当研究室のトップページからも、弾かれますでしょうか?

ささだ(Mon May 12 19:54:49 JST 2003)

 というか、*.ac.jp禁止にしたら、自分のところから見れません(笑)

お名前 / 一言
もっと書かせろ / 編集させろ

_11(Sun)

RHG楽しかったです。

お家に帰って RWiki に書き込むまでが読書会です。

ということらしいんで、飲み会の報告楽しみにしてます。


たむらさんから。

GNome とか KDE が無いのは何故>GUI

GNOMEとかKDEって、プラットホーム非依存って考えてもいいんでしょうか?

GTK+ って前挫折した覚えが・・・(そればっか)。今度頑張ります。


Ramanujan のtaxi数。そういえば、学校そばの中華料理屋にタクシーかけご飯、というのがあったんですが、あれはいったいどういう意味なんでしょうか。

すごいかっこわるいんですが、なんというか、馬鹿正直にやった奴。taxi数を作る4つの自然数を求めるもの、だから、taxi-numbers という名前はいけないんだろうな、きっと。

(define (taxi-numbers)
  (define n 0)
  (define max 100)
  (define cont #f)
  (define (cube x) (expt x 3))
  (define (is-taxi-number a b c d)
    (if (or (= a b) (= a c) (= a d)
            (not (= (+ (cube a) (cube b))
                    (+ (cube c) (cube d)))))
        #f #t))
  (define (taxi-iter a b c d)
    ;(display (list a b c d)) (newline)
    (if (is-taxi-number a b c d)
        (cons (list a b c d) (delay (apply taxi-iter (taxi-next a b c d))))
        (apply taxi-iter (taxi-next a b c d))))
  (define (taxi-next a b c d)
    (if (< (+ c 1) d) (list a b (+ c 1) d)
        (if (< (+ d 1) b) (list a b (+ a 1) (+ d 1))
            (if (< (+ b 1) max) (list a (+ b 1) (+ a 1) (+ a 2))
                (list (+ a 1) (+ a 1) (+ a 2) (+ a 3))))))
  (taxi-iter 1 4 2 3)
  ;(is-taxi-number 2 16 9 15)
  )

(define (display-taxi-numbers lst)
  (display (car lst)) (newline)
  (display '--------------) (newline)
  (display-taxi-numbers (force (cdr lst))))

(display-taxi-numbers (taxi-numbers))
;(taxi-numbers)

結果。

(1 12 9 10)
--------------
(2 16 9 15)
--------------
(2 24 18 20)
--------------
(2 34 15 33)
--------------
(2 89 41 86)
--------------
(3 36 27 30)
--------------
(3 60 22 59)
--------------
(4 32 18 30)
--------------
(4 48 36 40)
--------------
(4 68 30 66)
--------------
(5 60 45 50)
--------------
(5 76 48 69)
--------------
(6 48 27 45)
--------------
(6 72 54 60)
--------------
(7 84 63 70)
--------------
(8 53 29 50)
--------------
(8 64 36 60)
--------------
(8 96 72 80)
--------------
(9 34 16 33)
--------------
(9 58 22 57)
--------------
(10 27 19 24)
--------------
(10 80 45 75)
--------------
(11 93 30 92)
--------------
(12 40 31 33)
--------------
(12 51 38 43)
--------------
(12 96 54 90)
--------------
(15 80 54 71)
--------------
(17 39 26 36)
--------------
(17 55 24 54)
--------------
(17 76 38 73)
--------------
(18 68 32 66)
--------------
(20 54 38 48)
--------------
(20 97 33 96)
--------------
(23 94 63 84)
--------------
(24 80 62 66)
--------------
(24 98 63 89)
--------------
(29 99 60 92)
--------------
(30 67 51 58)
--------------
(30 81 57 72)
--------------
(34 78 52 72)
--------------
(35 98 59 92)
--------------
(42 69 56 61)
--------------
(47 97 66 90)
--------------
(50 96 59 93)
--------------
(51 82 64 75)
--------------
(以下略)

すげーダセー。終了条件とか無いし・・・。しかし、a が小さいならtaxi数も小さい、って考えちゃっていいんだろうか。

さて、これからどうやって綺麗にしていこうか。そもそもアルゴリズム替えないと駄目やなぁ。

(define (taxi-numbers)
  (define n 0)
  (define max 100)
  (define cont #f)
  (define (cube x) (expt x 3))
  (define (is-taxi-number a b c d)
    (if (or (= a b) (= a c) (= a d)
            (not (= (+ (cube a) (cube b))
                    (+ (cube c) (cube d)))))
        #f #t))
  (define (taxi-iter a b c d)
    ;(display (list a b c d)) (newline)
    (if (is-taxi-number a b c d)
        (cons (list a b c d) (delay (apply taxi-iter (taxi-next a b c d))))
        (apply taxi-iter (taxi-next a b c d))))
  (define (taxi-next a b c d)
    (if (< (+ c 1) d) (list a b (+ c 1) d)
        (if (< (+ d 1) b) (list a b (+ a 1) (+ d 1))
            (if (< (+ b 1) max) (list a (+ b 1) (+ a 1) (+ a 2))
                (if (> a max)
                    (begin
                      (set! max (+ max 50))
                      (list 1 a 2 3))
                    (list (+ a 1) (+ a 1) (+ a 2) (+ a 3))))))
  (taxi-iter 1 4 2 3)
  )

とりあえずこれで全部は求まりそうだけど、ソートはされないよなぁ・・・。

というか、begin とか使い出してる時点で負けって気がしないでもない。


うん、やらなきゃいけないアルゴリズムはわかってるはず。多分。

(a b) で、 a < b で、a**3+b**3 の小さい順を全て並べて、隣り合ったそいつらがtaxi-number かどうかをみればいい、と。はら先生があおきさんところで示しておられた東大のpdfに書いてあった奴そのままですけど。でも、Haskellが読めないのでどうやってるのか知りません(とか言う)。どうやってつくろーかなー。明日の授業中にでも考えてみよう。

さかい(Sun May 11 15:49:24 JST 2003)

 gtk+は2なら標準でx11,win32,linuxfbに対応してます。あとDirectFBへの移植なんかもあります。

ささだ(Mon May 12 19:57:36 JST 2003)

 知らない単語ばっかりです。ごめんなさい・・・。

お名前 / 一言
もっと書かせろ / 編集させろ

_10(Sat)

FlashMX なもの、楽しみにしてます :)


現状で、Rubyで使えるプラットホーム非依存なGUIフレームワークをあげると、

  • FxRuby
  • WideStudio
  • WxWindows

2D描画だけで考えれば、

  • Ruby/SDL

とか見てるとOpen Media Toolkitがオープンソース化 という記事が。

世の中にはもっといろいろあるんだろうなぁ。これらの得失を考えるためには、やっぱり全部使ってみなくちゃいけないんだろうなぁ。そういう偉い人のページとかないものかな。


第 289 回 PTT のお知らせ 題名: Windows PCのためのGUI情報の抽出と転送 - 机から離れてPCを使おう

VNC じゃ駄目ってことなんだろうなぁ。最終的にはMS社員からリークしてもらう、とかいうお話が聞けるんだろうか。ドキドキ。

しかし、GUI操作情報を抽出してPDAに転送してPCリモコン、っていう表現、リモコンならこの逆なんじゃなかろうか、とか思ったんだけど、どうなんだろうか。

PC側にサーバひとつおけばおしまい、とかいう簡単な話じゃ無いんだろうなぁ。

たむら(Sat May 10 12:18:51 JST 2003)

 GNome とか KDE が無いのは何故>GUI

お名前 / 一言
もっと書かせろ / 編集させろ

_9(Fri)

車輪の再発明をしてみた。

うう、ちょいちょい直せばできるだろう、とか思ってたら、存外時間がかかってしまった・・・。一日仕事になってしまった。tDiaryが流行る訳です(笑)。

バグをおって時間がかかったのかな・・・。

  • 既存のものとのすり合わせ
  • はじめてのしーじーあいぷろぐらみんぐ
  • rexml を利用した日記管理(嘘っぽ・・・)
  • 機能の取捨選択

とかはあったけど、やっぱりバグ追うのが時間かかったんだろうなぁ。

がーん、うまく行ってないし。直さないと・・・。よし、直った(ほんとかな)

しかし、ほんまどこで時間食ってたんだろう。CGIで、エラーメッセージが出せなくてすげー困ったんだよな、多分。そうか、自分ちのサーバでやればよかったのか・・・。普通に家に帰って・・・。

あかん、脆弱性ありすぎ・・・。

あと、エディタから直接更新する方法を考えなきゃ。


たむらさんありがとうございます。OpenBlocks がんばってください。

index.html を更新するタイミングで悩む。どうしたもんかな。


なんか、 rhg-tokyo@ruby.quickml.com へメールしても、なぜか投げられなかった送信に2時間かかったか。


いいな、沖縄。


SKKx => Kx(Kx) => x => Ix か。

[x](xax) => S([x](xa))([x]x) => S(S([x]x)(x[a]))I => S(SI(Ka))I

S にするのがよくわからんな。

[x](xa) => S([x]x)([x]a) => SI(Ka)

xa というのは、x(a) という理解でいいんだっけか・・・。

俺にはunlambdaは無理ってことで。


すげーけんか腰だなぁ・・・。怖い・・・。


今日買った本。

微妙に高かった(¥1900)。


書き途中のウィンドウを閉じてしまった。ウェブ上で日記の編集ってウザスギル。早くなんとかしなくては。

perl から exec('ruby ..') は、perl の ircクライアントサーバである madoka でやってた気がする(google のアレ)。しっかし、編集機能つけてから帰ればよかったなぁ。

_たむら(Fri May 09 02:14:53 JST 2003)

 おっつ〜 ;-)

_み(Fri May 09 13:45:46 JST 2003)

 沖縄の会場からの書込みだぁ〜

_あひるーら(Fri May 09 16:53:05 JST 2003)

CGIで、エラーメッセージが出せなくてすげー困ったんだよな

print "Content-type: text/html\n\n"
exec("ruby nananika.rb")

ってやればEのだ

_8 (Thu)

括弧の扱いは to_s((X),(S)):-to_s(X,S),!. こうか。


mod_mp3 ってのがあるんですね。これは私の目的に合致するか? と試してみたんですが、駄目でした。

いい点。

  • 何も考えずストリーミング放送ができる
  • m3u とか、プレイリストが取得できる
  • ウェブ上から簡単に選曲ができる

わるい点。

  • ディレクトリをフラットにしてしまう

これが絶望的です。たとえば、3段のツリーで、それぞれ枝が10づつついていて、葉も10とすると、1000ファイルあることになるんですが、これをディレクトリとっぱらってくれちゃうと1000曲ずらずらー、と選曲ページ(*1)に並べることになるわけです。これで選曲するのは絶望的です。


情報系の学部・学科出身者が書くプログラムは、そうでない人が書くプログラムよりも素敵なものになるのかどうか。

どちらも変わらないような気がする。学者連中は所詮論文を書くためにやってんだし、学者という立場の人々は、最後に論文という形に残すための手段としてプログラムを作成しているわけで、その手段であるプログラミングについて、たとえばどの程度洗練されたプログラムがかけるかについてはあまり関心がないのではないかな、と思います。事実、値さえ出ていれば main 一個だけしか関数がない Cプログラムでも十分なわけで。

プログラミングについての教育も、いわゆるいいプログラムを作るためのもの、ということはやらないような気がする。やったとしてソフトウェア工学の授業かな。授業自体はXPに入る前に終わってしまって、ユースケースとかまでだった覚えが。

もちろん、プログラミングの機会が他の学部・学科の人たちよりも多いことは確かなので、プログラミングを上達させるための機会が多い、という点はあると思います。あと、基礎の基礎について、授業があることは大きいのかな。データ構造とアルゴリズムの授業、とか。

ですが、たとえばプログラミングが趣味の人々と比べてどうか、というと微妙な気がします。本でわかることしか授業でやらんし。

もちろん、学術分野の人でも凄い人はいると思います。でも、情報系だからといって凄い人になるわけではない、つまり私のソースは駄目駄目であることのいいわけをしているわけです(ぉ。


自宅で音楽、現実解。

[自宅] apache(virtual hostでポートを変える) - sshd - ***

*** [学校] - ssh - winamp(http://localhost:xxx/音楽ファイル名)

結局apacheで公開して、それをダウンロードするような形に。mp3はもともとファイル形式からストリーム再生可能だから、これでいいかあ、と。結局ローテクだなぁ・・・。

URLリストをスクリプトでシコシコ書いてみる。CGI.escape でいけるのかな、と思ったらなんか形式が違ってる。URI::escape で使うのか。

で、これでもういいやーとか思っていたら、やっぱり問題が。

WinAMPがURIを260バイトしか読まない。日本語でアーティスト名つけたフォルダの中の、日本語でアルバム名つけた中の日本語でファイル名つけたような mp3ファイル、これじゃ入りきらないわけです。うーん、なんてこった。

再生ソフトを変えれば問題ないのかなぁ・・・。お、メディアプレーヤーでは再生可能だ。でも、WMP使うのはいやだし。WinAmpのこの制限がなければ幸せになれたのになぁ・・・。

しかし、安定したスループットが出ないな。どこがあかんのやろ・・・。

ssh で長時間でかいデータ流すと、なんか止まるっぽい。どこがあかんのやろ。

あれ、これは気のせいかな・・・。


はて、掲示板につながらない。xrea がおちてるのか、消されたのか・・・。

え、今から何か腐らせないといけないんですか。10日のだとあと2日で腐るような食物を探さないと。


うへぇ、遅い。おうちから音楽をひっぱってきているのと同時に cvs co したら反応が返ってこない・・・。


なんというか・・・、オリジナリティの定義だよな・・・。


今日はまった話。

method_missingを利用した、単純な話です。Aのオブジェクトに対して投げられたメッセージは、そのまま@t に格納したテキストに対してそのメッセージを投げるようにします。

class A
  def initialize
    @t = "test"
  end
  def method_missing(msg,*arg)
    @t.send msg *arg
  end
end

p A.new.length

スタックオーバーフロー。気づくのにすんげー時間がかかった(ぉぃ。

なんでこれがパースがとーるのー・・・。


そうか、self.msg(*arg) やって、それが method_missing 呼んで、呼んで、呼んで、、、スタックオーバーフローしたのか。うーん。


*1 しゃれじゃねーっす

_7 (Wed)

PPP over SSH client for Windows。今度はこれをためそう。

まずい、発表15分、質疑5分と思っていたら、20/5分らしい。うぁー、やばいやばい。何しゃべればいいんだ。

EnVaDoR's ToiletPC。うひ。

うーん、 lambda{..}.call(..) と lambda{..}[..] が同じ意味だとは知らなかった・・・。日々発見。ちょっと気持ち悪い。

くだらないこと。

(define (plus x y)
  (define (plus_ x y) (if (= x 0) y (plus_ (- x 1) (+ y 1))))
  (plus_ x y))
(plus (plus 3 4) (plus 5 6))

=> ruby

plus = lambda{|x,y|
  plus_ = lambda{|x,y|
    if(x == 0)
      y
    else
      plus_[x-1,y+1]
    end
  }
  plus_[x,y]
}
p plus[plus[3,4],plus[5,6]]

変換器は簡単? 末尾再帰の最適化はできないから、scheme はむりかー・・・。変換過程に末尾再帰をループにしてしまえばいいのか。うんん? どうやりゃええんかな。うーん、そのまんまでは無理かな。

shift/reset ってなんだろーって説明を探してみたけど、日本語のは見つけられなかった・・・。

読んでもよくわからんなぁ・・・。reset したところからの継続が保存されて、それを shift で参照できるとか、そういう話なのかな。

[ruby-list:37655]。=~は Regexp.=~(String) が正解である、とよく聞くんですが、String.=~(Regexp) だと何がまずいんだろう、とかふと考えてみる。Regexp に文字を渡して「マッチして〜」と頼むのは、Regexp の存在意義からしてオッケーだと思うんだけど、String に Regexp を渡すのは不自然なんだろうか。それとも実装の問題なのかな? って、「マッチを行うのは Regexpだから」と理由が書いてありますね・・・。

Ruby ではそう実装しているから、が正解なのかな。どっちが主語に来ても問題ない気がする。

気になったので、

require "benchmark"
include Benchmark

LOOP_MAX = 1000000

def yloop
puts measure{
  LOOP_MAX.times{
    yield
  }
}
end

yloop{
  /abc/ =~ 'abcabc'
}
yloop{
  'abcabc' =~ /abc/
}

=>
  2.766000   0.000000   2.766000 (  2.828000)
  2.781000   0.000000   2.781000 (  2.844000)

よかった、かわらん。

高層ビル脱出用パラシュート。こんなこと書いて怒られないのかなぁ・・・。

AMOEBA って、なんかの略って無いのかなー・・・。

製品情報/CF-W2A。凄いところが開くなぁ・・・。


プロセス間共有メモリって始めて使った。うーん、面白い。

Prolog、今回はこれで終わり。

/* 項書き換えシステム v2 */

run(X):-replace1(X,Y),nl,write(Y),swrite(Y),run(Y).


/* normal order , leftmost rule, or call by name */
/* gyaku ni suruto 
   applicative order, leftmost-innermost rule, or call by value */

replace1(X,Y):-r(X,Y),!.
replace1(X,Y):-X=..[F|XL],r1l(XL,YL),Y=..[F|YL],!.

r1l([X|L],[Y|L]):-replace1(X,Y),!.
r1l([X|L],[X|M]):-r1l(L,M),!.

/* prime number */
r(p(N),nth(N,primelist)).
r(nth(s(0),[X|_]),X).
r(nth(s(s(N)),[_|L]),nth(s(N),L)).
r(primelist,sieveall(nlist(s(s(0))))).
r(sieveall([N|L]),[N|sieveall(sieve(N,L))]).
r(nlist(N),[N|nlist(s(N))]).
r(sieve(N,[X|L]),if(zerop(mod(X,N)),sieve(N,L),[X|sieve(N,L)])).

/* utility */
r(X+0,X).
r(0+X,X).
r(s(X)+Y,s(X+Y)).
r(X+s(Y),s(X+Y)).

r(if(true,X,_),X).
r(if(false,_,Y),Y).
r(zerop(0),true).
r(zerop(s(_)),false).
r(mod(X,Y),if(less(X,Y),X,mod(sub(X,Y),Y))).
r(less(0,s(_)),true).
r(less(_,0),false).
r(less(s(X),s(Y)),less(X,Y)).
r(X-0,X).
r(s(X)-s(Y),X-Y).

/* multiplier */
r(_*0,0).
r(0*_,0).
r(X*s(Y),X*Y+X).
r(s(X)*Y,X*Y+Y).

r(fact(s(0)),s(0)).
r(fact(s(X)),s(X)*fact(X)).
r(N,S):-number(N),N =\= 0,n2s(N,S),!.

/* differential */
r(d(X,X),s(0)):-!.
r(d(0,_),0):-!.
r(d(s(Y),X),d(Y,X)):-!.  /* n+x */
r(d(A+B,X),d(A,X)+d(B,X)):-!.
r(d(A*B,X),d(A,X)*B+d(B,X)*A):-!.


/* write s(..) as number */
swrite(X) :- to_s(X,N),writef(" --> "),write(N),!.
swrite(_):-!.

s2n_(s(X),M,N) :- M1 is M+1,s2n_(X,M1,N),!.
s2n_(A,M,N) :- number(A),N is A+M,!.
s2n_(A,M,A+M) :- !.
s2n(s(X),N) :- s2n_(X,1,N).
/* 
s2n(s(X),N):-s2n(X,N1),number(N1),N is N1+1,!.
s2n(s(X),N+N1):-s2n(X,N1),!.
 */

/* format */
to_s(X,S):-s2n(X,S),!.
to_s(X,X):-atomic(X),!.
to_s(X,S):-s2n(X,X1),s2n(Y,Y1),append([X1],Y1,S),!.
to_s(X+Y,XS+YS):-to_s(X,XS),to_s(Y,YS),!.
to_s(X*Y,XS*YS):-to_s(X,XS),to_s(Y,YS),!.
to_s((X),(X)):-!.

test(A+B):-writeln(A),write(B).



/* number to s(..) */
n2s(0,0):-!.
n2s(N,s(S)):-number(N),N1 is N-1,n2s(N1,S),!.

さかいさんに教えていただくも、いまいちよくわからなかったので安易な手に・・・。

?- run(((3+5)*x)).
x+x+x+x+x+x+x+x --> x+x+x+x+x+x+x+x

?- run(3*x*x + 4*x + 5).
s(s(s(s(s((x+x+x)*x+ (x+x+x+x)))))) --> (x+x+x)*x+ (x+x+x+x)+5

?- run(d(3*x*x + 4*x + 5,x)).
s(s(s(s(x+x+x+ (x+x+x))))) --> x+x+x+ (x+x+x)+4

やっぱりうまく簡約化してくれないなー。KB法? そんなのしらねーっす。

run(fact(3+5)).とかやったら止まらなくなった。さすが。

_6 (Tue)

やらないといけないことが、終わらず、やらなくていいことばかりやっているような気がする。

まつもとさんの日記を読んで、ブロックの仕様を始めて理解しました。そうか、ループの抽象化から、こういう感じなのか(イテレータ、か)。

しかし、大変なんだろうなぁ。これだけのものを変更するのは。

return したら、ブロックを書いているメソッドから抜けてしまう、というのも初めて知った。こういうところはあえて無視するようにしてたからなぁ。


RSSニュース・フィードの紹介。2000年なんだなぁ。


httpd.conf をごにょごにょ弄っていたら、なんか変なところを消してしまったらしく、apacheが再起動不可能に。うーん、困った。バックアップ取らないと駄目だなぁ。

WebDAV という単語を教えてもらって、ちょっとやってたんですが。名前しか知らなかったんで、いい機会かな、と。

うーん、自分の用途には使えないっぽいです。日本語通すのめんどうくさそうだし、フォルダを WinAmp にドラッグしても再生してくれないし。いや、これはソフトが対応してないだけか。まだ、お気楽に使える土壌が整ってないというか(整えろよ自分で・・・)。

VPNとか、その辺を調べないと駄目かー。なんか馬鹿っぽい気もする。いっそ iPod 買うかなぁ・・・(そんな金どこにあるんだ)。

お気楽音楽生活はまだ遠い。


う、EasyMP3モジュール、欲しい。買ってくれないかなぁ。

今日はじめてFOLDOCを知る。研究者なら知ってて当然だろ、とか言われる。うー、ごめんなさい。

う、地震だ。一人で学校で地震に遭うと怖いな・・・。

_4 (Sun)

急に台湾から spam が来るようになってきた。なんで?

音楽配信をやってみたい というのを書いてみる。

遠隔ドライブを windowsで簡単にマウントできる方法ってあるんでしょうか。


ノートPCがいよいよ電源が入らなくなってきた。一時期有効だったバッテリーを抜く、という手段も駄目。

一度放電させてみよう、とバッテリーのみでのPC起動を敢行。ruby -e 'loop{}' を走らせる。もしもの時は、2度と立ち上がらなくなってしまうが・・・。

お、5% まで減らしたら充電するようになった。よかったよかった。


んで、netradio、聞いているんですが、SHOUTcast のページのラジオ検索で、 japan って入れると上位にくる番組・・・。いや、日本じゃ絶対出来ないだろうなぁっていう、なんというか豪華な曲揃えが。

なんとか、簡単に選曲ができるようなものを考えてみる。

・家
Linuxサーバ
   ┌────────┐
      │X               │
      │  音楽再生ソフト├──>サウンドデバイス
      └──────┬─┘      │
                    ∧        V
                    │       sc_trans─────> sc_serv
               vnc server                 │
                    │                                    │
──────────┼──────────────────┼──────
                    │                                    │
                    │         いんたーねっと(ssh)        │
                    │                                    │
──────────┼──────────────────┼──────
・学校              │                  │
Windows クライアント│                                    │
          │                                    V
         VNC client                 WinAmp

うーん、無駄/馬鹿っぽい。

カーネル再構築はめんどうだから嫌だしなぁ。

SHOUTcastの通信プロトコル解析。こんなページがあるんですね。うーん、サーバへ送信するやつを、自分で書いてしまうのも手か。


家から出ない -> 自転車にのらない -> 電池の消耗が気にならなくなってハッピー


単語解説。

■スタックマシン(消去)

謎。見なかったことにしてください。

_3 (Sat)

無限リストをどう扱えばいいか、という点ではまる。

普通に eval してしまうと、無限に行ってしまうので・・・。うーん。(fibseq 1 1) で、 (1 (fibseq 1 2)) を返すようにすればいいのか。つか、普通にこれで止まるような気もするんだがなぁ。なんで止まらないんだろう。

そうか、(cons 1 (fibseq y (+ x y))) で、(fibseq ...) を評価しようとするからだ。だから、cons のみを特別扱いすれば問題無し?

う、何も考えずcons をpairをくっつける実装にしたら(cons 1 (fibseq ...)(1 fibseq y (+ x y)) が返ってしまった。

Promise を作るような実装にしないと駄目かな・・・。

(define (fibseq x y)
  (cons x (fibseq y (+ x y))))
(define (pick n lst)
		(if (= n 1)
			(car lst)
		  (pick (- n 1) (cdr lst))))
(define (fib n)
  (pick n (fibseq 1 1)))

(fib 8)

なんとか、これが 21 を返すような処理系にすることができた。ほんま、Promise にするだけになっちゃったなぁ。

まともな scheme で書けば、

(define (fibseq x y)
  (cons x (delay (fibseq y (+ x y)))))

(define (pick n lst)
		(if (= n 1)
			(car lst)
		  (pick (- n 1) (force (cdr lst)))))
(define (fib n)
  (pick n (fibseq 1 1)))

(fib 8)

こんな感じ。force は要るか要らないかは処理系に拠るような気がする。

(cons (+ 1 2) (+ 3 4))(#<Rucheme::Promise:0x2b643c8> . #<Rucheme::Promise:0x2b643b0>) こうなってしまう。うーん、参ったなぁ。計算過程的にはこれでいいんだが・・・。to_s に細工してしまおうか。でも、計算過程の表示が悲惨なことになってしまう予感。

結局、最後の結果だけ無限リストでもなんでも表示するようにする。

(define (fibseq x y)
  (cons x (fibseq y (+ x y))))

(fibseq 1 1)

これの答えを、

ans      => (1 (1 (2 (3 (5 (8 (13 (21 (34 (55 (89 (144 (233 (377 (610 
(987 (1597 (2584 (4181 (6765 (10946 (17711 (28657 (46368 (75025 (121393 
(196418 (317811 (514229 (832040 (1346269 (2178309 (3524578 (5702887 
(9227465 (14930352 (24157817 (39088169 (63245986 (102334155 (165580141 
(267914296 (433494437 (701408733 (1134903170 (1836311903 (2971215073 
(4807526976 (7778742049 (12586269025 (20365011074 (32951280099 
(53316291173 (86267571272 (139583862445 (225851433717 (365435296162 
(591286729879 (956722026041 (1548008755920 (2504730781961 (4052739537881 
(6557470319842 (10610209857723 (17167680177565 (27777890035288 
(44945570212853 (72723460248141 (117669030460994 (190392490709135 
(308061521170129 (498454011879264 (806515533049393 (1304969544928657 
(2111485077978050 (3416454622906707 (5527939700884757 (8944394323791464 
(14472334024676221 (23416728348467685 (37889062373143906 
(61305790721611591 (99194853094755497 (160500643816367088 
(259695496911122585 (420196140727489673 (679891637638612258 
(1100087778366101931 (1779979416004714189 (2880067194370816120 
(4660046610375530309 (7540113804746346429 (12200160415121876738 
(19740274219868223167 (31940434634990099905 (51680708854858323072 
(83621143489848422977 (135301852344706746049 (218922995834555169026 
(354224848179261915075 (573147844013817084101 (927372692193078999176 
(1500520536206896083277 (2427893228399975082453 (3928413764606871165730 
(6356306993006846248183 (10284720757613717413913 
(16641027750620563662096 (26925748508234281076009 
(43566776258854844738105 (70492524767089125814114 
(114059301025943970552219 (184551825793033096366333 
(298611126818977066918552 (483162952612010163284885 
(781774079430987230203437 (1264937032042997393488322 
(2046711111473984623691759 (3311648143516982017180081 
(5358359254990966640871840 (8670007398507948658051921 
(14028366653498915298923761 (22698374052006863956975682 
(36726740705505779255899443 (59425114757512643212875125 
(96151855463018422468774568 (155576970220531065681649693 
(251728825683549488150424261 (407305795904080553832073954 
(659034621587630041982498215 (1066340417491710595814572169 
(1725375039079340637797070384 (2791715456571051233611642553 
(4517090495650391871408712937 (7308805952221443105020355490 
(11825896447871834976429068427 (19134702400093278081449423917 
(30960598847965113057878492344 (50095301248058391139327916261 
(81055900096023504197206408605 (131151201344081895336534324866 
(212207101440105399533740733471 (343358302784187294870275058337 
(555565404224292694404015791808 (898923707008479989274290850145 
(1454489111232772683678306641953 (2353412818241252672952597492098 
(3807901929474025356630904134051 (6161314747715278029583501626149 
(9969216677189303386214405760200 (16130531424904581415797907386349 
(26099748102093884802012313146549 (42230279526998466217810220532898 
(68330027629092351019822533679447 (110560307156090817237632754212345 
(178890334785183168257455287891792 (289450641941273985495088042104137 
(468340976726457153752543329995929 (757791618667731139247631372100066 
(1226132595394188293000174702095995 (1983924214061919432247806074196061 
(3210056809456107725247980776292056 (5193981023518027157495786850488117 
(8404037832974134882743767626780173 (13598018856492162040239554477268290 
(22002056689466296922983322104048463 
(35600075545958458963222876581316753 
(57602132235424755886206198685365216 
(93202207781383214849429075266681969 
(150804340016807970735635273952047185 
(244006547798191185585064349218729154 
(394810887814999156320699623170776339 
(638817435613190341905763972389505493 
(1033628323428189498226463595560281832 
(1672445759041379840132227567949787325 
(2706074082469569338358691163510069157 
(4378519841510949178490918731459856482 
(7084593923980518516849609894969925639 
(11463113765491467695340528626429782121 
(18547707689471986212190138521399707760 
(30010821454963453907530667147829489881 
(48558529144435440119720805669229197641 
(78569350599398894027251472817058687522 
(127127879743834334146972278486287885163 
(205697230343233228174223751303346572685 
(332825110087067562321196029789634457848 
(538522340430300790495419781092981030533 
(871347450517368352816615810882615488381 
(1409869790947669143312035591975596518914 
(2281217241465037496128651402858212007295 
(3691087032412706639440686994833808526209 
(5972304273877744135569338397692020533504 
(9663391306290450775010025392525829059713 
(15635695580168194910579363790217849593217 
(25299086886458645685589389182743678652930 
(40934782466626840596168752972961528246147 
(66233869353085486281758142155705206899077 
(107168651819712326877926895128666735145224 
(173402521172797813159685037284371942044301 
(280571172992510140037611932413038677189525 
(453973694165307953197296969697410619233826 
(734544867157818093234908902110449296423351 
(1188518561323126046432205871807859915657177 
(1923063428480944139667114773918309212080528 
(3111581989804070186099320645726169127737705 
(5034645418285014325766435419644478339818233 
(8146227408089084511865756065370647467555938 
(13180872826374098837632191485015125807374171 
(21327100234463183349497947550385773274930109 
(34507973060837282187130139035400899082304280 
(55835073295300465536628086585786672357234389 
(90343046356137747723758225621187571439538669 
(146178119651438213260386312206974243796773058 
(236521166007575960984144537828161815236311727 
(382699285659014174244530850035136059033084785 
(619220451666590135228675387863297874269396512 
(1001919737325604309473206237898433933302481297 
(1621140188992194444701881625761731807571877809 
(2623059926317798754175087863660165740874359106 
(4244200115309993198876969489421897548446236915 
(6867260041627791953052057353082063289320596021 
(11111460156937785151929026842503960837766832936 
(17978720198565577104981084195586024127087428957 
(29090180355503362256910111038089984964854261893 
(47068900554068939361891195233676009091941690850 
(76159080909572301618801306271765994056795952743 
(123227981463641240980692501505442003148737643593 
(199387062373213542599493807777207997205533596336 
(322615043836854783580186309282650000354271239929 
(522002106210068326179680117059857997559804836265 
(844617150046923109759866426342507997914076076194 
(1366619256256991435939546543402365995473880912459 
(2211236406303914545699412969744873993387956988653 
(3577855662560905981638959513147239988861837901112 
(5789092068864820527338372482892113982249794889765 
(9366947731425726508977331996039353971111632790877 
(15156039800290547036315704478931467953361427680642 
(24522987531716273545293036474970821924473060471519 
(39679027332006820581608740953902289877834488152161 
(64202014863723094126901777428873111802307548623680 
(103881042195729914708510518382775401680142036775841 
(168083057059453008835412295811648513482449585399521 
(271964099255182923543922814194423915162591622175362 
(440047156314635932379335110006072428645041207574883 
(712011255569818855923257924200496343807632829750245 
(1152058411884454788302593034206568772452674037325128 
(1864069667454273644225850958407065116260306867075373 
(3016128079338728432528443992613633888712980904400501 
(4880197746793002076754294951020699004973287771475874 
(7896325826131730509282738943634332893686268675876375 
(12776523572924732586037033894655031898659556447352249 
(20672849399056463095319772838289364792345825123228624 
(33449372971981195681356806732944396691005381570580873 
(54122222371037658776676579571233761483351206693809497 
(87571595343018854458033386304178158174356588264390370 
(141693817714056513234709965875411919657707794958199867 
(229265413057075367692743352179590077832064383222590237 
(370959230771131880927453318055001997489772178180790104 
(600224643828207248620196670234592075321836561403380341 
(971183874599339129547649988289594072811608739584170445 
(1571408518427546378167846658524186148133445300987550786 
(2542592393026885507715496646813780220945054040571721231 
(4114000911454431885883343305337966369078499341559272017 
(6656593304481317393598839952151746590023553382130993248 
(10770594215935749279482183257489712959102052723690265265 
(17427187520417066673081023209641459549125606105821258513 
(28197781736352815952563206467131172508227658829511523778 
(45624969256769882625644229676772632057353264935332782291 
(73822750993122698578207436143903804565580923764844306069 
(119447720249892581203851665820676436622934188700177088360 
(193270471243015279782059101964580241188515112465021394429 
(312718191492907860985910767785256677811449301165198482789 
(505988662735923140767969869749836918999964413630219877218 
(818706854228831001753880637535093596811413714795418360007 
(1324695516964754142521850507284930515811378128425638237225 
(2143402371193585144275731144820024112622791843221056597232 
(3468097888158339286797581652104954628434169971646694834457 
(5611500259351924431073312796924978741056961814867751431689 
(9079598147510263717870894449029933369491131786514446266146 
(14691098406862188148944207245954912110548093601382197697835 
(23770696554372451866815101694984845480039225387896643963981 
(38461794961234640015759308940939757590587318989278841661816 
(62232491515607091882574410635924603070626544377175485625797 
(100694286476841731898333719576864360661213863366454327287613 
(162926777992448823780908130212788963731840407743629812913410 
(263621064469290555679241849789653324393054271110084140201023 
(426547842461739379460149980002442288124894678853713953114433 
(690168906931029935139391829792095612517948949963798093315456 
(1116716749392769314599541809794537900642843628817512046429889 
(1806885656323799249738933639586633513160792578781310139745345 
(2923602405716568564338475449381171413803636207598822186175234 
(4730488062040367814077409088967804926964428786380132325920579 
(7654090467756936378415884538348976340768064993978954512095813 
(12384578529797304192493293627316781267732493780359086838016392 
(20038668997554240570909178165665757608500558774338041350112205 
(32423247527351544763402471792982538876233052554697128188128597 
(52461916524905785334311649958648296484733611329035169538240802 
(84885164052257330097714121751630835360966663883732297726369399 
(137347080577163115432025771710279131845700275212767467264610201 
(222232244629420445529739893461909967206666939096499764990979600 
(359579325206583560961765665172189099052367214309267232255589801 
(581811569836004006491505558634099066259034153405766997246569401 
(941390895042587567453271223806288165311401367715034229502159202 
(1523202464878591573944776782440387231570435521120801226748728603 
(2464593359921179141398048006246675396881836888835835456250887805 
(3987795824799770715342824788687062628452272409956636682999616408 
(6452389184720949856740872794933738025334109298792472139250504213 
(10440185009520720572083697583620800653786381708749108822250120621 
(16892574194241670428824570378554538679120491007541580961500624834 
(27332759203762391000908267962175339332906872716290689783750745455 
(44225333398004061429732838340729878012027363723832270745251370289 
(71558092601766452430641106302905217344934236440122960529002115744 
(115783425999770513860373944643635095356961600163955231274253486033 
(187341518601536966291015050946540312701895836604078191803255601777 
(303124944601307480151388995590175408058857436768033423077509087810 
(490466463202844446442404046536715720760753273372111614880764689587 
(793591407804151926593793042126891128819610710140145037958273777397 
(1284057871006996373036197088663606849580363983512256652839038466984 
(2077649278811148299629990130790497978399974693652401690797312244381 
(3361707149818144672666187219454104827980338677164658343636350711365 
(5439356428629292972296177350244602806380313370817060034433662955746 
(8801063578447437644962364569698707634360652047981718378070013667111 
(14240420007076730617258541919943310440740965418798778412503676622857 
(23041483585524168262220906489642018075101617466780496790573690289968 
(37281903592600898879479448409585328515842582885579275203077366912825 
(60323387178125067141700354899227346590944200352359771993651057202793 
(97605290770725966021179803308812675106786783237939047196728424115618 
(157928677948851033162880158208040021697730983590298819190379481318411 
(255533968719576999184059961516852696804517766828237866387107905434029 
(413462646668428032346940119724892718502248750418536685577487386752440 
(668996615388005031531000081241745415306766517246774551964595292186469 
(1082459262056433063877940200966638133809015267665311237542082678938909 
(1751455877444438095408940282208383549115781784912085789506677971125378 
(2833915139500871159286880483175021682924797052577397027048760650064287 
(4585371016945309254695820765383405232040578837489482816555438621189665 
(7419286156446180413982701248558426914965375890066879843604199271253952 
(12004657173391489668678522013941832147005954727556362660159637892443617 
(19423943329837670082661223262500259061971330617623242503763837163697569 
(31428600503229159751339745276442091208977285345179605163923475056141186 
(50852543833066829834000968538942350270948615962802847667687312219838755 
(82281144336295989585340713815384441479925901307982452831610787275979941 
(13313368816936281941934168235432679175087451727078530049929809949581869
6 
(21541483250565880900468239616971123323080041857876775333090888677179863
7 
(34854852067502162842402407852403802498167493584955305383020698626761733
3 
(56396335318068043742870647469374925821247535442832080716111587303941597
0 
(91251187385570206585273055321778728319415029027787386099132285930703330
3 
(14764752270363825032814370279115365414066256447061946681524387323464492
73 
(23889871008920845691341675811293238246007759349840685291437615916534825
76 
(38654623279284670724156046090408603660074015796902631972962003239999318
49 
(62544494288205516415497721901701841906081775146743317264399619156534144
25 
(10119911756749018713965376799211044556615579094364594923736162239653346
274 
(16374361185569570355515148989381228747223756609038926650176124155306760
699 
(26494272942318589069480525788592273303839335703403521573912286394960106
973 
(42868634127888159424995674777973502051063092312442448224088410550266867
672 
(69362907070206748494476200566565775354902428015845969798000696945226974
645 
(11223154119809490791947187534453927740596552032828841802208910749549384
2317 
(18159444826830165641394807591110505276086794834413438782008980444072081
6962 
(29382598946639656433341995125564433016683346867242280584217891193621465
9279 
(47542043773469822074736802716674938292770141701655719366226871637693547
6241 
(76924642720109478508078797842239371309453488568897999950444762831315013
5520 
(12446668649357930058281560055891430960222363027055371931667163446900856
11761 
(20139132921368877909089439840115368091167711883945171926711639730032357
47281 
(32585801570726807967370999896006799051390074911000543858378803176933213
59042 
(52724934492095685876460439736122167142557786794945715785090442906965571
06323 
(85310736062822493843831439632128966193947861705946259643469246083898784
65365 
(13803567055491817972029187936825113333650564850089197542855968899086435
571688 
(22334640661774067356412331900038009953045351020683823507202893507476314
037053 
(36138207717265885328441519836863123286695915870773021050058862406562749
608741 
(58472848379039952684853851736901133239741266891456844557261755914039063
645794 
(94611056096305838013295371573764256526437182762229865607320618320601813
254535 
(15308390447534579069814922331066538976617844965368671016458237423464087
6900329 
(24769496057165162871144459488442964629261563241591657577190299255524269
0154864 
(40077886504699741940959381819509503605879408206960328593648536678988356
7055193 
(64847382561864904812103841307952468235140971448551986170838835934512625
7210057 
(10492526906656464675306322312746197184102037965551231476448737261350098
24265250 
(16977265162842955156516706443541444007616135110406430093532620854801360
81475307 
(27469792069499419831823028756287641191718173075957661569981358116151459
05740557 
(44447057232342374988339735199829085199334308186364091663513978970952819
87215864 
(71916849301841794820162763956116726391052481262321753233495337087104278
92956421 
(11636390653418416980850249915594581159038678944868584489700931605805709
880172285 
(18828075583602596462866526311206253798143927071100759813050465314516137
773128706 
(30464466237021013443716776226800834957182606015969344302751396920321847
653300991 
(49292541820623609906583302538007088755326533087070104115801862234837985
426429697 
(79757008057644623350300078764807923712509139103039448418553259155159833
079730688 
(12904954987826823325688338130281501246783567219010955253435512138999781
8506160385 
(20880655793591285660718346006762293618034481129314900095290838054515765
1585891073 
(33785610781418108986406684137043794864818048348325855348726350193515547
0092051458 
(54666266575009394647125030143806088482852529477640755444017188248031312
1677942531 
(88451877356427503633531714280849883347670577825966610792743538441546859
1769993989 
(14311814393143689828065674442465597183052310730360736623676072668957817
13447936520 
(23157002128786440191418845870550585517819368512957397702950426513112503
05217930509 
(37468816521930130019484520313016182700871679243318134326626499182070320
18665867029 
(60625818650716570210903366183566768218691047756275532029576925695182823
23883797538 
(98094635172646700230387886496582950919562726999593666356203424877253143
42549664567 
(15872045382336327044129125268014971913825377475586919838578035057243596
666433462105 
(25681508899600997067167913917673267005781650175546286474198377544968911
008983126672 
(41553554281937324111297039185688238919607027651133206312776412602212507
675416588777 
(67235063181538321178464953103361505925388677826679492786974790147181418
684399715449 
(10878861746347564528976199228904974484499570547781269909975120274939392
6359816304226 
(17602368064501396646822694539241125077038438330449219188672599289657534
5044216019675 
(28481229810848961175798893768146099561538008878230489098647719564596927
1404032323901 
(46083597875350357822621588307387224638576447208679708287320318854254461
6448248343576 
(74564827686199318998420482075533324200114456086910197385968038418851388
7852280667477 
(12064842556154967682104207038292054883869090329558990567328835727310585
04300529011053 
(19521325324774899581946255245845387303880535938250010305925639569195723
92152809678530 
(31586167880929867264050462284137442187749626267809000873254475296506308
96453338689583 
(51107493205704766845996717529982829491630162206059011179180114865702032
88606148368113 
(82693661086634634110047179814120271679379788473868012052434590162208341
85059487057696 
(13380115429233940095604389734410310117100995067992702323161470502791037
473665635425809 
(21649481537897403506609107715822337285038973915379503528404929519011871
658725122483505 
(35029596967131343602213497450232647402139968983372205851566400021802909
132390757909314 
(56679078505028747108822605166054984687178942898751709379971329540814780
791115880392819 
(91708675472160090711036102616287632089318911882123915231537729562617689
923506638302133 
(14838775397718883781985870778234261677649785478087562461150905910343247
0714622518694952 
(24009642944934892853089481039863024886581676666299953984304678866605016
0638129156997085 
(38848418342653776635075351818097286564231462144387516445455584776948263
1352751675692037 
(62858061287588669488164832857960311450813138810687470429760263643553279
1990880832689122 
(10170647963024244612324018467605759801504460095507498687521584842050154
23343632508381159 
(16456454091783111561140501753401790946585773976576245730497611206405482
15334513341070281 
(26627102054807356173464520221007550748090234072083744418019196048455636
38678145849451440 
(43083556146590467734605021974409341694676008048659990148516807254861118
54012659190521721 
(69710658201397823908069542195416892442766242120743734566536003303316754
92690805039973161 
(11279421434798829164267456416982623413744225016940372471505281055817787
346703464230494882 
(18250487254938611555074410636524312658020849229014745928158881386149462
839394269270468043 
(29529908689737440719341867053506936071765074245955118399664162441967250
186097733500962925 
(47780395944676052274416277690031248729785923474969864327823043828116713
025492002771430968 
(77310304634413492993758144743538184801550997720924982727487206270083963
211589736272393893 
(12509070057908954526817442243356943353133692119589484705531025009820067
6237081739043824861 
(20240100521350303826193256717710761833288791891681982978279745636828463
9448671475316218754 
(32749170579259258353010698961067705186422484011271467683810770646648531
5685753214360043615 
(52989271100609562179203955678778467019711275902953450662090516283476995
5134424689676262369 
(85738441679868820532214654639846172206133759914224918345901286930125527
0820177904036305984 
(13872771278047838271141861031862463922584503581717836900799180321360252
25954602593712568353 
(22446615446034720324363326495847081143197879573140328735389309014372804
96774780497748874337 
(36319386724082558595505187527709545065782383154858165636188489335733057
22729383091461442690 
(58766002170117278919868514023556626208980262727998494371577798350105862
19504163589210317027 
(95085388894199837515373701551266171274762645882856660007766287685838919
42233546680671759717 
(15385139106431711643524221557482279748374290861085515437934408603594478
161737710269882076744 
(24893677995851695395061591712608896875850555449371181438711037372178370
103971256950553836461 
(40278817102283407038585813270091176624224846310456696876645445975772848
265708967220435913205 
(65172495098135102433647404982700073500075401759827878315356483347951218
369680224170989749666 
(10545131220041850947223321825279125012430024807028457519200192932372406
6635389191391425662871 
(17062380729855361190588062323549132362437564983011245350735841267167528
5005069415562415412537 
(27607511949897212137811384148828257374867589790039702869936034199539935
1640458606953841075408 
(44669892679752573328399446472377389737305154773050948220671875466707463
6645528022516256487945 
(72277404629649785466210830621205647112172744563090651090607909666247398
8285986629470097563353 
(11694729730940235879461027709358303684947789933614159931127978513295486
24931514651986354051298 
(18922470193905214426082110771478868396165064389923225040188769479920226
13217501281456451614651 
(30617199924845450305543138480837172081112854323537384971316747993215712
38149015933442805665949 
(49539670118750664731625249252316040477277918713460610011505517473135938
51366517214899257280600 
(80156870043596115037168387733153212558390773036997994982822265466351650
89515533148342062946549 
(12969654016234677976879363698546925303566869175045860499432778293948758
940882050363241320227149 
(20985341020594289480596202471862246559405946478745659997715004840583924
030397583511583383173698 
(33954995036828967457475566170409171862972815653791520497147783134532682
971279633874824703400847 
(54940336057423256938071768642271418422378762132537180494862787975116607
001677217386408086574545 
(88895331094252224395547334812680590285351577786328700992010571109649289
972956851261232789975392 
(14383566715167548133361910345495200870773033991886588148687335908476589
6974634068647640876549937 
(23273099824592770572916643826763259899308191770519458247888393019441518
6947590919908873666525329 ./rcmlib/type.rb:52:in `new': stack level too 
deep (SystemStackError)	from ./rcmlib/type.rb:52:in `cons'	from 
./rcmlib/type.rb:197:in `<<'	from ./rcmlib/evaluator.rb:125:in 
`combination'	from ./rcmlib/evaluator.rb:115:in `each'	from 
./rcmlib/evaluator.rb:115:in `combination'	from 
./rcmlib/evaluator.rb:193:in `eval'	from ./rcmlib/type.rb:264:in `eval'	
from ./rcmlib/evaluator.rb:263:in `print_all'	 ... 919 levels...	from 
rcm.rb:19:in `open'	from rcm.rb:19	from rcm.rb:18:in `each'	from 
rcm.rb:18

こうなるくらいまではやった、っと。

しかし、むちゃくちゃなソースになったなぁ。

scheme で普通にやろうとすると

(define (fibseq x y)
  (cons x (delay (fibseq y (+ x y)))))

(define num 0)
(define (display-all lst)
  (if (= num 1000)
      0
      (begin
        (set! num (+ num 1))
        (display (car lst))
        (newline)
        (display-all (force (cdr lst))))))

(display-all (fibseq 1 1))

こんな感じですか。うーん、なんとなく、全部を normal order にしないでも、これでいいような気がするなぁ。つまり、delay と force を明示するって形で。

いいか悪いかは置いといて、副作用のあるプログラムが書けるってのは scheme の魅力だと思うし。


そうか、正式タイトルはつっこまれすぎ、だったのか。

他学科の人に「Scheme の手習い」を見せる。なんか理解出来ない、とか言われてしまった。

Q. t => A. t

のセンスは必携だと思うんだがなぁ。

スカラ波についてちょっと調べる。私にはいろいろと難しすぎてよくわかりませんでした。

_2 (Fri)

6月末、野暮用でアメリカ行くんですが、どこか一度は行っといた方がいいところってありますかね。このままだと、用事済ましてさっさと帰っちゃうんですが。めったにいけるところじゃないんで、ついで、で行ければどっか行きたいなぁと。


立川ルミネまで、パスポートを取りにいってきました。意外と簡単に手続きが済んでびっくり。んで、だらだら歩いてたらいつのまにか財布が空に。やばいなー・・・。

今日買った本。

なんというか、両者ともにネタですが。平積みになっていたので買ってしまった。今度ネットワーク管理ガイドで読書会しよう。何について語るかは謎。

そういえば、何年ぶりかにデパートの食品売り場(お菓子売り場)を歩いてみたんですが、やっぱりおいしそうなものばかりですね。


電気通信学会論文誌にshuJITネタが載っていた。正直、なんで今ごろ? って気がちょっとした。

さかいさんにご紹介いただいたConceptual Mathematics: A First Introduction to Categoriesのアマゾンページ。この本を買った人はこんな本も買っています(中略)Rubyソースコード完全解説 青木 峰郎 (著), まつもと ゆきひろ 。いやー、笑った笑った。


あかん、店員さんに進められるままに買った紅茶にアールグレイがまじっとる。苦手なのに・・・。

メロンティーとかブルーベリーティーなんてのもあるんだなぁ。

OpenBSD 3.3 正式リリース(/.j)。ここまでやるってのも凄いなぁ。


λ算法に出てくる例、わかりづらい。というか、書き方で混乱してるなぁ。

a = (λx.f(xx))(λx.f(xx))

のリダクションが a => fa => f(fa) => f(f(fa)) => ... と説明されているんだが、まず xx って何って感じが。f は自由変数なんだよなぁ、きっと。f(x)fa と書く、ということから、xxx(x) なんだろうなぁ。

Scheme で書くと、

(define (f x) x)
((lambda (x)
  (f (x x)))
  (lambda (x)
    (f (x x))))

うーん、確かに止まらない。

normal order scheme の例。

無限リストによるフィボナッチ数列を求めるプログラム(新しいプログラミング・パラダイム / P32)。

(define (fibseq x y)
  (cons x (fibseq y (+ x y))))
(define (pick n lst)
		(if (= n 1)
			(car lst)
		  (pick (- n 1) (cdr lst))))
(define (fib n)
  (pick n (fibseq 1 1)))

(fib 3)

さて、ほんまにこれが通るのか。

・・・とおりません。normal orderできた、なんて嘘でしたごめんなさい。何がいけないのか。

ちょっと見ていたら、

(define (f n)
  (if (= n 0) 0
      (f (- n 1))))
(f 3)

こんなものすらとおらない。(- (- n 1) 1) で無限に再帰してっちゃってるらしいんだけれど。うーん、なんでだ。

Rucheme / Scheme(subset) interpreter on Ruby 0.0.3
parsed => (define (f n) (if (= n 0) 0 (f (- n 1)))) (f 3)
run      <= (define (f n) (if (= n 0) 0 (f (- n 1))))
eval    0 : (define (f n) (if (= n 0) 0 (f (- n 1))))
syntax   : define
comb    0=> f
ans      => f
run      <= (f 3)
eval    1 : (f 3)
eval    2 : f
atom    2=> (lambda (n) (if (= n 0) 0 (f (- n 1))))
(lambda (n) (if (= n 0) 0 (f (- n 1)))) with  (3)
((if (= n 0) 0 (f (- n 1))))
syntax   : if
eval    3 : (= n 0)
eval    4 : =
atom    4=> (Proc =)
(Proc =) with  (3 0)
eval    5 : 3
atom    5=> 3
eval    6 : 0
atom    6=> 0
comb    3=> false
eval    7 : f
atom    7=> (lambda (n) (if (= n 0) 0 (f (- n 1))))
(lambda (n) (if (= n 0) 0 (f (- n 1)))) with  ((- n 1))
((if (= n 0) 0 (f (- n 1))))
syntax   : if
eval    8 : (= n 0)
eval    9 : =
atom    9=> (Proc =)
(Proc =) with  ((- n 1) 0)
eval   10 : (- n 1)
eval   11 : -
atom   11=> (Proc -)
(Proc -) with  ((- n 1) 1)
eval   12 : (- n 1)
eval   13 : -
atom   13=> (Proc -)
(Proc -) with  ((- n 1) 1)
eval   14 : (- n 1)
eval   15 : -
atom   15=> (Proc -)
(Proc -) with  ((- n 1) 1)
eval   16 : (- n 1)
eval   17 : -
atom   17=> (Proc -)
以下同文

うーん、頭悪いなー、俺。

んー、これは n という変数へのバインドについてバグってるのか。(- n 1) がクロージャーを持たないのが原因ってことかな。ってことは・・・。うーん、どうやって環境を渡しておこうか。

_1 (Thu)

(+ '1 '2 '3) => 6 が普通に評価できる.まぁ,そらそうか.

(eval 1) => 1(eval '1) => (eval (quote 1)) => (eval 1) => 1 と.


う,嘘書いてた.まぁいいや.間違い探しってことで(ぉ.

買ってきた本.


続続・研究室内アンケート.出揃った.

  • 英語 : 1
  • C/C++(セットらしい) : 2
  • Java : 4
  • SmallTalk : 1
  • Ruby : 3
  • CSS(Cascading Style Sheet) : 1
  • アセンブラ : 1
  • PHP : 1
  • XML : 1

借りた本.

すげえ.オブジェクト指向プログラミングを対象指向型って書いてある.でも,いいこと書いてあるなー.

すげえ,オブジェクト指向の考え方を,次のように表現しとる.

計算の対象をモデル化しする機構と,モデル化された対象間の通信機構とを備えた対象指向型プログラミング

いや,そのとおりだと思うんだけど,この日本語は私には書けないなぁ.

うーん,たまにはメモを取りながら読むかな.面白いし.


/.j の住人じゃない人にも宣伝しとこう.プログラミング中の音楽.原題,「hack中何聞いてる?」です.〜中の音楽,にしてしまうと,ファンの音とかは駄目駄目だよなぁ.スタッフのセンスにちょっと残念な気分.洋楽聞く人多いんですねぇ.


面白いから張っておこう.Prolog での電卓.大半は先生からもらったもので,それをちょいちょいと弄ったもの.

/* 項書き換えシステム v2 */

run(X):-replace1(X,Y),nl,write(Y),swrite(Y),run(Y).

replace1(X,Y):-r(X,Y),!.
replace1(X,Y):-X=..[F|XL],r1l(XL,YL),Y=..[F|YL],!.

r1l([X|L],[Y|L]):-replace1(X,Y),!.
r1l([X|L],[X|M]):-r1l(L,M),!.

/* utility */
r(X + 0,X).
/* r(s(X)+s(Y),s(s(X)+Y)). */
r(X+s(Y),s(X+Y)).
r(if(true,X,Y),X).
r(if(false,X,Y),Y).
r(zerop(0),true).
r(zerop(s(X)),false).
r(mod(X,Y),if(less(X,Y),X,mod(sub(X,Y),Y))).
r(less(0,s(X)),true).
r(less(X,0),false).
r(less(s(X),s(Y)),less(X,Y)).
r(X-0,X).
r(s(X)-s(Y),X-Y).

/* mult */
r(X*0,0).
r(s(X)*s(Y),s(X)*Y+s(X)).

/* factorial */
r(fact(s(0)),s(0)).
r(fact(s(X)),s(X)*fact(X)).

/* write s(..) as number */
swrite(s(X)) :- snum(s(X),N),writef(" --> "),write(N),!.
swrite(_):-!.

/* s(..) to number */
snum(0,0):-!.
snum(s(X),N):-snum(X,N1),N is N1+1,!.



/* number to s(..) */
n2s(0,0):-!.
n2s(N,s(S)):-number(N),N1 is N-1,n2s(N1,S).

r(N,S):-number(N),N =\= 0,n2s(N,S),!.

これを,たとえばこう使う.

run(fact(2+3)).

結果が面白いので全部書いてみる.

fact(s(s(0))+2)
fact(s(s(0))+s(s(0)))
fact(s(s(s(0))+s(0)))
s(s(s(0))+s(0))*fact(s(s(0))+s(0))
s(s(s(s(0))+0))*fact(s(s(0))+s(0))
s(s(s(s(0))))*fact(s(s(0))+s(0))
s(s(s(s(0))))*fact(s(s(s(0))+0))
s(s(s(s(0))))* (s(s(s(0))+0)*fact(s(s(0))+0))
s(s(s(s(0))))* (s(s(s(0)))*fact(s(s(0))+0))
s(s(s(s(0))))* (s(s(s(0)))*fact(s(s(0))))
s(s(s(s(0))))* (s(s(s(0)))* (s(s(0))*fact(s(0))))
s(s(s(s(0))))* (s(s(s(0)))* (s(s(0))*s(0)))
s(s(s(s(0))))* (s(s(s(0)))* (s(s(0))*0+s(s(0))))
s(s(s(s(0))))* (s(s(s(0)))*s(s(s(0))*0+s(0)))
s(s(s(s(0))))* (s(s(s(0)))* (s(s(0))*0+s(0))+s(s(s(0))))
s(s(s(s(0))))*s(s(s(s(0)))* (s(s(0))*0+s(0))+s(s(0)))
s(s(s(s(0))))* (s(s(s(0)))* (s(s(0))*0+s(0))+s(s(0)))+s(s(s(s(0))))
s(s(s(s(s(0))))* (s(s(s(0)))* (s(s(0))*0+s(0))+s(s(0)))+s(s(s(0))))
s(s(s(s(s(s(0))))* (s(s(s(0)))* (s(s(0))*0+s(0))+s(s(0)))+s(s(0))))
s(s(s(s(s(s(s(0))))* (s(s(s(0)))* (s(s(0))*0+s(0))+s(s(0)))+s(0))))
s(s(s(s(s(s(s(s(0))))* (s(s(s(0)))* (s(s(0))*0+s(0))+s(s(0)))+0))))
s(s(s(s(s(s(s(s(0))))* (s(s(s(0)))* (s(s(0))*0+s(0))+s(s(0)))))))
s(s(s(s(s(s(s(s(0))))*s(s(s(s(0)))* (s(s(0))*0+s(0))+s(0))))))
s(s(s(s(s(s(s(s(0))))* (s(s(s(0)))* (s(s(0))*0+s(0))+s(0))+s(s(s(s(0))))))))
s(s(s(s(s(s(s(s(s(0))))* (s(s(s(0)))* (s(s(0))*0+s(0))+s(0))+s(s(s(0))))))))
s(s(s(s(s(s(s(s(s(s(0))))* (s(s(s(0)))* (s(s(0))*0+s(0))+s(0))+s(s(0))))))))
s(s(s(s(s(s(s(s(s(s(s(0))))* (s(s(s(0)))* (s(s(0))*0+s(0))+s(0))+s(0))))))))
s(s(s(s(s(s(s(s(s(s(s(s(0))))* (s(s(s(0)))* (s(s(0))*0+s(0))+s(0))+0))))))))
s(s(s(s(s(s(s(s(s(s(s(s(0))))* (s(s(s(0)))* (s(s(0))*0+s(0))+s(0))))))))))
s(s(s(s(s(s(s(s(s(s(s(s(0))))*s(s(s(s(0)))* (s(s(0))*0+s(0))+0)))))))))
s(s(s(s(s(s(s(s(s(s(s(s(0))))* (s(s(s(0)))* (s(s(0))*0+s(0))+0)+s(s(s(s(0))))))))))))
s(s(s(s(s(s(s(s(s(s(s(s(s(0))))* (s(s(s(0)))* (s(s(0))*0+s(0))+0)+s(s(s(0))))))))))))
s(s(s(s(s(s(s(s(s(s(s(s(s(s(0))))* (s(s(s(0)))* (s(s(0))*0+s(0))+0)+s(s(0))))))))))))
s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(0))))* (s(s(s(0)))* (s(s(0))*0+s(0))+0)+s(0))))))))))))
s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(0))))* (s(s(s(0)))* (s(s(0))*0+s(0))+0)+0))))))))))))
s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(0))))* (s(s(s(0)))* (s(s(0))*0+s(0))+0)))))))))))))
s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(0))))* (s(s(s(0)))* (s(s(0))*0+s(0)))))))))))))))
s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(0))))* (s(s(s(0)))*s(s(s(0))*0+0))))))))))))))
s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(0))))* (s(s(s(0)))* (s(s(0))*0+0)+s(s(s(0))))))))))))))))
s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(0))))*s(s(s(s(0)))* (s(s(0))*0+0)+s(s(0)))))))))))))))
s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(0))))* (s(s(s(0)))* (s(s(0))*0+0)+s(s(0)))+s(s(s(s(0))))))))))))))))
s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(0))))* (s(s(s(0)))* (s(s(0))*0+0)+s(s(0)))+s(s(s(0))))))))))))))))
s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(0))))* (s(s(s(0)))* (s(s(0))*0+0)+s(s(0)))+s(s(0))))))))))))))))
s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(0))))* (s(s(s(0)))* (s(s(0))*0+0)+s(s(0)))+s(0))))))))))))))))
s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(0))))* (s(s(s(0)))* (s(s(0))*0+0)+s(s(0)))+0))))))))))))))))
s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(0))))* (s(s(s(0)))* (s(s(0))*0+0)+s(s(0)))))))))))))))))))
s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(0))))*s(s(s(s(0)))* (s(s(0))*0+0)+s(0))))))))))))))))))
s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(0))))* (s(s(s(0)))* (s(s(0))*0+0)+s(0))+s(s(s(s(0))))))))))))))))))))
s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(0))))* (s(s(s(0)))* (s(s(0))*0+0)+s(0))+s(s(s(0))))))))))))))))))))
s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(0))))* (s(s(s(0)))* (s(s(0))*0+0)+s(0))+s(s(0))))))))))))))))))))
s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(0))))* (s(s(s(0)))* (s(s(0))*0+0)+s(0))+s(0))))))))))))))))))))
s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(0))))* (s(s(s(0)))* (s(s(0))*0+0)+s(0))+0))))))))))))))))))))
s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(0))))* (s(s(s(0)))* (s(s(0))*0+0)+s(0))))))))))))))))))))))
s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(0))))*s(s(s(s(0)))* (s(s(0))*0+0)+0)))))))))))))))))))))
s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(0))))* (s(s(s(0)))* (s(s(0))*0+0)+0)+s(s(s(s(0))))))))))))))))))))))))
s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(0))))* (s(s(s(0)))* (s(s(0))*0+0)+0)+s(s(s(0))))))))))))))))))))))))
s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(0))))* (s(s(s(0)))* (s(s(0))*0+0)+0)+s(s(0))))))))))))))))))))))))
s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(0))))* (s(s(s(0)))* (s(s(0))*0+0)+0)+s(0))))))))))))))))))))))))
s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(0))))* (s(s(s(0)))* (s(s(0))*0+0)+0)+0))))))))))))))))))))))))
s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(0))))* (s(s(s(0)))* (s(s(0))*0+0)+0)))))))))))))))))))))))))
s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(0))))* (s(s(s(0)))* (s(s(0))*0+0))))))))))))))))))))))))))
s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(0))))* (s(s(s(0)))* (s(s(0))*0))))))))))))))))))))))))))
s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(0))))* (s(s(s(0)))*0)))))))))))))))))))))))))
s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(0))))*0))))))))))))))))))))))))
s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(0)))))))))))))))))))))))) --> 24

Prolog で扱えるように,数値を 0 => 0, s(0) => 1, s(s(0)) => 2, ... と,0 と succ だけで表現しているわけで.これ以上長いと張れないのでこんなところで.

次はこれを拡張して微分するんだとか.微分だと,多項式が出てきて,このままだと数字に直すことができないなー.うーん・・・.なんかいい手は無いものか.

って,授業資料の著作権ってどうなってんじゃろう.貼っちゃまずかったりするのかな.うーん.

はて,リスト処理がわからん.うーん,知らないことが多すぎるような気がする.

scheme で

(define (show-list lst)
	(if (null? lst)
		()
		(display (car lst))
		(show-list (cdr lst))))

みたいなことをしたいなぁ,と,Prolog で

test(X):- atom(X),write(X),!.
test(X):- X =..[A|B], test(A),test(B),!.

と書いてみたらエラー.うーん,どうやるんだろ.car と cdr が X =..[A|B] というのと違ってるのかな.うーん.ちゃんとした書物読まないと駄目かな.

そうか,[a,b]] って,(.)(a,b) ってなるのか.うーん,わけわかんねー.リスト手繰るにはどうすりゃええんじゃ.

うーん.

test([]).
test(X):- atom(X),write(X),!.
test([A|B]):-write(A),test(B),!.
test(X):- X=..[A|B],write(A),test(B).


/* =>
?- test(1+2).
+12

Yes
  */

こんな感じか.うーん,長いな.う,これだと中置と前置が混じってしまう.どないしよー.こんな感じ.

?- test(add(1,2)).
add12

Yes
?- test(1+2).
+12

Yes

うーん,わからん.s(0) + s(0) => 1 + 1という形に置き換えたいだけなのにな.


微分追加.

/* differential */
r(d(X,X),s(0)):-!.
r(d(0,_),0):-!.
r(d(s(Y),X),d(Y,X)):-!.  /* n+x */
r(d(A+B,X),d(A,X)+d(B,X)):-!.
r(d(A*B,X),d(A,X)*B+d(B,X)*A):-!.

結果.

?- run(d(x*x*3+x*4+5,x)). #=> d(3(x*x) + 4x + 5)/dx
s(s(s(s((s(0)*x+s(0)*x)*s(s(s(0)))))))

簡単化は出来てないが,整理すると,3*x + 4 となることがわかる.

はて,これを人間にわかりやすい方法で出力するにはどうすればよいのじゃろうか・・・.

しかし,面白いな,これ.

?- run((x+3)*4).
snip.
s(s(s(s(s(s(s(s(s(s(s(s(x+x+x+x))))))))))))

?- run(4*(x+3)).
snip
s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(0))))*x))))))))))))

どちらも同じモノを示しているのに,片方は全部足し算で表してるし.うーん,面白い.

ちなみに,r(X+Y,Y+X). という知識を教えてやると,とまんなくなっちまう.うーん,やれやれ.どう落しどころをつければいいんぢゃろ.

とりあえず自然数の範囲では計算できるようになったから,いっか.

明日はパスポート取りたいなー、と思っていたら、昼に用事があることに気づく。うーん、どうしよう。というか、写真とかいろいろ必要なのか。どうしようかな。へぇ、5時までやってるのか、お役所。

Sasada Koichi / sasada@namikilab.tuat.ac.jp
$Date: 2003/04/28 10:27:51 $