憂鬱な午後のひととき


2月27日_
下記pdfに書いてるlocaleなんて使わないから大丈夫って思ってる人もいはるかもしれない. でも注意書きに書いたように外部ライブラリが変更してるかもしれないし(昔のMySQLのクライアントライブラリがやってたことがある), 例えばWindowsだとwcoutでワイド文字列を出すには最初に std::locale::global(std::locale(""));とかして設定しておかないといけない. そうなったときにstream系全てに依存してしまうというのは覚えておいたほうがよいと思う.
#include <iostream>
#include <locale>
#include <boost/lexical_cast.hpp>

int main()
{
    /*
      デフォルトロケールを設定
      これが無いと"こんにちは"は表示されない
    */
    std::locale::global(std::locale(""));
    std::wcout << L"こんにちは" << std::endl;
    /* 端末の設定が日本語だと例外にならずに123456になってしまう */
    std::cout << boost::lexical_cast<double>("123,456") << std::endl;
}
2月26日_
Boost.勉強会 #4参加
あまり普通の教科書には載ってない感じの注意点の中から, 小ネタをいくかしゃべってみた(資料). 懇親会はキャンセル空きを期待してたけどでなかったのでshinhさんとkikxさんとカレーを食べに行った. 改札でチャージしてる間にはぐれてしまったのが残念.
2月21日_
パソコン, もう一度掃除をして埃をとる. 録画が不要になったので不安定要素を少しでも取り除くためにチューナーカードを外す. 今のところ安定してる.
2月20日_

本当はVAIO type-Rの後継機を買いたかったのにモニタ別売の機種は出ないし(テカテカモニタは見れたものじゃない), そもそもSandy Bridge当分出そうに無いし. というわけでパソコンで見るのを諦めてテレビを買うことにした. ついにデジタルだ.

考えてみれば昔からビデオデッキやMD, CDプレーヤや携帯音楽プレーヤやテレビなどを一度も買ったことが無い. 今回が自分で買ったパソコン以外の初めてのAV機器になるのかな.

基本録画してしか見ない, 見たら消すという使い方. 大きいのは要らないけどfullハイビジョンは欲しい条件で去年調べてたときはREGZAの録画ありの32インチかなと思ってた.

ところが, よく見るとAVCには非対応なんだなあ. HDD増設は面倒だし, AVC優先で探すとAVC同時録画可能なものってざっと見た限りではBRAVIAしかないんやね(32インチより大きいのは対象外).

で, その時点でfullハイビジョンは諦めるわけで, それなら32インチじゃなくて26インチでいいやとなって結局KDL-26EX30Rに決定. 5年保証つけて約8万3千円.

初見の感想は, (想像はしてたけど)起動が遅いこと. まあ仕方ないか. 色は意外にも明るすぎず落ち着いた感じ. 流石に綺麗. 暗いシーンが真っ暗で何やってんのか分からなかったのも見える. アンテナケーブルが別売なのを知らなくてちょっと困った. 押し入れを探して余ってた一本をつけることにした. これだとBSが映らないけどまあいいか.

PC入力端子(RGB)があるので今使ってる24インチのWUXGAと横に並べてデュアルモニタで使うことも出来る.

ブルーレイプレーヤも内蔵なので手持ちの数少ないDVDを再生してみようと思って入れてみると…表示できませんと出る. あれリージョン2なのにと思ってよく調べたらPAL非対応だった. なんと. パソコンでしか見たこと無いから全然知らなんだし気にもしなかった.

2月19日_
・東京に引っ越してきた友達の家に遊びに行く. ダンボールに何箱かパズルがあった. ルービックキューブだけでもへんちくりんなものがいっぱい. 7x7x7とか3x3x5とか3x3x1とか3x3x3が斜めに二つくっついたのとか. 凄い. 一見どうやって開けるのか分からないからくり箱も, わりといろいろやったことがあるけど見たことないのもあって楽しい.
・パソコンが本当に危険. 何度も突然リブートする. NHKの画面もノイズが酷いし(まだアナログ), 録画も失敗するしで諦めるか.
2月18日_
・Extの定義, 実は講演のとおりのを採用していたら微妙なところでずっと困ってて結局諦めて正しい定義からやり直した. というわけで近いうちにそのあたり書き直す.
確率の神の話
universal的なものは確率に限らずいろいろあるけど, Ωを"神のさいころ"と喩える見方, おもろいな.
2月17日_
パソコンが, ブルー画面にもならず何の前触れもなくリブートしてしまう現象が今日だけで5, 6回発生. 本当に寿命が近そうだ. Sandy Bridgeが出るまで持ってほしい.
2月16日_

