K.Sasada's Home Page

Diary - 2004 May

研究日記

皐月

_31(Mon)

しまった、寝坊した・・・。


B1でいきなりCによるscheme処理系実装は・・・。SICP 読ませたほうが。


あらし対策がますます困難に・・・ならない?


JavaScript:
  var d=(document.title =="")?location:document.title;
  var v="[[" + d + "|" + location.href + "]]";
  prompt("link and title", v);eval();

こうやって書くのかー。


stable用subversion debの位置が変わっていた。


RubyのC関数に、もうちょっと情報が加わるといい感じにならないかなぁと考えてみる。うーん、無理かなあ。


マニア失格・・・。愛が無いよなあ。


そういえば、common lisp は顧問の人が作ったから common lisp らしい。

で、次は所長Lispらしい。


携帯を買いに行ったらシステムがダウンしてるから買えないー、とか言ってた。そんなに簡単に逝っていいのか>ぼーだーふぉん

店員が、「今一生懸命直してる(はず)」、「後で電話するから来い」などと言っていた。一生懸命なおすのはあたりまえ。後から来いっていうのも横柄(口調が)。

なんというか、勝ち組はいいよな。指摘しようかと思ったけど、面倒なんでやめ。

_こーのいけ(Wed Jun 02 01:11:25 JST 2004)

 ん? 15:20以降? だとすると・・・

_30(Sun)

えーと、今日も疲れた。今月飲みすぎ。死ぬ。


nadokaさんのbotは load しています。plugin の意味的に require は無いような気がします。二度と読まないならいいけど。


東大のあのキャンバスははじめて行きました。あー、これがあの有名なー、とか見ながら、しかも学祭だったみたいですげえ大賑わい。

不思議な縁でビデオの手伝いをしました。

話の内容は、、、楽しかったってことで。

一次会で飲みすぎた。二次会が辛かった・・・。なんかえらい話を聞いた気がするけど、忘れた(ことにしておこう)。

幸い、二日酔いにはなってない。

知った顔が多かった。


T565 に縦じまが映るようになってしまった。そろそろ買い換え時期なのかなぁ。まだ3年目だったような気がするが。

T766 にでも買い換えようかと思ったけど、値段も大きさもでかい・・・。


うあ・・・。ディスプレイの下に置いているTVの電源を付けっぱなしにしていたというオチだった。まぁ、買い換える金もないし、よかったよかった。


インクリメンタルサーチって使いこなせないんだよなぁ。あるとやっぱり幸せなんだろうか。

_29(Sat)

帰宅した。

眠る。


   ∩___∩
   | ノ   ヽ
  /  ●  ● |   「クマー」
  |   ( _●_) ミ
 彡、   |∪|  `\
/ __   ヽノ /´> )
(___)   /  (_/
 |       /
 |  /\ \
 | /   ) )
 ∪    (  \
       \_)

クマー将棋の話を聞くことができたのでよかったです。


聞いた発表の感想を全部書いておこうかと思ったんだけど、面倒すぎなんでやめ。というか、あまり覚えていない。

ラーメン/1日。でも、最終日はカレー。北海道でカレーを頼むとスープカレーになるんだと思っていたんだけど、そうでもなかった。


VTune 学割が効くと安い、と聞いたような気がするので調べてみた。10万円が3.5万円らしい。これなら買えるなぁ。買うか・・・。使いこなせないような気がとてもするが。


大山さんにSurvey Indexを教えてもらう。

理想に近いが、ちょっとがちがち感漂う。もう少し柔軟性を。たとえば、カテゴリの階層構造が作れないとか。いや、だからこそいい、という主張はあるとは思いますが。


そういえば、研究のページ作ってないなあ、と思う。まずいなぁ。


へぇ。 Linux Conference 2004はビックサイトなんですか。

なんか、とても堅そうで、本当に学会の研究会みたいな感じですね。面白いと思うけど、人集まるのかな。

というか、OS研でこういうのやればいいのに・・・。


TOMOYO Linux ですか・・・。うーん・・・。

TMY部長先生はこれに移るんだろうか。移らなかったら嘘だよな。


アクセス制御を正しく設定するのは非常に難しく、コストがかかる作業である。そのため、なるべく安全側に倒した、それでいて使いやすい設定をデフォルトにすることが重要である。

で、たいていのユーザは多分設定を変えないので、そこでセキュリティ管理機能がある意味はなんだろう、とかちょっと思う。


なんとなく、書いておかないとラーメン食べに行ったと思われてしまいそうなので、一応。聞いたやつだけね。予稿集はあんまり見てない。


■ディペンダブル・コンピューティングへの期待と課題 −安心・安全な社会の実現に向けて−

南谷 崇 (東大)

DCとは何かの解説っぽく。だからどうするって話は無かったように思う。

■ソフトウェア分散共有メモリを用いたマクロデータフロー処理

田邊 浩志, 本多 弘樹, 弓場 敏嗣(電通大)

DSMをやるのに都合がいいように、ちょいちょいと弄ろうって話。

■自動チューニング処理記述用ディレクティブABCLibScriptの設計と実装

片桐 孝洋, 吉瀬 謙二(電通大/JST), 本多 弘樹, 弓場 敏嗣(電通大)

チューニング処理というよりは、チューニングコード生成コード生成ディレクティブなんじゃないかと思う。経験を取り入れるためにディレクティブ、まぁまっとうかもしれないけど、うーん。

■入れ子関数を利用する動的負荷分散と高水準記述

八杉 昌宏(京大), 小宮 常康(豊橋技科大), 湯淺 太一(京大)

gcc 入れ子関数を利用した負荷分散。やっぱり、入れ子関数にこだわる理由がよくわからない。入れ子関数なら出来ることはわかるんだが・・・。

■差分ベースのバイトコード変換と命令再定義機構

泉 勝, 神前 宏樹, 鎌田 十三郎(神戸大)

Javaバイトコード変換系として、もっと書きやすく、チェックの厳しいものを作りましょうって話。

やっぱりチェックはJavaVM verifierに任せればいいと思う。

もっと抽象度の高い記述ができる必要があるんじゃないかと思うんだが。

■J2EE最新情報

丸山 不二夫(稚内北星大)

きりたんぽご馳走様でした。

J2EE 自体は、マーケティング用語ばかりでアレなきがする。

■大規模データセットを可視化するための効率のよい並列ボリュームレンダリング 【最優秀論文賞】

松井 学, 伊野 文彦, 萩原 兼一(阪大)

よくわかんなかったけど、やっぱりアプリケーションの開発って楽しそうだよなあ。

■インクリメンタルPageRankによる重要Webページの効率的な収集戦略

山田 雅信, 田浦 健次朗, 近山 隆, 高橋 俊行(東大)

今回のSACSISは、質問しようかと思っていたのはほかの人が質問するとか、時間切れとか、そんな感じだった。この発表も、更新にはどう対応するか、って質問をほかの人に言われた。悲しいかなアルバイト。

で、その更新に関する話は無かったので、実際どうするんだろうな。更新頻度とインクリメンタルなページランクをあわせたスコアでソートしてやっていくって感じなんだろう。どの程度の負荷になるかは知らんが。

■Cache Coherence Strategies for Speculative Multithreading CMPs: Characterization and Performance Study

Barli Niko Demus, Hung Luong Dinh, Miura Hideyuki, Iwama Chitaka, Tashiro Daisuke, Sakai Shuichi, Tanaka Hidehiko(東大)

CMPで各コアがキャッシュをそれぞれ持っている場合、投機スレッドを走らせるとそのキャッシュのコヒーレント制御が問題になるかもね。じゃぁどんな一貫性制御プロトコルが有効なんだろうねってのを評価したって話。

投機なら共有キャッシュにすりゃえーやんって聞いたんだけど、それだとL1までの距離が長くなっちゃって遅くなるって言われた。


ポスター。眺めただけのもある。

■SimCore/Alpha Functional Simulatorの設計

吉瀬 謙二,片桐 孝洋(電通大/JST),本多 弘樹,弓場 敏嗣(電通大)

SimpleScalar のコードはぐちゃぐちゃらしい。

■ファイル細分とノード集合化概念を用いたP2Pファイル転送手法の提案

湯澤 孝有,服部 晃和,横田 隆史,大津 金光,馬場 敬信 (宇都宮大学工学部情報工学科) bDais:DIMMnet-1/InfiniBand間ルータの開発

なくなる危険性はって聞いたら、あるっていわれた。いいのかそれで。

■タスク並列スクリプト言語MegaScriptによるタスクモデルの記述方法

湯山 紘史,大塚 保紀,西里 一史(豊橋技術科学大学), 大野 和彦(三重大学),中島 浩(豊橋技術科学大学)

どのへんがMegaなのかわからないって言っておいた。Rubyっぽい文法。

■Ruby仮想マシンにおけるスキャナジェネレータの実装

木山 真人,芦原 評,梅野 英典(熊本大学)

タイトルと発表者名が無かった。

えーと、えーと。略。

■フロントエンド実行

小西 将人(大阪工業大学),五島 正裕,中島 康彦,森 眞一郎, 富田 眞治(京都大学)

やっぱり、タイトル短すぎじゃないっすかねぇ。パイプラインステージの前部分でも演算を行おうって話。

■キャッシュフラッシュの最悪タイミングの探索手法

宮本 寛史(名古屋大学),飯山 真一(豊橋技術科学大学), 冨山 宏之,高田 広章(名古屋大学),中島 浩(豊橋技術科学大学)

キャッシュミスを考慮した場合の最悪レスポンスタイムの測定方式らしい。よく見ていない。

■SIMDベンチマークの設計

室田 朋樹(東京大学),鈴木 貢,渡邊 坦(電気通信大学)

結局なかなか難しそうだ。

■ポータビリティの高いジョブスケジューリングシステムの実装

町田 悠哉(東工大),中田 秀基(産総研),松岡 聡(東工大)

微妙。


■発行時間差に基づいた命令ステアリング方式

服部 直也, 高田 正法, 岡部 淳, 入江 英嗣, 坂井 修一, 田中 英彦(東大)

クラスタ型プロセッサってのをはじめて知った。

■クラスタ型プロセッサのための分散投機メモリフォワーディング

入江 英嗣, 服部 直也, 高田 正法, 坂井 修一, 田中 英彦(東大)

どれくらいの容量増加かちょっと気になる。

■クリティカリティ予測のためのスラック予測

劉 小路, 小西 将人, 五島 正裕, 中島 康彦, 森 眞一郎, 富田 眞治(京大)

スラックというのもはじめて知った。既存手法との違いが聞きたかった。

■バッファ・オーバフロー・アタックを動的に検出するセキュア・キャッシュ ―安全性と消費エネルギーのトレードオフ―

井上 弘士(福岡大/JST)

オペレーティングシステムのセッションは、ぜんぜんOSじゃなかった。

突込みどころ多すぎなので略。

■クラスタ型NASシステム向きディスク使用量制限機能の提案と評価

保田 淑子, 沖津 潤, 川本 真一, 江端 淳, 樋口 達雄(日立)

分散型って言っている提案手法は、クオタ情報を集中管理しているだけだと思うので、分散じゃないと思う。ちょっと比較対象が・・・。まぁ、今まで無かったのならしょうがないか。

■iSCSIターゲットソフトウェアの解析

藤田 智成, 小河原 成哲(NTT)

へぇ〜って感じ。そもそもSCSIインターフェースになっているのはなんでだろう。

■要求駆動型XML計算環境Nanafusiの実装と評価

新村 健治, 山中 真和, 鎌田 十三郎(神戸大)

Haskell でやれば何も考えなくてもいいような気がしたんだが、やっぱり Java がすきなんだろうか。

■BlueGene/L Supercomputer

George Chiu (IBM BlueGene/L)

うう、ぜんぜんわかんなかった。というわけで、途中で抜けて電車男を読んでいた。

■動的アクセスパターン解析によるソフトウェア分散共有メモリ

松葉 浩也, 石川 裕(東大)

あまり聞いてなかった。電車男(略)。

■MPI通信モデルに適した非同期通信機構の設計と実装

松田 元彦(産総研), 石川 裕(東大), 工藤 知宏, 手塚 宏史(産総研)

selectとかその辺。

■PM/InfiniBand-FJ: InfiniBandを用いた大規模PCクラスタ向け高性能通信機構の設計

住元 真司, 成瀬 彰, 久門 耕一(富士通研), 細江 広治, 清水 俊幸(富士通)

盛りだくさん。企業はやっぱすげーなぁと思わせる。

■RHiNET-2クラスタを用いたシステムエリアネットワーク向けトポロジの実機評価

鯉渕 道紘, 渡邊 幸之介, 大塚 智宏, 天野 英晴(慶大)

結局、ノード数が足りないのであんまりアレって感じになるんだろうか。


もちろん、私の勝手な感想なんで、無保証です。保証されてもアレですか。

こういうのを書いても自分も含めて誰も読まないんだよな。どうするのがいいんだろう。


Object#sendObject#__send__ という解決策はあるわけだけど、Foo#sendBar#send は名前で区別するのに簡単な方法は無い。

名前は 8文字以上とか2 word以上とか、そういう縛りのある言語が・・・。使いづら。


というわけで、東大出発。

_maeda(Sat May 29 02:44:45 JST 2004)

 結局くまを買ったのでしょうか。

_murota(Sun May 30 22:02:47 JST 2004)

 電車男いいですね

_28(Fri)

irc無し記録更新中。

ああ、メール見るのが怖い。

今日の夜中に帰宅予定。

_27(Thu)

メール/irc の無い日々。


禁断症状が・・・。

_26(Wed)

ネットワークの設置。

http を proxy 経由で繋がる。他は繋がらない。

・・・それでどうしろと。

せめて ssh が通れば・・・。


というわけで、メールとか読めません。

irc ができないのが大変まずい。

なんかあればここにかいといてください。

いや、メールは atdot あてなら読めないこともないんだけど。

80番でほげほげする何かを用意しとくんだったなあ。

_25(Tue)

また日が変わってしまった。


意外と8ページは少ない。


今夜から北海道行ってきます。北海道は寒いですか?


YARV: Yet Another Ruby VM

ウェブページ移転。page rank向上にご協力を ^^;


北海道では ip unreachable かもしれないので、色々やっておく。うう、大変。


今回は OOo を使ってみた。結構いいかも。MS Word の使い方もよく知らない人間が言うのもあれですが。


では、ごきげんよう。

_24(Mon)

結論:原作を知らないと、見てもなんだかわからない。


なんとなく、本つながりでココ(略)。


将来のソフトウェア技術について思うことねぇ。うーん。


ししゃもさん(nadokaさんのbotとして利用)は、荒らし対策になっているらしい。


そうか、研いだ対象>できたソース、か。

その頭の中は教えてくれないわけだ。

_23(Sun)

MLの名前と番号を入れるとそのアーカイブへリダイレクトする何かを作る。

こういうのって、別にリンクを生成するだけだから、特に法律的にも倫理的にも問題ないよな。

誰も使わないだろうけど、私が使う(使ってもらって、私が恩恵を得る)のでよしとする。

というか、IRC biff は私には便利杉なんですが、鬱陶しいですか。そうですか。(#nadoka_check にて)


nel さんとIRCで話してて思ったんだけど、persistent oodb をトップレベルの環境にしてscheme処理系を再実装すれば、分散scheme処理系は出来たりする?

I/Oとか継続まわりは全部GORBで、持ち主にやってもらったりとか。それとも、I/Oはセマンティックスを全部考え直して、そういうのを気にしないで済むようにしたり。それこそ分散ファイルシステム上でしかどうの、とか。

まぁ、誰かがやってんだろうけど。


ふと、google で、gauche のリファレンスのある1項目を検索してみる。

ページを開くと、ぜんぜん違うトピックが開かれる。うーん、なぜ?

と思ったら、そうか texinfo をhtml にコンパイルすると、ページ名(ファイル名)がコロコロ変わるんだね。


 --enable-threads じゃなくて --enable-thread にしてはまった。


最初、enalbe-threads にしないでコンパイルして、ああやっちまったと思って、指定してやったら、リンクエラー。

なんでかな、と思ったら boehm gc が pthread っぽくコンパイルされてなかった(のだと思う)。distclean して、やりなおして、解決。


nel さんはPDPTAでお会いしていたらしい。なんとまぁ狭い世の中。


R.O.D のDVDを見る。こういう話だったのか。文章でどうやって書くんだろう。

_shiro(Sun May 23 16:40:31 JST 2004)

 何を分散させたいかによって話がだいぶ違って来るような。でも何でpersistent db? 分散と永続は似てるようで違うから、目的を考えないと。(例:オープンされているネットワークストリームは分散環境で共有できるけど、永続ストレージに入れるわけにはいかないとか)。Lindaみたいなモデルならそのへんは抽象化されてるけど、話のレイヤが違うような。

_ささだ(Sun May 23 17:27:04 JST 2004)

 う、persistent db は関係なかったです。分散ストレージをトップレベルの環境に、とか考えてました。Linda ってLindaを引用してるもの(drb とか)しか見たことないのですよね。

_kjana(Mon May 24 00:27:11 JST 2004)

Kali なんぞはどうだろうとちょっと思った。 分散 scheme っていうキーワードで思い出しただけなんで、あんまり関係無いかな?

_22(Sat)

で、なんでわざわざYahooMessenger なんて入れたかっていうと、読書会中継に使えないかなあ、ということで。

明日の SICP読書会は中継してみようかと思います。興味のある方は Windows と YahooMessenger を用意してくださいませ。



require 'yarvcore'
require 'tempfile'

module YARVUtil
  
  def self.eval prog, file='<*YARV eval*>', line=1
eval_in_wrap(<<__EOMP__)
YARVCore.eval(<<'__EOP__', '#{file}', #{line})
#{prog}
__EOP__
__EOMP__
  end

  def self.parse prog, file='<*YARV parse*>', line=1
eval_in_wrap(<<__EOMP__)
YARVCore.parse(<<'__EOP__', '#{file}', #{line})
#{prog}
__EOP__
__EOMP__
  end

  def self.load file
prog = File.read(file)
eval_in_wrap(<<__EOMP__)
YARVCore.eval(<<'__EOP__', '#{file}', 1)
#{prog}
__EOP__
__EOMP__
  end

  def self.ruby_version
    "ruby #{RUBY_VERSION} #{RUBY_PLATFORM}(#{RUBY_RELEASE_DATE})"
  end

  def self.eval_in_wrap prog, fname='*eval*', line=1
    t = Tempfile.new('eval-in-rwap-')
t.write(<<__EOS__EIW__)
$ans = eval(<<'__EOP__EIW__', TOPLEVEL_BINDING, #{fname.inspect}, #{line})
#{prog}
__EOP__EIW__
__EOS__EIW__
     t.close
     Kernel.load(t.path, true)
     $ans
  end
end

なんか醜悪。

やっぱ eval in wrap ほしいなあ。


class C
  class D
    E = 10
  end
end

c = C

def m
  C
end

p(  (p(1); C)::D::E  )
p(  (p(1); m())::D::E  )
(p(1); m())::D::E = 100

どうやればいいんだこんなの。うーん。


class C
end

c = C

def m
  p 1
  C
end

class m()::D
  def m
    p('c::D')
  end
end

c::D.new.m

なんてことだ。って前も見たから今試せるんだけど。

どうしたもんかな。そもそもこんなことする人いるのかな。

ちなみに、class (...)::X は文法エラー。中途半端な気がする。

p begin
  class C
    D = 10
  end
  C
end::D

class Class.new::D
  p self
end

こんなふうに使うのかな。いや、使い道は思いつきませんが。

誰か使い道教えてください。


もう ID のリストだけにしてしまうか。

多分これで困る人は、あんまり居ないんじゃないかと期待。


nd_vid の v ってなんだろう。


SICP読書会から帰宅。今日は2点あたらしいことを。

  • ウェブカメラで中継
  • 宴会はジョナサン

前者はそれなりに雰囲気は伝わったらしく。でも音はきちんと送れなかったっぽい。これは、フリーハンドモードという、一定の閾値以上の音量の場合は勝手に音を送るYahooMessenger の機能が、その閾値をあまり小さくできず、はっきりした声でしゃべらないと音が通じないため。だから、音の配信はほかのソフトで行う、という手もある。

ジョナサンにして、2000円で済んだ。でも、酒があまり入らないので盛り上がりがいまいちだった、ということもあるかも。

_nobsun(Sat May 22 13:14:19 JST 2004)

 SICP 今日(5/22)

_arton(Sat May 22 16:45:56 JST 2004)

 Variable's IDでは?

_ささだ(Sat May 22 17:25:37 JST 2004)

 うわあ、なんで気づかないんだ俺。

_21(Fri)

うう・・・。


わ、何これ。

ruby-talk:100922 より引用

Code in C++
Initial target only win32
will have initially only interpreter but will include JIT compiler by
version 1.0 release. might as well have Ahead of Time compiler.
Will share bytecodes with java as much as possible.
will be using subversion

うーむ、負けてられない。

でも、JIT compile なんて本当にできるんだろうか。


そういえば、何か名前をつけるとき、まずは Google でひいてみませんか? 私は思いついたらすぐにひくけど。


ruby-talk なら JIT compiler の話をふっても大丈夫だろうと思ってたら駄目だったっぽい。


どこかにプロセッサの専門家いないですかね。

分岐予測が外れたとき、そいつは 10サイクルかかる1命令の、1サイクル目を実行していたとする。さて、このとき残りの9サイクルはスキップされるのか。

うーん、どうなんだろう。


ワシントンD.C. に行きたい行きたい。


困ったな、Kernel.load って値を返さないのか。load('...', true) 相当をやりたいんだけど、返り値もほしい。どうしたもんか。

やっぱり、eval_in_wrap がほしい。


んー。load(ファイル("$ans = eval(%Q{#{program}})"), true) ってやれば、$ans ってグローバル変数経由で値は取れるか。

ずいぶんと遠いなぁ。

  def self.eval_in_wrap prog
    t = Tempfile.new('eval-in-rwap-')
t.write(<<EOP)
$ans = eval(<<__EOP__)
#{prog}
__EOP__
EOP
     t.close
     Kernel.load(t.path, true)
     $ans
  end

もっとおしゃれにならないかしらん。


libjit を教えてもらったけど、例えば elf に限定して、動的に部分部分を切り貼りしてリンクするようなものってのもありかもしれないね。

Cのコード片をエントリポイントもって、きりはり。


で、コード片ってelfなどに登録できるのかしらん。


Yahoo Messanger に登録してみました。ko1_ssd ってidなんですが、よかったらなんか遊んでください。よくわからないんだけど。

ウェブカメラがさくっと使えてびっくり。いい時代になったもんだ。

_maeda(Fri May 21 19:55:55 JST 2004)

 プロセッサの専門家…君は違うのかね。

_なかだ(Fri May 21 20:13:52 JST 2004)

 rbjitってのがあるんですけどねー。1.4あたりにしか対応してない。

_ささだ(Fri May 21 20:25:43 JST 2004)

 私はあくまでユーザですよ>プロセッサ

_ささだ(Fri May 21 20:30:48 JST 2004)

 rbjit は昔見た記憶があったんですが、今見直してやっとわかりました。rb2c で生成されるやつを動的にやったって感じですかね。

_20(Thu)

# from http://www.bagley.org/~doug/shootout/bench/random/random.ruby

IM = 139968
IA = 3877
IC = 29573

$last = 42.0

def gen_random(max)
  (max * ($last = ($last * IA + IC) % IM)) / IM
end

N = 1000000

i=0
while i<N
  i+=1
  gen_random(100.0)
end
"%.9f\n" % gen_random(100.0)

--
      user     system      total        real
ruby  7.500000   0.000000   7.500000 ( 15.078000)
yarv  8.922000   0.000000   8.922000 ( 17.938000)

ガガーン。遅くなってしまった。なんでだろう・・・。

== disasm: <ISeq:gen_random@../test.rb>=======
local scope table(size: 3)
[ 3] max      [ 2] $_       [ 1] $~
This ISeq is method, and has 1 arg: max
0000 putliteral      nil
0002 getconstant     :IM
0004 putliteral      nil
0006 getconstant     :IM
0008 putliteral      nil
0010 getconstant     :IC
0012 putliteral      nil
0014 getconstant     :IA
0016 getglobal       $last
0018 send            :*, 1, false, 0, 0
0024 send            :+, 1, false, 0, 0
0030 send            :%, 1, false, 0, 0
0036 dup
0037 setglobal       $last
0039 getlocal        3
0041 send            :*, 1, false, 0, 0
0047 send            :/, 1, false, 0, 0
0053 end             6

この命令セットが駄目っぽいか。


参考:

10000000.times{

}
--
      user     system      total        real
ruby  1.938000   0.000000   1.938000 (  1.937000)
-----------------------------------------------------------
i = 0
while(i<10000000)
  i+=1
end
--
      user     system      total        real
ruby  8.329000   0.000000   8.329000 (  8.329000)
yarv  4.765000   0.000000   4.765000 (  4.765000)

はやくブロックをサポートしないと・・・。


そういえば yarv のページを作ってなかった。


あかん、nadoka が停滞している。

なんとかしてやりたいんだが。


  void test(){
    System.out.println("pre1");
    try{
      System.out.println("try1");
      try{
        System.out.println("try2");
      }
      catch(Exception e){
        System.out.println("cache1");
      }
    }
    catch(Exception e){
      System.out.println("cache2");
    }
    System.out.println("post1");
  }

となっていた場合、ExceptionTable はどうなるのかなー、と思ったら、こうなった。

   from   to  target type
    16    24    27   java/lang/Exception
     8    36    39   java/lang/Exception

考えてみたらあたりまえで、つまり、内側のほうを前に持ってくれば問題ない、ということになる。基本的にツリーなので、葉の部分を先に持ってくるってことか。なるほど。

ということは。テーブルをどこまで見たかってのも、きちんと保存してException Handling書かないとまずいよねぇ。しまったなぁ、そこまでは rava のとき考えていなかった。

とりあえず、Ruby でこれでどこまで書けるかやってみようかなぁ。

それぞれの try/catch に finally をくっつけたらこうなった。

  void test(){
    System.out.println("pre1");
    try{
      System.out.println("try1");
      try{
        System.out.println("try2");
      }
      catch(Exception e){
        System.out.println("cache1");
      }
      finally{
        System.out.println("f1");
      }
    }
    catch(Exception e){
      System.out.println("cache2");
    }
    finally{
      System.out.println("f2");
    }
    System.out.println("post1");
  }
#=>
   from   to  target type
    16    24    35   java/lang/Exception
    16    24    55   
    35    44    55   
    55    56    55   
     8    66    77   java/lang/Exception
     8    66    97   
    77    86    97   
    97    98    97   

むむむ。なんじゃこりゃ。

って、javap でも Exception Table 見れたのか(ravaのモジュールで見てた)。もうすっかり忘れてるなあ。


あぁ、有料でも入っちゃうかも>blade farm

そういえば、最近ゲームやってないなあ。あれぐらい熱いゲームがまたやりたいなあ。今は蔵などなんでしょうか。よく知りませんが。ご趣味は? 蔵などを少々、とか、なんとか。


どうやら命令セット云々よりも、浮動小数点演算が混ざると駄目駄目っぽい。うーん。なぜだ。

遅くなって、素rubyとの速度差が縮まるのはわかるんだけど、素rubyより遅くなるのがわからん。


もっと複雑な条件だった。

メソッド呼び出し(関数呼び出し)じゃなくすと、速くなる。メソッド呼び出しにすると遅くなる。何もしないメソッド呼び出しでは早くなる。

整数でメソッド呼び出しにすると速くなる。


さっぱりわからない、謎なので(キャッシュミスとか、その辺まで落ちちゃうのかなあ)、忘れることにする。


PTT飲み会申し込みを忘れていた。残念。今回はあきらめるか。


socket read timeout (60 sec)
/usr/local/lib/ruby/1.9/net/protocol.rb:133:in `rbuf_fill'
/usr/local/lib/ruby/1.9/net/protocol.rb:86:in `read'
/usr/local/lib/ruby/1.9/net/http.rb:2030:in `read_body_0'
/usr/local/lib/ruby/1.9/net/http.rb:1991:in `read_body'
/usr/local/lib/ruby/1.9/open-uri.rb:554:in `proxy_open'
/usr/local/lib/ruby/1.9/open-uri.rb:545:in `request'
/usr/local/lib/ruby/1.9/net/http.rb:930:in `reading_body'
/usr/local/lib/ruby/1.9/net/http.rb:930:in `request'
/usr/local/lib/ruby/1.9/net/http.rb:828:in `request_get'
/usr/local/lib/ruby/1.9/open-uri.rb:545:in `proxy_open'
/usr/local/lib/ruby/1.9/open-uri.rb:544:in `start'
/usr/local/lib/ruby/1.9/net/http.rb:328:in `start'
/usr/local/lib/ruby/1.9/open-uri.rb:544:in `proxy_open'
/usr/local/lib/ruby/1.9/open-uri.rb:525:in `direct_open'
/usr/local/lib/ruby/1.9/open-uri.rb:169:in `open_loop'
/usr/local/lib/ruby/1.9/open-uri.rb:164:in `catch'
/usr/local/lib/ruby/1.9/open-uri.rb:164:in `open_loop'
/usr/local/lib/ruby/1.9/open-uri.rb:134:in `open_uri'
/usr/local/lib/ruby/1.9/open-uri.rb:424:in `open'
/usr/local/lib/ruby/1.9/open-uri.rb:81:in `open'
./rss_check.rb:90:in `mtime'
./rss_check.rb:33:in `check'
./rss_check.rb:136:in `check'
./rss_check.rb:135:in `map'
./rss_check.rb:135:in `check'

