Groupieを使用してCarouselを間にはさみたいときにハマったメモ

複雑いろんな種類の見せ方(ViewHolder)があるようなリストを作るときにGroupieを使用すると楽に書けるのでGroupieをよく使っている。 今回はリストの中にカルーセルがあるようなリストがあり、それを作成する用のメモ

groupie/CarouselItem.java at master · lisawray/groupie · GitHub

【メモ】Google I/O 2019 動画リスト(Android関連)

Google I/O 2019 の Sessionを見返すために個人メモ

Google I/O 2019 All Session List

www.youtube.com


What’s New in Android Studio UI Design and Debugging Tools (Google I/O'19)

www.youtube.com

What’s New in Android (Google I/O'19)

www.youtube.com

What’s New in Architecture Components (Google I/O'19)

www.youtube.com

Android Jetpack: Understand the CameraX Camera-Support Library (Google I/O'19)

www.youtube.com

Best Practices in Using the Android Emulator (Google I/O'19)

www.youtube.com

What’s New in Android Development Tools (Google I/O'19)

www.youtube.com

Jetpack Navigation (Google I/O'19)

www.youtube.com

What’s New in the Android Studio Build System (Google I/O'19)

www.youtube.com

Android Studio: Tips and Tricks (Google I/O'19)

www.youtube.com

What’s New in the Android OS User Interface (Google I/O'19)

www.youtube.com

What’s New in ConstraintLayout (Google I/O'19)

www.youtube.com

Motional Intelligence: Build Smarter Animations (Google I/O'19)

www.youtube.com

Declarative UI Patterns (Google I/O'19)

www.youtube.com

Build Testable Apps for Android (Google I/O'19)

www.youtube.com

【2019】noteアプリをNotionにほぼ確定

はじめに

毎年良いnoteアプリがないか常に探し求めているのですが、 最近特定のアプリに落ち着き始めているので、そのアプリについてちょっと書いてみる

atsumo.hatenablog.com

選んだnoteアプリ(サービス)

Notion www.notion.so

自分が求める要件

  • Markdownで書ける
  • iOSアプリがあり、Macでも使える
  • 同期される
  • リンクの扱いを選べる(URL/埋め込み)
  • そのままシェアできる
  • TODOとかも書ける
  • メモに到達しやすい
  • いろんなものをストックしておける

Notionが自分の中で納得感あるものになった理由

去年の夏ぐらいからNotionに移行し、最初は課金せず使っていたもののメモの量も増えたため、結果課金した。 Twitterとかの投稿をClipしたいときなどに、WebClip的な機能があればもめっちゃいいのになと思いつつ、 そういうときは、個人用slackに貼ってみたり、記事などのリンクであればそのリンク自体に飛んで、そのリンクをはてブ登録してたりしていた。

特に機能追加などを追ってなかったのだが、久々にNotionについて調べると機能追加で WebClipper 機能が追加されているではないですか!

www.notion.so

また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振り返り

f:id:atsumo:20181203222354p:plain

メインどころでいうと Kotlin: 50時間 JavaScrip: 16時間

AndroidのProjectとかはやってる時間は長い割に、ビルド時間とかに時間がかかってるためか コードを実際にかいている時間はそこまで長くなかった… マルチモジュールにして、変更ごとにコンパイルに必要な時間をもう少しかいぜんできたら、 効率上がるかもなって思ったり思わなかったり。

Android 実装

  • 10月から関わっている本業は1年ぐらいかけてシステムリニューアルをしていて、そのリリースが11月の頭にできた
  • iOSと機能差異があるので、とにかく優先順位をつけながら追いつき実装を頑張っているところ
  • 11月はその追いつくための機能の実装だった
  • 新機能だったので前のチームで使ってたFluxを導入
  • DIのライブラリは入ってなかったが、使ったほうが楽な部分が多いのでいれて見るこってとになり入れてみた
    • Koinを入れてみてる -> 落ち着いたらどうだったか書きたい
    • ビルドは早いがコンパイル時はエラーになったりしないのでそこはネック
    • どこかでベンチとってたけど、ランタイム時の速度は確かにDaggerとかに比べたら遅いですわ
    • Daggerがビルド時に早くなるんだったら、乗り換えも検討していくと思う

チーム

10月から新しいチームでエンジニアリングマネジメントもやっている。 職種としてではないがやったほうが良さそうだなと思っているため。 10人未満の小さいチームだし、マネジメントっていうほど仰々しいものではないかもしれないけど、 週1で各メンバーと1on1をやりながら、悩んでること、変えたほうがいいと思っていること、意見、要望やキャリアパスの話など30分ざっくばらんに話している 今までコミュニケーション的な課題が多いと聞いていたので、この部分は個人的には大切にしていて時間を割いてもやらせてもらっている。 少しずつではあるが、チームメンバーの助けもあり、コミュニケーションが機能しはじめている気がしており、今後もやっていきたい。 よく言われるように精神的安全性が高く挑戦できる状態で有ることが望ましいし、 それにより成果が出やすいと思っているのでそこは積極的にやっていきたいと思っているしやっているつもり。 来月ぐらいからはもう少し、いろいろとバージョンアップさせていきたい。

その他

本業でKotlinを書き、副業ではnodeだったりreactだったりを書いているけど。Kotlinのほうが体には合ってるなと思うところが多々ある。 やっぱり多数で開発をやる場合は静的型付け言語の恩恵は相当大きいなと思う。 Androidをはじめて1年が経ち、Androidエンジニア感できてたと思っているw 引き続き12月も走りきって良い年を迎えられるように頑張っていく。

12月の機能リリースが終わったら、coroutine周りで記事書きたいところ...