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
AI時代のエンジニアの情報発信〜個人の発信を組織の力に変える〜
ryo_kawamata
0
6.6k
ひとりで始めた AI駆動開発、チームに広げて何が変わったのか
kenichiodo
1
210
推論基盤と Scale-Up Interconnect の現状と制約から俯瞰する技術動向
markunet
2
740
20261031_IoTLT_vol140_kitazaki_v1.pdf
kitazaki
0
150
AI時代、つくる力を自分たちの手に。 ──電通×KAG、アジャイルとAI駆動開発で挑む開発の変革
yuukiyo
3
450
E2Eってつらくないですか?E2Eの管理コストを下げる手段とその実践
akaboshinit
6
2.9k
SLOを阻む不安
sraku2159
0
200
AIコーディングはじめました
miso
0
130
新米を「売り越さない」、Aurora DSQLで作る在庫ゼロ死守の限定ドロップEC
yama3133
0
140
1週間、Opus封印でお願いします
kintotechdev
1
430
基本から分かる!AWSセキュリティ運用の考え方と任せ方
cmusudakeisuke
1
340
AX時代の自治体支援リソース再配分と役割分担の再構成:戦略とロードマップ(概要)
sishi2026
0
170
Featured
See All Featured
Site-Speed That Sticks
csswizardry
13
1.6k
Money Talks: Using Revenue to Get Sh*t Done
nikkihalliwell
0
540
Speed Design
sergeychernyshev
33
2.2k
Easily Structure & Communicate Ideas using Wireframe
afnizarnur
194
17k
Java REST API Framework Comparison - PWX 2021
mraible
34
9.8k
Facilitating Awesome Meetings
lara
57
7.2k
ReactJS: Keep Simple. Everything can be a component!
pedronauck
666
130k
Conquering PDFs: document understanding beyond plain text
inesmontani
PRO
4
3.3k
Future Trends and Review - Lecture 12 - Web Technologies (1019888BNR)
signer
PRO
0
3.8k
How to optimise 3,500 product descriptions for ecommerce in one day using ChatGPT
katarinadahlin
PRO
3
3.9k
What’s in a name? Adding method to the madness
productmarketing
PRO
24
4.2k
Exploring the Power of Turbo Streams & Action Cable | RailsConf2023
kevinliebholz
37
6.6k
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ͨ͘͞Μ͋ΔͷͰ͓͠·͠ΐ͏ʂ