<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"><channel><title>Mori Atsushi</title><description>森 篤史のポートフォリオサイト</description><link>https://moriatsushi.com/</link><item><title>僕がEOS Rを選んだ理由</title><link>https://moriatsushi.com/blog/1/</link><guid isPermaLink="true">https://moriatsushi.com/blog/1/</guid><description>この記事はmast Another Advent Calendar 2018の22日目の記事です。\nSONYでもNikonでもなく、EOS Rを選んだ理由を話します。</description><pubDate>Sun, 23 Dec 2018 13:32:00 GMT</pubDate></item><item><title>未踏を振り返る</title><link>https://moriatsushi.com/blog/15/</link><guid isPermaLink="true">https://moriatsushi.com/blog/15/</guid><description>2019年度未踏事業を終え、先日スーパークリエータに認定して頂きました。\n\nいい機会なので、未踏に参加した背景から追えての感想まで、一通り振り返りたいと思います。</description><pubDate>Sun, 31 May 2020 16:00:00 GMT</pubDate></item><item><title>fragmentでもby lazyっぽく書きたい</title><link>https://moriatsushi.com/blog/17/</link><guid isPermaLink="true">https://moriatsushi.com/blog/17/</guid><description>fragmentが難しい理由の一つとして、viewの生存期間よりfragmentの生存期間のほうが長い、というところがあると思います。\nそのため、viewが再生成された際に正しく新しいviewを参照できなかったり、viewへの参照が切られずメモリリークしたりということがよく起きます。\n今回はviewへの参照をby lazyの形で安全に書ける仕組みを考えてみたいと思います。</description><pubDate>Sun, 28 Jun 2020 10:00:00 GMT</pubDate></item><item><title>kotlin coroutines flowでMVVMを試した（LiveDataを使わない）</title><link>https://moriatsushi.com/blog/11/</link><guid isPermaLink="true">https://moriatsushi.com/blog/11/</guid><description>LiveDataは非常に便利ですが、以前も書いたとおり、hotとcoldがわかりにくい、内部がjavaのためnon nullを扱いにくい等、ところどころ不自由な点があります。\nまた、kotlin coroutines flowを採用している場合、どこまでflowで流して、どこでLiveDataに変換するか、という問題に直面します。\nなら、いっそのことLiveDataを使わず、全てflowでMVVMを完結させられるのではないかと思い、今回試してみました。\nその際に気をつけた点、気がついたこと等をまとめます。</description><pubDate>Sun, 26 Apr 2020 10:00:00 GMT</pubDate></item><item><title>LiveDataのHot, Coldって意識できている？</title><link>https://moriatsushi.com/blog/10/</link><guid isPermaLink="true">https://moriatsushi.com/blog/10/</guid><description>最近のandroid開発において、複雑なlifecycleに対応するのにLiveDataは重要な役割を果たすことが多いです。\nその他のstream系ライブラリと比べても非常にシンプルで、初心者でも比較的親しみやすいと思います。\n一方で、意外なところで躓くことも多いのが実情かと思います。（経験談）\n今回はHot, Coldの話を主軸に、LiveDataの躓きやすいポイントについて触れたいと思います。</description><pubDate>Sun, 12 Apr 2020 10:00:00 GMT</pubDate></item><item><title>kotlin coroutinesのStateFlowのドキュメントを読み込む</title><link>https://moriatsushi.com/blog/13/</link><guid isPermaLink="true">https://moriatsushi.com/blog/13/</guid><description>kotlin coroutines 1.3.6にて、StateFlowというものが導入されました。\n\n状態管理のために用いられる型で、将来的にConflatedBroadcastChannelから置き換わるとも言われています。\n\n今回は、ドキュメントを詳しく見つつ、実際にコードを動かして特徴について見ていきたいと思います。</description><pubDate>Sun, 17 May 2020 10:00:00 GMT</pubDate></item><item><title>kotlin coroutines flowをlifecycle scopeで安全に扱う</title><link>https://moriatsushi.com/blog/16/</link><guid isPermaLink="true">https://moriatsushi.com/blog/16/</guid><description>以前、kotlin coroutines flowを使って、LiveDataを使わずMVVMを行う方法について書きました。\nその後、StateFlowも登場し、ますますLiveDataの代わりに、kotlin coroutinesを使う手法が確立してきたように感じます。\nFlowをactivityやfragmentで安全にcollectするためには、lifecycle scopeを使う必要があります。\nしかし、lifecycle scopeは通常のcoroutines scopeにいくつかメソッドが追加されており、少し複雑です。\n今回はflowをlifecycleScopeで安全に使う方法について考えます。</description><pubDate>Sun, 14 Jun 2020 10:00:00 GMT</pubDate></item><item><title>kotlin coroutines flowのテストを快適に書く</title><link>https://moriatsushi.com/blog/20/</link><guid isPermaLink="true">https://moriatsushi.com/blog/20/</guid><description>StateFlowもリリースされ、kotlin coroutines flowがますます存在感を増してきています。\n一方、単体テスト等を書こうとした際、こういったストリームをテストするのは比較的難しいです。\n今回は、僕が普段実際に使ってるテスト用utilとその使い方について紹介したいと思います。</description><pubDate>Sun, 02 Aug 2020 10:00:00 GMT</pubDate></item><item><title>継承より良い方法を選ぼう</title><link>https://moriatsushi.com/blog/2025-anti-inheritance/</link><guid isPermaLink="true">https://moriatsushi.com/blog/2025-anti-inheritance/</guid><description>書籍『良いコードの道しるべ 変化に強いソフトウェアを作る原則と実践』に書ききれなかった内容を書き記すシリーズ第2弾として、オブジェクト指向プログラミングにおけるクラスの継承の置き換えについて紹介します。&lt;br/&gt;すでに多くの記事でも言及されている通り、クラスの継承はしばしば保守性に関する重大な問題をもたらします。&lt;br/&gt;私自身、継承によって複雑になったコードに幾度となく悩まされてきました。&lt;br/&gt;このブログ記事では、継承ではなく具体的にどのようなコードを書くべきかについて紹介します。</description><pubDate>Sun, 07 Sep 2025 00:00:00 GMT</pubDate></item><item><title>ポリモーフィズムで条件分岐を置き換える利点と欠点</title><link>https://moriatsushi.com/blog/2025-polymorphism/</link><guid isPermaLink="true">https://moriatsushi.com/blog/2025-polymorphism/</guid><description>最近『良いコードの道しるべ 変化に強いソフトウェアを作る原則と実践』という書籍を出版しました。\nこの本は、主に初学者に向けて「どうすれば読みやすく、保守しやすいコードを書けるか」をできるだけシンプルにまとめました。\nそのため、複雑であったり議論を呼ぶようなテーマ、また特定の言語に強く紐づく内容は意図的に載せていません。\n本で書ききれなかった内容に関して、ブログでいくつか紹介したいと思います。\n初回は、「ポリモーフィズムで条件分岐を置き換える」ことのメリットとデメリットについて紹介します。</description><pubDate>Sat, 30 Aug 2025 00:00:00 GMT</pubDate></item><item><title>androidでgrpc-kotlinを使う</title><link>https://moriatsushi.com/blog/12/</link><guid isPermaLink="true">https://moriatsushi.com/blog/12/</guid><description>サーバ間、サーバとクライアント間の通信でgRPCを採用することは、様々なメリットがあります。\nAndroidでもgRPCの採用事例が増えてきたように思います。\n以前はgrpc/grpc-javaを使ってstubを生成してたと思うのですが、いつの間にかgrpc/grpc-kotlinも出ていました。\nしっかりとkotlin coroutinesをサポートしており、かなり便利だったので、導入方法を紹介します。</description><pubDate>Sun, 10 May 2020 10:00:00 GMT</pubDate></item><item><title>タッチエリアを広げる【Android】</title><link>https://moriatsushi.com/blog/18/</link><guid isPermaLink="true">https://moriatsushi.com/blog/18/</guid><description>Androidに置いてアクセシビリティの観点からボタンのサイズは縦横共に最小48dpを推奨されています。（iOSは44pxみたいです）\nまた、デザイン上そのサイズに満たない場合でも、その周りもタッチできることが求められています。\n今回はそれの具体的な実装方法について紹介したいと思います。</description><pubDate>Sun, 12 Jul 2020 10:00:00 GMT</pubDate></item><item><title>Kotlin Android Extensions(views)はやめてViewBindingを使おう</title><link>https://moriatsushi.com/blog/19/</link><guid isPermaLink="true">https://moriatsushi.com/blog/19/</guid><description>Kotlin Android Extensionは現在２つ機能があり、findViewByIdを省略できるviewsとParcelableの実装を楽にしてくれるparcelizeがあります。\n特に viewsは非常に便利で、僕自身もよく使っていました。\n一方、ViewBindingというものも登場し、DataBindingの軽量版みたいな立ち位置で、こちらもfindViewByIdを省略することができます。\nKotlin Android ExtensionとViewBinding、DataBindingを比較し、使い分けについて議論したいと思います。</description><pubDate>Sun, 19 Jul 2020 10:00:00 GMT</pubDate></item><item><title>本当は怖い。透明activityのlifecycleの罠。</title><link>https://moriatsushi.com/blog/14/</link><guid isPermaLink="true">https://moriatsushi.com/blog/14/</guid><description>androidアプリでは、activityの背景を透明にすることで、dialogのように扱ったり、様々なUI表現をすることができます。\n最近はFragment周りの環境が整ってきた影響であまり使われなくなってきた印象がありますが、まだまだ使っているプロジェクトもあるのではないかと思います。\n透明activityを使った場合、実はactivityのlifecycleが通常とは異なる動作をしており、少し詰まったのでまとめます。</description><pubDate>Sun, 24 May 2020 10:00:00 GMT</pubDate></item><item><title>Navigation Componentのいい感じのアニメーションを検討する【サンプルアプリあり】</title><link>https://moriatsushi.com/blog/21/</link><guid isPermaLink="true">https://moriatsushi.com/blog/21/</guid><description>Navigation Componentの登場により、画面遷移をFragmentベースで行う例が増えてきたように思います。\n\nFragmentで画面遷移をさせることで、toolbarやbottom navigation view等の共通のUIを表示し続けられるようになったり、activityでの画面遷移よりパフォーマンスがよかったり、いくつかの利点があります。\n\n一方で、activityでの画面遷移とは違い、navigation利用時は遷移時にデフォルトのアニメーションがつきません。\n\nそこで、今回はいくつかの遷移アニメーションの例を提示したいと思います。</description><pubDate>Mon, 10 Aug 2020 10:00:00 GMT</pubDate></item><item><title>OnLifecycleEventより、DefaultLifecycleObserverを使おう</title><link>https://moriatsushi.com/blog/22/</link><guid isPermaLink="true">https://moriatsushi.com/blog/22/</guid><description>Androidの複雑なlifecycleに対応するのに、jetpackのLifecycleObserver等の仕組みは非常に強力です。\nLifecycleObserverにはいくつか種類がありますが、LifecycleObserverのinterfaceにOnLifecycleEventのアノテーションを付けてやる方法が一番一般的だと思っていました。\nしかし、java 8環境下ではDefaultLifecycleObserverのほうが強く推奨されていたので、その説明と、移行に関する注意点をまとめてみます。</description><pubDate>Sun, 13 Sep 2020 10:00:00 GMT</pubDate></item><item><title>ViewModelでString resourcesを扱いたい</title><link>https://moriatsushi.com/blog/23/</link><guid isPermaLink="true">https://moriatsushi.com/blog/23/</guid><description>Androidで開発する際、文字列のリソースは res/values/strings.xml に書いて管理すると思います。\nそれらを実際に文字列として取得するためには、contextが必要になります。\n一方で、ViewModelにActivity contextを渡すことはメモリリークの危険性があるため、アンチパターンとされています。\nApplication contextで文字列を取得する方法もあると思いますが、言語切替時に正しくUIが更新されない等、あまり良くないと感じました。\nViewModelではenum等を作成し、View側で文字列に変換する等の方法もあると思いますが、細かい文字列の制御が難しくなります。\n今回はActivity contextを使いつつ、いい感じにString resourcesを扱う方法について紹介したいと思います。</description><pubDate>Sun, 20 Sep 2020 10:00:00 GMT</pubDate></item><item><title>Claude CodeにブログをAstroへ移行してもらいました</title><link>https://moriatsushi.com/blog/2025-claude-astro/</link><guid isPermaLink="true">https://moriatsushi.com/blog/2025-claude-astro/</guid><description>「ブログをNext.js(SSG)に移行しました」で紹介した通り、このブログはNext.js + Reactで実装されていました。&lt;br/&gt;4年ほど経っていくつか問題も抱えていたので、今度はAstroに移行しました。&lt;br/&gt;また、その際Claude Codeを最大限活用し、その結果1日ほどで移行が完了しています。&lt;br/&gt;移行に至った背景やどのようにAIを活用したのかについて紹介します。</description><pubDate>Sun, 24 Aug 2025 00:00:00 GMT</pubDate></item><item><title>kotlin coroutinesのFlow, SharedFlow, StateFlowを整理する</title><link>https://moriatsushi.com/blog/24/</link><guid isPermaLink="true">https://moriatsushi.com/blog/24/</guid><description>JetpackでもRoom, Paging 3, DataStore等様々なライブラリがkotlin coroutines flowを使い始め、もはやAndroid開発にはflowが必要不可欠になってきました。\nそんな中、以前紹介したStateFlowに加えて、SharedFlowが1.4.0-M1から登場しました。\n少し複雑に感じますが、実はかなり整理されており、以前より使いやすくなっていると思っています。\n今回は、Flow、SharedFlow、StateFlowの概要に関して紹介し、各々の詳細に関しては別途まとめたいと思います。</description><pubDate>Sun, 25 Oct 2020 10:00:00 GMT</pubDate></item><item><title>SharedFlowの深堀り、replay, bufferって何【kotlin coroutines flow】</title><link>https://moriatsushi.com/blog/25/</link><guid isPermaLink="true">https://moriatsushi.com/blog/25/</guid><description> SharedFlowはkotlin corouteinsの1.4.0-M1で追加された新しいFlowです。\n以前、Flow, SharedFlow, StateFlowの比較を行いました。\n今回はSharedFlowの詳細な仕様に関して深堀りしていきたいと思います。</description><pubDate>Sun, 01 Nov 2020 10:00:00 GMT</pubDate></item><item><title>StateFlowの深堀り、SharedFlowとの違いとstateIn【kotlin coroutines flow】</title><link>https://moriatsushi.com/blog/27/</link><guid isPermaLink="true">https://moriatsushi.com/blog/27/</guid><description>StateFlowはkotlin corouteinsの1.3.6で追加された状態管理用の特別なFlowです。\n以前、「StateFlowのドキュメントを読み込む」という記事を書きましたが、その後SharedFlowが追加され、若干実装に変更がありました。\nまた、新たにstateInというoperatorも追加されています。\n今回はそれらを含めたStateFlowの詳細な仕様に関して深堀りしていきたいと思います。</description><pubDate>Sun, 15 Nov 2020 10:00:00 GMT</pubDate></item><item><title>kotlin coroutinesでViewModelからViewにイベント通知したい</title><link>https://moriatsushi.com/blog/28/</link><guid isPermaLink="true">https://moriatsushi.com/blog/28/</guid><description>この記事はAndroid Advent Calendar 2020の2日目の記事です。\nSharedFlowやStateFlowの登場により、ますますkotlin coroutinesを手軽に扱えるようになってきました。\nAndroidのMVVMにおいても、LiveDataの代わりにStateFlowを使ってViewとViewModelをbindingすることが可能になりました。一方で、ViewModelからViewに状態ではなくイベントを送るのは未だいくつかの問題があります。\n今回は、複数の方法をメリットデメリットとともに紹介したいと思います。</description><pubDate>Wed, 02 Dec 2020 10:00:00 GMT</pubDate></item><item><title>【Android】新旧アーキテクチャが混ざるプロジェクトで気をつけていること</title><link>https://moriatsushi.com/blog/29/</link><guid isPermaLink="true">https://moriatsushi.com/blog/29/</guid><description>この記事はCyberAgent Developers Advent Calendar 2020の6日目の記事です。\nある程度の歴史の長いプロジェクトでは、リアーキテクチャやアーキテクチャのブラッシュアップ等により、複数のアーキテクチャが混ざるということが多々あると思います。\n私もAndroidアプリにおいてMVCからMVVM、javaからkotlinへの段階的リアーキテクチャを進めています。\nその中で一番重要なのは、 新アーキテクチャの実装/設計を旧アーキテクチャに依存させないことだと感じています。\n今回は、それを実現するためのいくつかの工夫について紹介したいと思います。\n</description><pubDate>Sun, 06 Dec 2020 10:00:00 GMT</pubDate></item><item><title>【Kotlin】suspend functionとテストの書き方</title><link>https://moriatsushi.com/blog/30/</link><guid isPermaLink="true">https://moriatsushi.com/blog/30/</guid><description>この記事は Kotlin Advent Calendar 2020の15日目の記事です。\n非同期処理を書く際に、kotlin coroutinesは使いやすく、非常に強力です。\n一方で、単体テスト等を書くのには一定のハードルがあります。\n今回は、suspend functionをテストしたり、モックする方法について紹介します。</description><pubDate>Tue, 15 Dec 2020 10:00:00 GMT</pubDate></item><item><title>2020年のAndroidアプリ開発の変化を振り返る</title><link>https://moriatsushi.com/blog/31/</link><guid isPermaLink="true">https://moriatsushi.com/blog/31/</guid><description>2020年ももうすぐ終わりですね。\n今年は本当に激動の1年でした。\nAndroidアプリ開発においても、1年経てば色々と環境が変わってきます。\n今年出た技術や注目された技術について、私なりの視点で解説していきたいと思います。</description><pubDate>Sun, 27 Dec 2020 06:00:00 GMT</pubDate></item><item><title>ZennでKotlin Coroutinesの本を公開しました！【目次あり】</title><link>https://moriatsushi.com/blog/32/</link><guid isPermaLink="true">https://moriatsushi.com/blog/32/</guid><description>Zennというサイトで、「詳解 Kotlin Coroutines [2021]」という本を公開しました。\nこれまでブログに載せてきた情報に加えて、Kotlin Coroutinesを体系的に学べるようまとめてあります。\n1, 2章は無料公開しているので、ぜひご覧ください。\n2021年2月28日まではセールで少しお安くお買い求め頂けます。</description><pubDate>Sun, 31 Jan 2021 06:00:00 GMT</pubDate></item><item><title>【Android】アニメーション付きBindingAdapterを作る</title><link>https://moriatsushi.com/blog/33/</link><guid isPermaLink="true">https://moriatsushi.com/blog/33/</guid><description>Jetpack Composeのβ版が公開され盛り上がりを見せていますが、まだまだAndroidでViewを作成する際はDataBindingが主流でしょう。\nDataBindingはxml内でコードを参照することでアプリのデータとUIを同期することができ、MVVMのアーキテクチャでより威力を発揮します。\nBindingAdapterを使うことで、独自のプロパティを作成することも可能です。\nこれらは非常に便利なツールですが、アニメーションを扱う上ことは若干苦手とします。\n今回はアニメーション付きのBindingAdapterを作るときの注意点と、その解決方法について紹介をします。</description><pubDate>Sun, 07 Mar 2021 06:00:00 GMT</pubDate></item><item><title>GASで記念日通知 slack botを作ろう</title><link>https://moriatsushi.com/blog/26/</link><guid isPermaLink="true">https://moriatsushi.com/blog/26/</guid><description>突然ですが、2020年11月6日に入籍しました。\n結婚記念日やその他記念日を忘れると、怒られが発生するので、記念日当日にslackに通知してもらいましょう。\n今回はGAS(Google Apps Script)を使っていきます。</description><pubDate>Sun, 08 Nov 2020 10:00:00 GMT</pubDate></item><item><title>LiveData vs Flow vs RxJava</title><link>https://moriatsushi.com/blog/34/</link><guid isPermaLink="true">https://moriatsushi.com/blog/34/</guid><description>Kotlin Coroutinesの進化はすざましく、とどまるところを知りません。\n状態やイベントを扱いやすくなったStateFlowやSharedFlowが登場し、さらには、Lifecycleをより扱いやすくなったLifecycleOwner.addRepeatingJobやLifecycleOwner.repeatOnLifecycle、Flow.flowWithLifecycleが追加されました。\nRoomやDataStore等Jetpackの各種ライブラリでもCoroutinesが使われており、Jetpack Composeでも様々なところでCoroutinesが活用されています。\nそういった中で、一部LiveDataやRxJavaからCoroutinesに書き直す動きが見られ、多少混乱を招いていると感じています。\n結論から言うと、現時点において積極的にCoroutinesに移行する必要性はないと考えています。\n今回は、それらを比較しつつ、どういった使い分けをするのが好ましいのか私の視点からまとめます。</description><pubDate>Sun, 28 Mar 2021 06:00:00 GMT</pubDate></item><item><title>launchWhenXXとrepeatOnLifecycleの違い【Android / Kotlin Coroutines】</title><link>https://moriatsushi.com/blog/35/</link><guid isPermaLink="true">https://moriatsushi.com/blog/35/</guid><description>このブログでは度々お伝えしていますが、Kotlin Coroutinesは非同期処理を強力に支援してくれます。\n特に、値を複数回送受信することができるFlowの強化により、Kotlin Coroutinesの表現力がより一層向上し、一部LiveDataやRxJavaから移行する動きもあります。\n一方で、AndroidのLifecycleを考慮し、非同期処理を安全に利用するためには、いくつか注意する必要があります。\n今回は、以前からあるlaunchWhenStartedやlaunchWhenResumed等のlaunchWhenXX系と、lifecycle-runtime-ktx:2.4.0-alpha01で追加されたrepeatOnLifecycleの違いと使い分けについて紹介します。</description><pubDate>Sun, 04 Apr 2021 06:00:00 GMT</pubDate></item><item><title>「チームで育てるAndroidアプリ設計」を読んで、アーキテクチャの育成について考える</title><link>https://moriatsushi.com/blog/36/</link><guid isPermaLink="true">https://moriatsushi.com/blog/36/</guid><description>この記事はPRです。\n@mhidakaさんからお声がけ頂き、先日発売された横幕 圭真さんと釘宮 愼之介さんの本「チームで育てるAndroidアプリ設計」をレビューすることになりました。\n私なりに読んで感じたこと、そして自分のアーキテクチャの育成に対する考えを書きたいと思います。</description><pubDate>Sun, 02 May 2021 06:00:00 GMT</pubDate></item><item><title>FlutterとClean Architectureでアプリ開発</title><link>https://moriatsushi.com/blog/3/</link><guid isPermaLink="true">https://moriatsushi.com/blog/3/</guid><description>この記事はCyberAgent 19新卒 エンジニア Advent Calendar 2018の24日目の記事です。\n\nAndroidとiOSのアプリを両方開発するのはめんどくさいということで、react nativeやflutterといったマルチプラットフォームのフレームワークが充実してきています。\n今回、flutter + MVVM + Clean Architecture + rxdart で簡単なAndroid、iOSアプリを開発したので、その際に気をつけた点等を共有しようと思います。</description><pubDate>Mon, 24 Dec 2018 19:14:00 GMT</pubDate></item><item><title>MVVMでモデルに処理を寄せる【Android】</title><link>https://moriatsushi.com/blog/37/</link><guid isPermaLink="true">https://moriatsushi.com/blog/37/</guid><description>Androidアプリ開発を行う際、公式も推奨しているViewModelを使ったアーキテクチャを採用することが多いと思います。\nViewからViewModelに処理を移動させていくと、Viewに全てを書くよりは幾分かマシになります。\n一方、アプリケーションが複雑になっていくと、今度はViewModelが肥大化するという問題に直面するでしょう。\nこの問題は様々な要因が考えられ、解決は容易ではありません。\n私自身、いつも頭を悩ましながら、コードの整理に努めています。\n今回は、私が最近試みた中で比較的うまく行っている方法の中から、Modelに処理を寄せる話と、UseCaseレイヤーの話を、コードの例を交えながら紹介します。</description><pubDate>Sun, 29 Aug 2021 06:00:00 GMT</pubDate></item><item><title>AWSとprerender.ioでSEO対策</title><link>https://moriatsushi.com/blog/4/</link><guid isPermaLink="true">https://moriatsushi.com/blog/4/</guid><description>最近流行りのreactやvueなどSPAでWebアプリを作ると、サーバサイドレンダリング（SSR）をすべきか悩みます。\nGoogleのクローラはjavascriptを割ときちんとレンダリングしてくれるため、あまり意識なくてもいいようになりました。\n一方、titleやogpなどのmetaタグをjavascriptで書き換えている場合、twitterやslackで共有した際にカードが正しく表示されない問題は依然残されています。\nmetaタグだけをサーバサイドレンダリングすることも可能ですが、今回はprerender.ioを使い、クローラに向けてだけレンダリング済みのHTMLを返すようにしたいと思います。</description><pubDate>Wed, 26 Dec 2018 10:00:00 GMT</pubDate></item><item><title>Jetpack ComposeとViewModelについて考える</title><link>https://moriatsushi.com/blog/40/</link><guid isPermaLink="true">https://moriatsushi.com/blog/40/</guid><description>Jetpack Composeの導入は、アーキテクチャについて再検討する良い機会でしょう。\nGoogleはAndroid Architecture Components(AAC)のViewModelとJetpack Composeを結合する方法を解説しており、今まで通りのViewModelが利用できるとしています。一方でTwitter等ではViewModelは不要になるのでは？といった議論もされてきました。\n結論から言うと、Jetpack Composeの導入によってViewModelの形や名称は変化する可能性はあるが、関心の分離の観点からUIとロジックの分離は依然として重要であり、今後もViewModelに相当するものは無くならないでしょう。\n今回はJetpack Comopseを使う上で、ViewModelをどのように扱うのが良いのか、どのように変化する可能性があるのか、いくつかの考察を行ってみたいと思います。</description><pubDate>Sun, 19 Sep 2021 06:00:00 GMT</pubDate></item><item><title>Jetpack Composeでレスポンシブ対応なら、BoxWithConstraintsが便利</title><link>https://moriatsushi.com/blog/41/</link><guid isPermaLink="true">https://moriatsushi.com/blog/41/</guid><description>Jetpack Composeを使うことで、今までのxmlベースの実装では対応が難しかったいくつかの内容に対して、実装が容易になることがあります。\nその1つがレスポンシブ対応です。\nタブレット端末も含めると大小様々な画面サイズのデバイスがあり、また分割画面も考慮すると、対応すべき画面サイズは膨大なものになっています。\n最近は折りたたみスマートフォンも増えてきましたね。\nxmlベースでのUI構築では、xmlを分けるか、ゴリゴリコードを書いて命令的に更新する必要がありました。\nJetpack ComposeはBoxWithConstraintsを使うことで簡単に対応することが出来ます。\n今回はその使い方について紹介します。</description><pubDate>Sun, 10 Oct 2021 06:00:00 GMT</pubDate></item><item><title>Android 12で変わったActivityのLifecycleの話</title><link>https://moriatsushi.com/blog/42/</link><guid isPermaLink="true">https://moriatsushi.com/blog/42/</guid><description>Android 12ではMaterial Youが採用されたり、スクロールのエフェクトが変わったり、スプラッシュ画面がついたりと、UI周りの変更が多く見られました。\nその裏で、セキュリティやパフォーマンス等に関する内部的な変更もいくつか存在します。\n今回はその中から、ActivityのLifecycleに一部変更があった点について紹介を行い、また開発者が気をつけるべき点について解説します。</description><pubDate>Sun, 24 Oct 2021 06:00:00 GMT</pubDate></item><item><title>LiveDataからCoroutines Flowへ移行する</title><link>https://moriatsushi.com/blog/43/</link><guid isPermaLink="true">https://moriatsushi.com/blog/43/</guid><description>以前「LiveData vs Flow vs RxJava」という記事で紹介したとおり、LiveDataは非常にシンプルで、現在でもベストプラクティスであることは間違いないでしょう。\n一方で、既に多くの箇所でCoroutinesを導入していたり、Coroutinesが使いやすいと感じている場合、LiveDataからCoroutinesのFlowに移行することも選択肢の1つでしょう。\nCoroutinesはLiveDataより複雑で、様々なオプションを提供してくれているため、利用に戸惑うこともあると思います。\n今回は、LiveDataが利用されていたようなケースでCoroutines Flowを使う場合どうしたらいいのか、細かい差分についても紹介をしていきます。</description><pubDate>Sun, 31 Oct 2021 06:00:00 GMT</pubDate></item><item><title>Kotlin Coroutinesで共有リソースを扱う</title><link>https://moriatsushi.com/blog/44/</link><guid isPermaLink="true">https://moriatsushi.com/blog/44/</guid><description>Kotlin CoroutinesをUIスレッド(Dispatchers.Main)のみで使っている場合、単一のリソースを複数Coroutinesで扱った場合でも問題が発生することはほとんどありません。\n一方で、バックグラウンドスレッドを含めた複数スレッド(Dispatchers.Default, Dispathcers.IO)で単一のリソースを共有した場合は、競合が発生し予期せぬ不具合を引き起こす可能性があります。\n今回はその危険性と解決方法について紹介します。</description><pubDate>Sun, 07 Nov 2021 06:00:00 GMT</pubDate></item><item><title>Kotlin Coroutinesでフォアグラウンドになるまで待つ【Android】</title><link>https://moriatsushi.com/blog/45/</link><guid isPermaLink="true">https://moriatsushi.com/blog/45/</guid><description>Androidアプリ開発において、Lifecycleを考慮することでユーザのリソースを有効的に利用することが出来ます。\nユーザのリソースを不要に消費しないようにするためには、必要になったときに必要な処理を行うことが重要です。\nバックグラウンド時や他画面を開いているときAPIを叩く必要性が出てきても、LifecycleがSTARTEDになるまで待つべきでしょう。\n今回は、Kotlin Coroutinesを用いて、LifecycleがSTARTED、すなわちフォアグラウンドになったときにAPI等を叩くような処理について考えてみます。</description><pubDate>Sun, 14 Nov 2021 06:00:00 GMT</pubDate></item><item><title>Jetpack Compose, React, Flutter, SwiftUIを比較する</title><link>https://moriatsushi.com/blog/38/</link><guid isPermaLink="true">https://moriatsushi.com/blog/38/</guid><description>宣言的UIの考え方はReact、Flutter、SwiftUI、Jetpack Composeと広がり、ほぼ全てのプラットフォームで利用できるようになりました。\n今までのHTMLやXMLに対して命令的に処理を書くのに対し、宣言的UIはUIの構築や更新を圧倒的に簡素にしてくれます。\nまた、差分更新の仕組みを備えているものも多く、パフォーマンスの向上も見込めます。\n今回はいくつかある宣言的UIのツール群の中から、代表的なJetpack Compose、React、Flutter、SwiftUIを個人的な見解も含めて比較していきます。</description><pubDate>Mon, 06 Sep 2021 06:00:00 GMT</pubDate></item><item><title>Jetpack Composeのコンポーネントはなぜ返り値がないのか</title><link>https://moriatsushi.com/blog/39/</link><guid isPermaLink="true">https://moriatsushi.com/blog/39/</guid><description>先週、「Jetpack Compose, React, Flutter, SwiftUIを比較する」という記事で宣言的UIの各ツールの比較を行いました。\nその中で、Jetpack Compose特有の特徴としてコンポーネントに返り値がないことを紹介しました。\nこれは、React等で遵守されてきたコンポーネントは純粋関数として扱うというルールから逸脱したものとなります。\nその理由について、Jetpack Composeの開発に携わるJim SprochさんからTwitterでリプライを頂きました。\n今回はその内容について1つずつ深堀りしていきます。\n</description><pubDate>Sun, 12 Sep 2021 06:00:00 GMT</pubDate></item><item><title>Kotlinのinline関数のパフォーマンスを調べる</title><link>https://moriatsushi.com/blog/47/</link><guid isPermaLink="true">https://moriatsushi.com/blog/47/</guid><description>この記事は Kotlin Advent Calendar 2021 の5日目の記事です。\nKotlinは関数をinline化することができます。\ninline化によるメリットはいくつかありますが、一つはパフォーマンスの向上でしょう。\n関数をパラメータとして受け取る関数については、メモリ割り当てが重複し、実行に多少のコストがかかります。\ninline化することで、コンパイル時に展開された形のコードが生成され、実行時のコストが削減されます。\n一方、コンパイル時に展開されることにより、出力される実行ファイルのサイズは増えると言われてるため、自分で作成した関数をinline関数化するかどうか悩むこともあるでしょう。\n今回は、inline化することによる、実行速度、メモリ使用量の変化と実行ファイルのサイズを確認してみます。</description><pubDate>Sun, 05 Dec 2021 06:00:00 GMT</pubDate></item><item><title>Jetpack ComposeとKotlin Coroutinesを連携させる</title><link>https://moriatsushi.com/blog/48/</link><guid isPermaLink="true">https://moriatsushi.com/blog/48/</guid><description>この記事は Android Advent Calendar 2021 の13日目の記事です。\nJetpack Composeは内部でもKotlin Coroutinesを多く使っており、非常に相性が良いです。\n今回はJetpack ComposeとKotlin Coroutinesを組み合わせて使ういくつかの方法について紹介します。</description><pubDate>Mon, 13 Dec 2021 00:00:00 GMT</pubDate></item><item><title>Jetpack ComposeのTextFieldで最大文字数を制御する</title><link>https://moriatsushi.com/blog/49/</link><guid isPermaLink="true">https://moriatsushi.com/blog/49/</guid><description>Jetpack Composeがstableになりしばらく経ちますが、利用しているとAndroid Viewにあった様々なものが、まだ用意されていないことに気が付きます。\nテキストを入力できる TextField は、まだ最大文字数(maxLength)を設定することができません。\n今回は最大文字数を設定するいくつかの方法について紹介を行います。</description><pubDate>Sun, 06 Feb 2022 00:00:00 GMT</pubDate></item><item><title>DNG Webサイトの裏側</title><link>https://moriatsushi.com/blog/2/</link><guid isPermaLink="true">https://moriatsushi.com/blog/2/</guid><description>この記事はDigital Nature Advent Calendar 2018の23日目の記事です。\n\nDigital Nature Groupは落合陽一准教授が率いる筑波大学の研究室です。\n当然ですが、研究成果やイベント情報などを、公式Webサイトで発信しています。\nこのwebサイトは2017年度まで、外部の企業に依頼して管理してもらっていましたが、契約終了に基づき2018年度から学生で管理することになりました。\n今回は、その移行の際に行ったことや注意した点を書いておこうと思います。\n</description><pubDate>Mon, 24 Dec 2018 12:30:00 GMT</pubDate></item><item><title>2018年 振り返り （プロダクト編）</title><link>https://moriatsushi.com/blog/5/</link><guid isPermaLink="true">https://moriatsushi.com/blog/5/</guid><description>2018年ももう残すこと僅かとなりましたので、1年間を振り返っていきたいと思います。\n今回は今年制作したプロダクト編です。</description><pubDate>Thu, 27 Dec 2018 10:00:00 GMT</pubDate></item><item><title>Jetpack ComposeのRippleエフェクトを深堀り、カスタマイズも</title><link>https://moriatsushi.com/blog/50/</link><guid isPermaLink="true">https://moriatsushi.com/blog/50/</guid><description>ユーザが何かをタップしたときにフィードバックを返すことは、正常に入力できたことをユーザに伝えるだけでなく、心地よい操作感やリッチ感を実現するためにも重要です。\nMaterialDesignでは、クリック時に波紋状のRippleエフェクトを表示します。\nJetpack ComposeでもMaterialThemeを利用している場合、クリック可能なコンポーネントはRippleエフェクトが表示されます。\n今回はJetpack ComposeでRippleエフェクトについて色々深堀りをしていき、Rippleの色を変えたり、そもそもタップ時のエフェクトを変更する方法についても紹介します。</description><pubDate>Sun, 13 Feb 2022 00:00:00 GMT</pubDate></item><item><title>Jetpack Composeで再利用可能なコンポーネントを実現するために</title><link>https://moriatsushi.com/blog/51/</link><guid isPermaLink="true">https://moriatsushi.com/blog/51/</guid><description>Jetpack Composeの大きな特徴として、再利用可能なコンポーネントを作りやすくなったことがあるでしょう。\n細かい単位でComposable関数に切り出すことで、同じUIを共通化できるだけでなく、今後の仕様追加/変更の際にもスムーズにコンポーネントを再利用できるでしょう。\n一方で、再利用可能なコンポーネントの実現にはいくつか注意すべき点があります。 今回は公式から述べられている注意事項や、自分が書いていて注意していることについて紹介します。</description><pubDate>Sun, 20 Feb 2022 00:00:00 GMT</pubDate></item><item><title>Layout Composableを使って複雑なレイアウトを組む【Jetpack Compose】</title><link>https://moriatsushi.com/blog/52/</link><guid isPermaLink="true">https://moriatsushi.com/blog/52/</guid><description>この記事はAndroid Advent Calendar 2022の4日目の記事です。\nJetpack Composeで複雑なレイアウトを組むのに、Box, Row, Columnだけでは表現できずに困ったときはありませんか？\nもしかしたらLayout Composableを使うことで実現できるかもしれません。\nLayout Composableはかなり自由度高くレイアウトを組める一方、複雑で敬遠しがちです。\n今回は例をもとにLayout Composableの使い方について紹介します。</description><pubDate>Sun, 04 Dec 2022 00:00:00 GMT</pubDate></item><item><title>ブログをNext.js(SSG)に移行しました</title><link>https://moriatsushi.com/blog/46/</link><guid isPermaLink="true">https://moriatsushi.com/blog/46/</guid><description>このブログはReactで1から作成しており、CSR (Client Side Rendering) として実行してました。\nこの度、Next.jsのSSG (Static Site Generation) を導入してみたので、その報告になります。</description><pubDate>Sun, 21 Nov 2021 06:00:00 GMT</pubDate></item><item><title>テスト用Dispatcherの使い分け【Kotlin Coroutines】</title><link>https://moriatsushi.com/blog/53/</link><guid isPermaLink="true">https://moriatsushi.com/blog/53/</guid><description>この記事はKotlin Advent Calendar 2022の18日目の記事です。\nKotlin Coroutinesを使ったコードのテストを書く場合、Dispatcherを差し替えることで仮想時間を使い、実際より短い時間でテストを実行したり、実行のタイミングを細かく制御することができます。\nテスト用のDispatcherとして、 StandardTestDispatcher と UnconfinedTestDispatcher の2つが用意されています。\n今回はこの2つの違いと使い分けについて紹介します。</description><pubDate>Sun, 18 Dec 2022 00:00:00 GMT</pubDate></item><item><title>Flow.combineの内部実装がすごい話</title><link>https://moriatsushi.com/blog/54/</link><guid isPermaLink="true">https://moriatsushi.com/blog/54/</guid><description>Kotlin CoroutinesのFlowを使っている場合、UI状態の統合等でFlow.combineを使うことが多いと思います。\nKotlin CoroutinesはOSSになっており、その実装を簡単に読むことができます。\nFlow.combineはどうやって実装されているのか気になり、読んでみると、思った以上に細かいところに気を配った丁寧な実装になっていて驚きました。\n今回はそのFlow.combineの実装を自分で再現するという流れで、公式のFlow.combineの工夫されている点や、複雑なFlowを自作する方法について学びたいと思います。</description><pubDate>Sun, 08 Oct 2023 06:00:00 GMT</pubDate></item><item><title>BaseActivityを解体しよう</title><link>https://moriatsushi.com/blog/6/</link><guid isPermaLink="true">https://moriatsushi.com/blog/6/</guid><description>お久しぶりです。\nこの1年ほどjava100%のandroidアプリをkotlin化していくというお仕事をしていました。\n\njavaとkotlinは非常に相性が良く、段階的な移行を大きな問題なく進めることが出来ました。\n一方で、一番苦労した点は肥大化したBaseActivityの移行です。\nBaseActivityは様々な要因から肥大化しがちです。\n今回は、実務で実際に行ったBaseAdtivityの整理方法についてまとめたいと思います。</description><pubDate>Sun, 15 Mar 2020 10:00:00 GMT</pubDate></item><item><title>kotlin coroutines flowでいいねボタン問題を解決しよう</title><link>https://moriatsushi.com/blog/7/</link><guid isPermaLink="true">https://moriatsushi.com/blog/7/</guid><description>複雑化するmobileアプリにおいて、アプリ内の状態をどう整合性を保って保持するかという議論は非常に重要です。\n\n特に、画面を跨いだときにどうデータを同期するかは難しく、少し間違えば結合度が高く、メンテナンス性が低いコードになりがちです。\n例えば、twitterのような一覧画面と詳細がある場合に、詳細画面で行った「いいね」を、どうツイート一覧画面に反映させるかという問題です。\nいわゆる「いいねボタン問題」と呼ばれているものです。\n最近では、OR MapperのRoomにて、内部の状態をLiveDataやFlowで出力することで、解消しているケースを多く見かける気がします\n一方、永続化する必要がない、一部のデータのみをやり取りしたい等の理由で、この手法を採用できないケースも多々あると思います。\n\n今回は、roomを使わず、kotlin coroutines flowをふんだん使って、柔軟に対応できる設計を紹介したいと思います。</description><pubDate>Sun, 22 Mar 2020 09:00:00 GMT</pubDate></item><item><title>リクルートのAndroid リファクタリングコンテストで審査員賞をもらいました</title><link>https://moriatsushi.com/blog/8/</link><guid isPermaLink="true">https://moriatsushi.com/blog/8/</guid><description>先日(2020/3/20)、リクルートのHOT PEPPER Beautyが主催するAndroidリファクタリングコンテストに参加してきました。\n出されたコードを3人1チームで半日ほどリファクタリングしていくコンテストで、ありがたいことに僕たちのチームは審査委員賞を頂きました。\n今回は、そこで行ったリファクタ、学んだこと等をまとめたいと思います。</description><pubDate>Sun, 29 Mar 2020 10:00:00 GMT</pubDate></item><item><title>新卒1年間でやった仕事をちゃんとまとめる</title><link>https://moriatsushi.com/blog/9/</link><guid isPermaLink="true">https://moriatsushi.com/blog/9/</guid><description>CyberAgentにエンジニアとして新卒入社して1年が経ちました。\n僕は今、 OPENREC.tvのAndroidアプリ開発を担当しています。\nこの1年、kotlinを導入したり、MVCからMVVMにリアーキテクチャしたり、デザインリニューアルをリリースしたりと、非常に忙しく動き回っていました。\nそして非常にありがたいことに、技術者による技術者のための社内表彰「CA BASE AWARD 2020」において、ベストルーキー賞を頂きました。\n一方で、僕が何をやっていたのか、多くの人はあまり知らないと思い、また今後自分が見返すためにも、この1年間やってきたことをまとめたいともいます。</description><pubDate>Sun, 05 Apr 2020 10:00:00 GMT</pubDate></item></channel></rss>