無知を晒す

ふだんの出来事はこっちに書いてます: http://tana.hatenablog.com

Fitbit StudioにiPhoneが繋がらない場合に試すべき民間療法

参考までに環境をまとめておくと

  • iPhone 6s
  • iOS 10.3.3
  • mobile app: Fitbit 2.43(730)
  • Fitbit Ionic: バージョン 27.30.5.8

で、具体的な手順としては

  • Fitbit App のアンインストール
  • 端末名の変更
  • Fitbit App のインストール

という感じ。アプリのインストールとアンインストールは勘でやったので不要かもしれません。

とにかくこれでアプリの開発者向けメニューから DeveloperBridge を有効にした際に「非アクティブ」と「接続しています…」みたいなのが交互に出てくる状況からは脱せました。

f:id:side_tana:20171117011543p:plain
*1

他に言語設定英語にしたり日本語にしたりしたけど関係あったのかな。

ところでfitbit ionic の開発環境は全てブラウザで提供されていて、PC、スマートフォン、ionic本体 が全てサーバを介してWebSocketで接続され、アプリのインストールやログの取得もWebSocketで行われていて、気合入ってるって感じ。

GarminのアプリケーションはUSBで本体繋いで、ビルドしたアプリケーションパッケージをファイルとしてコピーするだけだったので簡単に理解できたけど、試すたびに本体をUSBで繋ぐ必要があったりしてなかなか大変であった。

*1:前は "たな太郎のiPhone" という名前を設定していました

YAPC::Kansai でタイトルの長いやつをやります

えー、どうも、このところは猫も杓子もディープラーニングだってんで、ビッグデータやらHTML5やらなんてのはとんと聞かなくなっちまいまして。今じゃすっかり定着しちまいましたが、その前にはクラウドってのが流行り言葉でありました。その頃といえば PaaS とか IaaS とか、これも今日はきちんと使われちゃいますが、当時はもうめちゃくちゃだった[要出典]。さてそんな XaaS に BaaS というのがあったわけです。なんの略かといえば、 Backend as a Service でございますな。

そんな BaaS の中でもとくにモバイルアプリ向けのバックエンドを提供する一派がありまして mBaaS なんて名乗っていたわけですが。その中でもひときわ有名なのに Parse.com ってサービスがあった。こいつは 2016年の初めに終了宣言をしてそれから1年後、まあ今年の初めですな、宣言通りサービスを終了しました。

さて慌てるのは Parse.com を使っていた事業者だ。

というわけで、利用しているBaaSが終了するときにすべきこと または Parse.com の終了と私たちの取り組み というタイトルで一席ぶたせていただきます。

愉快な話ができるよう準備しておりますので、是非お越しください!

Google App Engine で Parse.com を看取る

ところで皆さんは1年前の今日,2016年の1月の28日に何が起きたかを覚えていますか? 私は覚えています.そう,Parse.com が1年後にサービス終了する,と宣言したあの日です.*1

ということで死にゆく Parse.com への最後の手向けとして parse-shutdown-monitor というサービスを作りました.斎場とも言えます.*2

f:id:side_tana:20170128033635p:plain
Parse Shutdown Monitor

いわゆる外形監視になるんですかね? そういう意味では普通の外形監視使ってもよかったのですが,今回は Google App Engine氏に喪主をお願いしました.

監視しているのは

  • ParseObject の取得と書き込み
  • Query の実行
  • User のSign-in
  • File の取得/アップロード
  • ParseConfig の 取得
  • Hosting で設置した静的コンテンツ
  • CloudCode の Hello, World
  • Jobs による定期実行

の 8 種類 10 項目です.

CloudCodeって言うのは Google App Engine とか Heroku みたいな PaaS として使える機能ですね*3.Jobs は Parse.com 上で動作する cron というか,Google App Engine の cron を使ったことがある人にはおよそそのままの理解で良いんですが,CloudCodeとして登録した関数を定期的に実行してくれる君です.

基本的にはGoogle App Engine の urlfetch api を使って, Parse.com の REST API を叩き,帰ってくる http のステータスコードを監視する,というようなことをしています.Jobs については直接監視できないので, Parse.com の CloudCode 実行してる環境から毎分アウトバウンドリクエストを生成して,Google App Engine 側で受けとって保存,さらに Google App Engine の cron で新しいレコードが作成されていることを毎分監視し続ける,みたいなアーキテクチャになっています.*4

作ってた時の面白エピソードとしては,移行先として公開されている Parse.com のオープンソース実装であるところの parse-server にはJobs に相当する機能が無く,また公式ドキュメントは全て parse-server を基準としたものに置き換わっているため, 結果としてドキュメントがない状態で Jobs に関するあれこれをしなくてはいけない,みたいなことがあったこととかですね.

開発環境について

なんかいろいろやってて結構便利に開発出来たんですけど改めて書きます.

*1:先日1月30日に終了するという情報更新がありました.

*2:ひょっとしたら日本で最後にParseAppの新規作成をしたのは俺なのではないか,もしかしたら世界中で最後かもしれない.世界一短命なParseAppがParseの最期を見守るのだ

*3:DBへの書き込みと取得を繰り替えし実施する必要がある場合,USにあるParseのサーバとJPのアプリやサーバがちまちまやりとりすると累計のトランザクションタイムが10秒を軽く超えていくので,こういったDBに近いところで処理出来る環境は大層重宝するわけです

*4:この記事書き始めた時点では Jobs からのリクエストは記録だけだったんですけど,それはだめだよねってことでさっき監視を追加しました.




君は異体字セレクタを見たことがあるか

node v6.2.0

> var codePoints = [10548, 65039]
undefined
> var s1 = String.fromCharCode(...codePoints)
undefined
> var s2 = codePoints.map((p)=>{return String.fromCharCode(p)}).join()
undefined
> s1
'⤴️'
> s2
'⤴,️'
> s1 === s2
false
> s1.length
2
> s2.length
3
> s2.codePointAt(2)
> 44

65039異体字セレクタ (VS16) なので,これが単体で登場するというのはおかしい.

String.fromCharCode()65039 だけを与えると 44 が前に追加されて,それと 10548 を連結するので3 文字になる.ということらしい.

この 44 がどこから来たのかもうちょっと追ってみたいけど明日新幹線乗れなくなりそうなのでこの辺でやめておこうという感じ.

コメントで指摘していただいたとおり.上記のコードで .join() した時のデリミタとして , ,コードポイントでいうと 44 が入るは Array.prototype.join() の仕様でした.ということで

> var s2 = codePoints.map((p) => {return String.fromCharCode(p)}).join('')
undefined
> s2
'⤴️'

とすることで期待する挙動になりました! id:t_motooka さんありがとうございました!

参考

Variant form (Unicode) - Wikipedia

Miscellaneous Symbols and Arrows - Wikipedia

このページの一番下に,このブロックで異体字セレクタが用意されている記号について触れられている.

http://www.unicode.org/Public/UNIDATA/StandardizedVariants.txt

これは試験に出るので全部暗記しましょう.