こんなエラーが出てた。


などかさんをなんとかしようと思って日本語ドキュメントNadoka: IRC Client Server Programを書いてみる。

眠かったので、面白くない。眠くなければ面白いかは謎。


パラーメタって何だ>俺。


今回の投票(Ruby: recv.m(a1, a2, ..., &block) の評価順序が a1, a2, ..., recv, block という順序になって許せるか?)は、左から右へ、の原則が嫌だ、というわけではもちろん無くて、「仕様を無視してでも高速化のためには妥協しても仕方がない」部分かそうでないか、ということだと思っております。で、どっちとも取れなくて悩む。

1+2 で 2,1 と評価されるのは気持ち悪いし、やっぱり recv は先にくるべきかなぁ、と揺れ動く今日この頃。


今更お前そんなこと言うなよ、って感じかなあ。まつもとさんもむちゃくちゃ考えてきた結果なわけで、それを壊すことが正しいとはとうてい思えないし。

多重代入を高速に行うVMを考えるほうが正しいって感じだろうか。


Fourth International Ruby Conference。お金があれば行ってみたいなあ。でも、10月はじめって、去年より早いね。


めーらの話。

たとえば、blade にメーラとして足りない機能を考えるのはどうだろう。メールの閲覧には十分な気がするんだけど、そうでもないですか。キーバインディングでほいほい見れないから駄目かな。

私は手元のメーラで見るより blade で見るほうが楽だと感じてしまうんだけど、手元のメーラが使いづらいだけか?


すでに10時。マズー。


The Great Computer Language Shootoutのソースベンチマークとかに勝手に使って配っちゃっていい〜? ってメールしたら、一瞬で「好きに使って」って返ってきた。感謝。


ありがとーって返したらどういたしましてって日本語で返ってきた。びびった。


最近あまりにミスが多すぎる。パソコン通信時代には、きちんと一晩寝かせることを徹底していた(ちょっとアクシデントがあった)のだけれど、最近便利すぎてタガが外れている、ということか。もっと慎重にならないといけない。


夕飯は納豆と冷やし中華とマヨネーズ。

別にマヨネーズは単品じゃないし、納豆にマヨネーズをかけようとは思わないけれど、納豆の賞味期限が昨日までだったんだよね。

_mput(Thu May 20 20:59:36 JST 2004)

 返信できない>bladeに足りないもの

_ささだ(Thu May 20 21:01:21 JST 2004)

 そうそう、そんな感じで。手元のクライアントはそっちの仕事をして、データの閲覧、検索などは blade にやらせるみたいな感じとか。考えるとっかかりにはいいかな、ってちょっと思いました。bladeにウェブサービスをやってもらって、ごにょごにょとか。

_こーのいけ(Fri May 21 00:41:27 JST 2004)

 そーいえば蔵など積んでるなぁ。いや,こないだ崩したんだったか。

