【メモ】Google I/O 2019 動画リスト(Android関連)
Google I/O 2019 の Sessionを見返すために個人メモ
Google I/O 2019 All Session List
What’s New in Android Studio UI Design and Debugging Tools (Google I/O'19)
What’s New in Android (Google I/O'19)
What’s New in Architecture Components (Google I/O'19)
Android Jetpack: Understand the CameraX Camera-Support Library (Google I/O'19)
Best Practices in Using the Android Emulator (Google I/O'19)
What’s New in Android Development Tools (Google I/O'19)
Jetpack Navigation (Google I/O'19)
What’s New in the Android Studio Build System (Google I/O'19)
Android Studio: Tips and Tricks (Google I/O'19)
What’s New in the Android OS User Interface (Google I/O'19)
What’s New in ConstraintLayout (Google I/O'19)
Motional Intelligence: Build Smarter Animations (Google I/O'19)
Declarative UI Patterns (Google I/O'19)
Build Testable Apps for Android (Google I/O'19)
【2019】noteアプリをNotionにほぼ確定
はじめに
毎年良いnoteアプリがないか常に探し求めているのですが、 最近特定のアプリに落ち着き始めているので、そのアプリについてちょっと書いてみる
選んだnoteアプリ(サービス)
Notion www.notion.so
自分が求める要件
- Markdownで書ける
- iOSアプリがあり、Macでも使える
- 同期される
- リンクの扱いを選べる(URL/埋め込み)
- そのままシェアできる
- TODOとかも書ける
- メモに到達しやすい
- いろんなものをストックしておける
Notionが自分の中で納得感あるものになった理由
去年の夏ぐらいからNotionに移行し、最初は課金せず使っていたもののメモの量も増えたため、結果課金した。 Twitterとかの投稿をClipしたいときなどに、WebClip的な機能があればもめっちゃいいのになと思いつつ、 そういうときは、個人用slackに貼ってみたり、記事などのリンクであればそのリンク自体に飛んで、そのリンクをはてブ登録してたりしていた。
特に機能追加などを追ってなかったのだが、久々にNotionについて調べると機能追加で WebClipper
機能が追加されているではないですか!
またQに1度ぐらい、良いnoteアプリないかな?と調べるとは思うけれども 現状Notionで行こうかと思いました。
今期の振り返り
ちょうど昨日振り返りの面談があり、今期を振り返ったと同時に今後どうして行くかみたいなことを悩んだので、メモ代わりにブログに残しておく。
2018/10 ~ 2019/03
チーム異動をした
- 前にいたチームは各職種5人以上いる近く的大きなチームだったが、今期から各職種1人ずつみたいな比較的小さなチームへ
チームビルディングとマネジメント
- バタバタと人が抜けてしまっていたチームで、正直チームコンディションは悪くあまり機能している感じてはなかった
- まずはチームのコンディション改善を行った
- ここに関しては半期でかなり改善されてコンディションとしては良くなった(周りから見ても良くなったと言われるのでちゃんと良くなってるんだと思う)
- チームが機能し始めたのはすごい良かった。
Android のリニューアル版リリース
- 自分がジョインする前からリューアルは動いており、自分が入ったタイミングではラストワンマイルみたいなタイミングだった
- ありがたいことに、運用が長くなってしまうとどうしても生じてしまう、比較的技術的負債みたいな部分には悩まされなくて済んだ
- そもそも自分がAndroid始めた時期にはすでにKotlin の公式採用発表後で、あまりJavaに触れてなかったこともあり、そこも含めてありがたかった
- Jetpackのものもいくつか使っており比較的モダンなわかりやすいコードになっててありがたかった
- Paging Library はあまり好きじゃないのと、何かと使い勝手が悪く、そこだけは…
- 一部えいや!でやってしまった(やってしまわれてる)部分があったのでそこも後々変更が必要なときには直さないとなと思ってる
アーキテクチャとコード周り
- DIの導入
- Koinを導入してみた
- 前のチームはdaggerだったからdaggerでも良かったんだが、ちょっと触ってみたいしだめだったらdaggerにすれば良いかなと思い一旦Koinを採用
- 今の所そこまで困ることはないのでこのままで良いかな?と思ってるが、ランタイムでしかエラーが出ないのは困るちゃ困る
- ランタイム時の速度比較のベンチマークKoinが速度出てなかったが2系では改善されるようだし、様子見
- ビルドが遅くなるのは嫌なので、ビルド時間が改善されるdaggerにするかも
- 大人数じゃないし、比較的いろいろ試して合うものを採用し続けたいので、もしかしたら変えるかも
- Fluxアーキテクチャを一部導入
- リューアル時点でのアーキテクチャMVVMだったが、新しい機能開発があったのでその機能Fluxにしてみた
- コルーチンも入り見やすく書きやすくなった
まとめ
- 比較的足元というか目の前の課題があり、それを少しずつ着実に潰していくという感じの半期だった
- 新しいチームに入ったタイミングだったし、今期は土台を整えられたと言う感じ
- 来期この土台をベースにどうするかが難易度高くなっていきそう
無限スクロールのViewPager+TabLayout
class SampleInfinitePagerAdapter( fragmentManager: FragmentManager ) : FragmentStatePagerAdapter(fragmentManager) { companion object { const val MAX_PAGE_COUNT = 100 } var list: List<Hogehoge> by Delegates.observable(emptyList()) { _, previous, latest -> notifyDataSetChanged() } private var realCount: Int = 0 get() = list.size override fun getItem(position: Int): Fragment { var id = 0 // listが空以外 if (realCount > 0) { val diff = (position - MAX_PAGE_COUNT / 2) % realCount val index = if (0 > diff) realCount + diff else diff id = list[index].id } return SampleFragment.createInstance(id) } override fun getCount(): Int = MAX_PAGE_COUNT override fun getPageTitle(position: Int): CharSequence? { var title = "" // listが空以外 if (realCount > 0) { val diff = (position - MAX_PAGE_COUNT / 2) % realCount val index = if (0 > diff) realCount + diff else diff title = list[index].title } return title } }
11月を振り返る
10月頭から新しいチームに異動して、android開発(+エンジニアマネージメント)をやる。
8月ぐらいから始めた副業でwakatimeを使って時間を計っているいるので、 それを元に振り返り wakatime.com
wakatime振り返り
メインどころでいうと Kotlin: 50時間 JavaScrip: 16時間
AndroidのProjectとかはやってる時間は長い割に、ビルド時間とかに時間がかかってるためか コードを実際にかいている時間はそこまで長くなかった… マルチモジュールにして、変更ごとにコンパイルに必要な時間をもう少しかいぜんできたら、 効率上がるかもなって思ったり思わなかったり。
Android 実装
- 10月から関わっている本業は1年ぐらいかけてシステムリニューアルをしていて、そのリリースが11月の頭にできた
- iOSと機能差異があるので、とにかく優先順位をつけながら追いつき実装を頑張っているところ
- 11月はその追いつくための機能の実装だった
- 新機能だったので前のチームで使ってたFluxを導入
- クリーンアーキテクチャにしてUI部分をFluxっていう感じ
後で改めて見る。
— atsumo (@atsumo) November 28, 2018
KotlinConf 2018 - Shaping Your App's Architecture with Kotlin and Archit... https://t.co/770clNeE1K @YouTubeより
- DIのライブラリは入ってなかったが、使ったほうが楽な部分が多いのでいれて見るこってとになり入れてみた
- Koinを入れてみてる -> 落ち着いたらどうだったか書きたい
- ビルドは早いがコンパイル時はエラーになったりしないのでそこはネック
- どこかでベンチとってたけど、ランタイム時の速度は確かにDaggerとかに比べたら遅いですわ
- Daggerがビルド時に早くなるんだったら、乗り換えも検討していくと思う
チーム
10月から新しいチームでエンジニアリングマネジメントもやっている。 職種としてではないがやったほうが良さそうだなと思っているため。 10人未満の小さいチームだし、マネジメントっていうほど仰々しいものではないかもしれないけど、 週1で各メンバーと1on1をやりながら、悩んでること、変えたほうがいいと思っていること、意見、要望やキャリアパスの話など30分ざっくばらんに話している 今までコミュニケーション的な課題が多いと聞いていたので、この部分は個人的には大切にしていて時間を割いてもやらせてもらっている。 少しずつではあるが、チームメンバーの助けもあり、コミュニケーションが機能しはじめている気がしており、今後もやっていきたい。 よく言われるように精神的安全性が高く挑戦できる状態で有ることが望ましいし、 それにより成果が出やすいと思っているのでそこは積極的にやっていきたいと思っているしやっているつもり。 来月ぐらいからはもう少し、いろいろとバージョンアップさせていきたい。
その他
本業でKotlinを書き、副業ではnodeだったりreactだったりを書いているけど。Kotlinのほうが体には合ってるなと思うところが多々ある。 やっぱり多数で開発をやる場合は静的型付け言語の恩恵は相当大きいなと思う。 Androidをはじめて1年が経ち、Androidエンジニア感できてたと思っているw 引き続き12月も走りきって良い年を迎えられるように頑張っていく。
12月の機能リリースが終わったら、coroutine周りで記事書きたいところ...
AACのLiveDataのsetValueとpostValueの違いについて
コードを追ってみた
val liveData:MutableLiveData<String> = MutableLiveData<String>() fun useSetValue() { liveData.value = "aaa" } fun usePostValue() { liveData.postValue("aaa") }
setValue
の方はどうやらMainThread
でしか使用できないらしい。
確かにコードを実際に見てみると
setValue
@MainThread protected void setValue(T value) { assertMainThread("setValue"); mVersion++; mData = value; dispatchingValue(null); }
postValue
protected void postValue(T value) { boolean postTask; synchronized (mDataLock) { postTask = mPendingData == NOT_SET; mPendingData = value; } if (!postTask) { return; } ArchTaskExecutor.getInstance().postToMainThread(mPostValueRunnable); }
assertMainThread("setValue");
ここでMainTheadによる実行なのか確認して、エラーを出していた
どちらを使うべきなのか?
synchronized (mDataLock) { postTask = mPendingData == NOT_SET; mPendingData = value; }
実際にこの部分がどれだけコストが高いかによるが…
MainThreadで実行されることが確実なのであれば、setValue
を使えばいいし、逆にどのThreadで実行されるかわからない場合(特段指定してない場合)などはpostValue使うのが安全だよってことで
androidのdatabindingで書かれているxmlで&&(その他logic operator)を使いたいとき
下記対応表 | operator | 変換後| |----------|-------| | & | & | | < | < | | > | > | | " | " | | ' | ' |
<EditText android:id="@+id/edit_mail" android:text="@={mail}" /> <Button androidtext="保存" android:enabled="@{mail.length > 0 && isEmailValid(mail)}" />