SlideShare a Scribd company logo
1 of 86
Download to read offline
Compose
Android/Desktop
KotlinConf’23
Global in Songdo
)
GDG Songdo Organizer
GDSC TUK Core
@kisa002
@kisa002
@holykisa
Compose Android/Desktop
Compose 👋 👋 👋
DevFest 2022 Songdo
Jetpack Compose 사내 도입기
- https://bit.ly/3mPcpLu
• UI Android UI
• , UI
• XML Kotlin API
Jetpack Compose
Compose ?
Compose ?
Shape XML
Layout XML
Animation XML
Controller
Jetpack Compose
Written by Jetpack Compose
Compose ?
In PlayStore
Compose ?
23% Top 1,000
2
Android UI .
• Jetpack Compose
• Android
• Compose for Desktop
• Windows
• Mac
• Linux
• Compose for Web
Compose Multiplatform
Android UI .
Compose Multiplatform
Android UI .
Compose Multiplatform
Android UI .
Compose Multiplatform
Compose Multiplatform
Android/Desktop
Git Repository
Compose Multiplatform
Web
Android/iOS
Compose Multiplatform
AOS & iOS
UI: Compose
API: Ktor
With Coroutine + Flow
?
Kotlin Multiplatform
•
•
•
Kotlin Multiplatform
?
Kotlin Multiplatform
?
Kotlin/Compose Multiplatform
?
Kotlin Multiplatform Compose Multiplatform
New Project Existing Project
Compose on SKIA
?
SKIKO
New Project
New Project
Project Structure
Project Structure
Android Desktop
Common
Project Structure
Android Desktop Common
Project Structure
Android ‒ MainActivity.kt
Desktop ‒ Main.kt
Common ‒ App.kt
Android ‒ MainActivity.kt
Desktop ‒ Main.kt
Common ‒ App.kt
Project Structure
Common ‒ App.kt
Expect - Actual
Expect(commonMain)
- Actual(androidMain)
- Actual(desktopMain)
Running
Stopwatch
UI
UI
@Composable
fun PrimaryButton(text: String, enabled: Boolean = true, onClick: () -> Unit) {
Button(
onClick = onClick,
modifier = Modifier.widthIn(min = 168.dp),
enabled = enabled,
contentPadding = PaddingValues(vertical = 12.dp)
) {
Text(text)
}
}
@Composable
fun SecondaryButton(text: String, enabled: Boolean = true, onClick: () -> Unit) {
OutlinedButton(onClick = onClick, ...) {
Text(text)
}
}
PrimaryButton(text = "PangMoo", onClick = {})
SecondaryButton(text = "Secondary", onClick = {})
ButtonComponent.kt
:
UI
@Composable
fun HomeScreen(modifier: Modifier = Modifier) {
val infiniteTransition = rememberInfiniteTransition()
val animateBackgroundColor by infiniteTransition.animateColor(…)
Column(…) {
Text(
text = "KotlinConf'23 Global in Songdo",
modifier = Modifier
.background(
color = animateBackgroundColor,
shape = MaterialTheme.shapes.medium)
)
...
)
}
}
HomeSreen.kt
:
UI
@Composable
fun SettingsScreen(modifier: Modifier = Modifier) {
var value by remember { mutableStateOf(0f) }
var checked by remember { mutableStateOf(false) }
Column(…) {
SomethingValue(value = value, onValueChange = { value = it })
SomethingSwitch(checked = checked, onCheckedChange = { checked = it })
Spacer(modifier = Modifier.weight(1f))
VersionText(version = "1.0.0")
}
}
@Composable
private fun SomethingValue(...) {...}
@Composable
private fun SomethingSwitch(...) {...}
@Composable
private fun VersionText(...) {...}
SettingsSreen.kt
:
UI
@Composable
fun StopwatchScreen(
modifier: Modifier = Modifier,
stopwatchState: StopwatchState,
formattedTimeString: String,
onStart: () -> Unit,
onPause: () -> Unit,
onResume: () -> Unit,
onReset: () -> Unit
) {
Column(…) {
ActionButtons(
stopwatchState = stopwatchState,
formattedTimeString = formattedTimeString,
onStart = onStart,
onPause = onPause,
onResume = onResume,
onReset = onReset
)
}
}
...
StopwatchSreen.kt
Material Theme
Light/Dark Theme
Material Theme
val KawaiBlue = Color(0xFF25AAFF)
val KawaiDark = Color(0xFF1E1F22)
val LightColors = lightColors(
primary = KawaiBlue
)
val DarkColors = darkColors(
primary = KawaiBlue,
surface = KawaiDark
)
@Composable
fun PangmooTheme(
isSystemInDarkTheme: Boolean = isSystemInDarkTheme(),
content: @Composable () -> Unit
) {
MaterialTheme(
colors = if (isSystemInDarkTheme) DarkColors else
LightColors,
content = content
)
}
Theme.kt
Colors.kt
Light/Dark Theme
Material Theme
Dark Theme Light Theme
API Database Calculate Others…
class StopwatchUtil {
private val _state = MutableStateFlow<StopwatchState>(StopwatchState.STOP)
val state = _state.asStateFlow()
private val _time = MutableStateFlow(0)
val time = _time.asStateFlow()
private val coroutineScope = CoroutineScope(Dispatchers.IO)
private var job: Job? = null
val formattedTimeString = time.map {
val hour = time.value / 3600
val minute = (time.value % 3600) / 60
val second = time.value % 60
"%02d:%02d:%02d".format(hour, minute, second)
}.stateIn(coroutineScope, SharingStarted.Lazily, "00:00:00")
fun start() {...}
fun pause() {...}
...
}
StopwatchUtil.kt
Version
Version
Android
Desktop
1.0.0
1.0.0
1.0.1
Local Storage
1.0.1
Local Storage
1.0.2
Social Login
1.0.2
Social Login
1.0.3
Analytics
1.0.3
Analytics
Version
Android
Desktop
1.0.0
1.0.0
1.0.1
Local Storage
1.0.1
Local Storage
1.0.2
Social Login
1.0.2
Social Login
1.0.3
Analytics
1.0.3
Analytics
Permission Error!
Version
Android
Desktop
1.0.0
1.0.0
1.0.1
Local Storage
1.0.1
Local Storage
1.0.2
Social Login
1.0.2
Social Login
1.0.3
Analytics
1.0.3
Analytics
Permission Error!
1.0.31 Hotfix
Permission Error
Version
Expect! Actual!
Version
common/commonMain
common/androidMain
common/desktopMain
Version
@Composable
fun SettingsScreen(modifier: Modifier = Modifier) {
var value by remember { mutableStateOf(0f) }
var checked by remember { mutableStateOf(false) }
Column(...) {
...
VersionText(version = getVersionName())
}
}
@Composable
fun SettingsScreen(modifier: Modifier = Modifier) {
var value by remember { mutableStateOf(0f) }
var checked by remember { mutableStateOf(false) }
Column(...) {
...
VersionText(version = "1.0.0")
}
}
Version
In Android... BuildConfig
Android ‒ BuildConfig
Version
android {
defaultConfig {
...
applicationId = "com.haeyum.android"
versionCode = 1
versionName = version.toString()
buildConfigField("String", "VERSION_NAME", ""${versionName}"")
}
...
}
Android ‒ BuildConfig
Version
BuildConfig(Common) != BuildConfig(Android)
Android ‒ BuildConfig
Version
Android
( common )
Version
Desktop
Android
ViewModel
ViewModel
ViewModel
ViewModel
class AppViewModel(private val stopwatchUtil: StopwatchUtil = StopwatchUtil()) : ViewModel()
{
{
val stopwatchState = stopwatchUtil.state
val formattedTimeString = stopwatchUtil.formattedTimeString
fun start() = stopwatchUtil.start()
fun pause() = stopwatchUtil.pause()
fun resume() = stopwatchUtil.resume()
fun reset() = stopwatchUtil.reset()
fun destroy() = stopwatchUtil.destroy()
}
class AppViewModel(private val stopwatchUtil: StopwatchUtil = StopwatchUtil()) : ViewModel()
{
{
val stopwatchState = stopwatchUtil.state
val formattedTimeString = stopwatchUtil.formattedTimeString
fun start() = stopwatchUtil.start()
fun pause() = stopwatchUtil.pause()
fun resume() = stopwatchUtil.resume()
fun reset() = stopwatchUtil.reset()
fun destroy() = stopwatchUtil.destroy()
}
ViewModel
ViewModel ?
ViewModel
class AppViewModel(private val stopwatchUtil: StopwatchUtil = StopwatchUtil()) : ViewModel() {
val stopwatchState = stopwatchUtil.state
val formattedTimeString = stopwatchUtil.formattedTimeString
fun start() = stopwatchUtil.start()
fun pause() = stopwatchUtil.pause()
fun resume() = stopwatchUtil.resume()
fun reset() = stopwatchUtil.reset()
fun destroy() = stopwatchUtil.destroy()
}
ViewModel Android Common
class AppViewModel(private val stopwatchUtil: StopwatchUtil = StopwatchUtil()) : ViewModel()
{
{
val stopwatchState = stopwatchUtil.state
val formattedTimeString = stopwatchUtil.formattedTimeString
fun start() = stopwatchUtil.start()
fun pause() = stopwatchUtil.pause()
fun resume() = stopwatchUtil.resume()
fun reset() = stopwatchUtil.reset()
fun destroy() = stopwatchUtil.destroy()
}
ViewModel
BaseViewModel
Desktop CoroutineScope
destroy() viewMoelScope.cancel()
Android ViewModel
ViewModel viewModelScope
BaseViewModel
Android ViewModel
ViewModel viewModelScope
Desktop CoroutineScope
destroy() viewMoelScope.cancel()
BaseViewModel
Desktop CoroutineScope
destroy() viewMoelScope.cancel()
Android ViewModel
ViewModel viewModelScope
ViewModel
class AppViewModel(private val stopwatchUtil: StopwatchUtil = StopwatchUtil()) : BaseViewModel() {
val stopwatchState = stopwatchUtil.state
val formattedTimeString = stopwatchUtil.formattedTimeString
fun start() = stopwatchUtil.start() // 혹은 suspend로 구현 후 viewModelScope 사용
fun pause() = stopwatchUtil.pause()
fun resume() = stopwatchUtil.resume()
fun reset() = stopwatchUtil.reset()
override fun destroy() {
super.destroy()
stopwatchUtil.destroy()
}
}
AppViewModel Composable
Desktop Configuration
remember ViewModel
DisposableEffect destroy
Android viewModel, viewModels , ViewModelProvider
ViewModel
viewModel() Composable .
androidx.lifecycle:lifecycle-viewmodel-compose:2.6.1
Android viewModel, viewModels , ViewModelProvider
ViewModel
viewModel() Composable .
androidx.lifecycle:lifecycle-viewmodel-compose:2.6.1
AppViewModel Composable
Desktop Configuration
remember ViewModel
DisposableEffect destroy
Desktop Configuration
remember ViewModel
DisposableEffect destroy
AppViewModel Composable
Android viewModel, viewModels , ViewModelProvider
ViewModel
viewModel() Composable .
androidx.lifecycle:lifecycle-viewmodel-compose:2.6.1
Desktop Configuration
remember ViewModel
DisposableEffect destroy
AppViewModel Composable
Android viewModel, viewModels , ViewModelProvider
ViewModel
viewModel() Composable .
androidx.lifecycle:lifecycle-viewmodel-compose:2.6.1
produceState
UI
UI
@Composable
fun App(viewModel: AppViewModel) {
var screenState by rememberSaveable {
mutableStateOf(ScreenState.HOME)
}
val stopwatchState by viewModel.stopwatchState.collectAsState()
val formattedTimeString by viewModel.formattedTimeString.collectAsState()
PangmooTheme {
Surface {
Column(modifier = Modifier.fillMaxSize()) {
Header(title = screenState.title)
when (screenState) {
ScreenState.HOME -> HomeScreen(modifier = Modifier.fillMaxWidth().weight(1f))
ScreenState.STOPWATCH -> StopwatchScreen(
modifier = Modifier.fillMaxWidth().weight(1f),
stopwatchState = stopwatchState,
formattedTimeString = formattedTimeString,
onStart = viewModel::start,
onPause = viewModel::pause,
onResume = viewModel::resume,
onReset = viewModel::reset
)
ScreenState.SETTINGS -> SettingsScreen(modifier = Modifier.fillMaxWidth().weight(1f))
}
MainBottomNavigation(screenState = screenState, onScreenChange = { screenState = it })
}
}
}
}
Preview
Preview
Git Repository
?
?
?
DI - Koin
API - Ktor
RDB ‒ SQLDelight
Kotlinx(Coroutine, Serialization, …)
Reaktive - Rx
And then more…
Awt, Swing ?
• &
• https://holix.com/ch/OnwYAkw8
Jetpack Compose Workspace
Any Question?
Any Question?
.
)
GDG Songdo Organizer
GDSC TUK Core
vnycall74@naver.com
@kisa002
@kisa002
@holykisa

More Related Content

Similar to Compose로 Android:Desktop 멀티플랫폼 만들기.pdf

Asynchronous Programming at Netflix
Asynchronous Programming at NetflixAsynchronous Programming at Netflix
Asynchronous Programming at NetflixC4Media
 
Jetpack Compose - Hands-on February 2020
Jetpack Compose - Hands-on February 2020Jetpack Compose - Hands-on February 2020
Jetpack Compose - Hands-on February 2020Pedro Veloso
 
[22]Efficient and Testable MVVM pattern
[22]Efficient and Testable MVVM pattern[22]Efficient and Testable MVVM pattern
[22]Efficient and Testable MVVM patternNAVER Engineering
 
Google Fit, Android Wear & Xamarin
Google Fit, Android Wear & XamarinGoogle Fit, Android Wear & Xamarin
Google Fit, Android Wear & XamarinPeter Friese
 
Writing Docker monitoring agent with Go
Writing Docker monitoring agent with GoWriting Docker monitoring agent with Go
Writing Docker monitoring agent with GoNaoki AINOYA
 
Kotlin - Coroutine
Kotlin - CoroutineKotlin - Coroutine
Kotlin - CoroutineSean Tsai
 
MOPCON 2014 - Best software architecture in app development
MOPCON 2014 - Best software architecture in app developmentMOPCON 2014 - Best software architecture in app development
MOPCON 2014 - Best software architecture in app developmentanistar sung
 
Tricks to Making a Realtime SurfaceView Actually Perform in Realtime - Maarte...
Tricks to Making a Realtime SurfaceView Actually Perform in Realtime - Maarte...Tricks to Making a Realtime SurfaceView Actually Perform in Realtime - Maarte...
Tricks to Making a Realtime SurfaceView Actually Perform in Realtime - Maarte...DroidConTLV
 
Net conf BG xamarin lecture
Net conf BG xamarin lectureNet conf BG xamarin lecture
Net conf BG xamarin lectureTsvyatko Konov
 
Android Best Practices
Android Best PracticesAndroid Best Practices
Android Best PracticesYekmer Simsek
 
Migrating Objective-C to Swift
Migrating Objective-C to SwiftMigrating Objective-C to Swift
Migrating Objective-C to SwiftElmar Kretzer
 
KMM survival guide: how to tackle struggles between Kotlin and Swift
KMM survival guide: how to tackle struggles between Kotlin and SwiftKMM survival guide: how to tackle struggles between Kotlin and Swift
KMM survival guide: how to tackle struggles between Kotlin and SwiftCommit University
 
Agile Iphone Development
Agile Iphone DevelopmentAgile Iphone Development
Agile Iphone DevelopmentGiordano Scalzo
 
TechShift: There’s light beyond LAMP
TechShift: There’s light beyond LAMPTechShift: There’s light beyond LAMP
TechShift: There’s light beyond LAMPStephen Tallamy
 
Protocol-Oriented Programming in Swift
Protocol-Oriented Programming in SwiftProtocol-Oriented Programming in Swift
Protocol-Oriented Programming in SwiftOleksandr Stepanov
 
Desarrollo para Android con Groovy
Desarrollo para Android con GroovyDesarrollo para Android con Groovy
Desarrollo para Android con GroovySoftware Guru
 
Dicoding Developer Coaching #30: Android | Mengenal Macam-Macam Software Desi...
Dicoding Developer Coaching #30: Android | Mengenal Macam-Macam Software Desi...Dicoding Developer Coaching #30: Android | Mengenal Macam-Macam Software Desi...
Dicoding Developer Coaching #30: Android | Mengenal Macam-Macam Software Desi...DicodingEvent
 
Building Modern Apps using Android Architecture Components
Building Modern Apps using Android Architecture ComponentsBuilding Modern Apps using Android Architecture Components
Building Modern Apps using Android Architecture ComponentsHassan Abid
 

Similar to Compose로 Android:Desktop 멀티플랫폼 만들기.pdf (20)

Asynchronous Programming at Netflix
Asynchronous Programming at NetflixAsynchronous Programming at Netflix
Asynchronous Programming at Netflix
 
Jetpack Compose - Hands-on February 2020
Jetpack Compose - Hands-on February 2020Jetpack Compose - Hands-on February 2020
Jetpack Compose - Hands-on February 2020
 
[22]Efficient and Testable MVVM pattern
[22]Efficient and Testable MVVM pattern[22]Efficient and Testable MVVM pattern
[22]Efficient and Testable MVVM pattern
 
Google Fit, Android Wear & Xamarin
Google Fit, Android Wear & XamarinGoogle Fit, Android Wear & Xamarin
Google Fit, Android Wear & Xamarin
 
Writing Docker monitoring agent with Go
Writing Docker monitoring agent with GoWriting Docker monitoring agent with Go
Writing Docker monitoring agent with Go
 
Kotlin - Coroutine
Kotlin - CoroutineKotlin - Coroutine
Kotlin - Coroutine
 
MOPCON 2014 - Best software architecture in app development
MOPCON 2014 - Best software architecture in app developmentMOPCON 2014 - Best software architecture in app development
MOPCON 2014 - Best software architecture in app development
 
Tricks to Making a Realtime SurfaceView Actually Perform in Realtime - Maarte...
Tricks to Making a Realtime SurfaceView Actually Perform in Realtime - Maarte...Tricks to Making a Realtime SurfaceView Actually Perform in Realtime - Maarte...
Tricks to Making a Realtime SurfaceView Actually Perform in Realtime - Maarte...
 
Net conf BG xamarin lecture
Net conf BG xamarin lectureNet conf BG xamarin lecture
Net conf BG xamarin lecture
 
Android Best Practices
Android Best PracticesAndroid Best Practices
Android Best Practices
 
Migrating Objective-C to Swift
Migrating Objective-C to SwiftMigrating Objective-C to Swift
Migrating Objective-C to Swift
 
KMM survival guide: how to tackle struggles between Kotlin and Swift
KMM survival guide: how to tackle struggles between Kotlin and SwiftKMM survival guide: how to tackle struggles between Kotlin and Swift
KMM survival guide: how to tackle struggles between Kotlin and Swift
 
Agile Iphone Development
Agile Iphone DevelopmentAgile Iphone Development
Agile Iphone Development
 
TechShift: There’s light beyond LAMP
TechShift: There’s light beyond LAMPTechShift: There’s light beyond LAMP
TechShift: There’s light beyond LAMP
 
Protocol-Oriented Programming in Swift
Protocol-Oriented Programming in SwiftProtocol-Oriented Programming in Swift
Protocol-Oriented Programming in Swift
 
Play vs Rails
Play vs RailsPlay vs Rails
Play vs Rails
 
Desarrollo para Android con Groovy
Desarrollo para Android con GroovyDesarrollo para Android con Groovy
Desarrollo para Android con Groovy
 
Dicoding Developer Coaching #30: Android | Mengenal Macam-Macam Software Desi...
Dicoding Developer Coaching #30: Android | Mengenal Macam-Macam Software Desi...Dicoding Developer Coaching #30: Android | Mengenal Macam-Macam Software Desi...
Dicoding Developer Coaching #30: Android | Mengenal Macam-Macam Software Desi...
 
Building Modern Apps using Android Architecture Components
Building Modern Apps using Android Architecture ComponentsBuilding Modern Apps using Android Architecture Components
Building Modern Apps using Android Architecture Components
 
Treinamento Qt básico - aula II
Treinamento Qt básico - aula IITreinamento Qt básico - aula II
Treinamento Qt básico - aula II
 

Recently uploaded

Software and Systems Engineering Standards: Verification and Validation of Sy...
Software and Systems Engineering Standards: Verification and Validation of Sy...Software and Systems Engineering Standards: Verification and Validation of Sy...
Software and Systems Engineering Standards: Verification and Validation of Sy...VICTOR MAESTRE RAMIREZ
 
power system scada applications and uses
power system scada applications and usespower system scada applications and uses
power system scada applications and usesDevarapalliHaritha
 
Concrete Mix Design - IS 10262-2019 - .pptx
Concrete Mix Design - IS 10262-2019 - .pptxConcrete Mix Design - IS 10262-2019 - .pptx
Concrete Mix Design - IS 10262-2019 - .pptxKartikeyaDwivedi3
 
Call Girls Delhi {Jodhpur} 9711199012 high profile service
Call Girls Delhi {Jodhpur} 9711199012 high profile serviceCall Girls Delhi {Jodhpur} 9711199012 high profile service
Call Girls Delhi {Jodhpur} 9711199012 high profile servicerehmti665
 
Application of Residue Theorem to evaluate real integrations.pptx
Application of Residue Theorem to evaluate real integrations.pptxApplication of Residue Theorem to evaluate real integrations.pptx
Application of Residue Theorem to evaluate real integrations.pptx959SahilShah
 
IVE Industry Focused Event - Defence Sector 2024
IVE Industry Focused Event - Defence Sector 2024IVE Industry Focused Event - Defence Sector 2024
IVE Industry Focused Event - Defence Sector 2024Mark Billinghurst
 
Internship report on mechanical engineering
Internship report on mechanical engineeringInternship report on mechanical engineering
Internship report on mechanical engineeringmalavadedarshan25
 
SPICE PARK APR2024 ( 6,793 SPICE Models )
SPICE PARK APR2024 ( 6,793 SPICE Models )SPICE PARK APR2024 ( 6,793 SPICE Models )
SPICE PARK APR2024 ( 6,793 SPICE Models )Tsuyoshi Horigome
 
Current Transformer Drawing and GTP for MSETCL
Current Transformer Drawing and GTP for MSETCLCurrent Transformer Drawing and GTP for MSETCL
Current Transformer Drawing and GTP for MSETCLDeelipZope
 
main PPT.pptx of girls hostel security using rfid
main PPT.pptx of girls hostel security using rfidmain PPT.pptx of girls hostel security using rfid
main PPT.pptx of girls hostel security using rfidNikhilNagaraju
 
OSVC_Meta-Data based Simulation Automation to overcome Verification Challenge...
OSVC_Meta-Data based Simulation Automation to overcome Verification Challenge...OSVC_Meta-Data based Simulation Automation to overcome Verification Challenge...
OSVC_Meta-Data based Simulation Automation to overcome Verification Challenge...Soham Mondal
 
Call Girls Narol 7397865700 Independent Call Girls
Call Girls Narol 7397865700 Independent Call GirlsCall Girls Narol 7397865700 Independent Call Girls
Call Girls Narol 7397865700 Independent Call Girlsssuser7cb4ff
 
Study on Air-Water & Water-Water Heat Exchange in a Finned Tube Exchanger
Study on Air-Water & Water-Water Heat Exchange in a Finned Tube ExchangerStudy on Air-Water & Water-Water Heat Exchange in a Finned Tube Exchanger
Study on Air-Water & Water-Water Heat Exchange in a Finned Tube ExchangerAnamika Sarkar
 
complete construction, environmental and economics information of biomass com...
complete construction, environmental and economics information of biomass com...complete construction, environmental and economics information of biomass com...
complete construction, environmental and economics information of biomass com...asadnawaz62
 
Gurgaon ✡️9711147426✨Call In girls Gurgaon Sector 51 escort service
Gurgaon ✡️9711147426✨Call In girls Gurgaon Sector 51 escort serviceGurgaon ✡️9711147426✨Call In girls Gurgaon Sector 51 escort service
Gurgaon ✡️9711147426✨Call In girls Gurgaon Sector 51 escort servicejennyeacort
 
Artificial-Intelligence-in-Electronics (K).pptx
Artificial-Intelligence-in-Electronics (K).pptxArtificial-Intelligence-in-Electronics (K).pptx
Artificial-Intelligence-in-Electronics (K).pptxbritheesh05
 
Gfe Mayur Vihar Call Girls Service WhatsApp -> 9999965857 Available 24x7 ^ De...
Gfe Mayur Vihar Call Girls Service WhatsApp -> 9999965857 Available 24x7 ^ De...Gfe Mayur Vihar Call Girls Service WhatsApp -> 9999965857 Available 24x7 ^ De...
Gfe Mayur Vihar Call Girls Service WhatsApp -> 9999965857 Available 24x7 ^ De...srsj9000
 

Recently uploaded (20)

Software and Systems Engineering Standards: Verification and Validation of Sy...
Software and Systems Engineering Standards: Verification and Validation of Sy...Software and Systems Engineering Standards: Verification and Validation of Sy...
Software and Systems Engineering Standards: Verification and Validation of Sy...
 
power system scada applications and uses
power system scada applications and usespower system scada applications and uses
power system scada applications and uses
 
Concrete Mix Design - IS 10262-2019 - .pptx
Concrete Mix Design - IS 10262-2019 - .pptxConcrete Mix Design - IS 10262-2019 - .pptx
Concrete Mix Design - IS 10262-2019 - .pptx
 
Call Girls Delhi {Jodhpur} 9711199012 high profile service
Call Girls Delhi {Jodhpur} 9711199012 high profile serviceCall Girls Delhi {Jodhpur} 9711199012 high profile service
Call Girls Delhi {Jodhpur} 9711199012 high profile service
 
young call girls in Rajiv Chowk🔝 9953056974 🔝 Delhi escort Service
young call girls in Rajiv Chowk🔝 9953056974 🔝 Delhi escort Serviceyoung call girls in Rajiv Chowk🔝 9953056974 🔝 Delhi escort Service
young call girls in Rajiv Chowk🔝 9953056974 🔝 Delhi escort Service
 
Application of Residue Theorem to evaluate real integrations.pptx
Application of Residue Theorem to evaluate real integrations.pptxApplication of Residue Theorem to evaluate real integrations.pptx
Application of Residue Theorem to evaluate real integrations.pptx
 
★ CALL US 9953330565 ( HOT Young Call Girls In Badarpur delhi NCR
★ CALL US 9953330565 ( HOT Young Call Girls In Badarpur delhi NCR★ CALL US 9953330565 ( HOT Young Call Girls In Badarpur delhi NCR
★ CALL US 9953330565 ( HOT Young Call Girls In Badarpur delhi NCR
 
IVE Industry Focused Event - Defence Sector 2024
IVE Industry Focused Event - Defence Sector 2024IVE Industry Focused Event - Defence Sector 2024
IVE Industry Focused Event - Defence Sector 2024
 
Exploring_Network_Security_with_JA3_by_Rakesh Seal.pptx
Exploring_Network_Security_with_JA3_by_Rakesh Seal.pptxExploring_Network_Security_with_JA3_by_Rakesh Seal.pptx
Exploring_Network_Security_with_JA3_by_Rakesh Seal.pptx
 
Internship report on mechanical engineering
Internship report on mechanical engineeringInternship report on mechanical engineering
Internship report on mechanical engineering
 
SPICE PARK APR2024 ( 6,793 SPICE Models )
SPICE PARK APR2024 ( 6,793 SPICE Models )SPICE PARK APR2024 ( 6,793 SPICE Models )
SPICE PARK APR2024 ( 6,793 SPICE Models )
 
Current Transformer Drawing and GTP for MSETCL
Current Transformer Drawing and GTP for MSETCLCurrent Transformer Drawing and GTP for MSETCL
Current Transformer Drawing and GTP for MSETCL
 
main PPT.pptx of girls hostel security using rfid
main PPT.pptx of girls hostel security using rfidmain PPT.pptx of girls hostel security using rfid
main PPT.pptx of girls hostel security using rfid
 
OSVC_Meta-Data based Simulation Automation to overcome Verification Challenge...
OSVC_Meta-Data based Simulation Automation to overcome Verification Challenge...OSVC_Meta-Data based Simulation Automation to overcome Verification Challenge...
OSVC_Meta-Data based Simulation Automation to overcome Verification Challenge...
 
Call Girls Narol 7397865700 Independent Call Girls
Call Girls Narol 7397865700 Independent Call GirlsCall Girls Narol 7397865700 Independent Call Girls
Call Girls Narol 7397865700 Independent Call Girls
 
Study on Air-Water & Water-Water Heat Exchange in a Finned Tube Exchanger
Study on Air-Water & Water-Water Heat Exchange in a Finned Tube ExchangerStudy on Air-Water & Water-Water Heat Exchange in a Finned Tube Exchanger
Study on Air-Water & Water-Water Heat Exchange in a Finned Tube Exchanger
 
complete construction, environmental and economics information of biomass com...
complete construction, environmental and economics information of biomass com...complete construction, environmental and economics information of biomass com...
complete construction, environmental and economics information of biomass com...
 
Gurgaon ✡️9711147426✨Call In girls Gurgaon Sector 51 escort service
Gurgaon ✡️9711147426✨Call In girls Gurgaon Sector 51 escort serviceGurgaon ✡️9711147426✨Call In girls Gurgaon Sector 51 escort service
Gurgaon ✡️9711147426✨Call In girls Gurgaon Sector 51 escort service
 
Artificial-Intelligence-in-Electronics (K).pptx
Artificial-Intelligence-in-Electronics (K).pptxArtificial-Intelligence-in-Electronics (K).pptx
Artificial-Intelligence-in-Electronics (K).pptx
 
Gfe Mayur Vihar Call Girls Service WhatsApp -> 9999965857 Available 24x7 ^ De...
Gfe Mayur Vihar Call Girls Service WhatsApp -> 9999965857 Available 24x7 ^ De...Gfe Mayur Vihar Call Girls Service WhatsApp -> 9999965857 Available 24x7 ^ De...
Gfe Mayur Vihar Call Girls Service WhatsApp -> 9999965857 Available 24x7 ^ De...
 

Compose로 Android:Desktop 멀티플랫폼 만들기.pdf