SlideShare a Scribd company logo
(DDD)
Kotlin 1.5 で stable になった
value class を深掘りする
baseballyama / 山下 裕一朗
目次
1. (DDD文脈での) value object とは何か
2. (Kotlin文脈での) value object とは何か
3. 実際に使ってみてわかったこと / 注意点
第一章
(DDD文脈での) value object とは何か
(DDD文脈での) value object とは何か
「実践ドメイン駆動設計」によると、value object とは以下の特徴を満たしたオブジェクト
のことだとされています。
1 計測/定量化/説明 ドメイン内の何かを計測したり定量化したり説明したりする
2 不変性 状態を不変に保つことができる
3 概念的な統一体 関連する属性を不可欠な単位として組み合わせることで、概念的な統一体を形成する
4 交換可能性 計測値や説明が変わったときには、全体を完全に置き換えられる
5 等価性 値が等しいかどうかを、他と比較できる
6 副作用のない振る舞い 協力関係にあるその他の概念に「副作用のない振る舞い」を提供する
いや難しいな!
細かいことは各自で調べて頂くとして...
実例で理解する
弊社では、value object を以下のように活用しています。(一番簡単な例)
data class MailAddress(private val text: String) {
companion object {
private val PATTERN = "(メールアドレスの正規表現 )".toRegex()
}
init {
if (!text.matches(PATTERN)) throw Exception("「${text}」は不正な値です。")
}
}
// Exceptionがスローされる
MailAddress("foo")
// trueが出力される
println(MailAddress("foo@bar.com") == MailAddress("foo@bar.com"))
value object を使用するメリット (個人的に)
● インスタンス生成の時点で正当な値であることを保証できる
○ 例えば、弊社ではHTTPリクエストで受信したJSONをPOJOにマッピングする時点で、
不正な値が入っている場合に 400 を返却するようにしています。
● メソッドの引数の設定間違いをコンパイル時点で防げる
fun doSomething(userId: UserID, productId: ProductID) { /** do something */ }
doSomething(ProductID("def456"), UserID("abc123")) // コンパイルエラーで間違いに気づける
value object を使用するメリット (個人的に)
● 業務知識をバリューオブジェクトに凝縮できる
○ 良い例 (バリューオブジェクトを使用する例 )
data class RelativeURL(private val url: String) { // 初期化処理 (値の正当性の確認 ) は記載を省略
fun toAbsoluteURL(basePath: String): AbsoluteURL = AbsoluteURL(removeTrailingSlash(basePath) + "/" + url)
}
// ポイント1: 型レベルで値の妥当性が保証されている
// ポイント2: 相対パスに対して可能な操作が 1個のクラスに凝縮されており理解しやすい
val path = relativePath.toAbsolutePath("https://example.com")
// do something
○ 悪い例 (バリューオブジェクトを使用しない例 )
// ポイント1: 型レベルで値の妥当性が保証されないので冗長な検査が必要
if (!isRelativePath(path)) throw Exception("This is not relative path")
// ポイント2: 相対パスに対する操作がユーティリティクラスに切り出されており凝縮度が低い
// (凝縮度が低いことがなぜよくないことであると言われているかは各自ぐぐって頂ければと思います )
val path = URLUtils.toAbsolutePath("https://example.com", relativePath)
// do something
弊社では...
弊社では、APIのエンドポイントで受け取るプロパティを全てバリューオブジェクトにして
おり、もし、異常な値を含むリクエストだった場合は、その時点で400をレスポンスするよ
うにしています。
また、アプリケーション全体でバリューオブジェクトを使用しているので、冗長な値チェッ
ク (例えばメールアドレスが正統か) が存在しません。
value object は便利
第二章
(Kotlin文脈での) value object とは何か
コード例 (冒頭に出てきた data class を value class に移植)
@JvmInline // JVM バックエンドをターゲットにする場合のみ必要
value class MailAddress(private val text: String) {
companion object {
private val PATTERN = "(メールアドレスの正規表現 )".toRegex()
}
init {
if (!text.matches(PATTERN)) throw Exception("「${text}」は不正な値です。")
}
}
基本的には `data` を `value` に書き換えばOK (簡単!)
value class は Kotlin1.5 で stable になった新機能
機能概要
● 一言でいえば、data class のサブセット。以下の制約がある
○ 単一のプロパティしか持てない
○ mutableなプロパティを持てない ( var を使ったプロパティが宣言できない )
○ 参照の比較はできない ( === を使った比較ができない )
● value class に依存したメソッド名はメソッド名がマングリングされる
@JvmInline
value class UInt(val x: Int)
// コンパイル後、関数は compute-<hashcode>(int x) となる (<hashcode> は7桁の英数字になる)
fun compute(x: UInt) { }
参考: https://kotlinlang.org/docs/inline-classes.html / https://star-zero.medium.com/kotlin%E3%81%AEvalue-class-27e865696f35
value class は Kotlin1.5 で stable になった新機能
機能概要 (続き)
● コンパイル時にできる限りプリミティブ型としてバイトコードを生成するので data classより高速
○ 但し以下のような場合はプリミティブ型への最適化はされない
@JvmInline
value class Foo(val i: Int) : I
fun <T> asGeneric(x: T) {} // ジェネリクスとして引数を設定する場合
fun asInterface(i: I) {} // インターフェイスとして引数を設定する場合
fun asNullable(i: Foo?) {} // Nullableなプロパティとして引数を設定する場合
val f = Foo(42)
asGeneric(f)
asInterface(f)
asNullable(f)
参考: https://kotlinlang.org/docs/inline-classes.html / https://star-zero.medium.com/kotlin%E3%81%AEvalue-class-27e865696f35
value object を完全に理解した
第三章
実際に使ってみてわかったこと / 注意点
(注意点1) JSONシリアライズ
例えば、jackson を使用して以下の User クラスをシリアライズすると
プロパティ名がマングルされてしまいます。
// kotlin
value class UserID(val userId: String)
value class UserName(val userName: String)
data class User(val userId: UserID, val name: UserName)
// JSON
// 注意: プロパティ名がマングルされている
{
"userId-abc1234": "abc123",
"name-def5678": "foo"
}
(注意点1) JSONシリアライズ
解決策としては以下があります。
● 🟢 kotlinx.serialization を使用する
● 🟡 gson を使用する
○ 但し、gsonは現在メンテナンスモードなので、今後の積極的な開発はなさそう
?
● ❌ jackson-module-kotlin
○ デシリアライズがサポートされていないよう
? (GitHub issue)
● ❌ Moshi
○ 全くサポートされていないよう? (Github issue)
調査結果: https://github.com/baseballyama/kotlin-json-research
(注意点2) mockito が対応していない
value class を使用したオブジェクトをmockitoで使用できません。
value class UserID(val userId: String)
// モック
val someClass = Mockito.mock(SomeClass::class.java)
Mockito.doNothing().`when`(someClass.doSomething(isA(UserID::class.java)))
fun <T> isA(type: Class<T>): T {
Mockito.isA(type)
return null as T
}
// エラーメッセージ
Exception in thread "main" java.lang.NullPointerException: Cannot invoke "UserID.unbox-impl()"
because the return value of "isA(java.lang.Class)" is null
(注意点2) mockito が対応していない
解決策としては mockk を使用すれば良い (GitHub issue)
value class UserID(val userId: String)
// モック
val someClass = mockk<SomeClass>()
every {
someClass.doSomething(UserID(any()))
}
(注意点3) CGLIB を使用するライブラリが想定通りに動作しない1
例えばHibernateを使用してメソッドの自動生成機能を使用する場合、
userId-abcd123 というフィールドがUserEntity に存在しないためエラーになる。
// コンパイル前
fun findByUserId(userId: FlyleUserID): UserEntity?
// コンパイル後 / cglib による自動生成前 (イメージ)
// value class に依存しているメソッド名はマングルされることによって発生する
fun findByUserId-abcd123(userId: String): UserEntity?
補足: CGLIB とは
CGLIBとは、Javaコード生成ライブラリです。
クラスファイルを実行時に読み込んで編集することが可能です
(Javassistと同じジャンル)。 CGLIB
は、Hibernate、iBatisなどのDBアクセスツールや、
Spring、SeasorなどのAOPコンテナなどで利用されています。
(注意点3) CGLIB を使用するライブラリが想定通りに動作しない1
例えばHibernateを使用してメソッドの自動生成機能を使用する場合、
userId-abcd123 というフィールドがUserEntity に存在しないためエラーになる。
// コンパイル前
fun findByUserId(userId: FlyleUserID): UserEntity?
// コンパイル後 / cglib による自動生成前 (イメージ)
// value class に依存しているメソッド名はマングルされることによって発生する
fun findByUserId-abcd123(userId: String): UserEntity?
(注意点3) CGLIB を使用するライブラリが想定通りに動作しない1
解決策は、@JvmName アノテーションを使用する。
@JvmName を使用することでコンパイル後のメソッド名を指定できる。
// コンパイル前
@Suppress("INAPPLICABLE_JVM_NAME")
@JvmName("findByUserId")
fun findByUserId(userId: UserID): UserEntity?
// コンパイル後 / cglib による自動生成前 (イメージ)
fun findByUserId(userId: String): UserEntity?
(注意点3) CGLIB を使用するライブラリが想定通りに動作しない2
ジェネリクスなどプリミティブ型への最適化がされない使い方をしている場合、
想定通りに動作しない場合がある。
例えば、Hibernateの場合 UserID 型の処理方法を知らないのでエラーになる。
// コンパイル前
fun findByUserIds(userIds: List<UserID>): List<UserEntity>
// コンパイル後 / CGLIB による自動生成前 (イメージ)
// value class をジェネリクスで使用している場合、プリミティブ型への最適化がされない
fun findByUserId(userIds: List<UserID>): List<UserEntity>
これは僕の知る限りで、value class の使用を辞める以外の回避策がない。
まとめ
まとめ
● 🟢 cglib に依存したライブラリを使用していないのであれば簡単に性能向上を得られる
● 🟡 但し、ライブラリ選定に制約が発生する場合がある
● 🟡 また、アプリケーション開発において、 data class を わざわざvalue class に
置き換える必要があるほど性能チューニングが必要なケースがどれだけあるかは疑問
● ユーザー定義のプリミティブ型を使用する機能は、 JVMでも導入が検討されている。
(Project Valhalla)
Kotlin の value class はこれに先駆けた実装なので、どうしてもプリミティブ型への最適化ができない場合
があるのが現状。プリミティブ型への最適化がされない場合がある仕様を許容できない場合は、 Project
Valhalla が実装されるまで待つのが吉 ?

