K.Sasada's Home Page

Diary - 2004 September

研究日記

長月

_30(Thu)

台風で飛行機飛ばなかったらどうしよう・・・。なんか、松江のときも同じような事言ってる気がする。


晴れたなあ。よかったよかった。


それではそろそろ行ってきます。現地時間 10/2 まではネットに繋がるような気がしますので、プレゼンへの突っ込みは歓迎、って現地時間 10/2 に発表じゃん。

_sughimsi(Thu Sep 30 06:49:15 JST 2004)

 気をつけていってらっしゃいませ.

_dan(Thu Sep 30 13:07:09 JST 2004)

 気をつけていってらっしゃいませ〜

_shudo(Thu Sep 30 13:34:37 JST 2004)

 気をつけていってらっしゃいませ〜〜

_(う)(Thu Sep 30 18:32:45 JST 2004)

 気をつけていってらっしゃいませ〜〜〜

_Digitune(Thu Sep 30 19:16:16 JST 2004)

 気をつけていってらっしゃいませ〜〜〜〜

_び(Thu Sep 30 21:15:55 JST 2004)

 もう少しで着くかなぁ〜〜〜〜〜

_ogino.(Fri Oct 01 10:02:57 JST 2004)

 ささださんとmakiさん無事ホテルに到着しました。

_29(Wed)

HSP作者さんは言語を作りたかったんじゃないんじゃないかなぁ。


10/3-7 は IP unreachable になりそうな予感.皆様よろしく.


大容量バッテリーほしいなあと思っても,もう買う余裕ないし.誰かかしてくれませんか(むり).MURAMASA MT1-H1 です.


新宿に行けば売ってるらしい.3万円.どーしよぅ.


買って来ちゃった.むちゃくちゃ重い.MURAMASAの意味ねー.

しかし,これで飛行機の中でプレゼンを考えることができる.

・・・まだ一ページもできてない orz

_しゅどう(Wed Sep 29 17:06:11 JST 2004)

 バッテリーを買いに行く時間を使ってプレゼンを考えればよかったじゃないですかー

_ささだ(Wed Sep 29 17:23:02 JST 2004)

 バッテリーを買いに行く現実逃避で orz

_まつもと(Wed Sep 29 18:16:30 JST 2004)

そうだと思いますよ。> 言語を作りたかったんじゃない

でも、そんな風に生まれた言語でも、言語は言語なわけで。 言語屋としては悲しいわけですよ。

言語に関心がないんだったら、あんなのデザインする前にひとこと 言ってくれたらよかったのにと。

あるいは簡単に使える言語ツールキットとかあれば良かったのかな あ。機能をドロップインするだけで(少なくともHSP程度の)統合開 発ツールになりますとか。

_ささだ(Wed Sep 29 20:24:00 JST 2004)

 そういうのを目的とした言語設計,処理系設計ってのも面白いですねえ.やってみませんか?(とか言う)

_28(Tue)

ruby-talk 反応スゲー。ありがたいんだが、あの量を読むのに非常に時間がかかってしまった。


で、まだ改造は終わらない、というか、寝てしまった。今日中に Proc の実現までやらないと、明日プレゼン資料が作れないぞ。


スレッドローカルなオブジェクトの生成とか嫌だなー、とか思ってたら、スタックに積めばいい、というすげぇ単純な話を忘れていた。要するに alloca。

しかし、これを組み込むのとても大変。一週間は欲しかった orz 。


風邪。のどにせきに。

去年のラスベガスのときもそうだったんだよなぁ。

_27(Mon)

昨日の正解は 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]

こんな感じ。

結局、

  • cfp 追加
  • self を yield 実行時にも積むようにした

悔しい・・・。

つまり、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になったら大変そうだなあ。

_maeda(Mon Sep 27 19:01:25 JST 2004)

 Schemeにgotoそのものはないけど、同じようなことはできるよ。ラベルを局所関数にして、gotoの代わりに関数呼び出しにするとか。

