「プログラマー脳 ~優れたプログラマーになるための認知科学に基づくアプローチ」を読んで

プログラマー脳 ~優れたプログラマーになるための認知科学に基づくアプローチ」という書籍を読みました。

普段やっていることや考えていることに具体的な名前や研究結果があることを知ったり、自分の行動の中であまりよくなさそうな習慣を認識できたりと、とても学びが多かったです。
この記事では、この書籍で特に印象に残ったことおよびそこから感じたことをメモとして記録しておこうと思います。

余談ですが、原著のタイトルは「The Programmer's Brain: What every programmer needs to know about cognition」となっており、個人的には日本語のサブタイトルの方が要旨を捉えていると感じました。

続きを読む

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()
}

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()の処理内容を整理すると、以下のいずれかの条件を満たすときにモックオブジェクトが生成できないことが分かりました。

続きを読む

JUnit 5の@TestInstance(Lifecycle.PER_CLASS)を指定したクラスでのモックオブジェクトの生成とスタブメソッドの設定は別の場所で行う

JUnit 5 × Kotlinで@BeforeAll@AfterAllを使いたかったり、Parameterized Testで@MethodSource用のstatic相当なメソッドを宣言したかったりするときなどは、対象のクラスに@TestInstance(Lifecycle.PER_CLASS)を指定します。
このアノテーションを指定したクラスでのモックオブジェクトの初期化処理でハマったので、その内容を備忘録として残しておきます。

続きを読む

AndroidのActivityやFragmentで文字列と文字列リソースを一括して扱うためのsealed classの作成

Androidで文字列を扱う場合、以下の2パターンのいずれかであることが多いと思います。

  1. クライアント側で定義した文字列リソースを使用する
  2. サーバー側から受け取った文字列を使用する


これらをActivityやFragmentで一括して扱うために、以下のようなsealed classを用意すると便利でした。

続きを読む

TabLayout + ViewPager2でScroll To Topを実現する方法

本記事では、現在選択されているタブを再度タップしたときに、タブ内のリストを先頭までスクロール(以下、Scroll To Topと呼びます)させる方法について記載しています。
なお、本記事の最後にサンプルコードのリンクを記載しているので、実行環境の詳細についてはそちらをご参照いただけますと幸いです。

続きを読む

Swiftのextensionを利用してクラス名の衝突を解決する

iOSアプリのコードをいくつか見ていて、名前空間の扱いがKotlinとSwiftで異なり困惑する場面があったので、その解決方法に関する備忘録です。

  • 名前空間とは
  • Swiftではグループによるクラス名の識別はできない
  • Nested Typeによる解決
  • extensionの利用による解決
続きを読む

KotlinではComparableインタフェースを実装したクラスのオブジェクト同士を比較演算子で直接比較できる

タイトル通りの内容ですが、地味に初めて知ったので備忘録として。

  • Dateクラスを例として
  • 比較演算子はcompareTo()メソッドに変換される?
  • 比較演算子は「compareTo()メソッド + 期待される値の範囲」の組み合わせに変換される
続きを読む