Type SafeなAPIを利用したNavigation ComposeでのDeepLinkの実装
以下の記事を読まれた方は多いかと思いますが、Navigation 2.8.0-alpha08からNavigation Composeで型安全なAPIが利用可能になっています。stable版が待ち遠しいですね。
上記の記事の最後の方で、DeepLinkについて少しだけ触れられています。しかしながら、実装方法に関する具体的な情報が見つけられなかったので、ライブラリのコードを読みながらどのように実装するのか調べてみました。
調査時のライブラリのバージョンはNavigation 2.8.0-beta05です。
続きを読むBesides support for all of the Kotlin DSL builders we support (...), it also includes other APIs you might find interesting like the
navDeepLinkAPI that takes aSerializableclass and a prefix that allows you to easily connect external links to the same type safe APIs.
「プログラマー脳 ~優れたプログラマーになるための認知科学に基づくアプローチ」を読んで
「プログラマー脳 ~優れたプログラマーになるための認知科学に基づくアプローチ」という書籍を読みました。
普段やっていることや考えていることに具体的な名前や研究結果があることを知ったり、自分の行動の中であまりよくなさそうな習慣を認識できたりと、とても学びが多かったです。
この記事では、この書籍で特に印象に残ったことおよびそこから感じたことをメモとして記録しておこうと思います。
余談ですが、原著のタイトルは「The Programmer's Brain: What every programmer needs to know about cognition」となっており、個人的には日本語のサブタイトルの方が要旨を捉えていると感じました。
2023年をざっくりと振り返る
本記事は、「mhidakaが2つ目を建立した Advent Calendar 2023」の24日目の記事です。
木曜の深夜あたりから体調を崩してしまい絶賛療養中なのですが、この企画を思い出してしまったので笑、ボーッとしながら書いています🤒この記事が公開される頃には全快し、クリスマス・イブを楽しめていることを願っています…🎄
あまり頭も回っていないので、この記事では私自身の2023年の出来事を淡々と綴っていこうと思います。
Navigation ComponentでNested Navigation Graphのrouteを指定してpopBackStackしたときの挙動
TL;DR
Navigation ComponentでNested Navigation Graphのrouteを指定してpopBackStackしたときは、inclusiveの値がtrue/falseいずれの場合もNested Navigation Graphから抜けることができる。
10進数からn進数への基数変換を行う筆算の数学的な理解
本記事では、基本情報技術者試験などでおなじみの「10進数からn進数への基数変換」の筆算に関して、あの計算で基数変換が行える理由を数式を用いて整理してみました。
なお、基数変換そのものや具体的な筆算の方法については、以下の記事などをご参照ください。
medium-company.com
Kotlinでビット操作
Kotlinでビット操作を行うときのメモ。
よく使うビット操作をユーティリティメソッドとして以下にまとめました。
object BitwiseOperation { // numのiビット目の値(0もしくは1)を取得する fun getBit(num: Int, i: Int): Int = (num and createMask(i, i)).countOneBits() // numのiビット目に1をセットした整数を取得する fun setBit(num: Int, i: Int): Int = num or createMask(i, i) // numのiビット目を0にクリアした整数を取得する fun clearBit(num: Int, i: Int): Int = num and createMask(i, i, false) // numのiビット目を0もしくは1に変更した整数を取得する fun updateBit(num: Int, i: Int, shouldSet: Boolean): Int = if (shouldSet) setBit(num, i) else clearBit(num, i) // from〜toビット目が1(もしくは0)で、それ以外が0(もしくは1)となる整数を取得する fun createMask(from: Int, to: Int, shouldSet: Boolean = true): Int { require(from in 0 until Int.SIZE_BITS) { "from must be in the range of int bit size." } require(to in 0 until Int.SIZE_BITS) { "to must be in the range of int bit size." } require(from <= to) { "Incorrect indices combination. from: $from, to: $to" } val mask = (allOneBits shl (to + 1)).inv() and (allOneBits shl from) return if (shouldSet) mask else mask.inv() } // 全てのビットが1となる整数を取得する fun getAllOneBits(): Int = allOneBits private const val allOneBits: Int = 0.inv() }
英文法を英語で理解するために覚えておいた方がよさそうな英単語
最近オンライン英会話に取り組んでいるのですが、英語で英語を学んでいると「日本語では理解できるものでも、英単語を1つでも知らないと文全体の意味が全く分からない」ことがしばしばありました。
特に、英文法について説明されるときに使われる英単語を知らないことで、何を指摘されているかが理解できないことが多かったので、本記事では英文法を英語で理解するために覚えておいた方がよさそうな英単語をまとめました。
なお、本記事は私自身の学習の進行に応じて随時更新する予定です。
- 言葉の単位
- 文の要素
- 品詞
- 文の種類
- 時制
- 能動態と受動態
- 比較表現
- 類義語と対義語
- 発音
MockKでモックオブジェクトが生成できない条件
MockKでString型のモックオブジェクトを生成しようとしたところ、以下のエラーが発生しました。
io.mockk.MockKException: Can't instantiate proxy for class kotlin.String
String型のモックオブジェクトが生成できないことを知らなかったので、スタックトレースを辿ったところ、
io.mockk.proxy.MockKAgentException: Failed to create proxy for class java.lang.String. class java.lang.String is one of excluded classes at io.mockk.proxy.jvm.ProxyMaker.throwIfNotPossibleToProxy
とあり、String型のモックオブジェクトを生成する過程で、ProxyMaker#throwIfNotPossibleToProxy()内でMockKAgentExceptionがthrowされていました。
ProxyMaker#throwIfNotPossibleToProxy()の処理内容を整理すると、以下のいずれかの条件を満たすときにモックオブジェクトが生成できないことが分かりました。

