溜まった健康データ と HealthKit

「父はわたしにひげの剃り方ひとつ教えなかったが、ひとつだけ大切な教訓をのこしてくれた。それは『健康を失えばなにもかもを失う』ということだ」
<div style="text-align: right;">ーーウッディ・アレン</div>
## 溜まり行く健康データ
「ストレスの解消には運動がいいらしい」ということを耳にして、それまで腕立て伏せを２０〜３０回で運動と称していたものをあらため、毎回肩で息をするていどには強度を高めることにしました。これが何年も前の話で、それからしばらくして、せっかくだからとiPhoneを使って体重のログを録りはじめました。

いまそれが３年とちょっと分ぐらい溜まっていて、記録をはじめたきっかけはほんとうに軽いものだったのに、あらためて見返すとこれが結構、なんというか、感慨深いものがあります。継続は力なりとはよくいったもので、人生の浮沈（「浮」があった記憶はほとんどないものの）が無感情な数字になってそこに厳然と存在しているんですね。当人以外にはほんとうにただのアラビア数字の羅列なんだろうけども、年月と重ね合わせると・・・?

### データの継続性
僕は体重と体脂肪、それに運動の記録（運動をした／してない）に、株式会社ネスレの『ネスレ体重コントロール』（iOS）を利用してきました。３年強飽きもせずにログり続けられているので良いAppなんだと思います。しかも無料です。本当に感謝しています。キットカットも数度買いました（その分のカロリー増は運動強度上げで対応）。とはいえ（Having said that...）最近どうも大丈夫なんかなと思う事態が持ち上がってきたのも事実です。

### 体重コントロール の問題点
* Appマーケットのかなり初期にリリースされたソフトということもあって機能的にかなり制限があり、しかもその状態のまま数年が過ぎている。
* iOSは昨年７にバージョンがあがり、UIが大幅に刷新されました。いわゆるフラット化したわけですが、もうすぐそのリリースから１年が経とうとする現在、いまだに見た目がアダプトされず前世代のノリのUIがつづいていると、Appの寿命というものについて思いを馳せざるを得ない。
* そこで、提供者から開発を放棄される可能性を見越して貴重なデータ群のバックアップを（App内で提供されている機能を利用して）とろうとすると、どうもApp側の不具合でできないらしい。ストアでレビューをみると同様の報告はかなりあがっていて、しかも未解決のままかなりの日数が過ぎているようだ。

もう開発は終わったのだろうと高をくくっていたらとつぜん全面改訂版のようなバージョンアップ・リリースがされるような例もあるのではっきりしたことはいえないものの、オルタナティブというか、「次の何か」への移行プランがあると安心でもあるし、真剣に考える時期に来ているのかなあと、策を練ることにしました。

### 『体重コントロール』データを活かす
#### まずは何はともあれバックアップをとる
レビューでも多くの方々が書かれている通り、手元にある『体重コントロール』の現行バージョンでバックアップをとろうとすると、バックアップ作成途中でAppが落ちてしまいます。

バックアップファイルそのものがつくれない（らしい）状態で、途方に暮れてしまいそうになりますが、『設定』欄をもういちど見てみると、バックアップの作成とは別に『エクスポート』というものがあることに気づきます。

