くまりゅう日記

もっと過去の日記
[.NET | BeOS | Blender | COLLADA | fossil | mono | monotone | NPR | OpenGL | PeerCastStation | Riko | Ruby | Silverlight | TRPG | XNA | ゲーム | ゲーム作り | プログラム | | 模型]

2006-09-13 さむい

_ 最近

会社が寒くて困るぜ。

会社だけじゃなくて家でも朝寒くて困るぜ。

明日AMショーなんではやく寝よ。幕張遠くてウゼー。

_ [BeOS] ParallelsでZeta

新PC組んだんで前のPCからZetaをひっこぬいてみた。

で、Parallelsに食わせてみたんだが、そもそもブートローダが見付けられてない感じだぞ?

先頭のパーティションだけひっこぬいたのが悪かったのかな。パーティションじゃなくてディスク全体をダンプしてみるか。

しかし60GBのHDDに入ってるんで全部ダンプはかなり時間がかかる。ddでやったら30GBでも6時間近くかかったんだが、ブロックサイズを大きめにすりゃ速くなるんだろうか。

_ [Riko] シェーダ

GLSLを一通りCの方で書いた。

いや、まだパラメータ設定が出来てないから一通りではないか。まあそんなに難しいもんでは無いが。

そんなことよりリンクエラーが発生してしまった。__Unwind_Rewindが無いとかなんとか。

どうみてもC++例外関係です。ほんとうに(ry

しかしC++の例外なんか使ってないし、この間までは普通に通ってたんだけどなぁ。

libstdc++の位置が悪いわけでは無いし、調べるとリンクにgccじゃなくてg++使えやヴォケ、てな感じらしい。確かにmkmfで作ったMakefileではリンクがccだし、g++にすると無くなるが、それをやるのは難しいな。

結局、CONFIG['CC']がgccを含んでいた時に-fno-exceptionsを付けてコンパイルするようにして回避。どこで例外なんて入り込んだんだろうと考えても仕方無いしねぇ。無効にするのが一番だ。

しかし、これでC++例外は使えなくなった罠。

もともと使う気は無かったが、Ruby例外をC++例外でラップすればrb_raise使わずに安全にRuby例外を投げられるかと思ったんだが。

rb_raiseはlong_jumpのはずだから、スタック上に作ったオブジェクトのデストラクタなんてなんですかそれ?な状態で帰っていくはず。なので下手に呼ぶとまずいことになるんだよな。

まあスタック上のオブジェクトのデストラクタをあてにするような作り方はしてないんで今のところは問題無いんだけどさ。

あ、あとRuby側のインターフェースを変更。

各クラスのinitializeにはハッシュを渡してキーワード引数みたいなのを実現〜と思ってたんだが、SymbolをStringのサブクラスにするとかいう変なことになりそうなので考え直した。

あとこの方法で問題になりそうだったのは、ドキュメントが書きづらいことだね。ハッシュに何設定すりゃいいのよ、ってドキュメントが書きづらかったからやめた。

で、沢山設定が渡せる/渡す必要があるinitializeはやめて、最低限のデータだけ渡して設定する必要があるものは適当に既定値が設定されて、あとで設定してくれということにした。こっちのほうがすっきりしたね。

_ [Ruby] Symbol < String

これはなんか変な気がするんだよなぁ。

とりあえず、変な気がする、の前に俺が困ることがある。

俺が思うStringに対するSymbolの利点は

  • 比較が速い
  • 一々生成されない*1から速い
  • ハッシュ値を求めるのも速い

だと思う。

SymbolはIDのRuby上での表現という理解なんで、どちらかというとFixnumっぽい扱いを期待してるんだよね。ただFixnumだと意味がわかりづらいから名前がつけられる感じ。

特に名前がつけられてハッシュ値計算が速いからHashのキーにするのに便利に使ってた。つかそういうものだと思ってた。

で、Stringのサブクラスにされて、ハッシュ値も名前と同じ文字列と同じようになると、ハッシュ値の計算が遅くなる。これは困る。

Stringの既定のハッシュ値計算時間は文字列の長さに線形で比例するんだよな。

Symbolは1.8ではObjectからそのまま継承だからVALUEの値がそのままハッシュ値のはず。これはそもそも計算とかそういう問題では無い。重複無いしね。

まあStringのハッシュ値計算ぐらいケチるな、と言われればその通りかもしれんけど。気分的にね。

あとこれは確認してないけど、eql?も遅くなるんだよね? Stringから継承になるし。しかし==はSymbolで再定義してるからおかしなことになる罠。

HashでSymbolとStringをキーにした時、同一とみなしたい、ってのも変な話だよなぁ。

だってSymbolとStringって全然関係無い別物じゃん。

俺の感覚ではSymbolはプログラム内でユニークな値を持つFixnumだよ? それとStringを同一視? 頭おかしいんじゃない?

つか、どうやったらSymbolとStringを混同して使うんだってば。間違ってるだけじゃん。

だってさ、誰もIntegerをStringのサブクラスにしろとかHashのキーとしてIntegerとStringを同一視したいなんて言わないわけじゃん。

h = { 1 => 1 }
h['1'] # => nil

これを1が返るようにしてくれなんて言わないじゃん。それなのになんでSymbolだけ言いだすのかわからない。

ただSymbolの使い方間違ってるだけだって。

でもね、Symbolって何だかわからない立ち位置であることは確かなんだよね。

Symbol渡すところは大抵文字列渡しても同じように処理してくれるんだもん。しかもマニュアル見てもシンボルを表します、って意味不明。シンボルって何?

SymbolとString混同してもある程度大丈夫、みたいな微妙なことするくらいならSymbol無くした方が混乱無くていいよね。

'a' == :a # => true
:a == 'a' # => false

とか絶対わからんし*2

'1'.to_i  # => 1
:'1'.to_i # => 15639 (実行毎に違う)

とかおかしいよ!

でも

'1'.kind_of?(String)  # => true
:'1'.kind_of?(String) # => true

だぜ? もう文字列なんて信じられない!

で、MLに投げればいいんだが、なんかruby-devのメールがいつの頃からか飛んで来てないことに気付いた。何かあって届かなくなって配信とまったのかにゃ。

で、もう少し様子をみてみることに。

*1  リテラルの場合コンパイル時に生成したと思ったんだけど……間違ってるかも

*2  ちゃんと===使えって? そうだね……今後気をつけます。


ページのトップへ | トップ «前の日記(2006-09-12) 最新 次の日記(2006-09-19)» | 編集 | kumaryu.net by kumaryu