海野秀之(うんのひでゆき)の外部記憶
Twitter (twilog) / RSS / アンテナ / ぶくま
HHKになぜλキーがないのかと和田先生を問い詰めてみたい (が、もちろんそんな勇気はない)
http://www.lingr.com/room/gauche/archives/2007/01/31
というのを見ていて思い出した。
小学生のころ電話級とったんですが、その試験勉強本にでてくるλという字の読み方がわからなくて、こころの中で「入る(はいる)」と読んでいた。
とくに支障はありませんでした。
おお、すてき。どれくらい素敵って、思いついたのが自分じゃなかったのがくやしいくらい、素敵。
例によって ja.reddit 経由。
% web off
で、ネットがみられなくできたらいいと思いませんか?
ってなわけで、 「WEBrick でプロキシサーバを作る(るびま)」 を参考に、たまに遮断できるプロキシサーバを書いてみました。
#!/usr/local/bin/ruby
# proxy.rb [offline]
#
# a http proxy server can shutout your request when set as offline.
#
# 2007/Feb/02 written by UNNO Hideyuki.
require 'webrick'
require 'webrick/httpproxy'
require 'uri'
empty_response_handler = Proc.new(){|req, res|
res.body = <<EOS
<html><head><title>Web offline!</title></head>
<body style="margin-left:3em;">
<H1>It is now isolated from Web space.</H1>
<p>Enjoy your more <b>important</b> activity!<br/>
- proxy.rb written by UNNO Hideyuki.</p>
</body></html>
EOS
}
config = {
:BindAddress => '127.0.0.1',
:Port => 8080,
:Logger => WEBrick::Log::new('logfile.txt'), # ←もちろん、てきとーに変えるべし
:ProxyVia => false,
# 親プロキシは必要に応じて
:ProxyURI => URI.parse('http://hogehoge:8080/')
}
if ARGV[0] and ARGV[0] == 'offline'
config[:ProxyContentHandler] = empty_response_handler
end
s = WEBrick::HTTPProxyServer.new(config)
trap('INT'){ s.shutdown }
s.start
お見せするほどの物じゃない気はしますが、~/bin/web はこんなの:
#! /usr/local/bin/ruby
# -*- mode:ruby -*-
PROXY='/home/ほげ/bin/proxy.rb'
def kill_proxy
t = 0
user=`whoami`.chomp
while proxy_pid=`/bin/ps -u#{user} | grep proxy.rb`.slice(/^(\d+)/, 1)
cmd="kill #{proxy_pid}"
puts "[Stop] #{cmd}"
system cmd
sleep 0.5
t += 1
break if t > 100
end
end
case ARGV[0]
when 'on', 'online'
puts "Turn on to be online."
kill_proxy
system("#{PROXY} 2> /dev/null&")
print "[Start Proxy] ", `sleep 1; /bin/ps -e | grep proxy.rb`, "\n"
when 'off', 'offline'
puts "Isolated from Web space, enjoy!"
kill_proxy
system("#{PROXY} offline 2> /dev/null&")
print "[Start Proxy with offline mode] ", `sleep 1; /bin/ps -e | grep proxy.rb`, "\n"
when 'kill'
kill_proxy
else
print <<EOS
web [on|online|off|offline]
on | online: (re)start http proxy server with online mode.
off | offlne: with offline mode.
kill : kill the proxy.
EOS
proxy_pid=`/bin/ps -e | grep proxy.rb`.slice(/^(\d+)/, 1)
if proxy_pid
puts "\nNow proxy is runnig with pid:#{proxy_pid}."
else
puts "\nProxy is not running now."
end
end
あとは、使っているブラウザに http://127.0.0.1:8080/ をプロキシとして設定すれば、 おっけい。
こんなの欲しがってるの、ぼくだけ?
ちょっと修正: kill のあとに少し待った方がいいみたいなので、sleep ついか。 (0.5 という数字に意味があるのかどうか不明)
うぅ、「将棋」カテゴリを立てるのはずーっと後のつもりでしたが、 ちょっと面白い計算結果がでたもので。
ある局面を、駒の損得だけで評価するものとします。 「100% 先手が勝つでしょう」を 1, その逆が 0, 半々が 0.5 のような評価値を得たいとして、 どんな計算式でもとめましょうか?
今日時点で私の手元にある回帰方程式はこんな感じになりました。
p = 0.5326
+ 0.0803 * 金 (= 先手が持っている金の枚数 ひく 後手が持っている枚数)
+ 0.0520 * 銀 (以下同様)
+ 0.0258 * 桂
+ 0.0163 * 香
+ 0.0053 * 歩
+ 0.0625 * 飛
+ 0.0601 * 角
+ 0.0782 * 成銀
+ 0.0806 * 成桂
+ 0.0362 * 成香
+ 0.0494 * と
+ 0.1299 * 竜
+ 0.0990 * 馬
駒の損得なしの状態で先手が勝つ確率は約 53% *1。 金をただで取られたら、片方に金が 1 枚ふえて、片方から 1 枚減るので、 確率は 0.0803 * 2 でおよそ 16 ポイント変化します(パーセンテージが 16 変動する)。 手元のデータ (から推定した線形 *2 回帰方程式) によれば、ですが。
これだけで何かの役にたつものではないし、そもそも、単純な計算まちがいをやらかしている 可能性も大ですが、上の数字を見ているだけでも、結構楽しい。
飛車と角の価値がほとんどおなじなのは、プロの棋譜を分析したから、かな (初心者は飛車を好むといいますね)。
意外にも 金 > 飛車,角 なのは、成ってなんぼということなのか。 例えば、仮に相手の金と自分の飛車を交換して、その後相手に飛車を打って竜をつくられたら、 ちゃんと「不利」とでます、一応。 あ、でも、プロの棋譜に登場しないようなトレードオフは回帰係数に反映されないのかも……知れない。
やはり竜最強。
歩→との昇進ぶりは、やはり。
ほんと、ただのメモ。
おうちの x86 Solaris 10 で R をコンパイルしようとしたら、 __builtin_isnan がみつからねーとかいってこけた。
ちょこちょこためすと、おうちの環境(詳細メモってない)では、 -std=gnu99 をつけるとこうなるようだったので、coufigure 書き換えの反則により、 -std=gnu99 をためさない(よって付けない)ようにした。
まー、これでコンパイルでけました。
なんのこっちゃわかってないので、ひつよーにせまられたら、かんがえましょう。 (man isnan は過去のしがらみの権化のようなむーどで *1)
*1 Linux 上で man isnan しても、新しい方のことしか書いてなさそう。Solaris 10 上でみた man isnan は、なにやらあれでした(謎、ってか僕がわかってない)。
「日曜プログラミング」といきたいところですが、 土・日は3才の息子と全力であそばないといけないので、 金・土に夜更かしすると身が持たないのだ。
子供って、休みの日にも、朝ぱちっと目覚めて、 ひたすら動いて、よるぱたっと寝るんですよね。
それに対抗し得るためには(体力はむこうの方がある!)、 こっちも早寝早起きするしかないのです。
というわけで、また当分オフラインで〜す。
あー、コード書きてぇな(うずうず *1
*1 コードを書く時間が取れないことにもメリットはあって、そのうちひとつがこの、「『コードを書きたい』という気持ちにさせる」だったりするんですがね。他にも(書く前に考える時間が増えるとか)ありますが、断トツはこれ。
キーボードショートカットなんて、一所懸命おぼえるようなもんじゃないと思っているのですが、いちいちマウスに手を伸ばすのが苦痛になったときが仕入れどきじゃないかとも思う。
ほかにも、なにかの弾みで覚えちゃうのもあるかも。 ぼくは、 これを読んで、 Ctrl+L を使うようになりました(たまに)。
このたび、タブの切り替えが苦痛だったので、Ctrl+TAB (次のタブ)を仕入れ。 Opera を使っていたときには 2 を押していたので、 Firefox へ移ったときに失われたのだ。
Ctrl+T (新しいタブを開く)はもとから使っていた。
「生あくび」という字面を読んだだけで、あくびがでた。 (ニキ・リンコさんの日記 の冒頭を、 田崎さんのアンテナ にあるダイジェストで見ただけなんだけど) すげー。
連想装置とあくび発生器は、よほど近くに置いてあるらしい。
いつ思いついたのかというメモにしかならない気がしますが。 (昨日思いついて興奮したんだけど、きっと誰でも気づくな。)
Bitboard については、「チェス盤はちょうど 8x8 で 64-bit になってよさそうだけど」 程度にしか思っていなかったのですが、ちょっと気が向いて Crafty の作者が 書いている文書を読みはじめた。
そこで、はっと!
これとは別に、だいぶむかしに、容量優先最適化したら将棋盤表現はどうなるかなぁ
*1
と
考えたことがある。
まだ情報量的にコンパクトではないけど 40-byte
(しまった、こんだけでは成れない。もっと増える)
かなぁと思ったんだけど、
いかにも動かしにくそうだった。
で、棋譜 DB 向けならまだしも、ゲーム木探索向けではないだろうなぁ
くらいに思ってそのままにしてあった。
が、がが!!
これは、もっともナイーブに、メモリ無駄遣い的に実装した bitboard を、 ひょっと圧縮したような形になっているのではないかな。 (常に 1-bit だけ on になるような 81-bit bitmap の情報量は 81-bit もない!)
ひょっと圧縮したので、ひょっと元に戻るぞ。
わりかしコンパクトなので、局面同士の比較コストも小さめである。 あー、ハッシュは Zobrist hashing だとばかり思い込んでいたけど、ちょっと違うものに なるなぁ。
盤表現は 40-byte (←計算しなおさないと。このままでは 34-bit 不足してる筈。
エンコードは考え直し。),
ワークは bitboard と attack table の併用でとりあえず決めておこう。
しかし、Hyatt の文章は発見的に書かれていて、 エッセー調で、とても面白い。まだ読みはじめたばっかりだけど、全部訳しながら読もう。
訳すのはコストが掛かるのだけど、何度も読み返すときのコストが激減するのと、 条件が整ったら(著者にお伺い?)訳したものを web に置けるかなぁ。
関係ないけど、transposition table を訳すなら「移行判定表」がいいと思った (ちょっと前までは「別手順表」だと思っていた)。 まあ、「転置表」/「置換表」が誤訳であることは間違いない。 *2
Bitboard がらみなんですが。
ある特定の bit だけが on であるような整数を、 その、on にしたいビットの番号からつくるのは簡単です。1 を必要なだけ左シフトすればいい。
では、そのような整数の、1-bit だけ on になっているビットのビット位置を知るには どうすればよいか。
「ハッカーのたのしみ」図 5-12 にあるプログラム片をもとに、次のようなコードを 書いてみました。
/*
* Before calling bitpos64 or bitpos32, you should check
* x is not zero.
*/
inline static int
bitpos64(unsigned long long x)
{
volatile double value;
volatile unsigned long long *p = (unsigned long long*) &value;
value = (double) x;
return (((*p >> 52) + 1) & 0x3F);
}
inline static int
bitpos32(unsigned long x)
{
volatile double value;
volatile unsigned long long *p = (unsigned long long*) &value;
value = (double) x;
return (((*p >> 52) + 1) & 0x1F);
}
びみょーに怪しげですが、sparc, x86_64 いずれにおいても期待どおり動作する模様。 (unsigned long long を用いているぶん、エンディアンの影響を受けないところが、 「ハッカーのたのしみ」にあるオリジナルと異なります。)
大は小を兼ねるのですが、余計なキャストがいやなので、 64-bit 版と 32-bit 版の両方を用意しました。
追記:上記のコードは、「1-bit だけ on になっているビットのビット位置を知る」 ために使えますが、より正確には、on になっているビットのうち、一番 MSB に近いものの ビット位置を知るために使えます。ただし、「ハッカーのたのしみ」の元のコードにあった、 x が 0 だった場合のための対処がないので、0 でないことは呼び出し側で保証する必要が あります。
Before...
# うんの [金を簡単には手放さないから、とか、詰みがないのに無闇に守りの金を剥しにはいかない、とか、ありそうです。 プロの棋譜..]
# うんの [自分むけメモ: 手番を勘案することに関して。 標本点を、「次が先手の番」と「次が後手の番」の2グループにわけて、..]
# うんの [↑言い訳註: えー、あー、妄想は妄想ですので。 上に書いたようなのは、静的な評価によらず、動的なゲーム木探索によっ..]