Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
kotlin-mpp-library-tips
Search
Sponsored
·
SiteGround - Reliable hosting with speed, security, and support you can count on.
→
uzzu
February 18, 2019
Technology
6.5k
1
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
kotlin-mpp-library-tips
Cookpad.apk #2 登壇資料
https://cookpad.connpass.com/event/117054/
uzzu
February 18, 2019
More Decks by uzzu
See All by uzzu
Context Receiversに思いを馳せる / Context Receivers
uzzu
0
760
StoreKitのこれまでとこれから / StoreKit 2 from 1
uzzu
5
21k
Autofill Framework
uzzu
0
150
アプリ内課金の最新事情 クライアントサイド編 / In-app Purchase in Cookpad 2019
uzzu
3
4.7k
Billing Client 2.0 acknowledgement
uzzu
0
17k
Promoting IAP対応から学ぶ外部アプリ内課金実装 / Promoting IAP and others
uzzu
2
1.6k
ブログ作り直した / My blog @ Othlo Tech
uzzu
0
210
新規アプリ開発を支えるユーザ・決済基盤
uzzu
2
2.9k
Coroutine Kyuin
uzzu
2
340
Other Decks in Technology
See All in Technology
AIの性能が向上しても未解決な組織の重大問題は何か?/An Unsolved Organizational Problem in the Age of AI
moriyuya
4
640
やさしいA2A入門
minorun365
PRO
12
1.8k
2026TECHFRESH畢業分享會 - Lightning Talk - 資料也要 CI/CD? 用 Airbyte 自動化資料同步
line_developers_tw
PRO
0
890
AWSシリコン最前線 〜AI時代のチップ選択を読み解く〜
htokoyo
2
530
就職⽀援サービスにおけるキャリアアドバイザーのシフトスケジューリング
recruitengineers
PRO
1
140
Claude Codeをどのように キャッチアップしているか
oikon48
12
7.2k
スキルと MCP ツール、責務をどう分けるか? AI が迷わないインターフェース設計の戦略
cdataj
1
990
Snowflakeと仲良くなる第一歩
coco_se
4
440
小さくはじめるSLI/SLO ~育てながら組織に定着させる実践知~ / Starting Small with SLI/SLOs: Building Adoption Through Continuous Growth
nari_ex
7
1.9k
How Timee Delivers Day 1 Production Ready LLM Features
tomoyks
0
170
20260619 私の日常業務での生成 AI 活用
masaruogura
1
150
LLMにもCAP定理があるという話
harukasakihara
0
310
Featured
See All Featured
The World Runs on Bad Software
bkeepers
PRO
72
12k
BBQ
matthewcrist
89
10k
Jamie Indigo - Trashchat’s Guide to Black Boxes: Technical SEO Tactics for LLMs
techseoconnect
PRO
0
160
Documentation Writing (for coders)
carmenintech
77
5.4k
A brief & incomplete history of UX Design for the World Wide Web: 1989–2019
jct
2
390
Claude Code どこまでも/ Claude Code Everywhere
nwiizo
65
56k
Ten Tips & Tricks for a 🌱 transition
stuffmc
0
130
Between Models and Reality
mayunak
4
330
SERP Conf. Vienna - Web Accessibility: Optimizing for Inclusivity and SEO
sarafernandez
2
1.5k
How to Think Like a Performance Engineer
csswizardry
28
2.6k
Paper Plane (Part 1)
katiecoart
PRO
0
8.8k
Neural Spatial Audio Processing for Sound Field Analysis and Control
skoyamalab
0
330
Transcript
,PUMJO.VMUJ1MBUGPSN-JCSBSZ !V[[V
"HFOEB wܦҢ w,PUMJO.11 .VMUJ1MBUGPSN1SPKFDU ͷ֓ཁ wݱঢ় w5*14ू w ࠓେৎ͚ͩͲ কདྷతʹେมͦ͏ͩͳͱࢥ͏ࣄ
ܦҢ w৽نΞϓϦ͚ͷೝূΞϓϦ՝ۚ౷ׅϥΠϒϥϦ Λ࡞͍ͬͯΔ J04͚ ͜ͷล5FDI$POGΛָ͓͠Έʹ w"OESPJEͰೝূ"1*ΫϥΠΞϯτΞϓϦ՝ۚ ϥΠϒϥϦΛͦΕͧΕݸผʹ࡞ΓɺͦΕΛར༻ऀଆ Ͱܨ͗͜ΜͰ͍ͨ
ܦҢ w"OESPJE༻ͷೝূΞϓϦ՝ۚ౷ׅϥΠϒϥϦͷधཁ ͕ߴ·ͬͨ wͨͩ"OESPJE༻ʹϥΠϒϥϦ࡞ΔࣄͰ͖Δ͕ ΕͰ͖ͯ͠·͏ͷͰઓ͕ͳ͍ w ݱ࣌Ͱࣾधཁແ͍͕ ,PUMJO.11ͷࢼݧӡ༻ ݉ͶͯͬͯΈΔࣄʹ
؆୯ͳ֓ཁ wl&YQFSJNFOUBMGFBUVSFJO,PUMJOBOEz w1MBUGPSNؒͰίʔυΛڞ༗͢Δ +7. "OESPJE +BWB4DSJQU J04 -JOVY 8JOEPXT
.BD FUDʜ wϓϥοτϑΥʔϜඇґଘͳίʔυDPNNPOQSPKFDU ґଘίʔυQMBUGPSNQSPKFDUʹॻ͍͍ͯ͘
Kotlin Source Codes Kotlin / JVM Kotlin / Native Kotlin
/ JS JVM Android Executable Dynamic Library iOS Node.js Browser JS Server app Desktop app etc… Android app iOS(arm32, arm64, emulator x86_64) MacOS(x86_64) Android(arm32, arm64) Linux(x86_64, arm32, MIPS, MIPS little endian) WebAssembly(wasm32) Windows(mingw x86_64) Frontend Web app Server app etc…
Kotlin Source Codes Kotlin / JVM Kotlin / Native Kotlin
/ JS JVM Android Executable Dynamic Library iOS Node.js Browser JS java.util.concurrent.* Handler pthread etc… Promise Coroutines - ඇಉظॲཧ -> abstraction by CoroutineContext GCD
Kotlin Source Codes Kotlin / JVM Kotlin / Native Kotlin
/ JS JVM Android Executable Dynamic Library iOS Node.js Browser JS nghttp2 libcurl etc… Fetch API ktor-client - HTTPClient -> abstraction by HTTPClientEngine NSURLRequest etc… apache Jetty etc… okhttp etc… request node-fetch etc..
None
.VMUJ,PUMJO.VMUJ1MBUGPSN1SPKFDU ݴ͍͍͚ͨͩ
5FDIOPMPHZ4UBDL w(SBEMF ,PUMJOʙ ݱࡏ wLPUMJOTUEMJC LPUMJOYDPSPVUJOFTDPSF LPUMJOYTFSJBMJ[BUJPO LUPSDMJFOU
wLPUMJOUFTU LPUMJOYDPSPVUJOFTUFTU LUPSDMJFOU NPDL NPDLL BTTFSUL LUMJOU wޙQMBUGPSNʹ߹Θͤͯ0L)UUQ
͔͜͜Β5*14ू
(SBEMF1SPKFDU4USVDUVSF wͦͦͲ͏͠Α͏ w·Ͱ,PUMJO%4-ະαϙʔτͩͬͨ w͔ΒͷQSPKFDUTUSVDUVSFͰ͍ͬͯͬͨͱ ͖ͷকདྷతͳϏϧυεΫϦϓτͷϝϯς͕ਏͦ͏ʜ
(SBEMF1SPKFDU4USVDUVSF ➔ܥͷࠒͷQSPKFDUTUSVDUVSFΛ౿ऻ
(SBEMF1SPKFDU4USVDUVSF https://github.com/uzzu/kotlin-mpp-boilerplate
(SBEMF1SPKFDU4USVDUVSF ➔ܥͷࠒͷQSPKFDUTUSVDUVSFΛ౿ऻ ɹBOESPJEϏϧυݻ༗ͷόάʹҾ͔͔ͬΔࣄͳ͍ ɹͷͰศར͚ͩͬͨͲɺطʹमਖ਼͞Ε͍ͯΔ͠ ɹEFQSFDBUFEʹͳͬͨΒΊΑ͏͔ͳͱ͍͏ؾ࣋ͪ
*%&4FUUJOHT *%&্ͰͷVOJUUFTU࣮ߦʹࠔͬͨΒ
LUPSDMJFOU wLPUMJOSFqFDUґଘ όΠφϦαΠζ͕େ͖͘ͳͬͯ͠·͏ʜ ɹ➔ݱঢ়ख͔ͣɻ࣏͍ͨ͠ʜ
LUPSDMJFOUPLIUUQ wϥΠϒϥϦ,PUMJO.11Ͱ࡞ͬͯΔ͚Ͳ ΞϓϦ,PUMJO.11Ͱ࡞͍ͬͯͳ͍ ී௨ͷ"OESPJEΞϓϦ w"OESPJEͷੈքͰ 3FUSPpU "QPMMP 3FBDU/BUJWF FUDʜͱ
ܨ͍͗ͨधཁ͕͋Δ w0L)UUQ$MJFOUͷΠϯελϯεΛڞ༗͍ͨ͠
LUPSDMJFOUPLIUUQ wLUPSDMJFOUPLIUUQͰෆՄ ɹ➔0L)UUQ$MJFOU&OHJOFΛࣗ࡞ͯ͠ ɹɹLUPSDMJFOUքͱ"OESPJEքͰ ɹɹ0L)UUQ$MJFOUΛڞ༗
LPUMJOYTFSJBMJ[BUJPO w(SBEMF1MVHJOͰͷ4FSJBMJ[FS%FTFSJBMJ[FSੜػೳ ΛΘͳ͍ͱ͍͚ͳ͍ఔن͕େ͖͘ͳ͍ BOOPUBUJPOQSPDFTTJOH͠ͳͯ͘ࡁΉͳΒͨ͘͠ͳ͍ ɹ➔+TPO0CKFDUMJLFͳػೳ͋ΔͷͰͦΕΛ͏ ɹɹ(SBEMF1MVHJOBQQMZෆཁʹ͍ͯ͠Δ ɹɹৄࡉhttps://uzzu.github.io/post/kotlin-json-serialization-mini.html
$PSPVUJOFT wͳΜ͔ͩΜͩͰ.VUFYΛΑ͘͏ ೝূपΓฒྻʹΒΕͯࠔΔ ͔ͭQPTUQPOFʹͨ͘͠ͳ͍ ݺͼग़͠ճͰɺฒྻʹݺΕͨશͯͷ࣮ߦίϯς Ωετʹฦ٫͍ͨ͠ ͭ·ΓQVCMJTI SFGDPVOU WJB3Y ͍ͨ͠
$PSPVUJOFT https://github.com/uzzu/kortex
$PSPVUJOFT class CallCount(val value: Int) { override fun equals(other: Any?)
= this === other } var callCount = 0 suspend fun increment(): CallCount { ++callCount delay(10) return CallCount(callCount) } ྫ ϝιουίʔϧ͞ΕͨճΛฦ٫͢Δ͚ͩͷؔ
$PSPVUJOFT @Test fun basicWithHot() = runBlocking(hotInvocation()) { val times =
3 val results = mutableListOf<CallCount>() val jobs = mutableListOf<Job>() repeat(times) { i -> val job = launch { runCatching { withContext(Dispatchers.IO) { withHot("hot") { increment() } } } .onSuccess { results.add(it) } .onFailure { fail("[$i] Exception occurred: $it") } } jobs.add(job) } jobs.forEach { it.join() } assertAll { assertThat(results.size).isEqualTo(times) // શͯͷ࣮ߦContextʹincrement()ͷ݁Ռ͕ฦ٫͞ΕΔ assertThat(results.distinct().size).isEqualTo(1) // ಉҰΦϒδΣΫτ͕ฦ٫͞ΕΔ assertThat(results.distinct()[0].value).isEqualTo(1) // increment()ͷݺग़ճ1ճ } }
$PSPVUJOFT wৄࡉ https://uzzu.github.io/post/hot-coroutines.html
5FTUJOH wجຊతʹDPNNPOʹॻ͘ wDPNNPOʹॻ͍͓ͯ͘ͱɺ֤1MBUGPSNͷVOJU UFTU࣮ߦ࣌ʹ·ͱΊͯVOJUUFTU͕࣮ߦ͞ΕΔ
5FTUJOH$PSPVUJOFT wSVO#MPDLJOHKWNͷΈఏڙ͞Ε͍ͯΔ DPNNPOʹςετॻ͖͍ͨ wݱঢ়UFTUJOGSBͳTVCQSPKFDUΛ࡞ͬͯSVO#MPDLJOHΛ FYQFDUBDUVBMͷܗʹ͍ͯ͠Δ KTͳΒQSPNJTF NPDIBͰ ۩ମతͳίʔυhttps://gist.github.com/uzzu/58cb8bb12c17605017edd01b8498915a
w,PUMJOͳ͍͠$PSPVUJOFT-JCSBSZ্Ͱ ରԠ͕ೖΔ༧ఆʜͱࢥ͍ͬͯΔ͚ͲJTTVFḷ͍ͬͯ͘ͱ ͬͱ͔͔Γͦ͏ͳؾ͕͢Δʜhttps://youtrack.jetbrains.com/issue/KT-19813
͜͜·Ͱ5*14
কདྷతʹେมͦ͏ͩͱࢥ͏ࣄ w,PUMJO/BUJWFͷςετ .PDLL"TTFSULݱঢ়/BUJWFඇରԠͳͷͰ ͪঢ়ଶ
কདྷతʹେมͦ͏ͩͱࢥ͏ࣄ w,PUMJO/BUJWFͷ$*ڥ J04͚ͷςετ࣮ߦՄೳܗࣜͰు͍ͯɺYDSVOͯ͠Ϩ ϙʔτूܭ͍ͯ͠ΔJ04Ϗϧυڥ͕͍Δ ଞͷBSDIJUFDUVSFಉ༷ $*ڥͱςετϨϙʔτूܭͲ͏͢Δ QMBUGPSNຖʹ QJQFMJOFԽͯ͠ΔΜͩͱࢥ͏ ͪΖΜ/BUJWFJ04͚ͩͰͳ͍ͷͰҎԼུ
কདྷతʹେมͦ͏ͩͱࢥ͏ࣄ wͨ͘͞Μ͋ΔͷͰ͓͠·͠ΐ͏ʂ