娘が女になるということ

下の子(女の子)が、この春から小4になった。もちろん、まだまだ子供なんだけど、このあいだ会話していて、こりゃぁもう女やなぁと思ったことがあり。こんな調子だった。


散歩がてら、ちょっと離れた公園に行く道すがら



僕「最近、学校はどうなの」
娘「○○先生(担任)がマジキモくてさぁ、このあいだね……(おっさん上司の愚痴。1分くらい続く。詳細を聞く必要はない)」
僕「あーーーあのオッサンかぁ、まぁ確かにね」


娘「でも△△先生(別のクラスの担任)が、体育で男子とサッカーしてるのとかは、超カッコ良くってぇ〜〜……(隣の芝生が青く見える話。2分くらい続く。詳細を聞く必要はない)」
僕「あの人は若いからねぇ、キラキラしてるよね、友達はどう?」
娘「xxちゃんがyyくんのこと好きなの、zzちゃんは知ってるのにyyに告白しようかな、とか言ってるんだよ、マジでウザくない?てか、マジでね……(同僚女子の悪口と恋愛話。10分くらい続く。詳細を聞く必要はない)」
僕「なるほどなるほど、小学生にもいろいろあるんやね」


娘「しかもね、××って男子が、最近変なちょっかいかけて来て超ウザくって……(同僚男子の悪口。2分くらい続く。詳細を聞く必要はない)」
僕「まぁねぇ、何かそういう人ってどこにでもいるよね、なんでだろね?」


娘「てゆーか、宿題多すぎてマジで死ぬわ(仕事の愚痴。短い)」
僕「日曜日って週に4日は欲しいよね」


娘「そういえば、この靴おばぁちゃんが買ってくれたんだよ!(ファッションの話。褒めれば良い)」
僕「かわいい色だね、似合ってるよ」


娘「何か楽しいことないかなぁ(提案しろ!)」
僕「じゃぁ、今度、河原で凧揚げでもしようか(ワクワク感の醸成。どうせ本人も忘れるので約束を守る必要はない)」


途中で、コンビニに寄る


僕(ビール♪ビール♪)
娘(お菓子の棚の前でじっと凝視。お店では常に自分の興味のあるものしか見えない。手に入らないと分かっていても、とにかく見る)
僕(ビールと一緒に、こっそりガリガリ君を買っておく)


コンビニを出る


僕(ビールをプシュッとしながら、コンビニの袋ごとガリガリ君を渡す)
娘(ガサゴソ。(゚∀゚)キタコレ!!)
娘「何これいつのまに買ったのちょー嬉しい!お父さん大好き!!(結論:食べ物で釣れ)」


こちらからは以上になります。



ビット演算事始 - 株式会社リクルートテクノロジーズ Advent Calendar 2014 12/23

最近、Hacker's Delightという本を買いました。

Hacker's Delight (English Edition)

Hacker's Delight (English Edition)

この本の2章は、Basicsというタイトルで、ビット演算について、基本的な性質や関係式が述べられているのですが、この本は前文にあるとおり、証明は書かないので、慣れてないと読むのに苦労しますというか、しました。という訳で、特に2.2節に出てくる等式を読み解く為に考えた事のメモをもって、株式会社リクルートテクノロジーズAdvent Calendar 2014の12/23分の記事とさせていただきます。

以下、このエントリでは、8bitの符号付き/無し整数を考えます。また、整数を10進表記する際には日常通りに表記し、2進表記する際には、01010101bのように、最後にbを置きます。

2の補数表現

コンピュータの中では、符号付きの整数は、少し変わった方法で表現されます。普通に考えれば、+/-の表現に1bitを使い、残りの7bitで絶対値を表現すれば良いように思います。例えば、最左bitの0/1が+/-に対応するとすれば、

  • 1 = 00000001b
  • 2 = 00000010b ...
  • 3 = 00000011b
  • -1 = 10000001b
  • -2 = 10000010b
  • -3 = 10000011b ...

というように。しかし、実際には、負の数は

  • -1 = 11111111b
  • -2 = 11111110b
  • -3 = 11111101b

