heihei blog

Blog icon by Unsplash https://unsplash.com/@virussinside

DroidKaigi 2019にて「アプリをさらに成長させるための技術戦略」というタイトルで登壇をしました

DroidKaigi 2019とは?

Androidの技術情報の共有とコミュニケーションを目的としたカンファレンスです。2015年から毎年開催されており、2019年は、2月7日〜2月8日の二日間、開催されました。

droidkaigi.jp

登壇内容

「アプリをさらに成長させるための技術戦略」というタイトルで、初めての50分枠で登壇しました。

内容としては、今担当している絶賛成長中のプロダクトを、技術でさらに成長させることを目的に弊社の技術組織が行っている「技術戦略」についての紹介を主として、そこから自分個人の反省、振り返りを共有させていただく、というものでした。

speakerdeck.com

登壇までの準備

今回のような、エモかエモくないかでいったらどエモな内容の資料作りは初めてでした。そういうこともあり、自分としてはある種のチャレンジでした。発表資料を作る際には、とにかくどういう構成にしようか、ということが一番悩みました。

目次、伝えたいことなどを書き出したりもしたのですが、いざスライドを作り始めると、「この流れは伝わりやすいのかな?」と思ったり、ある一定のところまで書き出すと、「この発表、興味ある人いるのかな。」と急にネガティブになったりもしました。そんなこともあり、発表で伝えたい内容を一旦メモ帳に書き出しても、どうスライドに落とし込むのがいいのかなぁ、前提の話もある程度したほうが伝わりやすいかなぁ、など考える時間が多くなってしまっていました。

着地、終盤になってガガガっと無理やり進めるような(全く理想ではない)、慌ただしさは、今までと同じでした。

当日の振り返り

反省点として、やはり何度も言い直したりしっくり来る言葉がその場で見つからず1秒くらい止まってしまうようなことが何度かありました。 (当日聞きに来てくださった皆様で聞き苦しいと感じていた方、申し訳ありませんでした。🙇‍♂️ )これに関しては練習をするための時間が不足していたということに尽きるかと思います、、とはいえ、去年よりは良くなった、場数を踏み続けるしかない、とポジティブにも捉えて落ち込みすぎることはないようにもしたいと思っています。

良かったことは、自分が思っているよりも共感してくださる方や、リアクションをくれる方が多かったことです!登壇後、エクシビジョンホールやTwitter上で質問だったり共感の会話をしたり、去年よりもいろいろな方と自分の発表内容について話せたことが、なにより嬉しかったです。

また、同じ会社のエンジニアの方々も数人見に来てくださり、(正直弊社や弊社グループの方々は、他の方の発表を聞いていただいたほうがためになるでしょ!と思いつつ、)発表の場では励みになりました。 ありがとうございました 🙏

感謝

毎年、こうやってDroidKaigiを楽しめるのは、本当に運営の方々のおかげです。本当にありがとうございました。そしてお疲れ様でした!!

P.S. DroidKaigiはある意味、これからです。動画や資料を見返して、業務や個人開発で皆さんの知見を血肉化していきたいとおもいます。

2018年を振り返る

2018年をブログ記事で振り返ります。

1月

shoheikawano.com

振り返りブログを書き始めました。いつまで続かわからないけど、という形ではじめました。振り返ったら1年(なんとか)続いてよかったです。

DroidKaigiの資料作りに精一杯になっていた月でした。

2月

shoheikawano.com

DroidKaigiにて、Fluxについて発表しました。初めて30分という英語枠での登壇でした。緊張したし失敗もありましたが、それ以上に登壇する際に自信が少しつきました。

Okioについて調べ、@stsn_jpさんと一緒にDroidKaigi Rejectonにて発表しました。あれだけライブラリのソースコードを読み漁った夜はなかったです。楽しかった。。!

3月

shoheikawano.com

Droidcon BostonにてFluxについて発表しました。DroidKaigiでの発表内容をベースに修正を加えたものを発表しました。米国での発表ということで、DroidKaigi同様初めてのことだったので、とても緊張しました。。もちろんこちらも反省点がありましたが、運良くプロポーザルが通り、登壇できて嬉しかったです。発表後、オーディエンスの方から声を発表スライドについて褒められたことも忘れられません。

社内では、別子会社に出向となり、新たな転機となりました。

4月

shoheikawano.com

初めて技術書典に出す本を執筆し、販売しました。内容はOkioの内部実装についてでした。総数は少なかったですが、無事完売できてよかったです。

5月はGoogle I/Oということで、Pre-Partyなどにも参加しました。

5月

shoheikawano.com

Google I/O 2018に参加してきました。Google I/Oについての振り返りブログはこちら。また、Bitrise×Fastlaneを用いた自動化やマルチモジュール化を始めたりとしました。

