Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
kotlin-mpp-library-tips
Search
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
あなたは 何をして 何をもたらすのか? / reskilling-at-tokyo-2026
uzzu
0
45
Context Receiversに思いを馳せる / Context Receivers
uzzu
0
800
StoreKitのこれまでとこれから / StoreKit 2 from 1
uzzu
5
22k
Autofill Framework
uzzu
0
160
アプリ内課金の最新事情 クライアントサイド編 / 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
230
新規アプリ開発を支えるユーザ・決済基盤
uzzu
2
3k
Other Decks in Technology
See All in Technology
正解のない研修に放り出されて / Being thrown into a training program with no right answers
ohnoeight
1
160
これだけは抑えておきたい!後悔しない re:Invent の過ごし方 / AWS re:Invent 2026 prestudy
kinunori
2
520
スクラム祭り2026福井トラック_閉じたループから価値のスパイラルへ
kc_nakanishi
0
190
AWSセキュリティで活用するAI機能
cmusudakeisuke
1
350
Maestro MCPとClaude Code Skillsによる自律的なE2Eテスト支援
asmz
0
310
GitHub、使う?使わない?
happysamurai294
0
110
デザインレビューは自動化できるのか?─ Flutter × Figma で UI 品質保証を考える
techiro
2
440
顧客価値を追いかけたら、プライシングにたどり着いた
sansantech
PRO
2
1.1k
cdk deployとcdkd deploy、実際にデプロイして5倍速近くの差を実測した
yama3133
1
110
CSS2026:OWS研究会・招待講演「世界観を、実装する」
atsush1_sada
2
340
Draft AIエージェントの トークン消費を最小化する 8つの原則
kinopeee
6
1.8k
Obsidian Vault Architectures
x5gtrn
PRO
0
190
Featured
See All Featured
Building a A Zero-Code AI SEO Workflow
portentint
PRO
0
800
GraphQLとの向き合い方2022年版
quramy
50
15k
Thoughts on Productivity
jonyablonski
76
5.4k
How to Grow Your eCommerce with AI & Automation
katarinadahlin
PRO
2
330
Fantastic passwords and where to find them - at NoRuKo
philnash
53
4k
Believing is Seeing
oripsolob
1
250
Organizational Design Perspectives: An Ontology of Organizational Design Elements
kimpetersen
PRO
1
860
Groundhog Day: Seeking Process in Gaming for Health
codingconduct
0
440
Measuring & Analyzing Core Web Vitals
bluesmoon
9
1k
Measuring Dark Social's Impact On Conversion and Attribution
stephenakadiri
2
310
Evolving SEO for Evolving Search Engines
ryanjones
0
330
SEOcharity - Dark patterns in SEO and UX: How to avoid them and build a more ethical web
sarafernandez
0
310
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ͨ͘͞Μ͋ΔͷͰ͓͠·͠ΐ͏ʂ