えーと、そういうわけで読書会でした。多分読書会です。きっと。
えーと、色々お話を聞くことができました。
英会話教室の重要性を力強く説明してもらいました。そうですね、たしかにこれから英語は非常に大切です。グローバル(略)なので、ますます英語の(略)ですね。さて、どこがいいのかな。
他にも色々聞いたような気がしますが、よく覚えていません。今度合コンらしいです。頑張ってください。
TRIPS って、 4x4 なマトリックスに配置したCMP? 16個増やして 6倍ってさびしいような気もするけれど、どうなんだろうな。マトリックスにしたほうがIPC稼ぐようなスケジューリングがし易いんだろうか。
しかし、10億とか50億(円)とか・・・。桁が違いますな。研究の桁も違うんだろう、きっと。
Gauche 、ざっくり見たんですが、スタックが足りないときコンティニュエーションを作って、そいつを環境の後ろにくっつける、みたいなことやってるって感じでしょうか。
Compiling with Continuations読みたいけれど、$60・・・。図書館にあったかな・・・。
アリスなんとかでぐぐってたらひっかかった。
VMの命令、なんだかんだと考えていたら、やっぱり粗が沢山ある。ダメダメ。もっともっと多くなるな。命令。
一番悩んでいるのは、acc が要るか、要らないか。どっちなんだろうなぁ・・・。命令にフラグを付けるのは嫌。却下過ぎ。2種類用意するのは・・・。どうなんだろうなぁ。
acc は、実装が頑張るものであって、VM命令には入れないほうがいいのかもしれない。やっぱり入れない方針で行こう。駄目ってわかるときまで。要するに、スタックトップだけレジスタに載せてしまえばいいんだろう。多分。
久しぶりに、'98年度情報科学実験IIコンパイラ演習に挑戦するも、やはり敗退。やっぱりわからん。東大ってやっぱり凄いんだなぁ。一度授業を受けてみたいものだ。
akrさんに、 SPA という存在を聞いたので、調べて見たら、先日の SPA(SPA-SUMMER 2003) の幹事の方って、農工大の人じゃないですか。しかも、隣の隣の研究室・・・。まだ品川さんとお会いしたことないんですが、これを機に話聞いて見ようかな・・・。ダメだよな、この研究室同士の閉鎖性。
SPAを調べていたのは、akrさんの論文を読みたかったからなんですが、置いておらず。春の論文は(Googleで)ひっかけられたんだがなぁ。明日いらっしゃったら聞いてみよう。
しかし、これってポスターセッションしか無いものなの? ポスターだから論文ないんかな。
しかし、いいよな、温泉・・・。
明日、というか今日は reloaded だったんですか。
遅刻するかもしれませんが、行きます。
女の子と付き合ったことがないんですけど…。あははははははははは。(とてもとても笑えない)
前田先生の、「Schemeインタプリタにおける仮想マシンアーキテクチャの最適化」という論文を、どこをどー探しても出てこない。昔見て、しかもプリントアウトした記憶があるような気がするんだけど、見つからない。ウェブ上を探しても見つからない。PRO論文誌を探しても見つからない。うーん、どこいっちゃったんだろうな。研究会報告誌も無いし・・・。
とりあえず終わった。とりあえず帰ろう。5時。cronの時間過ぎちゃったな。
おねがい☆ツインズとやらを初めて見る(寝ろよ)。あれは C++ なのかなぁ。
苺が性格変わってる気がする。OPはシューティングスターがやっぱり秀逸だったんだなぁ。
しかし、目の色はともかく、髪の色全然違うじゃん。
プログラマの部屋はこんなに綺麗じゃないよな、きっと・・・。しかし、いいなぁ、ああいう環境でプログラミングな生活。いや、別に双子と名乗る女の子が二人押しかけてくるような生活が羨ましいというわけではない。多分。
いろいろ私が世話になっている本学科の畠山先生が本をご出版されたということで、紹介させていただきます。
情報科学のための自然言語学入門―ことばで探る脳のしくみ(amazon)。
生成文法理論とか、Xbar理論とか、そういうのだと思います。彼の授業は非常に面白いんだけど、学生をバカにしたところがあるので(ぉ、なかなか突っ込んだことを教えてくれません。そのため、自分でこの本は買って読んでみようかと思ってたりします。頼めば貸してくれるかな。そういえば、著者割引ってきくのかな? 効くんだったら安く買わせて貰うか。
内容説明というのを引用します。
我々の脳の中には「文法」がある。この「脳内文法」のおかげで我々はことばを生み出し、それを理解することができる−。「脳内文法」のメカニズムを具体的に解説した理論言語学の入門書。言語獲得の謎を解き明かす。
学部のときの授業では、「なぜ人は言語を使うことができるのか?」って感じで進んでました。そんな感じの話の本らしい。ちっちゃな子、言語習得が未熟な子でも、最低限の文法は知っているはずだ、これは経験的なものではない、という主張。ということで、実際に彼のお子さんで実験したらしい(笑)。お子さんも大変です。
で、その生まれながら知っている最低限の文法ってなんじゃ? というのを研究するのが生成文法理論、だったような気が。安直に考えると、その最低限の文法を計算機が知っていれば、ある程度の学習によって「言語」が扱えるようになるはずだわな。本当はこの辺ももっと勉強してみたいものではあります。この本読めばそれが書いてあるんかなぁ。
女の子はやたらとエラーを連発するコンピューターみたい。エラーにめげずに試行錯誤するしかないのかも。コンピューターとつきあう方が楽しいなぁと思った若かりし頃の私。
燃えるような恋をしましょう。って、望んでできるものじゃないけど。。。
女の子と付き合ったことがないいま(今日)のうちに、Rubyちゃんコスプレなどひとつ、ご検討くださいませ。
コンピュータ系で閉じると比率の問題で熾烈な競争をくぐり抜けないといけなくなるので、外の領域を攻めるのが吉。 あ、熾烈な競争に勝てる自信があればそんなことしなくていいのか。
なんで一行にこんなに反響があるんですか(笑)。
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
なんというか、全然違うねー。というか、関数呼び出し遅すぎ? なんでだろう? ここまで違うとは思わなかったんだけど。実装きちんと見ないとわかんないかな。
実は double method(謎)ならいいとか、なんとか・・・。
しかし、昨日の日記は長すぎだ。
Scheme 難しいのです。うーん。
のどちらで捉えるのがいいんだろうなぁ。どちらでも捉えられるから、Scheme は偉いんだ、というのかもしれないなぁ、と思ってみたり。
そういえば、相互末尾再帰は回数だけじゃ計算できない、というのは、もちろんそうだと思います。でも、Ruby でそのような小難しい例やるかなぁ、とか ^^;
もしかしたら、新しい妥協点として、
みたいなのもあるかもしれません。イメージとしては 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つのモデルって、あと二つ、思いつかない。
って、論点が全然違う気もするな。完成が楽しみです。
多値について、全然知らないんですが、Ruby に入ったらそれは美味しく使えるものなんでしょうか。
今の仕様は、本当に大変そうで。収束させたい欲求をよく抑えてるなと思います。きっと、もっと綺麗なモデルがいくつも頭の中にあるんだろうなぁ。(使いやすいとは限らない・互換性に問題が)
というかね、今更 ruby の node.h を見てるわけですよ。VM妄想してる奴が今更。我ながら、バカだよなぁ。RHGに載ってましたけど。えーと・・・。すみません、きちんと読んでませんでした。
んで、やっぱりわからないのも結構あるなぁ。名前だけで類推するのはちょっと無理かなぁ。土曜日にでも聞いてみようかなぁ。
次の投票ネタ何にしよう。
もっと勉強しなきゃいかんですねぇ・・・。
案の定筋肉痛。
末尾再帰を最適化する 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は同人ゲームじゃありません。同人音楽ソフトです。(とか言う。だってあのメンバーは贅沢スギだろ! 私はべるめいさんの大ファンなのです)
スタックトレース with 末尾再帰除去、けっこう興味あります。shuJITでは、末尾再帰除去をした際は、スタックトレースはあきらめました。Javaだと、古いセキュリティモデルがスタックの深さに頼ってるから、末尾再帰をジャンプに変換しちゃっていいのか? という問題もありました。
で、それはどう解決されたんでしょうか。< セキュリティモデル
末尾再帰除去してスタックトレースも、とするには、別に専用のリストかなにか用意して、そこに最小限の情報だけ積んで行くしかないんじゃないかと思いますが、そうするとそっちが深さの制限になってしまうでしょうし。
やっぱりあきらめる以外ない?
そもそもCPSだと「呼び出し→復帰」というモデルじゃないですから、スタックトレースという概念自体が意味あることかどうか…
「別に専用のリストかなにか用意して」というのはある意味正しいアプローチで、というのはスタックモデルな言語におけるスタックトレースというのはプログラムの状態履歴のごく一部の情報に過ぎないわけです。本当に調べたい関数はもう復帰しちゃってて状態が見られないなんてことは良くある話で。スタックトレースで何が見たいのかということだと思うんですが。
なるほど。やはり(そういうシステムでは)スタックトレースはあまり気にしても意味がないに一票。
回数は考えてみたんですが、相互再帰には使えないなぁと。そこまで必要ないかな。
相互再帰とかは、回数さえわかれば計算できるから要らないかな、とか思ったんですがどうなんでしょうね。
相互再帰の情報は回数からだけで復元できなさそうに思います。飛び先か飛んで来た元を保存しておかないと。私は相互再帰をよく使いますが、頭の中では状態遷移ネットワークになっているので、「手続きを呼んでいる」という感覚が無いです。
Scheme は Actor の continuation が良くわからないから シンプルに実装してみた.... ら,末尾再帰を最適化した ふつうのラムダ計算と区別が付かなかった,っていう言語 だから CPS は結構本質的な計算モデルの一部なんじゃな いかと想像しますが.
スタックトレースについては,Gauche ではあきらめてる ようですね. http://www.shiro.dreamhost.com/scheme/wiliki/wiliki.cgi?p=Gauche%3aFAQ&l=jp#21
笠原研には愉快な人々が沢山いました。(今もいたりして)FortranのパーサをEmacs Lispで書いたヒトとか(さすがに後から来た人たちがメンテできなくて続かなかったらしい)PostscriptでRay Tracingによるコンピュータグラフィックスのプログラムを書いて(10年前のことです。Slashdot Japanでも最近似たような記事があったような気がするけど、それよりもはるか昔)プリンタにジョブとして放り込んだら、結果が出るまで1時間くらいプリンタが黙ったままになってみんなを困らせたヒトとか。まだまだありますが、今日はこの辺で。
多重継承だと名前のオーバーライドをどうするかが大問題で気軽になんかできないような気がしますが、モジュールだとそゆことがない感じ、って 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 っぽく面倒に逃げるしかないのかな・・・。
なんでこんな日に限ってこんな天気かね・・・。
何年かぶりにプール行ってきた。明日は筋肉痛・・・。
漢字の勉強に勤しみたいと思います。
金払ってバイト行ってきました。一日中プログラミングの話、という経験はあるが、2日間ずっとコンパイラの話、というのは初めて。
電車の中で、3歳くらい? の女の子がお母さんにガムをねだって泣いていた。お母さんはいろいろ言っていたが、聞こえてきた声で笑ってしまったのが、「泣くようなことなの?」
というわけで、読書会でした。遅刻でした。
というかですね、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 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万かー・・・。飛行機で行けば片道それと考えれば・・・しかし・・・。
東京から。むぅ。
あとはえっちらおっちら電車で行くか、下をバイクで走るか・・・。ヒッチハイクってのもあるか。
(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)))
みたいにしてクライアントに渡してしまう、みたいなのは安直じゃろうか。安直だろうな。
破壊的メソッドは使えませんが(使おうとすると、組込み破壊的メソッドすべてに対してこれのサポートが必要になる)。継続に関しては、似たように使えそうな予感。
性能はアレでナニだろうが・・・。
つうか、すべての関数呼び出しで通信が発生! ウザ!
まぁ、組込み関数については最適化が可能か。あれ、駄目か? まぁ、その辺は「実装の都合じゃ!」とか言って逃げるのもありか。
すみません、今日は午後から行きます・・・。
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 について、名前だけみて気になってたんだけど、さすがにライブラリだけでの実装は無理なのね。
うちだと open-uri で 3 秒くらいです。
Guyはフランスの中の人なので「エッフェル」と発音するのでは。
1.8にzlib入ってると思うんですけど。
リゾルバで10秒食ってると見た。
すんません、入ったってどっかで読んだ気がしたんで、lib/ruby/1.8 以下を見て、見つからなかったもので、勘違いしました。ただ単に zlib.lib が無くてコンパイルされなかっただけという間抜け。
Mozilla ?
mozilla
JavaGo ときたら、MOBA よろしく。ライブラリだけです…と言っても、Cでゴリゴリやってるのだけど。www.shudo.net/moba/
いやー、JavaGo では「ネイティブメソッドみたいな変なもんは必要あらへん!」(意訳)と言ってたので、いったいどうやってやるのかなぁ、と思いまして。Javaのリフレクションは実行時コンテキストまでアクセスできるのか! とかちょっと思ってしまいまして。
アルゴリズムの穴に気づき、全部やり直し。とほほ・・・。
ぐあー、やっとデバッグ終わり。かえろー・・・。もう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についても学べて今月はお得なはずです。(シツコイ)
うー、疲れた。さっさと帰ろう。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)
早稲田の味の代表としてティーヌンのトムヤムラーメンを味わってもらいました。あの真っ赤なスープに挑戦してこそ真の漢。僕は別の料理にしたのだけど :)
ご飯もありがたかったんですが、お話のほうがもっと嬉しかったです。ありがとうございました。
SICPの順序づけられないリストとしての集合で作った関数を使うとすっきりいきそうだけど。
すっきりといてください〜(他力本願)
シンボル:頂点 子リスト:連結関係(2要素なら辺)とすればグラフの連結成分の列挙ですね。O(mlogn)ってとこかな?
メーヤウかと
思った>辛いもの
こんなのはいかが(「集合の統合」の項)→ http://www.shiro.dreamhost.com/scheme/wiliki/wiliki.cgi/Scheme:%a5%ea%a5%b9%a5%c8%bd%e8%cd%fd
ああ、そうか。グラフの問題になるのか。
ああ、短い・・・>shiroさん
いきなりメーヤウに連れて行ってチキンカリーを食べていただく、なんて鬼畜なことは僕はやりません。代わりに翌日(21日)はチョコとん…もとい、チョコ入りメンチを食べてもらいました。辛いものの後はやっぱり甘いもので口直し、ということで。
今日OO2003のチュートリアルなので、慌ててオブジェクト指向入門を読みだす。あと500ページか。間に合うかな。
結構微妙な表記もある気がするなぁ。細かいことは気にしないとくか。
Eiffel って参照に Create とか Forget ってやるのか。気色悪いなぁ。
まぁ、どっかの a = new A()
よりは楽か。
self/this/Current
メソッドはその両方? ルーチンの別名?
あはは。P127。
どうやら人はこういったプログラムのか書き方がわかるようになるまで、その手法全体を信用しない傾向にある
P129。
操作の実行順序を基に作られたシステムは外部使用の変更による影響を大きく受けやすい
そうだよなぁ。
返値。かえりちと私は読んでるんだけど。
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 スタジオのインターフェースすげーな・・・。そいえば、聞いてて最初、あいふるってなんだろうって悩んでしまった。
で、これからお仕事なわけですが。やれやれ・・・。夏休み欲しい。
http://jarp.jin.gr.jp/win32/ にreadlineのバイナリがあるです。
なるほど。ありがとうございます。今度試して見ます。
返り値or返値 19100件。 戻り値or戻値 45800件。ちなみに自分は後者派。
いや、19時からバイトがあったもんで....
やっと全部終わった・・・。
タイトルの意味がわからん。というか、謎を残さないでくれ。オルタナティブ買えってことか・・・。
使って1年過ぎたからRuby初心者は名乗っちゃ駄目なのかな。永遠の初心者って感じだけど。
rubyist のコスプレってどうやればいいのかな。悩む。
えーっと、ネタってのは知ってる人がニヤってできればそれでいいと思うのです。というか、これ以上は勘弁してください ^^;
なんか、我ながらシツコイよな・・・。まぁ、これをするために投票っぽいものを作ってみたんだし。
揺れた揺れた。
疲れた。さっさと帰ろう。
なんか家とのネットワークが嫌な感じ。
純夏終り。あれれ、なんかふつーーに終わってしまった。まだなんかあるんだろうけど。
そうか、やっぱり「おしまい」について、もうちょっと考えないと駄目か。
雨なので学校に行けず。どうしようかな。
投票の結果、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)。
夏なので(謎)、某あげの新作(3月くらいのだけど)をやってんだけど、爆笑。あのイントロはうまいなぁ。いやー、君(略)の資産はでかい。マナマナなのかー。
しかし、君(略)の曲がアレンジしてるとは言えかかると、インパクトあるな。
家族がどっか行ったので飯がない。どうやって暮らしていこうか。
カップ麺になりそうな予感・・・。
弁当を絨毯の上にひっくりかしてしまい、鬱。ゲームはバッドエンド。マグロ漁船か・・・。懐かしのまさしえんどって感じですか。(謎)
__send__ と send の話。どうなんでしょうね。send 使う分には、send のような使い方を期待していて、send をオーバーロードする側は、send のような使い方で何か特殊な機能をつけようとするわけで(そうじゃないのは論外として)。
ユーザーが send を使わないと(みんなが __send__ を使うなら)あまり send がある意味がないような気がするんですが、どうでしょうか。
それとも、send という一般単語を使いたい、という理由でこんな仕様になってるんだろうか。少なくとも、知らないと __send__ を使うという発想をしない、という点では自然じゃないわな。
徹夜でカラオケ。
投票の 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 が呼べる
知りませんでした。
生命工学科の人に論文を日本語で書いたと言ったらおおいに驚かれてしまった。やっぱ英語かー。
投票、エラーが出てますだ。
教えていただいてありがとうございました。インスタンス変数の @ を忘れてました。"..#{@name}.." みたいなとき、よく忘れます。
そういうときは"#@name"と書くようにすれば忘れませんよ。
知らなかった!!!>コスプレ
覚えました!>#@name
OO2003、今週中には参加章引換券・振込用紙が郵送されると思います。もし来なかったら、、、事務局に問い合わせてみてください。
すみません、書類が郵送されてました。前は確認メールが来たと思ったんですけど。
最近(というには遅いかしら)、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)
あまりかわらず。
ある機能を探してマニュアルとニラメッコ、4時間くらい粘るが見つからず。動作させてみたら、既存のもの、それをしないようにしてやがる。チクショウ。
へー、#define のシンボルって $ が入っていいんだ。知らなかった。凄まじく気色悪いソースだが。
なんか、バージョンアップしたら、色々となおってる。アレの意味もやっとわかる。うーん、やっぱり一人でやるのは限界があるぞ、これ・・・。せめて情報が欲しい。バージョンアップした、という情報くらい・・・。
う、何十袋もあった気がした袋ラーメンが残り一個。うー、家に帰りたい。
十日過ぎちゃったよー・・・。終わんないよー・・・。
10/4,5 ですか。空けとこう。
そういえば、8/30 の読書会は何をするんですかね、ホント。なんか正規表現第二版、結構買ってるようだから、それになるのかなあ。個人的にはどっかのVMのほうが面白そうなんだけど。
でしたっけ。話に出てたのは。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さんのページに同じものが・・・。まぁいいや、自分で解いたし。多分。
すでにお帰りの途中だったのですね。
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 ないのかなぁ。どないしよ。
ずいぶんと印象がかわったように感じました。渋谷。
結局家に帰れませんでした。生まれて初めて終電にひっかかった・・・。
幹事の高橋さんお疲れ様です。結局ノートどうされたんですか。
たくさんの尊敬する 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 の嫌いな点。
雨止んでるし。家に帰って着替えるか、そのまま行くべきか・・・。
結局家に帰らないで行くことになってしまった。へー、吉祥寺経由のほうが安かったのか、渋谷行き。
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
使いたいかといわれれば使いたくないけど。
まつもとさんのつっこみがご自身の日記に・・・。飲み会でつっこみしてるんだろうか。
リファレンスのない言語で ruby を書けば、実用的なオブジェクト指向プログラミングが!(それは違うし・・・)
なんか、翻訳公開の許可を求めるメールが帰ってきた(Relaying denied)。どないしよう。
アドレスがどうやら変わったらしい。
そうですよねー、あの質問、きたさんしかまともに答えてなかったですよねぇ・・・。
というか、せめて立ってプレゼンすればよかったのに>ruby以外の人。プレゼンって、やっぱりあんまり機会がないもんなんでしょうか。それとも、座ってプレゼンが普通なのかしら。後ろに居たから、全然顔が見えん。
結局 nokadaさん commit しなかったんですね、生開発生commit楽しみにしてたんですが(無茶を言う)。
ごっちゃんです、という単語を忘れないようにメモ(おい)。
ドキドキ。デジカメの用意しとかないと。
オブジェクト指向プログラミングとは、オブジェクト間のメッセージ送受信によるプログラミングであり、それ以上でも以下でもないと思っています。
その「オブジェクトをどうやって表現するか」というのがクラスだったり継承だったりするんだと思うのですが。
でも、そうすると総称関数って説明できないか・・・。あれはオブジェクト指向の本質は関係ないのかな。多態って。本質じゃないか。
って、違うか。メッセージ送受信のほうが本質じゃないってことか。
オブジェクトがある、ってまつもとさんが書いているところしか、本質はないってことなんだろか。実際にどうやって動作させるっていうのは、その上に色々あるってことなんかな。それとも 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お兄ちゃんがどうの、とかいう。
さっさと行ってぶらぶらしてよう。渋谷を歩くなんて何年ぶりだろ。
40命令くらい。どんどん増える。
3日あればできそうな気はするんだけどな。うーみゅ。あぁ、これで修論書けたらどんなに良いか・・・。
retry の意味について、やっとわかった。
いや、リファレンスに書いてあるとおりなのだけど、実感するのが大変だった。
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 に変更。
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 にして、あと色々なんかすれば大丈夫な気がする予感。予感だけ。
すみません、割り算ってわかんないんですが・・・。ダメダメですみません・・・。
廊下に出たら、電気が切ってて真っ暗。大学とは言え、さすがに怖い。
萌え要素ゼロ 。なにかなー、マスクとかは萌えないのかなー、と思って最後の行を見て、大声で叫んでしまいました。
3日でやらずに、3月かければ?
3月かけると飽きます。
aeの件、バグのような気が。直します。
すみません、こういうのが正しい動作だと思ってしまいました。
RHL7.2で同じ現象。9だとOKだった。ライブラリとかのバージョンかな(調べないヤツ
1. 割り算 2. receiver
kjana曰く、 m / / は「m 割る 正規表現開始」である、と。
あーーー、なるほどーーー。やっとわかりました。
Ruby より1桁速いHaskellのVMの実装ならD論になるよ。(ほんとか)
すでに GHC はぶっちぎってないですかね。
ruby vm の命令セットを考えてみる。
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 か。でも、そうすると呼ばれた引数の数を知る必要がでてくるな・・・。
がー、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/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
c◯insに取り組み始めたらしい。
そんな語弊のある言い方を ^^; やってたけど終わんなかったんですー いや、ほんとに
Haskellやろ。キャストいらん。プリミティブ差別なし、自明のかっこはいりまへん。
まだ宇宙人にさらわれたくないからいいです。
gj とか使えば STL っぽくコレクションが使えます.オートボクシングは JDK 1.5 をマテ,という話
「宇宙人誘拐モデル」に代わる「棚からぼた餅モデル」の実装きぼんぬ
どんなモデルだろう・・・。
ども、JavaVMは全然いじってません…
ネットワーク復活。
部屋のカギがあれば、なんかやったんだけど。リモートコントロールロボットになるとか?
しかし、メールが何通くるかガクガクブルブル。
ちょろちょろと届き始めています。
おうちの 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。
parser のエラーメッセージってどうやってつけるもんなんかな。例外処理部がもう一度パーサのふりをして、エラーを特定する、とかやるんじゃろうか。
うわ、8月だよ・・・。
(例文)「会社には2種類の人間、つまり部長以上の人と部長以下の人がいる。」
部長って、上と下、どっちに入るんだろう。
一生ずっとフリーター可能なのか 第一世代は崖っぷち。んー。仕事見つけんとなぁ。
こう、某さんの日記のシチュエーションにハァハァする人も中にはいるんだろうな、とか想像してみる。いや、しない。
ああ、SWoPP 行きたかったなぁ・・・。
人生の ChangeLog かー。
一生フリータは可能だよね、生活はどうなるか知らないけど。こんなことわかっているはずなのに。流石バブル世代、僕の世代はそんな余裕なかったし、世の中なんてそんな甘かねーよ、ってずっと思っている。
古い曲ですみません。高校生の頃聞いたチャーの歌詩を未だに覚えています。「やりたいことをやるには、やりたくないことを10倍以上しないとどうにもならない」ってやつなんだけど。
やはり(a)自分のやりたいことを知る (b)生活を立てる の両方をいかにして満たすかを常に考えている必要があると思います。どちらが欠けても困るのに、(a)(b)両方を満たしていないという点で、先のリンクの記事にあるケースはかなり不幸な気が。
そうそう、古い歌では、ユーミンに、自由と孤独はトレードオフ、的なのがあったっけ、恋愛だけど。あっ、このネタも30代まではいいけど、ある年齢超えたら、惨めな内容かも。
「自由の代償」という言葉を口にした.←さらに古い歌:C.S.N.Y “Find the Cost of Freedom”
Gaucheでは、継続の作製時に全ての継続フレームと環境フレームをヒープに移し、継続を呼び出した場合はヒープ上のフレームを直接参照します。それを利用して、スタックが足りなくなった時に概念的に (call/cc (lambda (k) (k exp))) を実行することにより、スタックの内容をヒープに移しています。ただ、現在はGCとの絡みで、フレーム毎にコピーしてポインタをつなぎかえるという処理が必要で、これがフレーム数が増えるとボトルネックになっていると見ています。 (したがって、スタックがほぼ一杯の時にcall/ccを使うとやっぱり重いのですが、call/ccをヘビーに使うパターンではそれほどスタックが伸びないことが多いので、あまり顕在化しません)。
素人考えなんですけど、単純にスタックの長さを倍倍で増やしていったらまずいでしょうか。増やしたら、スタックが短くなったとき悲しいとか、長いときの call/cc がオセー、とかあるかもしれませんが。
今のGaucheの実装では、いくつか問題が。
で、根本的な解決として考えているのは、次のような戦略です。
うーん、やっぱりきちんとソースを追わないとわかんないですね。今度読ませていただきます。
機会があったらCPSの入門書を紹介してください。どういう経緯でその理論は生み出されたの?