More Related Content

What's hot

データベース設計徹底指南
データベース設計徹底指南データベース設計徹底指南
データベース設計徹底指南
Mikiya Okuno
 
PostgreSQLアンチパターン
PostgreSQLアンチパターンPostgreSQLアンチパターン
PostgreSQLアンチパターン
Soudai Sone
 
JaSST Tokyo 2022 アジャイルソフトウェア開発への統計的品質管理の応用
JaSST Tokyo 2022 アジャイルソフトウェア開発への統計的品質管理の応用JaSST Tokyo 2022 アジャイルソフトウェア開発への統計的品質管理の応用
JaSST Tokyo 2022 アジャイルソフトウェア開発への統計的品質管理の応用
Akinori SAKATA
 
イミュータブルデータモデル(入門編)
イミュータブルデータモデル(入門編)イミュータブルデータモデル(入門編)
イミュータブルデータモデル(入門編)
Yoshitaka Kawashima
 
データドリフトの紹介
データドリフトの紹介データドリフトの紹介
データドリフトの紹介
Sho Tanaka
 
Python におけるドメイン駆動設計(戦術面)の勘どころ
Python におけるドメイン駆動設計(戦術面)の勘どころPython におけるドメイン駆動設計(戦術面)の勘どころ
Python におけるドメイン駆動設計(戦術面)の勘どころ
Junya Hayashi
 