_19(Wed)

二日酔いで頭が痛いので今日は御茶ノ水行かないことにしました。ごめんなさい。

どっかでメモが見れるといいんだけど。


p /hoge/
#=>
/hoge/
t.rb:3: warning: ambiguous first argument; put parentheses or even spaces

どの辺がambiguous?


正規表現マッチを実現する方法で悩む。どうしたもんかな。


class Regexp
  def =~(str)
    p str
  end
end

/huga/ =~ 'hoge'
'hoge' =~ /huga/

これが代わらないなら、1+1も代わらなくてもいいような・・・。


self を後に評価しようとして、

(p 1; /hoge/) =~ (p 2; 'huga')

が 2,1 と表示される。やっぱりまずいなぁ。


NODE_DREGX_ONCE って、バイトコードな体系でどうやって実現すりゃいいんだ・・・。orz

  1. nop で埋める
  2. jump する

後者かなあ。


i=0
while i<1000000
  /hoge/ =~ 'huga'
  i+=1
end

--
      user     system      total        real
ruby  2.250000   0.000000   2.250000 (  2.250000)
yarv  1.594000   0.000000   1.594000 (  1.593000)

なんでかなぁ。もっと遅くなると思ったのに。

i=0
while i<1000000
  /ho#{10}ge/ =~ 'huga'
  i+=1
end

--
      user     system      total        real
ruby 27.266000   0.875000  28.141000 ( 28.171000)
yarv 29.219000   0.937000  30.156000 ( 30.157000)

こっちは想像どおり遅い。これなんとかならないかなあ・・・。


そうか、loop にかかる時間で稼いでるのか。


toregexp という命令を作ったのだけど、もったいない気がしないでも無い。


re = /.../
...
/#{re}/o =~

が一番速いのか。知らなかった。今度からこう使おう。


体の調子がどんどん悪くなってきた(トイレに常駐・・・)ので今日はお休み・・・。


まつもとさんに教えていただいたトップレベル環境への移行。eval.c の外では出来ない・・・(static global変数とかにアクセスする必要がある)。まぁ、あたりまえといえばあたりまえですか。そんなところを弄れるようにするのは元来危険なことだし、必要も無い。

でも、どうするかなぁ。この問題が残ってると、クラスを作ったりするテストが出来ない(テストはメソッドの中で書いて、メソッドの中ではクラスは作れない)。


Gmail はネタじゃなかったのか。しかし、そんなにがんばってユーザを集めてどうやって金を回収するんだろう。


yarv はそれなりのものは動くようになりました。それなりです。

IA32以外のアーキテクチャを持ってる方で、ちょっと協力してやってもいいぜっていう方いれば、ベンチマークの結果を教えてほしいのですが、だれか居ませんかね。


nop で埋める、jump するってのも、そんなに簡単な話じゃない。どうしたもんかなあ。

_なかだ(Wed May 19 13:58:13 JST 2004)

 /まで読んだだけでは、p = hoge = 1; p / hoge と区別がつかないから。

_18(Tue)

私くらいしか面白くないだろうトリビア。

NODE_DSTR の下にくる NODE_ARRAY の nd_alen はいいかげん。


評価順序は左から右。

"#{A}#{B}#{C}" を C B A と評価することは悪、と。間違えたなぁ。


i=0
while i<1000000
  "ab #{1+1+i} cd"
  i+=1
end

--
      user     system      total        real
ruby  6.141000   0.000000   6.141000 (  6.135000)
yarv  6.828000   0.000000   6.828000 (  6.832000)

スコアがとても悪い。文字列連結を複数命令に分けちゃってるからだろうけれど。

ここの最適化はなんとかなんないかなあ・・・。

ちなみに、

i=0
while i<1000000
  "#{1+1+i}"
  i+=1
end

--
      user     system      total        real
ruby  7.344000   0.015000   7.359000 (  7.359000)
yarv  3.922000   0.032000   3.954000 (  3.953000)

こっちはちょっと工夫したので速い。


i=0
while i<1000000
  "#{1+1} #{1+1} #{1+1}"
  i+=1
end

--
      user     system      total        real
ruby 11.407000   0.000000  11.407000 ( 11.420000)
yarv 12.078000   0.000000  12.078000 ( 12.131000)

concat する文字列が多ければ多いほど遅い。困った。

スタック操作(メモリアクセス)が混ざるからまずいのかな。


i=0
while i<1000000
  a = (1..1000)
  i+=1
end

--
      user     system      total        real
ruby  1.015000   0.000000   1.015000 (  1.016000)
yarv  8.860000   0.266000   9.126000 (  9.171000)

壊滅的だ。なんでだろう。

スタックのpushとpopが遅すぎなのかなー、やっぱり。


忘れてた。リテラルに変えるんだったね、リテラルなrangeとかは。どうしようかな。この辺の最適化。

i=0
while i<1000000
  a = (1..i)
  i+=1
end

--
      user     system      total        real
ruby  7.312000   0.000000   7.312000 (  7.355000)
yarv  6.688000   0.000000   6.688000 (  6.715000)

でも、あんまり変わんない。


ああ、最悪。間違えた。


ベンチマーク最新。

/usr/local/bin/ruby_cyg19 ../benchmark/run.rb
ruby 1.9.0 i386-cygwin(2004-05-17)
YARVCore Ver.0.0.0.d-$Rev: 13 $ [direct threaded code]

-----------------------------------------------------------
factorial: 
def fact(n)
  if(n > 1)
    n * fact(n-1)
  else
    1
  end
end

fact(7300)

--
      user     system      total        real
ruby  0.781000   0.046000   0.827000 (  0.834000)
yarv  0.453000   0.031000   0.484000 (  0.492000)
-----------------------------------------------------------
fib: 
def fib n
  if n < 3
    1
  else
    fib(n-1) + fib(n-2)
  end
end

fib(32)


--
      user     system      total        real
ruby  5.500000   0.000000   5.500000 (  5.516000)
yarv  1.719000   0.000000   1.719000 (  1.721000)
-----------------------------------------------------------
reccount: 
def reccount n
  if n > 1
    1 + reccount(n-1)
  else
    1
  end
end

reccount 7000


--
      user     system      total        real
ruby  0.078000   0.000000   0.078000 (  0.065000)
yarv  0.000000   0.000000   0.000000 (  0.003000)
-----------------------------------------------------------
strconcat: 
i=0
while i<1000000
  "#{1+1} #{1+1} #{1+1}"
  i+=1
end

--
      user     system      total        real
ruby 11.062000   0.000000  11.062000 ( 11.084000)
yarv 11.219000   0.000000  11.219000 ( 11.219000)
-----------------------------------------------------------
tak: 

def tak x, y, z
  unless y < x
    z
  else
    tak( tak(x-1, y, z),
         tak(y-1, z, x),
         tak(z-1, x, y))
  end
end

tak(18, 9, 0)


--
      user     system      total        real
ruby 17.562000   0.000000  17.562000 ( 17.575000)
yarv  5.625000   0.000000   5.625000 (  5.635000)
-----------------------------------------------------------
tarai: 
def tarai( x, y, z )
  if x <= y
  then y
  else tarai(tarai(x-1, y, z),
             tarai(y-1, z, x),
             tarai(z-1, x, y))
  end
end

tarai(12, 6, 0)

--
      user     system      total        real
ruby 14.109000   0.000000  14.109000 ( 14.097000)
yarv  4.532000   0.000000   4.532000 (  4.533000)
-----------------------------------------------------------
whileloop: 

i = 0
while(i<1000000)
  i+=1
end

--
      user     system      total        real
ruby  0.640000   0.000000   0.640000 (  0.642000)
yarv  0.250000   0.000000   0.250000 (  0.253000)

concat が遅い。

基本演算の最適化を足した。

ruby 1.9.0 i386-cygwin(2004-05-17)
YARVCore Ver.0.0.0.d-$Rev: 13 $ [direct threaded code]  [optimize basic operation]

-----------------------------------------------------------
factorial: 
def fact(n)
  if(n > 1)
    n * fact(n-1)
  else
    1
  end
end

fact(7300)

--
      user     system      total        real
ruby  0.828000   0.047000   0.875000 (  0.873000)
yarv  0.437000   0.078000   0.515000 (  0.546000)
-----------------------------------------------------------
fib: 
def fib n
  if n < 3
    1
  else
    fib(n-1) + fib(n-2)
  end
end

fib(32)


--
      user     system      total        real
ruby  5.500000   0.000000   5.500000 (  5.510000)
yarv  1.125000   0.000000   1.125000 (  1.119000)
-----------------------------------------------------------
reccount: 
def reccount n
  if n > 1
    1 + reccount(n-1)
  else
    1
  end
end

reccount 7000


--
      user     system      total        real
ruby  0.063000   0.000000   0.063000 (  0.065000)
yarv  0.015000   0.000000   0.015000 (  0.004000)
-----------------------------------------------------------
strconcat: 
i=0
while i<1000000
  "#{1+1} #{1+1} #{1+1}"
  i+=1
end

--
      user     system      total        real
ruby 11.125000   0.000000  11.125000 ( 11.123000)
yarv 10.610000   0.000000  10.610000 ( 10.649000)
-----------------------------------------------------------
tak: 

def tak x, y, z
  unless y < x
    z
  else
    tak( tak(x-1, y, z),
         tak(y-1, z, x),
         tak(z-1, x, y))
  end
end

tak(18, 9, 0)


--
      user     system      total        real
ruby 17.531000   0.000000  17.531000 ( 17.575000)
yarv  4.032000   0.000000   4.032000 (  4.028000)
-----------------------------------------------------------
tarai: 
def tarai( x, y, z )
  if x <= y
  then y
  else tarai(tarai(x-1, y, z),
             tarai(y-1, z, x),
             tarai(z-1, x, y))
  end
end

tarai(12, 6, 0)

--
      user     system      total        real
ruby 14.140000   0.000000  14.140000 ( 14.135000)
yarv  3.797000   0.000000   3.797000 (  3.794000)
-----------------------------------------------------------
whileloop: 

i = 0
while(i<1000000)
  i+=1
end

--
      user     system      total        real
ruby  0.641000   0.000000   0.641000 (  0.638000)
yarv  0.140000   0.000000   0.140000 (  0.147000)

一番速度的にがんばんないといけないのは、メソッドディスパッチと、ブロックの yield。とくに後者が ruby では一番効率に効いてくる。

ary.each{|e|

}

みたいなループが多いから。

とにかく、こいつを速くすることができれば、ほかはどんなに遅くても問題ない。

で、ruby レベルでの yield と C レベルでの yield 、どっちが多いかっていったら多分Cレベルの yield なんだろう。あんまり、自分でコンテナ書いてイテレータ書かないよね。速度に効いてくる部分なんか特に。Array#each みたいな。

ということは、効率的な VM と C とのインターフェース、というかブロック起動の方法が、一番重要ということになる。


ruby/eval.c - graph

かっちょえー。


うへぇ、rb_yield って 1引数か、なるほどなるほど。どうしたもんかなあ。


C -> ruby で yarv の構造を噛ませる方法を考える。

  1. ruby にパッチをあてる(面倒)
  2. ruby->yarvなラッパを噛ます(遅い)
  3. 呼び出し側を変える
    1. バイナリ変換(面倒)
    2. 地道に define しなおす

最後のだろうなぁ。とりあえず Array#each, Integer#each を書き換えるか。


PRO 研究会に行ってきました(第49回プログラミング研究会)。

疲れた。

前田さん(前田先生のほうがいいですか?(笑) おめでとうございます)に懇親会に無理やり承諾させられて誘っていただき、楽しい時間を過ごすことができました。

akrさんが千鳥足でした。


■テレビゲーム記述プログラミング言語WOW

西森 丈俊,久野 靖 (筑波大学大学院ビジネス科学研究科)

ゲーム記述用スクリプト言語(ぱっと見rubyと似てるかも)を設計し、実際にそれでゲームを作ってるって話。

並列記述に疑問。


# class A description
A
  # thread1
  @stateA
    ...(any action include 'sync' statement)...

  @stateB
    ...
  ===
  # thread2
  @...
end

みたいに記述してるんだと思った(記憶で書いているので間違ってる可能性大、正式には論文などをご参照ください)。

ここで、'====*'(= を3文字以上)で分けると、それぞれスレッド記述になるそうな。あとスレッド切り替えはノンプリエンプティブで、sync 命令によってスレッドが分けられる。1フレームの処理を各キャラクタについてそれで書いていくってことらしい。sync というプリミティブは正当か?

というか、'====*' という記述でスレッド分けるって、ほんとにいいのか?

とか聞いてみたけど、すでに2万行書いてて、それで幸せにゲームを作ってるらしい。製品が出るときにあとはパフォーマンスがどうなるのか気になります。

■レジスタ生存グラフを用いたレジスタ割付けへのプロセッサ並列度の考慮

片岡 正樹(早稲田大学理工学部), 古関 聰,小松 秀昭(日本IBM(株)東京基礎研究所), 深澤 良彰(早稲田大学理工学部)

ぜんぜんわからなかった。コンパイラの知識が絶望的に足りないことを再認識した。

スピルコードを削減することは非常に重要だと思うんだが、それを短い命令列に押し込める必要は、やっぱりないよな(プロセッサに任せましょう)。

■Persistence of Termination for Overlay Term Rewriting Systems

岩見 宗弘(島根大学 総合理工学部)

これもさっぱりわかりませんでした。というか素養無さ杉>俺。TRS って何? って感じなので。

理論系の厳しさを知ってかるちゃーしょっく。エンジニアリングでよかった。


飲み会の前にakrさんに本屋につれてってもらう。明倫館で、とうとうドラゴンブックの上巻を買う。4000円。

あと、「プログラミング言語の基礎理論 情報数学講座 (9)」を買う。2600円。

読めるかどうかは不明。型推論ってのを知りたかった。


飲み会。

いろいろと聞いた気がするがあまり覚えていない。誰か私を雇ってください(3年後)。

八杉さんのあのPRO論文の評価などは全部自分でやったらしい。業務傍らスゲー。


2次会。伊知地さんに未踏の話をいろいろうかがった気がする。


飲みすぎ。頭痛いよう。

自分ではあんまり酔ってないと思ってたんだけど、店に帽子忘れた。やっぱり酔ってたらしい。


で、明日はどうしようかな・・・。やること溜まってるんだよな・・・。


おお、また artoned だ(だから語呂が悪いって)。

_なかだ(Tue May 18 10:59:17 JST 2004)

NEW_DSTR()でu2を1にして、literal_concat()でheadをNODE_DSTRに化けさせるところでhead->nd_alen = 1すればOK?

_ささだ(Tue May 18 11:16:01 JST 2004)

 別に現状のままでいいと思います。無ければないでリストを手繰ればいいので。NODE名だけみて、nd_alen を期待しただけですので。

_なかだ(Tue May 18 12:21:37 JST 2004)

1.6まではDSTRは評価する式も含めて文字列自身をそのまま持っていたのを、 最初にparseするようにして構造を変えたのにほったらかしにしてただけなので、 やっぱりちゃんとあってたほうが気持はいいかなと。 実際にはNODE_DSTRに対してはリストしか見てないんですけどね。

_なかだ(Tue May 18 12:29:05 JST 2004)

こんなとこで。

