Python で処理する

EOS 6D で撮られたデータを,手っ取り早く python で処理したいと思います.fits にさえなっていればいつも通りの処理で出来るのでとりあえず fits にします.

git clone git://github.com/eaydin/cr2fits.git

このソフトはシェルでしかえ使えないようになっているので subprocess とか使って一旦書き出さないといけません.鬱陶しい.さかさかさかっと書き換えます.

git clone git://github.com/youtsumi/cr2fits.git

というわけでこれなら import cr2fits として readcr2asfits("filename", channel) とすれば pyfits class が返って来ます.しかし,このソフトクソ重いな.なにやってんだろ.時間ができたら別な手段考えよう.

EOS 6D を買いました

去年,EF8-15mm F4L フィッシュアイ USM を買いました.このレンズ,APS-C でも使えるのですが,フルサイズじゃないと全周魚眼にならないので,手持ちの EOS Kiss X3 じゃ我慢できず,結局フルサイズセンサーの載っている EOS 6D を買ってしまいました.高かった・・・

パソコンから制御する.

さて,何をするにしてもコンピュータから制御できないと話にならないので,早速 Mac から制御するようにしたいと思います.

$ port install gphoto2

昔 gphoto2 で 5D MkII を操作する実験をするときに作ったメモを参考にいろいろやりたいと思います.

実験室に行ったので EOS を持って帰ってきて聞かれた積分時間の件試してみました.
次のようにすれば積分時間を変えることができます.
$ gphoto2 --shell
gphoto2: {/home/utsumi} /> set-config capture=on # 撮影関係のパラメータが有効になる
gphoto2: {/home/utsumi} /> get-config eos-shutterspeed # 積分時間のリスト表示
gphoto2: {/home/utsumi} /> set-config eos-shutterspeed=35 # 1/100 sec
gphoto2: {/home/utsumi} /> capture-image-and-download

ちなみに
gphoto2: list-config
とかやると設定できる項目が表示されます.
たとえば gphoto2 を起動したばかりでは
gphoto2: {/home/utsumi} /> list-config
/main/settings/capturetarget
/main/settings/capture
/main/capturesettings/focuslock
と出てきます.最初はこれらしか設定できません.
get-config capture
とかやると
gphoto2: {/home/utsumi} /> get-config capture
Label: キャプチャ
Type: TOGGLE
Current: 2
と出てきます.おそらく TOGGLE は Bool 型を示すのだと思います.
get-config eos-aperture
とかでレンズの設定(レンズ内の絞りとかを調整できます.)

ちなみに,これらはカメラ本体のダイヤルが指定しているモード(MとかP)に
対応する機能変更しかできないようです.
すべて自由にいじりたいなら M がいいのではないかと思います.

最後にこれらの機能は全てシェルからも行えるようです.
シャッタースピードを表示する.
$ gphoto2 --set-config capture=on --get-config eos-shutterspeed
1/100 sec で撮像する.
$ gphoto2 --set-config capture=on --set-config eos-shutterspeed=35 --capture-image-and-download

昔の自分エラい.かなり助かった.ただ,これ書いたときは Linux でやってたようで Mac でやるときには PTPCamera daemon に block されてしまうので

killall PTPCamera

をする必要があるようです.http://www.twam.info/software/read-out-canon-eos-7d-shuttercount-on-os-x

さて 6D をやるときにはまたちがうようです.実験するためには RAW 画像が欲しいのでそれを設定してみます.

$ Killall PTPCamera
$ gphoto2 --shell
> list-config <-- やれることの確認
> get-config imageformat
> set-config imageformat=20

次に ISO 感度を変えます.(とりあえず ISO 100)

> get-config iso
> set-config iso=1

そして,最後にシャッタースピードの変更です.(とりえあず 15s )

> get-config shutterspeed
> set-config shutterspeed=3

ここまで出来ればあとは

> capture-image-and-download

とやれば積分できて local ディレクトリに保存されます.

撮影した FirstLight 画像(ダーク)

今回は gphoto2 2.5.0 (正式には 6D に対応していない) バージョンでやりましたが,問題なく使えました.

iPhone5 を買いました.

