Last-Modified 2010/10/25 11:35:18

その日あった事ダス第210週


9月16日(日曜日)[前年][翌年]
日記で見る自分/散財自慢システム

やっぱりというかバグがぽこぽこ発生していたのでバグとり。やっぱ過去分を全部変換かけるとエラー出る出る。というか今までも変な出力してたんじゃなかろうかという場所もちらほら。とりあえず明らかに間違っているところは取り除いたけど、うまくいってるかなぁ。

ちなみに今までのシステムは 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 のプレイログ(?) はメモ扱いで公開してなかったのね。今更だとは思うが公開。好きな作品だからさ^^;

散財自慢システム。いいなぁ、これ。hauN.org あたりのメンバーでやると面白いことになりそう。日記鯖や茜と連動してたりすると楽で良いかも。しかしすごい人はすごいねぇ(汗;

リストが false と表示されているバグを修正。nil を返さないといけないところで false 返していました。あぶないあぶない。


9月17日(月曜日)[前年][翌年]

眠れないからと昨夜にF1見てたりなんかしてたおかげで眠い。

不思議なソースにしばらく悩んで師匠にメールで問い合わせてみたり。私には GDI は似合わんよ。


9月18日(火曜日)[前年][翌年]
幼馴染ゲー

眠いのは相変わらず。

流行っているらしい幼馴染チェックをしてみた。結果は幼馴染のえらい人の方は 1,4、浮気のえらい人の方は 8,14 だけ。更にやったことあるのに覚えてないのは前者の 9,19 と、後者の 2。明らかにその手のタイプのゲームをやってないことが分かりますな。
ちうか、上に挙げた7つ以外に幼馴染が出るゲームって何やっただろう(汗;

ちなみに、後者の 14 は昨夜出題者と二人で断言してたり。ポエムはダメだろうも同意。私はあの髪型もダメだろうと思ってたりする。でも作品は好き。

なんや最近回りで風邪が流行っている様子。気をつけねば。

そういやいつのまにかゲームキューブって発売されていたのね。実物見た。ちんまいのは良いのだけど置き場所に困る。いや、今って親亀(SS,PS)の上に子亀(DC)状態なので^^;

結局 1.5.1 をまともに動かす前に 1.5.2 がでちゃったなぁ>NetBSD

なんとなく戦略系のシミュレーションがやってみたいようなそんな気分。


9月19日(水曜日)[前年][翌年]
一時的インスタンス変数?

体調不良につき休養中。

とはいえ、ひたすら寝っぱなしというのも疲れるのでちょっと頭の体操。今日のお題は「一時的なインスタンス変数」。インスタンス変数だけど、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 のような解決方法は、今回の場合はあまりに大げさすぎて使いたくない。

なんでこんなことがしたかったかと言うと、上記のようなコードを日記に埋め込む場合、以前だと全部の行の先頭に判別用文字をつけないといけなかったのだけど、今回のような長いコードの場合は結構面倒で。デフォルトのタグの情報をインスタンス変数として覚えさせておけば楽かなぁ、でも保存しなくちゃいけない情報でもないよね、というわけで。まあ、もっと上位のクラスでパースさせる文字とデフォルトのタグの情報を毎回渡すようにすればインスタンス変数は使わなくても実装できるんだけども(結局今はそうしてるし)。

うーん、なんか良い方法ないかなぁ。それなりに使い道はありそうな気はするが…。

ってこんなこと考えてないで寝れってか(汗;


9月20日(木曜日)[前年][翌年]
さっそく正月の話(楽しい話じゃないが)

今日は出社。しかし何故か鼻水がずるずる。って昨日はそれは全然なんともなかったぞ。喉も痛い気がする。しばらく活動してたらなんともなくなった…。

ふと、花粉症、という言葉が頭をよぎる(汗; いや、風邪の方が良いというわけでもないが。むーん。

お仕事上のとある物はコンパイルが通るところまではこぎつけたがリンクするとダメだろうな。ちうわけで3連休のうち確実に1日は以下略。3日は嫌だぞさすがに。

8月ごろの ruby-dev を読んでみる。実装が思いついていないんで果たしてこの辺の話と自分の希望って合ってるんだか合ってないんだか分からん(汗; とりあえずどういう風にメソッドが呼ばれていくと実現できるのか組み立ててみないと。

…頭から煙出そうや…。

むー。今年の、いや違う来年の正月はないらしい。2交代制という話を聞いた。今年も冬は縁がなさそうだな。去年のリベンジがしたかったのだけど(苦笑
もっともそれまでずっと忙しいというわけではないとは思うので気は楽ではある。

数日振りにシルバーガンをやってみたら 4D 以外ことごとくチェーンが切れるという状態に。だめだー、どんどん腕が鈍っていっている気がするナリよ。

GBC版タクティクスオウガ外伝なるものを買ってみた。この手のゲームは久々やな。ちなみに GBC のゲームはこれで3つめだが過去二つはどちらもラスト間際で積んでいる。はたしてこれはどういう運命をたどるやら(ぉ


9月21日(金曜日)[前年][翌年]
日記システム/<> の出力

散財自慢システムのソースが公開されてたので見てみたり。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 '&'
        '&amp;'
      when '<'
        '&lt;'
      when '>'
        '&gt;'
      else
        unless c =~ /^<[\w!\/]/ then
          c.gsub(/</,'&lt;').gsub(/>/,'&gt;')
        else
          c
        end
      end
    end
  end

出力する前に通せばとりあえずは動くかな? &(lt|gt|amp); あたりは過去分もそのまま流用してるので仕方ないというか(苦笑

そういえば PiloWeb 対応してないな。どれぐらい使っている人いるんだろう?

よく考えたら日記本文しか対応していないので上記メソッドをモジュールにして該当するクラスに include して使うようにしてみた。Mix-in ってありがたいな^^;

なんか妙に疲れてるのでさくっと帰る。

うお、ほんまや>スクロールバー しかし何の使い道が…。

出力をちこっと修正。ついでに最新分は4日に減らしました。まー、こんなもんでしょう。


9月22日(土曜日)[前年][翌年]

いろいろ寄り道しながら ruby の marshal.c の Marshal::dump の部分を ruby で書き直すという事をやってたり。かなり理解度アップ。一番面倒だったのは built-in クラスの判別。とりあえず書いてみたが合ってるかどうかは分からず。

タクティクスオウガ外伝。うーん、敵の雑魚レベルが主人公のレベルと同じってのは弱すぎるんでは。コンピュータ側の思考ルーチンが極悪とかならまだしも。まあ、GBC というプラットフォームだから仕方ないのかな…。


このページは基本的にリンクフリーです。

written by Shin'ya Adzumi 'あづみ しんや'
adzumi@denpa.org