西尾さんが確率変数が変数なのか写像なのかよく分からないと言ってて, まあ厳密な定義は難しいし, なんとなくでいいんじゃないのという話になった(比喩を使うといつまでもわかったような分からないようなものだから). とは言え少しはちゃんと見てみようかという気もする(私は確率論を勉強したことがない).
で, 岩波数学辞典の定義から

○ 確率空間(Ω, F, P)とは

  1. Ω : ある集合
  2. F : Ωの部分集合でσ加法族であるもの
  3. P : F → R(実数全体)
    1. P(E) ≧ 0
    2. E1, E2, ...が互いに素ならP(∪Ei) = ΣP(Ei)
    3. P(Ω) = 1

満たすものを言う. σ加法族は置いといて, もう少し定義を続けよう.

という. こちらはまあよさそう. では定義を見直してみよう.

Ωは考えている対象の空間. たとえばコイントスならΩ = {表, 裏}, サイコロならΩ = {1, 2, 3, 4, 5, 6}, 宝くじならΩ = {1等, 2等, 3等, はずれ}, [0, 1]区間の一様分布ならΩ = [0, 1]とか.

σ加法族
集合の演算(合併, 共通部分, 補集合)の可算無限回の操作(***)で閉じているもの.
つまり,A ∈ FならAの補集合AcもFの元, A, B ∈ Fなら A∪B ∈ F, A∩B ∈ Fとなっているものをいう.

これは,事象Eの確率P(E)を考えるなら,その余事象の確率もP(Ec)も当然考えたい. とするとPの定義域にEcも入ってないと困る. 同様にP(A∪B)とかP(A∩B)も考えたいからそれらも入ってて欲しい. その操作は可算無限回ぐらいはしたいよねと.

ここで, 「なぜF="Ωの部分集合全体"としないのか」という質問があった.
素朴にはそれでいい. 実際Fが有限集合ならそれで何も問題ない. ただΩ = [0, 1]やR(実数全体)などのときに困ることがある. そういう時に確率を計算するとき積分が入ってくるのだけど, Rなどの部分集合の中には測度(面積)が定義されないものが存在する.

そういうへんちくりんなものは取り除いておきたいという気持ちがそういう定義になっている.

Pの条件は素朴に持ってる確率のイメージを素直に書き下したもの.

2)の条件と3の条件から空集合Φに対してP(Ω∪Φ) = P(Ω) + P(Φ)となってP(Φ) = 0. P(A∪Ac) = P(A) + P(Ac)からP(A) ≦ 1も出る.

ざっくりいうと確率空間(Ω, F, P)とは, 事象の全体Ωと, Ωの"都合のよい"部分集合全体Fと, Fの各元に素朴な確率を割り当てたものである.

では変数なのか確率なのか写像なのか言葉で言われてもよく分からない確率変数の定義を見てみよう.

○ 確率変数とは
(Ω, F, P)を確率空間とする. X : Ω → RがF可測なとき,Xを確率変数という.

なんとXとは標本の全体から実数全体への写像であった.
F可測というのは任意のa ∈ Rに対して,X-1((-∞, a))={ w ∈ Ω | X(w) < a} ∈ Fであることを言う.

(-∞, a)の逆像がFの元ならその補集合[a, ∞)cの逆像もまたFの元になる. 区間[a, b)は [a, b) = (-∞, b) ∩ [a, ∞)なので[a, b)の逆像もFの元になる.
∩[a, b+1/n) = [a, b]なので[a, b]の逆像もFの元, (a, b)の逆像もFの元...

というわけで,これは区間(a, b)から(***)の操作でできる全ての集合(これをRのボレル集合B(R)という)の逆像もFの元ということを含んでる.

Rの部分集合全体の集合2Rの中にはルベーグ可測という積分が出来てうれしい部分集合の全体L(B)がある. そして, ボレル集合B(R)の元は全てルベーグ可測である. つまり

ボレル集合 ⊂(=ではない) ルベーグ可測集合 ⊂(=ではない) Rの部分集合全体