_※(Mon Sep 27 20:16:33 JST 2004)

 ロボット制御に十分なプログラム記述能力。XS Lisp〜SchemeベースのLisp言語(湯淺 太一「Lego MindStorms制御プログラムの対話型開発・実行環境」, #45プロシン)とかは?

_まつもと(Mon Sep 27 22:19:22 JST 2004)

 ブロックはdo/endの方が新しいですよ。

_ささだ(Mon Sep 27 23:52:51 JST 2004)

 やればできるってのはわかってるんですが、HSPの代わりになるかなーという観点から。

_ささだ(Mon Sep 27 23:53:05 JST 2004)

 そういえばそうでした。失礼しました。

_shiro(Tue Sep 28 05:06:41 JST 2004)

 セーブ、ロードに関しては、コンパイラががんばれば、継続を作った時にスタック中の情報のうち捕まえる必要のあるものだけ名前との対応をつけて保存しとく、ということができるかも。その中にシリアライズ不可の情報が無ければ、それをダンプして、ちょっとコードをいじったやつに再ロードする、ということは可能かもね。

でも、ゲームイベント記述で面倒なのはどっちかっていうと、

  • アニメーションが入ることで事実上並行プログラミングになる
  • ものとものとの相互作用を記述することが多いので、メソッドをもの単位でまとめるのが難しい

あたりだと思うので、そこをどう綺麗に書けるかが気になるかも。

_maeda@電機大へお出かけ中(Tue Sep 28 10:51:21 JST 2004)

 ゲームだと、Actorみたいな並行オブジェクト記述を細かい粒度で切り替えて実行するシミュレータっぽい言語が有効かもしれませんね。ところで、ささやん、じゃなかった笹田君はアクションゲームじゃなくて「シナリオ記述言語」とか「妹記述言語」とかを考えてるんじゃないんですかね(違

_ささだ(Tue Sep 28 13:20:56 JST 2004)

 妹を記述するには、goto では大変そうです。

_26(Sun)

なんとなく綺麗.元の式わかりますか?

      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 あたりですかねぇ。

_通りすがりのもの(Sun Sep 26 11:46:50 JST 2004)
      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)));

こんな感じですかねー

_ささだ(Sun Sep 26 14:39:19 JST 2004)

 長ー。それは SUB とかを単純に置換しただけじゃ・・・。

_青木太一(Sun Sep 26 23:57:18 JST 2004)

複素数のかけ算

rho=( alph * ~alpha * delta * ~omega ) / |omega|^2 / |alpha|^2

かな。ただし、

  • rho,alph,alpha,delta,omegaが複素数
  • ~が前に付くと共役になる
  • ||で囲まれると絶対値になる

計算間違いしてそう...

_25(Sat)

もう Java は嫌だ.嫌だ.

でも,静的型システムってやっぱりいいなぁ,という部分もあります.

というか,自分の書いたソースがもう嫌だ,というところか.手元に SPARC 環境作っておけばよかった・・・ orz.

死にそう.


人様に使ってもらえるようなプログラムを作ってみたい・・・.


リモートデスクトップは楽しい。


なんとなく思いついたんですが,tail call はやっぱり stack gc で行うことにしよう.

tail call の場合,previous stack pointer を前のところに指して・・・ってやると,結局stack trace の問題になるのか.二つあればいいんか.それはそれで嫌だなぁ.


頭がふらふらする.めがしょぼしょぼする.焦点が合わない.

_arton(Sat Sep 25 21:17:32 JST 2004)

 なんか喜怒哀楽に溢れてて楽しそうな日記ですね。

_24(Fri)

嫌な夢で変な時間に目が醒めてしまった。


今日のししゃもさん。

sixamo: shugo さんは MS office みたいなもののようです.


OpenGL Features Articles and Tips

挫折気味。


フルバ15巻読了.

少女マンガだ.


Ruby Quizキター.さぁ,解こうかと思ったら,長すぎる英語にさくっと挫折 orz.


まだぜんぜん RubyConf の準備できてねー.

