Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.7.3) Gecko/20040907 Firefox/1.0 PR (NOT FINAL) にした。

Feed Back Agent のインスコ中にエラーでてインストーラ止まったのでタスクマネージャから強制終了。まぁ関係ないからヨシ。AiO がインスコできない。バージョン管理云々のせいだろうけどめんどいので放置。正式版はまだ遠い?

  1. トップ
  2. soft
  3. Firefox 1.0 PR (NOT FINAL)

initialize にディレクトリ渡して、それ以下のファイルを全て読むようにしてみる。ただし先頭にアンダースコア付いてるときは無視。一定時間ごとに reload_if_modified っつうのを呼び出せば勝手に読み込まれるし、アンダースコアをつければ勝手に開放される。

結局宣言して、インスタンスを作成して適当なクラス変数につっこんだら直ぐに remove_const してみてる。

さーIRC BOT で使ってみよう。

RO チャンネル用に告知巡回と鯖チェック・モンスデータ取得とか。モンスデータは今のところ回避しかやってないけど必中とかもやりたいもんだ。いちいちブラウザ起動するより早い。どっかに生のデータないのかな。ローカルで MySQL に突っ込んだらよさそ。

  1. トップ
  2. prog
  3. Ruby PluginManager 3

このメソッドの挙動がよくわからない。PluginBase.class_eval(%Q|@@irc = irc|) では思ったとおりだけど、PluginBase.class_eval { @@irc = irc } だと uninitilized class variable が出る。とりあえず前者にしとけば動くのでいいけど、なんか気持ち悪い。

プラグイン側に API を提供しようってわけだけど、そんなこと最初考えてなかったとかいうアフォさなので全てのプラグインの先祖としてインターフェイスを宣言している PluginBase のクラス変数に適当なメソッドを持ったオブジェクトを入れておけば、それにアクセスしてアレコレできんじゃねぇかなぁと。(継承したクラスとかでも全て共有されるし)

上の irc は class_eval の前で irc = self とかやってるやつ。だからプラグイン側でオーバーライドしてる on_join メソッド内で @@irc.notice(message, channel) とかやればメッセージが送れるハズ。って自分で書いてて思うけど意味わからん。

あぁ。もしや @@irc も外側ってことになってるのかな。

  1. トップ
  2. prog
  3. class_eval のブロックを与えたときと文字列を与えたときの違い

土曜日は朝から「なんで土曜日に学校なんかいかなきゃいけないんだ。しかもあの糞学校に」と考え、日曜日は「あぁまた明日から糞学校か」と凹み、平日は淡々と脳みそがやせていく日々である。

  1. トップ
  2. life
  3. ひたすら面白くない日々と、ひたすら面白いことを考える日々

どこの大学に入ってもインチキ野郎が大量にいるんじゃないかと思うこの頃。周りに誰がいるかとかそういうのって全部運じゃないか……

じゃあどこにインチキ野郎がいないかって言ったら、いないとこなんてないんじゃないかと思うこの頃。どれぐらいいるんだろう。

関係ないけど、妙に気取ってる人が苦手だ。すごいくだらないんだけど、高校生なら「高校生らしく」するべきで、たかが粋がってるだけの高校生が「飲みいこうぜ、のみ」とか言ってるのはなんか胡散臭いって思うような。別に粋がってるやつだけじゃなくて、言葉(文字)遣いが気取ってたり、格がないのに一人称が「私」だったりするとなんかめげる。

人のこと言ってるんじゃねぇよ。 さて、自分で判断できないことはどうやって直せばいいだろう。

  1. トップ
  2. life
  3. ○×+運

domxml は PHP5 で使えなくて、DOMDocument とか XSL は 4 では使えないってか。ローカルで xslt_process のロードするときのパスがオカシイのでいちいち fopen する必要ありまくりですか。めんどくさい。

  1. トップ
  2. prog
  3. php ?

別ファイルに定義されたクラスを動的に読み直したいのだけど、どうやっていいやら。単に eval とかやると同じクラス名はもう使ってるぜ?って警告されるわけだし、Class::new do ... end は違うくさいし、remove_const はメソッド内から呼べないself.remove_const がないよって怒られるわけだから、他に方法があるのかもしれない? 定義したクラス名.class_eval("remove_const(:CONST)")ってやればいいらしい([ruby-list:38594] Re: cgi.rbのremove_const)。これで上手くいくかどうか実装してみよう。し。

プラグインみたいな。ずっと動きっぱなしのプログラムで、ある一部分だけソースからもう一度読み直してやりたい。

# ML の過去ログで面白いのハケン [ruby-list:27327] Haiku. こういうの好き

class PluginManager
def initialize
@plugins = {}
end
def class_name(filename)
File::basename(filename, ".rb").capitalize
end
def load(filename)
class_name = class_name(filename)
eval(open(filename) {|f| f.read }, binding)
# インスタンス作成して @plugin に突っ込む。
eval("@plugins[class_name] = #{class_name}::new")
end
def unload(filename)
class_name = class_name(filename)
PluginManager.class_eval("remove_const(:#{class_name})")
@plugins.delete(class_name)
end
def each
@plugins.each do |k,v|
yield k, v
end
end
end
pm = PluginManager::new
pm.load("foo.rb")
f = PluginManager::Foo::new
pm.unload("foo.rb")
f = PluginManager::Foo::new # => uninitialized constant PluginManager::Foo (NameError)
=begin
# foo.rb
class Foo
end
=end

みたいな感じかなぁ……もっとスマートにできるような気がする。しかもコレだと PluginManager の外からロードしたクラスにアクセスできる(丁度上の f のように )んだよね。もう一個 Plugin クラスとか作ってその中にロードしたクラスのインスタンス突っ込んでやろうか。

  1. トップ
  2. prog
  3. Ruby プラグインっぽいもん

外側からアクセスできるのはそんな大きな問題にはならないような気がするので、このまま実装してこう。まぁクラスオブジェクトを適当に突っ込んだらすぐに remove_const すればいいような気がしないでもない。この辺考えよう……

前回ロード時のファイル日時と比べて更新されてたらリロードするメソッドとかとか。

ちなみに結構命名規則がいいかげんな感じで統一してたりする。クラス名とかモジュール名は単語先頭を大文字にする(どっちにしろクラス名先頭は大文字だし)形で、メソッド名とか変数名はアンダースコアで単語つなぐ、ってのを基本として適当に単語作ったり略したり。

foo_bar
普通
FooBar
WinAPI とか、C とかっぽい気がする。読み難いし書きづらいし間違いやすい。
FOO_BAR
定数
fooBar
なんかダサい
Foo_Bar
Foo_bar
あんまり見かけない
激しくダサい

どうでもいい話だ。でも Ruby のメソッド名に大文字が混ざってると違和感! Javascript だといろいろ混ざったりとか……キタネ

ていうか、インスタンス作ったらすぐに remove_const やってもいいのかな。

  1. トップ
  2. prog
  3. Ruby PluginManager と命名規則