JSの設定

2010年7月16日金曜日

同一局面に至る手順の違いで勝率が変わる?

yamajunn21さんのtwitterから引用:

週刊将棋の記事をみて思ったのだが、▲7六歩△3四歩▲2六歩より▲2六歩△3四歩▲7六歩の進行の方が先手勝率が高いって面白すぎる。同一局面なのだから、局面の問題でなく、その手順を選ぶ棋士の問題。
.@spinel3 ▲7六歩△3四歩▲2六歩(手順1)の先手勝率0.505で、▲2六歩△3四歩▲7六歩(手順2)の先手勝率は0.599で約1割違うとのことです。本当に面白いですよねえ。


うーん不思議だ。何でそうなるのか、ちょっと考えてみよう。
対局数としては▲7六歩△3四歩▲2六歩のほうが多いだろうから公平な比較はできないが、仮に居飛車党の先手にとって▲2六歩△3四歩▲7六歩の手順が有力であるとすれば、初手26歩に対する84歩は望むところ(少なくとも、初手76歩に対する84歩よりはウェルカム)なのだろう。

※後手が振り飛車党の場合は初手がどうだろうと2手目はだいたい34歩なのだから先手は手順を工夫する必要はない。なにしろ先手は3手目に25歩とするつもりがないのだから。

よって、26歩・84歩の出だしと76歩・84歩の出だしの先手勝率を比べて前者が高いようなら
「▲7六歩△3四歩▲2六歩の局面(局面A)を目指すなら初手は26歩とすべき」ということになる。

では、仮にそういう理由で手順2を経て局面Aに至るのが有力であるとして、手順1経由より勝率が高いもっともな理由がありうるとしたら、それは何か?

結論からいうと、yamajunnさんの言うように「同一局面なのだから、局面の問題でなくその手順を選ぶ棋士の問題」であろうと考えている。つまり、手順1が伝統的な出だしであるのに対して手順2は明らかに意図的なので、それを採用するには上の議論で述べたような「何か特別な理由」が必要である。多くの棋士を集めて何回も対戦させたら手順1と2が誰の棋譜にも均等に現れるというものではない。

「何か特別な理由」を持っている特定少数の棋士だけが手順2を選ぶのであり、それはやはり意識が高い棋士のなせる技だと思われる。

2010年7月11日日曜日

willcomのメールフィルタリングの不自由さを解決する

いかに、携帯(PHS)に残したいメールだけ(自動的にフィルタリングして)残すかという話。
willcomのメール設定では、fromアドレスを指定してメールの受信を拒否することができる。
アスタリスクが使えるので、例えば「*@*.com」みたいな条件を設定することができるが、
正規表現までは使えないので加減が難しい。そもそも、fromアドレスだけじゃなく本文もフィルタリング条件にしたい。

これを実現するために、知人には携帯アドレスではなく例えばGMailのアドレスを伝えることにし、そこに届いたメールは一旦全て自宅サーバに転送してしまい、思う存分フィルタリングをかけた上で好きなものだけ携帯に送るようにしてはどうか。間にGMailを挟むことで可用性が向上する上、第一フィルタリングをGMailで設定することによって自宅サーバの負荷を抑えられる。
メールの種類によって読む端末を分けたい場合にも有効で、GmailならiPadやiPhoneを初めとする無線LAN対応機器を使い通信料を発生させずに読むことができる。


「思う存分フィルタリング」のやり方。
だいたいここに書いてあることと同じだが、procmailrcの内容を以下のように変えている。これにより、メールソースを渡しつつfoward.rbを実行することができる。


MAILDIR=$HOME/Maildir/
DEFAULT=$MAILDIR
RubyDir=$HOME/scripts/ruby
TmpDir=$HOME/tmp/
LOGFILE=$MAILDIR/proc/`date +%Y-%m`.log
LOCKFILE=$HOME/.lock
VERBOSE=ON

:0 Hc :
* .
|cat > $TmpDir/mail; $RubyDir/forward.rb


メールソースをrubyで扱うのにtmailというライブラリが便利なのでこれを利用する。メールを送信するにはnet/smtpを使うが、認証がうまくいかなかったのでaction_mailerを使うことにした。
gem install tmail
gem install action_mailer

以下、forward.rb の例。


#!/usr/bin/ruby

require 'rubygems'
require 'action_mailer'
require 'tmail'
require 'kconv'

〜中略〜
mail = TMail::Mail.load(mail_path)
# 前述のprocmailrcの「cat > $TmpDir/mail」で保存した一時ファイルを指定している
subject = mail.subject
body = mail.body
〜中略〜

# 日本語文字化け対策つきメール送信メソッドの定義
class HogeMailer < ActionMailer::Base
@@default_charset = 'iso-2022-jp'
@@encode_subject = false
def hogeMessage(recipient, mySubject, myBody)
from 'from@from.com'
recipients recipient
subject '=?ISO-2022-JP?B?' + Kconv.tojis(mySubject).split(//,1).pack('m').chomp + '?='
body Kconv.tojis(myBody)
end
end


#認証とかの情報設定
ActionMailer::Base.smtp_settings = { :address => '127.0.0.1',
:port => 25,
:domain => 'XXX',
:user_name => 'XXX',
:password => 'XXX',
:authentication => :login}

#送信!
HogeMailer.deliver_hogeMessage('to@to.com', mail.subject, mail.body)


上記では単に転送しているだけだが、mail.fromやmail.bodyを正規表現などでフィルタリングしたあと
複数の宛先に投げ分ければよい。また、大量のスパムメールが直接携帯アドレスに届くような場合には、willcom側の設定で例えば「*.com」を拒否しておき、forward.rbの中でfromアドレスを「.com」→「.etc」のように書き換えた上で転送するなど、色々応用がきく。