という関係がある. B(R)はL(R)より真に小さく, L(R)は2Rより真に小さい. まあ, でもここではそういう細かいところは置いておこう.

○ 確率空間(Ω, F, P)と確率変数 X : Ω → Rがあったときに, φ : B(R) → [0, 1] を φ(A) = P(X-1(A)) で定義してみる.

Xの定義からB(R)の元Aの逆像X-1(A)はFの元であるから確率Pを求めることができる. φは確率の性質を満たしているのはほぼ明らか. つまり(R, B(R), φ)という組は確率空間になる.

要はいつまでもΩ = {表, 裏}とかでやってたくないのでざっくりRにマップして(R, B(R), φ)で考えたいという意図である(本当かな). 具体的に見てみよう. 確率空間は

(Ω={表, 裏}, F = {Φ, {表}, {裏}, {表, 裏}}, P({表}) = P({裏}) = 1/2)

である. 確率変数を

X({裏}) = 0
X({表}) = 1

とする. X-1(0) = {裏}, X-1(1)) = {裏}, X-1([0, 1]) = {表, 裏}となる. そうするとφ(0) = 1/2, φ(1) = 1/2, φ([0, 1]) = 1となる.

φ = P・X-1をPと同じものとみなしてP(X = {裏}) = 1とか書くことがある.

