2024年7月6日土曜日

Android テストコードの実装について解説

どうも。どっことです。今回は、テストコードの実装について解説したいと思います。

テストコード

テストコードは実機やエミュレータに開発段階のアプリをインストールせずとも、プログラムとしてテストを実行できるようにするものです。テストコードを実装せずとも、世の中に公開するアプリを開発することができるので、より難しい機能の実装や複雑なドメインロジックをプログラムに落とし込むなどのスキルを優先して獲得するというロードマップも考えとしてはあると思います。

ただ、昨今のCI/CDの重要性の高まりを鑑みると、テストコードを実装できることもエンジニアとして必要なスキルとして需要が上がってきているように見受けられます。そしてそんな需要が高まっている一方で、テストコードを実装できるエンジニアはまだまだ多くありません。ぜひテストコードを実装できるようになり、より広い知見をもつエンジニアへと一歩を進めましょう。

説明に入る前に(テストコードの種類)

Androidの開発においては、大きく2種類のテストコードがあります。

ユニットテスト

開発PC上で実行されるテストコードです。Androidの機能に依存しないビジネスロジックやアプリケーションロジックに対するテストコードを実装する際のものとなります。開発PC上で実行されるため、後述のインストルメントテストよりも高速に実行・実施ができます。

インストルメントテスト

実機やエミュレーター上で実行されるテストコードです。こちらは、Androidの機能に依存するUIまわりのテストや、外部機能などとの連携に対するテストコードとなります。より現実に近い環境でのテストとなるため、ユーザーストーリーを意識したテストに向いています。一方で、インストールなどのステップがビルド時に含まれるため、実行時間が比較的遅めになります。

今回は、ユニットテストの実装方法について解説します。

ユニットテストを実装する

ユニットテストの実装方法について、以下の流れで説明します。

  • ライブラリの準備
  • 実装
  • その他
    • Robolecticの紹介

ライブラリの準備

ユニットテストのテストコードを実装するためには以下をbuild.gradleに追加が必要です。プロジェクトを新規作成する際にAndroid Studioが自動で追加している場合がありますので、追加が必要か確認してください。

dependencies {
    testImplementation("junit:junit:4.13.2")
}

実装

それでは実装していきましょう。

テスト対象

テスト対象は以下のクラス・メソッドとします。

class Sample {
   fun test(input: Int?): Boolean {
       if (input == null) {
           throw IllegalArgumentException()
       }
       return input > 0
    }
}

テスト観点

テスト対象となるメソッドは、以下の観点でテストコードを実装することができます。

  • trueが返される確認テスト
  • falseが返される確認テスト
  • 例外が投げられるテスト

上をベースに確認するテストコードを追加していきましょう。

テストクラスを追加する

テストを実装するため、テストクラスを実装します。テスト対象のクラスで option + Enter からCreate Testを選択すればテストクラスを作成できます。SampleTestという名前にすると、testディレクトリに以下のようなクラスが作成できると思います。

class SampleTest {
}

trueが返される確認テストを実装する

まずはtrueが返されることのテストです。

@Test
fun testTrue() {
    val sample = Sample()
    val value = sample.test(1)
    Assert.assertEquals(value, true)
}

以降の実装も同様ですが、テストメソッドを実装し@Testアノテーションを付与します。

そして、実際にテストしたい内容を実装します。今回は、入力値に1以上を指定した場合はtrueが返却されるので、それを確認するためのテストを実装します。

falseが返される確認テストを実装する

次にfalseが返されることのテストです。

@Test
fun testFalse() {
    val sample = Sample()
    val value = sample.test(0)
    Assert.assertEquals(value, false)
}

同様に、falseが返却されるケースを実装します。入力値に0以下を指定した場合はfalseが返却されるので、それを確認するためのテストを実装します。

例外が投げられるテストを実装する

そして、例外が投げられることのテストです。

