トップ 最新 追記

uDiary

海野秀之(うんのひでゆき)の外部記憶

Twitter (twilog) / RSS / アンテナ / ぶくま

2006|07|08|09|10|11|12|
2007|01|02|03|04|05|06|07|08|09|10|11|12|
2008|01|02|03|04|05|06|07|08|09|10|11|12|
2009|01|02|03|04|05|06|08|
2010|01|02|03|05|06|07|10|11|
2011|03|08|
2012|02|04|07|08|10|
2013|01|02|03|05|06|08|11|12|
2014|01|02|05|06|07|08|09|12|
2015|01|02|03|04|

2007-02-02 (Fri)

読めなくても、なんか心のなかでは読んでいる

HHKになぜλキーがないのかと和田先生を問い詰めてみたい (が、もちろんそんな勇気はない)

http://www.lingr.com/room/gauche/archives/2007/01/31

というのを見ていて思い出した。

小学生のころ電話級とったんですが、その試験勉強本にでてくるλという字の読み方がわからなくて、こころの中で「入る(はいる)」と読んでいた。

とくに支障はありませんでした。

[Web] Radium Software --- Identicon

おお、すてき。どれくらい素敵って、思いついたのが自分じゃなかったのがくやしいくらい、素敵。

例によって 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 という数字に意味があるのかどうか不明)


2007-02-07 (Wed)

[Web] リスク忌避による死

「人生は短いということを自分に思い出させる!」ために読むと良いのではないかと思います *1

♯「枝」より上の人が読んだら、「Microsoft はリスク忌避してるかもしれないけど、それによって死んではいないんじゃない?」と言い出しそうな気がした。

ja.reddit 経由。

*1 自称「葉っぱ」の自己憐憫のおかずにしてしまっては…


2007-02-08 (Thu)

[将棋] 駒得だけで勝敗を推定しようとしたばやい

うぅ、「将棋」カテゴリを立てるのはずーっと後のつもりでしたが、 ちょっと面白い計算結果がでたもので。

ある局面を、駒の損得だけで評価するものとします。 「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 回帰方程式) によれば、ですが。

これだけで何かの役にたつものではないし、そもそも、単純な計算まちがいをやらかしている 可能性も大ですが、上の数字を見ているだけでも、結構楽しい。

飛車と角の価値がほとんどおなじなのは、プロの棋譜を分析したから、かな (初心者は飛車を好むといいますね)。

意外にも 金 > 飛車,角 なのは、成ってなんぼということなのか。 例えば、仮に相手の金と自分の飛車を交換して、その後相手に飛車を打って竜をつくられたら、 ちゃんと「不利」とでます、一応。 あ、でも、プロの棋譜に登場しないようなトレードオフは回帰係数に反映されないのかも……知れない。

やはり竜最強。

歩→との昇進ぶりは、やはり。

*1 「うげっ」と思われるかも知れませんが、ま、そーゆー、その程度の推定式なのです。

*2 おそらくですが、線形近似でいいのかという問題より、駒得だけで判断していいのかという要素の方がでかい。

本日のツッコミ(全6件) [ツッコミを入れる]

Before...

# うんの [金を簡単には手放さないから、とか、詰みがないのに無闇に守りの金を剥しにはいかない、とか、ありそうです。 プロの棋譜..]

# うんの [自分むけメモ: 手番を勘案することに関して。 標本点を、「次が先手の番」と「次が後手の番」の2グループにわけて、..]

# うんの [↑言い訳註: えー、あー、妄想は妄想ですので。 上に書いたようなのは、静的な評価によらず、動的なゲーム木探索によっ..]


2007-02-09 (Fri)

-std=gnu99 と isnan

ほんと、ただのメモ。

おうちの 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 コードを書く時間が取れないことにもメリットはあって、そのうちひとつがこの、「『コードを書きたい』という気持ちにさせる」だったりするんですがね。他にも(書く前に考える時間が増えるとか)ありますが、断トツはこれ。


2007-02-13 (Tue)

[Web] (資料) Firefox Help: キーボードショートカット

キーボードショートカットなんて、一所懸命おぼえるようなもんじゃないと思っているのですが、いちいちマウスに手を伸ばすのが苦痛になったときが仕入れどきじゃないかとも思う。

ほかにも、なにかの弾みで覚えちゃうのもあるかも。 ぼくは、 これを読んで、 Ctrl+L を使うようになりました(たまに)。

このたび、タブの切り替えが苦痛だったので、Ctrl+TAB (次のタブ)を仕入れ。 Opera を使っていたときには 2 を押していたので、 Firefox へ移ったときに失われたのだ。

Ctrl+T (新しいタブを開く)はもとから使っていた。


2007-02-14 (Wed)

あくびの伝染力

「生あくび」という字面を読んだだけで、あくびがでた。 (ニキ・リンコさんの日記 の冒頭を、 田崎さんのアンテナ にあるダイジェストで見ただけなんだけど) すげー。

連想装置とあくび発生器は、よほど近くに置いてあるらしい。


2007-02-20 (Tue)

[Web] あ、なるほど。

わざわざ写真が掲載されているのは、珍しいな、なんでかな、 と一瞬とまどいつつ読みはじめたわけですが……。

そーきたか。

「こんなに長生きすると知ってたら、60の時にバイオリンを始めたろうに。 そしたらもう40年の経験を積んでいたことになる・・・」

ふっふっふ。あっしは 30 過ぎで始めましたぜ。

ja.reddit 経由でした。


2007-02-23 (Fri)

[将棋] スペース優先最適化案と Bitboard

いつ思いついたのかというメモにしかならない気がしますが。 (昨日思いついて興奮したんだけど、きっと誰でも気づくな。)

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

*1 メモリアクセスコストの高い今日ですから、試しに容量優先最適化を考えてみる価値は常にあると思います。

*2 さらに関係ないけど、Control transfer は「×制御転送」ではなく「○制御転移」だと信じている。

本日のツッコミ(全4件) [ツッコミを入れる]

Before...

# うんの [ま、試作は Ruby で Array の attack table だけど。]

# うんの [さらにメモ: 「ハッカーのたのしみ」 5-1 にはワード中の 1 ビットの数え上げというのがある。]

# うんの [ビットの足しあげは、 ・たくさん 1 があるケース ・1 が少ないケース ・1 がある方がめずらしいケース で最適な..]


2007-02-27 (Tue)

bit 番号をこたえる

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 でないことは呼び出し側で保証する必要が あります。

関連:IEEE 754 (Wikipedia)


2006|07|08|09|10|11|12|
2007|01|02|03|04|05|06|07|08|09|10|11|12|
2008|01|02|03|04|05|06|07|08|09|10|11|12|
2009|01|02|03|04|05|06|08|
2010|01|02|03|05|06|07|10|11|
2011|03|08|
2012|02|04|07|08|10|
2013|01|02|03|05|06|08|11|12|
2014|01|02|05|06|07|08|09|12|
2015|01|02|03|04|
Categories 3imp | Card | Cutter | Dalvik | Euler | Football | GAE/J | Hand | Haskell | Re:View | Ruby | Scheme | TQD | Tiger | TigerBook読 | UikiTeXi | Verilog | Violin | Web | parconc | tDiary | お勉強 | エントロピー | ツン読 | | 将棋 | 政治について | | 模写してみよう | 確率論 | 設定など | 雑文 | 音声