というか,スタックフレームの設計全部やりなおしなのにー.手がつかないー.うわー.うわー.

_shugo(Fri Sep 24 19:12:30 JST 2004)

 何だとおー

_23(Thu)

もうどうにもなくなってテストを Xeon でやることにした,やっぱ速いなぁ.


世間ではなんとかスパムで大変らしいが,うちみたいな無名で自分で作ったやつだと,そもそもそんなものが無い.マイノリティー万歳.


      SUBROUTINE SN519(IVD001,*,*)                                      00070519
      RETURN (IVD001 - 2*(IVD001/2) + 1)                                00080519
      ENTRY EN872(IVD002,*,*)                                           00090519
      RETURN (IVD002 - 3)                                               00100519
      END                                                               00110519

これどういう意味だっけ・・・.


スパゲッティ量産中・・・.どこで間違えたのかなあ.

_22(Wed)

すっかり忘れてた・・・ orz


bamboo grass.


いい具合にてんぱってきました.いや,いい具合じゃなくて・・・.

そうだよな,正直るびまの話なんかしてる暇なんかないんだよな.


ちゃんと Java の仕事やるんだったら Eclipse がさくっと動くノートPCがほしいなぁ. うちの MURAMASA さん(500Mhz, 128MB)では辛い・・・.


#!ruby -Ks # on Windows
def  
  p :ghost
end
 
#=> :ghost

最近の Ruby は,こんなことも出来る.凄いなー.(注:最近じゃなくても出来る)

_21(Tue)

とても駄目な日。駄目な週末。orz


win32ole.so を利用している人,事例紹介できる人募集中.

Rubyを業務に使ってる人,事例紹介できる人募集中.


<td><</td> をきちんとパースしてくれる(<td>&lt;</td>と書きたかった)ブラウザって凄いと思う.


OLEOLE詐欺.


IRCをしていると,時間が矢のようにすぎる.帰ってこない.


