@m_seki の

I like ruby tooから引っ越し

HKQueryAnchorの永続化についてのメモ

HKQueryAnchorの永続化のメモだよ

先日のHealthKitの練習のときのメモ。HealthKitのデータには登録順にアンカーと呼ばれる整数のようなものがつけられています。これを使うと前回読んだ事実(データ)よりもあとに増えた事実を集める処理が書きやすいです。Dripのキーに近い。

つまづき

アンカーはHKQueryAnchorのインスタンスです。作るときはこんな風にしました。

myAnchor = HKQueryAnchor.init(fromValue: 0)

整数から作れるのね。よしよし。整数にして保存しようっと...と思って困ったのは整数化するインターフェイスがないところ。
NSLogとかでデバッグプリントするときは内部の整数風の値を見ることができるけど、整数を取ることはできないみたい。

これはめんどくさい予感。

永続化

HKQueryAnchorから整数を取り出すのではなく、NSKeyedArchiver.archivedDataを使うのが正解みたい。UserDefaultsに保存するときはこうか?

    func saveAnchor() {
        do {
            let data = try NSKeyedArchiver.archivedData(withRootObject: self.myAnchor, requiringSecureCoding: true)
            let defaults = UserDefaults.standard
            defaults.set(data, forKey: "anchor")
        } catch {
            NSLog("encode failed")
        }
    }

失敗してもできることがないから、catchしなくてもいいくらいなんだけどどうするのが良いんだろ。

読み出しも同じようにした。

    func initHK() {
        // ...
        myAnchor = HKQueryAnchor.init(fromValue: 0)
        let defaults = UserDefaults.standard
        guard let it = defaults.data(forKey: "anchor") else { return }
        do {
            myAnchor = try NSKeyedUnarchiver.unarchiveTopLevelObjectWithData(it) as? HKQueryAnchor
        } catch {
            // nop
        }
    }

まだSwiftの?や!やtryの気持ちがわかってない。コード片も自信がない。

まとめ

自分なら整数か文字列にすると思う。けち。

HealthKitのデータのAnchorがDripみたいだった。凡庸。

Skagen Hybridを買いましたが

エルメスApple Watchを自慢されることが多いため、Skagen Hybridを買いました。
が、アクティブカロリーの単位(Cal = kcal と cal)を混同するバグが組み込まれていました。具体的に言うと1kcalが1cal(0.001kcal)として記録されてます。一日経っても1kcalを超えません。*1

解決策

どうしよう。思いつくのは以下の選択肢。

  1. 気にしない - iOS上のヘルスケアで値を目で読むときに1000倍して受け取ればいい。
  2. バグを報告して直してもらう - 治る気配ない
  3. データを修正する - じゃあこれで

データを修正するアプリを書くことにしました。

アプリの概要

アプリのやること。
HealthKitのアクティブエネルギーのログのうち、メタデータに記録されてるデバイスが「Fossil device」のエントリーを集めます。
このエントリーから開始時刻と終了時刻を転記し、カロリーを1000倍したデータをつくって、ログに書き加えます。
(念の為、万が一Skagenのアプリが修正されたときに備えて、1kcalを超えるエントリーがあったら無視するようにしました。)

ログを取得にはHKAnchoredObjectQuery()っていうAPIを使いました。これは、データベースのエントリーの発生順に振られるアンカー(単調増加の整数らしきもの)をヒントに、以前読んだ位置より新しいデータを読むことができるもので、Dripとよく似ています。

ソースはこれ。200行いかない。

github.com

どこで買うべきか

スカーゲン(SKAGEN) ユニセックス ハイブリッドスマートウォッチ HAGEN HYBRID(ハーゲン ハイブリッド) 【ブラック×ブラック/**】

↑これじゃないけど似てるやつ。Skagenの公式の通販で買ったけど、那須のアウトレットだと半額以下で買えること知りました。とほほ。
なお4ヶ月くらい使ったけど電池交換しなくていいのがすごい!

まとめ

Apple Watchが欲しいです。

*1:他のFossil製品にも同じバグがあるかもしれません。

XP祭りに行ったよ、そういえば

XP祭りに行って、基調講演を聞いて、カレーを食べて、ワークショップをやりました

もうずいぶん前のことのような気がしますが、久しぶりに(前回の基調講演以来)XP祭りに参加しました。
元々は とてか でやったあのチームのセッションの、フレーズを再演してみたい!ということで計画しました。

基調講演

基調講演は id:t-wada さん!!審美眼の再演を予想してたけど、TDDのお話でした。予想を裏切られてうれしい。なんというか、ずっと考えながら聴けるさいこーな講演でした。今まで聞いたt-wadaのなかで1番好きだな、たぶん。

カレー

大人だからお昼はタクシーに乗ってカレー屋さんへ。タクシーがお店に近づくにつれ確信したけど、このカレー屋さんは二度目だよ!この前のXP祭りのときに食べたとこ。おいしかった。

Cafe GOTO

ワークショップまで時間があったので、おなかいっぱいだけどカフェへ。Cafe GOTO。このgotoはいいgoto。ケーキが美味しそうだったなー。

ワークショップ

おなじみのフレーズの再演です。前座がない状態で始めたので、声を出してもらえるか心配でしたが、まあまあうまくいったかなー。こしばさん、jug-wadaさんとかに参加してもらえたのがうれしい(やりやすかった)。次はどこかの職場(チームとか)にまじってフレーズやりたいなー。ESMで反復開発の再演したときはとてもいい感じだったなー。


去年からやってた「反復開発」の再演、またやりたいです。後半のストーリー(チケット)の辺りを膨らませたやつを話したいな。

追記

90日ブログを書かないと広告が出てしまうので、思い出しエントリー書きました。