iPhone5 を買いました.iPhone 4 からの進化とそれから,softbank から au への MNP をして au LTE が使えるようになったおかげで外出先ではとても快適なモバイルライフがおくられるようになりました.特にまな板と化していた wifiiPadテザリングを使うことで外出先でも使えるようになったことも大きな進化です.転出手数料(3000円前後)と更新月じゃないというしばり(10000万円以下)で,かなり余計な出費もとられましたけど wimax などを契約するよりも安く,こうした環境が手に入れられたのは"基本的には"とても満足できる出費だったと思います.ところが,そんなハッピーな iPhone5 ですが,実は購入してから二つの問題があることに気がつきました.

2G回線をつかまされる問題

一つは 2G 回線をつかまさせられる問題です.3G とか LTE とか書いてあるところに「○」の表示がでて通信速度が低速になるものです.LTE 回線網はまだ張り巡らせている途中ですから,そこら中に LTE 網の穴があることはしょうがないと思います.その場合,3G 回線での通信に切り替わり,数Mbps 程度の通信速度になることが予想される訳です.ところが,実際は 3G 回線はおろか,2G 回線をつかまさせられて,そのままはなさないという現象がありました.いくら高速な iPhone でも,2G回線のように帯域幅が狭い回線では役に立ちません.これについて,調査したところ iPhone は PRL (ローミングエリア情報) と呼ばれる情報を頼りにアンテナをつかみに行っているらしいのですが,これの情報が古かったことがわかりました.さっそく,更新法を試したところ,そこら中が LTE ネットワークだらけになり,さらに LTE が接続できなくてもほとんどが 3G 回線になり,高速なインターネットが楽しめるようになりました.

更新法

更新法は

・日本国内から「*5050」宛に電話発信し「au ICカードのデータ更新が完了しました。」の表示確認後、電源を一度オフにしてから再起動するとPRLが更新されます。
ローミングエリア情報更新法
http://www.au.kddi.com/iphone/service/kokusai.html

です.

調べたかは次のページに書いてありますが,私のは 3 でした.10/18 更新後 5 になりました.
http://blogs.itmedia.co.jp/shiro/2012/10/kddiiphone-52gp-38b6.html

ある環境下では wifi 接続が出来てもパケットが流れない

この問題はかなり頭を悩ませた問題です.職場の無線LAN環境 (WPA personal) では,アクセスポイントにつながったことになるけれども,パケットがまったく流れないのです.リセットたところで直りませんでした.やはりこれに着いても調べたところ,初期不良がある機種が多少あり,交換してもらうとなおるということで,アップルストアで交換してもらいました.アップルストアの店員には「原因がよくわからない上に現象を再現することができないので,交換して様子を見てもらうだけ」ということで,心もとない対応をされましたが(そりゃそうですけど),交換自体は一瞬で終りました.はってあった液晶保護フィルムは当然のように補償されませんでした.また,アップルストアには液晶保護フィルムの類いのものは売っていないので,結局近所の家電量販店で再購入しました.
さて,検証結果ですが,職場のネットワークにつないでみたところ本当に何事もなかったかのようにパケットが流れるようになりました.めでたしめでたし.この一週間とかでなんか変わったんですかね???と,原因があんまり判然しないところにやや不安を感じますが,これで正真正銘の iPhone 5 ライフが始まります.ということで,終わりにしたいと思います.

ちなみに
http://www.chipmunk.nl/klantenservice/applemodel.html/
iPhone のシリアルナンバーをいれると製造工場や製造週が調べられます.これらの情報で特定できるらしいのですが,
交換前

Model introduced: 2012
Serial number: ***
Production year: 2012
Production week: 39 (September)
Name: iPhone 5
ModelCode: iphone_5
Model Number: MD664
Group1: iPhone
Group2:
Generation: 7
Machine Model: iPhone5,2
CPU speed: 1.3GHz
Family name: Become a pro user to see this information. (sorry)
Screen size: 4 inch
Screen resolution: 1136x640 pixels
Colour: Black
Capacity: 64GB
Factory: F1 (China, Zhengzhou - Foxconn)
External link: Technical specifications by apple-history.com
External link: Repair guide by iFixit
Uitbreidingen: Uitbreidingsmogelijkheden van dit apparaat

交換後

Model introduced: 2012
Serial number: ***
Production year: 2012
Production week: 38 (September)
Name: iPhone 5
ModelCode: iphone_5
Model Number: MD667
Group1: iPhone
Group2:
Generation: 7
Machine Model: iPhone5,2
CPU speed: 1.3GHz
Family name: Become a pro user to see this information. (sorry)
Screen size: 4 inch
Screen resolution: 1136x640 pixels
Colour: Black
Capacity: 64GB
Factory: DN (China, Chengdu - Foxconn)
External link: Technical specifications by apple-history.com
External link: Repair guide by iFixit
Uitbreidingen: Uitbreidingsmogelijkheden van dit apparaat

