最近始めたことたち

2022年に入ってから一度もブログを書いていないことに気付いたので、近況報告も兼ねて最近始めたことについて書いてみようと思います。
「基礎って大事だなー」と感じることが最近は多かったので、自分に欠けていると感じていることを基礎からやっていこうと思い、主に以下のことに取り組み始めました。

続きを読む

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でモックオブジェクトが生成できない条件

Unit Testでダミーを用意するために、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)を指定します。
このアノテーションを指定したクラスでのモックオブジェクトの初期化処理でハマったので、その内容を備忘録として残しておきます。

続きを読む

Figmaで「方向キーによる選択オブジェクトの移動距離」を変更する方法

Figmaでデザインを行うとき、選択したオブジェクトの位置を方向キーによって微調整することがよくあると思います。

このとき、デフォルトでは

  1. 方向キー: 指定した方向に1pt移動
  2. Shiftキー+方向キー: 指定した方向に10pt移動

という動作をしますが、昨今のデザインでは8ptを基準としたグリッドシステムを採用することが多いため、本記事ではShiftキー+方向キーを押したときの移動距離を8ptに変更する方法を紹介します。

続きを読む

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

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

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


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

続きを読む

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

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

続きを読む

IllustratorとPhotoshopでテキストエリアのサイズをテキストと独立した状態で可変にする方法

IllustratorPhotoshopでテキストを扱うとき、テキストエリアのサイズを変更するとテキストのアスペクト比も同時に変更されてしまい困る場面が多かったので、テキストエリアのサイズをテキストと独立した状態で可変にする方法について調べてみました。
Illustrator 2020 v24.3(macOS)とPhotoshop 2020 v21.2.4(macOS)で試しています。


  • Illustratorの場合
    • ポイント文字とエリア内文字
    • ポイント文字とエリア内文字の見分け方
    • エリア内文字を新規に追加する方法
    • 既存のポイント文字をエリア内文字に変更する方法
    • テキストエリアのサイズを変更する方法
  • Photoshopの場合
    • ポイントテキストと段落テキスト
    • ポイントテキストと段落テキストの見分け方
    • 段落テキストを新規に追加する方法
    • 既存のポイントテキストを段落テキストに変更する方法
    • テキストエリアのサイズを変更する方法
続きを読む