Firestoreのフィールドにどうしても.を使いたい
Firebaseのフィールド、例えばマップのキーにメールアドレスを使いたいパターンはよくあると思う。例えばこういうの。
permissions: { "iseebi@example.com": "read", "admin@example.com": "admin" }
で、これをクエリしようとすると permissions.iseebi@example.com
のようになってしまうのだが、このままだとwhereのキーに入れることができない。
// NG firestore.collection("items") .where("permissions.iseebi@example.com", "in", ["read", "write", "admin"])
なんとかエスケープできないか、というのも試したけど、うまくいかず。
このような場合は、FieldPathを使うと良い。
// OK firestore.collection("items") .where(new firebase.firestore.FieldPath( "permissions", "iseebi@example.com"), "in", ["read", "write", "admin"])
ただ、そもそもこういうのはベストプラクティスに反するので、避けた方が良い。
参考:
Google Cloud SDK (gcloud) コマンドの設定切り替え
gcloudで取り扱うプロジェクトの切り替え方法。プロジェクト作るたびに調べてる気がするので。
続きを読む9年もののiOSアプリのプロダクト改善を1年ちょいやったのでまとめる
昨年の頭に転職して、ピリカという会社にお世話になっている*2。科学技術の力で環境問題を解決するという目標を元に、ごみ拾いSNS ピリカや、ITに限らず様々な技術を使った調査プロジェクトなどのプロダクト/プロジェクトを推進している会社だ。
ピリカとの出会いは、2011年5月のスマートフォン勉強会@関西#15。まだ立ち上がった当初に社長の小嶌さんに登壇してもらって、それ以後もFacebookで繋がっていて、途中クラウドファンディングの時に応援したり、ゆるくいいねを送りあう関係だった。前の会社で東京転勤した頃に一度お声かけしてもらって、1年後くらいに転職の機会が巡ってきて相談したところ、条件がうまくマッチしてお世話になることになった。
メインのお仕事は、ピリカSNS*3のiOSアプリ開発。正式入社からしばらくして、iOS版の開発をひとりで引き継ぐこととなった。
2011年5月にあったすまべんの頃はまだTitaniumで作られていたアプリは、gitのコミットログによると同年9月にネイティブ版の開発が開始されたらしい。ログの中にはTwitterのタイムラインで見たことがある方もいらっしゃったり、歴史の深さを感じる。
もちろんその時その時でのベスト選択をされてきたのだろうけど、時代も人も変わりながら開発が進んできていて、古いライブラリへの強い依存、新しい方式への移行が中途半端で同じ機能が複数実装されているといった状態だった。だからといって作り直しするというのは幾度となく大改築で苦労した身としては回避したかった。
幸いなことに、受託中心だったこれまでとは違い、長く継続的にアプリのプロダクトと向き合うことができるので、長期戦を見越して少しずつ改築していくことにした。
今回は、この1年でやってきた改善を紹介してみようと思う。
続きを読む日産のインテリジェントルームミラーが汚れて見えない時
毎年恒例の旅行に来てるのだけど、ちょっと普段と異なる状況で困ったということがあったのでメモを兼ねて。
最近の日産車である程度のグレードになると「インテリジェントルームミラー」なるものがついている。車のルームミラーがカメラになっていて、後部座席にフル乗車だったりどでかい荷物を積んでても後方視界がちゃんと確保できるというものだ。普段、僕はセレナでとても便利に使っているお気に入りの機能の一つだ。
ルームミラー用のカメラは汚れても大丈夫なようにリアワイパーできれいになる位置に設置されているので、ワイパーを動かせば問題を解消できるようになっている。
続きを読むNotificationCenter.addObserver(forName:object:queue:using:) にインスタンスメソッドを渡すとリークする
これまで、NotificationCenterのaddObserverはSwiftでもaddObserver(_:selector:name:object:)で書いていたのだけど、ふと「あー@objc書きたくないな〜」と思った。
そこで単純にaddObserver(forName:object:queue:using:)に置き換えたのだけど、これでリークを作ってしまった。
続きを読む