Just another Ruby porter,

〜2004年8月中旬〜


<Prev(,) | Next(.)> | Recent(/)>> | RDF

2004-08-11 (Wed)

[Soft] less を通すと色が消えてしまう

lsのほうは-Cオプション。色つきで見たければless -rで。

[Mail] 中身のないメール

連続して30通ほど来た。うっとうしいもんが流行りだしたなあ。

[Mail] deliver_mh

とりあえず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

2004-08-12 (Thu)

[Mail] Thunderbirdのジャンクメールコントロール

最近Thunderbirdのジャンクメールコントロールの調子が悪い。 学習させても全然覚えてくれないという感じ。 で、いろいろ探してみると 「ジャンクメールコントロール」の「適用フィルタ」に 「訓練データのリセット(R)」というボタンがあった。 以前はなかったよなあ、こんなボタン。

30通ほどのspamで学習しなおししたら、賢くなったような気がする。 明日また学習させよう。


2004-08-13 (Fri)

[Vim] set filetype=ruby

vimを使っていてちょっと不満に思うのはrdeliverの設定ファイル(~/.rdeliver)のようにsuffixがないファイルを編集したとき。 そりゃわかんないよね、vimには。.rbというsuffixがないとruby modeにならない。 で、いろいろ試してみた。

shebang(#! /usr/local/bin/ruby)をつけてみる。おお、いけてるね。 つぎにmodelinesを使って、ファイルの最後に

# vim:set filetype=ruby:

を置いてみる。いけてる。これでもいいのか。

[Mail] rdeliverとbogofilter

というわけで、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:

2004-08-14 (Sat)

[Ruby] [ANN] Project Name Changed to "One-Click Ruby Installer"

Ruby Installer for Windowsが名前をOne-Click Ruby Installerと変えた。 Windowsだけでなく、他のOSのインストーラも作るらしい。

ところで実際にインストールしてみるとone clickじゃインストールできないので注意。 いや注意する必要はないか。

[Soft] Dnsmasq 2.13

そういえば2.12はなぜかインストールしてなかった。

Changes:

A crash bug was fixed. All users are encouraged to upgrade.

2.12に強烈なバグがあったらしい。

[Soft] Zsh 4.2.1

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.

[Mail] procmailからrdeliverへ

今日から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な対応がしやすくなった。


2004-08-15 (Sun)

[Ruby] RDoc::Usage

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

2004-08-16 (Mon)

[Cygwin] Updated: gcc-3.3.3-2 / gcc-mingw-20040810-1

やっと3.3.3に上がったか。長かったね。

Rubyのmakeは問題なし。

[Cygwin] Linux上にgcc 3.3.3-2のCygwinのクロス環境を作る

久し振りに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

うまくいってるようだ。


2004-08-17 (Tue)

[Ruby] RDocでmarkup

[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の時計がかなり遅れてる。 教育テレビが正午に時報を鳴らさない季節になったか。 一年に一度の手動時刻設定だ。


2004-08-18 (Wed)

[Ruby] Tcl/Tk stubs

2年ほど放っておいたTcl/tk 8.4.xでstubsがSEGVる件を調査。 どこでSEGVるのか調べたら、struct TclWinProcsのgetFileAttributesExProcが初期化されてないことが判明。 というわけで、Tcl_FindExecutable()を呼ぶことで解決。


2004-08-19 (Thu)

[Mail] rdeliver.rbのログ

一応まだ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>

ってのもあるな。うーむ。まだ、コピーを残す必要がありそうだ。


2004-08-20 (Fri)

[Ruby] YAMLとERB

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

いいかもしれない。


<Prev(,) | Next(.)> | Recent(/)>> | RDF


WWW を検索 jarp.does.notwork.org を検索

わたなべひろふみ
Key fingerprint = C456 1350 085F A320 C6C8 8A36 0F15 9B2E EB12 3885
Valid HTML 4.01!