数学カフェ 確率・統計・機械学習回 「速習 確率・統計」
数学カフェ 確率・統計・機械学習回 「速習 確率・統計」数学カフェ 確率・統計・機械学習回 「速習 確率・統計」
数学カフェ 確率・統計・機械学習回 「速習 確率・統計」
Ken'ichi Matsui
 
ブレインパッドにおける機械学習プロジェクトの進め方
ブレインパッドにおける機械学習プロジェクトの進め方ブレインパッドにおける機械学習プロジェクトの進め方
ブレインパッドにおける機械学習プロジェクトの進め方
BrainPad Inc.
 
Amebaにおけるレコメンデーションシステムの紹介
Amebaにおけるレコメンデーションシステムの紹介Amebaにおけるレコメンデーションシステムの紹介
Amebaにおけるレコメンデーションシステムの紹介
cyberagent
 
リクルートにおけるデータのインフラ化への取組
リクルートにおけるデータのインフラ化への取組リクルートにおけるデータのインフラ化への取組
リクルートにおけるデータのインフラ化への取組
Recruit Technologies
 
MLOps に基づく AI/ML 実運用最前線 ~画像、動画データにおける MLOps 事例のご紹介~(映像情報メディア学会2021年冬季大会企画セッショ...
MLOps に基づく AI/ML 実運用最前線 ~画像、動画データにおける MLOps 事例のご紹介~(映像情報メディア学会2021年冬季大会企画セッショ...MLOps に基づく AI/ML 実運用最前線 ~画像、動画データにおける MLOps 事例のご紹介~(映像情報メディア学会2021年冬季大会企画セッショ...
MLOps に基づく AI/ML 実運用最前線 ~画像、動画データにおける MLOps 事例のご紹介~(映像情報メディア学会2021年冬季大会企画セッショ...
NTT DATA Technology & Innovation
 
開発速度が速い #とは(LayerX社内資料)
開発速度が速い #とは(LayerX社内資料)開発速度が速い #とは(LayerX社内資料)
開発速度が速い #とは(LayerX社内資料)
mosa siru
 
SQLアンチパターン - 開発者を待ち受ける25の落とし穴 (拡大版)
SQLアンチパターン - 開発者を待ち受ける25の落とし穴 (拡大版)SQLアンチパターン - 開発者を待ち受ける25の落とし穴 (拡大版)
SQLアンチパターン - 開発者を待ち受ける25の落とし穴 (拡大版)
Takuto Wada
 
パターン認識第9章 学習ベクトル量子化
パターン認識第9章 学習ベクトル量子化パターン認識第9章 学習ベクトル量子化
パターン認識第9章 学習ベクトル量子化Miyoshi Yuya
 
機械学習 (AI/ML) 勉強会 #1 基本編
機械学習 (AI/ML) 勉強会 #1 基本編機械学習 (AI/ML) 勉強会 #1 基本編
機械学習 (AI/ML) 勉強会 #1 基本編
Fujio Kojima
 
Data platformdesign
Data platformdesignData platformdesign
Data platformdesign
Ryoma Nagata
 
「GraphDB徹底入門」〜構造や仕組み理解から使いどころ・種々のGraphDBの比較まで幅広く〜
「GraphDB徹底入門」〜構造や仕組み理解から使いどころ・種々のGraphDBの比較まで幅広く〜「GraphDB徹底入門」〜構造や仕組み理解から使いどころ・種々のGraphDBの比較まで幅広く〜
「GraphDB徹底入門」〜構造や仕組み理解から使いどころ・種々のGraphDBの比較まで幅広く〜Takahiro Inoue
 
AI初心者だった私が E資格取得して専門職に転職した話
AI初心者だった私が E資格取得して専門職に転職した話AI初心者だった私が E資格取得して専門職に転職した話
AI初心者だった私が E資格取得して専門職に転職した話
川上 詩織
 
スマートフォン向けサービスにおけるサーバサイド設計入門
スマートフォン向けサービスにおけるサーバサイド設計入門スマートフォン向けサービスにおけるサーバサイド設計入門
スマートフォン向けサービスにおけるサーバサイド設計入門Hisashi HATAKEYAMA
 
情報推薦システム入門:講義スライド
情報推薦システム入門:講義スライド情報推薦システム入門:講義スライド
情報推薦システム入門:講義スライド
Kenta Oku
 

What's hot (20)

データベース設計徹底指南
データベース設計徹底指南データベース設計徹底指南
データベース設計徹底指南
 
PostgreSQLアンチパターン
PostgreSQLアンチパターンPostgreSQLアンチパターン
PostgreSQLアンチパターン
 
JaSST Tokyo 2022 アジャイルソフトウェア開発への統計的品質管理の応用
JaSST Tokyo 2022 アジャイルソフトウェア開発への統計的品質管理の応用JaSST Tokyo 2022 アジャイルソフトウェア開発への統計的品質管理の応用
JaSST Tokyo 2022 アジャイルソフトウェア開発への統計的品質管理の応用
 
イミュータブルデータモデル(入門編)
イミュータブルデータモデル(入門編)イミュータブルデータモデル(入門編)
イミュータブルデータモデル(入門編)
 
データドリフトの紹介
データドリフトの紹介データドリフトの紹介
データドリフトの紹介
 
Python におけるドメイン駆動設計(戦術面)の勘どころ
Python におけるドメイン駆動設計(戦術面)の勘どころPython におけるドメイン駆動設計(戦術面)の勘どころ
Python におけるドメイン駆動設計(戦術面)の勘どころ
 
数学カフェ 確率・統計・機械学習回 「速習 確率・統計」
数学カフェ 確率・統計・機械学習回 「速習 確率・統計」数学カフェ 確率・統計・機械学習回 「速習 確率・統計」
数学カフェ 確率・統計・機械学習回 「速習 確率・統計」
 
ブレインパッドにおける機械学習プロジェクトの進め方
ブレインパッドにおける機械学習プロジェクトの進め方ブレインパッドにおける機械学習プロジェクトの進め方
ブレインパッドにおける機械学習プロジェクトの進め方
 
Amebaにおけるレコメンデーションシステムの紹介
Amebaにおけるレコメンデーションシステムの紹介Amebaにおけるレコメンデーションシステムの紹介
Amebaにおけるレコメンデーションシステムの紹介
 
リクルートにおけるデータのインフラ化への取組
リクルートにおけるデータのインフラ化への取組リクルートにおけるデータのインフラ化への取組
リクルートにおけるデータのインフラ化への取組
 
MLOps に基づく AI/ML 実運用最前線 ~画像、動画データにおける MLOps 事例のご紹介~(映像情報メディア学会2021年冬季大会企画セッショ...
MLOps に基づく AI/ML 実運用最前線 ~画像、動画データにおける MLOps 事例のご紹介~(映像情報メディア学会2021年冬季大会企画セッショ...MLOps に基づく AI/ML 実運用最前線 ~画像、動画データにおける MLOps 事例のご紹介~(映像情報メディア学会2021年冬季大会企画セッショ...
MLOps に基づく AI/ML 実運用最前線 ~画像、動画データにおける MLOps 事例のご紹介~(映像情報メディア学会2021年冬季大会企画セッショ...
 
開発速度が速い #とは(LayerX社内資料)
開発速度が速い #とは(LayerX社内資料)開発速度が速い #とは(LayerX社内資料)
開発速度が速い #とは(LayerX社内資料)
 
SQLアンチパターン - 開発者を待ち受ける25の落とし穴 (拡大版)
SQLアンチパターン - 開発者を待ち受ける25の落とし穴 (拡大版)SQLアンチパターン - 開発者を待ち受ける25の落とし穴 (拡大版)
SQLアンチパターン - 開発者を待ち受ける25の落とし穴 (拡大版)
 
パターン認識第9章 学習ベクトル量子化
パターン認識第9章 学習ベクトル量子化パターン認識第9章 学習ベクトル量子化
パターン認識第9章 学習ベクトル量子化
 
機械学習 (AI/ML) 勉強会 #1 基本編
機械学習 (AI/ML) 勉強会 #1 基本編機械学習 (AI/ML) 勉強会 #1 基本編
機械学習 (AI/ML) 勉強会 #1 基本編
 
Data platformdesign
Data platformdesignData platformdesign
Data platformdesign
 
「GraphDB徹底入門」〜構造や仕組み理解から使いどころ・種々のGraphDBの比較まで幅広く〜
「GraphDB徹底入門」〜構造や仕組み理解から使いどころ・種々のGraphDBの比較まで幅広く〜「GraphDB徹底入門」〜構造や仕組み理解から使いどころ・種々のGraphDBの比較まで幅広く〜
「GraphDB徹底入門」〜構造や仕組み理解から使いどころ・種々のGraphDBの比較まで幅広く〜
 
AI初心者だった私が E資格取得して専門職に転職した話
AI初心者だった私が E資格取得して専門職に転職した話AI初心者だった私が E資格取得して専門職に転職した話
AI初心者だった私が E資格取得して専門職に転職した話
 
スマートフォン向けサービスにおけるサーバサイド設計入門
スマートフォン向けサービスにおけるサーバサイド設計入門スマートフォン向けサービスにおけるサーバサイド設計入門
スマートフォン向けサービスにおけるサーバサイド設計入門
 
情報推薦システム入門:講義スライド
情報推薦システム入門:講義スライド情報推薦システム入門:講義スライド
情報推薦システム入門:講義スライド
 

Similar to 2022/4/15_(DDD) Kotlin 1.5 で stable になった value class を深掘りする

Swift らしい表現を目指そう #eventdots
Swift らしい表現を目指そう #eventdotsSwift らしい表現を目指そう #eventdots
Swift らしい表現を目指そう #eventdots
Tomohiro Kumagai
 
F#によるFunctional Programming入門
F#によるFunctional Programming入門F#によるFunctional Programming入門
F#によるFunctional Programming入門
bleis tift
 
Essential Scala 第5章 シーケンス処理
Essential Scala 第5章 シーケンス処理Essential Scala 第5章 シーケンス処理
Essential Scala 第5章 シーケンス処理
Takuya Tsuchida
 
今日からできる!簡単 .NET 高速化 Tips
今日からできる!簡単 .NET 高速化 Tips今日からできる!簡単 .NET 高速化 Tips
今日からできる!簡単 .NET 高速化 Tips
Takaaki Suzuki
 
Boost Fusion Library
Boost Fusion LibraryBoost Fusion Library
Boost Fusion Library
Akira Takahashi
 
関数型プログラミング入門 for Matlab ユーザー
関数型プログラミング入門 for Matlab ユーザー関数型プログラミング入門 for Matlab ユーザー
関数型プログラミング入門 for Matlab ユーザー
Ichiro Maruta
 
ちょっと詳しくJavaScript 第2回【関数と引数】
ちょっと詳しくJavaScript 第2回【関数と引数】ちょっと詳しくJavaScript 第2回【関数と引数】
ちょっと詳しくJavaScript 第2回【関数と引数】株式会社ランチェスター
 
Kotlinアンチパターン
KotlinアンチパターンKotlinアンチパターン
Kotlinアンチパターン
Recruit Lifestyle Co., Ltd.
 
Boost.Flyweight
Boost.FlyweightBoost.Flyweight
Boost.Flyweightgintenlabo
 
C# 9.0 / .NET 5.0
C# 9.0 / .NET 5.0C# 9.0 / .NET 5.0
C# 9.0 / .NET 5.0
信之 岩永
 
C++ lecture-0
C++ lecture-0C++ lecture-0
C++ lecture-0sunaemon
 

Similar to 2022/4/15_(DDD) Kotlin 1.5 で stable になった value class を深掘りする (11)

Swift らしい表現を目指そう #eventdots
Swift らしい表現を目指そう #eventdotsSwift らしい表現を目指そう #eventdots
Swift らしい表現を目指そう #eventdots
 
F#によるFunctional Programming入門
F#によるFunctional Programming入門F#によるFunctional Programming入門
F#によるFunctional Programming入門
 
Essential Scala 第5章 シーケンス処理
Essential Scala 第5章 シーケンス処理Essential Scala 第5章 シーケンス処理
Essential Scala 第5章 シーケンス処理
 
今日からできる!簡単 .NET 高速化 Tips
今日からできる!簡単 .NET 高速化 Tips今日からできる!簡単 .NET 高速化 Tips
今日からできる!簡単 .NET 高速化 Tips
 
Boost Fusion Library
Boost Fusion LibraryBoost Fusion Library
Boost Fusion Library
 
関数型プログラミング入門 for Matlab ユーザー
関数型プログラミング入門 for Matlab ユーザー関数型プログラミング入門 for Matlab ユーザー
関数型プログラミング入門 for Matlab ユーザー
 
ちょっと詳しくJavaScript 第2回【関数と引数】
ちょっと詳しくJavaScript 第2回【関数と引数】ちょっと詳しくJavaScript 第2回【関数と引数】
ちょっと詳しくJavaScript 第2回【関数と引数】
 
Kotlinアンチパターン
KotlinアンチパターンKotlinアンチパターン
Kotlinアンチパターン
 
Boost.Flyweight
Boost.FlyweightBoost.Flyweight
Boost.Flyweight
 
C# 9.0 / .NET 5.0
C# 9.0 / .NET 5.0C# 9.0 / .NET 5.0
C# 9.0 / .NET 5.0
 
C++ lecture-0
C++ lecture-0C++ lecture-0
C++ lecture-0
 

Recently uploaded

今さら聞けない人のためのDevOps超入門 OSC2024名古屋 セミナー資料
今さら聞けない人のためのDevOps超入門 OSC2024名古屋  セミナー資料今さら聞けない人のためのDevOps超入門 OSC2024名古屋  セミナー資料
今さら聞けない人のためのDevOps超入門 OSC2024名古屋 セミナー資料
Toru Miyahara
 
エンジニアのセルフブランディングと技術情報発信の重要性 テクニカルライターになろう 講演資料
エンジニアのセルフブランディングと技術情報発信の重要性 テクニカルライターになろう 講演資料エンジニアのセルフブランディングと技術情報発信の重要性 テクニカルライターになろう 講演資料
エンジニアのセルフブランディングと技術情報発信の重要性 テクニカルライターになろう 講演資料
Toru Miyahara
 
本の感想共有会「データモデリングでドメインを駆動する」本が突きつける我々の課題について
本の感想共有会「データモデリングでドメインを駆動する」本が突きつける我々の課題について本の感想共有会「データモデリングでドメインを駆動する」本が突きつける我々の課題について
本の感想共有会「データモデリングでドメインを駆動する」本が突きつける我々の課題について
Masatsugu Matsushita
 
ビジュアルプログラミングIotLT17-オープンソース化されたビジュアルプログラミング環境Noodlの紹介
ビジュアルプログラミングIotLT17-オープンソース化されたビジュアルプログラミング環境Noodlの紹介ビジュアルプログラミングIotLT17-オープンソース化されたビジュアルプログラミング環境Noodlの紹介
ビジュアルプログラミングIotLT17-オープンソース化されたビジュアルプログラミング環境Noodlの紹介
miyp
 
Compute Units/Budget最適化 - Solana Developer Hub Online 6 #SolDevHub
Compute Units/Budget最適化 - Solana Developer Hub Online 6 #SolDevHubCompute Units/Budget最適化 - Solana Developer Hub Online 6 #SolDevHub
Compute Units/Budget最適化 - Solana Developer Hub Online 6 #SolDevHub
K Kinzal
 
Linuxサーバー構築 学習のポイントと環境構築 OSC2024名古屋 セミナー資料
Linuxサーバー構築 学習のポイントと環境構築 OSC2024名古屋 セミナー資料Linuxサーバー構築 学習のポイントと環境構築 OSC2024名古屋 セミナー資料
Linuxサーバー構築 学習のポイントと環境構築 OSC2024名古屋 セミナー資料
Toru Miyahara
 
「VRC海のおはなし会_深海探査とロボットのお話」発表資料
「VRC海のおはなし会_深海探査とロボットのお話」発表資料「VRC海のおはなし会_深海探査とロボットのお話」発表資料
「VRC海のおはなし会_深海探査とロボットのお話」発表資料
Yuuitirou528 default
 

Recently uploaded (7)

今さら聞けない人のためのDevOps超入門 OSC2024名古屋 セミナー資料
今さら聞けない人のためのDevOps超入門 OSC2024名古屋  セミナー資料今さら聞けない人のためのDevOps超入門 OSC2024名古屋  セミナー資料
今さら聞けない人のためのDevOps超入門 OSC2024名古屋 セミナー資料
 
エンジニアのセルフブランディングと技術情報発信の重要性 テクニカルライターになろう 講演資料
エンジニアのセルフブランディングと技術情報発信の重要性 テクニカルライターになろう 講演資料エンジニアのセルフブランディングと技術情報発信の重要性 テクニカルライターになろう 講演資料
エンジニアのセルフブランディングと技術情報発信の重要性 テクニカルライターになろう 講演資料
 
本の感想共有会「データモデリングでドメインを駆動する」本が突きつける我々の課題について
本の感想共有会「データモデリングでドメインを駆動する」本が突きつける我々の課題について本の感想共有会「データモデリングでドメインを駆動する」本が突きつける我々の課題について
本の感想共有会「データモデリングでドメインを駆動する」本が突きつける我々の課題について
 
ビジュアルプログラミングIotLT17-オープンソース化されたビジュアルプログラミング環境Noodlの紹介
ビジュアルプログラミングIotLT17-オープンソース化されたビジュアルプログラミング環境Noodlの紹介ビジュアルプログラミングIotLT17-オープンソース化されたビジュアルプログラミング環境Noodlの紹介
ビジュアルプログラミングIotLT17-オープンソース化されたビジュアルプログラミング環境Noodlの紹介
 
Compute Units/Budget最適化 - Solana Developer Hub Online 6 #SolDevHub
Compute Units/Budget最適化 - Solana Developer Hub Online 6 #SolDevHubCompute Units/Budget最適化 - Solana Developer Hub Online 6 #SolDevHub
Compute Units/Budget最適化 - Solana Developer Hub Online 6 #SolDevHub
 
Linuxサーバー構築 学習のポイントと環境構築 OSC2024名古屋 セミナー資料
Linuxサーバー構築 学習のポイントと環境構築 OSC2024名古屋 セミナー資料Linuxサーバー構築 学習のポイントと環境構築 OSC2024名古屋 セミナー資料
Linuxサーバー構築 学習のポイントと環境構築 OSC2024名古屋 セミナー資料
 
「VRC海のおはなし会_深海探査とロボットのお話」発表資料
「VRC海のおはなし会_深海探査とロボットのお話」発表資料「VRC海のおはなし会_深海探査とロボットのお話」発表資料
「VRC海のおはなし会_深海探査とロボットのお話」発表資料
 

2022/4/15_(DDD) Kotlin 1.5 で stable になった value class を深掘りする