Index: node.h
===================================================================
RCS file: /cvs/ruby/src/ruby/node.h,v
retrieving revision 1.54
diff -U2 -p -d -r1.54 node.h
--- node.h	7 May 2004 08:44:14 -0000	1.54
+++ node.h	18 May 2004 03:26:40 -0000
@@ -298,5 +298,5 @@ typedef struct RNode {
 #define NEW_LIT(l) NEW_NODE(NODE_LIT,l,0,0)
 #define NEW_STR(s) NEW_NODE(NODE_STR,s,0,0)
-#define NEW_DSTR(s) NEW_NODE(NODE_DSTR,s,0,0)
+#define NEW_DSTR(s) NEW_NODE(NODE_DSTR,s,1,0)
 #define NEW_XSTR(s) NEW_NODE(NODE_XSTR,s,0,0)
 #define NEW_DXSTR(s) NEW_NODE(NODE_DXSTR,s,0,0)
Index: parse.y
===================================================================
RCS file: /cvs/ruby/src/ruby/parse.y,v
retrieving revision 1.324
diff -U2 -p -d -r1.324 parse.y
--- parse.y	17 May 2004 07:25:36 -0000	1.324
+++ parse.y	18 May 2004 03:26:35 -0000
@@ -4682,4 +4682,5 @@ literal_concat(head, tail)
 	if (htype == NODE_STR) {
 	    nd_set_type(head, NODE_DSTR);
+	    head->nd_alen = 1;
 	}
 	list_append(head, tail);
_まつもと(Tue May 18 13:44:54 JST 2004)

 コミット希望

_なかだ(Tue May 18 14:54:03 JST 2004)

 考えてみたら、DREGXはnd_cflagで上書きされちゃうから意味ないじゃーん。(←コミットしてから気づくやつ

_ささだ(Tue May 18 23:16:15 JST 2004)

 parse.y は eval.c よりも魔窟。

_maeda(Wed May 19 00:24:34 JST 2004)

 Hindley-Milnerの型推論ですか…導師なしでは道が険しい気がするが、分かったら教えて。

_shiro(Wed May 19 06:38:39 JST 2004)

 http://www.cafeshops.com/skicalc.6225368

_17(Mon)

相変わらずよく覚えてるな・・・。


parse.c を CVS HEAD に入れてほしいなあ、と言ったのはたしか私だったと思ったんですが、別の(簡単な)方法でとってこれるといいですね。make download-parse.c みたいなので、どこぞからとって来れるとか。とにかく簡単な。

なぜって、わざわざ cygwin 入れたりするのが面倒だからです。そんな人希少なのかな。


システムを作ってくれるバージョン管理システムって話も akrさんがしてましたね。そんなのり(ちょっと違うか)でサーバが parse.c を作ってくれればいいんだ。parser generator server。そこでは、永遠に ruby 1.8.2 あたりが動いていて、racc を動かしてるんですよ、多分。


cfunc を呼ぶときは、必ず ruby_frame->orig_func にidを突っ込むことにした。ああ、大雑把。

やっと factorial が通った。

factorial:
def fact(n)
  if(n > 1)
    n * fact(n-1)
  else
    1
  end
end

fact(7300)

--
      user     system      total        real
ruby  0.844000   0.032000   0.876000 (  0.918000)
yarv  0.515000   0.000000   0.515000 (  0.532000)

うーん、まぁまぁと言っていいのか。

ちなみに、fact(7300) というのは、うちの cygwin ruby で動かせる、だいたい一番大きい数字を選んだのだけど。Linux とかだとどれくらいだろう。

ちなみに、stack overflow のチェックをしていないのでインチキ。

とりあえず、各スレッド 2MB くらい持ってもらおう。でかすぎるかな。でかすぎるな。512KB でいいや。

とりあえず、スタックオーバーフローしそうになったら rb_bug するようにしたけど、性能には大きく影響は出なかった。よかったよかった。

OSのスタックオーバーフロー検出に頼らないので、こっちのほうが確実にフックできますね。


mkmf の話。

mswin版だと、depend の hoge.c などが {$(srcdir)}hoge.c のようになるが、cygwin版だと、hoge.c のまま。

ソースと異なるディレクトリでビルドするとき、自動生成ファイルはカレントディレクトリにおくことになるが、ソースディレクトリにその自動生成ファイルと同じファイル名のごみがあった場合、それを参照してビルドしてしまうようだ。これに気づかず、えらいはまった。

つまり、いくらカレントディレクトリに(自動生成する)新しいファイルを作っても、ソースディレクトリのゴミでビルドしてしまう。

どうやったらこれを解決できるんだろう。ソースディレクトリなんかでビルドするな、というのが最善策か。でも、デフォルトでカレントディレクトリのものを使ってほしいなあ。

って思ったら、cpp で include するファイルだった。include するファイルの検索順序の話で、make とは関係なしか。


ちなみに、yarv版でスタックオーバーフローするのは fact(14000) あたりであることがわかった。


久々に馬鹿日本地図を見たら、とてもいろいろやっていた。すげぇ馬鹿。


次の投票は〜だね、って話がちょびっとあったような気がしたんだけど、さっぱり覚えてない。なんだっけ。


NODE_DASGN_CURR と NODE_DASGN の違いはなんだろう。カレントの環境への代入、ということになるんだろうか。うーん。

ループを2回見て、諦めているのが違うのか。この「2回」ってなんだっけ。


あれー、パーサの外側から、パーサが作った dyna_vars って見られないのかな。まずいなー。

自前で dyna_vars みたいなのを作っていかないとまずいかも。

困ったときの RHG ということで、ここらへんを読み返してみるも、さっぱりわからない(読書会のときに何をしていたんだって感じ)。状態数に頭が追いついていかない。


やっぱり、自力でそのテーブルを作っていくしかないか。

dvar_asgn_curr でも、新しいエントリを作らないで代入だけってことはあるんだろうか。うーん。


これって、新しいブロックローカル変数に代入するとき、ruby_dyna_vars を先頭まで全部見てしまうのか。そういうことは起こらずに、dvar_asgn_curr になるから、心配ないのか?

しかし、2回は while loop をまわしているのがわかんないなあ。


m{
  a = 1
  b = 2
  p 1
  c = 3
}

=>

node: NODE_ITER
------------- ndbody
  node: NODE_BLOCK
    node: NODE_DASGN_CURR
      node: NODE_DASGN_CURR
        node: NODE_DASGN_CURR
    node: NODE_BLOCK
      node: NODE_DASGN_CURR
        node: NODE_LIT
      node: NODE_BLOCK
        node: NODE_DASGN_CURR
          node: NODE_LIT
        node: NODE_BLOCK
          node: NODE_FCALL
            node: NODE_ARRAY
              node: NODE_LIT
          node: NODE_BLOCK
            node: NODE_DASGN_CURR
              node: NODE_LIT
------------- nditer
  node: NODE_FCALL
------------- ndvar
------------- finish

こんな感じ。うわー、最初に初期化なんてやってくれってことか、これは。nd_value が 0 だから、これが宣言になるってことなのか。つまり、これを見れば、ブロックローカル変数のマップを作ることは可能、と。

ちなみに、nodedump はインチキな(嘘、きれいに整形してくれる)ので、yarv でごにょごにょ出力する。

0 だったとき、Qnil だから、block の最初は a = b = c = nil ってやってるだけなのか。なるほど。ブロックローカル変数は、最初に必ずこうやってるってことなら、ここ削っちゃってもいいなあ。

で、この仮定はどの程度信頼できるものなんだろう。


そうか、curr が無いと、そのブロックのブロックローカル変数として追加するかどうかの判断が付かないのか。


2回ループってのは、一回目は必ず 0(番兵君)が居るからか。で、2度目の 0 に出会うと、それはその上のブロックのブロックローカル変数郡になってしまうから、ということか。

P447 にまんま書いてあるなあ。


massign をみてみたけど、やっぱりさっぱりわからない。そもそもrubyの多重代入の文法を正確に知らないからなあ。

どうしたもんだか。


インチキインラインメソッドキャッシュ適用前:

-----------------------------------------------------------
factorial:
def fact(n)
  if(n > 1)
    n * fact(n-1)
  else
    1
  end
end

fact(7300)

--
      user     system      total        real
ruby  0.812000   0.015000   0.827000 (  0.853000)
yarv  0.453000   0.063000   0.516000 (  0.509000)
-----------------------------------------------------------
whileloop:

i = 0
while(i<1000000)
  i+=1
end

--
      user     system      total        real
ruby  0.641000   0.000000   0.641000 (  0.637000)
yarv  0.469000   0.000000   0.469000 (  0.465000)

適用後:

-----------------------------------------------------------
factorial:
def fact(n)
  if(n > 1)
    n * fact(n-1)
  else
    1
  end
end

fact(7300)

--
      user     system      total        real
ruby  0.829000   0.031000   0.860000 (  0.858000)
yarv  0.453000   0.032000   0.485000 (  0.486000)
-----------------------------------------------------------
whileloop:

i = 0
while(i<1000000)
  i+=1
end

--
      user     system      total        real
ruby  0.640000   0.000000   0.640000 (  0.633000)
yarv  0.219000   0.000000   0.219000 (  0.219000)

インチキインラインメソッドキャッシュ:ぽりもふぃずむとかまったく無視して、キャッシュが入っていれば、チェックせずに無条件で利用するようなキャッシュ。一番早い、というか正確に動かない。

C関数呼び出しは速くなっているが、ruby関数呼び出しにはほとんど影響していない。つまり、ruby関数呼び出しが絶望的に遅いということか。ローカル変数の初期化とかをやめてみようかなあ。

やめてみたけどあんまり変わんなかった。


しかし、a, b, c = ... はわかるんだけど、a, (b,c), d = ... は何に使うのかよくわからん・・・。というか、どういうふうにコンパイルすればいいんだ・・・。orz

もう、すごい簡単に済ませてしまおうかなあ。

うーん、massign から assign に行ってまた massign になるんだよなぁ。

静的な解析でどこまできれいな構造に変換できるのか。

そもそも、可変長オペランドの命令にしかならない? それは嫌だなぁ。


配列を展開する命令一個あれば問題ないか。

/**
  @c put
  @e expand array to num
  @j スタックトップのオブジェクトが配列であれば、それを展開する。
     配列オブジェクトの要素数が num以下ならば、代わりに nil を積む。
     配列オブジェクトでなければ、num - 1 個の nil を積む。
 */
DEFINE_INSN
expandarray
(ulong num)
(VALUE ary)
(...)
{
  int i;
  if(BUILTIN_TYPE(ary) == T_ARRAY){
    int len = RARRAY(ary)->len;
    for(i=0; i<len && i<num;i++){
      PUSH(RARRAY(ary)->ptr[i]);
    }
    for(; i<num;i++){
      PUSH(Qnil);
    }
  }
  else{
    if(num > 0){
      PUSH(ary);
    }
    for(i=0; i<num-1; i++){
      PUSH(Qnil);
    }
  }
}

こんな感じだろうか。スタックキャッシュに乗せようが無いので(実行時じゃないと、スタックに乗せる数がわからない コンパイル時にわかってら)、とても遅そうだ。命令融合しても、どうもうまくなさげ。

多重代入ってどうやっても高速化できないよなぁ。多分。カチっと仕様が決まれば出来るんだろうけど。


yieldの引数に配列を渡すと展開してくれちゃったりする機能は必要か。いっそ削っちゃおうかなあ。面倒だし。


年金年金って・・・。もっとアレなこともたくさんあるだろうに、なんでこんなにうるさく言うんだろう。


reccount:
def reccount n
  if n > 1
    1 + reccount(n-1)
  else
    1
  end
end

reccount 7000


--
      user     system      total        real
ruby  0.078000   0.000000   0.078000 (  0.072000)
yarv  0.000000   0.000000   0.000000 (  0.004000)


tak:

def tak x, y, z
  unless y < x
    z
  else
    tak( tak(x-1, y, z),
         tak(y-1, z, x),
         tak(z-1, x, y))
  end
end

tak(16, 8, 0)


--
インチキキャッシュ適用前:
      user     system      total        real
ruby  2.844000   0.000000   2.844000 (  2.912000)
yarv  1.703000   0.000000   1.703000 (  1.732000)

インチキキャッシュ適用後:
      user     system      total        real
ruby  2.875000   0.000000   2.875000 (  2.910000)
yarv  0.781000   0.000000   0.781000 (  0.787000)

うーむ。

もちろん、tak が速くなって嬉しくなる rubyist は、作ってる私くらいしか居ないわけですが。

しかし、これくらいの話だと、キャッシュが強烈に効くという事なのですね。


mswin32 で tak をやると、

インチキキャッシュ適用前:
      user     system      total        real
ruby  3.641000   0.000000   3.641000 (  3.688000)
yarv  2.547000   0.000000   2.547000 (  2.562000)

インチキキャッシュ適用後:
      user     system      total        real
ruby  3.656000   0.000000   3.656000 (  3.687000)
yarv  1.406000   0.000000   1.406000 (  1.407000)

direct threaded code が効いてるということだろうか。それとも、最適化の性能差か。

最適化の性能差だったらしい(direct threaded code を切ってみた)。


レジスタが多いマシンだと、yarv は速く動きそうなんだけど、どうだろうね。SPARC で試してみようかなあ(こっそりと)。


あれぇ、tak と tarai って計算量って違うのか。追ってもよくわからないので追わないけど。


こういう長いのをダラダラ書く日はコメントが付かない -> 誰も読みたくない。

なんで、こういう長い日の後ろのほうには、アレなことを書いても、読まれない。大丈夫。


subversion 辛い。すぐにDBが壊れたと言う。svnadmin recover で直ってるけれど。

多分、ファイルのパーミッションが違うとどうの、とかだと思うのだけれど。

うーん、cvsに戻そうかなあ。でも、yarv だしなぁ。

repos/db/log.hogehoge といのを、どうやら見るだけで更新するらしいのだけど、viewcvs がそれを更新して、その log.hogehoge を新しいファイルとして作ると、パーミッションがアレで駄目駄目になる。

これなんとかならないかなぁ。このディレクトリ以下は必ず G というグループをくっつけますとか、そういう設定。OSであるんかなあ。


http://subversion.bluegate.org/doc/book.html#svn-ch-6-sect-5

この辺にちゃんと書いてあるじゃん・・・。駄目すぎ。とりあえず、これでどれくらい幸せになれるだろうか。


長いのにますます長くしてみる。

IPSJ SIGPRO Vol.45(SIG 5 PRO 21) 感想文。

■マルチメディアSIMD命令活用のためのデータサイズ推論

鈴木 貢 (電気通信大学),藤波 順久 (ソニー),福岡 岳穂 (管理工学研究所), 渡邊 坦 (電気通信大学),中田 育男 (法政大学)

coins のSIMD並列化をするために、ある命令列に対して、そいつがどの程度並列 化できるかをきっちりかっちり調べましょうって話だったと思った。

しかし、COINS の LIR ってこういうやつだったのか。

こっちの並列化も、これはこれで楽しそうだよな。

■オブジェクト指向並列言語OPAのための遅延正規化手法

馬谷 誠二,八杉 昌宏,小宮 常康,湯淺 太一 (京都大学)

OPAで遅延って、昔からやってなかったっけ? うーん、こっちに手を出すべき か。何か元があるならいいんだけど。Cilk を弄るってのも手かなぁ・・・。そ れとも、ruby のメソッド呼び出しをスレッドにしてみるか。

■圧縮型ガーベッジコレクションの高速化

寺島 元章,新田 寛 (電気通信大学)

恥ずかしながら、mark and compact gc というのを始めて知りました。なるほど たしかに。計算時間のO(A) と O(S) の話がよくわからないなぁ。ポインタ書き 換えは copying collection でも起こると思うんだけど。

うう、読んでもよくわからん。誰か教えて。

■階層的グループ化に基づくコピー型ごみ集めによる局所性改善

八杉 昌宏,小宮 常康,湯淺 太一 (京都大学)

通常、幅優先探索(オブジェクトのリファレンスを幅優先で探索)で行うコピー GCではキャッシュミスとか起こりまくりでまずんで、できるだけ深さ優先探索で これをやろうよ、とか、オブジェクトのクラスタ(多分、緊密なリファレンスを 持つオブジェクト群?)ごとに、このコピーとかやろうよ、って話。

メモリ局所性の重要性を懇切丁寧に説明しているのがすごいというかなんという か。こういう手もあるのかぁと感心。

って、読んでみると、その深さ優先探索の一考察って感じだな。限定スタック法 というらしい。

■スレッド別ごみ集めにおけるライトバリアの高速化

千葉 雄司 (日立製作所)

スレッドごとの並列GCにおける、ライトバリアの高速化って話かな。スレッド= 並列実行単位っていう前提で話をすすめてる気がするが、いいんかなぁ? これ で。

って、並列GCじゃなくて、スレッドローカルなオブジェクトのGCか。

死者っていうのか。

共有しているオブジェクトにひとつフラグを設けて local 判定を速くしよう、 でいいのかな。割り付けIDってなんだろ。

■非対称なスピンロックの提案とそのJavaへの応用

河内谷 清久仁,古関 聰,小野寺 民也 (日本IBM)

以前提案した「予約ロック」方式では、予約してたスレッド以外がアクセスする と、オーバーヘッドがでかかった。だから、それをなんとかしましょう、って話。 デッカーのアルゴリズムで、あるスレッドだけは不可分命令なしですましましょ うって。前回のとあんまり・・・。


そういえば、「IPSJ SIGPRO 第48回 2004-03-18 ~ 2004-03-19 東京工業大学 大岡山キャンパス西8号館E棟10階研究科会議室」なんて知らなかった・・・。

明日は行く予定です。


さすがに昨日の夜から寝てなかったので、つい1時間ほど眠ってしまった。


IPA のルート証明をまるっと信じろって・・・。いいのか、それで。いや、PKIとかよくわかってないんだけど。


飯をPCの前で食っていたら、目の前の魚にトラックボールをドラッグして食おうとしてしまった。もうだめぽ。


「バカの壁」で養老さん3位に初登場 各分野高額納税者 - asahi.com : 社会

なんというか。

国民年金に約3年10カ月未加入の麻生太郎総務相が、(略)

枕に使われるのねえ。もう、あほかと。

あと、amazonで突発的にすごかった「週刊私の〜」とか「もえたん」とかはどれくらい売れたんだろうなあ。

_mput(Mon May 17 03:21:18 JST 2004)

 Mac OS Xのruby はたったのfact(630)で陥落。

_ささだ(Mon May 17 03:34:52 JST 2004)

 手元の mswin32 では 722 であぼーん

_shiro(Mon May 17 21:36:55 JST 2004)

 幅優先でなく深さ優先ってTの初期の実装で使ってなかったっけ。それが、80年代後半に普通の幅優先に実装しなおしたとか。なんでも、深さ優先の方がコピー時のオーバヘッドがあるらしくて、ローカリティによるゲインよりそっちの方が悪かったとか。これは原論文を読んでなくて、Olin Shiversによる"The History of T"からの受け売りだけれども。キャッシュとメインメモリの差がこんだけ開いた現在ではまた違った結果が出るのかも。ちなみに"The History of T"はなかなか熱い記事で、途中まで訳しかけてあるんだけどなんか止まってる。

_ささだ(Mon May 17 21:44:02 JST 2004)

 Tってなんでしょうか。

_ささだ(Mon May 17 21:45:35 JST 2004)

 History of T これですか?

_shiro(Mon May 17 22:08:24 JST 2004)

 そうです。

_16(Sun)

RHG。

今日の恥。

  • parse.y が bison にかけられるのを知らなかった
  • その他いろいろ

まつもとさんが hack中何飲んで ruby を作ってるんだろう、という話が出ていました。


「はてなメモ」は本当にできないかな? と思うんですが、どうでしょうか。

うーん、どうやったら提案できるんだろう。


メソッドフレームの構造を、先日のように変える。波及範囲が広すぎ。えらい時間がかかった。

しかも、バグバグ。


次は何しよう。

load と同じように、環境をトップレベルから評価したいなだよな。これがないと、TestUnit でテストできない。


Program:

  i = 0
  while(i<10000000)
    i+=1
  end

--
Rehearsal ----------------------------------------
ruby   8.687000   0.000000   8.687000 (  8.719000)
yarv   7.375000   0.016000   7.391000 (  7.421000)
------------------------------ total: 16.078000sec

           user     system      total        real
ruby   8.641000   0.000000   8.641000 (  8.672000)
yarv   7.344000   0.000000   7.344000 (  7.390000)

しょぼーん。

cygwin版で threaded code で再挑戦。

Program:

  i = 0
  while(i<10000000)
    i+=1
  end

--
Rehearsal ----------------------------------------
ruby   6.359000   0.000000   6.359000 (  6.355000)
yarv   5.031000   0.000000   5.031000 (  5.031000)
------------------------------ total: 11.390000sec

           user     system      total        real
ruby   6.329000   0.000000   6.329000 (  6.350000)
yarv   5.031000   0.000000   5.031000 (  5.037000)

direct threaded code に。

ruby 1.9.0 i386-cygwin(2004-05-10)
YARVCore Ver.0.0.0.d with direct threaded code
Program:

  i = 0
  while(i<10000000)
    i+=1
  end

--
Rehearsal ----------------------------------------
ruby   6.547000   0.000000   6.547000 (  6.600000)
yarv   4.640000   0.000000   4.640000 (  4.684000)
------------------------------ total: 11.187000sec

           user     system      total        real
ruby   6.516000   0.000000   6.516000 (  6.577000)
yarv   4.609000   0.000000   4.609000 (  4.667000)

さすがに、効果がないことも無いか。  


次は何をやるかなぁ。イテレータをがんばるか、それともスタックキャッシングに手をつけるか。

う、やはり、評価する環境を整える工夫をしないと動かない。どうしよう。


ruby (eval):10: [BUG] unknown node type 95

と言われてしまった。いいかげんに parser を起動して、環境が変になっちゃったかな。解決方法がまったく見えない。

簡単に利用できるパーサがほしいなぁ。


eval.c を覗いてみると、rb_call0 か、rb_eval でこのエラーが出るらしい。

わからないのは、2度目の実行でこのエラーが起こる、ということ。うーむ。

p eval program
p vm.eval is
p eval program  <-- ここで起こる
p vm.eval is

うーん。なぜだ。


うーん、再定義のときにそれがきちんとできてないのかな。


factorial 作ったら、

cannot convert Bignum into String (TypeError)

なぜ掛け算するのに文字列に変化させるんだろう。いったいどこだ。


う、 10 * 100000000000000000000000000000000000 みたいなのが普通に出来ない。なぜだ。


うわー、発見。

ruby_frame->orig_func なんて設定してないもんだから、rb_num_coerce_bin でとちってる。うーん、こういうのはアリなんだろうか。

coerce に演算子を渡してないもんだから、どうやってその計算をやるのかなあ、って思ってたんだけど、ここでグローバル変数(環境)の受け渡しか。

うーん。どう対応したもんかなあ。

_まつもと(Sun May 16 06:36:52 JST 2004)

 基本的に飲みません。たまに麦茶とか。

_ささだ(Sun May 16 08:04:53 JST 2004)

 「松江のおいしい水」でRubyは出来てる説は違ったのですね。

_まつもと(Sun May 16 20:19:04 JST 2004)

 米子ならともかく松江の水はそんなにおいしいとは思わないなあ

_15(Sat)

メソッドフレームなどを、昨日のとおりに作り変えようとしたけど、評価順序の関係から、駄目だということでした(reciever の評価が最初に行われなければならない)ので、また考え直さなければならない。

となると、やっぱり先頭に self が来ないといけないのか。うーむー。どうしたもんかな。

きれいなのは、やっぱりフレームを先に作ってから引数を評価するっていう方法なんだけど。そうなると、命令が一個増えるし。 でも、それ以外方法がないような気がしてきた。

こうなったら、いっそ、管理用スタックを作るかなぁ。

もう少し駄目な案として、self を send 時に dup する(先頭を dup して末尾にくっつける)があるけれど、相当だめぽ。


いっそ、dfp やめるか。で、全部作り直してみる、とか。

通常、関数内関数をアクセスするときは、内側のスコープから外側のスコープを見に行く。

(lambda (a)
  (lambda (b)
    (lambda (c)
      (display a))))

のとき、(display a) の a は、内側から外側のスコープに向かって3個目のスコープのあの辺のローカル変数取ってきて、っていう命令になると思う。少なくとも俺はその命令列しか見たことがない。

これを、逆にする。つまり、一番外側から 1個目の a ってなって、たとえば c への参照なら外側から内側に向かって 3個目、ということになる。

たいていのプログラムの場合、一番内側のスコープの変数を参照することが多いため、内側からn個ってことになる。でも、ruby の場合、2.0 からどうするって話でブロックローカル変数になりそうなものがずいぶんと減る。もちろん、皆無じゃないが、減る。なので、これを外側から見るようにしたらどうか。

とか考えたけど、やっぱり無理があるのでやめ。


しかし、やっぱりどうやるかわかんないなー。制御用スタックを用意するのは、やっぱり管理情報が増えちゃって駄目。


一番簡単な方法として、やっぱり reciever を評価するタイミングなんて誰も気にしないから、無視するって方法。でも、それはやっちゃいけないんだと思う。


一晩考えても思いつかなかった。寝坊したけど。

直すのが難しいバグって言って開き直っちゃおうかなあ。


直すのが難しいバグってことで開き直ることにしよう。(話を聞いてくださってありがとうございます>RHGの人々)

解決策としては、やっぱり一番したにつんだスタックを上にコピーするコードを追加するってことで、神経質な人にはそっちを使ってもらうってことで。

決めた。ということで、これで実装してしまおう。


なんか後で後悔しそうだなあ。


class C
end

C.module_eval{
  define_method("@!@"){
    p 1
  }
}

C.new.send "@!@"

知らんかった。うわー・・・。

_nobsun(Sat May 15 13:24:22 JST 2004)

 RHG

_14(Fri)

ko1@atdot:~$ svnadmin recover /var/svn/nadoka
Please wait; recovering the repository may take some time...
svn: DB_RUNRECOVERY: Fatal error, run database recovery

うーん、これはどうしたものか。やっぱり毎日バックアップ取っとくべきだったなぁ。

でも、viewcvs 経由では見えている。svnadmin dump は出来ない。

実は、冗談じゃなく dump を cvs に突っ込むのが正解だったのかもしれない。


パーミッションが駄目だったってオチ。いつのまにか www-data がなんか書いてたんだけど、なぜ www-data がDBにアクセスしてんだろう。というか、書き込むなよ。

これは、どう対応するべきなんだろうなぁ。www-data が書き込んだデータのグループに svnuser を追加してもらえばいいんだろうけど。うーん。やっぱり apache2 にしないのがいけないのか。

しかし、いつ、なぜ。readイベントでもログは書かれるんだろうか。


お、アンダーバーが抜いた。


ローカルではシステムの認証にしてほしいけど、svn はそれができないんだなぁ。


setconstant id
stack: klass val => 

を、

setconstant id
stack: val klass => 

に変更


self a1 a2 ... aM l1 l2 ... lN [FRAME] [STACKAREA]
^
lfp

みたいなスタックの使い方の場合、lfp というレジスタは、まぁ用意するとする。本当は、変数アクセス時、SP-X で lfp+Y は出るけど、それは面倒なのでやらないこととする。

さて、[FRAME] 位置を知らなきゃいけないんだけど、これをどうすればよいか。[FRAME] 位置を指すレジスタを一個用意するという案もある。M+N を知る方法さえあれば問題ない。[FRAME]情報にどれくらいの頻度でアクセスするか、というのも問題になる。これは、メソッドから返るとき、スタックを巻き戻すとき、ブロックを参照するとき(ブロック情報は[FRAME]内に入れようと思っている)。end はできる限り早く終わらせたいと考えると、レジスタで [FRAME] 位置を持っておくこともできる。

もしくは、lfp を [FRAME] 位置へおいておき、ローカル変数は -x としてアクセスする。たとえば、a1 にアクセスするときは lfp[-M-N+1] となる。self は lfp[-M-N] となる。

レジスタ一個減らせるから、マイナスでアクセスするかぁ。あー、でも、selfを簡単に得ることが出来なくなっちゃうな。

いっそのこと、

a1 a2 ... aM l1 l2 ... lN self [FRAME] [STACKAREA]
                          ^
                          lfp

にしようかなぁ。でもそうなると、評価順序が args, self というようになってしまう。この辺は許容範囲としてもいいのだろうか。それとも、やっぱり self, args, block の順番じゃないとまずいだろうか。

あ、でもスタックを巻き戻すとき、結局 M + N という情報が必要になる。

M+N の情報は、コンパイル時にわかるので、 end 命令のオペランドに持たせてしまう、という手もある。

例外発生時の巻き戻しに必要な M+N は、iseq(InstructionSequence: 命令列の情報を格納したオブジェクトへのポインタ)を見ればいいような気もする。そうなると、iseq はやっぱりフレームに積んでおかなきゃならないかー。

結局こんなところかなぁ。

-------------------------------+-----------------------------------+------
a1 a2 ... aM l1 l2 ... lN self | MAGIC_M block pc lfp dfp iseq _ ~ | [stk]
                           ^
                          lfp

フレーム 8 word か。やっぱりでかいなぁ。

う、やっぱり穴もある。どうしようかなぁ。


frame を積む命令を用意すれば、ほかのデザインも考えられるけれども。どうしたもんかいのぉ。あと、制御用スタックを別にする、か。

ブロック実行中の dfp も考え出すと、フレームの参照を場合わけしないといけなくなるのが穴。それは遅いような気がする。

-------------------------------+-----------------------------------+------
a1 a2 ... aM l1 l2 ... lN self | MAGIC_M block pc lfp dfp iseq _ ~ | [stk]
                           ^      ^
                          lfp     dfp
...

--------------------------------+--------------------+------
da1 da2 ... daP dl1 dl2 ... dlQ | MAGIC_B pc lfp dfp | [stk]
                                   ^
                                  dfp

dfp は必ず MAGIC を指すようにすればいいのか。

あと、P+Q の情報が取れなくて困るかー。うーん。

フレームの中の情報も、もうちょっと整理しないとアレだな。

[args]                    | [local frame]       | [dynamic frame]    |
--------------------------+---------------------+--------------------+------
a1 a2 ... aM l1 l2 ... lN | self block _ ~ iseq | MAGIC_M pc lfp dfp | [stk]
                              ^                    ^
                             lfp                  dfp
...
[args]                          | [dynamic frame]    |
--------------------------------+--------------------+------
da1 da2 ... daP dl1 dl2 ... dlQ | MAGIC_B pc lfp dfp | [stk]
                                   ^
                                  dfp

こんなふうにしておけば、綺麗にまとまるかな。

でも、やっぱり P+Q の情報を置く場所がない。困ったな。スタック巻き戻せないよ。がんばって iseq からその情報を取り出す?

もちろん、MAGIC* はデバッグ用、と思ってたんだけど、結局なんだかんだ情報詰め込むために必要になるかも。


なんとなく、今まで思いついたので一番綺麗な気がするので、これで実装しなおしてみよう。


正直、何が local でどの辺が dynamic なのか、よくわからないのだけど。


で、これを closure にするにはどういう工夫が必要ですか。

lfp や dfp をきちんと辿れれば・・・、って、前の dfp へ辿るポインタが無い。マズー。

[args]                          | [dynamic frame]            |
--------------------------------+----------------------------+------
da1 da2 ... daP dl1 dl2 ... dlQ | prevdfp MAGIC_B pc lfp dfp | [stk]
                                           ^
                                          dfp

こんなかなぁ。

うーむ。


例外が起こったときに辿るのはフレーム中の pc, lfp, dfp だから、P+Q なんて知らなくてもいいんだな。相変わらず頭が悪い。


あれ、end 時も、別に lfp, dfp をざくっと戻せばいいんだから、って思ったけど、sp が戻せないか。sp 積むのもアレだしな。

end のオペランド、ブロック中とブロック外で違うものになるのだなぁ。


とりあえずこんな感じかなぁ。ああ、現実逃避は楽しいなあ。


return が結構見やすくなりはしないだろうか。

lfp を超えるまでスタックを見てって、ensure 探していく、という処理になると思う。


練習問題。

def iter(x, y)
  yield(x+y)
end

def m(a, b)
  iter(a, b){|c|
    p c # この辺
  }
end

m(10, 20)

のもっとも深いところ。

      self false nil nil main_iseq    | MAGIC_M main_pc main_lfp main_dfp |
10 20 self BLOCK nil nil m_iseq       | MAGIC_M m_pc m_lfp m_dfp          |
30                         prevdfp(0) | MAGIC_B i_pc i_lfp i_dfp 30

こんな感じになるんだろうか。


1メソッド呼び出しで、メモリのストアが 8 word 以上。うーん。やっぱ遅い。でも、これ以上情報を削っちゃうと・・・。


ところで上の例で c がローカル変数だった場合、どうやるんだろう。思いつかない。まず、コピーするような処理を挟むんだろうか。でも、それ以外ないよなぁ。


うーん、どうやっても速くならなさそうだなぁ。


p begin
  1
ensure
  2
end

さて、これはなんて出力される?(知らなかった)


orkut の shiroさんの写真ってshiroさんなのでしょうか。


アンスコ優勢。


nadoka に日本語ドキュメントなんて必要ですかねぇ。

_こーのいけ(Fri May 14 02:47:07 JST 2004)

 差分dumpも可能だったような覚えが。

_ささだ(Fri May 14 02:59:17 JST 2004)

 差分dump溜めてても、復元面倒そうですよ。

_shiro(Fri May 14 08:17:21 JST 2004)

クロージャがある場合は環境フレームと継続フレーム(activation record)を分けるのがやりやすいと思うんだけど、local frameが環境フレームでdynamic frameが継続フレームってことかしらん。

環境フレームと継続フレームのハンドリングはRichard Kelseyの"Tail-Recursive Stack Disciplines for an Interpreter" がわかりやすかったです。readscheme.orgあたりで探せると思う。

_KM(Fri May 14 09:11:20 JST 2004)

 DOS のプログラムで bdiff というバイナリ比較・更新プログラムがあったぞな.差分情報がテキストで生成されるようにすれば最後の手段に手修正が使える(のか?).ちょっと前にケータイアプリ系プログラムのアップデート技術として某社が特許とか日刊工業あたりで流れたような記憶があるけど.

_ささだ(Fri May 14 12:17:54 JST 2004)

 以前前田さんにもご指摘いただいたのですが、ずいぶんと用語が混乱しています。私は frame を continuation frame としか考えていませんでした。環境フレームだと、ローカル変数などもすべて含むとは思うので、args + local frame = 環境フレームなのだと思います。dynamic frame と書いたのは、継続フレームそのままだと思います。でも、全然 dynamic じゃない罠。

_shiro(Fri May 14 15:38:59 JST 2004)

 継続フレームならdynamicでいいんじゃないですか。orkutの写真は私です。ある年のハロウィンの日、あれで出勤して仕事しました。

_ささだ(Fri May 14 17:28:42 JST 2004)

 楽しそうな職場だなぁ。

_13(Thu)

当たり前なんだけど、比ゆは危険だなぁ。


今回の投票はおちが思いつかなかった。


うーむ、commit ごとに dump するのか。たしかに安心。

でもなぁ。ディスク容量が(弱)。

コミットするごとに dump してメール。うわー。

コミットするごとに winny のネットワークに。うーん。


coins 報告会。いまだに場違いな気がする、というか場違いなんだろうな。やっぱり。喋ってる内容が全然わからない。とくに、自分の進捗がなかった場合、自分の報告が駄目だった場合。駄目すぎ。

なぜ strcut{...} な配列があった場合、並列化できないんだろう? 依存性解析、そんなに大変だろうか。その構造体1変数自体をキーに探せばいいだけな気がするんだが。どうせポインタとか出てきたらあきらめるんだから。

せめてデータフロー、コントロールフロー解析とかくらいして、その辺で最適化するような何かくらい、一回やっとかないと駄目かな。本を読んでもさっぱり覚えられない。頭悪い。


パターン関係とか、 国立オリンピック記念青少年統合センターが好きですね。面子が一緒だからかな。


実は、なんとなく haskell-jp のMLアーカイブを公開しようかなぁ、と、帰りの電車でふと思っていたりする。タッチの差だった(ぉ。シンク(略)

_12(Wed)

rubyの load(file) はどうやって環境をまっさらな状態に戻してるんだろう、と思って eval.c#rb_load(fname, wrap) を眺める。

うーん、こりゃぜんぜんわからん。なにやってんだかわからん。いや、それは言いすぎだけど、でもよくわかんない。状態の数に頭が追いつかない。


ビックサイトいってました。とりあえず、未踏関係のところで気になったところの話を聞いてきた。

ビジネスショーは面白くなかった。粗品もあんまり無かったし。


メモ。タイトルなどはhttp://www.ipa.go.jp/event/ipax/spring2004/index_list.html より。

e-3 番原 睦則 神戸大学 学術情報基盤センター 講師 
Javaによる分散協調制約解消システム 
田村 直之,井上 克己,川村 尚夫,玉置 久 

フロントエンドとして OOo を使った制約解消システム。Calc で
さくさく使えるのがイイ。OOo のアドオンの説明などを聞いてし
まった。

今後は Globus につなげたいらしい。

e-8 平林 俊一 富士通(株) 
WideStudio for T-Engine 

Ruby 関係の話を聞きたかったが、聞けず。
  
e-11 小林 憲次   
KVerifier:C/C++ プログラムのテスト・検証 (行列電卓ソフトへの適用) 
  
考えていたものとは結構違っていた。

e-13 登 大遊 筑波大学第三学群情報学類 
SoftEther VPNシステム 
  
ビジネスがうまい人だと思う。

e-14 山田 育矢 (株)ニューロン 代表取締役社長 
P2P関連製品・研究成果の展示 
佐藤 大介・荒木 英士・須之内 雄司 

500万円って高! ベンチャースゲー。

e-15 近藤 秀和   
次世代高機能Webブラウザと検索システム 
柴田 祐介 

いろいろがんばってる部分がすごいことはわかるんだけど、
どのへんが未踏なのか謎。いや、開発者発掘というシナリオ
だけなら納得。

e-16 永田 周一 同志社大学 学生 
情報共有支援システム「NOTA」 

紙の人だと知らなかった。ActionScript で 2,3千行くら
いの作品らしい。すごい。いろいろと。
    
e-23 鈴木 元 アカデミアシステムズ(株)代表 
多人数同時参加型遠隔教育・遠隔会議システム 
  
Squeak でここまでやれるんか! という例。
クライアントサーバ一式は50万円らしい。12クライアントまで。
(レイアウトの関係)
でも、非営利利用なら、サーバ貸してくれるかも、だって。

e-27 田村 修 (有)リカージョン 取締役 
自動着色ソフトウェア「はいから」 
  
面白かった。

e-28 園田 修司 ポップニート 代表 
シルエット: ハイパーリンク空間からのネットゲームコンテ
ンツ生成支援 
  
面白かった。でも、一発ネタ以上のものにするにはどうする
んだろう。

e-33 梅村 恭司 豊橋技術科学大学 教授 
未踏テキスト用キーワード抽出システムとシソーラス構築システム 

やっぱすげー、企業は。
  
e-34 難波 英嗣 広島市立大学 情報科学部 講師 
Web上のデータを中心とした複数論文データベースの統合 
阿辺川武(東京工業大学)、奥村学(東京工業大学)、
齋藤豪(東京工業大学) 

素晴らしい。IPSJはこのデータベースに登録するべ
きだと思う。人類の資産ですよ。
個人的にやろうと思っていたことだけど、ここまで素敵なものが
あるなら作る必要ないかも。あとはディスカッション部分があれ
ば。

e-40 品川 高廣 東京農工大学 助手 
安全なインターネットサーバ実現のための基盤ソフトウェア 
  
3個以上のドメインがあった場合、どうやるんだろう。

2 株式会社タイムインターメディア Kahua-Webアプリケーション
プログラムをもっと簡単に書こう 

客が少なかった(ぉ


12 株式会社オークニー オープンソースGIS GRASS、MapServer 

地図サーバなんていうソフトウェア自体を知らなかった。

14 株式会社グッデイ デスクトップ開発基盤の整備 

apt の GUI クライアント。

18 株式会社アイエイエフコンサルティング オープンソースの
企業データ分析ツール OpenOLAP 

よくわからなかった。

20 株式会社アックス ユビキタスOSの開発 

MMU付の組み込み向けLinuxの改造。システムコールをしないように、
情報を得るだけのシステムコールは(read onlyな)メモリを見るだ
けにする、IOはmemory mapped io にする、などの工夫を libc に
入れてしまう(つまり、open したら mmap するということか?)

でも、Symbian も請け負ってるらしい。

23 株式会社SRA先端技術研究所 アクセス制御機構を有するセキュアWebDAVの開発 

WebDAV 自体に認証系が無かったのが意外。広まるかなぁ?

【特 別 展 示】 
  ビジネスクリッドコンピューティングプロジェクト 

人が群がってた。


こう見ると、ほとんどのブースを見てないな。今見直してみると、興味のありそうなのも結構あるようなんだが。

もったいない。でも、明日はもういけまへん。


コンピュータ科学者がめったに語らないことを読んでたんですが。

たとえば、ruby のあるリビジョン 3.16 を注意深く読んだら悟りが開けちゃったりするんだろうか(しないだろうなあ)。


:"#{expr}" なんてあったのか。知らなかった。


luna scape の人たちって、ほとんどM岡研以外のアンテナの人たちだったのか。うーん、知らなかった。早稲田の方だとは見たんだけど。

あ、やべー、失礼なこと聞いちゃったかも。

しかし、なんで俺 BugBrowser 使ってるのかなぁ。Luna scape もちょこっと使ってたんだけど、何が気に入らんかったのだろう。思い出せん。


そういえば、OSSにする点に否定的な意見と、その理由を聞いた気がするが、ちょっとその論はどうかなって気がした。


WinCVS のコマンドライン版で、ローカルファイルのリポジトリ指定が出来ない(やり方がわからない)のに初めて気づいた。Windows上にローカルリポジトリ作ったこと無かったからな。うーん、どうやるんだろう。

# Z:\ をcvs root にしたい場合
cvs -d :local:z:\ init

こうやるらしい。へぇ〜。:local: の省略はできないのね。


そういえば、NOTAの人にお話を聞いたんですが、あれだと Wiki のコンフリクト問題が起こんない、って言ってたけど。それはなんか違うと思う、って反論したんだけど、あんまり受け入れてなかったみたい。

たとえば、BitChannel では CVS にそのあたりをうまくやってもらえるんだけど、比べる対照としてはこっちだと思う。

もちろん、conflict が(コンテンツによっては)出にくくなるのも事実だけどさ。そもそも、長文を書かせないシステムとも言える。

リアルタイム性云々も、(長文を複数のクライアントから書くような場合 =~ Wiki でコンフリクト起こるような場合において)実際にやってみたら、あまり使い物にならないんじゃなかろうか。実機があったから、ためさせてもらえば良かったんだなぁ。


激しく今更感があるが、nadoka に sstp しゃべったり聞いたりする bot 加えてみようか。


cvs サーバのどの辺が嫌なんだろう。あと、そんなこと言ったら大切なデータはみなテキストにしないといけないような・・・。


うーん、眠い。


LL は Lazy Lazy だったのか!

_しゅ(Wed May 12 21:06:19 JST 2004)

 僕は Lunascape を常用してます。たまに困るのは、まともに FTP できないことと、URL を表すアイコンをドラッグできないこと。

_ささだ(Wed May 12 21:33:14 JST 2004)

 IEではまともにFTP出来るんですか?

_fukumori(Thu May 13 06:37:51 JST 2004)

 僕もIEでFTPってうまくいかないよね、と書こうとしたのですが、手元のIE6でftp.sra.co.jpとかにアクセスしてみるとまともに使えてびっくり。Lunascapeだとダメでした。

_11(Tue)

うわ、ACLのセミナーどんどん大きくなるなぁ。これは是非行きたいかもしれない・・・。というか、まだ席あったのか。

行きたいけど、木金なんだよな。


リテラル系は動くようになった。

シンタックスも実装していた分は動くようになった。


putselfclass は必要か。

putself と getclass に分けるべきか。でも、gethoge って違う意味な気がする。

うーん。これが必要になるのは定義系だけど、定義系をそんなにがんばってもしょうがないから、命令実行中に現在のコンテキストを判断するか。


健康診断。特に問題ないっぽい。


メソッドの評価順序からメソッドフレームを考え直してみる。

recv.method(a1, a2){ block }

があったとき、現状の評価順序は

class C
  def m *args
    yield
  end
end
(p :recv; C.new).m((p(:a1); 1), (p(:a2); 2), &(p(:block); proc{p 1}))

=>
:block
:recv
:a1
:a2
1

を見ると、block, recv, a1, a2 っぽい。

まぁ、block を最後に持ってきても多分問題ないだろうから。前から順番だと考える。

そうすると、recv, a1, a2, block という感じか。メソッドフレームも、これに準じたものになる、のかな。

block がそこにあると、*arg なのの対処が大変か。なんとかならないかな。


うわー、気づかなかった。

Ruby仮想マシンにおけるスキャナジェネレータの実装 
  木山 真人,芦原 評,梅野 英典(熊本大学) 

北海道の楽しみがひとつ増えた。

スキャナジェネレータって、flex みたいなのかな。どのへんが RubyVM specific なんだろう。


def m
end

m(&false)

は wrong argument type FalseClass (expected Proc) (TypeError) だけど、メソッド起動時にこれを判断する必要はあるんだろうか。あるような気もする。


def m(*arg)
  ...
end

m(*[1,2,3])

って、異様にいやらしい。よく使うけど。

なんか、根本的に考え直さないといけないような気がしてきた。


別に、受け側のメソッドは関係ないか。

展開は、send の中でやらないといけないのだなぁ。


SACSIS 2004

フロントエンド実行 
小西 将人(大阪工業大学),五島 正裕,中島 康彦,森 眞一郎, 富田 眞治(京都大学) 

うーん、このタイトルだけだとよくわからんなぁ。


send は、二転三転しますが。

なんとなく決めました。あー、駄目だ。self の位置が決められない。要するに、NODE_CALL のとき、self を積むべきか、積まないべきか、ということ。また、積むのならどこに積むか。いや、積むのなら最初しかありえないんだが、最初においておくと、命令統合できない。

send id, argc, block, flag, cache

stack: self, arg1, arg2, ..., argN (, proc) => ret

flag:
  has reciever?    0/1
  expand_lastarg?  0/1
block:
  block or (proc object on stack top) or none
cache: ?

けちけちフラグにしないで、1 word つかっちゃったほうがいいかなぁ。オペランド統合で有利になりそうだが。

いや、どうせ 4とおりしかないのなら、それだけパターン作ればいいのか。


あれ、前 size が負だったら expand って考えていたような気がするな。どっちがいいんだろう。


NODE_NEWLINE が無いので、代わりに NODE_LAST を使おう。


命令列全部をGCかけないようにした。つまり、結局コンスタントプールみたいなのを用意して、そいつをGCするようにした。でも、コンスタントプールへの参照は行わない。純粋にGC用。

NODE_LAST だと gc されないなぁ、というところから、議論を思い出して実装。

というわけで、send まで昔の状態に戻った。これでやっと動かせる。スタックフレームのデザインとかやり直さないと。


あるメソッドで使うスタックの最大数を考えてみる。

まず、そのメソッドの命令数(insnNum)以上のスタックは積まれないだろう。多分。

もうちょっと考える。順番に見ていくと、命令ごとのスタックの使い方にしたがって、その数を増減していって、順番に見ていく。で、一番大きいところがその値(stackMax1)。

ここで、ジャンプ命令があったときにどうなるかが問題になる。でも、機械的な変換なら、ある地点でのスタックの高さは同じであるだろうから、これは問題にならない(ほんとか?)。

手作業で命令列を並べたとき、ぐちゃぐちゃになる危険はある。さすがに、それは面倒見れない。

また、最適化したときにどうだ、という心配があるが、バグじゃなければ、高さは変わらないよなぁ、多分。変わりそうになったとき考えよう。

stackMax1 < insnNum

とりあえず面倒くさいので insnNum でスタックオーバーフローのチェックしよう。

・・・あまりに雑すぎるかな。stack push する可能性のある命令の数を数えるだけにしておこうか。


ファイル名を compiler.c か compile.c にするかで悩む。parse.y だから、やっぱり compile.c なのかなぁ。


stack caching 対応表。


0 pop, 1 push
xx - ax
ax - ab
bx - ba
aa - ab
ab - ba
ba - ab
bb - ba

1 pop, 1 push
xx - ax
ax - ax
bx - ax
aa - ab
ab - ab
ba - ba
bb - ba

1 pop, 0 push
xx - xx
ax - xx
bx - xx
aa - ax
ab - ax
ba - bx
bb - bx

x pop, 0 push のときは、後のことを考えて適当に pop しておいたほうがいいのか。いや、多分良くない。pop していいのかどうかの分岐が入りそう。そうすると、static には終わらなくなる。

compiler は、すでにスタックが積まれているかどうかの情報を知っているので、なんとかなると言えばなるか。でも、そうするともう1セット命令が必要になる。popするのが後か先かの話だけなので、やっぱりやらなくていいような気もする。

自動的に作る命令の名前は、insn_AB_CD になるんだろう。多分。


分岐の飛び先が、常に同じスタックキャッシングしていると仮定できるか。なんとなく出来ないような気がする。少なくとも、a か b、どっちかの状態になっている気がする。

そのため、飛び先は常に xx になるようにしなければならないかな。もうちょっとなんとかしたいが・・・。

例の論文を読み直すと、やっぱりその辺が問題だとか書いてる。飛び先と飛び元でconventionを作っておけ、って書いてあるんだけど、どうするべきなのかなあ。で、それを自動でやるには。

一度とりあえず作って、verify して、もし食い違ってるのがあれば、それを修正するようなアプローチに・・・するのはうざったいなぁ。


超簡単なパターンで試した限りではあんまり考えなくてもいいのかもしれない。

そもそも、分岐先がキャッシングしてない状態から始まってる。例のとり方が悪いか。

i = 0
while i<10
  i+=1
  j=0
  while j<10
    j+=1
  end
end

=>

0000 putliteral      0                                                (   1)
0002 setlocal        2
0004 getlocal        2                                                (   2)
0006 putliteral      10
0008 send            :<, 1
0011 unless          48
0013 getlocal        2                                                (   3)
0015 putliteral      1
0017 send            :+, 1
0020 setlocal        2
0022 putliteral      0                                                (   4)
0024 setlocal        3
0026 getlocal        3                                                (   5)
0028 putliteral      10
0030 send            :<, 1
0033 unless          46
0035 getlocal        3                                                (   6)
0037 putliteral      1
0039 send            :+, 1
0042 setlocal        3
0044 jump            26                                               (   5)
0046 jump            4                                                (   2)
0048 putliteral      nil
0050 end             

を、スタックキャッシングな命令列にしてみる。

0000 putliteral      0          xx -> ax
0002 setlocal        2          ax -> xx

DST:
0004 getlocal        2          xx -> ax  <─┐
0006 putliteral      10         ax -> ab      │
0008 send            :<, 1      ab -> ax      │
0011 unless          48         ax -> xx  ──┼──────┐
0013 getlocal        2          xx -> ax      │            │
0015 putliteral      1          ax -> ab      │            │
0017 send            :+, 1      ab -> ax      │            │
0020 setlocal        2          ax -> xx      │            │
0022 putliteral      0          xx -> ax      │            │
0024 setlocal        3          ax -> xx      │            │
                                              │            │
DST:                                          │            │
0026 getlocal        3          xx -> ax  <─┼─┐        │
0028 putliteral      10         ax -> ab      │  │        │
0030 send            :<, 1      ab -> ax      │  │        │
0033 unless          46         ax -> xx  ──┼─┼─┐    │
0035 getlocal        3          xx -> ax      │  │  │    │
0037 putliteral      1          ax -> ab      │  │  │    │
0039 send            :+, 1      ab -> ax      │  │  │    │
0042 setlocal        3          ax -> xx      │  │  │    │
0044 jump            26         xx -> xx  ──┼─┘  │    │
                                              │      │    │
DST:                                          │      │    │
0046 jump            4          xx -> xx  ──┘  <─┘    │
                                                            │
DST:                                                        │
0048 putliteral      nil        xx -> ax  <────────┘
0050 end                        ax -> ax

うーん、やっぱり簡単すぎるかもしれない。

しかし、無駄な命令が多いなあ。


こういう図を描いてくれるツールがほしいなぁ。


この例だとstackに積む場合が無いのか。でも、ローカル変数に突っ込んでる部分は無駄っぽい。


nd_line だと、たとえば while の終端の行数ってわかんないですよねぇ。


IPAX 行きたかったのですが、今日は健康診断で駄目でした。明日行きます。nobsunの雄姿が見れなかったのが非常に残念。


send が激しくでかくなった。6 word 食らう。キャッシュラインの半分以上か。うーむ。


というわけで ACL のセミナー申し込みました。


yarv をsvnリポジトリに突っ込んだ(http://www.atdot.net/viewcvs/yarv/)。


gcc で動かなかったので直した。疲れた。

_shiro(Tue May 11 08:51:23 JST 2004)

 きっと面白いよ〜 来れば〜

_ささだ(Tue May 11 10:33:24 JST 2004)

 うーん、行ってみたい。

_み(Tue May 11 12:50:43 JST 2004)

 行きなさい、ぜひ!

_10(Mon)

C ext で、printf で出力していたものを String オブジェクトにしようと思って、ごちゃごちゃやってみるけど相当汚い。

きれいに書くにはどうすればいいんだろう。

  j = printf("== disasm: %s", iseq_inspect_char(self));
  for(i=0;i<72 - j;i++){  printf("="); }
  printf("\n");

=>
  rb_str_cat2  (str, "== disasm: ");
  rb_str_concat(str, iseq_inspect(self));
  for(i=RSTRING(str)->len;i<72;i++){
    rb_str_cat2(str, "=");
  }
  rb_str_cat2(str, "\n");

こんな感じ。

もう、これなら平気だろってバッファもって sprintf するしかないか。バッファオーバーフローなんて怖くない(多分)。


ちゃんと snprintf 用意してくれるんだなぁ。便利だなぁ。


Intel の方向転換って、HT(SMT) からデュアルコア(CMP) への転換という意味なんだろうか。それはそれで理に適っているが・・・。


5ヶ月経つとやっぱり何かいてあるんだかさっぱりわからん。

rb_str_buf_* ってなんだっけ・・・。もうぜんぜん覚えてない。


うー、ソフト作って逮捕か・・・。


やっぱり略した変数名はよくないな。ぜんぜん意味が思い出せない。


やっとコンパイルがとおった。とおっただけ。


shiroさんのメールはフッタが手書きだということを発見した。


TAやっていたら、「(C言語のファイルを)コンパイルした結果(のファイル)が文字化けしてるんですけど」と言われた。


ループの止め方。

def m
  true
end

Thread.new{
  sleep 3
  def m
    false
  end
}

while m()
  p 'hoge'
end

まつもとさんの日記の検索りふぁらには、たいていメイド服関係がある。


やったー。北海道行きけってー。やったー。(SACSIS 2004 のアルバイト)

さて、余分に滞在して遊ぶかどうか、さっさと決めなければならないそうなのですが、どうしようかな。

一人でだらだら歩くのもアレかもしれない。



#define GetInsnVal(obj, iobj) \
  Data_Get_Struct(obj, struct insn_object, iobj)

struct insn_object{
  int insn_id;
  unsigned long line_no;
  VALUE operands;
};

...

#define OPERAND(insn_obj, i) \
  (RARRAY(((struct insn_object*)DATA_PTR(insn_obj))->operands)->ptr[i])

さて、こういうのはありか。


29日にPTTなので、やっぱり遊ばずに帰ることになりそう。ちょっと残念。


http://blade.nagaokaut.ac.jp/cgi-bin/scat.rb/ruby/ruby-ext/2270

一生懸命考えたんだけど、「世代別GCで効率が悪くなるかも」「このAPIではインタプリタ構造体を渡せない」理由がわからない。

効率が悪くなるのは、mark時の処理が複雑になるから、自由度が減るから? 後者はやっぱりよくわからない(マークがループしてしまう?)。後者はわからないとやばい気がする。明日までにもうちょっと考えて質問しよう。

ちなみに、推奨されないのなら、どうするべきなんだろうか。全部Cで賄うか、全部attributeに突っ込むか。うーん、でも本質的に無理だよな。たとえば YARVのスタックだと(システムに組み込まない限り)。


RObject と RData をくっつけちゃうのはどうなんだろう。mark はしないで、iv_tbl経由でやれって。


学校に書き途中のソース置いてきてしまった。やっぱ、なんらかの共有手段は必要だなぁ。

_KM(Mon May 10 16:46:35 JST 2004)

 中身を見ようとさえしないよりは(→文字化け).

_9(Sun)

どうも SSH port forwarding でsvnみれないなぁ、と悩んでいたら、接続先のtypoだった。

xinetd に -t すれば、認証要らないかなーって思ったけど、なんとなく要るっぽい。おかしいなぁ。

そうか、ローカルで起動する svn は、サーバが -t かどうかなんて知ったこっちゃないか。

svn+ssh って遅いからいやなんだよな。

cvs の連想で、svn_rsh とやってはまる(正しくは svn_ssh)。

うーん、この速度差、何とかする方法は無いものか。

誰か port forwarding で svn を制限なしに使う方法って知りませんかね。


いいかげん、バックアップをなんとかしたいんだけど、いい方法が思いつかない。

毎晩dumpして、前日と比較する、とかやるしかないかなぁ。


はてなさんは凄いと思う。Google は最初に凄い額の投資を受けていたと聞いた記憶があるんだけど(ソースは見つけられなかった)、その何分の一かでも投資するってものがない日本は、やっぱだめだと思う。

知らないだけでそういうのがあるのかもしれませんが。

って、株式会社だったのか。


YAML#Store が ftools を pstore 中で require することを期待してるんだが、pstore.rb では fileutils を使うように変更しちゃってるもんで、YAML#Store は動かない。

すでに znzさんが指摘しているらしいのだが、反応がないらしい。


limechat の nick conflict の対応はだめだと思う。


ruby mswin32板を(ビルドして)インストールしようとしたら、VC6入れてないことに気づく。どうしようかな。


一般教養と思って読み進めて、すでに4冊読了。爆笑しながら読んでいた異世界の物語ですが、だんだん気色悪くなってきた。


バグ、というかクライアントの仕様がどうしてもわからない。もうお手上げ。うーん。


+1 と +2 ってどっちが早いんだろう。x86 の inc と add。

やっぱり vc がないとまずそうで、面倒なので vc6 を入れる。

貴重なキャッシュラインを占有しちゃうので、やっぱり別にしよう。

とりあえず sp6 を入れる。

_青木(Sun May 09 02:11:08 JST 2004)

家のサーバでは毎日バックアップしてます。

_ささだ(Sun May 09 03:24:48 JST 2004)

 毎日commitするわけじゃないから、毎日スナップショットをとっておくのは無駄かな、って思うのは貧乏性でしょうか。

_青木(Sun May 09 23:36:36 JST 2004)

 うん。

_ささだ(Mon May 10 16:10:36 JST 2004)

 ガーン

_8(Sat)

というわけで、omokon はあきらめて、omokon回してる人のファイルをミラーさせてもらう。

fmirror というのをはじめて使う。便利だなぁ。


CNN.com - 'Sasser' suspect held in Germany - May 8, 2004(memo)。高校生かぁ。


artonさんのところからのりふぁらが大量に。artoned。ごろ悪いな。でも、どの辺がシンクロなのかわからなかった(リンク張り間違え?)。あと、日記のバグ発見。


女性に対する小僧に代わる言葉ってなんだろう。


別に男性限定の言葉じゃないのか。

goo 辞書 - 小僧


でも、カメラ小僧という表現には違和感を覚えたなぁ。

_arton(Sat May 08 21:40:05 JST 2004)

 たまたま萩谷氏の書籍に言及してから、笹田さんのとこ見たら、丁度萩谷氏の講義録のURLが出てたからだけど……

_ささだ(Sat May 08 21:42:00 JST 2004)

 あー、なるほど。あれは萩谷先生の本だったのですか。

_arton(Sat May 08 22:29:35 JST 2004)

 まだ京大の助手だった頃の本だと思います。軽妙洒脱な語り口ですごくおもしろいです(ソフトウェアをネタにした気軽な読み物です)。僕の知ってる範囲だとあおきさんや渡辺哲也さんも読まれていたような。今は、ああいうのって無いような気がするなぁ(あおきさんがノリは近いかな?)

_ささだ(Sun May 09 00:18:18 JST 2004)

 artonさんがそういう本を書くしか!

_青木(Sun May 09 23:38:23 JST 2004)

 ソフトウェア考現学は面白いですよねえ。 Amazonが在庫ありになってるのがちょっとびっくり。

_arton(Mon May 10 00:18:21 JST 2004)

 ところで、>日記のバグ ってどれでしょう?

_ささだ(Mon May 10 01:32:24 JST 2004)

 自分の日記のバグで、リンクが #d07 じゃなくて #d7 だったという。

_7(Fri)

ふとしたひょうしに http://nicosia.is.s.u-tokyo.ac.jp/pub/staff/hagiya/kougiroku/ がヒットしてしまってさあ大変。


http://www.shudo.net/diary/comment/kuttukibbs.cgi?url=2004apr.html%2320040502 に爆笑してしまった。

ラーメン食べてるときで、危なかった。


仮想マシンで、ベースポインタなしで作るとどうなるか考えてみる。

  • pros: スタックフレームが一個減る
  • cons: 複雑になりそう、命令列を比べるだけでは同じ変数を参照しているかどうかわからない(最適化時に不利になるかもしれない)

cygwin で telnetd を動かそうとしたけど、xinetd を入れるだけで挫折。うーん。

xinetd は動いたけど、telnetd が落ちる、といったところか。再起動しないといけないのかな。


login まで行ったけど認証できないな。rebootしないと駄目か。


ダメポ。sysvinit が xinetd を立ち上げてくれないのか。なぜだろう。


いろいろやったけどわからん。うーん。


うへぇ、尼崎まで行くのかよ。


/sbin/init -i をしてみると、xinetd の起動でこけているように見える。しかし、init.d/xinetd start は動くんだけどなぁ。


Excel2Latex(Excel2LaTeXのページ) というものを使ってみる。

tabular じゃなくてtable まで出してくれるのはおせっかいな気がちょっとした。私は center で挟むんだけど、それができてくれないかも。

使いなれた vtabular のほうが好きかも。でも、もう少し使ってみよう。

center って指定するところがあったか。


subversion の欠点が。.svn にリポジトリのコピーがテキストで入っちゃってるんで、ディレクトリのファイルにたいして再帰的にgrepかけると、そいつらがひっかかる。

_6(Thu)

user用 crontab を ... user cmd と書いてしまっていた。うごかねーはずだ。


やはり家のマシン(Celeron433Mhz)ではomokonはつらいので、t氏のomokon結果をmirrorさせてもらおう。うーん、楽でいい(というか、今までの苦労は何)。


はまった・・・。gcc3.4 にしたら、global_variable[...] = {0} で、bss領域に置かれちゃうんだね(data においてほしかった)。

前も、boehm gc まわりで同じようなのにはまった気がしないでもない。なんかオプションあるんだろうか。

もういっそのこと、bss の初期化やめてしまおう。


Bare LFs in SMTP に何度もひっかかる。うーん。やっぱり qmail-inject に渡してもらおう。


VC の _int64 を使うと、printf の書式は %I64d としなきゃいけない。gcc の long long を使うと、%lld としなきゃいけない。

さて、これをいかにポータブルに書くか。

うえぇ・・・。

vc7 では long long は _int64 になるのか。

めんどくさいので 64bit 捨て。


QuickML::MailSender を書き換えちゃえばよさそうだなぁ。

微妙にパッチをあててみたけど、駄目だった。sjis が入っちゃうと駄目なのかな。困ったなぁ。

qmail-inject に送ろうとしても、よくわからないのを smtp で送っちゃってるみたいだしな。


おうちのLinux機が掃除の振動でとまっちゃったらしい。これで止まるサーバ機って駄目だよな・・・。CPU の接続がゆるいらしい。


#300th PTT (in Japanese)。行くしか。


gauche-ml で聞いたんですが、MIT OpenCourseWare | Electrical Engineering and Computer Science | 6.001 Structure and Interpretation of Computer Programs, Fall 2002 | Projects

やっぱり mit-scheme なんだぁ、と変なところで感心。

_mput(Thu May 06 10:01:20 JST 2004)

 VCよくしらないんだけど、inttypes.hの印刷書式マクロ(PRId64とか)を使ってみては?

_ささだ(Thu May 06 10:40:17 JST 2004)

 うおー、C99ってこんなのがあるのか! でも、メインが VC6 なので無理ぽです。

_maeda(Thu May 06 11:58:21 JST 2004)

 Message-IDはMUAとか、メッセージを作る側がつけるものなので、QuickMLでつけちゃえば? <日時.pid.乱数@ドメイン名>とか。

_ささだ(Thu May 06 18:06:03 JST 2004)

 はい。Message-ID の問題はそれで解決すると思います。

_5(Wed)

うーん、ircd が起動しない。

  • c をつけたりしても、すぐに終了してしまうし、-s をつける(iauthの無効化)と起動しない(syslog出力なし)。-x では何を指定しても蹴られる。

うーん。

ソースから make したほうが早いかも。


ソースからやったら何も悩まずできた・・・。


omokonをもう少し考えてみる。

parseSpec がなんか変なのを返しているらしい。うーむ。

・・・mph-0.92.6.1-7m.i586.rpm にあげてみたらとおったらしい。なんてこった。やっぱりよくわからない。

zsh の 4.2 を omokon でやってみようと思ったら、//keihanna.dl.sourceforge.net/sourceforge/zsh/zsh-4.2.0-doc.tar.bz2 が取れなくてとまってしまった。


昔からやろうやとうと思っていてぜんぜんやっていなかったことをさっさと済ます。

puttyを各サーバごとにクリック一発で起動するようにしておく。putty.exe -load [config name] でいける。pagent とあわせて幸せ端末生活。

Using PuTTY


DeskStyle - Eureka


収集用(いままで手作業だった):

javascript:
  window.clipboardData.setData(
    "text","[[" + document.title + "|" + location.href + "]]");
  history.back();

連休は全部マシンのおもりで潰れてしまった・・・。なんてこった。


SD 2004/5 で、Transmeta の David Ditzel氏へのインタビューが載っているんだけど、

(動的プロファイルを)利用した最適化の実例を筆者は知りません。

おいおい、そりゃないだろう。いや、興味深い記事なんだけど。

トランジスタレベルでのシミュレータも作ったのか。すごい・・・。


WinSCP は日本語ファイル名(EUC)なファイルをきちんと読めない。どうしたもんだか。


QuickML Server はお知らせメール(消滅しますよ〜とか)を投げるとき、Message-ID を付けないのはなんでかなと思っていたら、QuickML.com のシステムでは付いてる。バージョンが違うのか、設定が違うのか。


 :hoge, hoge: 。


内側だけ cvs pserver をつける。外からは見えまへん。

はまったのは、システムによるユーザ認証ってrootしかできない(?)のね。ユーザをてきとーなのにしたら、ログインできなかった。


subversion のリポジトリがさくっと壊れた。dump して load したら直った。load するときは、create したリポジトリに流し込むのね。load が勝手に create するのかと思ってた。

バックアップは大切やなぁ、と思ったが、どのタイミングでバックアップすればいいのかよくわからん。

毎日やっても、別に毎日コミットしてるわけじゃないからなぁ。コミット時に、その日付をどっかのファイルに書き出して・・・、とか。なんか面倒だなぁ。

コミットごとに dump するのはやりすぎだろうし。


nadoka のリリース用にバッチファイルを作ってみる。

@svn cat svn://atdot/nadoka/trunk/ndk_version.rb | grep "NDK_Version "
@echo ok?
@pause

@svn copy svn+ssh://atdot/var/svn/nadoka/trunk svn+ssh://atdot/var/svn/nadoka/tags/%1 -m %1
@svn export svn://atdot/nadoka/tags/%1 nadoka-%1
@tar cfvz nadoka-%1.tar.gz nadoka-%1

バッチファイルの書き方を忘れてしまったのでいい加減。

本当は、もっと賢くできるんだろうけど。


nadokaにはやっぱり絵が必要だと思うのです。


gentoo を薦められる。なるほど、ああいう考え方もありか。


release って、changelog をコピペじゃいけなかったのか・・・。


Boost C++ Libraryプログラミング だそうで。買っちゃおうかなぁ。うーん。


tab browser では、お気に入りを別タブで開いてしまう(私はその設定がすき)なので、javascriptlet が使えない。うーん、なんとかならないか・・・。


また

error: line 13: Unknown tag: パッケージ gtk+ はインストールされていません

なんて言われてる。なんでだ・・・。環境変数がなんか変なのかな。

LANG=C にしたら通った。しかし、謎。


quickml、直接 25番たたくんじゃなくて、qmail-inject に渡すように変えてしまおうか。一番楽ではやそう。


hack中何を飲む?。意外とコーラは飲まれない。

_shiro(Wed May 05 14:57:53 JST 2004)

 Transmetaは昔、Schemeプログラマを募集してたことがあります。ソフトウェアシミュレータがSchemeで書かれてたとか。何を使ってたんだろう。Stalinかなあ。

_ささだ(Wed May 05 15:10:36 JST 2004)

 やっぱり開発効率がよかったってことでしょうか。

_こーのいけ(Wed May 05 18:29:11 JST 2004)

 一応なんとかする方法あったりします。<WinSCPで日本語

_maeda(Wed May 05 22:07:09 JST 2004)

 Message-Id: sendmailがつけてるんじゃないですか? QuickMLがofmipを使ってるとか。

_ささだ(Wed May 05 22:13:23 JST 2004)

 あー、なるほど。qmailで投げてるんで、それででしたか。答えは環境だったのか。どうしようかなぁ。

_maeda(Wed May 05 23:40:21 JST 2004)

 ポート25にコネクションが来たとき起動するプログラムをシェルスクリプトにして、RELAYCLIENTが立っていたらofmipdを、そうでなければqmail-smtpdをexecするとか。

_maeda(Wed May 05 23:54:19 JST 2004)

 あと、qmailでもsmtp経由じゃなくてqmail-injectとかsendmail -tとかを使うとmessage-idが付きます。

_4(Tue)

なんとか momonga インストール。さて、これからどうすればいいんだ。


なんやいろいろやったはいいが、ほかのパッケージの入れ方がわからん。OmoiKondara とか使うようだけど、それをビルドするには subversion が必要で、それを入れるには(ループ)。

はて。ブートストラップはどうしたらいいんだろう。はやくsambaを入れたいぞ。


依存関係がいろいろうるさくて、何がなんだかさっぱりわからなかたので(パッケージじゃなくてライブラリを要求されても、そのライブラリのパッケージがなんだかわからん)、PKGS 以下を rpm U * という暴挙に。

・・・まだ依存関係についてうだうだいってるよ。PKGSの中だけじゃ完結しないんだろうか。


パッケージの名前を調べて、やっとsubversionが入った・・・。もういや、こんなの。debianにすればよかったかなぁ。


perl(Net::LDAP) は samba-common-3.0.2a-3m に必要とされています

うーん、どこじゃ。

noarch にあった。


というわけで、パッケージはいつもお世話になってる人からもらってるんだけど、そういう人がいない場合、どうするものなんだろう。


やっと samba 入れなおした。3.0 になっていろいろ変わってるなー。


$ ../tools/OmoiKondara
...snip...
scanning specfile: 12%cracklib
scanning specfile: 12%crontabs
scanning specfile: 13%error: line 13: Unknown tag: パッケージ gtk+ はインストー ルされていません
specfile `crux/crux.spec' parsing failed
$

うーん、何が悪いのか。


異世界の話を、ついつい読みきってしまった。しかし、あと何冊あるんだ・・・。


うーん、やっぱり omokon 走らない。素人には手が出せないということか。

せめて、どこでこのエラーが出ているかわかればいいんだが。

なんでも catch するにはどうすればいいんだろうか。

どうやら spec = RPM::Spec.open("#{name}/#{name}.spec") でなんかエラーっぽいんだが。

うーん。rpm 周りがなんかいかんのかな、と思って rpmなんとかと ruby-rpm を上げてみても変わらず。

それとも、omokonってすべてをインストールしてあることを前提に動くんだろうか。

_3(Mon)

;; like 2004-05-03(Mon) 01:40:53 +0900
(global-set-key '(#\C-c #\d)
                #'(lambda ()
                    (interactive)
                    (insert (format-date-string "%Y-%m-%d(%a) %H:%M:%S %Z")
                            )))

ChangeLog は GNU style というのに則ったほうがいいんだろうか。うーん。


subversion(svnserve) を使うとき、

  • loopback deviceからの接続のときは -t(tunnel mode)
  • 他は、-i(inetd mode)

にするにはどうすればいいんだろう。inetd に登録する何かをほげほげすればよさそうだけれど、何をつければいいのか。tcpd を通して shell script 経由で実行するようにするのか。

t にするか i にするかの違いなんだよなぁ。


インターフェースごとに inetd.conf に書けばよさげ、ってことで、そのようにする。

・・・debian の inetd ってホスト指定できないのか。ということで、しょうがないので、xinetd を入れる。多分出来た。

こうすると、あるひとつのホストと、その他ってできないのがちょっと面倒だね。xinetd の長ったらしいやつを、コピペで三つ書いた。


xinetd に変えたら、ユーザ svn で実行できてない。ためしに、ユーザ ko1 で起動するようにしたらオッケーだった。なぜだ。

なんでこう問題ばかり起こるのかな。

やっと原因がわかった。group で直接指定しないと、user で指定した svn が svnuser グループに入っていても、効かないのね・・・。やられた。

inetd だと、これで動くからなぁ。


HDDを交換しようと、120G x 2 買ってきたら、Winが起動しなくなっていた。なんてこった。


で、Linux機も再インストール。さて、どうしようかな。

Kondaraインストールして、そのあと momonga に rpm -U ・・・でいけるのかなぁ。


ガーン、Kondaraの起動ディスクどっかにいっちゃったらしい。どうしようかな。


ガガガーン。大変なことを忘れていた。LinuxマシンにはCD-ROM ドライブがない!! インストールできないよ、どうしよう。

_2(Sun)

あ、コーヒーが茶を超えた(hack中何を飲む?)。

紅茶とあわせればまだ茶が優勢か。意外と誰も涙は飲まないんだな。hack楽しいからかな。


リポジトリの構成の話なんですが、1リポジトリ1プロジェクト(1プロジェクトは独立したソフトウェアとする)でやってますか?

CVS だと、ひとつのリポジトリにいろんなプロジェクトってのができたけど(自宅はすべての作業記録をひとつのリポジトリでやってた/やってる)、subversion だと微妙っぽい気がする。さて、どうしたもんか。

というのは、ちょっとしたプログラムのために、いちいちリポジトリ作ってグループ変えて、うんぬんってやるの面倒だなぁってことなんですが。

ちっちゃいのをまとめて1リポジトリで、ちょっと大きそうなら別リポジトリ、って感じなのか。


剣と魔法って言うけど、なんで剣と魔法なんだろう。英語とか、そういうのでもそういう言葉があるんだろうか。


__FILE__ って、ファイル名だけだと思ってたら、ちゃんとディレクトリ名も付くんだなぁ。しらなかった。


mod_ssl を入れてみた。Basic認証だけじゃ心もとない部分に(mrtgとか、webalizerとか)。別に見られてもいいんだけど、とりあえず。

sever.key の暗号化ってやるべきなんでしょうか。いや、やるべきなんでしょうが、リブートしたときにもパスフレーズ聞かれると、停電復帰時に勝手にリブートされない気がする。どうやるもんなのかな。


subversion で annotate って blame っていうのね。


Bug Browser はデフォルト以外portの https は通してくれないらしい。はて。


viewcvs は viewcvs.cgi ではなく、.../lib/viewcvs.py(viewcvs.cgi がフルパスで import) に viewcvs.conf の場所を書いているんだけど、viewcvs.cgi に書かせたほうがいいんじゃないだろうか。この選択により、どういうメリットがあるんだろう。


python の日本語文書 htmlhelp(chm) を探すのにえらい苦労してしまった。pyjug のページから辿れない(少なくとも私には)んだもん。


しかし、python のドキュメントにはチュートリアルがあって素晴らしいね。習得するやる気も出ようってもんだ。


弱参照と弱酸性は似ている。

しかし、weekref weakref って使ったこと無いんだけど、どういうところで嬉しいんだろう。


ループもののゲームの主人公の名前がリトとライという由来に気が付いたのが数週目。ダメすぎ。ライはもう一段あったらしい。

うーん、にやっとできる小作。悪くない。が、後味とかが・・・。

_さく(Sun May 02 03:32:13 JST 2004)

 英語ではSwords&Sorceryというようですね。

_シュワッチ(Sun May 02 20:04:59 JST 2004)

 server.key とかって、フツーは make testcert でパスフレーズ入れんようにせんめんどいゾ.

_ささだ(Sun May 02 21:37:56 JST 2004)

 何が初出なのかな、とか弓とかナイフじゃやっぱりシンボルたりえないのかなとか、盾とか鞘はだめかぁ、とか、そんなことをちょっと思いました。

_maeda(Sun May 02 23:46:36 JST 2004)

 weak reference: たとえばメモリに余裕があるかぎりキャッシュしておきたいデータとか。

_1(Sat)

わが道を行くグーグルの「オーナーズマニュアル」。うーん、すげぇ。


http://svn.debian.org/viewcvs/ を見ると、viewcvs の root を、viewcvs/projA/ のようにアクセスできているんだけど、手元の viewcvs では、viewcvs/?root=projA のようにしないとアクセスできない。さて、いったい何がどうなっているんだろう。

なんか難しいことやってるんだろうか。それとも、ただ単にオプションがあるのか。

root_as_url_component = 1

を教えてもらう。root で検索かけたつもりだったんだけど、気が付かなかった。


今日のししゃもさん。

sixamo: IRCを利用したAPLインタプリンタの構成法および評価|http://www.ipsj.or.jp/members/SIGNotFiles が nil か empty?

まぁ、nil か empty? => true だよなぁ、こんなの。


cross gcc つくり、一晩放置していたら(案の定)失敗。

libibirty を作る ranlib をtargetのものを使ったらしい。しかし、as は後で target のものが必要になると思ったんだが・・・。うーむ。

3.3では(cross環境にパスを通して)できていたので、3.4とか3.3.1 とかで何か変わったんだろうか。


そもそも libibirty ってどういう意味なんだろう。


改行コードが変で、とおってないっぽい。さすが cygwin。

うーん、どうしたもんだか。

吐くコードに ^M を混ぜるもんだから、大変なことに。


奇妙な理由がわかった。

awk を2段重ねしてるんだけど、一回目の awk は crlf で改行付けて、次の awk に渡す。しかし、次の awk は lf を改行コードとして捉えるため、cr が残る。で、おかしくなる。

さて、どう解決すればいいんだろう。cygwin の gawk の改行コードが変じゃなければいいんだろうが。crlf で出力するのも謎だが、lfをデリミタにするのも謎。

ちょろっとやってみると、ファイルへの出力は crlf になっている。パイプでつないでるからいけないのか?


とりあえず、RS="\r\n" として解決。うわ。あと、sort もきちんと動いていなかったので、修正。なぜか、d .../ D .../ d ... のようになる。

cygwin を強引にコピーしたからかなぁ。この辺の微妙な挙動の違いは。


やっぱり、いろいろと問題続発なので、cygwin を再インストールしよう・・・。うう。

cygwin はレジストリを使ったり、設定がよくわからないのが嫌いだ。


入れなおした。gcc を入れたのに make が入っていなかった。ガーン。


cygwin 入れなおしたら、あっさりと通った。なんてこった。改行は lf。


svn:keywords は、それぞれのファイルじゃなくて、ディレクトリにつけるだけでも通じるのかな?

ちょっとよくわからないけど。

svn のキーワード置換って、checkout したときに行われるのね。viewcvs で見ても、換わっていない。


nadoka を svn に移した(http://www.atdot.net/viewcvs/nadoka/)。


const_get のほうがなんぼかましかと。ネストしてたりするとアレですが・・・。

class C
  class CC
  end
end

p Object.const_get('C')
p Object.const_get('C').const_get('CC')

class Module
  def const_get_rec name
    klass = self
    name.split(/::/).each{|c|
      unless klass.kind_of? Module
        raise 'error'
      end
      klass = klass.const_get(c)
    }
    klass
  end
end

p Object.const_get_rec('C')
p Object.const_get_rec('C::CC')

こんなことしないといけないのかなぁ。


自宅のLinux機のHDDがやばい。subversion をコンパイル中、またリブートしてしまった。

秋葉原でHDDでも買ってくるか・・・。


で、未だに Kondara を使っているんだけど、せっかくだから、新しい何かに変えるか。debian sid が一番楽かなぁ。あとは momonga か。

学校で debian だから、momonga でいいかなぁ。


htmlhelp がところどころ表示されないページができた。激しく困る。いったい何が原因じゃ。rubyのリファレンスが読めないのは拷問。

表示されるようになった。IEがshift-jisとして読もうとしてなかったとか、そういう話みたい。ひどすぎる。

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