@Test(expected = IllegalArgumentException::class)
fun testException() {
    val sample = Sample()
    sample.test(null)
    Assert.fail()
}

例外が発生するテストは@Testアノテーションのパラメータexpectedを指定します。そのパラメータには発生する例外のクラスを指定します。

また、例外が発生しなかった場合がテストがNGとなるように、例外がthrowされる直後のタイミングでAssert.fail()を実装しておきます。

これにて、該当クラスメソッドのテストが実装できました。あとはテストを実行すれば期待した結果になるかを確認する処理が実行されます。

その他

ここまでテストコードの実装について解説しましたが、実は1点問題があります。ユニットテストは開発PC上で実行されますが、その都合により、AndroidSDKに含まれる機能を利用することができません。これが結構ネックになり、例えばよくある実装の一つであるFragmentのインスタンス生成メソッドは、Fragmentやそれに渡すBundleがAndroidSDKに含まれるものなので、テストコードを実装することができません。

ではどうするかというと、一つはインストルメントテストで実装することです。実機やエミュレーター上でテストすることで、テストコードを実行することができます。

もう一つはRobolectricを利用することです。RobolectricはユニットテストでもAndroidSDKに含まれる機能を利用することができます。

Robolectricの紹介

今回は説明を省略しますが、公式サイトを紹介します。またRobolectricの利用方法についても、後日解説を予定しています。

まとめ

今回はテストコード、特にユニットテストの実装方法について解説しました。テストコードやその実装の重要性は今後も高いものと予想されるので、今後もこれをテーマとした投稿をしていこうと考えていますので、よろしくお願いします。

参考

2024年6月22日土曜日

Android 通知領域に通知を表示する方法を解説

どうも。どっことです。今回は、通知を実際に表示する実装方法を解説します。

通知領域に通知を表示する

通知チャンネルも実装できて、いよいよ通知を表示する方法まで来ました。さっそく実装方法を解説していきます。

通知を表示する実装の流れ

  • AndroidManifest.xmlにパーミッションの追加
  • 通知の表示の許諾確認
    • 拒否された時はさらに確認
  • 通知の表示処理

AndroidManifest.xmlにパーミッションの追加

まずはAndroidManifest.xmlに今回の通知表示に必要となるpermission.POST_NOTIFICATIONSの権限を追加します。このpermission.POST_NOTIFICATIONSが実装時に忘れやすいので、実装時にはぜひ備忘録としてご確認いただけると嬉しいです。

<uses-permission android:name="android.permission.POST_NOTIFICATIONS" />

通知の表示の権限許諾確認

権限許諾ですが、実装方法は通常のパーミッションチェックと同様です。つまりregisterForActivityResultを使ってlauncherを生成し、Manifest.permission.POST_NOTIFICATIONSの許諾確認をします。このManifest.permission.POST_NOTIFICATIONSも実装時に忘れやすいので、ぜひ参考にしてください。

private val launcher = registerForActivityResult(
  ActivityResultContracts.RequestPermission()
) { 
  /** 許諾ダイアログが閉じられた。何かやりたいことがあればここに実装。*/ 
}

...

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {
    TODO("あとで追加実装")
    launcher.launch(Manifest.permission.POST_NOTIFICATIONS)
}

拒否された時の再許諾確認

権限を確認したにもかかわらず拒否されてしまった場合ですが、一般的には次回などで「この権限がXXXという理由で必要なんだ」という権限を必要としている理由を説明した上で再度権限を確認する流れとなります。前項のTODO("あとで追加実装")に追記していきます。

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {
    if (checkSelfPermission(Manifest.permission.POST_NOTIFICATIONS) == PackageManager.PERMISSION_GRANTED) {
        // 権限を許諾してもらっている。後続処理に流さないでOK
        return
    }
    val shouldShow = shouldShowRequestPermissionRationale(
        Manifest.permission.POST_NOTIFICATIONS
    )
    if (shouldShow) {
        // 過去に許諾確認したけど、許可してくれなかった人。
        // ダイアログなどで権限を必要としている理由を説明した上で再度依頼する。
    } else {
        // それ以外。初回のケース、または「もう表示しない」設定としたケース。
        launcher.launch(Manifest.permission.POST_NOTIFICATIONS)
    }
}