と、11111111bを-1として、後ろから順番に値が割当てられていて、これは2の補数表現と呼ばれています。これは何故かと言うと、引き算が足し算で出来るというご利益があるので、こうなっています。ちょっと何を言っているのか分からないと思うので、詳しく説明します。唐突ですが、xy平面上の単位円周を想像して下さい。点P0を(0,1)として、点P1から順に点P255までが、単位円周上に等間隔に並んでいるとします。さらに、

  • 点P0に8bitのbit列00000000を割当て、
  • 右回りに順番に点P1には00000001,
  • 点P2には00000010, …
  • 点P255には11111111が

割当てられているとします。この時、2の補数表現では、てっぺんの点P0が0,右回りに進むと、点P1が1, 点P2が2, …と1ずつ値が増加し、逆に左に進むと点255が-1, 点254が-2と、1ずつ値が減少していきます。右回りと左回りのカウントアップ/ダウンは、0のちょうど反対側、10000000が割当てられている点P128でぶつかるのですが、この点は128ではなくて、-128と解釈することになっています。こうすれば、先頭bitの0/1で値の正/負を判断出来るからです。0の場合が有るので、正確には正or0/負の判断ですが。このように値が表現されているのが、整数型の変数の値がオーバーフローした時に、絶対値の大きい負の値が出てくる理由です。

2の補数表現での引き算3 - 1を考えてみます。3は、点P3(00000011)に割当てられています。ここから1引いた値を知りたければ、単位円周上を、左回りに1目盛だけ進めば良いです。が、今、円周を考えているので、1目盛左回り進む事は、255目盛右回りに進む事と同じです。点P3から円周上を255目盛進んだ場所とは、点P3のbit列00000011に点P255のbit列11111111を2進数として足し算して、桁あふれを無視すれば得られます。これが、引き算が足し算で出来るという意味です。

+1, -1の意味

ここでは、整数に+1, -1をする事の、bit演算としての意味を考えてみます。例えば01010111bという整数に00000001bを足すと、01011000bになります。これは「右に詰まった1を0に反転し、最右の0を1に反転」という操作です。逆に、-1は「右に詰まった0を1に反転し、最右の1を0に反転」という操作になります。

論理否定の意味

ここでは、全てのbitを反転する操作の意味を考えてみます。2の補数表現の所で出てきた単位円を思い出します。点P0と点255の中点を点N1として、点N1と原点を結ぶ直線をnと呼ぶことにします。直線nは、y軸をちょっとだけ(目盛半分だけ)左に傾けた直線です。論理否定は、直線nに関する線対称移動です。これを今から数学的帰納法のような議論で示します。

まず、点P0(00000000b)と点P255(11111111b)は、bit列としては反転しており、かつ、直線nに関して線対称の位置に有ります。

次に、直線nの右側の点X、点Xと直線nに関して線対称な位置にある点Yについて、それらに割当てられたbit列が反転していると仮定します。この時、Xから1目盛右回りに進んだ点と、Yから1目盛左回りに進んだ点のbitが反転していることを示したいのですが、それは、先の+1, -1の操作の意味を考えると分かります。

-1倍の意味

-1倍は、シンプルにy軸での反転です。これは、殆ど自明だと思います。

-x = ¬x + 1の意味

2.2節には、上のような等式が出てきます。最初見たとき、全く意味が分からなかったのですが、上の単位円周をイメージしたら理解出来ました。上で述べた事を総合すると

  • 左辺は、y軸での反転
  • 右辺は、直線nで反転した後、1目盛分の回転

を意味していて、これらが等しいと言っています。全て線形変換なので、行列を比較すれば良いです。面倒臭いので、Rで確認します。

theta <- pi/128 # 1目盛の角度

# -1倍: y軸での反転
minus <- matrix(c(-1,0,
                   0,1),
                byrow=T,nrow=2)

