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
·
Your Podcast. Everywhere. Effortlessly.
Share. Educate. Inspire. Entertain. You do you. We'll handle the rest.
→
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
220
新規アプリ開発を支えるユーザ・決済基盤
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
690
Claude Codeをどのように キャッチアップしているか
oikon48
13
8.3k
ACE-Step-1.5で見る 音楽生成AIのしくみと“破綻だけ直す”Retake機能の開発【zennfes spring 2026 登壇資料】
personabb
1
510
Agent Skills設計で柔軟性と硬さのバランスが難しい話
nassy20
0
130
新しいUbuntu/GNOMEが使いたいからXからWaylandへ移行頑張ってるの巻 2026-06-20
nobutomurata
0
130
中期計画、2回作ってみた ~業務委託と正社員、両方の視点から~
demaecan
1
910
LayerXにおけるセキュリティ管理の現在地と次の一手
tosho
0
220
AIネイティブな開発のサプライチェーンリスク対策 〜激動の開発現場でリスクに立ち向かう〜【ZennFes】
cscengineer
PRO
2
130
【Cyber-sec+】経営層を"動かす"ための考え方
hssh2_bin
0
190
白金鉱業Meetup_Vol.24_「AIエージェントは分けるほど良い」は本当か? / Is it true that “the more you divide AI agents, the better”?
brainpadpr
1
400
AIエージェントが名古屋の猛暑からあなたを守る
happysamurai294
0
130
【NRUG vol.18】なぜ多くのオブザーバビリティ導入は失敗するのか
nrug_member
0
170
Featured
See All Featured
Keith and Marios Guide to Fast Websites
keithpitt
413
23k
sira's awesome portfolio website redesign presentation
elsirapls
0
280
Exploring the Power of Turbo Streams & Action Cable | RailsConf2023
kevinliebholz
37
6.5k
Optimising Largest Contentful Paint
csswizardry
37
3.7k
Why Your Marketing Sucks and What You Can Do About It - Sophie Logan
marketingsoph
0
170
The browser strikes back
jonoalderson
0
1.2k
Accessibility Awareness
sabderemane
1
140
Large-scale JavaScript Application Architecture
addyosmani
515
110k
Art, The Web, and Tiny UX
lynnandtonic
304
22k
Crafting Experiences
bethany
1
180
Agile Leadership in an Agile Organization
kimpetersen
PRO
0
160
Improving Core Web Vitals using Speculation Rules API
sergeychernyshev
21
1.5k
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ͨ͘͞Μ͋ΔͷͰ͓͠·͠ΐ͏ʂ