通知の表示処理

そしてManifest.permission.POST_NOTIFICATIONSの許諾を確認をした上で、問題なければNotificationを表示するようNotificationManagerに依頼します

if (checkSelfPermission(Manifest.permission.POST_NOTIFICATIONS) == PackageManager.PERMISSION_GRANTED) {
    val notification = Notification.Builder(this, "id")
        .setContentTitle("this is title")
        .setSmallIcon(R.mipmap.ic_launcher)
        .setContentText("this is text")
        .build()
    NotificationManagerCompat.from(this)
        .notify(null, 0, notification)
}

実際にうまく動作していれば、上記の場合以下のような通知が通知領域に表示されます。

まとめ

今回は通知領域に通知を表示する方法を解説しました。実装はそんなに複雑ではないものの、参照すべき定数を毎回忘れてしまいがちなので、ぜひ参考にしていただけると嬉しいです。

2024年6月17日月曜日

Android 通知チャンネルを作成する方法を解説

どうも。どっことです。今回は通知チャンネルを作成するための実装方法について解説します。

通知チャンネルを作成する方法

Android 8(Oreo)から 通知領域に通知を表示するためには、その通知に対応する通知チャンネルをあらかじめ作成しておかなければならなくなりました。

以前の記事で「作成した通知チャンネルの設定画面に遷移する」実装方法を解説しましたが、そもそも通知チャンネルの追加方法を解説していなかったので、今回はこちらをテーマに解説していこうと思います。

通知チャンネルの作成

通知チャンネルは以下の手順で作成します。

  1. NotificationManagerのインスタンスを取得
  2. 通知チャンネルインスタンスを生成
  3. NotificationManagerに通知チャンネルの作成を依頼

順番に解説していきます。

NotificationManagerのインスタンスを取得

まずはNotificationManagerのインスタンスを取得します。androidxではNotifcationManagerCompatというクラスが提供されており、今まではAndroidのバージョンがO未満かどうかで制御をする必要がありましたが、このクラスが提供されたことによりAndroidのバージョンを気にせず制御することができるようになりました。

呼び出し方も単純で、以下でOKです。

val manager = NotificationManagerCompat.from(this)

通知チャンネルインスタンスを生成

次に実際に作成する通知チャンネルのインスタンスを生成します。最小の構成では、ID、Importanceとタイトルさえあれば作成できるはずです。

val channel = NotificationChannelCompat.Builder("id", NotificationManagerCompat.IMPORTANCE_DEFAULT)
    .setName("ChannelName")
    .setDescription("ChannelDescription")
    .build()

実装するとき一番よく忘れるのが、Importanceです。定数はNotificationManagerCompatで定義されていますので、そちらを参照してください。以下が定義されています。

  • NotificationManagerCompat.IMPORTANCE_MAX
  • NotificationManagerCompat.IMPORTANCE_HIGH
  • NotificationManagerCompat.IMPORTANCE_DEFAULT
  • NotificationManagerCompat.IMPORTANCE_LOW
  • NotificationManagerCompat.IMPORTANCE_MIN
  • NotificationManagerCompat.IMPORTANCE_NONE
  • NotificationManagerCompat.IMPORTANCE_UNSPECIFIED

NotificationManagerに通知チャンネルの作成を依頼

最後に生成した通知チャンネルのインスタンスをNotificationManager#createNotificationChannel()で渡して、通知チャンネルの作成を依頼します。

manager.createNotificationChannel(channel)

まとめ