# 論理否定: 直線nでの反転
# = y軸をtheta/2だけ左に傾けた直線での反転
# = 全体をtheta/2だけ右に回転して、y軸で反転して、全体をtheta/2だけ左に回転
rot.theta.2 <- local({
    p <- theta/2
    cs <- cos(p)
    sn <- sin(p)
    matrix(c(cs,-sn,
             sn,cs),
           byrow=T,nrow=2)
})
not <- rot.theta.2 %*% minus %*% solve(rot.theta.2)

# +1: 1目盛右に進む
# = thetaだけ右に回転
rot.theta <- local({
    cs <- cos(theta)
    sn <- sin(theta)
    matrix(c(cs,-sn,
             sn,cs),
           byrow=T,nrow=2)
})
plusone <- solve(rot.theta)

# -x = ¬x + 1の確認
minus - (plusone %*% not)


# > minus - (plusone %*% not)
#               [,1]         [,2]
# [1,] -1.110223e-16 0.000000e+00
# [2,]  0.000000e+00 2.220446e-16

1個の式の説明だけでダラダラと書いてしまいましたが、他にも色々な関係式が載っていて勉強になります。

C++でコマンドライン引数のパース

ヘッダ1つで使えるezOptionParserというのを
このあいだ使ったので、自分が使いそうな機能だけ抜き出して、メモ。
ヘッダ1つで使えるのは便利だ。

続きを読む

統計検定2級の勉強会資料

社内で統計検定2級の勉強会の講師を頼まれたので、指定テキストの4.4-4.7節の解説を作成した。あと、その場で、例として出てくる推定量の分布をシミュレーションするRコードを書いた。

せっかくなので、gistに晒しておく。誰かの役に立てば幸いです。

献本御礼:金融データ解析の基礎

著者の高柳さんから、献本いただいた。せっかくなので、簡単ではあるけれど、レビューを載せておく。

金融データ解析の基礎、なんだけど、解析の手法自体の説明はどちらかというと分量が少ない。データ解析それ自体についての本というよりも、データ解析を始める前の段階で苦労しがちな所を丁寧にまとめてくれている本である。データ解析手法について解説した本は巷に腐るほどあるが、こういう観点から情報を集めた本は、とても少ないので貴重だろうと思う。手法が全く載っていないという訳ではなくて、時系列やVARといった、金融実務を行う統計屋さんが知っておくべき手法については、基本的な所が一通り記載されている。

例えば、この本には為替・株価・金利ボラティリティ・財務諸表データ取得の方法が一通り載っている。データ解析というのは、ツールの使い方を分かっていても、解析すべきデータが手元に無ければ一歩も進めない訳で、取得の方法から書かれているというのは気が利いている。しかも、「このパッケージを使ってこの関数を叩く」というような素っ気ない説明ではなくて、データの取得方法を説明した後に、「ほにゃほにゃで変だな、と思ったらばこういう事をすれば良い」というような生々しい説明がされていて親切である。著者の誰か(もしくは全員)が実務の中で地雷を踏んで、解決方法の検索に時間が掛かったというような苦労が透けて見える。こういう知識がまとまって得られるのは実務者には大変に有り難い。パッケージを入れたけど思ったように動かなくて、ググりまくって数時間が潰した挙句、とても簡単な事だったので脱力するというのは、データ解析に限らずコンピュータに関連する全領域でよく有る。

これは目次には載ってないけど、1章の終わりには、Rに関する情報の検索先一覧がある。こういうのも、R初心者には価値のある情報だろう。こういう知識って、結構長くRを使って、色々な事を何度も何度も検索するというのを繰り返して、時間を掛けて身に付くものなので。恐らく、著者の方々は実務でRを使い倒しており、その中で結構な時間を問題解決方法の検索に費やしているだろうから、有用なリストであろう。

また、全世界のクオンツ共通の敵Excelとの連携方法も載っている。データ・ソースがExcelしかないとか、あるあるだよね。

個人投資家でRで経済指標・財務指標の分析をしたい、とか、データ解析以外の分野から今年新しくクオンツとして就職した、というような人に特にお薦めしたい。

金融データ解析の基礎 (シリーズ Useful R 8)

金融データ解析の基礎 (シリーズ Useful R 8)