K.Sasada's Home Page

Diary - August 2003

研究日記

葉月

_31(Sun)

えーと、そういうわけで読書会でした。多分読書会です。きっと。

えーと、色々お話を聞くことができました。

  • n(略)n さんは酒場
  • m(略)i さんはケーキ屋(何)、弁当、色々大変らしい
  • a(略)i さんの春は開放的、きちんと考えないと大変らしい
  • ラブレター貰ったことがある人は3人
  • ラブレターを送ったことがある人も3人
  • 人生の静的フロー解析は出来ないらしい
    • やっぱりダイナミックバインディングですか?

英会話教室の重要性を力強く説明してもらいました。そうですね、たしかにこれから英語は非常に大切です。グローバル(略)なので、ますます英語の(略)ですね。さて、どこがいいのかな。

他にも色々聞いたような気がしますが、よく覚えていません。今度合コンらしいです。頑張ってください。


TRIPS って、 4x4 なマトリックスに配置したCMP? 16個増やして 6倍ってさびしいような気もするけれど、どうなんだろうな。マトリックスにしたほうがIPC稼ぐようなスケジューリングがし易いんだろうか。

しかし、10億とか50億(円)とか・・・。桁が違いますな。研究の桁も違うんだろう、きっと。


Gauche 、ざっくり見たんですが、スタックが足りないときコンティニュエーションを作って、そいつを環境の後ろにくっつける、みたいなことやってるって感じでしょうか。


Compiling with Continuations読みたいけれど、$60・・・。図書館にあったかな・・・。


本人認証技術の現状に関する調査報告書 2003

アリスなんとかでぐぐってたらひっかかった。


VMの命令、なんだかんだと考えていたら、やっぱり粗が沢山ある。ダメダメ。もっともっと多くなるな。命令。

一番悩んでいるのは、acc が要るか、要らないか。どっちなんだろうなぁ・・・。命令にフラグを付けるのは嫌。却下過ぎ。2種類用意するのは・・・。どうなんだろうなぁ。

acc は、実装が頑張るものであって、VM命令には入れないほうがいいのかもしれない。やっぱり入れない方針で行こう。駄目ってわかるときまで。要するに、スタックトップだけレジスタに載せてしまえばいいんだろう。多分。


久しぶりに、'98年度情報科学実験IIコンパイラ演習に挑戦するも、やはり敗退。やっぱりわからん。東大ってやっぱり凄いんだなぁ。一度授業を受けてみたいものだ。

_Shiro(Sun Aug 31 14:32:14 JST 2003)

 Gaucheでは、継続の作製時に全ての継続フレームと環境フレームをヒープに移し、継続を呼び出した場合はヒープ上のフレームを直接参照します。それを利用して、スタックが足りなくなった時に概念的に (call/cc (lambda (k) (k exp))) を実行することにより、スタックの内容をヒープに移しています。ただ、現在はGCとの絡みで、フレーム毎にコピーしてポインタをつなぎかえるという処理が必要で、これがフレーム数が増えるとボトルネックになっていると見ています。 (したがって、スタックがほぼ一杯の時にcall/ccを使うとやっぱり重いのですが、call/ccをヘビーに使うパターンではそれほどスタックが伸びないことが多いので、あまり顕在化しません)。

_ささだ(Sun Aug 31 17:05:41 JST 2003)

 素人考えなんですけど、単純にスタックの長さを倍倍で増やしていったらまずいでしょうか。増やしたら、スタックが短くなったとき悲しいとか、長いときの call/cc がオセー、とかあるかもしれませんが。

_Shiro(Sun Aug 31 17:59:42 JST 2003)

今のGaucheの実装では、いくつか問題が。

  • スタックフレーム間は直接ポインタで指しているので、realloc()してスタックのベースアドレスが変わったらリンクを全部直さなくちゃならない。それを避けるためにスタックをchunkに分けると、境界での処理が面倒。
  • スタック内のポインタと疑似ポインタ(ポインタのように見える整数)は、現在のスタックポインタの値にかかわらず、全てGCのスキャンの対象になる。スタックが大きくなればなるほどGCへの影響が大きい。(popする時や環境がヒープに移された時にnullifyすればGCへの影響は避けられるが、こんどはnullifyのコストがかかるので、性能への影響は複雑)。

で、根本的な解決として考えているのは、次のような戦略です。

  • Boehm GCにフックをかけて、スタックエリアのポインタスキャンを賢くやる。
  • それが出来たら、一杯になったスタックを移動させずにそのままヒープとして扱うことが可能になる。
  • call/ccも、継続フレームをコピーせずにスタックベースポインタを動かすだけで可能になる(スタックベースポインタ以下はヒープ扱いになる)。
_ささだ(Sun Aug 31 23:00:43 JST 2003)

 うーん、やっぱりきちんとソースを追わないとわかんないですね。今度読ませていただきます。

_新潟のS(Mon Sep 01 06:39:44 JST 2003)

 機会があったらCPSの入門書を紹介してください。どういう経緯でその理論は生み出されたの?

_30(Sat)

akrさんに、 SPA という存在を聞いたので、調べて見たら、先日の SPA(SPA-SUMMER 2003) の幹事の方って、農工大の人じゃないですか。しかも、隣の隣の研究室・・・。まだ品川さんとお会いしたことないんですが、これを機に話聞いて見ようかな・・・。ダメだよな、この研究室同士の閉鎖性。

SPAを調べていたのは、akrさんの論文を読みたかったからなんですが、置いておらず。春の論文は(Googleで)ひっかけられたんだがなぁ。明日いらっしゃったら聞いてみよう。

しかし、これってポスターセッションしか無いものなの? ポスターだから論文ないんかな。

しかし、いいよな、温泉・・・。


明日、というか今日は reloaded だったんですか。

遅刻するかもしれませんが、行きます。


女の子と付き合ったことがないんですけど…。あははははははははは。(とてもとても笑えない)


前田先生の、「Schemeインタプリタにおける仮想マシンアーキテクチャの最適化」という論文を、どこをどー探しても出てこない。昔見て、しかもプリントアウトした記憶があるような気がするんだけど、見つからない。ウェブ上を探しても見つからない。PRO論文誌を探しても見つからない。うーん、どこいっちゃったんだろうな。研究会報告誌も無いし・・・。


とりあえず終わった。とりあえず帰ろう。5時。cronの時間過ぎちゃったな。


おねがい☆ツインズとやらを初めて見る(寝ろよ)。あれは C++ なのかなぁ。

苺が性格変わってる気がする。OPはシューティングスターがやっぱり秀逸だったんだなぁ。

しかし、目の色はともかく、髪の色全然違うじゃん。

プログラマの部屋はこんなに綺麗じゃないよな、きっと・・・。しかし、いいなぁ、ああいう環境でプログラミングな生活。いや、別に双子と名乗る女の子が二人押しかけてくるような生活が羨ましいというわけではない。多分。


いろいろ私が世話になっている本学科の畠山先生が本をご出版されたということで、紹介させていただきます。

情報科学のための自然言語学入門―ことばで探る脳のしくみ(amazon)。

