バリケンのRuby日記 RSSフィード

2006-06-14

[] QuickMLソースコードを読む(7) /usr/lib/ruby/1.8/quickml/config.rbの続き  QuickMLのソースコードを読む(7) /usr/lib/ruby/1.8/quickml/config.rbの続き - バリケンのRuby日記 を含むブックマーク はてなブックマーク -  QuickMLのソースコードを読む(7) /usr/lib/ruby/1.8/quickml/config.rbの続き - バリケンのRuby日記  QuickMLのソースコードを読む(7) /usr/lib/ruby/1.8/quickml/config.rbの続き - バリケンのRuby日記 のブックマークコメント

昨日の日記の続きだよ。

QuickML::Config#ml_mutexメソッド

    def ml_mutex (address)
      @ml_mutexes.fetch(address) {|x|
        @ml_mutexes[x] = Mutex.new
      }
    end

これは、スレッドロックを制御するml_mutexメソッドだね。@ml_mutexes(ハッシュオブジェクト)に対して、addressを引数にしてfetchメソッドの実行を依頼するよ。

Hash#fetchは「addressをKeyとする要素があればそのValueを、なければブロックを実行(つまりaddressをKeyMutex.newをValueとするHash要素を@ml_mutexesに追加)」という動作をするよ。

QuickML::Config::loadメソッド

    def self.load (filename)
      self.new(eval(File.safe_open(filename).read))
    end
  end
end

self.loadとすることで、クラスの特異メソッド(つまりクラスメソッド)を定義しているよ。

File::safe_openメソッドは/usr/lib/ruby/1.8/quickml/utils.rbで定義されているんだよね。これは、filename文字列を引数として指定したファイルオープンして、Kernel#evalでテキストファイルをスクリプトとして評価しているよ。

このメソッドの呼び出し側は、デフォルトでは/etc/quickml/quickmlrcだったよね。/etc/quickml/quickmlrcのファイルも見てみよう。

# -*- mode: ruby -*-
mailname = File.open("/etc/mailname") do |fp| fp.read.chomp; end
Config = {
  :port => 10025,       # see /usr/share/doc/quickml/with-mta.rd
  :user => "list",
  :group => "list",
  :bind_address => "127.0.0.1",

  :smtp_host => 'mail.example.net',
  :smtp_port => 25,
  :domain => 'example.net',
  :postmaster => "postmaster@example.net",
  :info_url => "http://QuickML.com/",

  :data_dir => '/var/lib/quickml',
  :pid_file => '/var/run/quickml/quickml.pid',
  :log_file => '/var/log/quickml/quickml-log',

  :verbose_mode => true,
  :max_members => 100,
  :max_mail_length => 100 * 1024,
  :ml_life_time => 86400 * 31,
  :ml_alert_time => 86400 * 30,
  :auto_unsubscribe_count => 5,

  :sweep_interval => 3600,
  :max_threads => 10,
  :timeout => 120,
  :use_qmail_verp => false,

  :confirm_ml_creation => false, # for confirming ML creation.

  # :message_catalog => nil,  # for English messages
  :message_catalog => '/usr/share/quickml/messages.ja', # for Japanese messages
  # :authorized_creators_list => '/etc/quickml/authorized_creators',
  # :distribute_address => "dist@#{mailname}",
  # :report_address => "notify@#{mailname}"
}

一見設定ファイルのように見えるけど、実はRubyスクリプトの一部なんだねえ。

今日はここまで。ようやく/usr/lib/ruby/1.8/quickml/config.rbを読み終わったね。

トラックバック - http://rubyist.g.hatena.ne.jp/muscovyduck/20060614