%q の後には { が人気なんだろうか.


別に、checkout してソースを見るのは怖くないことに気付いた(アホ

_20(Mon)

うひゃ、dynamic_wind やるんですか・・・。


なんとなく RDE でやってみようかなぁ、と思ったんだけど、キーバインディングにあえなく挫折。

_まつもと(Mon Sep 20 22:44:27 JST 2004)

 dynamic-windやりません。継続での脱出にensureを有効にするのはやりたいけど。

_ささだ(Tue Sep 21 01:24:44 JST 2004)

 なるほど。継続をどこまでサポートするべきなんでしょうねぇ。

_19(Sun)

まぁ,自分がやりたいことをやるのが一番ですよね.物事で一番大変なのはモチベーションの維持.


読書会だけど,SICPとRHGをやっているので,もう一個,はちと辛い.飲み会が無ければいけるか.


夢の樹を接げたなら(森岡浩之)読了.

やっぱりスパイスが・・・.途中から,オチが読めたんだが,あの読後感の悪さは・・・.


あかん,何もやる気がしない・・・.ダメすぎる・・・.

で,なんとなく profile をもうちょっとちゃんと書いてみる.


田中さんと話してたんだけど,さて「るびま」に記事を書くと,それは業績に入るんだろうか?


2号は凄いぞー。

でも、技術よりばかりになってしまいそうなんだよな。

_Goldwasser(Sun Sep 19 15:42:15 JST 2004)

 「ささだのじぁんくらんど」と改名なさって私のHPと強制リンクって云うのはありですか?

_ささだ(Sun Sep 19 16:43:21 JST 2004)

 改名って,何を改名ですか?

_MoonWolf(Sun Sep 19 19:55:03 JST 2004)

まぁ,自分がやりたいことをやるのが一番ですよね.物事で一番大変なのはモチベーションの維持.

やりたいことは別にあるんだけど、誰もやる人がいなくて、それが許せなくて仕方なく自分でやるというのはフラストラーションが溜まります。 One-Click Ruby Installer for Windowsの日本語特化バージョンはまさにそれです。

_ささだ(Sun Sep 19 20:54:08 JST 2004)

 まぁ、誰のせいにも出来ないですしねえ。だからこそ、モチベーションの維持が大変なんですが。

_しゅどう(Mon Sep 20 01:47:28 JST 2004)

 アカデミックな意味での業績にはならないわけだけど、業績リストに書くか書かないか?雑誌記事みたいなもんだと考えると、書かない?

_ogino.(Mon Sep 20 02:13:50 JST 2004)

 飲み会がなければ、のこころは時間の問題?

_ささだ(Tue Sep 21 01:24:58 JST 2004)

 時間と金と。

_18(Sat)

こんなところで書くのもなんなんですが、OpenGL でテキストを表示する簡単な方法はなんでしょうか。FreeStyle を使えば綺麗なのがぐりぐり動かせそうなんだけど、インストールとか大変そう。そもそも Ruby binding が無い。

glutStrokeCharacter が一番楽で綺麗だろうか。


バイク盗まれた orz

色々とショック・・・。

これから通学どうしよう・・・。


と思って警察署に行く前に,ちょっと近くの公園を覗いたら,あった orz.

いったいなんなんだ.

  1. 悪戯
  2. 一通り走ったので気が済んだ
  3. バイクに細工して,私を交通事故に
    1. でも,それなら元に戻しておくよなぁ

その足でセキュリティグッズを買ってきてしまった.


今日も楽しいRHG飲み会であった.

_shiro(Sat Sep 18 05:57:09 JST 2004)

 文字数が少なくて、レイアウトも簡単(等幅とか)で良ければ、全文字を書いたtextureを用意しといて、キャラクタコードからuvを計算して描画、ってのもよくやる手ですね。いろんなフォントが使いたいとか漢字も全部出なきゃいやとか、プロポーショナルフォントでレイアウトしたい、とかなら、Pangoでテクスチャに描画して張り付けるという手が使えます。

_ささだ(Sat Sep 18 13:13:00 JST 2004)

 単純なアルファベットを表示させればいいので,それが一番簡単ですかねぇ.

_あひ。る(Sun Sep 19 10:15:33 JST 2004)

 FreeType?

_17(Fri)

るびま,記事募集してます.これぞ,という方は宜しくお願いします.

ついでに,こんな記事を読みたい,というのも募集してます.


日本語の書き方を忘れてるってのは,つまり英語ばっかり書いていて大変ってことなんだろうか.


KNOPPIX って,結局なんて読むの?


svn を覚えると, cvs めんどいなぁ.


他人のバグは蜜の味.自分にかかわってる場合除く.


バックアップディレクトリが爆発してた・・・.w3ml のメールアーカイブを保存していたのが敗因.


apt-get dist-upgrade したら cgi が動かなくなった。なんでかなー、と思ったら、 mods-available/cgi.load なんてものが。


どーも realforce はキーの間がでかくて慣れない。どうしようかなぁ。


あれ、聖剣伝説のリメイクなんてあったん? 知らんかった。

_しゅどう(Fri Sep 17 14:39:20 JST 2004)

 るびまって、そんなにしょっちゅう出すんですか。がんばってください。

_ささだ(Fri Sep 17 15:11:56 JST 2004)

 来月中旬に2号の予定です.

_とくひろ(Fri Sep 17 21:46:08 JST 2004)

 KNOPPIXはクノーピクスです

_sheepman(Fri Sep 17 23:18:10 JST 2004)

 ネギまのキャラクターCDみたいですね。

_Goldwasser(Sat Sep 18 16:22:07 JST 2004)

 暗号ネタはあるんですか?フリーソフトはもう駄目なのか?!とか・・・

_ささだ(Sat Sep 18 23:16:10 JST 2004)

 暗号ネタはまだありません.ただ,るびまでやるべきかどうかはちょっと悩むところではありそうです.

_16(Thu)

どうしてもシンプルな解法が思いつかない。困ったなあ。


はじめてくずきりというのを食べた。甘い。


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飲み会,もとい読書会を農工大工学部で開きます.興味のある方はぜひ.

RHG読書会::東京 Reloaded


やっとクリプトノミコン1-4読み終わった.一ヶ月かかった.

楽しかったです.数学の話はようわからんかったけれど.


ripper,適当にアクションを溜めるなりして,pull型にしたほうが嬉しいこともあるんじゃなかろうか.そうか,それこそ cps で書いたほうが便利か.えーと,どうやって実現するんだ?


今から大岡山に行けば教えてもらえるんだろうか(ないない).


前田さんは,30歩くらい先を見ているけれど,私は足元を見るのもおぼつかない.修行が足らんなあ.

なんとなく,データ構造を考えればなんとかならないかなーとか考えてるけど,ならんかもなぁ.一個,どうしても比較が入りそう.逆に,一個の比較で済むのなら御の字?


うへ,明日も9時半?


ささだ「やることやんなきゃいけないことが全然おわんない」
家族「じゃぁさっさとやれよ」

真理だ.


とてもメールアーカイバが欲しくなってきた。個人用の。まつもとさんが作ってるやつのウェブインターフェースがあれば済むのかなあ。

_maeda(Thu Sep 16 17:20:29 JST 2004)

 いっしょにつくばへ帰ろう。

_しゅどう(Thu Sep 16 17:35:17 JST 2004)

 JVMにはメソッド内サブルーチンコール命令JSRがあるじゃん。J2SE 1.4.2からはjavacはJSR, RET命令は生成しなくなったけど。

_ささだ(Thu Sep 16 17:50:45 JST 2004)

 はい,それを念頭において書いてました.上の文章.JSRという名前が思い出せなかったんです.

_み(Thu Sep 16 20:33:30 JST 2004)

 Drとったら、つくばへ帰れるようになるといいな、と言ってみる

_ささだ(Thu Sep 16 20:49:25 JST 2004)

 Dr を remove したら,と読んでしまって.

_maeda(Thu Sep 16 23:19:45 JST 2004)

 30年くらい後ろを見ているだけかもよ。

_しゅどう(Fri Sep 17 14:40:47 JST 2004)

 こうやってmaedaさんの知見がささださんの年代に伝わっていくのはいいことですねー。僕もなんとか吸収しないと。

_kjana(Fri Sep 17 15:03:09 JST 2004)

CPS で書くより parse するスレッドが Queue に突っ込む,の方が簡単? 1 エントリの SizedQueue にすれば際限無くメモリ食ったりもしないし.

_たむら(Fri Sep 17 15:07:46 JST 2004)

 .forward で gmail/Bloglines に転送するとか>メールアーカイブ #(いるかい?gmail

_ささだ(Fri Sep 17 15:11:01 JST 2004)

 実装は簡単だけど,色々と嫌そう>SizedQueue

_ささだ(Fri Sep 17 15:11:35 JST 2004)

 gmail あるんだけど全然使ってないです.やっぱり信頼できないし.

_kjana(Sat Sep 18 01:07:29 JST 2004)

ええと、see thread.rb なんだけど、何か問題ありそうでしょうか?

_ささだ(Sat Sep 18 01:23:05 JST 2004)

 スレッドは色々といやだなぁと。

_15(Wed)

ふと、気が付いたんだけど、俺はるびまでは「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
}

まぁ、これはこういうもの、というお話でしたが。

_kjana(Wed Sep 15 15:58:06 JST 2004)

短いスペースキーがたくさん並んでるんじゃだめですか?

_shiro(Wed Sep 15 20:53:55 JST 2004)

 逆に、Procオブジェクトは無限エクステントってことにしちゃったらだめなのかしらん。もちろんProcが参照してる環境も無限エクステント。

_ささだ(Wed Sep 15 20:57:52 JST 2004)

 そうしてるんですが,微妙に気持ち悪いです>複数個のスペース

_ささだ(Wed Sep 15 20:58:45 JST 2004)

 環境はもちろんずっとひきずるんですが,継続を保存しようとすると,現在の構造だとえらいコストがかかるので,多分無理なんじゃないかと思います.

_ささだ(Wed Sep 15 21:01:18 JST 2004)

 あれ,コストは実はそんなでもないか.

_maeda(Wed Sep 15 21:41:20 JST 2004)

 Common Lispのblock〜return-from, tagbody〜goは「ensureで解決」。return-fromの相手のblockや、goの飛び先tagのextentが終了するとinvalidの印を付ける。環境からはたどれるけど、実行時にエラー。(CLtL3章の最後のとこ。)

_たかはし(Wed Sep 15 21:55:01 JST 2004)

 とりあえず私が編集長をやっている間は、最終的なGO/NOGOは私が判断して責任を負います。ので、あとはささださん(や他のみなさま)のやりたいようにやってくださいませ。>舵取り

_ささだ(Wed Sep 15 22:34:15 JST 2004)

 とりあえず名前だけ貸してください、と言った手前、いろいろと押し付けるのもあれだなぁ(もう色々と押し付けてるけど)と思ったりしますが、高橋さんをこうやってひっぱり出せてこれたのは、それはそれで成功かなぁと思ってみたり。

_ささだ(Wed Sep 15 22:37:57 JST 2004)

 「extent が終了すると」、ってのが嫌ですねぇ。動的にやるのは。

_14(Tue)

p2p のやつ行ってきた.技術的な話はあんまりなかった.残念.でも,DHTの話は知らなかったので興味深かった.キーワードだけ,聞いていたので,どんなのか気になっていたから.でも,あれがどれだけアドホックであったり耐故障性があるのかわからなかった.企業の人の話は,技術的にほとんど価値がなかったけれど,絵はやっぱり綺麗だなー,とか.

レイヤー8,9,... の話は,難しいのでよくわからなかった.結局,裁判所が判断しないと,どうにもならんのだなぁ,とか,法律の人はこういう話し方をするのだなぁ,とか,面白いプレゼンするなー,とか,そういうことがわかった.言ってること途中で矛盾してたし.いや,矛盾はしてないが,なんだなかなぁ,とか.そういえば,法律の人は,どうやってプレゼンテーションをページ送りしていたんだろう.黒子がいたんだろうか.

結局ソースを配る側はガクガクブルブルしないといけないんだなぁ.多分.

首藤さん,飲み会誘っていただいてありがとうございました m(__)m

そういえば,てつたろう先生がいらしたのにはびっくり.せっかくパパになったのに,お忙しそうで.

あんまり知ってる人は少なかった.まだまだ世界が狭い.佐々先生が途中で入ってこられて,某あれがやばいのにさぼってるのがばれた予感.うあー.


帰りに秋葉原によって realforce 91u を買った.¥18690.たけー.財布の中身と在庫がなくて,けんじんとんのトラックボールは買えなかった.


面白いのが,秋葉原行きの電車に乗っている途中,クリプトノミコン4を読んでいたら,ちょうど秋葉原に到着するあたりで,章の名前が「秋葉原」になった.笑っちゃった.こういうこともあるんだなぁ.

で,かえる電車で,次の章が「プロジェクトX」.また噴き出してしまった.狙ったのかなぁ.この名前は,戦中の暗号化音声電話システムの開発プロジェクト名と,作品内では言っていたけど.


我慢できなくて,少し使ってみた.FKB8579 とキー配列が違って(当然だ),やっぱりスゲー違和感が.まぁ,さすがにキータッチはいい.硬い FKB8579 に慣れきっているので,ちょっと辛い.

やっぱり,同じキーボードにしておくべきだったかもしれない.うーむー.2個買えちゃうんだよな.

まぁ,HHKL2よりは全然いい.

_tahara(Wed Sep 15 13:19:14 JST 2004)

 クリプトノミコン、面白いですよね。

_13(Mon)

なかなか Java脳にならない・・・.


ししゃもさんがあまりに不評なので,RSS を全部のっけることにした.content:encoded とやらに,raw text を載せるには,どうすればいいんかのぉ.


そういえば SPA2004 のことをすっかり忘れていたのだけれど,なんかアスペクトというキーワードばっかりやなぁ.発表者(ポスターだけだけど)の顔ぶれもすげぇ固まってるし.って,どの研究会もこんなもんか.ええんかなぁ,これで.


そういえば、長かった歯医者通いも今日で最後だった。でも、まだ痛い・・・。どうしようかな。

_しゅどう(Tue Sep 14 01:51:31 JST 2004)

 たしかにSPAって、固定メンバ以外が流入するきっかけが、いまひとつ少ない気もします。って、別にSPAだけの話じゃないか。

_12(Sun)

蟹を食った。もう当分蟹はいいなあ。


最近キーボードを探してけっこういろんな店舗、いくつかの街を探してるけれど、全然置いていない。

さっさと秋葉原に行くのが近道だったっぽい。火曜日の帰りにでも行こう。

RealForce 91U を試してみようかと思う。HHKPでもいいんだけど、カーソルキーが。RealForce 91U は、日本語配列なのがうざいんだけど、まぁその辺は変更可能だし。


誰か KENSINGTON Expert Mouse (Optical Black) 国内版 使ってる人居ませんかね。使用感などを知りたいんですが。というか、どう使うのかわからない。


予備の HHKL2 を使ってるんですが、非常に使いづらい・・・。指が痛い。

_11(Sat)

高尾山口駅の「トリックアートミュージアム」というところに行って来ました。大変面白い。

プログラミングで、同じようなことはできないだろうか。


「るびま」に期待するものが、人によって色々あるらしい。そりゃそうだけど。

どうやって、その辺を調整していけばいいんだろうか。

_arton(Sat Sep 11 19:59:01 JST 2004)

 遅れましたが、お疲れ様でした。それにつけても探訪記(訪問記とあえて言わなかったり)おもしろかったです。

_ささだ(Sat Sep 11 21:52:33 JST 2004)

 ありがとうございます。そう言って頂けると報われます。

_sheepman(Sun Sep 12 00:11:21 JST 2004)

 http://www.atdot.net/yarv/ で Download tarball がエラーになってます。

_ささだ(Sun Sep 12 22:00:29 JST 2004)

 tarball 機能は停止させてました。消すの忘れてました。

_10(Fri)

Rubyist Magazine 創刊号をリリースしました。

お楽しみください。

協力してくださった方、本当に、本当にありがとうございました。これからもよろしくお願いします。


三十三間堂にいって、湯葉を食べて、清水寺に行った。

昼飯は奮発。

清水寺は、人気のないような山奥に踏み込んでみた。また山登り。


るびまFAQ.

  • Q. るびま、って「ネギま!」のぱくりですか?
  • A. 違います。多分。少なくとも私は全然気付かなかった。
  • Q. 日本Rubyの会って、るびまを発行することを目的とする団体ですか?
  • A. 違います。るびまは、日本Rubyの会の活動の一環として日本Rubyの会有志によって編集作業が行われています。
  • Q. 日本Rubyの会発足とるびま発行は同時なの?(CNETの記事より)
  • A. 違います。発足は 2004 8/8, 発行は 2004 9/10 です。
  • Q. るびまに〜〜の記事がないのは何故? やる気あんの?
  • A. 基本的に書いてくれる人任せです。書いてくれる人を探すことはしますが、無報酬でどこまで引き受けてくれるのか、という問題があります。
  • Q. 巻頭言が難しいんだけど
  • A. 全部ネタです。編集長の仕事のほぼすべてが注がれています。
  • Q. インタビューは全部ささだがやるのか?
  • A. 私はそんなつもりはないんですが。やらせてもらえると嬉しいなあとは思います。ちなみに、編集は膨大な労力をかけて「他の方に」やってもらいました。本当に、多謝。
  • Q. 何が嬉しくてやってんの?
  • A. 記事とか誉められたりするととても嬉しいです。私は。「あぁ、こんなのがあるんだ。いいね」って思ってもらえると、凄く嬉しい。ああ、こう書くと、誉められるのがうれしいって読めるな。こういう形のあるものが残せるって、嬉しいです。私は。
  • Q. 創刊号はなんと eval.c が付いてきます。全部集めると(略)
  • A. 飲み会ネタとして、もう飽きました。

やっぱり、って部分はあるんですが、過大な期待をもっちゃう人が居るんだよね。無報酬でいろいろやってるってのを考慮してもらえるといいと思うんですが。

でも、おおむね否定的な意見がなくて、嬉しい限りでございます。


編集長をお願いしたのは正解だった。うん。

_9(Thu)

立命館大学でけー。

_8(Wed)

数百通のメールを見直す。

list の動的なクラス名、のやつで爆笑。みんなダイナミックプログラミング大好きなんだなあ。


ひさびさのししゃもさん

sixamo: 何を食ったかもう憶えてないようだったら Rubyちゃんよりは敷居は低いと思われます

なんとなくですが、敷居が高いような気がします。


Rubyist Magazine 準備中です.いろんな人がすげーがんばってくれてます.すげー迷惑かけちゃった.でも,それだけいいものが出来てきていると思います.お楽しみに.


読んだ本

  • マルドゥック・スクランブル 1-3
  • クリプトノミコン 1-3
  • グインサーガ89(あとちょっと)

がんばってクリプトノミコン 4 を読もう.

マルドゥック・スクランブルは,期待しすぎて期待はずれ.面白かったのだけれど.

_7(Tue)

帰宅。

retry, redo, next, break, return の大域ジャンプ系ほぼ終了。

_4(Sat)

今日は愛知。


いろいろと間に合いそうにないので、るびまの記事の編集作業を行う。16分のテープ起こしに凄い時間をかけてしまった。

というわけで、すでに眠れそうにない。7時に家出ないと間に合わない。

_3(Fri)

昨夜は飲みすぎ。


やっと例外サポート。

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 にアクセスできないので。パッチを入れると面倒くさいのでいやだったのだけれど。

面倒くさいと、ちょっと試そう、というユーザが居なくなる。

でも、誰も使わないので問題ないという罠。われながら、悲しい話ではある。

_2(Thu)

うわーん4時じゃよー.あと5時間で出発ー.これから家に帰って,何時間眠れるんだ.というか,起きられるのか俺.


2時間眠れた。

なんかとても IP unreachable になりそうなので、携帯でネットを使うためのケーブルをいまさら用意しようと思ったんだけれど、ずいぶんと高そう・・・。どうしたもんだか。

@nifty:「@niftyアクセスナンバー」の変更方法について こんなのがあったのか。これ使うのがいいのかなぁ。ppp接続設定ってどうやるのかなぁ。windowsでやったことがない。


発表終わり。疲れた。発表は十分準備しないと駄目駄目だね。


やはり一日中聞いてると疲れすぎ・・・。寝てないしなあ。

_n(Thu Sep 02 12:39:33 JST 2004)

 「じゃよー」ってモテ王ですか?気になって終業まで眠れません。

_Goldwasser(Thu Sep 02 20:48:55 JST 2004)

だから私を見て! http://sgldwssr.hp.infoseek.co.jp/otp.html

_1(Wed)

  • 一日目:NaClでインタビューして肉
  • 二日目:松江城行って、マクドナルドで例外を実装

何しにいったんだ、俺は。

松江城の一番上は、大変気持ちがよかった。無駄に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分でやっていくそうです.なにか,質問などあればつっこみに書いておいてくれれば,聞いておきます.というわけで,何かありますか?


猫(松江在住) 猫の写真を貼るとアクセスが増えるそうなので実験してみる.松江猫.お稲荷様のところに居た.

そういえば,稲荷神社のまわりをあるいているとき,妙に鼻の長い犬みたいななにかが目の前を通り過ぎていた気がするんだけど・・・.犬だよねぇ.まさかねぇ.

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