Mori Atsushi

Top Blog Contact

Blog

  • 2025.8.24

    Claude CodeにブログをAstroへ移行してもらいました

    「ブログをNext.js(SSG)に移行しました」で紹介した通り、このブログはNext.js + Reactで実装されていました。
    4年ほど経っていくつか問題も抱えていたので、今度はAstroに移行しました。
    また、その際Claude Codeを最大限活用し、その結果1日ほどで移行が完了しています。
    移行に至った背景やどのようにAIを活用したのかについて紹介します。

    続きを読む
  • 2023.10.8

    Flow.combineの内部実装がすごい話

    Kotlin CoroutinesのFlowを使っている場合、UI状態の統合等でFlow.combineを使うことが多いと思います。
    Kotlin CoroutinesはOSSになっており、その実装を簡単に読むことができます。
    Flow.combineはどうやって実装されているのか気になり、読んでみると、思った以上に細かいところに気を配った丁寧な実装になっていて驚きました。
    今回はそのFlow.combineの実装を自分で再現するという流れで、公式のFlow.combineの工夫されている点や、複雑なFlowを自作する方法について学びたいと思います。

    続きを読む
  • 2022.12.18

    テスト用Dispatcherの使い分け【Kotlin Coroutines】

    この記事はKotlin Advent Calendar 2022の18日目の記事です。
    Kotlin Coroutinesを使ったコードのテストを書く場合、Dispatcherを差し替えることで仮想時間を使い、実際より短い時間でテストを実行したり、実行のタイミングを細かく制御することができます。
    テスト用のDispatcherとして、 StandardTestDispatcher と UnconfinedTestDispatcher の2つが用意されています。
    今回はこの2つの違いと使い分けについて紹介します。

    続きを読む
  • 2022.12.4

    Layout Composableを使って複雑なレイアウトを組む【Jetpack Compose】

    この記事はAndroid Advent Calendar 2022の4日目の記事です。
    Jetpack Composeで複雑なレイアウトを組むのに、Box, Row, Columnだけでは表現できずに困ったときはありませんか?
    もしかしたらLayout Composableを使うことで実現できるかもしれません。
    Layout Composableはかなり自由度高くレイアウトを組める一方、複雑で敬遠しがちです。
    今回は例をもとにLayout Composableの使い方について紹介します。

    続きを読む
  • 2022.2.20

    Jetpack Composeで再利用可能なコンポーネントを実現するために

    Jetpack Composeの大きな特徴として、再利用可能なコンポーネントを作りやすくなったことがあるでしょう。
    細かい単位でComposable関数に切り出すことで、同じUIを共通化できるだけでなく、今後の仕様追加/変更の際にもスムーズにコンポーネントを再利用できるでしょう。
    一方で、再利用可能なコンポーネントの実現にはいくつか注意すべき点があります。 今回は公式から述べられている注意事項や、自分が書いていて注意していることについて紹介します。

    続きを読む
  • 2022.2.13

    Jetpack ComposeのRippleエフェクトを深堀り、カスタマイズも

    ユーザが何かをタップしたときにフィードバックを返すことは、正常に入力できたことをユーザに伝えるだけでなく、心地よい操作感やリッチ感を実現するためにも重要です。
    MaterialDesignでは、クリック時に波紋状のRippleエフェクトを表示します。
    Jetpack ComposeでもMaterialThemeを利用している場合、クリック可能なコンポーネントはRippleエフェクトが表示されます。
    今回はJetpack ComposeでRippleエフェクトについて色々深堀りをしていき、Rippleの色を変えたり、そもそもタップ時のエフェクトを変更する方法についても紹介します。

    続きを読む
  • 2022.2.6

    Jetpack ComposeのTextFieldで最大文字数を制御する

    Jetpack Composeがstableになりしばらく経ちますが、利用しているとAndroid Viewにあった様々なものが、まだ用意されていないことに気が付きます。
    テキストを入力できる TextField は、まだ最大文字数(maxLength)を設定することができません。
    今回は最大文字数を設定するいくつかの方法について紹介を行います。

    続きを読む
  • 2021.12.13

    Jetpack ComposeとKotlin Coroutinesを連携させる

    この記事は Android Advent Calendar 2021 の13日目の記事です。
    Jetpack Composeは内部でもKotlin Coroutinesを多く使っており、非常に相性が良いです。
    今回はJetpack ComposeとKotlin Coroutinesを組み合わせて使ういくつかの方法について紹介します。

    続きを読む
  • 2021.12.5

    Kotlinのinline関数のパフォーマンスを調べる

    この記事は Kotlin Advent Calendar 2021 の5日目の記事です。
    Kotlinは関数をinline化することができます。
    inline化によるメリットはいくつかありますが、一つはパフォーマンスの向上でしょう。
    関数をパラメータとして受け取る関数については、メモリ割り当てが重複し、実行に多少のコストがかかります。
    inline化することで、コンパイル時に展開された形のコードが生成され、実行時のコストが削減されます。
    一方、コンパイル時に展開されることにより、出力される実行ファイルのサイズは増えると言われてるため、自分で作成した関数をinline関数化するかどうか悩むこともあるでしょう。
    今回は、inline化することによる、実行速度、メモリ使用量の変化と実行ファイルのサイズを確認してみます。

    続きを読む
  • 2021.11.21

    ブログをNext.js(SSG)に移行しました

    このブログはReactで1から作成しており、CSR (Client Side Rendering) として実行してました。
    この度、Next.jsのSSG (Static Site Generation) を導入してみたので、その報告になります。

    続きを読む
  • 2021.11.14

    Kotlin Coroutinesでフォアグラウンドになるまで待つ【Android】

    Androidアプリ開発において、Lifecycleを考慮することでユーザのリソースを有効的に利用することが出来ます。
    ユーザのリソースを不要に消費しないようにするためには、必要になったときに必要な処理を行うことが重要です。
    バックグラウンド時や他画面を開いているときAPIを叩く必要性が出てきても、LifecycleがSTARTEDになるまで待つべきでしょう。
    今回は、Kotlin Coroutinesを用いて、LifecycleがSTARTED、すなわちフォアグラウンドになったときにAPI等を叩くような処理について考えてみます。

    続きを読む
  • 2021.11.7

    Kotlin Coroutinesで共有リソースを扱う

    Kotlin CoroutinesをUIスレッド(Dispatchers.Main)のみで使っている場合、単一のリソースを複数Coroutinesで扱った場合でも問題が発生することはほとんどありません。
    一方で、バックグラウンドスレッドを含めた複数スレッド(Dispatchers.Default, Dispathcers.IO)で単一のリソースを共有した場合は、競合が発生し予期せぬ不具合を引き起こす可能性があります。
    今回はその危険性と解決方法について紹介します。

    続きを読む
  • 2020.6.14

    kotlin coroutines flowをlifecycle scopeで安全に扱う

    以前、kotlin coroutines flowを使って、LiveDataを使わずMVVMを行う方法について書きました。
    その後、StateFlowも登場し、ますますLiveDataの代わりに、kotlin coroutinesを使う手法が確立してきたように感じます。
    Flowをactivityやfragmentで安全にcollectするためには、lifecycle scopeを使う必要があります。
    しかし、lifecycle scopeは通常のcoroutines scopeにいくつかメソッドが追加されており、少し複雑です。
    今回はflowをlifecycleScopeで安全に使う方法について考えます。

    続きを読む
  • 2020.12.2

    kotlin coroutinesでViewModelからViewにイベント通知したい

    この記事はAndroid Advent Calendar 2020の2日目の記事です。
    SharedFlowやStateFlowの登場により、ますますkotlin coroutinesを手軽に扱えるようになってきました。
    AndroidのMVVMにおいても、LiveDataの代わりにStateFlowを使ってViewとViewModelをbindingすることが可能になりました。一方で、ViewModelからViewに状態ではなくイベントを送るのは未だいくつかの問題があります。
    今回は、複数の方法をメリットデメリットとともに紹介したいと思います。

    続きを読む
  • 2021.4.4

    launchWhenXXとrepeatOnLifecycleの違い【Android / Kotlin Coroutines】

    このブログでは度々お伝えしていますが、Kotlin Coroutinesは非同期処理を強力に支援してくれます。
    特に、値を複数回送受信することができるFlowの強化により、Kotlin Coroutinesの表現力がより一層向上し、一部LiveDataやRxJavaから移行する動きもあります。
    一方で、AndroidのLifecycleを考慮し、非同期処理を安全に利用するためには、いくつか注意する必要があります。
    今回は、以前からあるlaunchWhenStartedやlaunchWhenResumed等のlaunchWhenXX系と、lifecycle-runtime-ktx:2.4.0-alpha01で追加されたrepeatOnLifecycleの違いと使い分けについて紹介します。

    続きを読む
  • 2021.10.31

    LiveDataからCoroutines Flowへ移行する

    以前「LiveData vs Flow vs RxJava」という記事で紹介したとおり、LiveDataは非常にシンプルで、現在でもベストプラクティスであることは間違いないでしょう。
    一方で、既に多くの箇所でCoroutinesを導入していたり、Coroutinesが使いやすいと感じている場合、LiveDataからCoroutinesのFlowに移行することも選択肢の1つでしょう。
    CoroutinesはLiveDataより複雑で、様々なオプションを提供してくれているため、利用に戸惑うこともあると思います。
    今回は、LiveDataが利用されていたようなケースでCoroutines Flowを使う場合どうしたらいいのか、細かい差分についても紹介をしていきます。

    続きを読む
1 2 3 4
© 2025 Mori Atsushi. All rights reserved.