6月

shoheikawano.com

Kyash Meetupに参加したり、Bitriseについての発表をしたりしました!初Kyashオフィスきれいだった。

この頃は事あるごとにKyashで支払いしたい病でした〜!

7月

shoheikawano.com

社員旅行に行ったり、「レビュー」という業務内の作業について社内の朝会で発表したりしました。

夏は、暑かったですね。

8月

shoheikawano.com

motifについての発表や、Bitriseのキャッシュについてなどの発表をしました。

タイに旅行に行ったりしたのも良い思い出です。初タイ、良かった。

9月

shoheikawano.com

DevFest Tokyo 2018にてパネルディスカッションに参加しました。授業参観のような形でした!AACはこれからもAndroidアプリ開発においては重要なコンポーネントになるはず。引き続き精進。

マッチング業界のエンジニア同士で集まって飲み会やって、勉強会開催しましょう!!とアツくなれた。

10月

shoheikawano.com

Android Weekendイベントを復活しました。英語で登壇したい人、練習したい人、ぜひ来年もやるのでチェックしてください!

www.meetup.com

また、技術書典にて再度本を出版しました。今回はPicassoの内部実装についてでした。このときも、全部売れてよかった。

あとは、秩父観光に行ったりとか。楽しかったです!

メイプルベースというお店がとても素敵でした。

11月

shoheikawano.com

Matching Dev Meetup開催!自分で企画からやったイベントでした。楽しかった。。

DroidKaigiプロポーザル採択通知。チャレンジ。🙏

12月

shoheikawano.com

チームだったり技術戦略とかに一番集中した一ヶ月だったと思う。

DroidKaigiの資料作りも頑張る!


振り返ってみると、たくさん新しいことや発表だったりができた一年でした。

社内では、新たなミッションだったりチャンスをいただけて幸せだと思っています。

2018年も大きな事故などなく、元気で過ごせてよかったです。

2019年も元気に過ごしたい。

今年もお疲れ様でした。お世話になりました。

来年も何卒宜しくおねがいします。

2018年12月を振り返る

2018年も残りあと数時間です。

それでは、12月を振り返ります!

12月やったこと

社内では、内定者アルバイトのAndroidエンジニアがチームにジョインしたり、職種ごとに定めた技術戦略を推進する日を設けてエンジニア全員で取り組んだり。

プロダクトとしては、アプリがGoogle Playフィーチャー枠に掲載されたりと、いろいろな嬉しいことがありました。

プロダクト開発では、大きめの機能開発に携わせてもらうこととなり、モックを作り始めたところです。来年頭は、こちらにさらに注力します。

そのほか、休日などは、代々木公園にある青の洞窟に行ったり、

GooglePixelコラボのカフェに行ってみたりしました。

「Search」という映画も見ました。噂通り、映画の内容すべてがPC画面上に映されるような描写となっていて斬新だなと思いました。斬新さだけではなくて、内容も申し分なく面白くてよかったです。また観たい。

www.youtube.com

そして今は、引っ越して初めてテレビをつけて、ふるさと納税のお礼品を堪能しながら、ガキ使を見てのんびりしています。

12月内容あんまり濃くないけど、こんな感じでした!(雑)

皆様、師走もお疲れ様でした!!🐗