今回は通知チャンネルの作成手順を解説しました。Androidの通知に関する処理は、最新のバージョンになるに連れて必要な実装が増えていくのが辛いところですが、素敵なアプリには必要不可欠な要素の一つだと思いますので、是非ともマスターしたいところですね。

おまけ:通知チャンネルの削除を依頼する

作るのと同じで、NotificationManager#deleteNotificationChannel(id)を呼ぶことで、通知チャンネルの削除依頼することができます。

manager.deleteNotificationChannel(channel)

参考

2024年6月12日水曜日

Mac SourceTreeで間違えたパスワードを記憶してしまったときの解消方法を解説

どうも。どっことです。今回はMacを使っていると時々やってしまう間違えたパスワードの解消方法について解説します。

パスワードを間違えて入力してしまった!そんなとき

最近はPCがID/パスワードをいい感じに記憶してくれるので、とても便利になりました。ただ、そんなPCが間違えたID/パスワードを記憶してしまうと、それを使ってログインやアクセスを自動で試みて、結局失敗してエラーが出て終了。「何かよくわからないけど勝手にアクセスして、勝手に失敗して、エラー吐いて、終わった。だったら最初から聞いてくれ...」状態になります。

エンジニアの方で特によくあるのはSourceTreeだと思います。SourceTreeGithubなどで管理しているGitリポジトリにアクセスするためのクライアントソフトですが、悲しいことに一度パスワードを記憶するとSourceTree側からパスワードを再入力する導線が表示されなくなります。そのためパスワードを間違えて記憶してしまうと「パスワード間違えたのはわかっているから解消させてくれ...」ということになります。ということで今回は、SourceTreeを例とした上記問題の解消方法について解説していきたいと思います。

解消手順

手順は以下の通りです。

  1. キーチェーンアクセスを表示する。
  2. SourceTreeで認証情報を検索する。
  3. 表示された認証情報を削除する。
  4. SourceTreeで再度認証情報を入力する。

順番に解説します。

キーチェーンアクセスを表示する

キーチェーンアクセスを起動します。 Command + Spaceでspotlight検索を表示し、キーチェーンアクセスを表示します。

SourceTreeで認証情報を検索する

キーチェーンアクセスではそのマシンの認証情報をすべて管理しています。検索窓にSourceTreeを入力し、該当の認証情報を探しましょう。

表示された認証情報を削除する

認証情報が見つかったら、右クリックして認証情報を削除しましょう。

SourceTreeで再度認証情報を入力する

ここまでの手順により、マシンからSourceTreeで入力された認証情報が削除されるので、再度SourceTreeから認証情報を入力すれば、正しい認証情報を記憶させることができます。

まとめ

今回はSourceTreeをはじめとした誤った認証情報の解消方法について解説しました。ID/パスワードだけでなく、例えばアクセストークンといった認証情報などもキーチェーンアクセスで管理されているので、今回の内容を参考に解消していただければ嬉しいです。

参考

2024年6月11日火曜日

Android ディスプレイがスリープされるのを無効にする方法を解説

どうも。どっことです。今回は、ディスプレイスリープを無効にする実装方法を解説します。

ディスプレイスリープを無効に設定する

動画の再生中やドキュメントの表示中、タイマー表示中などの画面を常に表示しておきたいケースでディスプレイがスリープしてしまうのは避けたいと思います。アプリ側でディスプレイがスリープしてしまうことを無効にする設定があるので、今回はこちらを解説したいと思います。ただし、スリープを無効にすることは電力消費の観点から必要最低限の範囲で設定することを心がけましょう。

スリープを無効に設定する

スリープを無効にするためにはActivityから参照できるwindowインスタンスに対して、FLAG_KEEP_SCREEN_ONのフラグを設定します。

window.addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON)

スリープ無効設定をクリアする

スリープ無効設定をクリアするためには、windowインスタンスに対して、FLAG_KEEP_SCREEN_ONのフラグをクリアしてあげます。