ということで,参照リンク先のヤバいロットとは違うようです.Model Number が新しいのでこちらのほうが大切な情報なのかも知れません.(気のせいか,一昨日見たときと結果が違う気がする・・・後日もう一回見てみよう)

https://discussionsjapan.apple.com/message/100714604#100714604
http://blog.livedoor.jp/sumahoreview/archives/17886281.html

パケット使用量

ちなみに動画とかは見ないけどテキストサイトはたくさん見る私のパケット使用量を載せておきます.

1日前 (2012/10/19) 73,737キロバイト <- iPad テザリング
2日前 (2012/10/18) 124,632キロバイト <- そこら中で speed test やった
3日前 (2012/10/17) 85,612キロバイト <- iPad テザリング
4日前 (2012/10/16) 26,892キロバイト

ちなみに,ここにはないですが,パソコンからテザリングしたときには簡単に200Mbyteくらいになりました.

分散と不偏分散

この歳になるまできちんと理解していなかったので一応まとめておきたいと思います.平均値に並ぶ基本的な統計量として,分散が上げられると思います.この分散var=\sigma^2の計算は

\sigma^2=\frac{1}{N}\sum_{i=1}^{N} (x_i-\bar{x})^2
で得られるわけです.ところが,この手の計算を習うときに,よく N で割るのではなく,
\sigma^2=\frac{1}{N-1}\sum_{i=1}^{N} (x_i-\bar{x})^2
N-1 で割るという定義を見たことがあると思います.これを不偏分散と言います.「平均値が決まっていないので,自由度が一個減る」という説明が与えられていることが多いです.これの効果をいまいち理解していなかったのですが,時と場合によっては非常に大きいことを理解しました.

正規分布に従う乱数を n 回 sampling し,それから分散と不偏分散の平方根を計算します.それの頻度分布を示したものが次のグラフです.

青が不偏分散の平方根で,緑が分散の平方根です.正規分布の分散は1ですので計算された数値はどれも 1 になることが期待されますが,実際は sample が無限ではないために sample 数に応じた広がりを持ちます.
極端な例として sampling 数 n=2 の場合と n=1000 の場合も載せました.見て分かる通り,n=2 の場合は 1 を中心とした分布でさえありません.1 を中心とした分布になるためにはすくなくとも n=5 程度必要そうです.n=5 の場合の分散と不偏分散の平方根の頻度分布を比べます.普通の分散は明らかに左側によっています.分散の値を過小評価してしまうのです.程度としては19%.もし,この計算法を使った値でパラメータフィッティング等を行えば明らかにこの偏り(バイアス)は見えるはずです.一方で不偏分散の場合,こちらはおよそ3%です.5倍以上ましな結果を与えることが分かります.

どうしてこんなことになるかというと,不偏分散の期待値を計算すると
wikipedia:分散#.E4.B8.8D.E5.81.8F.E5.88.86.E6.95.A3.E3.81.AE.E6.9C.9F.E5.BE.85.E5.80.A4
にある通り母関数の分散に等しいからです.分散自身を計算すると,1-1/n 倍になってしまいます.「自由度が減る」という効果のせいで分散の期待値がそもそも母関数の分散と一致しないという決定的な違いがあったのです.
なんとなく大学や統計の教科書で習ったのですが,実感として現れて来たのが初めてなのでかなり驚きの結果でした.というか,普通はそもそも n=5 で分散とか計算しない・・・

ていうか恥ずかしー.

小数に強いはずの bootstrap test を試す

真値 0 を持ち,分散 1 で観測される x という変数を 5 回観測したとする.その5回の観測量から,元の分布関数の特長を調べたいので bootstrap する.

import numpy
import pylab
n = 5
trial = 1000
a=numpy.random.normal(0,1,n)
b=numpy.array([a[map(lambda x: int(x), numpy.random.rand(n)*n)].std() for i in range(trial) ])
pylab.hist(b)
pylab.show()

観測値 vector が a で b が bootstrap 的に実現した vector の列.

>>> a.std()
0.82869230791556148
>>> b.std()
0.2586508738464719
>>> b.mean()
0.69612006856055253

観測値の標準偏差は 0.83で,その誤差が 0.26 程度とって,もとの統計関数の標準偏差 1.00 と誤差の範囲で一致する.