同様に正規分布の場合はΩ = R, F = B(R), P(A) = 1/√(2π)・∫A exp(-x2/2) dx, X : R ∋ x → x ∈ Rとしてみる. 本当はx ∈ Rに対して P(X^-1([-∞, X(x)))を考えているのだけど, これをざっくりP(X ≦ x)とかいたりする.

まとめると, 部分集合全体を考えたいのだけど, それだと病的なケースがあるのでそれを避けるために都合のよい部分集合を考えた. 確率空間がいろんな形をしてると面倒なのでR上で考えるように確率変数という写像を用意した. 素朴な確率の表記と整合性をとるところでP(X-1(X(A)))をP(X=A)と略記した. ということでよいのかな.

2月14日_
・何度見てもlikelihoodの訳の尤度が好かん. もちろん"尤もらしい"は"もっともらしい"と読むこと知ってるのだけど, 最尤推定量とか書かれるとやな感じになってしまう. で, 「それっぽい」と脳内変換してみた. 一番それっぽい推定は頻度主義に基づき, それっぽい値を最大にする方法. おお, なんとなくいいかげんさの本質が伝わってくる(ほんまかいな).
先日見つけたvpextrwのNASMとMASMのバグ. MASMはVS2010 SP1に間に合わなかったそうな. 使う人は気を付けましょう. NASMは直るようだ.
2月13日_
ワンダー×ワンダー世界記憶力選手権
そんな競技があったのかというのも驚きだが中国勢の活躍にもびびった. 主催者の予想を超えて5分で480個のランダムな数を完全に覚えてしまったらしい. 私なんか自分の携帯電話の電話番号と実家の番号しか覚えてないし, 自分の住所の番地も間違うぐらい酷いのに.
2月12日_
C++のSTLアルゴリズムには関数ポインタよりも関数オブジェクトを渡そうという話
>関数のアドレス値はプログラム実行時に決まる.
そんなことない. 仮想関数の場合は, 実行時にどれを選ぶかが決まるけど普通の関数のアドレス値はコード生成時に決まる.
だからその関数が大きくなくてinline指定されてるならインライン化されるんじゃなかろうか. 少なくとも"インライン化できない"という理由は間違ってる.
もちろん, その関数が別のcppにあってglobal最適化されないなら関数呼び出しになってしまうことはあるけど, inline指定うんぬんがあるのでそれを言ってるのではないよね.
どんなgccで試したのか書いてないけどgcc 4.5なら-O2で同一のコードを生成した.
関数ポインタの場合       関数オブジェクトの場合
.L5:                    |.L4:
    addl    $1, (%edx)  |    addl    $1, (%edx)
    addl    $4, %edx    |    addl    $4, %edx
.L16:                   |.L15:
    cmpl    %edx, %ecx  |    cmpl    %edx, %ecx
    jne .L5             |    jne .L4
    addl    $1, %eax    |    addl    $1, %eax
    cmpl    $99, %eax   |    cmpl    $99, %eax
    jg  .L18            |    jg  .L17
    movl    %ebx, %edx  |    movl    %ebx, %edx
    jmp .L16            |    jmp .L15
.L18:                   |.L17:
    testl   %ebx, %ebx  |    testl   %ebx, %ebx
    je  .L13            |    je  .L12
VC2008でも同一.
$LL3@main:
      mov    eax, edx
      cmp    edx, ecx
      je     SHORT $LN45@main
$LL56@main:
      inc    DWORD PTR [eax]
      add    eax, 4
      cmp    eax, ecx
      jne    SHORT $LL56@main
$LN45@main:
      sub    esi, 1
      jne    SHORT $LL3@main
2月10日_
・XbyakにAVX対応させてって言ってきた人, βリリース2日後に早速使ってくれてる. 素早い.
こないだ渋谷のジュンク堂に『モンスター―群のひろがり』(原田 耕一郎)を探しに行ったけど無かった. たまたまそこにいた友達が持ってるというので品川まで貸してもらいに行った. 事前に地図は見てたのだけど, ビルは大きすぎるし, 立体歩道が長くてどこで曲がっていいのかわからずしばらくさまよった. 圧倒されるなあ.
2月9日_
ランニングシューズがすり減ってきてたので新しいのを買った. 11000円ぐらい. 前回はかなり軽かったけど今回はどっしりした感じ. 体重計で量ると100gぐらい重たい? 靴は1~2年で買い換えるものらしい. とするとランニングコスト(おお, しゃれではない)は割と高いんやな.
2月8日_
『風花病棟』(帚木蓬生)
終身医療や, 術後の精神ケアなどにまつわる短編集. ベテランの医師が登場する渋い話が多い. こんなお医者さんに見てもらえたらいいなあと思う. 電子カルテ書いてるお医者さんって, モニターを見たままこっち見ないで話すことがあるけど, あれやだなあ.
2月7日_
早速vpextrwに関するバグ報告があったので update. 単体テストで比較対象に使ってたnasmもバグってるぽい.
 vpextrw ecx, xmm2, 2
をアセンブルするとC5 F9 C5 CA 02 --- (A)が正しいはずなのにC5 F9 C5 D1 02 --- (B)になっていた. いろいろ調べてたらマイクロソフトのmasmも同じバグを踏んでる感じ. masmが間違うとは思いにくいけどマイクロソフトのデバッガやIntelのAVXエミュレータでは(B)のコードは'vpextrw edx, xmm1, 2と解釈されていたので多分masmが間違ってる.
ところで64bitモードでvpextrw rcx, xmm2, 2は上位bitが0拡張されるのでvpextrw ecx, xmm2, 2と同じコードになっていいと思う. IntelのマニュアルにもREX.Wは無視されるとあるし. ただXbyakではその部分の単体テストの都合上yasmに合わせた. というわけで, vpextrw rcx, xmm2, 2は今のところ1byte無駄なコード生成をする.
2月5日_
・xgetbvの件についてyottuiさんから実はVC++には既にあると教えていただいた. ありがとうございます. gccはinline asmを使えばいいのでこれは解決.
uint64_t getXfeature()
{
#ifdef _MSC_VER
    return __xgetbv(0);
#else
    unsigned int eax, edx;
    __asm__ volatile("xgetbv" : "=a"(eax), "=d"(edx) : "c"(0));
    return ((uint64_t)edx << 32) | eax;
#endif
}
・FMAってSandy Bridgeには入ってないのか(ということをついさっき知ったほど何もしらない). 実装しなくてもよかった.
・VEX.Wに関してIntelの日本語のマニュアルの説明が分からなくてえらい苦労していた(翻訳が悪いというわけじゃない). なんとか理解して実装が終わってから, そういや英語版ではどうなってるのだろうと見たらW0とW1の他にWIGという項目が増えていた!
日本語版はバージョンが古かったのか. うかつだった.
2月4日_
この3日間, ひたすらXbyakをAVXに対応させていた. とりあえずβ版公開. 一気に数百命令増えたのでかなり大変だった. ニーモニックによって引数が微妙に違ったりするので結局一つずつチェックした. おかげでnasmのバグ(多分)もいくつか見つけた.
ToDo: リファクタリング, AVXが使えるかの判定(xgetbvのintrinsicがVC++に見当たらないけどどうしようか). 実機が欲しいな. FMAの代替ニーモニック. vfnmadd231sd()なんて大変だよな.

御意見は光成滋生<herumi@nifty.com>までお願いします