#WWDC19 What's New in Core Location メモ
読みやすさは考慮していません。ご了承ください。
次はこれだ!!#WWDC19 のWhat's New in Core Locationをチェックしてください https://t.co/jyng3onQqY
— Og🌗エンジニア🏝宮崎 (@koogawa) 2019年6月6日
位置情報サービスにおける権限のおはなし。
— Og🌗エンジニア🏝宮崎 (@koogawa) 2019年6月6日
iOS 12までは
・Appの使用中のみ
・常に
許可するかどうかを選択できたけど、iOS 13からは
・今回だけ許可(New!)
が追加! #WWDC19 pic.twitter.com/7CY0wtkJgo
この位置情報取得を「今回だけ許可」はアプリが次に Not in use になるまで有効らしい。この選択肢は自動的に出るので、開発者側が特に意識する必要はなさそうな感じだった #WWDC19
— Og🌗エンジニア🏝宮崎 (@koogawa) 2019年6月6日
Authrorizationの定義もとてもシンプルに。
— Og🌗エンジニア🏝宮崎 (@koogawa) 2019年6月6日
iOS 12 までは割と複雑になりつつあったけど
iOS 13 からは
・In use
・Not in use
の2種類だけに。とてもシンプル #WWDC19 pic.twitter.com/kA5qWtYKCE
じゃあ、In use とは具体的にいつなのか?
— Og🌗エンジニア🏝宮崎 (@koogawa) 2019年6月6日
→ Foreground にいるとき+Background に入ったあとの直後
ただし、Background Mode のときは
allowBackgroundLocationUpdates = true ならずっと持続。
false なら バックグラウンドに入ってしばらくすると Not in use になる #WWDC19 pic.twitter.com/WQMhIcBA8p
#WWDC19 Implementing Dark Mode on iOS メモ
読みやすさは考慮していません。ご了承ください。
ダークモードの実装方法を学んでいる / #WWDC19 のImplementing Dark Mode on iOSをチェックしてください https://t.co/S7pOIRKbgE
— Og🌗エンジニア🏝宮崎 (@koogawa) 2019年6月6日
ダークモードはホントに真っ黒(RGB: 0 0 0)なんだなぁ #WWDC19 pic.twitter.com/U2hrr4Y0QH
— Og🌗エンジニア🏝宮崎 (@koogawa) 2019年6月6日
背景色を systemBackground Colorに、
— Og🌗エンジニア🏝宮崎 (@koogawa) 2019年6月6日
テキストカラーを label Color にセットすると、
ダークモード/非ダークモードで良い感じに色を調整してくれるらしい。この辺は予想通りだ pic.twitter.com/HtJmtaou3N
iOS シミュレータでデバッグ中もXcode左下のスイッチでダークモード/非ダークモードを切り替えられる。毎回 Run し直す必要がないの便利だ #WWDC19 pic.twitter.com/0j1kdIrpkn
— Og🌗エンジニア🏝宮崎 (@koogawa) 2019年6月6日
Status Bar も .Default にしておけばダークモード/非ダークモードで良い感じに切り替えてくれる #WWDC19 pic.twitter.com/MEQHgbzamr
— Og🌗エンジニア🏝宮崎 (@koogawa) 2019年6月6日
ダークモードの登場により、 UIActivityIndicatorView の .gray .white .whiteLarge は Deprecated❌
— Og🌗エンジニア🏝宮崎 (@koogawa) 2019年6月6日
代わりに
.medium and .large を使ってね、とのこと。
これもダークモード/非ダークモードで切り替えてくれる #WWDC19 pic.twitter.com/DBz6uFMfM5
#WWDC19 What's New in Xcode 11 メモ
読みやすさは考慮していません。ご了承ください。
Xcode 11 ではエディタの分割ボタン等が下段に移動。これは最初戸惑うだろうなー pic.twitter.com/XSbxT4Puz1
— Og🌗エンジニア🏝宮崎 (@koogawa) 2019年6月5日
Xcode 11 ではエディタの分割ボタン等が下段に移動。これは最初戸惑うだろうなー pic.twitter.com/XSbxT4Puz1
— Og🌗エンジニア🏝宮崎 (@koogawa) 2019年6月5日
Xcode の右側にコードマップ?が表示されるようになったのは地味に嬉しい pic.twitter.com/oAPJuann9a
— Og🌗エンジニア🏝宮崎 (@koogawa) 2019年6月5日
うぉっ ホントですね!!これは便利〜 ありがとうございます😄
— Og🌗エンジニア🏝宮崎 (@koogawa) 2019年6月5日
このセッション見てわかったのは、ダークモード対応はそこまで大変ではないかも、ということ。
— Og🌗エンジニア🏝宮崎 (@koogawa) 2019年6月5日
背景色に defaultColor とか標準の UITableViewCell 使っていればOSの設定をダークモードに変えるだけで良い感じにダークにしてくれる。個別に色を分けたい場合は Any/Dark Appearance で可能 #WWDC19 pic.twitter.com/qr2AgpG01I
逆に、すべての View の backgroundColor をガチガチにカスタマイズしているアプリは対応が大変そう、という印象
— Og🌗エンジニア🏝宮崎 (@koogawa) 2019年6月5日
Xcode 11未満でビルドしたアプリはダークモードの影響を受けない一方、
— Og🌗エンジニア🏝宮崎 (@koogawa) 2019年6月5日
Xcode 11でビルドしたアプリはダークモードの影響を受ける。つまり標準の部品で作った部分が勝手に黒っぽくなる、と予想
よって、ダークモード対応しないと白と黒が混在したパンダみたいなアプリになってしまうということか🐼
— Og🌗エンジニア🏝宮崎 (@koogawa) 2019年6月5日
回避するオプションもありそうな気はするけど🤔
#WWDC19 Creating Independent Watch Apps メモ
読みやすさは考慮していません。ご了承ください。
キーノートでもあったように、Watch Apps は Apple Watch 単体でインストールできるようになる。 pic.twitter.com/cjEI9mOwWm
— Og🌗エンジニア🏝宮崎 (@koogawa) 2019年6月5日
既存の WatchOS App を Independence 対応するには "Supports Running Without iOS App Installation" にチェック入れる。新規の場合は "iOS App with Watch App" ではなく "App" を選ぶと pic.twitter.com/xz4ZGp1Kb5
— Og🌗エンジニア🏝宮崎 (@koogawa) 2019年6月5日
このセッションのサンプルコードはすべて SwiftUI で書かれていて、Appleさんが力を入れているのが伝わってくる
— Og🌗エンジニア🏝宮崎 (@koogawa) 2019年6月5日
アルに入社して半年が経ちました(在職エントリ)
こんにちは koogawa です。気が付けばアルに入社して半年が経過していました。 入社当初から今もフルリモート勤務を続けております🌴
良い機会なのでここらでこの半年を振り返ってみます。
iOSアプリ担当からAndroidアプリ担当へ
今年の3月までは id:wadap と2人体制でアルのiOSアプリを開発していました。
4月からは t__kashima 、 rikutech という強力なエンジニアが入社し、アプリチームは一気に4人体制になりました。自分はこのタイミングで Android アプリ担当にチェンジしました。また、この時期に kumami が CX 担当として入社しました🎉
現在は t__kashima のもとで Android アプリをガシガシ開発中です。あと少しで公開できそうなので、Android ユーザーの方はもうちょっとだけ待ってくれよな!🙏
Android × Kotlinどうよ?
最初は Activity と Fragment の違いがちゃんとわかっていなかったり、Swift の if let hoge = hoge
みたいな書き方ができなくてストレスを感じたり、val
を let
と書いてしまうこともありましたが、元気でやっています😁
coroutines もとても良い感じですね!非同期処理を同期的な書き方にできるので、ソースコードがとても読みやすくなるのが気に入ってます。
ちなみに、アルの Android アプリは Model View Presenter(MVP) アーキテクチャを採用しています。
フルリモートどうよ?
働く場所が自由というのがとても良いです。
朝起きて、天気が良ければ外で仕事をしてもよいし、雨ならそのまま家に引きこもることもできます。
今日は何故か川辺でコードを書いています pic.twitter.com/uQtmPwUd2x
— Og🌗エンジニア🏝宮崎 (@koogawa) 2019年3月11日
テレビ会議はうまくいってる?
東京メンバーとのテレビ会議も定期的に行っています。最初は会議室にいる何人かとこちら一人で繋ぐ、という形式を取っていたため、こちらから話を差し込み難い等のストレスを感じることもありました。
しかし最近ではテレビ会議を円滑に進めるためのノウハウも溜まってきており、ほとんどストレスを感じることはなくなりました。
テレビ会議のコツ
- 東京側
- 一人一台カメラ付きのPCを用意
- 良いマイクスピーカーを買う
- マイクと繋ぐPC以外はすべてミュートにする(音が回ってしまうため)
- こちら側
- PCについてるマイクは使わずマイク付きイヤホンつける
- 周りがうるさいとき(選挙カーが近くにいるとき等)はマイクをミュートする
- 共通
- なるべく相槌を打ったほうが喋る人が不安にならない(と思っている)
弊社もテレビ会議するときは一人1台PC+イヤホンで上手くいってます👍 https://t.co/1z1Y9VyMtz
— Og🌗エンジニア🏝宮崎 (@koogawa) 2019年5月25日
雑談について
よく雑談は大事と言われますが、フルリモート組はオフラインでの雑談に参加できません。
しかし、弊社の Slack における 雑談チャンネル や 分報チャンネル は割と活発(な方だと思う)ので、寂しさを感じることはありません。
もしかすると、自分はもともと積極的に雑談に絡んでいくタイプではない、というのもリモートワークがうまくいっている理由のひとつかもしれません。
良いことばかり書いてしまったのでデメリットもあげるとすれば、旅行先で買ってきたお土産を気軽に渡せなかったり、逆にもらえなかったりするときちょっとだけ寂しさを感じます。まぁ、これはどうにもならないことなので、そんなに気にしていません😁
さいごにお約束
そんなわけで、アルに興味を持っていただいた方は、下記のリンク先から気軽にコンタクトを取ってみてくださいね!
Webナイト宮崎 で Firestore 設計の話をしてきたよ #Webナイト宮崎
もう2週間ぐらい経ってしまいましたが、先日 Webナイト宮崎 というイベントで Firestore の話をしてきました!
Webナイト宮崎とは
宮崎のWeb系フリーランス集団 てげほげ が開催しているWeb系勉強会です。実は私もてげほげメンバーです!
以下、発表内容を簡単にまとめていきます。
発表内容
最初に今回話すことを整理。
Firestore におけるデータベース設計について自分が知ってる方法を話します。 この方法がベストプラクティスとは限らないので、もっと良い方法があったら教えてね!
Firestore の簡単なおさらい。すでに他の発表者の方も説明されていたので、ここはサラッと流しました。
今回は、とあるSNSサービスを例にDB設計について考えていきます。
このSNSサービスの機能要件です。とてもシンプルです。
最初にユーザー情報を格納するためのコレクションについて考えます。
今回は users
というコレクションを作り、その中に「1ユーザー1ドキュメント」という感じで追加していく感じにしました。
次に「ユーザーは他のユーザーをフォローすることができる」という仕様を Firestore に落とし込むときにどういう設計があるか?ということについて考えていきます。
いくつか方法はあると思いますが、今回は2つの方法をピックアップしました。
1つ目は users コレクション直下に follows
というサブコレクションを置く方法です。この例だと「aaaaa は bbbbb と ccccc をフォローしている」という状態になります。
2つ目は root 直下に follows
というフォロー情報を管理するための専用コレクションを作る方法です。この例だと「aaaaa は bbbbb をフォローしている」という状態になります。
さて、ここからは機能の実装に入っていきますよ。
まずは「aaaaaさんがフォロー中のユーザーリストを表示する」機能を実装するにはどうしたら良いでしょうか。
「/users 直下に置く」場合について考えましょう。 この例だと「aaaaa は bbbbb と ccccc をフォローしている」という状態になるので、ここは単純に赤枠を見れば良さそうです。
次に「/root 直下に置く」場合について考えましょう。 この例だと「aaaaa は bbbbb をフォローしている」という状態なので、followee = “aaaaa” のドキュメントを抽出すれば良さそうです(赤枠内)。
さて、今度は「aaaaaさんをフォローしているユーザーリスト(=つまりaaaaaさんのフォロワー)を表示する」機能を実装するにはどうしたら良いでしょうか。
こちらもそれぞれのパターンについて考えていきましょう。
まずは「/users 直下に置く」場合を考えてみます。
この例だと「bbbbb は aaaaa と ccccc をフォローしている」という状態になるので、
bbbbbさんはaaaaaさんのフォロワーということになります。
よって、users
コレクション内の follows
サブコレクションを横断して検索しながら、サブコレクションに aaaaa を含むドキュメントを抽出すれば良さそうです。
実はこれ、最近までできませんでした。この資料を作っている最中(2019年4月)に CollectionGroup
という機能がリリースされ、こういった横断的な検索も可能になりました。
- 待ち焦がれたCollectionGroupがCloud Firestoreへやってきた。 - Qiita - 1amageek さんの記事がとてもわかりやすいです
続いて「/root 直下に置く」場合について考えてみます。 この例だと「ccccc は aaaaa をフォローしている」という状態なので、ccccc は aaaaa のフォロワーということになります。よって、follower = “aaaaa” のドキュメントを抽出すれば良さそうです(赤枠内)。こちらは「/users 直下に置く」場合と比べるとだいぶシンプルですね。
最後にまとめ。今回は「フォロー/フォロワー」のようにリレーションシップを Firestore で管理する方法として /users 直下に置く方法と /root 直下に置く例を紹介しました。
/users 直下に置く方法だとサブコレクションを横断した検索ができない、という制約がありましたが、最近できるようになりました!
どちらの方法がベターか?という点については、格納するデータの内容によっても変わってくると思いますが、個人的には直感的にわかりやすい /root 直下に置くほうが好きです。
2019.6.3 追記:/root 直下に置く方法だと Collection の Write 制限で秒間に 500 人以上フォローできないことを 1amageek さんから教えていただきました!
この方法だとCollectionのWrite制限で秒間に500人以上フォローできないので、
— 1amageek (@1amageek) 2019年6月3日
SubCollectionに配置することをお勧めします。https://t.co/ZopF9xTP7E
感想
発表終了後にもたくさんの質問をいただき、割と好評だったという印象です。 Firestore は比較的新しいサービスであり、設計ノウハウなどもまだまだ不足しているなーと感じています。今後も勉強会などで積極的にアウトプットしていきたいですね!!
Webナイト宮崎、次回も参加します👍
Webナイト宮崎Vol.4今回も雰囲気最高だった!! LTも皆さんお疲れ様でした!!
— MICCI (@MICCI_0627) 2019年5月18日
リビルドのお二人もまた待ってます🌴🏄🏻♂️✈️ pic.twitter.com/uLtf1m3m40
▲てげほげmicciさんによるツイート!
発表スライド
- Firestore のデータ設計について - Speaker Deck - スライド全体はこちら
アルに入社しました
こんにちは koogawa です。この度、アル株式会社に入社しました。
アル株式会社について
マンガファンのためのサービス「アル」というサービスを運営する会社です。
入社の経緯
実は昨年の8月から副業として開発をお手伝いしていました。
しかし、上記エントリにも書きましたが、いつの間にか本業よりもアルでの仕事の方が楽しくなってしまったんですね。より学ぶことも多かったですし。なので思い切って本業を辞めました。
その後、しばらくフリーという立場でアルの開発をサポートしていたんですが「せっかくならフルコミットしたい」という気持ちが高まり、正式に加入することになりました。
本社は東京渋谷にあるので、自分は宮崎からのフルリモート勤務になります。
社内の印象
設立して間もない会社ということもあり、とにかく自由な雰囲気です。 「役割は誰かえらい人が与えられるものではなく、自分で見つけていくもの」 という考え方が軸にあり、基本的に仕事の指示もされません。みんな自分で考え、自分で行動しています。
もちろんプロダクトマネージャーなども存在せず、細かい仕様などはメンバーが主体となって決めていきます。
例えばこんなノリで機能が追加されていきます。メンバーを管理するリーダー等も存在しませんが、今のところ上手く回っています。
評価制度なんかも(まだ)存在しません。私個人としては期ごとに個人目標設を設定する作業はとても煩わしく感じますし、「今は評価の対象期間じゃないからその仕事はやらない」みたいな不毛なことが起こらずに済むのでとても動きやすいです。
時雨堂さんのエントリなんかはとても共感できます。
生活リズム
今の生活リズムをグラフにしてみました。
フルリモートですが、メリハリをつけるため雨の日以外はコワーキングスペースに通っています。
コアタイムも存在しないため、各自自分にあったスタイルで仕事をしています。自分にはまだ小さい子供がいるため、毎日18:00前には帰宅して子供の世話をできるのがありがたいです。家族からも「幸福度が上がった」と言われました。今までこんなことを言われたことなかったので、正直驚いてます。
アルのメンバー
現在、アルは代表の id:kensuu をはじめ、CTO id:wadap、VP of Product id:rinrin900、サーバーサイド兼インフラエンジニア id:astap、そして、iOSアプリエンジニア id:koogawa というメンバーで開発を進めております。 これからやっていきたいことはたくさんありますので、アルに興味を持ってくれた方がいればぜひ一度お話しましょう!
作っているもの
最後に宣伝も兼ねて今作っているプロダクトの紹介です。
自分はこのサービスのiOSアプリ開発をメインで担当しています。
アプリを Gmail と連携すると、過去に買ったマンガを分析し、新刊情報を通知で知らせてくれます。もちろん買ったことがないマンガもウォッチリストに追加することでウォッチの対象とすることができますよ!
アルのユーザーからたくさんウォッチされているマンガのリストも見られるので、次に読むべきマンガを簡単に見つけることもできます。
マンガ好きな方はぜひ使ってみてくださいね!