〜2004年8月中旬〜
lsのほうは-Cオプション。色つきで見たければless -rで。
連続して30通ほど来た。うっとうしいもんが流行りだしたなあ。
とりあえずwormらしいやつを隔離。
def deliver_mh(folder) folder = File.join("Mail", folder) Dir.mkdir folder unless File.directory? folder pattern = File.join(folder, "[0-9]*") last = Dir[pattern].max_by{|x| File.basename(x).to_i} last ||= File.join(folder, "0") agent.save(last.succ.untaint) end def main if /^UEsDBAoAA[AQ]AAA|TV[qo][QA]AA[ME]AAAA[EC]AAAA/ =~ agent.body.to_s deliver_mh("virus.rdeliver") else deliver_mh("inbox.rdeliver") end end
最近Thunderbirdのジャンクメールコントロールの調子が悪い。 学習させても全然覚えてくれないという感じ。 で、いろいろ探してみると 「ジャンクメールコントロール」の「適用フィルタ」に 「訓練データのリセット(R)」というボタンがあった。 以前はなかったよなあ、こんなボタン。
30通ほどのspamで学習しなおししたら、賢くなったような気がする。 明日また学習させよう。
vimを使っていてちょっと不満に思うのはrdeliverの設定ファイル(~/.rdeliver)のようにsuffixがないファイルを編集したとき。 そりゃわかんないよね、vimには。.rbというsuffixがないとruby modeにならない。 で、いろいろ試してみた。
shebang(#! /usr/local/bin/ruby)をつけてみる。おお、いけてるね。 つぎにmodelinesを使って、ファイルの最後に
# vim:set filetype=ruby:
を置いてみる。いけてる。これでもいいのか。
というわけで、rdeliverからbogofilterを呼んでspamを判断してみる。 RFilter::Deliver#deliver_pipeを使うのがよさそうだ。
def deliver_mh(folder) folder = File.join("Mail", folder) Dir.mkdir folder unless File.directory? folder last = Dir.entries(folder).max_by{|x| x.to_i} last = "0" if last == "." new_file = File.join(folder, last.succ).untaint agent.save(new_file) end class RFilter::DeliveryAgent def spam? deliver_pipe("bogofilter -l", message) $?.exitstatus == 0 end def virus? body.find do |x| /^UEsDBAoAA[AQ]AAA|TV[qo][QA]AA[ME]AAAA[EC]AAAA/ =~ x.to_s end end end def main ym = Time.now.strftime("%y%m") agent.log(2, agent.header["Subject"]) if agent.virus? deliver_mh("virus.rdeliver." + ym) elsif agent.spam? deliver_mh("spam.rdeliver." + ym) else deliver_mh("inbox.rdeliver") end end # vim:set filetype=ruby:
Ruby Installer for Windowsが名前をOne-Click Ruby Installerと変えた。 Windowsだけでなく、他のOSのインストーラも作るらしい。
ところで実際にインストールしてみるとone clickじゃインストールできないので注意。 いや注意する必要はないか。
そういえば2.12はなぜかインストールしてなかった。
Changes:
A crash bug was fixed. All users are encouraged to upgrade.
2.12に強烈なバグがあったらしい。
Changes:
Minor syntactic enhancements, additions to builtins, additions to the line editor, and improvements to the completion system. Many bugfixes were made. Users should be able to upgrade to this stable release with no difficulties.
今日からprocmailからrdeliverへ移行。~/.procmailrcは
PATH=/bin:/usr/bin:/usr/local/bin :0 c | /usr/local/bin/rdeliver.rb --log $HOME/.rdeliver.log :0 $HOME/Mail/backups/.
だけに。いろいろ実験中なのでバックアップを残してる。
cmailはMH形式に対応してないので普通のメールはmboxで保存。
agent.save(File.join("/var/mail", ENV["USER"] || ENV["LOGNAME"]).untaint)
これで、ad hocな対応がしやすくなった。
rdoc2manという話から、なぜかこういうものができあがったらしい。 先週「rdocってmanのgeneratorも作れるんだろうか」という疑問をIRCに投げたばかりだったので、期待して見たんだけどなあ。
仕組み自体はun.rbと同じようなもんで、 コメントの= Hogeの部分を抜き出して表示するだけ。
un.rbもこれを使おうかと思ったら、ファイル名が"-e"になるのでだめ。 rdoc/usage.rbを見ると
main_program_file, = caller[-1].split(/:/, 2)
となってる。 つまり一番上位になるファイルにコメントがないといけないわけだ。
caller自身を置き換えるってのもなあ。
def caller(*level) x = super x[-1] = x[-1].sub(/(.+?)(?=:)/, __FILE__) x end
久し振りにCygwinのクロス環境を新しく作る。まずは準備。
% prefix=/usr/local/cygwin % mkdir -p $prefix/i686-pc-cygwin % tar xfv cygwin-1.5.10-3.tar.bz2 --bz usr/{include,lib} % tar xfv mingw-runtime-3.3-1.tar.bz2 --bz usr/{include,lib} % tar xfv w32api-2.5-1.tar.bz2 --bz usr/{include,lib} % cp -a usr/. $prefix/i686-pc-cygwin
binutilsから
% tar xfv binutils-20040725-2-src.tar.bz2 --bz % cd binutils-20040725-2 % CFLAGS=-Os ./configure --prefix=$prefix --target=i686-pc-cygwin % make all install
gccはちょっとソースを取り出すのが面倒。
% tar xfO gcc-core-3.3.3-2-src.tar.bz2 --bz gcc-core-3.3.3.tar.bz2 |\ tar xfv - --bz % tar xfO gcc-g++-3.3.3-2-src.tar.bz2 --bz gcc-g++-3.3.3.tar.bz2 |\ tar xfv - --bz % cd gcc-3.3.3 % tar xfO ../gcc-core-3.3.3-2-src.tar.bz2 --bz gcc-3.3.3-2.patch |\ patch -p1 -t
パッチはada等も含んでいるのでそのあたりは-tで無視した。
% CFLAGS=-Os CXXFLAGS=-Os ./configure --verbose --prefix=$prefix \ --enable-languages=c,c++ --disable-nls --without-included-gettext \ --with-system-zlib --enable-interpreter --enable-threads=posix \ --enable-sjlj-exceptions --disable-version-specific-runtime-libs \ --disable-win32-registry --target=i686-pc-cygwin
を実行すると最後に
trap: usage: trap [-lp] [[arg] signal_spec ...]
と出た。 こないだbash 3.0に上げた影響か? まあ最後まで行ってるみたいなので気にしないことに。
% make all install
これでok。
あとはmingwの設定。
% tar xfO gcc-mingw-core-20040810-1.tar.bz2 --bz \ etc/postinstall/gcc-mingw-core-3.3.3-20040217-1.tgz |\ tar xfvz - -C $prefix % tar xfO gcc-mingw-g++-20040810-1.tar.bz2 --bz \ etc/postinstall/gcc-mingw-g++-3.3.3-20040217-1.tgz |\ tar xfvz - -C $prefix % cd $prefix/lib/gcc-lib/i686-pc-mingw32/3.3.3 % rm *.exe % ln -s ../../i686-pc-cygwin/3.3.3/{cc1,cc1plus,collect2} .
一応テストしてみると、
% echo 'main(){}' >main.c % i686-pc-cygwin-gcc main.c % i686-pc-cygwin-gcc -mno-cygwin main.c
うまくいってるようだ。
[ruby-talk:109496]を受けて、RDocでmarkupする方法を調べた。 lib/rdoc/simple_markup.rbを見ると
require 'rdoc/markup/simple_markup' require 'rdoc/markup/simple_markup/to_html' p = SM::SimpleMarkup.new h = SM::ToHtml.new puts p.convert(input_string, h)
でいいらしい。やけに簡単だな。
他にもLaTeXとかも用意されていて、こっちも同じように
require 'rdoc/markup/simple_markup' require 'rdoc/markup/simple_markup/to_latex' p = SM::SimpleMarkup.new h = SM::ToLaTeX.new puts p.convert(input_string, h)
でいける。あとはどちらも前後に必要なものを入れればok。
つまりrdoc2manを実現するには rdoc/markup/simple_markup/to_manとrdoc/generator/man_generatorを作る必要があるわけだ(ってうささんがそうつぶやいていたような)。
Clip-Onの時計がかなり遅れてる。 教育テレビが正午に時報を鳴らさない季節になったか。 一年に一度の手動時刻設定だ。
2年ほど放っておいたTcl/tk 8.4.xでstubsがSEGVる件を調査。 どこでSEGVるのか調べたら、struct TclWinProcsのgetFileAttributesExProcが初期化されてないことが判明。 というわけで、Tcl_FindExecutable()を呼ぶことで解決。
一応まだrdeliver.rbのログを見張ってるわけだけど、
2004/08/20 01:02:07 04018: Action: save to "/var/mail/watanabe" 4/08/20 01:02:07 04027: Action: save to "Mail/spam.rdeliver.0408/721" 2004/08/20 01:02:07 04035: Ruby Conference hotel 2004/08/20 01:02:07 04035: Action: save to "/var/mail/watanabe"
のようにたまに文字が欠けることがある。 fetchmailで受けてるだけだからそんなに忙しくなるとも思えない。
そういえば
uncaught exception: #<NameError: uninitialized constant RMail::Serialize>
ってのもあるな。うーむ。まだ、コピーを残す必要がありそうだ。
YAMLでパラメータを設定して、ERBで展開する方法を摸索。
YAMLで
--- a: 1 b: 2
のようなハッシュを作って
<%= hash['a'] %>
で展開させればいいんだろうけど、どうも気に入らない。
require 'yaml' require 'erb' module MyTemplate def self.run(template) hash = YAML.load(<<-'end') --- a: 1 b: 2 end ERB.new(template).result(binding) end end print MyTemplate.run(<<'EOF') a = <%= hash['a'] %> EOF
hash['']の部分がうっとうしい。ここは
<%= a %>
と書きたいところだ。 evalでaを定義すればできなくはない。でもそのためだけにevalってのもねえ。
method_missingを使ってみるか。
require 'yaml' require 'erb' module MyTemplate @hash = YAML.load(<<-'end') --- a: 1 b: 2 end def self.run(template) ERB.new(template).result(binding) end def self.method_missing(symbol, *) @hash[symbol.to_s] end end print MyTemplate.run(<<'end') a = <%=a%> end
いいかもしれない。