Slide 1

Slide 1 text

,PUMJO.VMUJ1MBUGPSN-JCSBSZ !V[[V

Slide 2

Slide 2 text

"HFOEB wܦҢ w,PUMJO.11 .VMUJ1MBUGPSN1SPKFDU ͷ֓ཁ wݱঢ় w5*14ू w ࠓ͸େৎ෉͚ͩͲ কདྷతʹେมͦ͏ͩͳͱࢥ͏ࣄ

Slide 3

Slide 3 text

ܦҢ  w৽نΞϓϦ޲͚ͷೝূΞϓϦ಺՝ۚ౷ׅϥΠϒϥϦ Λ࡞͍ͬͯΔ J04޲͚ ͜ͷล͸5FDI$POGΛָ͓͠Έʹ w"OESPJEͰ͸ೝূ"1*ΫϥΠΞϯτΞϓϦ಺՝ۚ ϥΠϒϥϦΛͦΕͧΕݸผʹ࡞ΓɺͦΕΛར༻ऀଆ Ͱܨ͗͜ΜͰ͍ͨ

Slide 4

Slide 4 text

ܦҢ  w"OESPJE༻ͷೝূΞϓϦ಺՝ۚ౷ׅϥΠϒϥϦͷधཁ ͕ߴ·ͬͨ wͨͩ"OESPJE༻ʹϥΠϒϥϦ࡞Δࣄ΋Ͱ͖Δ͕
 ΍Ε͹Ͱ͖ͯ͠·͏ͷͰ௅ઓ͕ͳ͍ w ݱ࣌఺Ͱࣾ಺धཁ͸ແ͍͕ ,PUMJO.11ͷࢼݧӡ༻΋ ݉Ͷͯ΍ͬͯΈΔࣄʹ

Slide 5

Slide 5 text

؆୯ͳ֓ཁ wl&YQFSJNFOUBMGFBUVSFJO,PUMJOBOEz w1MBUGPSNؒͰίʔυΛڞ༗͢Δ +7. "OESPJE  +BWB4DSJQU J04 -JOVY 8JOEPXT .BD FUDʜ  wϓϥοτϑΥʔϜඇґଘͳίʔυ͸DPNNPOQSPKFDU
 ґଘίʔυ͸QMBUGPSNQSPKFDUʹॻ͍͍ͯ͘

Slide 6

Slide 6 text

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…

Slide 7

Slide 7 text

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

Slide 8

Slide 8 text

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..

Slide 9

Slide 9 text

No content

Slide 10

Slide 10 text

.VMUJ,PUMJO.VMUJ1MBUGPSN1SPKFDU ݴ͍͍͚ͨͩ

Slide 11

Slide 11 text

5FDIOPMPHZ4UBDL w(SBEMF ,PUMJOʙ ݱࡏ͸  wLPUMJOTUEMJC LPUMJOYDPSPVUJOFTDPSF  LPUMJOYTFSJBMJ[BUJPO LUPSDMJFOU wLPUMJOUFTU LPUMJOYDPSPVUJOFTUFTU LUPSDMJFOU NPDL NPDLL BTTFSUL LUMJOU wޙ͸QMBUGPSNʹ߹Θͤͯ0L)UUQ౳

Slide 12

Slide 12 text

͔͜͜Β5*14ू

Slide 13

Slide 13 text

(SBEMF1SPKFDU4USVDUVSF wͦ΋ͦ΋Ͳ͏͠Α͏໰୊ w·Ͱ͸,PUMJO%4-ະαϙʔτͩͬͨ w͔ΒͷQSPKFDUTUSVDUVSFͰ΍͍ͬͯͬͨͱ ͖ͷকདྷతͳϏϧυεΫϦϓτͷϝϯς͕ਏͦ͏ʜ

Slide 14

Slide 14 text

(SBEMF1SPKFDU4USVDUVSF ➔ܥͷࠒͷQSPKFDUTUSVDUVSFΛ౿ऻ

Slide 15

Slide 15 text

(SBEMF1SPKFDU4USVDUVSF https://github.com/uzzu/kotlin-mpp-boilerplate

Slide 16

Slide 16 text

(SBEMF1SPKFDU4USVDUVSF ➔ܥͷࠒͷQSPKFDUTUSVDUVSFΛ౿ऻ ɹBOESPJEϏϧυݻ༗ͷόάʹҾ͔͔ͬΔࣄ΋ͳ͍ ɹͷͰศར͚ͩͬͨͲɺطʹमਖ਼͞Ε͍ͯΔ͠ ɹEFQSFDBUFEʹͳͬͨΒ΍ΊΑ͏͔ͳͱ͍͏ؾ࣋ͪ

Slide 17

Slide 17 text

*%&4FUUJOHT *%&্ͰͷVOJUUFTU࣮ߦʹࠔͬͨΒ

Slide 18

Slide 18 text

LUPSDMJFOU wLPUMJOSFqFDUґଘ
 όΠφϦαΠζ͕େ͖͘ͳͬͯ͠·͏ʜ ɹ➔ݱঢ়ख෇͔ͣɻ࣏͍ͨ͠ʜ

Slide 19

Slide 19 text

LUPSDMJFOUPLIUUQ wϥΠϒϥϦ͸,PUMJO.11Ͱ࡞ͬͯΔ͚Ͳ
 ΞϓϦ͸,PUMJO.11Ͱ͸࡞͍ͬͯͳ͍
 ී௨ͷ"OESPJEΞϓϦ  w"OESPJEͷੈքͰ͸ 3FUSPpU "QPMMP 3FBDU/BUJWF FUDʜͱ΋
 ܨ͍͗ͨधཁ͕͋Δ w0L)UUQ$MJFOUͷΠϯελϯεΛڞ༗͍ͨ͠

Slide 20

Slide 20 text

LUPSDMJFOUPLIUUQ wLUPSDMJFOUPLIUUQͰ͸ෆՄ ɹ➔0L)UUQ$MJFOU&OHJOFΛࣗ࡞ͯ͠
 ɹɹLUPSDMJFOUքͱ"OESPJEքͰ
 ɹɹ0L)UUQ$MJFOUΛڞ༗

Slide 21

Slide 21 text

LPUMJOYTFSJBMJ[BUJPO w(SBEMF1MVHJOͰͷ4FSJBMJ[FS%FTFSJBMJ[FSੜ੒ػೳ
 Λ࢖Θͳ͍ͱ͍͚ͳ͍ఔن໛͕େ͖͘ͳ͍
 BOOPUBUJPOQSPDFTTJOH͠ͳͯ͘ࡁΉͳΒͨ͘͠ͳ͍ ɹ➔+TPO0CKFDUMJLFͳػೳ΋͋ΔͷͰͦΕΛ࢖͏
 ɹɹ(SBEMF1MVHJO͸BQQMZෆཁʹ͍ͯ͠Δ
 ɹɹৄࡉ͸https://uzzu.github.io/post/kotlin-json-serialization-mini.html

Slide 22

Slide 22 text

$PSPVUJOFT wͳΜ͔ͩΜͩͰ.VUFYΛΑ͘࢖͏
 ೝূपΓ͸ฒྻʹ૸ΒΕͯ΋ࠔΔ
 ͔ͭQPTUQPOFʹ΋ͨ͘͠ͳ͍
 ݺͼग़͠͸ճͰɺฒྻʹݺ͹Εͨશͯͷ࣮ߦίϯς Ωετʹฦ٫͍ͨ͠
 ͭ·ΓQVCMJTI SFGDPVOU WJB3Y ͍ͨ͠

Slide 23

Slide 23 text

$PSPVUJOFT https://github.com/uzzu/kortex

Slide 24

Slide 24 text

$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) } ྫ ϝιουίʔϧ͞Εͨճ਺Λฦ٫͢Δ͚ͩͷؔ਺

Slide 25

Slide 25 text

$PSPVUJOFT @Test fun basicWithHot() = runBlocking(hotInvocation()) { val times = 3 val results = mutableListOf() val jobs = mutableListOf() 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ճ } }

Slide 26

Slide 26 text

$PSPVUJOFT wৄࡉ͸
 https://uzzu.github.io/post/hot-coroutines.html

Slide 27

Slide 27 text

5FTUJOH wجຊతʹDPNNPOʹॻ͘ wDPNNPOʹॻ͍͓ͯ͘ͱɺ֤1MBUGPSNͷVOJU UFTU࣮ߦ࣌ʹ·ͱΊͯVOJUUFTU͕࣮ߦ͞ΕΔ

Slide 28

Slide 28 text

5FTUJOH$PSPVUJOFT wSVO#MPDLJOH͸KWNͷΈఏڙ͞Ε͍ͯΔ
 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

Slide 29

Slide 29 text

͜͜·Ͱ5*14

Slide 30

Slide 30 text

কདྷతʹେมͦ͏ͩͱࢥ͏ࣄ w,PUMJO/BUJWFͷςετ
 .PDLL΋"TTFSUL΋ݱঢ়/BUJWFඇରԠͳͷͰ
 ଴ͪঢ়ଶ

Slide 31

Slide 31 text

কདྷతʹେมͦ͏ͩͱࢥ͏ࣄ w,PUMJO/BUJWFͷ$*؀ڥ
 J04޲͚ͷςετ͸࣮ߦՄೳܗࣜͰు͍ͯɺYDSVOͯ͠Ϩ ϙʔτूܭ͍ͯ͠ΔJ04Ϗϧυ؀ڥ͕͍Δ
 ଞͷBSDIJUFDUVSF΋ಉ༷
 $*؀ڥͱςετϨϙʔτूܭͲ͏͢Δ QMBUGPSNຖʹ QJQFMJOFԽͯ͠΍ΔΜͩͱࢥ͏ 
 ΋ͪΖΜ/BUJWF͸J04͚ͩͰ͸ͳ͍ͷͰҎԼུ


Slide 32

Slide 32 text

কདྷతʹେมͦ͏ͩͱࢥ͏ࣄ wͨ͘͞Μ͋ΔͷͰ͓࿩͠·͠ΐ͏ʂ