【マイナンバー】スマホ用電子証明書がややこしいネーミングで混乱する

データ削除の件も気になっていて、

使ってみようとして少し混乱したので。

👉 スマホのマイナカード機能を止める方法 デジタル庁が案内 端末の初期化ではデータは“消えない” - ITmedia NEWS hatena-bookmark

 

📱 スマホ用電子証明書の有効性確認を行う

以下のサイトを見ながら、まずは確認を行ってみようと。

👉 電子証明書の情報確認 / スマホ用電子証明書の有効性確認を行う | 使い方 hatena-bookmark

練習と思い、上の図を mermaid 記法シーケンス図で書いてみました。


👉 スマホ用電子証明書の有効性確認.md hatena-bookmark

 

📱 「電子証明書」の種類

ちょっと、言葉の意味が分からなくなりました。

以下、上記公式ページから抜粋した「電子証明書」たち。


- スマホ用電子証明書
- あなたの電子証明書
- 利用者証明用電子証明書
- 署名用電子証明書
- 発行元の電子証明書
- スマホ用署名用電子証明書
- スマホ用利用者証明用電子証明書
- あなたのスマホ用電子証明書

....。

直感的に分かりません。

うちのおかんが使えるわけねえだろバカが。

考えられるパターンをある程度書き出してみます。


電子証明書
署名用電子証明書
利用者証明用電子証明書
スマホ用電子証明書
スマホ用署名用電子証明書
スマホ用利用者証明用電子証明書
あなたの電子証明書
あなたの署名用電子証明書
あなたの利用者証明用電子証明書
あなたのスマホ用電子証明書
あなたのスマホ用署名用電子証明書
あなたのスマホ用利用者証明用電子証明書
発行元の電子証明書
発行元の署名用電子証明書
発行元の利用者証明用電子証明書
発行元のスマホ用電子証明書
発行元のスマホ用署名用電子証明書
発行元のスマホ用利用者証明用電子証明書
...

こんなにありました?

 

📱 「あなたの」「発行元の」?

私が混乱したのはこの画面。

「あなたのスマホ用電子証明書」か「発行元のスマホ用電子証明書」どちらのスマホ用電子証明書を

???

「あなたの」

「発行元の」

この2つの言葉が私をさらに混乱させています。

マイナンバーカードデータは、インターネットを利用して、データを照会してから処理を進めますので、「スマホアプリ」でいうところの


「あなたの」→「スマホアプリ内に保存している」

「発行元の」→「クラウド上に登録されている」

と解釈するとなんとなく理解することができました。

 

📱 まとめ

日本語を解読するための表を作っておきます。

そもそも、

「利用者証明」と「署名」と「電子証明書」。

このネーミングが混乱の元。

英語圏やプログラミングでは説明しづらくない?

直感的に使えるネーミングは大事。



【Kotlin】data class 同士を「+ (plus)」する

以下の data class


data class Token(
  val prompt: Int = 0, 
  val completion: Int = 0
)

が2つあったとして


val a = Token(1, 2)
val b = Token(10, 20)

これらを足す。

どう書きますか?


println(
  Token(
    a.prompt + b.prompt,
    a.completion + b.completion
  )
)
// Token(prompt=11, completion=22)


println(
  a.copy(
    prompt = a.prompt + b.prompt, 
    completion = a.completion + b.completion
  )
)
// Token(prompt=11, completion=22)

 

🔢 + (plus) 演算子をオーバーロードする

拡張関数で + (plus) 演算子 をオーバーロードします。


operator fun Token.plus(other: Token): Token {
  return Token(prompt + other.prompt, completion + other.completion)
}


println(
  a + b
)
// Token(prompt=11, completion=22)

こんなことできるんですね!

素晴らしい!

【Kotlin】data class を + (plus) する

👉 Operator overloading | Kotlin Documentation hatena-bookmark


Kotlin Serialization を使って JsonObject を作る方法

一番簡単に作る方法はどれなのか、と思いましたので。

サードパーティーは使わず、

すべて kotlinx.serialization で。

以下の JsonObject を作ります。


{
  "model": "gpt-3.5-turbo",
  "messages": [
    {
      "role": "user",
      "content": "Server-Sent Events とは"
    }
  ],
  "temperature": 0.7,
  "stream": false
}

 

👨‍🎨 文字列から作る

文字列内に JSON を記述しておいて変換します。


val str = """{
  |  "model": "gpt-3.5-turbo",
  |  "messages": [{"role":"user","content":"Server-Sent Events とは"}],
  |  "temperature": 0.7,
  |  "stream": false
  |}""".trimMargin()
val element = Json.parseToJsonElement(str)

println(element)
println(element.javaClass.simpleName)

// {"model":"gpt-3.5-turbo","messages":[{"role":"user","content":"Server-Sent Events とは"}],"temperature":0.7,"stream":false}
// JsonObject

 

👨‍🎨 データクラスから作る

データクラスを先に作っておきます。


@Serializable
data class ChatRequest(
  val model: String,
  val messages: List<Message>,
  val temperature: Double,
  val stream: Boolean
)

@Serializable
data class Message(
  val role: String,
  val content: String
)

値をセットして変換します。


val data = ChatRequest(
  model = "gpt-3.5-turbo",
  messages = listOf(Message(role = "user", content = "Server-Sent Events とは")),
  temperature = 0.7,
  stream = false
)
val element = Json.encodeToJsonElement(data)

println(element)
println(element.javaClass.simpleName)

// {"model":"gpt-3.5-turbo","messages":[{"role":"user","content":"Server-Sent Events とは"}],"temperature":0.7,"stream":false}
// JsonObject

 

👨‍🎨 Json エレメントビルダー で作る

ビルダー関数 buildJsonArray(), buildJsonObject() を使いながら DSL 形式で JSON の構造を定義していきます。


val element = buildJsonObject {
  put("model", "gpt-3.5-turbo")
  putJsonArray("messages") {
    addJsonObject {
      put("role", "user")
      put("content", "Server-Sent Events とは")
    }
  }
  put("temperature", 0.7)
  put("stream", false)
}

println(element)
println(element.javaClass.simpleName)

// {"model":"gpt-3.5-turbo","messages":[{"role":"user","content":"Server-Sent Events とは"}],"temperature":0.7,"stream":false}
// JsonObject

👉 json-element-builders kotlinx.serialization/json.md at master · Kotlin/kotlinx.serialization hatena-bookmark

 

👨‍🎨 まとめ

文字列から作成する方法が直接的で簡単に書けますね!

テストコードで見かけることも多いように思います。

👉 kotlinx.serialization/json.md at master · Kotlin/kotlinx.serialization · GitHub hatena-bookmark