Notes - Fun with LiveData (Android Dev Summit '18)

※Notes記事では、英語のセッション動画やポッドキャストの内容を(雑に)英語でメモに書き残すことを行っています。本記事は、あくまで動画を見ながら、参考程度に読んでいただくことを想定しています。Notes記事には雑メモ程度のものだったり、書き起こしのようなものもあります。これから実際の動画を見る際には、本記事の内容が少しでもお役に立てば幸いです。(内容において不備、誤字脱字等ありましたら気軽にご連絡いただけると嬉しいです。)

本記事は、Fun with LiveData (Android Dev Summit '18)の記事です。

f:id:shaunkawano:20181216213849p:plain

LiveData

Simple

Lifecycle-aware

  • In order to observe LiveData you need to provide lifecycle
  • LiveData is going to remove subscription on appropriate lifecycle event, for free

Observable

  • Activity and other view components have different lifecycle
  • Even Activity, when rotation changed, gets recreated and if some components have a reference to this activity then it leads to memory leak or worst, crash with NPE

=> Instead of letting something have reference of Activity, letting Activity observe live data is safe.

Data Holder

  • Live data is not a stream, data holder
  • If you want some stream concept use Rx

Transformations

  • If you use LiveData and ViewModel, you totally need to have transformations

Antipatterns

  • Storing big objects across Transformations
  • Sharing instances of LiveData
class SharedLiveDataRepository(val dataSource: MyDataSource) {
  private val result = MutableLiveData<Long>()

  fun loadItem(itemId: String): LiveData<Long> {
    result.value = dataSource.getData(itemId)
    return result // here we share the `result` LiveData
  }
}
  • Edge case: Activity Transitions
    • Two activities are active at the same time
    • If your class is a repository and you are creating a field of LiveData then maybe you are doing something wrong

When NOT to use LiveData

  • If you need a lot of operators or streams, use Rx.
  • If your operations are not about UI or lifecycle, use callback interfaces
  • If you have one-shot operation chaining, use coroutines

📝

  • LiveDataはデータホルダーなのでメモリに保持したくないようなオブジェクトは渡すべきではない
  • オペレーターやストリームの概念が必要なのであればRxJavaなどのリアクティブのコンセプトに特化したライブラリを使うべき
  • LiveDataのインスタンス共有は、(2つのAcitvity内のLiveDataが同時にActiveになる可能性があるため)極力避ける。そのような場合は都度、新しいLiveDataを生成。LiveDataの生成はそこまで重たい処理ではない。

Notes - Get Animated (Android Dev Summit '18)

※Notes記事では、英語のセッション動画やポッドキャストの内容を(雑に)英語でメモに書き残すことを行っています。本記事は、あくまで動画を見ながら、参考程度に読んでいただくことを想定しています。Notes記事には雑メモ程度のものだったり、書き起こしのようなものもあります。これから実際の動画を見る際には、本記事の内容が少しでもお役に立てば幸いです。(内容において不備、誤字脱字等ありましたら気軽にご連絡いただけると嬉しいです!m(__)m)

本記事は、Get Animated (Android Dev Summit '18)に関する記事です。

f:id:shaunkawano:20181216212636p:plain

Android Animation APIs

  • View Animations
  • Value Animator
  • Object Animator
  • View Property Animator
  • Transitions
  • Animated Vector Drawable
  • Physics
  • MotionLayout

android.view.animation

is now consider deprecated

  • Measure => Layout => Draw
    • android.view.animation is only applied in Draw process
  • WindowAnimation only accepts android.view.animation so it should be used only here, but otherwise consider it as deprecated
  • You may use it in FragmentTransaction
    • API also accepts Android animator so prefer animator

When to use which Animator

  • ObjectAnimator - general purpose, property animator
  • ValueAnimator - custom animation
  • ViewPropertyAnimator
    • Multiple properties on the same View
    • Fire and forget
  • PropertyValuesHolder - multiple properties on the same object
  • AnimatorSet - choreograph a set of animations

AnimatedVectorDrawable

When to use

  • Icon animation
  • Fire & forget animations
  • Performance critical

Physics

Physics-based Animation

  • Interruptible
  • Continuity
  • Realistic Look

Transitions

  • Shared element activity transitions
  • Window content enter/exit
  • Modularize animations
  • Simple changes

Motion / Animation

Helper

In ConstraintLayout 2.0, all the helpers are exposed for achieving encapsulated behaviors

  • ConstraintLayout utility
  • Apply it to a set of widgets
  • Supported in Android Studio
  • Use Animation APIs in helpers to promote reuse

E.g. Circular Reveal:

@Override
public void updatePostLayout(ConstraintLayout container) {
  super.updatePostLayout(container);
  if (mContainer != container) {
    int rad = (int) Math.hypot(mComputedMaxY - mComputedMinY, mComputedMaxX - mComputedMinX);
    Animator anim = ViewAnimationUtils.createCircularReveal(this, (int) mComputedCenterX - getLeft(), (int) mComputedCenterY - getTop(0, 0, rad);
    anim.setDuration(2000);
    anim.start();
  }
  mContainer = container;
}
<com.example.CircularRevealHelper
    android:id="@+id/helper"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:background="@drawable/lake"
    app:constraint_referenced_ids="imageView" />

MotionLayout

  • Only two states: Start to End
  • Where it shines
    • Declarative motion
    • Bespoke motion
    • Touch-driven motion

MotionLayout: Library

  • Part of ConstraintLayout 2.0
  • Released at Google IO'18
  • Built upon ConstraintLayout 1.1
  • Alpha 2

📝

  • android.view.animationはwindow animationには現状必要だが、それ以外のアニメーションには別のAPIを利用するほうが良さそう
  • 今後MotionLayoutが出てきてものすごいアニメーションを表現できるようになると思うが、既存APIとは適材適所で使い分けする必要がありそう
  • MotionLayoutの説明の部分で住友さんのツイッターアカウントが取り上げられていてめちゃ驚いた

2018年11月を振り返る

2018年もあと8%弱らしいです |←2019年| ┗(^o^ )┓三

それでは11月を振り返ります。

11月やったこと

Matching Dev Meetupを開催した

11/14(水)にMatching Dev Meetup#1 - iOS / Androidを開催しました。当日の写真などはぜひ弊社ブログにて。ブログにも記載しましたが、このイベントはsatoshin21さんとpotatotipsにてお話した際に盛り上がって開催に至ったものです。アットホームなイベントにできたらなーと思っていたので、開始前から懇親が盛り上がっていて楽しめて何よりでした。今後も継続的にやっていけたらと思っています。

弊社ブログには記載し忘れましたが、満足率は20件の回答中95%と嬉しい結果でした!

f:id:shaunkawano:20181203004117p:plain

ご参加していただいた皆様、改めてありがとうございました!

Androidテスト全書」を読み始めた

もともと本読むのが苦手なのですが、少しずつ読んでいます。今、3章まで読み終わりました。

一章の「テスト大事」という文字から溢れんばかりのメッセージがズシンときました。引き続き読む。

「The Manager's Path: A Guide for Tech Leaders Navigating Growth and Change」を読み始めた

弊社のエンジニアリングマネージャーがtimesチャンネルで勧めていたのをポチったもの。(少なくともAmazonには日本語電書籍版がなかったです。)まだ2章目入ったくらい。いまのところ真新しいことがたくさん!というよりは、どちらかというと、「そうだよね、意識しなきゃだよな。。」ということがたくさんある。すでに買ってよかった。言われてみると当たり前ってことでも意識して行動できないことたくさん。下記とかも。

Developing a sense of ownership and authority for your own experiences at work, and not relying on your manager to set the entire tone for your relationship, is an important step in owning your career and workplace happiness.


※12/3(月)追記

O'Reilly Japanのウェブサイトにて電子版が販売されているとのことです!@takasfzさん教えていただき、ありがとうございました!

www.oreilly.co.jp

その他

DroidKaigiのプロポーザルが採択された

エモ枠でがんばります!(「技術戦略」がテーマです。こういう内容ききたい!などがあればぜひお気軽にDM等でご連絡ください!!🙏)

明治神宮の銀杏並木を散策した

1−2週間前にいってきました。人がたくさんいた。。今くらいの時期が色が一番綺麗かも!

f:id:shaunkawano:20181203010630p:plain

それでは、11月もお疲れ様でした〜ヽ('∀')ノ

Notes - Modern Android Notifications (Android Dev Summit '18)

※Notes記事では、英語のセッション動画やポッドキャストの内容を(雑に)英語でメモに書き残すことを行っています。本記事は、あくまで動画を見ながら、参考程度に読んでいただくことを想定しています。Notes記事には雑メモ程度のものだったり、書き起こしのようなものもあります。これから実際の動画を見る際には、本記事の内容が少しでもお役に立てば幸いです。(内容において不備、誤字脱字等ありましたら気軽にご連絡いただけると嬉しいです!m(__)m)

本記事は、Modern Android Notifications (Android Dev Summit '18)の記事です。

f:id:shaunkawano:20181203014407p:plain

  • Respect user's settings
  • Send well-structured notification
  • Send relevant and timely notification
  • Make use of Auto-cancelling
  • Make use of Timeouts
  • No notifications that are not actionable

Notification Channels

  • Used to empower users
  • Help user categorize the notification
  • Help user customize the setting

Tips

  • Don't use only one channel
  • Don't use wrong/blocked channel

What's new in Notifications

  • API 28: New person class
// create new Person
val sender = Person.Builder().setName(name)
  .setUri(uri)
  .setIcon(icon)
  .build()

// create message with image
val message = Notification.MessagingStyle.Message("Picture", time, sender)
  .setData("image/", imageUri)

val style = Notification.MessagingStyle(sender)
  .addMessage("Check this out!", time, sender)
  .addMessage(message)
  .build()
...

val builder = Notification.Builder(this, CHANNEL_ID)
  .setSmallIcon(R.drawable.notification_icon)
  .setStyle(style) 

Tips

  • Do not auto-cancel messaging notification after sending
    • Let user swipe the notification when they finish their conversation

Digital Wellbeing

  • Overview of app usage
  • Dashboard for notification received, time spending on apps
  • To manage notifications, reduce interruptions

How are notifications counted?

=> If notifications were sent to blocked channel they are not counted, otherwise counted.

Reduce interruptions

  • Empower user

Work with Do not Disturb

  • Set category
  • Tag people
    • Add person
    • Set the URI associated with the person

Summary

Don't annoy the user. Respect them. Empower them. Delight them.

Connect them to the people they care about.