生成文法理論とか、Xbar理論とか、そういうのだと思います。彼の授業は非常に面白いんだけど、学生をバカにしたところがあるので(ぉ、なかなか突っ込んだことを教えてくれません。そのため、自分でこの本は買って読んでみようかと思ってたりします。頼めば貸してくれるかな。そういえば、著者割引ってきくのかな? 効くんだったら安く買わせて貰うか。

内容説明というのを引用します。

我々の脳の中には「文法」がある。この「脳内文法」のおかげで我々はことばを生み出し、それを理解することができる−。「脳内文法」のメカニズムを具体的に解説した理論言語学の入門書。言語獲得の謎を解き明かす。

学部のときの授業では、「なぜ人は言語を使うことができるのか?」って感じで進んでました。そんな感じの話の本らしい。ちっちゃな子、言語習得が未熟な子でも、最低限の文法は知っているはずだ、これは経験的なものではない、という主張。ということで、実際に彼のお子さんで実験したらしい(笑)。お子さんも大変です。

で、その生まれながら知っている最低限の文法ってなんじゃ? というのを研究するのが生成文法理論、だったような気が。安直に考えると、その最低限の文法を計算機が知っていれば、ある程度の学習によって「言語」が扱えるようになるはずだわな。本当はこの辺ももっと勉強してみたいものではあります。この本読めばそれが書いてあるんかなぁ。

_新潟のS(Sat Aug 30 07:21:44 JST 2003)

 女の子はやたらとエラーを連発するコンピューターみたい。エラーにめげずに試行錯誤するしかないのかも。コンピューターとつきあう方が楽しいなぁと思った若かりし頃の私。

_nobsun(Sat Aug 30 11:03:26 JST 2003)

 燃えるような恋をしましょう。って、望んでできるものじゃないけど。。。

_すぎむし(Sat Aug 30 11:22:00 JST 2003)

 女の子と付き合ったことがないいま(今日)のうちに、Rubyちゃんコスプレなどひとつ、ご検討くださいませ。

_ogino.(Sat Aug 30 15:08:49 JST 2003)

 コンピュータ系で閉じると比率の問題で熾烈な競争をくぐり抜けないといけなくなるので、外の領域を攻めるのが吉。 あ、熾烈な競争に勝てる自信があればそんなことしなくていいのか。

_ささだ(Sun Aug 31 01:17:08 JST 2003)

 なんで一行にこんなに反響があるんですか(笑)。

_29(Fri)

eclipse でやってみよーかー、と再度手を出すも、クラスパスの設定がどーーーーーしてもできなくて挫折。なんでー、どうしてー。

なんで javac -classpath c:/nantoka/kantoka src/natnoka.java とかしかやっていなかったことに、こんなに苦労せにゃならんのじゃ。

ワークベンチの外にある「クラス・フォルダー」は設定できないのかな。そういうことするのなら jar 作れ、ってことなのかしらん。うー。

う、いつのまにか、クラス郡が消えてた・・・。なんか色々やってるとき、消えたかな・・・。あ、出来た・・・。

う、白いエディタだと目がちかちかする。背景色って変えられるのかな・・・。設定できた。

うーん、便利機能は面白いけど、エディタでなんやかするのは xyzzy のほうがいいなぁ。ただの慣れかな、これは。


うわー、警告が沢山・・・。

うーん、外部に置いたクラスファイルのソースを指定する方法は無いものかな・・・。下手にプロジェクトに入れるとコンパイルされてしまうな。

タブがスペースになってくれない。致命的かも。

誘惑に負けて、外部クラスのソースもくっつけてしまった。プロジェクトをちょっと変更しただけで、全部コンパイルしだすので数分。うへ。


暑すぎ。学校のクーラーに避難するしか。


http://arika.org/diary/20030828.html#p01。喫茶店って、ガキの頃(今でもか?)、ほとんど入ったことないんですが、そういう世界もあるんですね。

Subject: mission haiku (perl6-internals@perl.org)だって。俳句かー。なかなか微妙。


Gauche やらんとなー、ということで、原因はわかったのでいい加減に対応。

// gauche.h
#else // for old cygwin

#define SCM_CLASS_LIST      (Scm_ListClass_ptr())
#define SCM_CLASS_PAIR      (Scm_PairClass_ptr())
#define SCM_CLASS_NULL      (Scm_NullClass_ptr())

// class.c
#define SCM_CLASS_PTR_accessor(klass) void * klass##_ptr(){ return & klass; }

SCM_CLASS_PTR_accessor(Scm_ListClass);
SCM_CLASS_PTR_accessor(Scm_PairClass);
SCM_CLASS_PTR_accessor(Scm_NullClass);

う、SEGV。はて、それなりに動くようになったんだがなぁ。

ext/charconv/charconv.scm をロードすると死んでる。んー。

(dynamic-load "libcharconv" :export-symbols #t) で落ちてるなぁ。一部のシンボルだけ付け焼刃に対応しても、ダメってことかな・・・。

しょうがないから binutils 上書きしようとしたら、エラー・・・。慌てて戻す。リンカだけアップデートってどうやるのかしらん。新しい cygwin が必要なのかな。これを機に一気にアップデートしようかしら。

うーん、cygwin に入れるのを諦めるか。

linux機にはさくっと入った。うーん。


うーん、gauche で昨日のをやったら、まずリストを作れなかった。末尾再帰じゃないと、これだけダメなのか・・・。

ということは、MzScheme(DrScheme) とか ChezScheme は、CPSに変換しちゃってるのかな。さくっと終わったもんなぁ。うーん、どうなってんだろ。

(define (make-list n lst)  ; こうしないと終わんなかった
  (if (eq? n 0) lst
	(make-list (- n 1) (cons n lst)))) 

(define l (make-list 100000 ()))

;(time (count l))
; real 759.851
; user 749.100
; sys    0.110
100000
gosh> ;(time (count/cps l values))
; real   0.303
; user   0.300
; sys    0.000
100000
gosh> ;(time (count/tr l 0))
; real   0.122
; user   0.120
; sys    0.000
100000

なんというか、全然違うねー。というか、関数呼び出し遅すぎ? なんでだろう? ここまで違うとは思わなかったんだけど。実装きちんと見ないとわかんないかな。

_Shiro(Sat Aug 30 17:16:32 JST 2003)

 あ、この差はGaucheのスタックオーバーフローハンドラがタコなせいです。スタックが溢れるまでは非末尾再帰の方がむしろ速いと思いますが、溢れると急激に性能が低下します。

_ささだ(Sat Aug 30 19:58:17 JST 2003)

 なるほど納得です。

_28(Thu)

実は double method(謎)ならいいとか、なんとか・・・。

しかし、昨日の日記は長すぎだ。


Scheme 難しいのです。うーん。

  • 便利な関数コールモデル
  • actorモデル

のどちらで捉えるのがいいんだろうなぁ。どちらでも捉えられるから、Scheme は偉いんだ、というのかもしれないなぁ、と思ってみたり。

そういえば、相互末尾再帰は回数だけじゃ計算できない、というのは、もちろんそうだと思います。でも、Ruby でそのような小難しい例やるかなぁ、とか ^^;

もしかしたら、新しい妥協点として、

  • 最後の3個くらいの履歴を残す

みたいなのもあるかもしれません。イメージとしては ruby の(長すぎる)スタックトレースの省略です。これなら余計なメモリは要りません。どれが一番いいんだろうな。


気分転換に。

(define (count lst)
  (if (null? lst) 0
      (+ 1 (count (cdr lst)))))

(define (count/cps lst cont)
  (if (null? lst) (cont 0)
      (count/cps (cdr lst)
                 (lambda (x)
                   (cont (+ x 1))))))

(define (count/tr lst n)
  (if (null? lst) n
      (count/tr (cdr lst) (+ 1 n))))

(define (make-list n)
  (if (eq? n 0) ()
      (cons n (make-list (- n 1)))))

(define l (make-list 1000000))

(time (count l))
(time (count/cps l values))
(time (count/tr l 0))

わざわざ末尾再帰でいいものを、CPS で書いたのと、何も考えないの。処理速度を測ってみると、

ChezScheme にて。
> (time (count l))
(time (count l))
    31 collections
    1609 ms elapsed cpu time, including 1202 ms collecting
    1625 ms elapsed real time, including 1218 ms collecting
    32693576 bytes allocated, including 45253824 bytes reclaimed
1000000
> (time (count/cps l values))
(time (count/cps l ...))
    14 collections
    766 ms elapsed cpu time, including 439 ms collecting
    797 ms elapsed real time, including 439 ms collecting
    16010040 bytes allocated, including 176608 bytes reclaimed
1000000
> (time (count/tr l 0))
(time (count/tr l ...))
    no collections
    187 ms elapsed cpu time
    188 ms elapsed real time
    0 bytes allocated
1000000

何も考えないのの、1/2 くらいで CPS 版が行くのが、結構不思議。同じだと思ってたんだけど。何が要らないんだろう。GCの回数をみてみると、ChezScheme はスタックフレームはヒープに取ってんのかな。/cps のGCはクロージャ捨てるGCだろうし。あれ、クロージャよりもフレームのほうが、でかいのか。って、違うか。フレームは最後まで残るから、GCの回数が増えるのかな。はて? それとも、動的にスタックを伸ばして、要らなくなった元スタックにGCかかってんだろうか。

DrScheme も大体こんな割合。

gauche は、環境がないので出来ませんでした ^^; 誰かやって(ぉ。って、Linux機に入れればいいだけか・・・。

もちろん、「なんでも継続」を読んで、性能が気になってみただけなのです。スタックコピーに関する4つのモデルって、あと二つ、思いつかない。

  • スタック全部コピー(関数呼び出しモデルで、無理やり call/cc を拡張)
  • continuation は常時持ってるから何もしない

って、論点が全然違う気もするな。完成が楽しみです。


多値について、全然知らないんですが、Ruby に入ったらそれは美味しく使えるものなんでしょうか。

今の仕様は、本当に大変そうで。収束させたい欲求をよく抑えてるなと思います。きっと、もっと綺麗なモデルがいくつも頭の中にあるんだろうなぁ。(使いやすいとは限らない・互換性に問題が)


というかね、今更 ruby の node.h を見てるわけですよ。VM妄想してる奴が今更。我ながら、バカだよなぁ。RHGに載ってましたけど。えーと・・・。すみません、きちんと読んでませんでした。

んで、やっぱりわからないのも結構あるなぁ。名前だけで類推するのはちょっと無理かなぁ。土曜日にでも聞いてみようかなぁ。


次の投票ネタ何にしよう。


もっと勉強しなきゃいかんですねぇ・・・。

_27(Wed)

案の定筋肉痛。


末尾再帰を最適化する Scheme のような処理系の実装で、スタックトレースってどうやるんだろう。うーん。そんなの無視だ! というのが一般的なのかな。


うは、ruby-list に未読がたくさん。

独習 Scheme 三週間(sicp-reading)。Teach Yourself Scheme in Fixnum Days の nobsunさんによる翻訳。素晴らしい!!

Scheme 薦めるときは、このリンクをまず教えよう。

私みたいにRSR5を見ると挫折する(何年か前にした)。

惜しいのは、charset がついてなくて、IEだとしばしば化ける。

しかし、3週間なのですね。


SuperHオープンフォーラム 行ってきました。3時から。遅刻。

ちょうどポスターの時間だったんですが、早稲田笠原研のお話をいろいろ聞くことができました。非常に興味深かったです。

せっかくだから、感想文。

■力覚ディスプレイSPIDARのためのSuperH搭載ハプティックコントローラの開発 東京工業大学  佐藤教授

こういうの素人なんですが、楽しそうですねぇ。

■ミレニアムプロジェクトIT21 "アドバンスト並列化コンパイラ"とコンパイラ協調型チップマルチプロセッサ 早稲田大学  笠原教授

こういうの素人なんですが、3年間でってのは凄いと思いました。技術的なアレは後述。

■ユビキタス・コンピューティングを実現するT-Engine 東京大学 坂村教授

こういうの素人なんですが、坂村先生って、喋るの上手ですねー。なんというか、実演販売を思い出しました。

Java に T-CODE ってすごいな。


後述って書いたのをすっかり忘れていた。

早稲田笠原研では、昔から作ってきた Fortran コンパイラを利用して研究を行っているそうです。自作だから、自分でいろんなことできるそうです。どこをどう弄ればどうなるか、きっとそういうノウハウがあるのでしょう。やはり、そういうところは強いです。ちょっとコンパイラ弄って見ようかなと思っても、なかなかすぐに実装に取り掛かれるものではありません。

実は、私は修士のネタで自動並列化コンパイラがやりたかったんです。しかし、本研究室ではそのようなバックボーンがありません。0からの出発が必要です。しかも一人。ノウハウもありません。正直、諦めるしかないかな、という状況です。

餅は餅屋、コンパイラはコンパイラ屋、なのかもしれません。

ちなみに、彼らのアプローチのお題目として、マルチグレイン並列化コンパイラ。粗粒度はタスク並列化、中粒度はループ並列化、細粒度は式ごとの並列性の抽出。まぁ、粗粒度、中粒度は従来のコンパイラでやってきており、OpenMPのディレクティブを挿入するような話だそうです。いや、「ような話」といっても、十分成果が出ているし、必要な研究だと思います。でも、説明を受ければ、なるほどそうか、というところ。

で、私の研究ともろに被る(であろう)部分はファイングレイン、細粒度。話を聞くと、スタティックスケジューリングによるもので、コンパイル時にどのプロセッサユニットでどの計算をするか、というのが既に決まっているそうです。

要するに出来レース。いや、計算分野では出来レースを作るためにみんな頑張るわけですが。

割り込みはどうするの? とか、外部からの撹乱に関しては、今後の課題らしいです。というか、笠原先生に教えてもらってしまいました。(意外と)若い方でびっくりしました。

実際のシステムに利用するためには、まだまだ考察が必要なようです。

計算モデルとしては、既にスケジューリングされた計算資源が、それぞれ自分の仕事を淡々とこなしていく、そんなイメージ。OSCAR のローカルメモリ、共有メモリの話とか、まさにSMPで応用されてましたね。うちでもそういうことやらなきゃいけんのかなぁ。というか、それは内倉君にやってもらおう。ケケケ。

うちは、もちっと大胆に行くための何か、なので、やっぱり違う話なようです。大胆に、というか計算無しに、というか・・・。世間ではそれを無謀と言います。いや、でも細かい計算はプロセッサにやらせるのがうちの方針だし。多分。


というかなんでK本さんがいるんですか、って感じなんですが。ホットドッグおごってもらいました。

んで、学校に帰ってきて9時半。これから作業。うーん。


JDCセミナー:ガベージコレクション in Java(jvm-talk)。イイナァ。行きたいなぁ。

ただ、GCを作る話よりも、GC上の言語(Java)をよりよく使う話なのですね。

む。。。実装の話が無いなら行かなくてもいいのかな。どうしようかな。無料だしなぁ。同時通訳って見たこと無いから行ってみたい気もする。


(学校に)帰ってきたら、末尾再帰の話が盛り上がってますね。なるべくコメントへはコメントで返すようにしてたんですが、長くなりそうなんで、こちらに。(面白い議論なんで)どこかの wiki のページに移すほうがいいような気もするんですが、どこが適当かわからないので現状維持。

セキュリティモデルの話は知りませんでした。末尾再帰の最適化と一級継続を実現するためのJVM の機能拡張 には、そのこと書いてなかったようですし。

Scheme は、CPS で実装することはあるとは思うんですが、言語の概念がCPSだとはちょっと思えないんですが。って、天に唾吐く行為ですね。自分はScheme は Lisp の延長だと思っていたので、やっぱり関数を呼んで戻って。それで、末尾の場合は特殊な最適化をするから、どんどん末尾再帰を使えよ、という言語だと思っています。だからいつまでもダメSchemer なのかもしれませんが。


もちろん、こんな話を書いたのは、RubyVMで末尾再帰の最適化を行うにはどんな方法がいいのか、というのが最近の暇つぶしのネタだからです。電車の中でこういうこと考えていると、すぐ目的の駅につきます(それか眠くなるか)。具体的には、スタックフレームの構造なんですが。

で、考えていてスタックトレースどーすんだろ、と思って。考えたのが

  • 中田さんの言うように、ほかに情報をストアする何かを作る
  • スタックトレースをスッパリ諦める
  • その他

だと思いました。

リストか何かを作ると、もちろんその分容量食うし、そもそもそれを消すのはどうするのか。固定長配列だと、それの長さが制限になる。ダイナミックにすると、そいつをGCさせるのは、(性能向上のために末尾再帰最適化やってんのに)全然遅くなりそう。というか、数百万回末尾再帰でのループしたらきっとメモリ足りません。

スッパリ諦める。多分、Ruby的に良くない解決方法だと思いました。デバッグのし易さが著しく落ちると思います。

ただ、リリースモードではその最適化をかけて、開発は通常で行う、ということが考えられます。なので、末尾再帰最適化はオプションで、リリース時だけそれでやってね、というのはもしかしたらいい考えかもしれない。(普通やってば)

でも、全部情報が落ちるのもなんかアレな気がする。やっぱりRubyらしくない(わかりづらい)。


で、妥協点として考えたのは、スタックフレームに末尾再帰を何回したか、という情報を加える。これならデバッグの指標になるような気がするし、末尾再帰ごとに必要になるメモリがない。

というわけで、今考えているスタックフレームは、フレームポインタ、メソッドリファレンス、ブロック情報、末尾再帰情報の4 word。多分、末尾再帰情報は、フレーム情報という形にして、16bit くらいを利用、ってことになるんだと思う。


とか考えてるんですが、安直かしら。自分では結構ナイスな妥協だと思ってるんだけど。


GoF と言えば?。なんか綺麗な数字になったな。

私は、デザインパターンの本の序文などを見る度にあの素敵な音楽を思い出してしまうんですが、皆様はどうなのかなと思った次第です。

ちなみに、GoFは同人ゲームじゃありません。同人音楽ソフトです。(とか言う。だってあのメンバーは贅沢スギだろ! 私はべるめいさんの大ファンなのです)

_shujit(Wed Aug 27 17:31:56 JST 2003)

 スタックトレース with 末尾再帰除去、けっこう興味あります。shuJITでは、末尾再帰除去をした際は、スタックトレースはあきらめました。Javaだと、古いセキュリティモデルがスタックの深さに頼ってるから、末尾再帰をジャンプに変換しちゃっていいのか? という問題もありました。

_なかだ(Wed Aug 27 18:23:55 JST 2003)

で、それはどう解決されたんでしょうか。< セキュリティモデル

末尾再帰除去してスタックトレースも、とするには、別に専用のリストかなにか用意して、そこに最小限の情報だけ積んで行くしかないんじゃないかと思いますが、そうするとそっちが深さの制限になってしまうでしょうし。

やっぱりあきらめる以外ない?

_shiro(Wed Aug 27 19:24:59 JST 2003)

 そもそもCPSだと「呼び出し→復帰」というモデルじゃないですから、スタックトレースという概念自体が意味あることかどうか…

「別に専用のリストかなにか用意して」というのはある意味正しいアプローチで、というのはスタックモデルな言語におけるスタックトレースというのはプログラムの状態履歴のごく一部の情報に過ぎないわけです。本当に調べたい関数はもう復帰しちゃってて状態が見られないなんてことは良くある話で。スタックトレースで何が見たいのかということだと思うんですが。

_なかだ(Wed Aug 27 22:06:22 JST 2003)

なるほど。やはり(そういうシステムでは)スタックトレースはあまり気にしても意味がないに一票。

_なかだ(Thu Aug 28 00:04:20 JST 2003)

 回数は考えてみたんですが、相互再帰には使えないなぁと。そこまで必要ないかな。

_ささだ(Thu Aug 28 00:16:16 JST 2003)

 相互再帰とかは、回数さえわかれば計算できるから要らないかな、とか思ったんですがどうなんでしょうね。

_shiro(Thu Aug 28 04:14:54 JST 2003)

 相互再帰の情報は回数からだけで復元できなさそうに思います。飛び先か飛んで来た元を保存しておかないと。私は相互再帰をよく使いますが、頭の中では状態遷移ネットワークになっているので、「手続きを呼んでいる」という感覚が無いです。

_kjana(Thu Aug 28 17:15:03 JST 2003)

Scheme は Actor の continuation が良くわからないから シンプルに実装してみた.... ら,末尾再帰を最適化した ふつうのラムダ計算と区別が付かなかった,っていう言語 だから CPS は結構本質的な計算モデルの一部なんじゃな いかと想像しますが.

スタックトレースについては,Gauche ではあきらめてる ようですね. http://www.shiro.dreamhost.com/scheme/wiliki/wiliki.cgi?p=Gauche%3aFAQ&l=jp#21

_fukumori(Thu Aug 28 23:21:10 JST 2003)

笠原研には愉快な人々が沢山いました。(今もいたりして)FortranのパーサをEmacs Lispで書いたヒトとか(さすがに後から来た人たちがメンテできなくて続かなかったらしい)PostscriptでRay Tracingによるコンピュータグラフィックスのプログラムを書いて(10年前のことです。Slashdot Japanでも最近似たような記事があったような気がするけど、それよりもはるか昔)プリンタにジョブとして放り込んだら、結果が出るまで1時間くらいプリンタが黙ったままになってみんなを困らせたヒトとか。まだまだありますが、今日はこの辺で。

_26(Tue)

多重継承だと名前のオーバーライドをどうするかが大問題で気軽になんかできないような気がしますが、モジュールだとそゆことがない感じ、って akrさんが既にそう書いてますね。

ruby では、そのオブジェクトが「クラス」に属している、ということを調べるメソッドってないですよね。その辺が ruby なのかなぁ、と思ったりしたんですが、よくわかりません。ないと困る用途。うーん。


昨日、会議中に暇だったので、安全な配列ってことで、[]= を再定義して、前入っていた型と違うもの入れちゃ駄目な、そんなのを作ろうと思いました。a = [1]; a[0] = "2" #=> エラーみたいな。

ancestors の積集合見ればいっかとかちょっと思ったんですが、Comparable とかが共通とか言われてもあまり嬉しくないのかな、とか。なら、 obj.class.ancestors.map{|e| e.class == Class ? e : nil}.compact とかすればいいんでしょうが(あと、Objectを抜いて)。そのとき、クラスだけ調べるって無いんだな、ってちょっと思ったんです。んで、module と class の関係について、ちょっと考えてました。

んー、全然この文章まとまってないですね。

この安全な配列ってのに限れば、generic っぽく面倒に逃げるしかないのかな・・・。


なんでこんな日に限ってこんな天気かね・・・。


何年かぶりにプール行ってきた。明日は筋肉痛・・・。


漢字の勉強に勤しみたいと思います。

_ま。(Tue Aug 26 02:33:46 JST 2003)

 kind_of?とかのこと?

_ささだ(Tue Aug 26 07:24:07 JST 2003)

 kind_of? だとモジュールorクラスで指定しますよね。「クラスのみ」がないという意味で。昨日、それでは困るかな、と一瞬だけ思ったんです。でも、一瞬だけだったようです。

_madayuuka(Tue Aug 26 09:41:45 JST 2003)

 めそっどメイハぐろーばる

_25(Mon)

金払ってバイト行ってきました。一日中プログラミングの話、という経験はあるが、2日間ずっとコンパイラの話、というのは初めて。


電車の中で、3歳くらい? の女の子がお母さんにガムをねだって泣いていた。お母さんはいろいろ言っていたが、聞こえてきた声で笑ってしまったのが、「泣くようなことなの?」

_24(Sun)

というわけで、読書会でした。遅刻でした。

というかですね、foldr とか fold とか、言われても、私未だに右左がどっちだかわからないので(誇張、でも苦手)、よくわからないわけです。

うーん、Zopeの話聞きたかったなぁ。


jvm-talk 、以前の前田先生のバイトコード、VM構成法の話がひじょーに面白かったです。今度直に教わってみたいものだなぁ。


というかですね、まだスライドできてないわけですよ。うは・・・。


ruby リファレンスマニュアルRuby用語集より。

即値 Immediate Value 参照ではなく、実際の値が変数に格納されるもの。Rubyの現在の実装ではFixnumとnil/true/falseだけが即値である。しかし、Fixnumが即値でないRubyの実装があっても構わないし、モデル上全ての値がオブジェクトへの参照であると考えても差し支えない。

即値だったらしい。


class Fixnum
  attr_accessor :a
end

1.a = 10
p 1.a    #=> 10
p 2.a    #=> nil (t.rb:9: warning: instance variable @a not initialized)

うあ・・・。なるほど。mutable。true/false/nil も同様。

class Float
  attr_accessor :a
end

(3.1).a = 10
p((3.1).a)   # nil

まぁ、こうなりますわな。


Rubyリファレンスマニュアル - Objectより。

ruby 1.7 feature: version 1.7 では、Numeric オブジェクトなど immutable(内容不変)であるオブジェクトを複製しようとすると例外 TypeError が発生します。

んー? ただの言葉遊びだな、これ以上は・・・。


Fixnum.module_eval{ attr_accessor :v }
%w(Just another Ruby Hacker).each_with_index{|w,i| i.v = w }
4.times{|i| print i.v,' '} #=> Just another Ruby Hacker

#探偵ファイル/探偵魂 すごいなぁ。色々と。

Amazon.co.jp: DVD: 天使のたまご。見てみたいなぁ。


出雲・松江〜東京(渋谷) スサノオ(夜行バス)。ぐあー、往復で2.5万かー・・・。飛行機で行けば片道それと考えれば・・・しかし・・・。

東京から。むぅ。

あとはえっちらおっちら電車で行くか、下をバイクで走るか・・・。ヒッチハイクってのもあるか。

_23(Sat)

(ruby-talk:79936) [ANN] Ruth 0.10 を見て、インストールしようとしたら、入らない。なんでじゃー、とか見ていたら、makeプログラムで ruby と make を直打ちで使ってた。うちは mswin で、ruby の名前も ruby じゃないんだよう・・・。まぁ、ちょろちょろやって、入れてみる。

rescue とかやると死んでくれる。デバッグしようかな、どうしようかな。

そうか、simple_ones に入ってない Node は読めないわけね・・・。

(ruby-talk:79944) I think so :)


そういえば、Dr. Stephen Bloch(Tiny CLOS Tutorialの人)から返事もらってたんだ。

なんか、Teaching Programming and Algebra with Scheme のようなことやってるでー、と教えてもらったんだけど、$840 ってあんた・・・。高校の先生にそれを払わせるのか。それとも、学校が出してくれるんだろうか。日本じゃどうなのかな・・・。

あと、CSC 160 A First Course in Computer Programming こんなんとか。


ああ、問題あった。特異メソッドだ。

obj = 1.1
obj.freeze
def obj.a;end #=> えらー ふろーずんだぜい

obj = 1
obj.freeze
def obj.a;end #=> えらー ふぃっくすなむはだめー

obj = nil
obj.freeze
def obj.a;end #=> おーけー

最後はなんとなくだめな気がする。どうあるべきかはわかりません。

frozen object is immutable. だけど、not frozen object is not immutable 、というわけではないということか。

frozen object と immutable とは、別の概念であるわけで。多分。


というかさ、私はこんな時間(1時)まで何をやっているの? 昨日一日空けていたはずなんだけど。一日中日記を書いてたのか私は。報告資料はどうしたの?>自分 実装はどうしたの? 研究はどうしたの? あーうー。


もうちっと相手をもてなすということを覚えろ。どいつもこいつも自分のこと ばっかし考えやがって。

猛省。


jvm-talk に入っていなかった(バイト先のメールアドレスで読んでたんだけど暫く前に辞めちゃったし)のを今更思い出し、入る。


Gauche:プロセスを越えたlambdaの移送を読んでたんですが(仕事しろよ!)。

(define (plus x)
		(lambda (y) (+ x y)))

のとき、(send-plambda to (plus 1)) みたいに送ると、

(lambda (y)
  (let* ((x ((lambda (get-value-from-server 'x))))
         (+ ((lambda (get-value-from-server '+)))
	 ... and other environments using in this lambda ...
         )
       (+ x y)))

みたいにしてクライアントに渡してしまう、みたいなのは安直じゃろうか。安直だろうな。

破壊的メソッドは使えませんが(使おうとすると、組込み破壊的メソッドすべてに対してこれのサポートが必要になる)。継続に関しては、似たように使えそうな予感。

性能はアレでナニだろうが・・・。

つうか、すべての関数呼び出しで通信が発生! ウザ!

まぁ、組込み関数については最適化が可能か。あれ、駄目か? まぁ、その辺は「実装の都合じゃ!」とか言って逃げるのもありか。


すみません、今日は午後から行きます・・・。

_nobsun(Sat Aug 23 13:22:22 JST 2003)

 早くきてぇ。じらすなんてぇ。にくいぃ

_新潟のS(Sat Aug 23 21:32:06 JST 2003)

 ささださんのハフマン木の生成のコードに感動。エレガントだねえ。

_shudo(Sat Aug 23 22:19:00 JST 2003)

 jvm-talk ML、なんかおもろい話題ないかなあ。ML にかまけてる時間とか精神的余裕がない今日この頃。

_ささだ(Sun Aug 24 00:58:23 JST 2003)

 あれはnobsunさんが勘違いしてただけじゃ・・・。

_22(Fri)

ko1@lalune:~$ uname -a
Linux lalune 2.4.18-10k #1 Tue Mar 12 21:42:04 JST 2002 i686 unknown
ko1@lalune:~$ time ruby -ropen-uri -e 'open("http://www.ruby-lang.org/")'

real 0m32.025s
user 0m0.290s
sys  0m0.030s

なぜこんなに時間が・・・。

ko1@lalune:~$ time w3m www.ruby-lang.org > /dev/null

real 0m2.558s
user 0m0.070s
sys  0m0.010s
ko1@lalune:~$ time ruby -rnet/http -e "Net::HTTP.get('www.ruby-lang.org','/')"

real 0m10.280s
user 0m0.150s
sys  0m0.010s

素人にはよくわかりません。2回リダイレクトってことで時間の帳尻はあうけど、なぜ一回10秒。

srace 見たら poll で止まってるんだよな。なんとなく。


ruby-talk:4891、FL ってなんだろう、って悩んだけど、 Eiffle のこと、でいいのかな。ifl のほうがいいような気がする。

Design by Contract in Ruby 。誰か使ってる人いるのかな。


いやー、それだけ散らかしスペースがあるのはスゲー羨ましいんですが。というかディスプレイx2 いいなぁ。


衝撃。a=10; p(1 == 2 ? 1 :a) シンタックスエラーにならないんだ。

って、RHGに無茶苦茶書いてあったですね・・・。


proxyっぽいものを作ってみる。1.8にはzlib は入ってないのか。ガーン。 入ってます。すみません。

とりあえず、全部小文字で返してみると、mozzilaもじらは効いたけど、IE では見れず。何がいけないんだろう。

いや、違うか。mozzilaもじら1.5a が頑張ってるだけか。じゃあ作らないでいいや。しかし、IEで見れないのはやっぱり不便だな。なんとかならないかな。


チョコとん 昨日食べたチョコとん。これも fukumori さんにご案内していただきました。カラシをつけて食べると微妙だけど、そのままだと別に。あぶらっこいチョコレートという感じ。ソースをつけるかどうか悩んだ。なぜか IBMな方たちと。

一応、書いておくと、カツの間に挟まってるの、ソースでも味噌でもなく、チョコです。


URDA ウルダ(simple)。声優や音楽がいかに偉大かということを知る。


投票の結果(冷やし中華にマヨネーズをかけますか?)、人生の半分(略)。布教せねば。


接続でアレなのは、ただ単にリゾルバだったらしい。ネットワーク素人にはわけわかりません。

ko1@lalune:~$ time ruby -rnet/http -rresolv -e "
Net::HTTP.get(Resolv.getaddress('www.ruby-lang.org'),'/')"

real    0m0.427s
user    0m0.200s
sys     0m0.040s

ko1@lalune:~$ time ruby -rnet/http -e "Net::HTTP.get('www.ruby-lang.org','/')"

real    0m10.803s
user    0m0.130s
sys     0m0.020s

ko1@lalune:~$ time ruby -rnet/http -rresolv-replace -e "Net::HTTP.get('www.ruby-
lang.org','/')"

real    0m0.428s
user    0m0.220s
sys     0m0.050s

知らないことがイッパイイッパイ。


Python チュートリアル。素晴らしい。


p 1.frozen? #=> false
1.freeze
p 1.frozen? #=> false

はて? いや、そもそも immutable object への freeze/frozen? って何さ、という話だとは思うのですが。


JavaGo について、名前だけみて気になってたんだけど、さすがにライブラリだけでの実装は無理なのね。

_あおき(Fri Aug 22 17:42:32 JST 2003)

 うちだと open-uri で 3 秒くらいです。

_ま。(Fri Aug 22 19:42:20 JST 2003)

 Guyはフランスの中の人なので「エッフェル」と発音するのでは。

_ま。(Fri Aug 22 19:44:31 JST 2003)

 1.8にzlib入ってると思うんですけど。

_6(Fri Aug 22 19:50:01 JST 2003)

 リゾルバで10秒食ってると見た。

_ささだ(Fri Aug 22 20:01:24 JST 2003)

 すんません、入ったってどっかで読んだ気がしたんで、lib/ruby/1.8 以下を見て、見つからなかったもので、勘違いしました。ただ単に zlib.lib が無くてコンパイルされなかっただけという間抜け。

_匿名希望(Fri Aug 22 21:22:45 JST 2003)

 Mozilla ?

_なかだ(Fri Aug 22 22:23:35 JST 2003)

 mozilla

_shudo(Fri Aug 22 23:34:16 JST 2003)

 JavaGo ときたら、MOBA よろしく。ライブラリだけです…と言っても、Cでゴリゴリやってるのだけど。www.shudo.net/moba/

_ささだ(Sat Aug 23 00:06:48 JST 2003)

 いやー、JavaGo では「ネイティブメソッドみたいな変なもんは必要あらへん!」(意訳)と言ってたので、いったいどうやってやるのかなぁ、と思いまして。Javaのリフレクションは実行時コンテキストまでアクセスできるのか! とかちょっと思ってしまいまして。

_21(Thu)

アルゴリズムの穴に気づき、全部やり直し。とほほ・・・。

ぐあー、やっとデバッグ終わり。かえろー・・・。もう4時だよ。cron が動く時間だよ。


というかね、こちとら srfi なんて知らないわけですよ。知ってるのなんて lambda と car cdr cons くらいなんですよ!(威張るな)

きっと知ったら楽ができるんだろうけど、それをする気合が入らない。記憶力もない。


やっと既知外小説エルリックサーガ7巻を読み終わった。ひたすら疲れた。


いろいろ楽しかったです。懇親会では、刺身が美味かった。サーモンだったんですかね? 寿司は微妙。


言語処理系と OO な技術について。やっぱりどの辺が問題で、どこがアスペクトによって解決できる話なのかわからない。

ちなみに、テストケースなどより、契約なんかの話のほうが、相性はいいと思う。でも、Eiffel によるコンパイラ構築な話ってあるのかな。


気になったのが、「開発環境付きのOOP と、それなしのOOP は全然違う」という話。エディタだけで書くのは駄目なんだそうで。

じゃぁ Ruby は?

ちなみに 素の xyzzy で Java 書いてるんだけど、こんな私は駄目なんでしょうか。開発環境使うと幸せになれるのかなぁ。


いや、Java で解くんですけどね、昨日の。だから、破壊的なリストの演算でいいんだけど。

えーと、fortran に equivalence文ってのがあります。

       integer a1(3),a2(3),a3(3),x,y
       equivalence (a1,a2), (a1(2),x), (a2(3),y), (y, a3(2))

とか書くと、

union{
  struct{
    int val[3];
  }a1;
  struct{
    int val[3];
  }a2;
  struct{
    int padding[1];
    int val;
  }x;
  struct{
    int padding[2];
    int val;
  }y;
  struct{
    int padding[1];
    int val;
  }a3;
}equiv_1;

になります。変態です、こんなの。


わ、ほんとに少ないですね、今月の sicp-reading。zopeについても学べて今月はお得なはずです。(シツコイ)

_新潟のS(Thu Aug 21 23:38:42 JST 2003)

 昨日のやつ、書いてみたんですが、うまくいかない。難しいんですね。じっくり考えてみます。

_nobsun(Fri Aug 22 09:48:24 JST 2003)

 Shiro さんところにきれいな解がでてますよん。

_20(Wed)

うー、疲れた。さっさと帰ろう。400行近くの Java のソース。一週間くらい前に書いたのかしら。もう全然わかんねー。

あー、明日のOOなんか面倒くさくなっちゃってるなぁ・・・。明日じゃなくて今日か。


なんとか起きれた。さて、行くか。今日はサインを貰ってこないと抹殺されるんだろうか。

うーん、会場でメール読めるかなぁ。読めないと辛いなぁ・・・。


やっぱり日が昇っている時間を拘束されるというのは(この時期)辛かったかも。

fukumori さんにお昼ご飯をおごっていただきました。どうもありがとうございました。辛かったです。

やはり、英語はわからないんです。いや、メイヤーさんの英語はとても聞きやすかったのですけれど。

XMLをLispで。正直あんまり面白くなかったな。XMLとLispで、がきっと楽しい世界なんだろう。

パターンランゲージ。よく知らなかったんですが、興味深かったです。でも、やっぱり「なんでもパターン」は嫌い。

というか、鷲崎さんとはなぜかエレベーターでご縁があるんでしょうか。

OO2003、学生の早期割引で 5000円。で、資料を見たら、4500円と書いてある。うん、これは元は取れたね。でも、資料だけを 4500円で買うか、といわれれば多分買わない。懇親会でもっと元を取らねば(日本語違う気がする)。

農工大で行ってる人っているのかなあ。


タイトル:雑然雑然。広い作業スペースが欲しい・・・。

そこまで言うかなぁ。マヨネーズの入ってないタマゴサンドとかは嫌だけどなぁ。


頭の体操。

(子)リストのリストがあって、子リストにはシンボルが2個以上入ってたとする。たとえば、((A B) (C D) (E F) (A G) (H F I)) のような感じ。

これを、同じシンボルを含む子リストはまとめたいとする。たとえば、例で言えば ((A B G) (C D) (E F H I)) のようなリストを返す。

リスト、シンボルの順番は一切問わないとする。

これを Java でやってんだけど、全部検索するようなアレな解法しか思いつかない。なんかかっこいい考え方はないものか。

ちなみに、これ何のために解いてるかわかる人いますか? ご年輩の方はご存知かも。


(define (solve lst)
  (define (iter lst ret)
    (display (list "**" lst ret)) (newline)
    (if (null? lst) ret
        (iter (cdr lst) (search-and-sort ret (car lst) ()))))
  ; (X Y Z) => (Y X Z) if Y is 
  (define (search-and-sort lst syms ret)
    (display (list lst syms ret)) (newline)
    (if (null? lst) (cons syms ret)
        (if (contain-syms? (car lst) syms)
            (cons (merge (car lst) syms) (append (cdr lst) ret))
            (search-and-sort (cdr lst) syms (cons (car lst) ret)))))
  ; (X Y Z) (A B Z) => (X Y Z A B)
  (define (merge xs ys)
    ; (display "**") (display xs) (display ys) (newline)
    (if (null? ys) xs
        (if (contain? xs (car ys))
            (merge xs (cdr ys))
            (merge (cons (car ys) xs) (cdr ys)))))
  ; (X Y Z) (A X) => #t
  (define (contain-syms? lst syms)
    (if (null? syms) #f
        (if (contain? lst (car syms)) #t
            (contain-syms? lst (cdr syms)))))
  ; (X Y Z) Y => #t
  (define (contain? lst x)
    (if (null? lst) #f
        (if (equal? (car lst) x) #t
            (contain? (cdr lst) x))))
  
  (iter lst ())
  ;(contain? '(A B C) 'd) 
  ;(merge '(a b c) '(d a))
  ;(merge '() '(c d))
  )
        
(solve '((A B) (C D) (E F) (A G) (H F I)) )
;=> 求めたいもの ((A B G) (C D) (E F H I))

;=> 実際 ((i h e f) (c d) (g a b))

なんか、ダサすぎ。何も考えずにやったんだけど(*1)、わざと面倒に解いてるな。

別の方法で解こうと思ったんだけど、なんか長くなったのでやめ。求むエレガントな解法。

(define (contain? lst x)
    (if (null? lst) #f
        (if (equal? (car lst) x) #t
            (contain? (cdr lst) x))))

; ((A B) (A C) (D E)) A => ((A B C) . ((D E)))
(define (search-contains-and-merge lst x)
  (define (iter lst cs rs)
    (if (null? lst) (cons cs rs)
        (if (contain? (car lst) x)
            (iter (cdr lst) (merge (car lst) cs) rs)
            (iter (cdr lst) cs (cons (car lst) rs)))))
  (iter lst () ()))

(define (merge xs ys)
  (if (null? ys) xs
      (if (contain? xs (car ys))
          (merge xs (cdr ys))
          (merge (cons (car ys) xs) (cdr ys)))))
  

; ((A B) (A C) (D E) (X Y) (Z X)) (A E) => ((A B C D E) . ((X Y) (Z X)))
(define (contains-syms-and-merge lst osyms)
  (define (iter lst syms cs rs)
    (if (null? syms) (cons (merge osyms cs) rs)
        (let ((xs (search-contains-and-merge lst (car syms))))
          (iter (cdr xs) (cdr syms) (merge cs (car xs)) (append rs (cdr xs))))))
  ;(display (list osyms ",,," lst)) (newline)
  (iter lst osyms () ()))

(define (get-first-group-and-rest lst)
  (define (iter lst ocs)
    ;(display (list ocs "-" lst)) (newline)
    (let* ((xs (contains-syms-and-merge lst ocs))
           (cs (car xs))
           (rs (cdr xs)))
      ;(display (list cs "," rs)) (newline)
      (if (equal? ocs cs) (cons cs rs)
          (iter rs cs))))
  (iter (cdr lst) (car lst)))


(define (solve lst)
  (define (iter lst ret)
        (if (null? lst) ret
            (let ((xs (get-first-group-and-rest lst)))
              (iter (cdr xs) (cons (car xs) ret)))))
  (iter lst ())
  )


(solve '((A B) (C D) (E F) (A G) (H F I)) )
;=> ((A B G) (C D) (E F H I))

;=> 実際 ((c d) (e h f i) (g a b))

でも、なんかやっちゃったし。なんというか、無駄が多すぎ。

リファレンスでー、破壊的な関数でーとかやるのもなんかアレだし。


Dr.Scheme ってたーとるぐらふぃっくすができたのねぇ。

(require (lib "turtles.ss" "graphics")) 
(turtles #t)
(define (dr n)
  (if (< n 0) ()
      (begin
        (draw (* n 4))
        (turn n)
        (dr (- n 1)))))

(dr 100)

*1 嘘、1時間以上考えてこれ。とほほ。
_fukumori(Wed Aug 20 19:57:27 JST 2003)

早稲田の味の代表としてティーヌンのトムヤムラーメンを味わってもらいました。あの真っ赤なスープに挑戦してこそ真の漢。僕は別の料理にしたのだけど :)

_ささだ(Wed Aug 20 20:00:24 JST 2003)

 ご飯もありがたかったんですが、お話のほうがもっと嬉しかったです。ありがとうございました。

_新潟のS(Wed Aug 20 23:18:59 JST 2003)

 SICPの順序づけられないリストとしての集合で作った関数を使うとすっきりいきそうだけど。

_ささだ(Wed Aug 20 23:37:09 JST 2003)

 すっきりといてください〜(他力本願)

_こーのいけ(Thu Aug 21 04:49:24 JST 2003)

 シンボル:頂点 子リスト:連結関係(2要素なら辺)とすればグラフの連結成分の列挙ですね。O(mlogn)ってとこかな?

_shudo(Thu Aug 21 09:37:24 JST 2003)

 メーヤウかと

_shudo(Thu Aug 21 09:38:08 JST 2003)

 思った>辛いもの

_shiro(Thu Aug 21 16:41:59 JST 2003)

 こんなのはいかが(「集合の統合」の項)→ http://www.shiro.dreamhost.com/scheme/wiliki/wiliki.cgi/Scheme:%a5%ea%a5%b9%a5%c8%bd%e8%cd%fd

_ささだ(Thu Aug 21 22:34:29 JST 2003)

 ああ、そうか。グラフの問題になるのか。

_ささだ(Thu Aug 21 22:40:13 JST 2003)

 ああ、短い・・・>shiroさん

_fukumori(Fri Aug 22 01:43:55 JST 2003)

いきなりメーヤウに連れて行ってチキンカリーを食べていただく、なんて鬼畜なことは僕はやりません。代わりに翌日(21日)はチョコとん…もとい、チョコ入りメンチを食べてもらいました。辛いものの後はやっぱり甘いもので口直し、ということで。

_19(Tue)

今日OO2003のチュートリアルなので、慌ててオブジェクト指向入門を読みだす。あと500ページか。間に合うかな。

結構微妙な表記もある気がするなぁ。細かいことは気にしないとくか。

Eiffel って参照に Create とか Forget ってやるのか。気色悪いなぁ。

まぁ、どっかの a = new A() よりは楽か。

self/this/Current

  • プロシージャ:動作を実行。すなわちオブジェクトの状態を変更
  • ファンクション:オブジェクトの状態からある値を計算

メソッドはその両方? ルーチンの別名?

あはは。P127。

どうやら人はこういったプログラムのか書き方がわかるようになるまで、その手法全体を信用しない傾向にある

P129。

操作の実行順序を基に作られたシステムは外部使用の変更による影響を大きく受けやすい

そうだよなぁ。

返値。かえりちと私は読んでるんだけど。

  • return
  • 関数(など)名
  • Result

ruby では、全ての式が暗黙に Result への代入を行っている、といえるんだろか。そんなの考えない、が答えか。

Smalltalk と Eiffel は随分違うんだなあ。

あり。Eiffel の(この本の) generic と CLOS の generic って関係無し? 型に関する genericity と 動作に関する genericity か。

契約にあたるものがテストだよなぁ。結局どっちがはやいんかな。

p161 の脚注、意味わからん。

rescue 内で retry しないと失敗。うーん?

継承によるルーチンの再定義に制限がつくのか。なるほど。

定数時間でメソッド検索ができるってのは、メソッドテーブルをある一定の順番で作るってことなんだろうけど、多重継承でこれができんのかなぁ。よくわからん。細かく書いてないし。

type は integer で返すんだな。

なんか、16章の入り、物騒だな・・・。メモリ管理、さすがに具体的なことはなんも書いてないなぁ。

このFORTRANの例は・・・。なんというか、結構感動。

C++ は昔は単一継承のみだったのか。

うー、飛ばし飛ばし読みおわった。ねむ・・・。


なぜか知らんが 1月に書き込んでた。謎。

HIR って Java には変換できないかな? union とか pointer とかが、無理? こう考えると、相当低レベルだよな。まぁ、当然か・・・。

union のエミュレートって Java じゃ無理かなー・・・。んー・・・。

mswin じゃ 'irb/completion' は No such file to load -- readline らしいです。残念。


さて、めいやーさん見てきます。


見てきました。普通のおじさんでした(なんだよそれ)。英語でした。

しかし、とにかく長かった。3時から6時までの予定が7時半までやってるし。あー、英語がわかればなぁ・・・。

いやー、高田馬場から結構歩いた。疲れた疲れた。バイク用ブーツで行ったのが敗因か。

というか、Fぴょん帰るし。

エレベーターででしたが鷲崎さんに挨拶させていただいてよかったです。ご苦労様です。

しかし、あの Eiffel スタジオのインターフェースすげーな・・・。そいえば、聞いてて最初、あいふるってなんだろうって悩んでしまった。


で、これからお仕事なわけですが。やれやれ・・・。夏休み欲しい。

_(う)(Tue Aug 19 08:37:59 JST 2003)

 http://jarp.jin.gr.jp/win32/ にreadlineのバイナリがあるです。

_ささだ(Tue Aug 19 13:44:21 JST 2003)

 なるほど。ありがとうございます。今度試して見ます。

_あひる(Tue Aug 19 14:51:11 JST 2003)

返り値or返値 19100件。 戻り値or戻値 45800件。ちなみに自分は後者派。

_匿名希望(Tue Aug 19 15:59:52 JST 2003)

 参考

_山城(Wed Aug 20 18:51:40 JST 2003)

 いや、19時からバイトがあったもんで....

_18(Mon)

やっと全部終わった・・・。

タイトルの意味がわからん。というか、謎を残さないでくれ。オルタナティブ買えってことか・・・。


使って1年過ぎたからRuby初心者は名乗っちゃ駄目なのかな。永遠の初心者って感じだけど。

rubyist のコスプレってどうやればいいのかな。悩む。


えーっと、ネタってのは知ってる人がニヤってできればそれでいいと思うのです。というか、これ以上は勘弁してください ^^;


なんか、我ながらシツコイよな・・・。まぁ、これをするために投票っぽいものを作ってみたんだし。

揺れた揺れた。


疲れた。さっさと帰ろう。

なんか家とのネットワークが嫌な感じ。

_17(Sun)

生活が腐れてる。うーん。

うばーー・・・。

_shudo(Sun Aug 17 21:36:17 JST 2003)

 熟れてますか。

_16(Sat)

また雨。

本当に夏なのかな。寒すぎ。


今日のヒットなT氏発言「恋する妹はせつなくてお兄ちゃんどいてそいつ殺せない」(*1)


*1 だから大学のサーバでこういうネタはだめだってば・・・
_み(Mon Aug 18 10:19:43 JST 2003)

 *1←出展は何ぞな、もし.

_匿名希望(Mon Aug 18 12:24:41 JST 2003)

(1) http://www.runesoft.co.jp/cage/html/prod/imoh/ (職場注意) (2) http://yuni_ford.tripod.co.jp/tukimiya/tukimiya.html

_15(Fri)

純夏終り。あれれ、なんかふつーーに終わってしまった。まだなんかあるんだろうけど。

そうか、やっぱり「おしまい」について、もうちょっと考えないと駄目か。


雨なので学校に行けず。どうしようかな。

_14(Thu)

投票の結果、Rubyist には不幸な人が居ないことがわかりました。


Googleが電卓に。Google API(検索)に計算つっこんでも計算してくれなかった。他のAPIを用意するんだろうか。


できません。

def (3.14).a
  p '1'
end
#=> 
t.rb:3: can't define single method for literals
def (3.14).a
          ^

できます。

def (3.14 * 1).a
  p '1'
end

もちろん意味は無いんだけど。 def (a = ...).a みたいに使うんだろうか。


アリーテ姫 を見る。よくできてるなぁ。

そういえば、ファイナルファンタジー バトルアレンジ-THE BLACK MAGES をやっと買った。どこに行っても見つかんなかったのよね。


誰も困らない仕様変更。

send* と super* を send と super に一本化。

putblock [NodeID] を追加。[NodeID] が 0 ならブロックなし。

-------------------------------------------------------------
block  self  p1    p2 ... pM l1 l2 ... lN [info] s1 s2 
fp[-1] fp[0] fp[1] ..........     fp[M+N]              sp[0]
-------------------------------------------------------------

stack に乗せすぎちゃってるのかもしんないなぁ。

とにかく send と return を高速化することが必須。他は結構どうでもいい。

return な値を前メソッドフレームに直接ぶち込むような実装にするのは・・・うーん。要するに block の位置だよね。次に return が来る命令の push はそこに置くような命令と置換。というか、そういうフラグ付けるとか。

その比較がウザイという噂。

ブロックローカル変数とか、そういうのと元のローカル変数とかも、どうするのとか。


理想としては、put 1; put 2; add put 1; put 2; send + の速さが同じじゃないとあかん。

主なオーバーヘッドはメソッドフレームの生成(呼び出し元メソッド情報の保存。主に fp, sp, メソッド情報)。引数の数のチェック。そして、メソッドフレームの復帰。いけね、メソッド検索のコストを忘れてた。

最低、変数ストアが6回に比較が1回。まぁ、大体キャッシュにヒットするか。

こう考えると、やっぱりブロックありと無しで send 変えたいなぁ。send_with_block はやっぱり消せないか。

あ、+ は C 関数呼び出しか。さすがにそのオーバーヘッドは消せない・・・。ストア2個か3個か増えるな。マシンスタックフレーム生成、復元のオーバーヘッドと。でかいなー(*1)


メモ。HTML Helpの概要と作成方法

夏なので(謎)、某あげの新作(3月くらいのだけど)をやってんだけど、爆笑。あのイントロはうまいなぁ。いやー、君(略)の資産はでかい。マナマナなのかー。

しかし、君(略)の曲がアレンジしてるとは言えかかると、インパクトあるな。

家族がどっか行ったので飯がない。どうやって暮らしていこうか。

カップ麺になりそうな予感・・・。

弁当を絨毯の上にひっくりかしてしまい、鬱。ゲームはバッドエンド。マグロ漁船か・・・。懐かしのまさしえんどって感じですか。(謎)


__send__ と send の話。どうなんでしょうね。send 使う分には、send のような使い方を期待していて、send をオーバーロードする側は、send のような使い方で何か特殊な機能をつけようとするわけで(そうじゃないのは論外として)。

ユーザーが send を使わないと(みんなが __send__ を使うなら)あまり send がある意味がないような気がするんですが、どうでしょうか。

それとも、send という一般単語を使いたい、という理由でこんな仕様になってるんだろうか。少なくとも、知らないと __send__ を使うという発想をしない、という点では自然じゃないわな。


*1 というのは俺だけだったりして。
_6(Sat Aug 16 01:21:43 JST 2003)

 カップ麺にはマヨネーズは入れないのですか?

_ささだ(Sat Aug 16 05:33:44 JST 2003)

 入れません。私はマヨラーじゃないので。

_kjana(Sun Aug 17 00:53:08 JST 2003)

 send を使いたい場合もあるわけさ。Socket#send とか。

_ささだ(Sun Aug 17 16:10:26 JST 2003)

 後者の理由ってことですねー。やっぱり send は一般的か。

_13(Wed)

徹夜でカラオケ。


投票の db を PStore から YAML::Store に変えてみる。これなら、確かにデータの改竄は楽そうだ。

データはこんな感じ>YAML形式のデータ


YAML を Ruby で使う を書く。ERB を使う を書く。ERBのは今更っぽい。


OO 2003、申し込んだんだけど、音沙汰がない。うーん、11日の夜に申し込むのは遅かったのかな・・・。

そういえば、何も考えずに拡張子を yaml にしちゃったんだけど、これでいいんだろうか。yml だったりして。

本当は、シリアライズの比較ということで、XML-RPC もちょびっと見たんだけど、表現できるデータが相当限られるようだったので、除外。ruby 用 XML な(簡単)シリアライザってあるんでしょうか。soap4r とかでやってくれんのかな? soap自体何も知らないけど。


ruby-talk が 4000通未読。最早読む気 0。


コミケで shudoさんが rubyちゃんのコスプレをするそうです。頑張ってくださいませ。

ところで、「さめ」「さめ」と言うのは、どこらへんから来たんだろう。


NaHi さんに RRRWiki - Marshal を教えてもらいました。凄いページです。

soap4r スゲー。

田中さんの amarshal というのを初めて知りました。スゲー。

require 'yaml'
o = [1,2,3];o << o
puts o.to_yaml

#=>
--- &id001 
- 1
- 2
- 3
- *id001

ポインタ定義と、ポインタ参照なんですかね。よくできてるなぁ。

irc で、require 'yaml' しないで、「to_yaml がデキネー」とほざいたアホは私です。ごめんなさい。


class C
  private
  def m;end
end

C.new.send :m   # private が呼べる

知りませんでした。


生命工学科の人に論文を日本語で書いたと言ったらおおいに驚かれてしまった。やっぱ英語かー。

_(う)(Wed Aug 13 16:02:00 JST 2003)

 投票、エラーが出てますだ。

_ささだ(Wed Aug 13 16:09:54 JST 2003)

 教えていただいてありがとうございました。インスタンス変数の @ を忘れてました。"..#{@name}.." みたいなとき、よく忘れます。

_(う)(Wed Aug 13 18:16:42 JST 2003)

 そういうときは"#@name"と書くようにすれば忘れませんよ。

_shudo(Wed Aug 13 18:55:37 JST 2003)

 知らなかった!!!>コスプレ

_ささだ(Wed Aug 13 20:37:38 JST 2003)

 覚えました!>#@name

_washizaki(Wed Aug 13 23:28:47 JST 2003)

 OO2003、今週中には参加章引換券・振込用紙が郵送されると思います。もし来なかったら、、、事務局に問い合わせてみてください。

_ささだ(Thu Aug 14 08:08:50 JST 2003)

 すみません、書類が郵送されてました。前は確認メールが来たと思ったんですけど。

_12(Tue)

最近(というには遅いかしら)、YAML というのが流行ってるらしい。ということで、使ってみたいと思ったんだけど、リファレンスが見つからない。何をどうしていいかわからない。lib/以下の yaml.rb を見ろってことなのかな。

Project: YAML.rb: YAML for Ruby: Summary ここにドキュメントあった。windows 大好きなので chm を落とす。

YAML の解説が書いてあるけど、その辺の説明は、まぁどこにでもあるからいいや。

require 'yaml'

ary = [1,[2,[3]],4]
map = {'a' => 'AAA', 'b' => 'BBB', 'c' => 'CCC',}
class Video
  attr_accessor :title, :year, :rating
  def initialize( t, y, r )
    @title = t
    @year = y
    @rating = r
  end
end


puts ary.to_yaml
puts map.to_yaml
puts 'string desu-'.to_yaml
puts true.to_yaml
puts(/abc/.to_yaml)
puts Object.new.to_yaml
puts 12345678901234567890.to_yaml
puts 3.14159.to_yaml
puts Time.now.to_yaml
puts "abc\ndef\nghi".to_yaml
puts :sym.to_yaml
puts Video.new('a','b','c').to_yaml

#=>
--- 
- 1
- 
  - 2
  - 
    - 3
- 4
--- 
a: AAA
b: BBB
c: CCC
--- "string desu-"
--- true
--- !ruby/regexp "/abc/"
--- !ruby/object:Object {}
--- 12345678901234567890
--- 3.14159
--- 2003-08-12 01:12:48.875000 +09:00
--- >-
abc

def

ghi
--- !ruby/sym sym
--- !ruby/object:Video 
rating: c
title: a
year: b

ウワ、気色悪!(失礼)。いやー、楽だけど、基本型に色々くっつけてくれるのね・・・。ちなみに、勿論結果は文字列。

おお、PStore の替わりになるのかー。

# Yaml.rb Yaml for Ruby より引用。
require 'yaml'
y = YAML::Store.new( "/tmp/yaml.store.1", :Indent => 2 )
y.transaction do
  y['names'] = ['Crispin', 'Glover']
  y['hello'] = {'hi' => 'hello', 'yes' => 'YES!!' }
end

ロードも、ストリームから、文字列からできるっぽい。

便利そう。って、偉い人には何を今更って感じなんだろうなぁ。

ys =  [1,2,3,4,5].to_yaml + "\n" + "abc".to_yaml
p YAML::load(ys)
#=> [1, 2, 3, 4, 5]

一個しか持ってくれないらしい。

prc = YAML::load(proc{p 'hoe'}.to_yaml)
#=>
C:/cygwin/usr/local/lib/ruby/1.8/yaml.rb:160: warning:
         incompatible marshal file format (can be read)
	format version 4.8 required; 4.6 given

まぁ、エラーだよな。でも、なんかエラーが怪しげな気が。

YAML::parse ってのが何やってんのかよくわかんないな。うーん、例を見てもよくわかんないな。

要するに Marshal の高級品なんでしょうか。 YPath という言語で検索できる何か、DOM Tree みたいなものを狙ってるんだろうか。

しっかし、綺麗なマニュアルだなぁ。どうやって作るんだろう。


オーディションスゲー。


require 'yaml'
puts Array.new(10){|i,j| i}.pack('i*').to_yaml
puts Array.new(20){|i,j| i}.pack('i*').to_yaml
#=>
--- "\x00\x00\x00\x00\x01\x00\x00\x00\x02\x00\x00\x00\x03\x00\x00\x00 <= (*1)
\x04\x00\x00\x00\x05\x00\x00\x00\x06\x00\x00\x00\a\x00\x00\x00 <= (*1)
\x08\x00\x00\x00\t\x00\x00\x00"
--- !binary |
AAAAAAEAAAACAAAAAwAAAAQAAAAFAAAABgAAAAcAAAAIAAAACQAAAAoAAAAL
AAAADAAAAA0AAAAOAAAADwAAABAAAAARAAAAEgAAABMAAAA=

*1)ほんとは改行ありません、私が入れました。

おもしろー。


今日は停電でした。あれ、サーバマシン復活してるし。


配列最初の要素へのアクセスは多重代入のほうが速い、という記事(極めよRuby道 第8回 スピードアップ)を 1.8 で見直してみると、

# a ,= ary
# a  = ary[0]
          user     system      total        real
,     4.891000   0.031000   4.922000 (  5.016000)
[0]   4.922000   0.016000   4.938000 (  5.079000)

あまりかわらず。

_11(Mon)

ある機能を探してマニュアルとニラメッコ、4時間くらい粘るが見つからず。動作させてみたら、既存のもの、それをしないようにしてやがる。チクショウ。

へー、#define のシンボルって $ が入っていいんだ。知らなかった。凄まじく気色悪いソースだが。

なんか、バージョンアップしたら、色々となおってる。アレの意味もやっとわかる。うーん、やっぱり一人でやるのは限界があるぞ、これ・・・。せめて情報が欲しい。バージョンアップした、という情報くらい・・・。


う、何十袋もあった気がした袋ラーメンが残り一個。うー、家に帰りたい。

十日過ぎちゃったよー・・・。終わんないよー・・・。


10/4,5 ですか。空けとこう。

そういえば、8/30 の読書会は何をするんですかね、ホント。なんか正規表現第二版、結構買ってるようだから、それになるのかなあ。個人的にはどっかのVMのほうが面白そうなんだけど。

  • Parrot
  • Python
  • Zend(PHP)
  • Gauche

でしたっけ。話に出てたのは。Lua とかもあるか。

個人的にはRHG/Ruby1.8差分とかを教えてもらうのもいい。無茶苦茶自分勝手。


メモ。javadoc -sourcepath ソースへのパス -subpackages パッケージ名

      data (b(k),(d(i),c(i,k),i=1,2),k=1,1)/1,2,3,4,5/

暗号ですか、これは。

Haskell のメーリングリストで ML という言葉が出ると、ちょっと迷う。


def a; 3.14 ; end

def a.v; puts 'test1' ; end
p a
a.v
def a.v; puts 'test2' ; end
p a
a.v
def a.v; puts 'test3' ; end
p a
a.v

#=>
3.14
test1
3.14
test2
3.14
test3

このテクニックを使うと、メソッドの返り値を2つ以上にすることができます(嘘)。Fixnum 以外の Number, Regexp などで使うことができますが、String じゃダメ。3+0.14でもダメ。もちろん3.14+0でもダメ。ごく普通で当然のことなんだけど、奇異に見えてしまう私はまだまだなんだろうなぁ。


200行のメソッド、1500行のクラス。やば・・・。


ボクのプログラミングのセンセイが、またスゴイコトをヤりました! whitespace-php。これからもがんばってくだつぁい。ひひひ。


現実逃避になんかやってたら、こんな時間。1時から始めたから、今5時。4時間かー。

うまくいかないし。これでいけたかな。

ERB を使ったことがないんで、練習。リファレンスはどこにあるんだろう・・・。なんとなくでやったったんだけど。

なんかshudoさんにえらいこと書かれてしまったような予感が。そういえば、サーバのほう、夏休みなのでしょうか。


動的なコンテンツっていーなー。楽で。

やばい、今日はレポートの提出日だということを、朝から何度も忘れてる。ヤバスギ。というわけで、また帰れない。マジかよ・・・。

nqueen でお茶を濁す・・・。

go :- q([1,2,3,4,5,6,7,8,9,10],[]).

q([],XS) :- write(XS),nl,fail.
q(XS,YS) :- select(X,XS,RS), s([X|YS]), q(RS,[X|YS]).

s([]).
s([X|YS]) :- not(a(X,YS,1)).


a(X,[Y|YS],N):- (Y =:= X+N ; Y =:= X-N).
a(X,[Y|YS],N):- N1 is N+1, a(X,YS,N1).
a(X,[],_):-fail.

まぁ、ごく普通。と思ったら、モロに参考にさせてもらったMakoto Hiroiさんのページに同じものが・・・。まぁいいや、自分で解いたし。多分。

_10(Sun)

すでにお帰りの途中だったのですね。


refe 導入記。

prefix/bin に refe が入るも、windows でそんなもんは動かない。refe.bat を作る。なぜか検索してくれない。%n を入れ忘れていた。ダサスギ。検索成功。ガーソ、EUCだ。

恥ずかしながら、find って使ったことなかったんで、使ってみる。find refe/ -type f -exec ruby -rkconv -ni -e 'print $_.tosjis' {} \; 最初は nkf でやりたかったんだけど、出力をどうやればいいかわからず挫折。

refe のデータはどうやって作ってるんでしょうか。手書きってこたないわな。


Fixnum に Singleton method が付けられないのは実装上の制限で、本当はつけたいものなんだろうか。うーん、よくわからん。Bignum に Singleton method を付けたいときってあるんだろうか。

eql? と __id__ 。うーん。

暑い。暑すぎる。やばい、これは学校のクーラーに避難か。


着。クーラー涼しい。


refe の出力を xyzzy で美味しく使う方法を考えて見る。とりあえず、カーソル部分の単語でrefe でひいてみて、複数出てきたら選ばせるってのを考えて見た。

選んで、選ぶ表示表示

我ながら非常に使いづらい。refe を直接使ったほうが嬉しいのかなぁ。うーん。htmphelp版のリファレンスマニュアルで十分幸せ、という説もあるんだが。


raa-install を入れてみる。動かして見ると、warning が少し。

RAA から落としたんだけど、参照する xml が古いのか? これ。なんか、yaml な参照先になってるし。xml 版はサポートしなくなっちゃったのかな。残念。

というわけで、学校でも refe を手動でインストールしてみる。しまった、また sjis に変換せにゃならんか。家から持ってくればよかった。

cygwin 上で変換中、サーバマシンにおきっぱなしであることに気づく。そっちをおくったほうが全然速かった。

イチイチ xxx.bat を作らないといけないってのは苦行だよな・・・。

うへ、@rubyd E:\cygwin\usr\local\bin\refe %1 %2 %3 %4 %5 %6 %7 %8 %9 こう書いたら cygwin 上じゃ使えん。なんだかなぁ。

refer-for.l をぱくって、ReFe-mode を書いてみる。これもイマイチかもしれない。


xyzzy 関連を色々整備してみる。NetInstaller を入れてみる。スゲー。

リファレンスを見るときって、「あれ、あの機能ってなんて名前だっけ?」とか、「ああいう機能ってないものか」というのが多いので、やっぱり単語ありきでひくという方針は間違ってる気がする。どうするべきか。

とりあえず、凄く凄くすごーくいい加減に refe-mode を作って見る(refe.l)。

ああ、wiki が欲しい。


そういえば、先日銀行に行ったんですよ。銀行。最近の銀行はATMばかりで、味気ないですね。んで、通帳記帳したんです。ジーコ、ジーコって。サッカーの選手じゃないですよ、プリンタの音ですよ。これズレたら大変だろうなぁ、やっぱりきっちり作ってあるよなぁ、と感心しながら待つわけで。んで、額面を見てみたわけですよ。これでも以前バイトしてたもんで、それがあるはずです。余裕の大学生活ですよ。時間もあるし。金もそれなりにあるし。んで、確認してみたら、なんか考えてたのとずいぶんずれてるんです。ビックリですよ。思ってたよりも多く入ってたんですよ、とか書ければよかったんですが、もちろんその逆で。私、数学は苦手ですが、簡単な算数ならできます。2桁の引き算くらいまでならできます。後期の学費、まだ払ってないんですが、その辺を考えると、なんとなくやばい気配がする。あれですよ、あれ。不吉な匂いってやつ。リファクタリングの必要がある。人生のリファクタリング。その前にテスト書かなくちゃですか。テスト。人生のテストケース。でも、失敗、とか言われても取り返しつかねーよなぁ、きっと。

などと、馬鹿なこと書いてないでバイト探せ、とか。


java って reverse_iterator ないのかなぁ。どないしよ。

_kdmsnr(Sun Aug 10 22:16:33 JST 2003)

 人生のリファクタリング、おもしろいっす。

_新潟のS(Sun Aug 10 22:50:43 JST 2003)

 若いってことは、それだけで財産だから、ど〜んと行きましょう。

_9(Sat)

ずいぶんと印象がかわったように感じました。渋谷。

結局家に帰れませんでした。生まれて初めて終電にひっかかった・・・。

幹事の高橋さんお疲れ様です。結局ノートどうされたんですか。

たくさんの尊敬する rubyist の方々とお会いできて嬉しかったです。もっと自分からお話しに行く努力を怠っていた。


いろいろ思うところはあるんですが、もっと後悔しない人生を送ろうと思います。

ダメだ、これじゃ。もうちょっと真剣に生きよう。

load __FILE__ な気分(謎)。

割り算だと気づかなかったのは、正規表現中に改行が使えるとは思わなかったからです。


メモ。END{} は LIFO。BEGIN{} は FIFO。これは VM 命令の範囲じゃないな。


イリヤの空、UFOの夏 4巻。ワーイ。読みきる。完結編か。なんか読んだら凹むきがするな。

見た。夏の終わり。



「おっくれてるぅーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーっ!!」


うーん。エンターテイメント。



AM 5時現在、雨。雨っていうか台風。いい感じに台風。中央線動くのかな、これ・・・。


妄想。しっくり。

Const # 定数。オブジェクトへの参照
1     # 同上 => 1 は Const1 とかの短縮形 でも、 1 = .. は禁止。絶対無敵const(謎)
:sym  # 同上
o     # 変数。オブジェクトへの参照
----------------------------------------
/.../ # 出現場所によって違う
3.14  # 同上
1000000000000 # 同上
----------------------------------------
"obj" # String.new(Const of <obj>)
1..3  # Range.new(1,3)

値ってなんだろう。難しいな。

すでにね、実行前に小人さんが

(-N).upto(N-1){|i| eval "#{i.to_s} = Fixnum.new(i)" }
Fixnum.undef :new # いろいろ嘘

みたいなことしてるんですよ。きっと。

ruby script 上に出現する文字列は、すべてホルダーであって、矢印。1 も矢印。1オブジェクトを指す矢印。


LL 行くときの電車の中で、これ違っとるなぁ、と気づく。Fixnum 以外、違うなぁ。値ってのは、== で同じだとわかるもの、といったところでいいんだろうか。いや、同一性の話はそれでいいんだけど、値って。値はオブジェクトだよなぁ。


ruby の嫌いな点。

  • const への再代入が許されるところ。無条件で警告はでるけど。
  • method の再定義は(-w で)警告がでること。
  • ruby ばっかで遊んでしまい、研究が進まない(ダカラ、gaucheヲヤロウ)
  • 入れ物にクラスがない
  • マクロ・・・?

雨止んでるし。家に帰って着替えるか、そのまま行くべきか・・・。

結局家に帰らないで行くことになってしまった。へー、吉祥寺経由のほうが安かったのか、渋谷行き。


Tiny CLOS 入門 - Tiny CLOS Tutorial を書く(訳す)。一週間くらいかけたけど、まだ終わってない。あともう少しだ、俺。


LL帰宅。主催者の皆様、発表者の皆様、参加者の皆様、お疲れ様でした。楽しかったです。

今度は LL処理系 Saturday とかやってください。20人くらいは集まらないですかね。

おまけと値引きに負けて、オライリーの本を買いました。


LL中ずっと考えてたんだけど(聞けよ)、妄想vm ができたら、簡単に Scheme 乗るなぁ。乗せたいなぁ。Gauche と対決してみたいなぁ。

・・・あ、末尾再起考えてなかった。まぁ、そこはなんとでもなるか。


妄想文法。ローカル変数にまでアクセスのフックがかけられてみる。こう、set とか get とか。名前とかインターフェースダメダメ。

add_set_hook(:a){|e| puts "set a as #{e} (before #{value})"; e}
add_get_hook(:a){|e| puts "get a as #{e}"; e}
a = 10
b = a

使いたいかといわれれば使いたくないけど。


  • はい → ??
  • 「Common Lispを拡張する」

まつもとさんのつっこみがご自身の日記に・・・。飲み会でつっこみしてるんだろうか。

リファレンスのない言語で ruby を書けば、実用的なオブジェクト指向プログラミングが!(それは違うし・・・)


なんか、翻訳公開の許可を求めるメールが帰ってきた(Relaying denied)。どないしよう。

アドレスがどうやら変わったらしい。


そうですよねー、あの質問、きたさんしかまともに答えてなかったですよねぇ・・・。

というか、せめて立ってプレゼンすればよかったのに>ruby以外の人。プレゼンって、やっぱりあんまり機会がないもんなんでしょうか。それとも、座ってプレゼンが普通なのかしら。後ろに居たから、全然顔が見えん。

結局 nokadaさん commit しなかったんですね、生開発生commit楽しみにしてたんですが(無茶を言う)。

ごっちゃんです、という単語を忘れないようにメモ(おい)。

_なかだ(Sun Aug 10 18:32:40 JST 2003)

 そもそもあそこはIP unreachableなので。

_ただただし(Mon Aug 11 09:34:50 JST 2003)

 プレゼンは立ってするのが基本だと思っちょります。

_8(Fri)

ドキドキ。デジカメの用意しとかないと。


オブジェクト指向プログラミングとは、オブジェクト間のメッセージ送受信によるプログラミングであり、それ以上でも以下でもないと思っています。

その「オブジェクトをどうやって表現するか」というのがクラスだったり継承だったりするんだと思うのですが。

でも、そうすると総称関数って説明できないか・・・。あれはオブジェクト指向の本質は関係ないのかな。多態って。本質じゃないか。

って、違うか。メッセージ送受信のほうが本質じゃないってことか。

オブジェクトがある、ってまつもとさんが書いているところしか、本質はないってことなんだろか。実際にどうやって動作させるっていうのは、その上に色々あるってことなんかな。それとも CLOS でも generic は便利機能のひとつでしかないんだろうか。


先日のあれはこんな感じになるのか。

interface I{
  public void n(A i);
}

abstract class A implements I{
  public void a(A a){
    System.out.println(""+a.getClass());
    a.n(this);
  }
  static A make(){
    return new B();
  }
}
class B extends A implements I{
  public void n(A a){
    System.out.println("B");
  }
  public static void main(String arg[]){
    A.make().a(new B());
    A.make().a(new C());
  }
}
class C extends A implements I{
  public void n(A a){
    System.out.println("C");
  }
}

というか、実際にやりたいメソッドとディスパッチするメソッドの名前を変えればよかっただけなのか・・・。

abstract class A{
  public void a(A a){
    System.out.println(""+a.getClass());
    a.n(this);
  }
  abstract public void n(A i);
  static A make(){
    return new B();
  }
}
class B extends A {
  public void n(A a){
    System.out.println("B");
  }
  public static void main(String arg[]){
    A.make().a(new B());
    A.make().a(new C());
  }
}
class C extends A {
  public void n(A a){
    System.out.println("C");
  }
}

言語で自動にってことは出来なかったか。残念。a が外向きインターフェースで n が実際の処理、と。つまんないなー、これじゃ。


もえたん持ってる受験生な図ってなんか嫌だな・・・。

将来は萌えるruby本って出るんかなぁ。matzお兄ちゃんがどうの、とかいう。


さっさと行ってぶらぶらしてよう。渋谷を歩くなんて何年ぶりだろ。

_7(Thu)

40命令くらい。どんどん増える。

3日あればできそうな気はするんだけどな。うーみゅ。あぁ、これで修論書けたらどんなに良いか・・・。


retry の意味について、やっとわかった。

  • イテレータの、引数の評価からやり直す。
  • rescue内なら、begin へ実行位置を移す。

いや、リファレンスに書いてあるとおりなのだけど、実感するのが大変だった。

def m(a)
  retry
  ...
end
m("-")
--
m:
  retry
...

retrypoint
putnewobj "-"
send m,1

こんな感じかなぁ。

引数に文字列リテラルのようなものがくる場合、引数の評価ごとに文字列を生成するため、IDが変わる。なので、m('a'){}a='a'; m(a){} は挙動が違う。

def chariter(str)
  p str.object_id
  a = str.split(//)
  while c = a.shift
    yield c
  end
end

chariter('abc'){|c| p c; retry}
#=>
22397268
"a"
22396824
"a"
22396248
"a"

str = 'abc'
chariter(str){|c| p c; retry}
#=>
22397292
"a"
22397292
"a"
22397292
"a"

自分で while 呼ばないで a.each みたいにすると、each に対して retry がかかるようになる。

イテレータに引数がなければ、あまり悩まない。あると、retry は悩む。


メソッド呼び出しのとき、m(/ /) のつもりで m / / としたら、正規表現が閉じてくれなかった。何と間違えたんだろう。


def ae
  at_exit
end

ae{
  p 'exit'
}

これで通るのか。知らんかった・・・。これは嬉しいんだろうか。


肉体労働してしまった。PC室大掃除。つらー・・・。

invoke じゃあまりにあまりなので、send に変更。

  • caller - callee
  • invoker - invokee
  • sender - ...

sendee とは、聞いたことないよな。


何気なく、gauche 0.7.1 を cygwin で ./configure ; make してみる。一発でいくとは思わなかったけど。

make[1]: Entering directory `/cygdrive/c/ko1/tmp/Gauche-0.7.1/doc'
../src/gosh -q -I../src -I../lib -lgauche-init ./extract -en -o gauche-refe.texi
 gauche-ref.texi
*** ERROR: unbound variable: gauche.regexp
Stack Trace:
_______________________________________
  0  gauche.regexp

make[1]: *** [gauche-refe.texi] Error 70

use がうまく動いていない。require を直接叩いても require なぞ知らん、とか言われる。gauche-init.scm を正しく読み込めてない気がする。

%require はちゃんと動く(パスは足されていない)。やっぱり、gauche-init.scm がちゃんとロードされていない。

-I でカレントからいろいろ指定してるんだけど、それがうまく機能してないっぽい。*load-path* がきちんと設定できていない。無視されてる気がする。はて・・・。

なんか、main の中で、パースができてない予感。

なんとなく getopt がダメダメなヨカーン。・・・ごめん、疑って悪かった。全然ダメじゃない。

Scm_Acons って何か悩んだ。あこん? あーこん? あこーんず? ああ、cons か・・・。

3引数。(list l (cons a b)) みたいなことすんのかな、これ・・・。

標準出力に Scheme のオブジェクトを表示する方法がやっとわかった。

Scm_Write(scheme_obj, SCM_OBJ(SCM_CUROUT), SCM_WRITE_DISPLAY);
SCM_PUTC('\n', SCM_OBJ(SCM_CUROUT));

きっと、デバッグ用にもっと簡単な方法もあるんだろうけど。"\n" いれないとダメってのに気づくまで長かった(ダメダメ)。

SCM_FOR_EACH が、なんかイテレートしてないっぽい。

SCM_PAIRP(Scm_Reverse(pre_cmds)) が偽らしい。だから、リストをイテレートしてくれなかった。

どうやらこいつか。

printf(">>%s\n",SCM_STRING(SCM_CLASS_OF(pre_cmds)->name)); でこの謎オブジェクトのクラス名が見れるのかな、とか思ったけど、見れんかった。

ガーン。オブジェクトの出力って、

Scm_Error(".. %S", obj);

のほうが簡単なのね。そのオブジェクトのクラスを表示させるにはどうすればいいのかな・・・。

Scm_Error("hoe %S as %S\n",pre_cmds, Scm__InternalClassName(pre_cmds)); ってやってみたら、*** ERROR: hoe ((#\l . "gauche-init.scm") (#\I . "./hoe") (#\I . "./lib/gauche") (#\I . "./lib") (#\I . "./src")) as ()・・・。

クラスが () ??

う・・・。

なんか、 list.c の中で SCM_PAIRP やると真、main.c で SCM_PAIRP やると偽。どうしたもんかな、これは・・・。

SCM_CLASS_PAIR の値が違うんですね。やれやれ・・・。って、こりはもしかして doc/cygwin-memo.txt に書いてある内容ですか。cygwin で動かしてる人も多いってことは、きっとこれの解決方法もあるんだろうな。

Reading specs from /usr/lib/gcc-lib/i686-pc-cygwin/2.95.3-5/specs
gcc version 2.95.3-5 (cygwin special)

こんな環境なんですけど。static-link なら大丈夫なのかな。--enable-auto-import なのかな、アレなのは。

うー、やれやれ、疲れた。

--disable-shared じゃダメかー。なんかあるんだろうな、きっと。


#if 0 /* def __CYGWIN__ */ となっているのは何故なんだろう。とってやってみると、dll側は __imp__Scm_PairClass があって、 main.o は _imp__Scm_PairClass を要求して、リンクができない。もういや。

まぁ、もともとは main で ScmPairClass を使ってるのがいけないんだな。やれやれ、どうしよう。

わからないので挫折。うーん、悔しい。

なんとなく、 _imp ## .. のところを __imp にして、あと色々なんかすれば大丈夫な気がする予感。予感だけ。


すみません、割り算ってわかんないんですが・・・。ダメダメですみません・・・。

廊下に出たら、電気が切ってて真っ暗。大学とは言え、さすがに怖い。

萌え要素ゼロ 。なにかなー、マスクとかは萌えないのかなー、と思って最後の行を見て、大声で叫んでしまいました。

_n???n(Thu Aug 07 10:57:08 JST 2003)

 3日でやらずに、3月かければ?

_ささだ(Thu Aug 07 11:09:50 JST 2003)

 3月かけると飽きます。

_まつもと(Thu Aug 07 12:54:03 JST 2003)

 aeの件、バグのような気が。直します。

_ささだ(Thu Aug 07 15:15:16 JST 2003)

 すみません、こういうのが正しい動作だと思ってしまいました。

_たむら(Thu Aug 07 17:14:37 JST 2003)

 RHL7.2で同じ現象。9だとOKだった。ライブラリとかのバージョンかな(調べないヤツ

_kjana(Thu Aug 07 17:25:34 JST 2003)

 1. 割り算 2. receiver

_(う)(Thu Aug 07 18:11:43 JST 2003)

 kjana曰く、 m / / は「m 割る 正規表現開始」である、と。

_ささだ(Thu Aug 07 18:31:43 JST 2003)

 あーーー、なるほどーーー。やっとわかりました。

_n???n(Fri Aug 08 01:23:28 JST 2003)

 Ruby より1桁速いHaskellのVMの実装ならD論になるよ。(ほんとか)

_ささだ(Sun Aug 10 12:19:05 JST 2003)

 すでに GHC はぶっちぎってないですかね。

_6(Wed)

ruby vm の命令セットを考えてみる。

  • 演算命令はナシ
  • 値アクセス系
    • get/set localval
    • get/set instanceval
    • get/set classval
    • set/get constant
    • set/get global
  • 値系
    • putliteral / putliteral with pointer
      • putnum
      • putobj
      • putproc
    • id
    • newarray / newhash / newrange
  • 設定系
    • definemethod
    • definesingletonmethod
    • include
  • 制御系
    • classdef / singletonclassdef
    • moduledef
    • invoke
    • super
    • invokeproc? / yield?
    • raise
    • return
  • 制御系(スコープをまたがない)
    • goto
    • if
  • スレッド系
    • enter / leave
obj.method(arg1, arg2, ..., argN){ ... }
---------------------------------------------------
 obj | block | argsize | arg1 | arg2 | ... | argN
---------------------------------------------------

とてもとてもJavaVMっぽい。

30命令くらい。5bit で書けますね(ぉ きっと色々足りないんだろうな。

コンパイルに激しく時間がカカルッポイ。というか、コンスタントプール相当が置けないんだよな、これ・・・。

new っているのかなぁ・・・。


while true
  eval('"hoe"')
end

(mswin) ruby 1.6 ではメモリの使用量は 4M くらいで落ち着いて、 ruby1.8 では 100M くらいで落ち着いた。GCの変更点ってところなんでしょうか。


もう既にあるような気がするシリーズ。

begin
  raise "hacker."
rescue (print "Just "   ; Fixnum)
rescue (print "another "; String)
rescue (print "Ruby "   ; Object) => e
  puts e ;
end

ここに式を許す必要はあるんだろうか ^^; ident だけじゃダメなのかしら。

rescue eval("#{nantoka}")

みたいな使い方のために?

nokadaさん曰く、

exc = Class.new(StandardError)
begin
  something(exc.new)
rescue exc
  ..
end

ということで。なるほど。

例外テーブル作れないか。これじゃ。 できますね、すんません。


懲りずに。

class O < (puts 'JARH' ; Object) ;end
class C < (class C < (class C;end;C) ;end; C) ; end
p C.ancestors
#=> [C, C, C, Object, Kernel]

あんまり面白くない。


うー、やっぱり eval.c わからへん。

proc_alloc の第二引数の proc の意味。Qtrue だと、手続きオブジェクトなやつで、Qfalse だと、ブロックとしてしか使わないオブジェクトだと思うんですが。

あの警告文自体、よくわからない。うーん。define_method でしか使ってないのだよな。Qtrue 渡してるの。うーん。

パッチと一緒に投げるの夢だったんですが(笑)。


ruby vm 命令セットの妄想 rter : RubyVM Assember Interpreter など妄想していたら一日が過ぎていた。

初期値のある引数って、invoker と invokee 、どっちで設定すべきなんかなー。send とか考えたら、やっぱり invokee か。でも、そうすると呼ばれた引数の数を知る必要がでてくるな・・・。

_5(Tue)

がー、17インチディスプレイ一個じゃ開発効率悪すぎ。

でも、家に帰ると暑いし。うがー。家から一個持ってくるかなぁ・・・。でも、重いしなぁ。


Java 辛い。キャストだらけ。俺の書き方が悪いんだろうか。でも、コレクション系を使うと絶対要るし。

Java 辛い。プリミティブをコレクションに直接入れられないの、ウザスギ。

Java 辛い。カッコだらけ。toString() なんて、() いらんて。


はまった・・・。

abstract class A{
  void n(A a){
    System.out.println("A");
  }
  static A make(){
    return new B();
  }
}
class B extends A{
  void n(B b){
    System.out.println("B");
  }
  public static void main(String arg[]){
    A.make().n(new B());
  }
}

B と表示して欲しいんだが、 A と表示される。もっといろいろあって、自分と同一クラスのものが来たときだけ自分の処理がしたかったんやけど。うーん。もうコード大量に書いちゃったよ・・・。ぐう、どないしよ。

前も同じようなはまり方をした気がする。


abstract class A{
  void n(A a){
    System.out.println("A");
  }
  static A make(){
    return new B();
  }
}
class B extends A{
  void n(A b){
    if(b instanceof B){
      System.out.println("B");
    }
    else{
      super.n(b);
    }
  }
  public static void main(String arg[]){
    A.make().n(new B());
    A.make().n(new C());
  }
}
class C extends A{
  
}

こんな感じにするしかないんやろか。希望どおりの動作だけど、だっさいなぁ。

abstract class A{
  public void n(A a){
    Class ca[] = {a.getClass()};
    Object o[] = {a};
    try{
      a.getClass().getMethod("n",ca).invoke(this,o);
    }
    catch(Exception e){
      System.out.println("A");
    }
  }
  static A make(){
    return new B();
  }
}
class B extends A{
  public void n(B a){
    System.out.println("B");
  }
  public static void main(String arg[]){
    A.make().n(new B());
    A.make().n(new C());
  }
}
class C extends A{
  
}

結局こんな感じで解決。動的にキャストが出来ればいいんだけどなぁ。


無駄にマジメに定数演算を書く。整数、浮動小数点、複素数。


アンオフィシャルピースコンテスト『P魂』(ぴーこん)

知らんかったなぁ。まだまだ予想外に P/ECE は元気・・・、なのか? はやく、あれに着手したい。そういえば、woさんの JavaVM ってどうなったんじゃろ。最近チャットでも見れんしな。


家。ネットワークもPC/音楽環境もこっちのほうがいいな。けれど、クーラーがない。

double/single dispatch という単語を NaHi さんに教えていただいたんですが、これにどう適用するのかわからない。修行が足らんな。

fぴょんにも visitor とか言われたけど、やっぱりどう当てはまるのかわからん。

うーん。自分と違うクラスが引数に来たら基底のメソッド、同じなら自分のメソッドを呼びたいってだけなんだけどな。


スーパークリエーターに教えてもらった!メモ

http://www.gotdotnet.com/team/clr/about_clr_Compilers.aspx http://www.gotdotnet.com/japan/team/clr/about_clr.aspx

_shudo(Tue Aug 05 10:17:16 JST 2003)

 c◯insに取り組み始めたらしい。

_ささだ(Tue Aug 05 12:20:45 JST 2003)

 そんな語弊のある言い方を ^^; やってたけど終わんなかったんですー いや、ほんとに

_n????n(Tue Aug 05 13:03:42 JST 2003)

 Haskellやろ。キャストいらん。プリミティブ差別なし、自明のかっこはいりまへん。

_ささだ(Tue Aug 05 13:22:19 JST 2003)

 まだ宇宙人にさらわれたくないからいいです。

_KM(Tue Aug 05 14:03:44 JST 2003)

 gj とか使えば STL っぽくコレクションが使えます.オートボクシングは JDK 1.5 をマテ,という話

_n????n(Tue Aug 05 14:05:48 JST 2003)

 「宇宙人誘拐モデル」に代わる「棚からぼた餅モデル」の実装きぼんぬ

_ささだ(Tue Aug 05 15:35:01 JST 2003)

 どんなモデルだろう・・・。

_wo(Tue Aug 05 23:42:18 JST 2003)

 ども、JavaVMは全然いじってません…

_4(Mon)

ネットワーク復活。

部屋のカギがあれば、なんかやったんだけど。リモートコントロールロボットになるとか?

しかし、メールが何通くるかガクガクブルブル。

ちょろちょろと届き始めています。


おうちの Kondara機で ruby コンパイルしようとしたら、autoconf が古い、とか言われる。そろそろ次の何かにしろということか・・・。


require 'timeout'
require 'socket'
$i = 0
Port = 32323
LongData = ''
100.times{LongData << '--------'}

#Thread.current.priority = 1
# recv thread
Thread.new{
  TCPServer.open(Port){|server|
    puts "open server"
    Thread.current.priority = 0
    while true
      begin
        Thread.start(server.accept){|rs|
          puts "recv : #{rs.gets}"
          rs.gets
          # sleep 10
        }
      rescue
        raise
      end
    end
  }
}.priority = 1

# send thread
Thread.new{
  while true
    begin
      timeout(1){
        Thread.start(TCPSocket.open('localhost',Port)){|ss|
          $i += 1
          puts "send : #{$i}"
          ss.puts "#{$i}"
          ss.puts LongData
        }
      }
    rescue TimeoutError
      puts 'timeout'
    end
  end
}

Thread.current.priority = -1
while Thread.list.size != 1
  Thread.pass
end

これを win でやったら、

...(略)
recv : 251
send 252
Exception `Errno::EBADF' at t.rb:17 - Bad file descriptor
Exception `Errno::EBADF' at t.rb:22 - Bad file descriptor
t.rb:17:in `accept': Bad file descriptor (Errno::EBADF)
        from t.rb:17

だそうで。linux で試したかったのです。ruby18p5-mswin 以前では segv するのね。これ。

win2k Pro のネットワークの制限かな。

ちょっとソース変え。Linux上でやったら、time expired ばっかり。はて。

データ小さくしても変わらず。なんか無茶苦茶時間かかってるな。ループバックなだけなはずなのに。はて。


いきなり make test をしてはいけないらしい。


オブジェクト指向シンポジウム2003、早期割引は 8/11 までだそうです。

というか、

■8/19(火)

15:00 - 18:00
特別チュートリアル
 "The Eiffel approach to software construction"
     Bertrand Meyer (ETH, Eiffel Software, and Monash Univ.)

会費:シンポジウム参加者は無料です。
      特別チュートリアルのみ参加の方は資料集代1,000円程度(未定)を頂きます。

これだけでもいいような気がちょっとした。4日潰すのは辛いんだよな。


人生は有限オートマトン?


私は、漢字が嫌いなのではないんですが(親からもらった名前、大好きです)、「笹」という字が、フォントによっては、というか殆どのPC用フォントで竹冠がでかく、字面が嫌いなのです。「世」も、なんかカクカクしてるし。

あと、「笹」の字を、草冠に「世」にする人も多い。なぜ?


う、私の研究の姿勢も狩猟な気が。

ああ、秋葉原行きたい。

ぷに。すげぇ。いったい何を教えるんだ、ぷにスクール。

なんか、OO2003 の案内メールを3通ほど受け取る。うーん。あと、oo-square にも来そうだな。

ああ、やっぱり SWoPP 行きたかった。自業自得。


ruby 1.8.0 おめでとうございます。ごくろうさまでした。

大型リリース風景を見せてもらって、感動しました。たくさんの人が協力して、どんどん成長していく様は、本当に壮観でした。


今日やったミス at Java。

  • 返り値で return を付けない
  • 文末に ; を付けない
  • 関数に () を付けない
  • nullチェックに if(obj){...} と書く

parser のエラーメッセージってどうやってつけるもんなんかな。例外処理部がもう一度パーサのふりをして、エラーを特定する、とかやるんじゃろうか。

_み(Mon Aug 04 09:49:47 JST 2003)

 無能な担当をクビにしたい。たぶん、落ちたことも気づいてないだろう

_ま(Mon Aug 04 15:39:45 JST 2003)

 おぉ!やっと復活しましたか。メールが見れずに大変だったよ。

_washizaki(Mon Aug 04 19:26:44 JST 2003)

 すみません、oosquare、今まさに投稿させていただくところです。。。

_ささだ(Mon Aug 04 19:38:32 JST 2003)

 アタッタ!(違)

_2(Sat)

本日0時あたりから、学科のネットワークが死んでるっぽい。復旧はいつになることやら。

やっぱこういうの困るよなー。

_1(Fri)

うわ、8月だよ・・・。


(例文)「会社には2種類の人間、つまり部長以上の人と部長以下の人がいる。」

部長って、上と下、どっちに入るんだろう。


一生ずっとフリーター可能なのか 第一世代は崖っぷち。んー。仕事見つけんとなぁ。


こう、某さんの日記のシチュエーションにハァハァする人も中にはいるんだろうな、とか想像してみる。いや、しない。

ああ、SWoPP 行きたかったなぁ・・・。


人生の ChangeLog かー。

_み(Fri Aug 01 16:59:04 JST 2003)

 一生フリータは可能だよね、生活はどうなるか知らないけど。こんなことわかっているはずなのに。流石バブル世代、僕の世代はそんな余裕なかったし、世の中なんてそんな甘かねーよ、ってずっと思っている。

_新潟のS(Fri Aug 01 23:06:26 JST 2003)

 古い曲ですみません。高校生の頃聞いたチャーの歌詩を未だに覚えています。「やりたいことをやるには、やりたくないことを10倍以上しないとどうにもならない」ってやつなんだけど。

_fukumori(Fri Aug 01 23:51:46 JST 2003)

やはり(a)自分のやりたいことを知る (b)生活を立てる の両方をいかにして満たすかを常に考えている必要があると思います。どちらが欠けても困るのに、(a)(b)両方を満たしていないという点で、先のリンクの記事にあるケースはかなり不幸な気が。

_み(Mon Aug 04 09:48:50 JST 2003)

 そうそう、古い歌では、ユーミンに、自由と孤独はトレードオフ、的なのがあったっけ、恋愛だけど。あっ、このネタも30代まではいいけど、ある年齢超えたら、惨めな内容かも。

_み(Tue Aug 05 13:18:56 JST 2003)

 「自由の代償」という言葉を口にした.←さらに古い歌:C.S.N.Y “Find the Cost of Freedom”

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