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"])

ただ、そもそもこういうのはベストプラクティスに反するので、避けた方が良い。

参考:

stackoverflow.com

Firebase Hostingでサイト全体をリダイレクトさせる

サイト全体をリダイレクトさせたいということがあると思う。例えば、wwwでメインサイトをホストしているけど、Apexドメインにアクセスしたときもwwwにリダイレクトさせたい、とかの場合だ。他にもちょっと複雑なリダイレクトさせたりもしたいということもあると思う。

これを、Firebase Hostingを使うことで簡単にできたので紹介する。

続きを読む

9年もののiOSアプリのプロダクト改善を1年ちょいやったのでまとめる

f:id:iseebi:20200220235429j:plain *1

昨年の頭に転職して、ピリカという会社にお世話になっている*2。科学技術の力で環境問題を解決するという目標を元に、ごみ拾いSNS ピリカや、ITに限らず様々な技術を使った調査プロジェクトなどのプロダクト/プロジェクトを推進している会社だ。

ピリカとの出会いは、2011年5月のスマートフォン勉強会@関西#15。まだ立ち上がった当初に社長の小嶌さんに登壇してもらって、それ以後もFacebookで繋がっていて、途中クラウドファンディングの時に応援したり、ゆるくいいねを送りあう関係だった。前の会社で東京転勤した頃に一度お声かけしてもらって、1年後くらいに転職の機会が巡ってきて相談したところ、条件がうまくマッチしてお世話になることになった。

メインのお仕事は、ピリカSNS*3iOSアプリ開発。正式入社からしばらくして、iOS版の開発をひとりで引き継ぐこととなった。

2011年5月にあったすまべんの頃はまだTitaniumで作られていたアプリは、gitのコミットログによると同年9月にネイティブ版の開発が開始されたらしい。ログの中にはTwitterのタイムラインで見たことがある方もいらっしゃったり、歴史の深さを感じる。

もちろんその時その時でのベスト選択をされてきたのだろうけど、時代も人も変わりながら開発が進んできていて、古いライブラリへの強い依存、新しい方式への移行が中途半端で同じ機能が複数実装されているといった状態だった。だからといって作り直しするというのは幾度となく大改築で苦労した身としては回避したかった。

幸いなことに、受託中心だったこれまでとは違い、長く継続的にアプリのプロダクトと向き合うことができるので、長期戦を見越して少しずつ改築していくことにした。

今回は、この1年でやってきた改善を紹介してみようと思う。

*1:夏合宿会場から撮った景色。合宿と言いつつ泊まりではないのが恒例らしい。

*2:厳密には、2018年の11月くらいから副業的に入っている。

*3:会社と明確に分けるためにこう呼んでいる

続きを読む

日産のインテリジェントルームミラーが汚れて見えない時

毎年恒例の旅行に来てるのだけど、ちょっと普段と異なる状況で困ったということがあったのでメモを兼ねて。

最近の日産車である程度のグレードになると「インテリジェントルームミラー」なるものがついている。車のルームミラーがカメラになっていて、後部座席にフル乗車だったりどでかい荷物を積んでても後方視界がちゃんと確保できるというものだ。普段、僕はセレナでとても便利に使っているお気に入りの機能の一つだ。

ルームミラー用のカメラは汚れても大丈夫なようにリアワイパーできれいになる位置に設置されているので、ワイパーを動かせば問題を解消できるようになっている。

続きを読む

NotificationCenter.addObserver(forName:object:queue:using:) にインスタンスメソッドを渡すとリークする

これまで、NotificationCenterのaddObserverはSwiftでもaddObserver(_:selector:name:object:)で書いていたのだけど、ふと「あー@objc書きたくないな〜」と思った。

そこで単純にaddObserver(forName:object:queue:using:)に置き換えたのだけど、これでリークを作ってしまった。

続きを読む

車中泊用のベッドを買い換えた

f:id:iseebi:20200204232456j:plain

先日の車中泊装備紹介エントリで書いていたエアーベッドだが、気持ち足下が短くて、もう少し長いものに買い換えたいと思っていた。

しかし、セレナの3列目を片方倒した場合、もう片方と壁の間にできるスペースの幅は65cm程度、シングルサイズのエアーベッドは大きめだと90cm台、小さいものでも70cmをオーバーしていて幅が足りない。

そうこうしていると、先日のAmazonタイムセール祭りでちょうど良さそうなものがサイズのものが安くなっていて、この値段だったら冒険しても良いかなと思って買ってみた。

続きを読む