台風で飛行機飛ばなかったらどうしよう・・・。なんか、松江のときも同じような事言ってる気がする。
晴れたなあ。よかったよかった。
それではそろそろ行ってきます。現地時間 10/2 まではネットに繋がるような気がしますので、プレゼンへの突っ込みは歓迎、って現地時間 10/2 に発表じゃん。
HSP作者さんは言語を作りたかったんじゃないんじゃないかなぁ。
10/3-7 は IP unreachable になりそうな予感.皆様よろしく.
大容量バッテリーほしいなあと思っても,もう買う余裕ないし.誰かかしてくれませんか(むり).MURAMASA MT1-H1 です.
新宿に行けば売ってるらしい.3万円.どーしよぅ.
買って来ちゃった.むちゃくちゃ重い.MURAMASAの意味ねー.
しかし,これで飛行機の中でプレゼンを考えることができる.
・・・まだ一ページもできてない orz
バッテリーを買いに行く時間を使ってプレゼンを考えればよかったじゃないですかー
バッテリーを買いに行く現実逃避で orz
そうだと思いますよ。> 言語を作りたかったんじゃない
でも、そんな風に生まれた言語でも、言語は言語なわけで。 言語屋としては悲しいわけですよ。
言語に関心がないんだったら、あんなのデザインする前にひとこと 言ってくれたらよかったのにと。
あるいは簡単に使える言語ツールキットとかあれば良かったのかな あ。機能をドロップインするだけで(少なくともHSP程度の)統合開 発ツールになりますとか。
そういうのを目的とした言語設計,処理系設計ってのも面白いですねえ.やってみませんか?(とか言う)
ruby-talk 反応スゲー。ありがたいんだが、あの量を読むのに非常に時間がかかってしまった。
で、まだ改造は終わらない、というか、寝てしまった。今日中に Proc の実現までやらないと、明日プレゼン資料が作れないぞ。
スレッドローカルなオブジェクトの生成とか嫌だなー、とか思ってたら、スタックに積めばいい、というすげぇ単純な話を忘れていた。要するに alloca。
しかし、これを組み込むのとても大変。一週間は欲しかった orz 。
風邪。のどにせきに。
去年のラスベガスのときもそうだったんだよなぁ。
昨日の正解は SPEC CFP2000 168.wupwise/wupwise.f にあった、
COMPLEX*16 ALPH,ALPHA,BETA,DELTA,RHO,OMEGA,ST,TT c 中略 RHO = ALPH/ALPHA * DELTA/OMEGA
でした。
展開したものを見ると、展開前の式が全然思いつかない。
eclipse のコードフォーマッタはとても素晴らしいんだけど、やっぱり小回りが効かない。
a = 1; bb = 2; ccc = 3;
というコードは、私は
a = 1; bb = 2; ccc = 3;
にするんだけど、そうやるオプションも無い。残念。
そもそも、最悪な折り返しをすることを知って、使えないなと判断(メソッド呼び出しの "." で折り返す)。
scheme は、重要な部分は10ページくらいの仕様書に収まっているので勉強しようかなあと思ったんですが、Common Lisp は1000ページくらいありそう(イメージ)なので、手を出す気がしません。
HSPは3ページくらい読めばなんとかなりそう(イメージ)なので、手を出す必要があれば、手を出そうかなぁ、とは思います。
こういうイメージは大切なんじゃないかなぁ、とか。
Scheme でも、ゲームプログラミング用キットとか出れば、受けるんじゃないかなぁ(イメージ)。goto が無いから駄目か。
私はブロックは do/end で書かない人なんだけれど、{} 表記が使えなかったら、今どうしてるんだろう。それでも Ruby を使ってハッピーだったんだろうか。使えない 1.0 ぐらいから使っていると、do/end しか使えない人になっていたんだろうか。
(define-scene sceneA (: labelA (print "foo") (print "bar") (goto labelB)) (: labelB (print "baz") (goto labelA)) ) ... (sceneA) (sceneB) ...
こんな感じなのかなぁ。
() 書くのが面倒で、やっぱ誰も使わないんじゃないかなあ。
goto の実装は、トップレベルの継続を持っておいて云々、でしょうか。
さて、最近は JavaJava ばかりしてたんですが、いい加減、yarv の設計ミスを修正しないといけないのです。というか、あと2日強しかないよ。
明日は東大行こうと思ってたんだけど、むりぽ。
Proc までは実装したいしなぁ。
で、設計ミスのところは、スタック構造なんだけど、self を毎回積むかどうかをスゲーなやんでおります。
instance_eval とか考え出すと、やっぱり self がブロック実行中にさしかわるわけで、やっぱり毎回積まないといけないような気がするんですが、一回増えちゃうんですよねぇ・・・。非常に嫌なわけです。
うーん、どうしてくれよう。
ちなみに、継続を Proc オブジェクトに入れちゃいけないのは当然ですた。すみません。
スレッドで同時に動かせないし、何よりリエントラントにならないですね。
selfレジスタを用意する? でも、そのコストを払うだけの意味が、果たしてあるのか?(self だからあるような気もする)
でも、push/pop のコストを考えるとどうなんだろうなー。どうせ、x86 なら spレジスタ間接アクセスになるだろうし、そうなると、スタックフレームレジスタ間接でもかわらんかなあ。でも、そもそもスタックフレームレジスタを得るのに sp 経由しそうなのが嫌な感じではある。
そういえば、まだ ruby 最新版でのテストをやっていない。ripper 前夜で止まってる。変なところで立ち止まりたくなかったからだけれど。やっぱり最新がいいかなぁ。
method frame: VALUE a1, a2, ... , aM; VALUE l1, l2, ... , lN struct method_frame: <- lfp VALUE block; // lfp[0] struct control_frame: <- cfp VALUE magic; // MAGIC_METHOD VALUE self; // cfp[0] VALUE iseq; // cfp[1] struct continuation_frame: VALUE pc; // cfp[2] VALUE lfp; // cfp[3] VALUE dfp; // cfp[4] VALUE cfp; // cfp[5] block frame: VALUE a1, a2, ... , aM; VALUE l1, l2, ... , lN; // zero clear // will be vanished at Ruby 2.0 struct block_frame: VALUE prev_dfp; // dfp[0] struct control_frame: <- cfp VALUE magic; // MAGIC_BLOCK VALUE self; // cfp[0] VALUE iseq; // cfp[1] struct continuation_frame: VALUE pc; // cfp[2] VALUE lfp; // cfp[3] VALUE dfp; // cfp[4] VALUE cfp; // cfp[5] class frame: VALUE a1, a2, ... , aM; VALUE l1, l2, ... , lN; // zero clear struct class_frame: VALUE dummy; struct control_frame: <- cfp VALUE magic; // MAGIC_CLASS VALUE self; // cfp[0] VALUE iseq; // cfp[1] struct continuation_frame: VALUE pc; // cfp[2] VALUE lfp; // cfp[3] VALUE dfp; // cfp[4] VALUE cfp; // cfp[5]
こんな感じ。
結局、
悔しい・・・。
つまり、1+2 は、
push 1 push 2 send :+, 1
となり、
stack[sp++] = 1 # push 1 stack[sp++] = 2 # push 2 # send :+, 1 callee_self = stack[-1-1] method = method_search(callee_self, :+) // iroiro push block # Qfalse push MAGIC_METHOD push callee_self push method push current_pc # push continuation push current_lfp push current_dfp push current_cfp current_pc = method current_lfp = current_sp - 8 current_dfp = current_lfp current_cfp = current_sp - 6
スゲー遅そう。まぁ、しょうがないのかしらん。
あれ、結局、メソッドフレームを戻るためには cfp じゃ駄目か。どうしようかなあ。現状維持?
変数アクセスを ptr[-idx] という式にしているんだけれど、これは速度的にどうなんだろう。
#define MAX 10000 #define LOOP 100000 //#define ACCESS(idx) (fwd[idx]) #define ACCESS(idx) (rev[-idx]) int main(){ int ary[MAX]; int i, j; int *fwd = &ary[0]; int *rev = &ary[MAX]; volatile int dst; for(i=0; i<LOOP; i++){ for(j=0; j<MAX; j++){ dst = ACCESS(j); } } return 0; }
実験してみた。
// 昇順 $ gcc -O2 a.c; time ./a real 0m2.382s user 0m2.296s sys 0m0.015s // 降順 $ gcc -O2 a.c; time ./a real 0m1.606s user 0m1.593s sys 0m0.000s
あれー、降順の方が速いのん? なんでー?
cl(VC6) でやってみた。
// 昇順 $ cl -O2 a.c; time ./a real 0m3.155s user 0m0.015s sys 0m0.016s // 降順 $ cl -O2 a.c; time ./a real 0m2.390s user 0m0.015s sys 0m0.031s
やっぱりこっちのほうが速い。なんでー? -O0 だったりすると、neg の影響か微妙に降順が遅かったんだが。しかし、なぜだ?
ランダムアクセスにしてみる。
#define MAX 10000 #define LOOP 50000 //#define ACCESS(idx) (fwd[idx]) #define ACCESS(idx) (rev[-idx]) int main(){ int ary[MAX]; int i, j; int *fwd = &ary[0]; int *rev = &ary[MAX]; volatile int dst; int pattern[] = { 17, 3, 3, 10, 7, 12, 0, 14, 14, 9, 11, 19, 16, 19, 16, 11, 8, 18, 18, 5, 5, }; #define PMAX (sizeof(pattern)/sizeof(pattern[0])) for(i=0; i<LOOP; i++){ for(j=0; j<MAX; j++){ dst = ACCESS(pattern[j%PMAX]); } } return 0; }
$ gcc -O2 a.c; time ./a real 0m4.802s user 0m4.687s sys 0m0.000s $ gcc -O2 a.c; time ./a real 0m4.731s user 0m4.608s sys 0m0.015s
$ cl -O2 a.c; time ./a real 0m17.801s user 0m0.015s sys 0m0.030s $ cl -O2 a.c; time ./a real 0m17.362s user 0m0.031s sys 0m0.015s
やっぱり微妙に速い。そういうもんなんでしょうか。
ただ単にシーケンシャルアクセス版: # 昇順 L10: movl (%ebx,%edx,4), %eax incl %edx cmpl $9999, %edx movl %eax, -40028(%ebp) jle L10 # 降順 L10: movl (%edx), %eax subl $4, %edx decl %ecx movl %eax, -40028(%ebp) jns L10
cmpl の代わりに decl で代用してるのが速いのかな。
うーん、わからん。とりあえず、遅くなってはいなさそうなので、このまま突き進むか。
しかし、不思議。他のマシン、アーキテクチャの結果も知りたいなあ。
メモリアクセスが速いってわけじゃなくて、ループが速いってことだろうか。
内部ループが昇順か降順かってことか。これだとテストにならないなぁ。
#define MAX 10000 #define LOOP 40000 //#define ACCESS(idx) (ary[idx]) #define ACCESS(idx) (fwd[idx]) //#define ACCESS(idx) (rev[-idx]) int main(){ int ary[MAX], tary[MAX]; int i, j; int *fwd = &ary[0]; int *rev = &ary[MAX]; volatile int dst; for(i=0; i<LOOP; i++){ for(j=0; j<MAX; j++){ dst = tary[j]; dst = ACCESS(j); } } return 0; }
$ gcc -O3 a.c; time ./a real 0m1.296s user 0m1.218s sys 0m0.031s $ gcc -O3 a.c; time ./a real 0m1.917s user 0m1.827s sys 0m0.015s
こんなふうにすると、やっぱり遅い。困ったねえ。ランダムアクセスでも、微妙に遅い。
で、こんなテストでは、自分のプログラムが速いか遅いかわからないのであった。
ループの induction 変数と、配列アクセス index が別のレジスタになれば、テストになるんだよな。でも、どうやったらそうなるのかわからないので、しない。
j を volatile にすればいいのか。って、まだ駄目だなあ。
全部アセンブラで書き直せば問題ないんだが、面倒なので嫌だ。
QuickML って、参加メールに参加者名簿が載るけど、1000人規模のMLになったら大変そうだなあ。
Schemeにgotoそのものはないけど、同じようなことはできるよ。ラベルを局所関数にして、gotoの代わりに関数呼び出しにするとか。
ロボット制御に十分なプログラム記述能力。XS Lisp〜SchemeベースのLisp言語(湯淺 太一「Lego MindStorms制御プログラムの対話型開発・実行環境」, #45プロシン)とかは?
ブロックはdo/endの方が新しいですよ。
やればできるってのはわかってるんですが、HSPの代わりになるかなーという観点から。
そういえばそうでした。失礼しました。
セーブ、ロードに関しては、コンパイラががんばれば、継続を作った時にスタック中の情報のうち捕まえる必要のあるものだけ名前との対応をつけて保存しとく、ということができるかも。その中にシリアライズ不可の情報が無ければ、それをダンプして、ちょっとコードをいじったやつに再ロードする、ということは可能かもね。
でも、ゲームイベント記述で面倒なのはどっちかっていうと、
あたりだと思うので、そこをどう綺麗に書けるかが気になるかも。
ゲームだと、Actorみたいな並行オブジェクト記述を細かい粒度で切り替えて実行するシミュレータっぽい言語が有効かもしれませんね。ところで、ささやん、じゃなかった笹田君はアクションゲームじゃなくて「シナリオ記述言語」とか「妹記述言語」とかを考えてるんじゃないんですかね(違
妹を記述するには、goto では大変そうです。
なんとなく綺麗.元の式わかりますか?
rho._imag = DIV((SUB(MULT((ADD(MULT(DIV((ADD(MULT(alph._real, alpha._real), MULT(alph._imag, alpha._imag))), (ADD(MULT(alpha._real, alpha._real), MULT(alpha._imag, alpha._imag)))), delta._imag), MULT(DIV((SUB(MULT(alph._imag, alpha._real), MULT(alph._real, alpha._imag))), (ADD(MULT(alpha._real, alpha._real), MULT(alpha._imag, alpha._imag)))), delta._real))), omega._real), MULT((SUB(MULT(DIV((ADD(MULT(alph._real, alpha._real), MULT(alph._imag, alpha._imag))), (ADD(MULT(alpha._real, alpha._real), MULT(alpha._imag, alpha._imag)))), delta._real), MULT(DIV((SUB(MULT(alph._imag, alpha._real), MULT(alph._real, alpha._imag))), (ADD(MULT(alpha._real, alpha._real), MULT(alpha._imag, alpha._imag)))), delta._imag))), omega._imag))), (ADD(MULT(omega._real, omega._real), MULT(omega._imag, omega._imag)))); rho._real = DIV((ADD(MULT((SUB(MULT(DIV((ADD(MULT(alph._real, alpha._real), MULT(alph._imag, alpha._imag))), (ADD(MULT(alpha._real, alpha._real), MULT(alpha._imag, alpha._imag)))), delta._real), MULT(DIV((SUB(MULT(alph._imag, alpha._real), MULT(alph._real, alpha._imag))), (ADD(MULT(alpha._real, alpha._real), MULT(alpha._imag, alpha._imag)))), delta._imag))), omega._real), MULT((ADD(MULT(DIV((ADD(MULT(alph._real, alpha._real), MULT(alph._imag, alpha._imag))), (ADD(MULT(alpha._real, alpha._real), MULT(alpha._imag, alpha._imag)))), delta._imag), MULT(DIV((SUB(MULT(alph._imag, alpha._real), MULT(alph._real, alpha._imag))), (ADD(MULT(alpha._real, alpha._real), MULT(alpha._imag, alpha._imag)))), delta._real))), omega._imag))), (ADD(MULT(omega._real, omega._real), MULT(omega._imag, omega._imag))));
pthread_setspecific あたりですかねぇ。
rho._imag = ((((((((alph._real * alpha._real) + (alph._imag * alpha._imag)) / ((alpha._real * alpha._real) + (alpha._imag * alpha._imag))) * delta._imag) + ((((alph._imag * alpha._real) - (alph._real * alpha._imag)) / ((alpha._real * alpha._real) + (alpha._imag * alpha._imag))) * delta._real)) * omega._real) - ((((((alph._real * alpha._real) + (alph._imag * alpha._imag)) / ((alpha._real * alpha._real) + (alpha._imag * alpha._imag))) * delta._real) - ((((alph._imag * alpha._real) - (alph._real * alpha._imag)) / ((alpha._real * alpha._real) + (alpha._imag * alpha._imag))) * delta._imag)) * omega._imag)) / ((omega._real * omega._real) + (omega._imag * omega._imag))); rho._real = ((((((((alph._real * alpha._real) + (alph._imag * alpha._imag)) / ((alpha._real * alpha._real) + (alpha._imag * alpha._imag))) * delta._real) - ((((alph._imag * alpha._real) - (alph._real * alpha._imag)) / ((alpha._real * alpha._real) + (alpha._imag * alpha._imag))) * delta._imag)) * omega._real) + ((((((alph._real * alpha._real) + (alph._imag * alpha._imag)) / ((alpha._real * alpha._real) + (alpha._imag * alpha._imag))) * delta._imag) + ((((alph._imag * alpha._real) - (alph._real * alpha._imag)) / ((alpha._real * alpha._real) + (alpha._imag * alpha._imag))) * delta._real)) * omega._imag)) / ((omega._real * omega._real) + (omega._imag * omega._imag)));
こんな感じですかねー
長ー。それは SUB とかを単純に置換しただけじゃ・・・。
複素数のかけ算
rho=( alph * ~alpha * delta * ~omega ) / |omega|^2 / |alpha|^2
かな。ただし、
計算間違いしてそう...
もう Java は嫌だ.嫌だ.
でも,静的型システムってやっぱりいいなぁ,という部分もあります.
というか,自分の書いたソースがもう嫌だ,というところか.手元に SPARC 環境作っておけばよかった・・・ orz.
死にそう.
人様に使ってもらえるようなプログラムを作ってみたい・・・.
リモートデスクトップは楽しい。
なんとなく思いついたんですが,tail call はやっぱり stack gc で行うことにしよう.
tail call の場合,previous stack pointer を前のところに指して・・・ってやると,結局stack trace の問題になるのか.二つあればいいんか.それはそれで嫌だなぁ.
頭がふらふらする.めがしょぼしょぼする.焦点が合わない.
なんか喜怒哀楽に溢れてて楽しそうな日記ですね。
嫌な夢で変な時間に目が醒めてしまった。
今日のししゃもさん。
sixamo: shugo さんは MS office みたいなもののようです.
OpenGL Features Articles and Tips
挫折気味。
フルバ15巻読了.
少女マンガだ.
Ruby Quizキター.さぁ,解こうかと思ったら,長すぎる英語にさくっと挫折 orz.
まだぜんぜん RubyConf の準備できてねー.
というか,スタックフレームの設計全部やりなおしなのにー.手がつかないー.うわー.うわー.
何だとおー
もうどうにもなくなってテストを Xeon でやることにした,やっぱ速いなぁ.
世間ではなんとかスパムで大変らしいが,うちみたいな無名で自分で作ったやつだと,そもそもそんなものが無い.マイノリティー万歳.
SUBROUTINE SN519(IVD001,*,*) 00070519 RETURN (IVD001 - 2*(IVD001/2) + 1) 00080519 ENTRY EN872(IVD002,*,*) 00090519 RETURN (IVD002 - 3) 00100519 END 00110519
これどういう意味だっけ・・・.
スパゲッティ量産中・・・.どこで間違えたのかなあ.
すっかり忘れてた・・・ orz
bamboo grass.
いい具合にてんぱってきました.いや,いい具合じゃなくて・・・.
そうだよな,正直るびまの話なんかしてる暇なんかないんだよな.
ちゃんと Java の仕事やるんだったら Eclipse がさくっと動くノートPCがほしいなぁ. うちの MURAMASA さん(500Mhz, 128MB)では辛い・・・.
#!ruby -Ks # on Windows def p :ghost end #=> :ghost
最近の Ruby は,こんなことも出来る.凄いなー.(注:最近じゃなくても出来る)
とても駄目な日。駄目な週末。orz
win32ole.so を利用している人,事例紹介できる人募集中.
Rubyを業務に使ってる人,事例紹介できる人募集中.
<td><</td>
をきちんとパースしてくれる(<td><</td>
と書きたかった)ブラウザって凄いと思う.
OLEOLE詐欺.
IRCをしていると,時間が矢のようにすぎる.帰ってこない.
%q の後には { が人気なんだろうか.
別に、checkout してソースを見るのは怖くないことに気付いた(アホ
うひゃ、dynamic_wind やるんですか・・・。
なんとなく RDE でやってみようかなぁ、と思ったんだけど、キーバインディングにあえなく挫折。
まぁ,自分がやりたいことをやるのが一番ですよね.物事で一番大変なのはモチベーションの維持.
読書会だけど,SICPとRHGをやっているので,もう一個,はちと辛い.飲み会が無ければいけるか.
夢の樹を接げたなら(森岡浩之)読了.
やっぱりスパイスが・・・.途中から,オチが読めたんだが,あの読後感の悪さは・・・.
あかん,何もやる気がしない・・・.ダメすぎる・・・.
で,なんとなく profile をもうちょっとちゃんと書いてみる.
田中さんと話してたんだけど,さて「るびま」に記事を書くと,それは業績に入るんだろうか?
2号は凄いぞー。
でも、技術よりばかりになってしまいそうなんだよな。
「ささだのじぁんくらんど」と改名なさって私のHPと強制リンクって云うのはありですか?
改名って,何を改名ですか?
まぁ,自分がやりたいことをやるのが一番ですよね.物事で一番大変なのはモチベーションの維持.
やりたいことは別にあるんだけど、誰もやる人がいなくて、それが許せなくて仕方なく自分でやるというのはフラストラーションが溜まります。 One-Click Ruby Installer for Windowsの日本語特化バージョンはまさにそれです。
まぁ、誰のせいにも出来ないですしねえ。だからこそ、モチベーションの維持が大変なんですが。
アカデミックな意味での業績にはならないわけだけど、業績リストに書くか書かないか?雑誌記事みたいなもんだと考えると、書かない?
飲み会がなければ、のこころは時間の問題?
時間と金と。
こんなところで書くのもなんなんですが、OpenGL でテキストを表示する簡単な方法はなんでしょうか。FreeStyle を使えば綺麗なのがぐりぐり動かせそうなんだけど、インストールとか大変そう。そもそも Ruby binding が無い。
glutStrokeCharacter が一番楽で綺麗だろうか。
バイク盗まれた orz
色々とショック・・・。
これから通学どうしよう・・・。
と思って警察署に行く前に,ちょっと近くの公園を覗いたら,あった orz.
いったいなんなんだ.
その足でセキュリティグッズを買ってきてしまった.
今日も楽しいRHG飲み会であった.
文字数が少なくて、レイアウトも簡単(等幅とか)で良ければ、全文字を書いたtextureを用意しといて、キャラクタコードからuvを計算して描画、ってのもよくやる手ですね。いろんなフォントが使いたいとか漢字も全部出なきゃいやとか、プロポーショナルフォントでレイアウトしたい、とかなら、Pangoでテクスチャに描画して張り付けるという手が使えます。
単純なアルファベットを表示させればいいので,それが一番簡単ですかねぇ.
FreeType?
るびま,記事募集してます.これぞ,という方は宜しくお願いします.
ついでに,こんな記事を読みたい,というのも募集してます.
日本語の書き方を忘れてるってのは,つまり英語ばっかり書いていて大変ってことなんだろうか.
KNOPPIX って,結局なんて読むの?
svn を覚えると, cvs めんどいなぁ.
他人のバグは蜜の味.自分にかかわってる場合除く.
バックアップディレクトリが爆発してた・・・.w3ml のメールアーカイブを保存していたのが敗因.
apt-get dist-upgrade したら cgi が動かなくなった。なんでかなー、と思ったら、 mods-available/cgi.load なんてものが。
どーも realforce はキーの間がでかくて慣れない。どうしようかなぁ。
あれ、聖剣伝説のリメイクなんてあったん? 知らんかった。
るびまって、そんなにしょっちゅう出すんですか。がんばってください。
来月中旬に2号の予定です.
KNOPPIXはクノーピクスです
ネギまのキャラクターCDみたいですね。
暗号ネタはあるんですか?フリーソフトはもう駄目なのか?!とか・・・
暗号ネタはまだありません.ただ,るびまでやるべきかどうかはちょっと悩むところではありそうです.
どうしてもシンプルな解法が思いつかない。困ったなあ。
はじめてくずきりというのを食べた。甘い。
def m pr = lambda{ return } pr.call p :unreachable end m #=> :unreachable def m pr = Proc.new{ return } pr.call p :unreachable end m #=> ...
難しい・・・。
やっぱり、仕様の理解、(できれば、仕様の整理)の後で実装方法を考えたほうがいいのかもしんない。
松江行ったとき、きちんと質問をまとめていなかったのは大変不味いことでした。やれやれ。
しかし、returnのextentだけは、どうにも効率的な実装が思い浮かばないな。
return をただの end に変えたら、ensure を無視してしまった。
def m begin something return :r ensure p :ensure end end
で、きちんと ensure節を実行していない(この例は適切ではなくて、NODE_RETURN が削られてしまうから、問題はないんだけれど)。
さて、どう実装するべきか。ensure節のスタックを積んでいって、ごにょごにょしないと駄目なのか。うーん。シンプルにはいかないもんだなぁ。で、その ensure 中に例外が起こったらどうなるんだ、とか。うーん。
あれー? だから JavaVM って、サブルーチンコールみたいな命令があったのかなぁ。
うーん、ensure節の記録は要らないと思ったんだけれど、そんなに甘くはなかったか・・・。
def m begin p :body1 begin p :body2 return ensure p :ensure1 end ensure p :ensure2 end p :end end m
この例だと、NODE_RETURN はきえず、yarv で不味いことになる。
ああ、return ってなんて嫌なんだろう。return 無くそう。うん。
ensure の中の return は throw にしてしまおうかなぁ。そうしてしまおう。ちょっと遅くなるけれど、実装は楽だから。
これを調べていたら、違う、根本的なバグを見つけてしまった orz。
あー、やっぱマジックナンバーだめだねぇ。頭の中で 3 だとばっかり思ってたものが、実は 4 だった。
結局どっかで情報をためておいて、でメソッドから抜けるときに「おまえは return できない Proc だよ」と教えてあげなければならない、ということだろうか。うーむー。
で、その「どっか」って、何処だろう。順当に考えれば、メソッドフレームのどっかなんだろうが、そんな領域空いてないってば。どうしたもんかなあ。たったそれだけのことのために、メソッドフレームに 1 word 増やすのはいやだなぁ。なんとかならないものかなぁ。
ある特定の部分をごにょごにょしてこれだけ速くなりました、だと論文になるけれど、全体を作っても論文にならない。大人の世界は難しい。
違うか。環境を保存するんだから、その環境に対して何かしらのアクションをしてやれば、できないことはないような気がしてきたぞ。このあたり、真剣に考えないとわからない。
うーん,やっぱり色々とよくわからなくなってきた.頭悪い.こういうときこそ面と向かって色々と議論したいなぁ.Skypeで電話ください(マテ
今週土曜日,13:00〜,RHG飲み会,もとい読書会を農工大工学部で開きます.興味のある方はぜひ.
やっとクリプトノミコン1-4読み終わった.一ヶ月かかった.
楽しかったです.数学の話はようわからんかったけれど.
ripper,適当にアクションを溜めるなりして,pull型にしたほうが嬉しいこともあるんじゃなかろうか.そうか,それこそ cps で書いたほうが便利か.えーと,どうやって実現するんだ?
今から大岡山に行けば教えてもらえるんだろうか(ないない).
前田さんは,30歩くらい先を見ているけれど,私は足元を見るのもおぼつかない.修行が足らんなあ.
なんとなく,データ構造を考えればなんとかならないかなーとか考えてるけど,ならんかもなぁ.一個,どうしても比較が入りそう.逆に,一個の比較で済むのなら御の字?
うへ,明日も9時半?
ささだ「やることやんなきゃいけないことが全然おわんない」 家族「じゃぁさっさとやれよ」
真理だ.
とてもメールアーカイバが欲しくなってきた。個人用の。まつもとさんが作ってるやつのウェブインターフェースがあれば済むのかなあ。
いっしょにつくばへ帰ろう。
JVMにはメソッド内サブルーチンコール命令JSRがあるじゃん。J2SE 1.4.2からはjavacはJSR, RET命令は生成しなくなったけど。
はい,それを念頭において書いてました.上の文章.JSRという名前が思い出せなかったんです.
Drとったら、つくばへ帰れるようになるといいな、と言ってみる
Dr を remove したら,と読んでしまって.
30年くらい後ろを見ているだけかもよ。
こうやってmaedaさんの知見がささださんの年代に伝わっていくのはいいことですねー。僕もなんとか吸収しないと。
CPS で書くより parse するスレッドが Queue に突っ込む,の方が簡単? 1 エントリの SizedQueue にすれば際限無くメモリ食ったりもしないし.
.forward で gmail/Bloglines に転送するとか>メールアーカイブ #(いるかい?gmail
実装は簡単だけど,色々と嫌そう>SizedQueue
gmail あるんだけど全然使ってないです.やっぱり信頼できないし.
ええと、see thread.rb なんだけど、何か問題ありそうでしょうか?
スレッドは色々といやだなぁと。
ふと、気が付いたんだけど、俺はるびまでは「NaCl訪問記」書いた人、になってるんだろうか。まぁ、そうかも。目次から読み取れるのはそういうことだもんなぁ。いや、書いたのはそうなんですが、あれはおまけというか、凄い勢いででっち上げたものでして・・・。なかなか微妙。
さて、今後舵取りをどうやっていくべきか。まず、舵取りは必要か。舵取りをするなら誰がやるのか。どうやるのか。いろんな選択肢があって、それぞれに理由がありそうなんだが、どうすべきなのかなぁ。俺が考えていいのか、という話もありますが。
realforce、というか日本語配列、やっぱりまだなれない。難しい。
やっとキーの設定が終わった。満足。長いスペースキーがあれば完璧なんだがな。
Fキーはやっぱり要らんな。Fn+数字のほうが押しやすい。キーから遠いから。
さて、ripper が入ったので、コンパイラを ripper で書き直す、という手段があるわけなんだけれど。どうしようかなぁ・・・。
いまさら Ruby で書き直すのは面倒な気がする。on_hoge を書き直したやつを並べれば簡単に出来たりするんだろうか。無理だよなー、多分。
当分このままでいいや。
自分が何した、よりも人がなんて言った、で評価したり、されたりするのは、よくないと思いつつ、やっぱそれが楽だし、しょうがないのかなぁ、とかも思う。注意したい。
ripper が生の AST をさくっと返してくれたらなぁ。色々とやりやすいんだけど。入力ってどうなってんだろう。
realforce、だんだん気に入ってきた。まだ、この軽さにはなかなか慣れないけれど。あと、キーの幅とか。ずいぶん広いよな。Enterを薬指で打つからかもしれない。ちゃんとしたキーボードの練習なんてしたことないからな。
変更したキー。
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Keyboard Layout] "Scancode Map"=hex:00,00,00,00,00,00,00,00,08,00,00,00,01,00,29,00,2b,00,7d,00,\ 1d,00,3a,00,29,00,2b,00,39,00,7b,00,39,00,79,00,3a,00,70,00,00,00,00,00
Processor屋は,ソフトウェア屋を信じない傾向がある気がする.だからこそ,研究のしがいがあるんだけれども.
def m &pr pr.call end m{ break }
は通るけれども,
def m &pr pr end m{ break }.call
は通らない.
さて,どうやって「お前は orphan だよ」と教えてあげればいいんだろう.もしくは, orphan であると判断できるか.
def m pr1, &pr pr1.call if pr1 pr end p :first pr = m(nil){ p :break break :hoge } p :second p m(pr){ }
は通るのに(本当は通っちゃいけない),
def m pr1, &pr pr1.call if pr1 pr end p :first pr = m(nil){ p :break break :hoge } p :second p m(pr){ :hoge }
は通らないのはなぜなんだろう.
def m pr1 pr1.call if pr1 Proc.new end def m2 pr pr.call end p :first pr = m(nil){ p :break break :hoge } p :second p m(pr){ } m2(pr){ }
これも通っちゃうなあ.まぁ,いいか,こんなレアケース.
def m pr = get_proc{ return 3 } pr.call end def get_proc pr = Proc.new pr end m
これは通るんだなぁ.
現在の実装では,iterator から返るとき,フラグ (SCOPE_NOSTACK) を付けるんですね.それはとっても嫌なので,なんとかならないだろうか.
orphan かどうか調べなければならないのは,break と retry と return .return は,また別に微妙らしい.嫌だなぁ,この辺の仕様.
retry と break は orphan だと駄目.return は,ブロックの属するメソッド内なら大丈夫.
orphan の定義を,「イテレータを脱出したあとも,そのブロックで作った Proc オブジェクトが存在する場合,その Procオブジェクト」のことを言ってるんだけど,この定義で大丈夫だよね.
というわけで,orphan からの return は軒並みエラーにしてもらえるといいんだけど,どうですかね.
で,Procオブジェクトが orphan であることを示す方法がまだ見つかっていない.イテレータを終了するときに,もし Proc オブジェクト作ってたら,そいつに「お前は孤児になっちゃったんだよ」と悲しいお知らせをしてやればいいんだろうか.でも,「作ったこと」を知る方法も無いしなあ.どうしよう.
引数の無い proc とか Proc.new を廃止するって奴が実現すれば,コンパイル時にわかるか.これ,さっさと採用してくんないかな.
コンパイル時にわかったとしても,その伝えるタイミングが色々と微妙.ensureの仕組みでやるのもなんか嫌だし.うーんー.
def iter &pr begin something ensure pr.you_are_orphan end end
こんなイメージ.でもなぁ,面倒くさいしなあ.
この問題をきちんと正確に解こうと思ったら,rubyに手を色々と入れなくてはいけなくなってしまうなぁ.それは色々と面倒くさいなぁ.まぁ,rubyレベルの話だけってことにしてもいいか.面倒だし.
p2pチュートリアルの記事がいろいろあるようだけれど,やっぱりかー,って内容.まぁ,記事にするってのは,多くの人が興味のあるだろう内容を書かなきゃいけないことなんだろうけれど.別に,どうでもいい内容とも思わないけれど.
でも,個人的に残念です.
明日のゼミは朝からだったのか! どーしよう.
とりあえず外までさかのぼって、見つかったら、とかそういうので考えてみたけれど、やっぱりだめぽ(同じようなスタック構成になったら区別がつかない、LocalJumpError がフック出来ない、など)。
def m yield end m &lambda{ break }
まぁ、これはこういうもの、というお話でしたが。
短いスペースキーがたくさん並んでるんじゃだめですか?
逆に、Procオブジェクトは無限エクステントってことにしちゃったらだめなのかしらん。もちろんProcが参照してる環境も無限エクステント。
そうしてるんですが,微妙に気持ち悪いです>複数個のスペース
環境はもちろんずっとひきずるんですが,継続を保存しようとすると,現在の構造だとえらいコストがかかるので,多分無理なんじゃないかと思います.
あれ,コストは実はそんなでもないか.
Common Lispのblock〜return-from, tagbody〜goは「ensureで解決」。return-fromの相手のblockや、goの飛び先tagのextentが終了するとinvalidの印を付ける。環境からはたどれるけど、実行時にエラー。(CLtL3章の最後のとこ。)
とりあえず私が編集長をやっている間は、最終的なGO/NOGOは私が判断して責任を負います。ので、あとはささださん(や他のみなさま)のやりたいようにやってくださいませ。>舵取り
とりあえず名前だけ貸してください、と言った手前、いろいろと押し付けるのもあれだなぁ(もう色々と押し付けてるけど)と思ったりしますが、高橋さんをこうやってひっぱり出せてこれたのは、それはそれで成功かなぁと思ってみたり。
「extent が終了すると」、ってのが嫌ですねぇ。動的にやるのは。
p2p のやつ行ってきた.技術的な話はあんまりなかった.残念.でも,DHTの話は知らなかったので興味深かった.キーワードだけ,聞いていたので,どんなのか気になっていたから.でも,あれがどれだけアドホックであったり耐故障性があるのかわからなかった.企業の人の話は,技術的にほとんど価値がなかったけれど,絵はやっぱり綺麗だなー,とか.
レイヤー8,9,... の話は,難しいのでよくわからなかった.結局,裁判所が判断しないと,どうにもならんのだなぁ,とか,法律の人はこういう話し方をするのだなぁ,とか,面白いプレゼンするなー,とか,そういうことがわかった.言ってること途中で矛盾してたし.いや,矛盾はしてないが,なんだなかなぁ,とか.そういえば,法律の人は,どうやってプレゼンテーションをページ送りしていたんだろう.黒子がいたんだろうか.
結局ソースを配る側はガクガクブルブルしないといけないんだなぁ.多分.
首藤さん,飲み会誘っていただいてありがとうございました m(__)m
そういえば,てつたろう先生がいらしたのにはびっくり.せっかくパパになったのに,お忙しそうで.
あんまり知ってる人は少なかった.まだまだ世界が狭い.佐々先生が途中で入ってこられて,某あれがやばいのにさぼってるのがばれた予感.うあー.
帰りに秋葉原によって realforce 91u を買った.¥18690.たけー.財布の中身と在庫がなくて,けんじんとんのトラックボールは買えなかった.
面白いのが,秋葉原行きの電車に乗っている途中,クリプトノミコン4を読んでいたら,ちょうど秋葉原に到着するあたりで,章の名前が「秋葉原」になった.笑っちゃった.こういうこともあるんだなぁ.
で,かえる電車で,次の章が「プロジェクトX」.また噴き出してしまった.狙ったのかなぁ.この名前は,戦中の暗号化音声電話システムの開発プロジェクト名と,作品内では言っていたけど.
我慢できなくて,少し使ってみた.FKB8579 とキー配列が違って(当然だ),やっぱりスゲー違和感が.まぁ,さすがにキータッチはいい.硬い FKB8579 に慣れきっているので,ちょっと辛い.
やっぱり,同じキーボードにしておくべきだったかもしれない.うーむー.2個買えちゃうんだよな.
まぁ,HHKL2よりは全然いい.
クリプトノミコン、面白いですよね。
なかなか Java脳にならない・・・.
ししゃもさんがあまりに不評なので,RSS を全部のっけることにした.content:encoded とやらに,raw text を載せるには,どうすればいいんかのぉ.
そういえば SPA2004 のことをすっかり忘れていたのだけれど,なんかアスペクトというキーワードばっかりやなぁ.発表者(ポスターだけだけど)の顔ぶれもすげぇ固まってるし.って,どの研究会もこんなもんか.ええんかなぁ,これで.
そういえば、長かった歯医者通いも今日で最後だった。でも、まだ痛い・・・。どうしようかな。
たしかにSPAって、固定メンバ以外が流入するきっかけが、いまひとつ少ない気もします。って、別にSPAだけの話じゃないか。
蟹を食った。もう当分蟹はいいなあ。
最近キーボードを探してけっこういろんな店舗、いくつかの街を探してるけれど、全然置いていない。
さっさと秋葉原に行くのが近道だったっぽい。火曜日の帰りにでも行こう。
RealForce 91U を試してみようかと思う。HHKPでもいいんだけど、カーソルキーが。RealForce 91U は、日本語配列なのがうざいんだけど、まぁその辺は変更可能だし。
誰か KENSINGTON Expert Mouse (Optical Black) 国内版 使ってる人居ませんかね。使用感などを知りたいんですが。というか、どう使うのかわからない。
予備の HHKL2 を使ってるんですが、非常に使いづらい・・・。指が痛い。
高尾山口駅の「トリックアートミュージアム」というところに行って来ました。大変面白い。
プログラミングで、同じようなことはできないだろうか。
「るびま」に期待するものが、人によって色々あるらしい。そりゃそうだけど。
どうやって、その辺を調整していけばいいんだろうか。
遅れましたが、お疲れ様でした。それにつけても探訪記(訪問記とあえて言わなかったり)おもしろかったです。
ありがとうございます。そう言って頂けると報われます。
http://www.atdot.net/yarv/ で Download tarball がエラーになってます。
tarball 機能は停止させてました。消すの忘れてました。
Rubyist Magazine 創刊号をリリースしました。
お楽しみください。
協力してくださった方、本当に、本当にありがとうございました。これからもよろしくお願いします。
三十三間堂にいって、湯葉を食べて、清水寺に行った。
昼飯は奮発。
清水寺は、人気のないような山奥に踏み込んでみた。また山登り。
るびまFAQ.
やっぱり、って部分はあるんですが、過大な期待をもっちゃう人が居るんだよね。無報酬でいろいろやってるってのを考慮してもらえるといいと思うんですが。
でも、おおむね否定的な意見がなくて、嬉しい限りでございます。
編集長をお願いしたのは正解だった。うん。
数百通のメールを見直す。
list の動的なクラス名、のやつで爆笑。みんなダイナミックプログラミング大好きなんだなあ。
ひさびさのししゃもさん
sixamo: 何を食ったかもう憶えてないようだったら Rubyちゃんよりは敷居は低いと思われます
なんとなくですが、敷居が高いような気がします。
Rubyist Magazine 準備中です.いろんな人がすげーがんばってくれてます.すげー迷惑かけちゃった.でも,それだけいいものが出来てきていると思います.お楽しみに.
読んだ本
がんばってクリプトノミコン 4 を読もう.
マルドゥック・スクランブルは,期待しすぎて期待はずれ.面白かったのだけれど.
今日は愛知。
いろいろと間に合いそうにないので、るびまの記事の編集作業を行う。16分のテープ起こしに凄い時間をかけてしまった。
というわけで、すでに眠れそうにない。7時に家出ないと間に合わない。
昨夜は飲みすぎ。
やっと例外サポート。
class E1 < Exception end begin begin p 1 begin p 11 raise E1 rescue p 12 ensure p 13 end rescue p 2 ensure p 3 end rescue E1 p :OK end
こんなのが動く。
eval.c にパッチをあてないと駄目っぽい。prot_tag にアクセスできないので。パッチを入れると面倒くさいのでいやだったのだけれど。
面倒くさいと、ちょっと試そう、というユーザが居なくなる。
でも、誰も使わないので問題ないという罠。われながら、悲しい話ではある。
うわーん4時じゃよー.あと5時間で出発ー.これから家に帰って,何時間眠れるんだ.というか,起きられるのか俺.
2時間眠れた。
なんかとても IP unreachable になりそうなので、携帯でネットを使うためのケーブルをいまさら用意しようと思ったんだけれど、ずいぶんと高そう・・・。どうしたもんだか。
@nifty:「@niftyアクセスナンバー」の変更方法について こんなのがあったのか。これ使うのがいいのかなぁ。ppp接続設定ってどうやるのかなぁ。windowsでやったことがない。
発表終わり。疲れた。発表は十分準備しないと駄目駄目だね。
やはり一日中聞いてると疲れすぎ・・・。寝てないしなあ。
何しにいったんだ、俺は。
松江城の一番上は、大変気持ちがよかった。無駄に30分くらいぼーっとしてしまった。
def dp obj p obj obj end p begin dp 1 rescue dp 2 else dp 3 ensure dp 4 end
def dp obj p obj obj end begin dp 1 rescue dp 2 else dp 3 ensure dp 4 begin ensure dp :nested end end
きちんと動く。
・・・いや、例外は例外を起こしてなんぼってのは承知しておりますですよ。でも prot_tag が見れないんだもん(言い訳)。
IA32 だと、レジスタ数が少ないのであんまり問題ないんだけど、MIPSのようなCPUだと、callee save なレジスタ郡がある。
setjmp すると、そいつらが、setjmp した状態で保存される。これは、困る場合がある。
int x = 1; if(setjmp(buf)){ x = 2; longjmp(buf, 1); } else{ # x == 2 を期待 }
x が callee save register に割り当てられた場合、longjmp からきたやつは register の状態が復帰されてしまう。とても困る。
解決案1:怖い変数を全部 volatile に → 遅いからいや。というか、ローカルアクセス全部がメモリアクセスになってしまうのが嫌
解決案2:longjmp する可能性があるやつの前でかならず volatile な変数に退避 → 忘れる可能性がある。面倒くさい。signal などと絡めると、必ずしも正確に把握できない可能性がある
というわけで、完璧な答えは無いように思える。そもそも C言語に callee save register に割り当てるな、という何か(修飾子)があればいいんだが、もちろんそんなものはない。
さて、どうやればいいだろう?
って、IA32 は全部 callee save か orz。
全部 volatile にするしかないんだろうか。うーん。セットするときに、必ず volatile な奴にも書き込むか。pc = vpc = hoge;
みたいな。アクセスは pc。これが正解? 他に方法はあるかな?
で、それをやるとすると、なんとなくスタックキャッシングは全然無意味な気がしてきたぞ。どうしたもんだかなぁ・・・。
スタックキャッシュ適用範囲をなんとかすれば何とかなる予感。
そういえば、明日のプレゼン資料何も作ってない。これはとても不味い。
要するに、「メモリ上に値が常に保存されていることを保証する」ことを要求できる何かがあればいいんだよなぁ。volatile の半分くらい。
うわー、頭が悪い。ネストしたbegin/rescueなどは、そもそもテーブルが違うから悩まなくていいんだ。
なんとなく動いた。あくまで、なんとなく。
begin p 1 raise rescue p 2 ensure p 3 end
が動いた。まだスタックの巻き戻しはやってない。
rescue 節を実行しているときのエラーは、その rescue 節にはやってこない。つまり、
begin A rescue B ensure C end
で、B を実行中は、
begin B ensure C end
と同じである。しかし、フレーム的には A の下の B 、というように実装しているため、B で例外が起きた場合、B を巻き戻すと A が出現してしまう。そして、A のテーブルを調べると、B に突入してしまう。
さて、どうしたらいいんだろうか。
まだ明日のプレゼンが何もできていない.あと20時間くらい.間に合うか.
メールの整理してたらえらい時間すぎてるし.明日は9:00に家を出れば十分間に合う.
例外はいろいろ考えた結果,nop を一個挿入することにした.
begin A rescue B ensure C end D => body: start_ensure: start_rescue: A end_rescue: nop cont_rescue: end_ensure: C nop cont_ensure: D catch table: * type: rescue, range: start_rescue - end_rescue continue_point: cont_rescue B * type: ensure, range: start_ensure - end_ensure continue_point: cont_ensure C
で,ハンドラにいくとき,PCをnopの位置にしておけば,巻き戻しても,同じ例外ハンドラにはくっつかない.多分.
無意味な nop が入るのはとてもとても嫌なんだけど.しょうがない.他に方法はあるかしらん.もっときちんとした計算を行えば,なんかあるんだろうか.
あぁ,何やるか全然書いてなかったですね.明日,未踏ユースのブースト会議があります.各プロジェクトのプレゼンを30分でやっていくそうです.なにか,質問などあればつっこみに書いておいてくれれば,聞いておきます.というわけで,何かありますか?
猫の写真を貼るとアクセスが増えるそうなので実験してみる.松江猫.お稲荷様のところに居た.
そういえば,稲荷神社のまわりをあるいているとき,妙に鼻の長い犬みたいななにかが目の前を通り過ぎていた気がするんだけど・・・.犬だよねぇ.まさかねぇ.
気をつけていってらっしゃいませ.
気をつけていってらっしゃいませ〜
気をつけていってらっしゃいませ〜〜
気をつけていってらっしゃいませ〜〜〜
気をつけていってらっしゃいませ〜〜〜〜
もう少しで着くかなぁ〜〜〜〜〜
ささださんとmakiさん無事ホテルに到着しました。