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
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
770
StoreKitのこれまでとこれから / StoreKit 2 from 1
uzzu
5
21k
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
220
新規アプリ開発を支えるユーザ・決済基盤
uzzu
2
3k
Coroutine Kyuin
uzzu
2
340
Other Decks in Technology
See All in Technology
Foxgloveについて 実際にExtensionを開発して公開するまでの話 / About Foxglove: The Story of Developing and Releasing an Extension
ry0_ka
0
210
Oracle Exadata Database Service on Cloud@Customer X11M (ExaDB-C@C) サービス概要
oracle4engineer
PRO
2
8.4k
AI時代のエンジニアキャリアについて今一度考える
sakamoto_582
2
1.5k
プロダクトだけじゃない、社内プロセスにおける自動化・省力化ノススメ
kakehashi
PRO
1
3.6k
誤解だらけの開発生産性 / Myths and Misconceptions about Developer Productivity
i35_267
1
230
Gen3R: 3D Scene Generation Meets Feed-Forward Reconstruction
spatial_ai_network
0
110
プロンプト_きのこカンファレンス2026_LT
yurufuwahealer
0
150
「早く出す」より「事業に効く」 ── 顧客の業務サイクルから逆算するAI時代の二重ループ開発と「変化の設計者」 / devsumi2026
rakus_dev
1
210
しぶいSRE: サーバから見えない障害にどう向き合うか。ラストワンマイルのデバッグ実践 / Shibui SRE
kanny
13
6k
完全自律ロボットを作りたくて、先に開発を自律させた話(ROS Japan UG #63 LT)
rryz09
0
490
SRE Lounge Hiroshimaへの招待
grimoh
0
640
AIと共生する開発者プラットフォーム:バクラクのモノレポ×マイクロサービス基盤
sakajunquality
2
3.4k
Featured
See All Featured
Principles of Awesome APIs and How to Build Them.
keavy
128
18k
So, you think you're a good person
axbom
PRO
2
2.1k
Automating Front-end Workflow
addyosmani
1370
210k
Skip the Path - Find Your Career Trail
mkilby
1
160
Bioeconomy Workshop: Dr. Julius Ecuru, Opportunities for a Bioeconomy in West Africa
akademiya2063
PRO
1
170
Thoughts on Productivity
jonyablonski
76
5.2k
AI Search: Implications for SEO and How to Move Forward - #ShenzhenSEOConference
aleyda
1
1.3k
Optimizing for Happiness
mojombo
378
71k
SEO Brein meetup: CTRL+C is not how to scale international SEO
lindahogenes
1
2.8k
B2B Lead Gen: Tactics, Traps & Triumph
marketingsoph
0
170
コードの90%をAIが書く世界で何が待っているのか / What awaits us in a world where 90% of the code is written by AI
rkaga
62
44k
The Art of Delivering Value - GDevCon NA Keynote
reverentgeek
16
2k
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ͨ͘͞Μ͋ΔͷͰ͓͠·͠ΐ͏ʂ