window.clearFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON)

まとめ

今回はディスプレイがスリープされる設定を無効にする実装方法を解説しました。使い所が限られる機能ですが、動画再生などディスプレイをスリープさせたくないような利用方法をアプリに提供する場合、必要な実装になりますので参考にしていただけると幸いです。

参考

2024年6月8日土曜日

Excel(Windows10) Excelではショートカットを設定できる!

どうも。どっことです。今回は、Excelでショートカットキーの設定方法を紹介します。

Excelにショートカットキーを設定する

業務・プライベートに限らず何かとお世話になるExcelですが、なんと自分の好きなコマンドにショートカットを設定することができます。いろいろ機能があるExcelですが、ショートカットでさらに作業の効率化を図ることができるので、ぜひ設定しておきましょう。

設定手順

手順は以下の通りです。

  1. エクセルのオプションを表示する。
  2. クイックアクセスツールバーを選択する。
  3. コマンドの選択から、自分が追加したいコマンドを選択し追加ボタンをクリックします。
  4. 設定がすべてできたら、完了ボタンをクリックします。

設定完了後のショートカットキー

上記で設定が完了します。これにより、クイックアクセスツールバーに追加したコマンドが表示されているかと思いますが、これの左からの位置Altがショートカットキーに対応しています。例えば、一番左の位置にあれば1+Altで対応するコマンドを実行できる。という具合です。

参考

2024年5月7日火曜日

Android Retrofitを使った情報取得する実装を解説

どうも。どっことです。今回は、Retrofitを使った情報取得する実装について解説します。

Retrofitを使った通信処理の実装

他の言語ではいくつか紹介していましたが、そもそもAndroidを紹介していないことに気づきました。そんなわけで今回は、Androidのデファクトスタンダードの一つとなっているRetrofitというライブラリを使った通信処理の実装を解説します。

実装手順

以下の手順で実装していきます。

  • build.gradleにライブラリを追加
  • AndroidManifest.xmに通信するパーミッションを追加
  • Retrofitによる通信処理の実装1
  • 通信するためのIFと、レスポンスデータクラスを追加
  • Retrofitによる通信処理の実装2

順に解説していきます。

build.gradleにライブラリを追加

まずはbuild.gradledependenciesに以下を追加します。

dependencies {
    // moshiライブラリ。Jsonをデータオブジェクトに変換してくれる。
    implementation("com.squareup.moshi:moshi-kotlin:1.15.1")
    // retrofitライブラリ。通信処理してくれるライブラリ。
    implementation("com.squareup.retrofit2:retrofit:2.11.0")
    // moshi-converter。 retrofit で moshi をいい感じに使ってくれるためのもの。
    implementation("com.squareup.retrofit2:converter-moshi:2.11.0")
}

AndroidManifest.xmに通信するパーミッションを追加

アプリ上で外部通信する場合、AndroidManifest.xmlにパーミッションの宣言が必要です。

以下を追加します。

<uses-permission android:name="android.permission.INTERNET" />

Retrofitによる通信処理の実装1

今回利用するAPIとして、サンプルAPIを公開している以下を利用させていただきました。

まずは実際に通信処理をするインスタンスを作るため、Retrofitのインスタンスを生成しましょう。