![weight_controll_setting.jpg](https://qiita-image-store.s3.amazonaws.com/0/32738/3f62ba96-4af1-1aaf-d6d8-121963f73a65.jpeg)

#### 『エクスポート』とはなにか？
このエクスポートという機能、じつはネスレがリリースする『体重コントロール』と同種のAppへデータ移行をさせるためにつけられた機能らしく、ためしに選択肢をみてみるとその「移行先」のひとつに『カロリーコントロール』というものがあることがわかりました。

![Screenshot of iTunes (9-18-14, 4:01:18 PM).png](https://qiita-image-store.s3.amazonaws.com/0/32738/bdc8fe1f-1b43-680e-0fa9-b173b76477f2.png)

このAppもレビューをみると散々な評価なんですが、不思議とバックアップ関連の不満は目立ちません。ひょっとするとここにエクスポートしたらバックアップができるんじゃないか、と思って試してみると・・・

![Screenshot of ScreenFloat (9-18-14, 4:01:56 PM).png]
(https://qiita-image-store.s3.amazonaws.com/0/32738/2f2088e3-25e0-73c2-1324-54e27469d158.png)

できました?

手順としては

1. カロリーコントロール（無料）を購入
2. 体重コントロールからカロリーコントロールへデータをエクスポート
3. カロリーコントロールでインポート
4. カロリーコントロールでバックアップを作成
5. iTunesのファイルシェアから”CalorieControl.json”を適当な場所に保存

となります。いやー、無事バックアップできてよかった。

#### JSON
ひとまずバックアップがとれたのでほっと一息ですが、jsonファイルはあくまでjsonファイルでしかありません。これをなんとか目に麗しい姿にかえてやる必要があります。

方法はいろいろあると思うんですが、僕が考えたのはいまやiOSとOS X双方の新機種に標準添付されるソフトとなったNumbers.appを利用する、というものです。餅は餅屋。いったんNumbersにデータを渡してしまえさえすれば、データを様々なかたちで利用できる可能性がでてくるし、iCloudを通して情報の端末間共有も可能となり、家ではMac、出先の飲み屋ではすてきな女性とiPhoneで体重談義（「どう、みてこれ俺の体重遍歴。このときすごいやせてるでしょ？ いやもうこのときつらかったのなんのって・・・」という感じで相手の歓心をひく）をしたり・・・期待は膨らむ一方です。

## RubyMotionでCUI
#### JSONファイルをパースしてNumbers.appに渡す
今回のプロジェクトでRubyMotionが担当するのは

1. ファイル（JSON）を開いてパース
2. Numbers.appへそのデータを渡す

ことだけなので、JSONファイルさえ渡せればGUIは特に必要ない、ということになります。そこでその手の用途にうってつけのGem、[motion-osx-cli](https://github.com/MarkVillacampa/motion-osx-cli)を利用します。

`% motion create yamaari_taniari --template=osx`
プロジェクトをOS Xのテンプレートを使って作成。次に

```rb:Gemfile
gem 'motion-osx-cli'
```
と書いて`bundle install`します。

次にScriptingBridgeのセットアップです。ScriptingBridgeの詳しい説明は省きますが、おおざっぱにいって「AppleScriptを違う言語（ここではRuby）で書けるようにするFramework」です。だと思います。ちがってたら教えていただければ幸いです。

RubyMotionからScriptingBridgeを利用するためにはいくつかのステップがあります。

まずは各アプリケーションごとの`.bridgesupport`ファイルをつくることから。
[matettiさんの2010年の記事を参考に](http://merbist.com/2010/01/17/controlling-itunes-with-macruby/)、Termianl.appから以下の通り

`sdef /Applications/Numbers.app | sdp -fh --basename Numbers`

`gen_bridge_metadata -c '-I.' Numbers.h > Numbers.bridgesupport`

で、できたファイルを適当な場所に移して（ここでは`/vendor`に移動）、プロジェクトで使えるようにRakefileの`Motion::Project::App`ブロックに以下を加筆

```rb:Rakefile
app.frameworks += ['ScriptingBridge']
app.bridgesupport_files << 'vendor/Numbers.bridgesupport'
```

そして[motion-osx-cli](https://github.com/MarkVillacampa/motion-osx-cli)で書かれている通りに`app_delegate.rb`を書き換えてから`rake`すると

![Screenshot of Terminal (9-18-14, 6:30:17 PM).png](https://qiita-image-store.s3.amazonaws.com/0/32738/d36d3c8b-f9fb-174c-434e-354af246f059.png)

REPLにはいれました！

ここまで来れば`#applicationWithBundleIdentifier(identifier)`を使ってNumbers.appのインスタンスをつくり、`Numbers.h`を参照しつつなにができるのかをひとつひとつ試していくだけです。

ここから先は[マテウスさんのgistが大いに参考になりました](https://gist.github.com/seanlilmateus/5818290)。

以下の部分でだいたいなにをしているかはわかっていただけるんじゃないかと思います。`Numbers.h`と首っ引きになる覚悟と根気さえあれば作業としては単純なことの繰り返しです。

```ruby:app_delegate.rb
# NumbersDocumentsを生成する(ただしここではProxyObject)
if numdoc = numbers_app.classForScriptingClass('document').alloc.init
  # numbers_appのdocumentsプロパティに入れてやることで実体化する 
  numbers_app.documents << numdoc
end

# documents（array）の最初のドキュメントからsheets（array）の最初のシートを取り出して名前を付ける
numbers_app.documents.first.sheets.first.name = 'All Records'
```

と、地道にがんばってたんですが、そこにHealthKitの発表。じゃあそっちでやったほうがいいんじゃないか・・・というわけで途中で終わったプロジェクトが以下。よろしければご笑覧ください。あと、`motion-osx-cli`の解説がほとんどできなかったですが、もしわからないことがあれば聞いていただければ、と思います。

[プロジェクトへのリンク](https://github.com/haruhikoM/yamaari_taniari)

そんなわけで次回はSwiftでHealthKitです！