KeyMission 360 用のメモリカードの要件

KeyMission360にはSDカード付いてきませんのでKeyMission360買う時はメモリカードを忘れずに用意しましょう。

で、そのメモリカードですが、公式サイトの主な仕様のところには「microSD/microSDHC/microSDXCメモリーカード(市販)」としか書かれてなくて、えっmicroSDカードだったらなんでもいいの? って思うじゃないですか。
でもそんなことはなくて、箱の中の仕様説明書にはこうかかれてました。

  • UHS-Iに対応しています。
  • 動画の撮影には、SDスピードクラスがClass6以上のmicroSDXCメモリカードをおすすめします。
    • 動画のサイズ/フレームレートが[2160/24p](4K UHD)または[1920/24p]の時は、UHSスピードクラス3以上のメモリカードをおすすめします。
    • 転送速度が遅いメモリーカードでは、動画の撮影が途中で終了することがあります。

えーとだからニコンさん、HPの主な仕様のところにこれを載せてくださいよ。買う前に知りたいんですよこれを。メモリカード一緒に買いたいじゃないですか。まあ4K動画ならUHS-I U3とか当然でしょと言われればまあそうなんですが


というわけで自分はこれを買いました。64GBで足りるかなーと思いつつえいやっと128GB。

本体が到着した今日はあいにくの雨模様だったので週末ちょっと試してみたいと思います。

KeyMission 360 をiOSアプリでペアリングできない時に確認する初歩的な2点

Twitterで検索してみるとKeyMission360がiOSアプリでペアリングできない、ってのをちらほら見かけるのですが、自分のiPhone7/iOS10.1ではペアリングできました。(かなり悪戦苦闘しましたが。。。

もしiOSでKeyMission360のペアリングに失敗するという人は以下の2点をちょっと確認してみてください。もしかしたらうまくいくかもしれませんし、もしかしたらやっぱりダメかもしれません。その時はスミマセン。

チェックポイントその1:
KeyMission360とペアリングするためのアプリは「SnapBridge 360/170」です。「SnapBridge」ではありません。
Nikonの他のカメラは「SnapBridge」アプリを使うのですが、KeyMission360と170だけはこのアプリで使うことができません。代わりに「SnapBridge 360/170」という専用のアプリを使います。

ヒドいのは、KeyMission360の外箱などにプリントされてるQRコードからストアに進むと「SnapBridge」の方がダウンロードされてしまうことがあること。自分はそれでハマりました。

「SnapBridge 360/170」はホーム画面上では名前がハショられて「SnapBridg…」と表示されます。以下のスクショを参考にしてください。左側の、アイコン上に 360/170 と書かれてる方がKeyMission360用のアプリです。
km01

チェックポイントその2:
アプリでペアリングする前にbluetooth設定でKeyMission360をbluetooth接続してはいけません!
「SnapBridge 360/170」アプリは、”bluetooth未接続なKeyMission360″ でないと接続できません。
変に気を回して「先にBluetooth接続しとかないとアプリで反映されないんじゃね? と設定画面のBluetoothのところでKeyMission360を見つけて接続してしまうと、その後アプリでペアリングしようとしても必ず失敗してしまいます。
km02
この “アクセサリを選択” のところで KeyMission 360_xxx… をタップしてもエラーが出てその先に進めない場合はこれが原因の可能性があります。
その場合は設定アプリ→Bluetooth と進み、「自分のデバイス」のところに KeyMission360があったら右端の (i) をタップし、「このデバイスの登録を解除」をします。
その後で、カメラ本体再起動、アプリも立ち上げ直してペアリングを試してみましょう。。。 うまくいく。。。 かもしれません。。。

この「先にBluetooth接続されてるとSnapBridge360/170アプリでペアリングに失敗する」ってのは、ペアリングに成功して解除する時に出てくるんですよね。
km03

これ先に書いといてくださいよ。。。

外部GPSレシーバなどほとんどのBluetooth機器は「先にBluetooth接続しておく」のがセオリーなので、慣れてる人ほど無意識的にハマってしまう罠です。ハマりました。 くっ。。。。

COM と WRL::ComPtr

これまで中途半端にOpenGLESとMetalを使ったことがあるくらいでDirect3Dはまったくいじったことのないオッサンが「まあMetalとそんな変わらんだろう」といきなりDirect3D12に挑戦して四苦八苦してます。ロートルオジサンにはつらい。。。

で表題の件ですがDirectXのオブジェクトは基本COM。Direct3D12になってもCOM。
D3D12からは言語はC++しかサポートせず、そしてオブジェクトの保持や破棄は全てプログラマが責任持って管理するようになったのにCOMを使う利点って何だろう。。。
もうValkanのようにイチから設計し直して欲しかったがそれならValkanをどうぞということだろうか。

それでCOMですが、アラフィフになってえっCOMって何? なロートルおっさんなので勉強しました。

  • 参照カウント方式。AddRefしたらReleaseする。カウンタがゼロになったら解放される
  • 戻り値や引数でCOMを返却する関数は関数側でAddRefして返す。関数から受け取った側は必要なくなったらReleaseする。

MRC時代のObjective-Cの参照カウンタと似たかんじで、これはOK。

次に WRL::ComPtr。 参照カウンタの面倒を自動化してくれる。すばらしい。

ただ、参照カウンタをどう扱うかのポリシーみたいなやつのドキュメントが見当たらない。どう使っていいのかいまいちピンとこない。しかたないのでComPtrのヘッダをみてみる。

WRL::ComPtrはコンストラクタや代入でCOMオブジェクトを受け取る時に必ずAddRefし、管理しなくなる時に必ずReleaseする。
これは徹底している。参照カウンタが元に戻ることが保証される。
右辺値参照にも対応し、moveする場合は参照カウンタは増えない。

これはなかなか良い。

だけども、Create系関数から返却されたオブジェクトをComPtrで扱おうとするとあれっとなる。
Create系関数から返却されたオブジェクトはすでにAddRefされた状態で返ってくるので、こいつはAddRefせずにReleaseだけ行う。
だけどコンストラクタや代入でWRL::ComPtrに渡すとAddRefしてしまう!!

で、どうするんだろうとサンプルコードなどをみると、ComPtrでCOMオブジェクトを受けるのはこんなカンジになってる

ファッ!?? ってなりますよね。 なりますよね?

&deviceって何??
なんでComPtrのアドレスを直にD3D12CreateDeviceの引数にぶっこんでるの??

と思ってComPtrのヘッダをみると、単項 & 演算子がオーバーロードされていた。こいつがDetails::ComPtrRef<ComPtr<T>>を返す。さらに Details::ComPtrRefの operator InterfaceType**() が呼ばれて、元のComPtrのReleaseAndGetAddressOf()を呼ぶ。。。。 つまり、上記のCreateDeviceのところは

と書くのと同じである。

これでようやく、ああ、ComPtr内部で持ってるオブジェクトのポインタのアドレスを渡して直接オブジェクトを得るんだな。この時AddRefはされないんだな。そしてComPtrのデストラクタで無事Releaseされるんだな。というのが理解できた。

これくらいのことをヘッダ辿って調べるのは一般的なC++erだったらきっと至極当然のことなのであろう。だからWRL::ComPtrのこの辺の挙動を疑問に思うエントリがぐぐっても出てこないんだ。たぶん。
でもロートルおじさんはこの辺の挙動を理解するのに苦労したのでこうして書き留めるよ。

しかしこれ、 &device って書くよりも device.ReleaseAndGetAddressOf() って書く方が圧倒的にわかりやすいよねえ。。。