その日あった事ダス第210週
◇ やっぱりというかバグがぽこぽこ発生していたのでバグとり。やっぱ過去分を全部変換かけるとエラー出る出る。というか今までも変な出力してたんじゃなかろうかという場所もちらほら。とりあえず明らかに間違っているところは取り除いたけど、うまくいってるかなぁ。
◇ ちなみに今までのシステムは C で書いてましたが、今回から Ruby です。同じ文章を解析しますが内部データの保持し方が全然違う。今回のは完成したらソース公開しようかな。
んで、今回 yield を使いました。まともに使ったのは初めてかな。かなり理解度アップ。ちなみにこんな感じ。
def getline(fname,&block) if File::exist? fname then File::open(fname) do |f| f.each_line do |l| if l =~ /^;include *"(.*?)"/ then getline($1,&block) else yield l end end end end end
後は getline("hoge"){|l| puts parse(l) } とかして使ってたり。yield が使えるようになってなんか嬉しい^^;
◇ んでおかしいところがないか過去の日記を読んでたんだけど、いやー、書き始めた頃のは読むのも恥ずかしいや。読んでて痛い思い出も。で、どんどん書き方が変わってきている自分が見える。でも本人は何が変わったんだろうな。
んで、ところどころ公開しないようなメモがあったんだが、Reborn'sDay のプレイログ(?) はメモ扱いで公開してなかったのね。今更だとは思うが公開。好きな作品だからさ^^;
◇ リストが false と表示されているバグを修正。nil を返さないといけないところで false 返していました。あぶないあぶない。
◇ 眠れないからと昨夜にF1見てたりなんかしてたおかげで眠い。
◇ 不思議なソースにしばらく悩んで師匠にメールで問い合わせてみたり。私には GDI は似合わんよ。
◇ 眠いのは相変わらず。
◇
流行っているらしい幼馴染チェックをしてみた。結果は幼馴染のえらい人の方は 1,4、浮気のえらい人の方は 8,14 だけ。更にやったことあるのに覚えてないのは前者の 9,19 と、後者の 2。明らかにその手のタイプのゲームをやってないことが分かりますな。
ちうか、上に挙げた7つ以外に幼馴染が出るゲームって何やっただろう(汗;
ちなみに、後者の 14 は昨夜出題者と二人で断言してたり。ポエムはダメだろうも同意。私はあの髪型もダメだろうと思ってたりする。でも作品は好き。
◇ なんや最近回りで風邪が流行っている様子。気をつけねば。
◇ そういやいつのまにかゲームキューブって発売されていたのね。実物見た。ちんまいのは良いのだけど置き場所に困る。いや、今って親亀(SS,PS)の上に子亀(DC)状態なので^^;
◇ 結局 1.5.1 をまともに動かす前に 1.5.2 がでちゃったなぁ>NetBSD
◇ なんとなく戦略系のシミュレーションがやってみたいようなそんな気分。
◇ 体調不良につき休養中。
◇ とはいえ、ひたすら寝っぱなしというのも疲れるのでちょっと頭の体操。今日のお題は「一時的なインスタンス変数」。インスタンス変数だけど、Marshal::dump には出力されない変数。あ、もちろん ruby の話ね。
◇ 最初は一時的なインスタンス変数の名前をどっかに覚えといて、dump するときに細工すればええんじゃないかなと軽く考えていたり。とりあえず作ったもの。ちょい長い。
class Object def temporary_variables (__temporary_variables).map{|tv| "@#{tv.to_s}"} & instance_variables end
private def __temporary_variables [] end end
class Module private def attr_temporary(name) unless name.kind_of? Symbol then if name.respond_to? :intern then name = name.intern else raise TypeError, "#{name.inspect} is not a symbol" end end old_tvars = module_eval("__temporary_variables") unless old_tvars.include? name then new_tvars = (old_tvars << name).sort module_eval("def __temporary_variables; #{new_tvars.inspect}; end; private :__temporary_variables"); end end end
module Marshal alias :_dump :dump def dump(obj,*arg) unless obj.temporary_variables.empty? then obj = obj.clone obj.instance_eval do temporary_variables.each do |tv| remove_instance_variable(tv) end end end self::_dump(obj,*arg) end module_function :_dump,:dump end
◇ でもこれじゃダメ。以下のようなコードを書いてみると分かる。
class Foo attr_temporary :foo def initialize @foo=1 end end
class Bar def initialize @bar = Foo::new end end
p Marshal::load(Marshal::dump(Foo::new)) # => #<Foo:0x80f5714> p Marshal::load(Marshal::dump(Bar::new)) # => #<Bar:0x80f5584 @bar=#<Foo:0x80f5520 @foo=1>>
後者の場合はばっちり @foo が残ってる。そりゃそうだ。Marshal::dump は1階層しか temporary のチェックしてないんだもの。
◇ しかし、これを解決しようと思ったら非常にやっかい。Marshal::dump 時に定義されていれば呼ばれる _dump メソッドを使うと配下のオブジェクト全ての面倒をみなくちゃいけなくなるし。ちょっと前に ruby-dev であったカスタムマーシャルがどうたらとかと非常に良く似た問題にぶち当たる。んでもって AMarshal のような解決方法は、今回の場合はあまりに大げさすぎて使いたくない。
◇ なんでこんなことがしたかったかと言うと、上記のようなコードを日記に埋め込む場合、以前だと全部の行の先頭に判別用文字をつけないといけなかったのだけど、今回のような長いコードの場合は結構面倒で。デフォルトのタグの情報をインスタンス変数として覚えさせておけば楽かなぁ、でも保存しなくちゃいけない情報でもないよね、というわけで。まあ、もっと上位のクラスでパースさせる文字とデフォルトのタグの情報を毎回渡すようにすればインスタンス変数は使わなくても実装できるんだけども(結局今はそうしてるし)。
◇ うーん、なんか良い方法ないかなぁ。それなりに使い道はありそうな気はするが…。
◇ ってこんなこと考えてないで寝れってか(汗;
◇ 今日は出社。しかし何故か鼻水がずるずる。って昨日はそれは全然なんともなかったぞ。喉も痛い気がする。しばらく活動してたらなんともなくなった…。
ふと、花粉症、という言葉が頭をよぎる(汗; いや、風邪の方が良いというわけでもないが。むーん。
◇ お仕事上のとある物はコンパイルが通るところまではこぎつけたがリンクするとダメだろうな。ちうわけで3連休のうち確実に1日は以下略。3日は嫌だぞさすがに。
◇ 8月ごろの ruby-dev を読んでみる。実装が思いついていないんで果たしてこの辺の話と自分の希望って合ってるんだか合ってないんだか分からん(汗; とりあえずどういう風にメソッドが呼ばれていくと実現できるのか組み立ててみないと。
…頭から煙出そうや…。
◇
むー。今年の、いや違う来年の正月はないらしい。2交代制という話を聞いた。今年も冬は縁がなさそうだな。去年のリベンジがしたかったのだけど(苦笑
もっともそれまでずっと忙しいというわけではないとは思うので気は楽ではある。
◇ 数日振りにシルバーガンをやってみたら 4D 以外ことごとくチェーンが切れるという状態に。だめだー、どんどん腕が鈍っていっている気がするナリよ。
◇ GBC版タクティクスオウガ外伝なるものを買ってみた。この手のゲームは久々やな。ちなみに GBC のゲームはこれで3つめだが過去二つはどちらもラスト間際で積んでいる。はたしてこれはどういう運命をたどるやら(ぉ
◇ 散財自慢システムのソースが公開されてたので見てみたり。software の下も…ああ、どこかで見たドメインだと思ったらプチチャットのところだったか^^;
んでもって tDiary ちうのがあったので見てみる。ruby の日記システムで公開してるのって nDiary しか知らなかったのだが、こゆのもあったのね。んじゃ私が作ったら aDiary? …それはさすがにちょっと。んじゃ hns や gns に合わせて…それは別の意味で嫌だ(汗;
tDiary の記述のコツを読んで「やっぱ考えることは同じなんかなぁ」なんて思ったりして。この辺うまく RDtools とかと"簡単に"融合できたらええんやけどねぇ。RD の土俵で作ることはできるけど RD を自分の土俵に引き入れるのはめんどくさそうだからなぁ。
◇
<->の話。元はここ。日記データ内の <> の出力に関する話。
うちの場合は基本的に < の出力は < のままですな。直後の一文字ぐらいチェックでなんとかなるかな? 他の日記システムとかどうなってるんでしょうか?>識者
う、かな? って人に聞く言葉遣いじゃないですね(苦笑 すみません。修正。
◇ というわけで ZnZ さんのコードを参考にこんなコードを突っ込んでみた。
def escape(str) str.gsub(/(?:&(?:lt|gt|amp);|<[^<>]*>)|[<>&]/) do |c| case c when '&' '&' when '<' '<' when '>' '>' else unless c =~ /^<[\w!\/]/ then c.gsub(/</,'<').gsub(/>/,'>') else c end end end end
出力する前に通せばとりあえずは動くかな? &(lt|gt|amp); あたりは過去分もそのまま流用してるので仕方ないというか(苦笑
◇ そういえば PiloWeb 対応してないな。どれぐらい使っている人いるんだろう?
◇ よく考えたら日記本文しか対応していないので上記メソッドをモジュールにして該当するクラスに include して使うようにしてみた。Mix-in ってありがたいな^^;
◇ なんか妙に疲れてるのでさくっと帰る。
◇ 出力をちこっと修正。ついでに最新分は4日に減らしました。まー、こんなもんでしょう。
◇ いろいろ寄り道しながら ruby の marshal.c の Marshal::dump の部分を ruby で書き直すという事をやってたり。かなり理解度アップ。一番面倒だったのは built-in クラスの判別。とりあえず書いてみたが合ってるかどうかは分からず。
◇ タクティクスオウガ外伝。うーん、敵の雑魚レベルが主人公のレベルと同じってのは弱すぎるんでは。コンピュータ側の思考ルーチンが極悪とかならまだしも。まあ、GBC というプラットフォームだから仕方ないのかな…。
このページは基本的にリンクフリーです。