val retrofit = Retrofit.Builder()
  .baseUrl("https://api.sampleapis.com")
  .addConverterFactory(
      MoshiConverterFactory.create(
          Moshi.Builder()
              .add(KotlinJsonAdapterFactory())
              .build()
      )
  .build()
  • baseUrlは接続先URLのドメインを指定します。パスは後述するインターフェース側に記載します。
  • addConverterFactoryは、通信結果により取得したJsonを解析させるためのライブラリを指定します。今回はMoshiライブラリを指定しています。

用意したretrofitオブジェクトは後ほど利用します。

通信するためのIFと、レスポンスデータクラスを追加

通信するためのインターフェースと、レスポンスデータクラスを追加します。

インターフェースはメソッド(@GET)やretrofitオブジェクトのドメインからのパス(/coffee/hot)を指定し、レスポンスとしてどのようなデータを返却してもらうかを定義します。

interface ApiInterface {
  @GET("/coffee/hot")
  fun hotCoffee(): Call<List<Coffee>>
}

またレスポンスデータとしてCoffeeクラスのリストを定義します。今回は簡単のため、titleだけを解析対象としてデータ定義します。

data class Coffee(val title: String)

他のデータも取得したい場合は、対応するものをメンバ変数に定義すれば解析してくれます。

Retrofitによる通信処理の実装2

先ほど追加したインターフェースを渡して、実際に通信処理してくれるインスタンスを生成しましょう。

val api = retrofit.create(ApiInterface::class.java)

あとは、生成したインスタンスで通信処理を依頼します。enqueue()メソッドで通信処理を非同期に依頼します。

api.hotCoffee().enqueue(object : Callback<List<Coffee>> {
    override fun onResponse(p0: Call<List<Coffee>>, response: Response<List<Coffee>>) {
        Log.d("RetrofitActivity", "response.isSuccessful:${response.isSuccessful}")
        Log.d("RetrofitActivity", "response.code:${response.code()}")
        Log.d("RetrofitActivity", "response.message:${response.message()}")
        Log.d("RetrofitActivity", "response.raw:${response.raw()}")
        Log.d("RetrofitActivity", "response.body:${response.body()}")
    }
    override fun onFailure(p0: Call<List<Coffee>>, error: Throwable) {
      // エラーハンドリング
      Log.w("RetrofitActivity", "onFailure", error)
    }
})

なお同じ通信処理の依頼でexecute()というメソッドがありますが、こちらは同期的に通信処理を依頼します。Androidではメインスレッドで通信処理を実施するとクラッシュしてしまうので、利用するタイミングの検討が必要となります。

まとめ

今回は、Retrofitを使った情報取得する実装について解説しました。通信処理による情報取得・送信はモバイルアプリでは必須な機能となるので、ぜひ参考にしてくださいね。

参考

2024年5月5日日曜日

Android mockito-kotlinを使ったテストコードの書き方を紹介

どうも。どっことです。今回は、mockito-kotlinライブラリを使ったKotlinでの単体テストの書き方を紹介します。

mockito-kotlinを使ったモック化

CI/CDの重要性が注目されて久しいですが、単体テストをはじめとしたテストコードを実装できるエンジニアはまだまだ多くありません。またテストコードは実装経験あるけど、いざ実装しようとした時に「あれってどうやるんだっけ」となるような、テストコードの実装がまだ手に馴染んでいない人も多いかと思います。

今回は単体テストのテストコードを実装する上で必須のテクニックとなるモック化について紹介したいと思います。

モック化とは

他の機能の影響によりテストが不安定な状態となることを防ぐため、あらかじめ固定の値を返したり、特定の振る舞いをさせるように指定しておくことです。

実装方法

以下の順に解説していきます。

  • 使用するライブラリ(mockito-kotlinライブラリの紹介)
  • 導入方法
    • 実装方法

    使用するライブラリ

    オブジェクトをモック化するにあたり、JavaやKotlinではさまざまなモック化ライブラリが公開されています。今回はその中のひとつであるmockito-kotlinを使った導入・実装方法を解説していきます。

    mockito-kotlin

    もともとJavaのモックフレームワークとして利用されているMockitoライブラリを、Kotlinでも簡単に利用できるような機能を具備しているライブラリがmockito-kotlinです。公式ページを参考欄に載せておくので、詳しい情報をお探しの方はそちらを参照してください。

    導入方法

    いつものごとく、build.gradleのdependenciesに追記します。以下を追加してください。

    dependencies {
      testImplementation "org.mockito.kotlin:mockito-kotlin:5.3.1"
    }

    実装方法

    それでは、モック化する実装方法について解説します。

    モック化の実装①戻り値の固定化

    戻り値を固定化する実装は以下です。 mockでモックするクラス、onでモックするメソッドを指定します。そしてdoReturnで戻り値を指定します。

    val mock = mock<Sample> {
        on { sample() } doReturn "sample"
    }

    モック化の実装②例外

    メソッドが呼ばれた時に特定の例外を投げるようなモックの実装は以下です。doThrowで例外を指定します。

    val mock = mock<Sample> {
        on { sample() } doThrow IllegalStateException()
    }

    モック化の実装③振る舞いの指定

    メソッドが呼ばれた時に特定の振る舞いをさせるモックの実装は以下です。doAnswerで具体的な振る舞いを指定します。

    val mock = mock<Sample> {
        on { sample() } doAnswer {
            // do anything.
        }
    }

    まとめ

    今回は、テストコードを実装する上で必要不可欠なテクニックであるモック化をmockito-kotlinライブラリを使って実装する方法について解説しました。他の機能に依存しない疎結合なテストコードを実装するためにモック化は重要なテクニックとなるので、手に馴染むまで何度も実装しましょう。

    参考

    2024年2月1日木曜日

    GitHub draft pull requestを作成する方法を解説

    どうも。どっことです。今回はGitHubにおける draft Pull Requestの手順を記載します。

    GitHubでdraft Pull requestを作成する

    GitHubではPull Request(以下、PR)を作成するとき、ステータスをdraftとして作成することができます。これにより、
    「とりあえずこんな感じで進めてます!見てほしいです!」

    「こんな感じに実装していますがうまく動きません!何かわかりますか?」
    など、チーム内での方向性の補正や問題の共有に利用することができます。

    draft PRの作成方法

    draft PRの作成手順は通常のPRを作成する手順とほぼ同じです。

    1. Pull Requests タブから マージ元/マージ先ブランチを選択し、Create PRをクリックします。
    2. PR作成に必要な項目を入力します。
      • ここまでは通常のPRの作成手順と同じだと思います。
    3. Create pull request▽をクリックしドロップダウンを表示します。その中からCreate a draft pull requestをクリックすることでdraft PRを作成することができます。

    作成後も、draftと通常(read for review)のステータスを切り替えることができます。

    • マージボックスにあるReady for Reviewをクリックすると、レビュー準備完了のステータスにすることができます。
    • Reviewers欄にあるConvert to draftをクリックすると、逆にそのPRのステータスをdraftにすることができます。

    まとめ

    今回はdraft PRの作成方法について解説しました。昨今、Githubをはじめとするソースコードホスティングの利用はエンジニアには必須のスキルとなりました。そのようなサービスの機能を十分に利用することで、開発を効率よく進めていきたいですね。

    参考

    2023年12月22日金曜日

    Mac ホットコーナーをカスタマイズする方法を解説

    どうも。どっことです。今回は、Macのホットコーナーのカスタマイズについて解説します。

    Macのホットコーナーをカスタマイズする

    Macを使っていると右下にカーソルを当てるとクイックメモが表示されますが、ショートカットやアイコンなどの位置によっては、煩わしさを感じる人も多いと思います。私もそのうちのひとりでした。どうにか表示されないようにできないかなと調べたので、紹介します。

    設定方法

    手順は簡単で、Macの設定から以下を設定してあげれば解決します。

    • システム設定 > デスクトップとDock > ホットコーナー > 右下を - に設定

    調べたら、MissionControlも設定することができました。

    • ホットコーナー > 右上を MissionControl に設定

    参考

    移行予定

    どうも。どっことです。 タイトルの通りですが、諸事情により GitHubPage に移行予定です。 https://mkt120.github.io/ この備忘録に記載の内容を転記しつつ、今後はこちらのページを更新していく予定です。