SlideShare a Scribd company logo
1 of 72
Download to read offline
Building maintainable
app with MVP and
Dagger2
KRISTIJAN JURKOVIĆ
ANDROID TEAM LEAD @ INFINUM
We're hiring.
HTTPS://INFINUM.CO/CAREERS
We're an independent
design & development
agency.
INFINUM
• 90+ people in 3 offices
• 15 android developers
• hundreds of projects
OUR BIGGEST ISSUES?
“Sometimes when you fill a vacuum, it still
sucks.”
― Dennis Ritchie
MVP TO THE RESCUE?
PROGRAM TO INTERFACES
NOT IMPLEMENTATIONS
ModelPresenterView
LoginActivity LoginPresenterImpl LoginInteractorImpl
LoginView LoginPresenter LoginInteractor
showLoading()
hideLoading()
setUsernameError()
setPasswordError()
showLoading()
hideLoading()
setUsernameError()
setPasswordError()
login(username, pass)
loginPresenter loginView
loginInteractor
login(username, pass) login(username, pass,
listener)
login(username, pass,
listener)
VIEW PRESENTER MODEL
public interface HomeView {
...
}
public interface HomePresenter {
...
}
public interface CurrencyInteractor {
...
}
VIEW
PRESENTER
MODEL
public interface HomeView {
...
}
VIEW
public class HomeActivity
extends BaseActivity
implements HomeView {
// this is an interface
HomePresenter presenter;
...
}
public interface HomePresenter {
...
}
PRESENTER
public class HomePresenterImpl
implements HomePresenter {
// interface
private HomeView view;
// and another interface
private CurrencyInteractor interactor;
public HomePresenterImpl(
HomeView view, CurrencyInteractor interactor) {
this.view = view;
this.interactor = interactor;
}
...
}
public interface CurrencyInteractor {
...
}
MODEL
public class CurrencyInteractorImpl
implements CurrencyInteractor {
...
}
HOW SHOULD I GET MY
CONTENT?
public interface HomeView {
void showCurrencies(List<Currency> currencies);
}
public interface HomePresenter {
void loadCurrencyList();
}
public interface CurrencyInteractor {
void getCurrencyList(CurrencyListener listener);
}
public class HomeActivity
extends BaseActivity
implements HomeView {
private void init() {
presenter = new HomePresenterImpl(this,
new CurrencyInteractorImpl());
presenter.getCurrencyList();
}
@Override
public void showCurrencies(List<Currency> currencies) {
// display data 

}
}
public class HomePresenterImpl
implements HomePresenter {
...
@Override
public void loadCurrencyList() {
interactor.getCurrencyList(...);
}
}
public class CurrencyInteractorImpl
implements CurrencyInteractor {
...
@Override
public void getCurrencyList(
CurrencyListener listener) {
// do API/DB call
// return result with listener
}
}
VIEW SHOULDN’T CREATE ITS
DEPENDENCIES
DEPENDENCY INJECTION
JSR 330
• 5 annotations - @Named, @Inject, @Qualifier, @Scope,
@Singleton
• 1 interface - Provider<T>
DAGGER2 TO THE RESCUE
DAGGER 2
• @Module, @Provides, @Component, @Subcomponent,
ScopedProvider
• Injection into Fields, Constructors, Methods
• Each @Inject has to have its @Provides
APP COMPONENT
HOST
MODULE
CONVERTER
MODULE
CLIENT
MODULE
LOGGER
MODULE
API
MODULE
GSON
MODULE
APP COMPONENT
HOST
MODULE
CONVERTER
MODULE
CLIENT
MODULE
LOGGER
MODULE
API
MODULE
GSON
MODULE
@Module
public class ApiModule {
@Provides
@Singleton
public ApiService provideApiService(
OkHttpClient client, BaseUrl endpoint,
Converter.Factory converter) {
return RestUtils.createApiService(
client, endpoint, converter,
ApiService.class);
}
}
@Module
public class ApiModule {
@Provides
@Singleton
public ApiService provideApiService(
OkHttpClient client, BaseUrl endpoint,
Converter.Factory converter) {
return RestUtils.createApiService(
client, endpoint, converter,
ApiService.class);
}
}
@Module
public class ApiModule {
@Provides
@Singleton
public ApiService provideApiService(
OkHttpClient client, BaseUrl endpoint,
Converter.Factory converter) {
return RestUtils.createApiService(
client, endpoint, converter,
ApiService.class);
}
}
@Module
public class GsonConverterModule {
@Provides
@Singleton
public Converter.Factory
provideConverter(Gson gson) {
return GsonConverterFactory.create(gson);
}
}
APP COMPONENT
HOST
MODULE
CONVERTER
MODULE
CLIENT
MODULE
LOGGER
MODULE
API
MODULE
GSON
MODULE
EXECUTORS
MODULE
@Component(modules = {
HostModule.class,
GsonConverterModule.class,
ClientModule.class,
LoggerModule.class,
ExecutorsModule.class,
ApiModule.class,
GsonModule.class
})
@Singleton
public interface AppComponent {
}
public class MyApplication extends Application {
protected AppComponent appComponent;
protected void init() {
appComponent = DaggerAppComponent.create();
}
}
HOW CAN WE REUSE THAT
IN OUR ACTIVITIES?
public class HomeActivity
extends BaseActivity
implements HomeView {
private void init() {
presenter = new HomePresenterImpl(this,
new CurrencyInteractorImpl());
presenter.getCurrencyList();
}
@Override
public void showCurrencies(List<Currency> currencies) {
// display data 

}
}
• Inject presenter into view
• Inject view and interactor into presenter
@Module
public class HomeModule {
private HomeView view;
public HomeModule(HomeView view) {
this.view = view;
}
@Provides
public HomeView provideView() {
return view;
}
@Provides
public HomePresenter providePresenter(HomePresenterImpl presenter) {
return presenter;
}
@Provides
public CurrencyInteractor provideInteractor(
CurrencyInteractorImpl interactor) {
return interactor;
}
}
@Module
public class HomeModule {
private HomeView view;
public HomeModule(HomeView view) {
this.view = view;
}
@Provides
public HomeView provideView() {
return view;
}
@Provides
public HomePresenter providePresenter(HomePresenterImpl presenter) {
return presenter;
}
@Provides
public CurrencyInteractor provideInteractor(
CurrencyInteractorImpl interactor) {
return interactor;
}
}
@Module
public class HomeModule {
private HomeView view;
public HomeModule(HomeView view) {
this.view = view;
}
@Provides
public HomeView provideView() {
return view;
}
@Provides
public HomePresenter providePresenter(HomePresenterImpl presenter) {
return presenter;
}
@Provides
public CurrencyInteractor provideInteractor(
CurrencyInteractorImpl interactor) {
return interactor;
}
}
public class CurrencyInteractorImpl
implements CurrencyInteractor {
@Inject
public CurrencyInteractorImpl(ApiService service) {
}
}
public class CurrencyInteractorImpl
implements CurrencyInteractor {
@Inject
public CurrencyInteractorImpl(ApiService service) {
}
}
@Module
public class HomeModule {
private HomeView view;
public HomeModule(HomeView view) {
this.view = view;
}
@Provides
public HomeView provideView() {
return view;
}
@Provides
public HomePresenter providePresenter(HomePresenterImpl presenter) {
return presenter;
}
@Provides
public CurrencyInteractor provideInteractor(
CurrencyInteractorImpl interactor) {
return interactor;
}
}
public class HomePresenterImpl
implements HomePresenter {
@Inject
public HomePresenterImpl(HomeView view,
CurrencyInteractor interactor) {
this.view = view;
this.interactor = interactor;
}
}
public class HomeActivity
extends BaseActivity
implements HomeView {
@Inject
HomePresenter presenter;
}
@Subcomponent(modules = HomeModule.class)
public interface HomeComponent {
void inject(HomeActivity activity);
}
WHAT’S THAT
“SUBCOMPONENT” THING
YOU MENTIONED?
APP COMPONENT
HOST
MODULE
CONVERTER
MODULE
CLIENT
MODULE
LOGGER
MODULE
API
MODULE
GSON
MODULE
HOME
MODULE
HOMECOMPONENT
EXECUTORS
MODULE
@Component(modules = {
...
})
@Singleton
public interface AppComponent {
HomeComponent plus(HomeModule module);
}
public abstract class BaseActivity
extends AppCompatActivity {
Override
protected void onCreate(Bundle savedInstanceState) {
...
injectDependencies(MyApplication.getAppComponent());
}
protected abstract
void injectDependencies(AppComponent appComponent);
}
public class HomeActivity
extends BaseActivity
implements HomeView {
protected void
injectDependencies(AppComponent appComponent) {
appComponent
.plus(new HomeModule(this))
.inject(this);
}
}
APP COMPONENT
HOST
MODULE
CONVERTER
MODULE
CLIENT
MODULE
LOGGER
MODULE
API
MODULE
GSON
MODULE
HOME
MODULE
HOMECOMPONENT
SESSIONCOMPONENT
SESSION
MODULE
EXECUTORS
MODULE
SATISFACTION LEVEL 9001
“If you don’t like testing your product, most
likely your customers won’t like to test it
either.”
APP COMPONENT
HOST
MODULE
CONVERTER
MODULE
CLIENT
MODULE
LOGGER
MODULE
API
MODULE
GSON
MODULE
EXECUTORS
MODULE
APP COMPONENT
HOST
MODULE
CONVERTER
MODULE
CLIENT
MODULE
LOGGER
MODULE
API
MODULE
GSON
MODULE
EXECUTORS
MODULE
APPTESTCOMPONENT
MOCKHOST
MODULE
CONVERTER
MODULE
CLIENT
MODULE
LOGGER
MODULE
API
MODULE
GSON
MODULE
SYNC
EXECUTORS
MODULE
@Component(modules = {
...
MockHostModule.class,
SynchronousExecutorsModule.class,
...
})
@Singleton
public interface AppTestComponent extends AppComponent {
void inject(MyTestApplication app);
}
@Component(modules = {
...
MockHostModule.class,
SynchronousExecutorsModule.class,
...
})
@Singleton
public interface AppTestComponent extends AppComponent {
void inject(MyTestApplication app);
}
@Component(modules = {
...
MockHostModule.class,
SynchronousExecutorsModule.class,
...
})
@Singleton
public interface AppTestComponent extends AppComponent {
void inject(MyTestApplication app);
}
public class MyTestApplication
extends MyApplication
implements TestLifecycleApplication {
@Override
protected void init() {
appComponent = DaggerAppTestComponent.create();
}
}
protected void enqueueResponse(String filename) {
String body = ResourceUtils.readFromFile(filename);
MockResponse mockResponse =
new MockResponse()
.setBody(body)
.setResponseCode(HttpURLConnection.HTTP_OK);
mockWebServer.enqueue(mockResponse);
}
@Override
public void setup() throws Exception {
super.setup();
controller = Robolectric
.buildActivity(MockActivity.class)
.create()
.start()
.resume()
.visible();
fragment = DashboardDrivingModeFragment.newInstance();
controller.get().getSupportFragmentManager()
.beginTransaction()
.replace(R.id.container, fragment, null)
.commit();
ButterKnife.bind(this, fragment.getView());
}
@Test
public void testEmptyStateNotVisible() {
enqueueResponse(“rest-currency-response.json”);
btnCurrencyList.performClick();
assertThat(emptyView).isNotVisible();
}
THINGS TO REMEMBER
• Orientation change
THINGS TO REMEMBER
• Dagger2 is a powerful tool - make good use of it
• Save yourselves from regression bugs
REFERENCES
• http://antonioleiva.com/mvp-android/
• https://medium.com/@czyrux/presenter-surviving-
orientation-changes-with-
loaders-6da6d86ffbbf#.xou7c71uz
• http://frogermcs.github.io/dependency-injection-with-
dagger-2-custom-scopes/
• https://www.youtube.com/watch?v=oK_XtfXPkqw
We're hiring.
HTTPS://INFINUM.CO/CAREERS
Any questions?
KRISTIJAN.JURKOVIC@INFINUM.CO
@KJURKOVIC
Visit infinum.co or find us on social networks:
infinum.co infinumco infinumco infinum

More Related Content

What's hot

Using hilt in a modularized project
Using hilt in a modularized projectUsing hilt in a modularized project
Using hilt in a modularized projectFabio Collini
 
Data Flow Patterns in Angular 2 - Sebastian Müller
Data Flow Patterns in Angular 2 -  Sebastian MüllerData Flow Patterns in Angular 2 -  Sebastian Müller
Data Flow Patterns in Angular 2 - Sebastian MüllerSebastian Holstein
 
Using Dagger in a Clean Architecture project
Using Dagger in a Clean Architecture projectUsing Dagger in a Clean Architecture project
Using Dagger in a Clean Architecture projectFabio Collini
 
Паразитируем на React-экосистеме (Angular 4+) / Алексей Охрименко (IPONWEB)
Паразитируем на React-экосистеме (Angular 4+) / Алексей Охрименко (IPONWEB)Паразитируем на React-экосистеме (Angular 4+) / Алексей Охрименко (IPONWEB)
Паразитируем на React-экосистеме (Angular 4+) / Алексей Охрименко (IPONWEB)Ontico
 
Angular 8
Angular 8 Angular 8
Angular 8 Sunil OS
 
Dagger 2. Right way to do Dependency Injection
Dagger 2. Right way to do Dependency InjectionDagger 2. Right way to do Dependency Injection
Dagger 2. Right way to do Dependency InjectionStfalcon Meetups
 
Dagger 2. The Right Way to Dependency Injections
Dagger 2. The Right Way to Dependency InjectionsDagger 2. The Right Way to Dependency Injections
Dagger 2. The Right Way to Dependency InjectionsGlobalLogic Ukraine
 
Seven Versions of One Web Application
Seven Versions of One Web ApplicationSeven Versions of One Web Application
Seven Versions of One Web ApplicationYakov Fain
 
The productive developer guide to Angular 2
The productive developer guide to Angular 2The productive developer guide to Angular 2
The productive developer guide to Angular 2Maurice De Beijer [MVP]
 
An introduction to Angular2
An introduction to Angular2 An introduction to Angular2
An introduction to Angular2 Apptension
 
AngularJS - dependency injection
AngularJS - dependency injectionAngularJS - dependency injection
AngularJS - dependency injectionAlexe Bogdan
 
Dagger 2 vs koin
Dagger 2 vs koinDagger 2 vs koin
Dagger 2 vs koinJintin Lin
 
Guice tutorial
Guice tutorialGuice tutorial
Guice tutorialAnh Quân
 
Angular 2: core concepts
Angular 2: core conceptsAngular 2: core concepts
Angular 2: core conceptsCodemotion
 
Advanced Dagger talk from 360andev
Advanced Dagger talk from 360andevAdvanced Dagger talk from 360andev
Advanced Dagger talk from 360andevMike Nakhimovich
 

What's hot (20)

Using hilt in a modularized project
Using hilt in a modularized projectUsing hilt in a modularized project
Using hilt in a modularized project
 
Data Flow Patterns in Angular 2 - Sebastian Müller
Data Flow Patterns in Angular 2 -  Sebastian MüllerData Flow Patterns in Angular 2 -  Sebastian Müller
Data Flow Patterns in Angular 2 - Sebastian Müller
 
Angular modules in depth
Angular modules in depthAngular modules in depth
Angular modules in depth
 
Angular Workshop_Sarajevo2
Angular Workshop_Sarajevo2Angular Workshop_Sarajevo2
Angular Workshop_Sarajevo2
 
Using Dagger in a Clean Architecture project
Using Dagger in a Clean Architecture projectUsing Dagger in a Clean Architecture project
Using Dagger in a Clean Architecture project
 
Паразитируем на React-экосистеме (Angular 4+) / Алексей Охрименко (IPONWEB)
Паразитируем на React-экосистеме (Angular 4+) / Алексей Охрименко (IPONWEB)Паразитируем на React-экосистеме (Angular 4+) / Алексей Охрименко (IPONWEB)
Паразитируем на React-экосистеме (Angular 4+) / Алексей Охрименко (IPONWEB)
 
Solid angular
Solid angularSolid angular
Solid angular
 
Angular 8
Angular 8 Angular 8
Angular 8
 
Dagger 2. Right way to do Dependency Injection
Dagger 2. Right way to do Dependency InjectionDagger 2. Right way to do Dependency Injection
Dagger 2. Right way to do Dependency Injection
 
Dagger 2. The Right Way to Dependency Injections
Dagger 2. The Right Way to Dependency InjectionsDagger 2. The Right Way to Dependency Injections
Dagger 2. The Right Way to Dependency Injections
 
Seven Versions of One Web Application
Seven Versions of One Web ApplicationSeven Versions of One Web Application
Seven Versions of One Web Application
 
The productive developer guide to Angular 2
The productive developer guide to Angular 2The productive developer guide to Angular 2
The productive developer guide to Angular 2
 
An introduction to Angular2
An introduction to Angular2 An introduction to Angular2
An introduction to Angular2
 
AngularJS - dependency injection
AngularJS - dependency injectionAngularJS - dependency injection
AngularJS - dependency injection
 
Dagger 2 vs koin
Dagger 2 vs koinDagger 2 vs koin
Dagger 2 vs koin
 
Guice tutorial
Guice tutorialGuice tutorial
Guice tutorial
 
Creating Alloy Widgets
Creating Alloy WidgetsCreating Alloy Widgets
Creating Alloy Widgets
 
Angular 2: core concepts
Angular 2: core conceptsAngular 2: core concepts
Angular 2: core concepts
 
Advanced Dagger talk from 360andev
Advanced Dagger talk from 360andevAdvanced Dagger talk from 360andev
Advanced Dagger talk from 360andev
 
Di code steps
Di code stepsDi code steps
Di code steps
 

Similar to Building maintainable app #droidconzg

Android architecture
Android architecture Android architecture
Android architecture Trong-An Bui
 
Real World Dependency Injection - oscon13
Real World Dependency Injection - oscon13Real World Dependency Injection - oscon13
Real World Dependency Injection - oscon13Stephan Hochdörfer
 
Quick Start to iOS Development
Quick Start to iOS DevelopmentQuick Start to iOS Development
Quick Start to iOS DevelopmentJussi Pohjolainen
 
Real World Dependency Injection - IPC11 Spring Edition
Real World Dependency Injection - IPC11 Spring EditionReal World Dependency Injection - IPC11 Spring Edition
Real World Dependency Injection - IPC11 Spring EditionStephan Hochdörfer
 
1/3 : introduction to CDI - Antoine Sabot-Durand
1/3 : introduction to CDI - Antoine Sabot-Durand1/3 : introduction to CDI - Antoine Sabot-Durand
1/3 : introduction to CDI - Antoine Sabot-DurandSOAT
 
Workshop 13: AngularJS Parte II
Workshop 13: AngularJS Parte IIWorkshop 13: AngularJS Parte II
Workshop 13: AngularJS Parte IIVisual Engineering
 
Introduction to cdi given at java one 2014
Introduction to cdi given at java one 2014Introduction to cdi given at java one 2014
Introduction to cdi given at java one 2014Antoine Sabot-Durand
 
A tour through Swift attributes
A tour through Swift attributesA tour through Swift attributes
A tour through Swift attributesMarco Eidinger
 
Real World Dependency Injection - phpday
Real World Dependency Injection - phpdayReal World Dependency Injection - phpday
Real World Dependency Injection - phpdayStephan Hochdörfer
 
Angular workshop - Full Development Guide
Angular workshop - Full Development GuideAngular workshop - Full Development Guide
Angular workshop - Full Development GuideNitin Giri
 
Proxy Deep Dive JUG Saxony Day 2015-10-02
Proxy Deep Dive JUG Saxony Day 2015-10-02Proxy Deep Dive JUG Saxony Day 2015-10-02
Proxy Deep Dive JUG Saxony Day 2015-10-02Sven Ruppert
 
Parsley & Flex
Parsley & FlexParsley & Flex
Parsley & Flexprideconan
 
Web automation with #d8rules (European Drupal Days 2015)
Web automation with #d8rules (European Drupal Days 2015)Web automation with #d8rules (European Drupal Days 2015)
Web automation with #d8rules (European Drupal Days 2015)Eugenio Minardi
 

Similar to Building maintainable app #droidconzg (20)

Android architecture
Android architecture Android architecture
Android architecture
 
Real World Dependency Injection - oscon13
Real World Dependency Injection - oscon13Real World Dependency Injection - oscon13
Real World Dependency Injection - oscon13
 
Quick Start to iOS Development
Quick Start to iOS DevelopmentQuick Start to iOS Development
Quick Start to iOS Development
 
Real World Dependency Injection - IPC11 Spring Edition
Real World Dependency Injection - IPC11 Spring EditionReal World Dependency Injection - IPC11 Spring Edition
Real World Dependency Injection - IPC11 Spring Edition
 
Google GIN
Google GINGoogle GIN
Google GIN
 
1/3 : introduction to CDI - Antoine Sabot-Durand
1/3 : introduction to CDI - Antoine Sabot-Durand1/3 : introduction to CDI - Antoine Sabot-Durand
1/3 : introduction to CDI - Antoine Sabot-Durand
 
Devoxx 2012 (v2)
Devoxx 2012 (v2)Devoxx 2012 (v2)
Devoxx 2012 (v2)
 
S313937 cdi dochez
S313937 cdi dochezS313937 cdi dochez
S313937 cdi dochez
 
CDI in JEE6
CDI in JEE6CDI in JEE6
CDI in JEE6
 
Workshop 13: AngularJS Parte II
Workshop 13: AngularJS Parte IIWorkshop 13: AngularJS Parte II
Workshop 13: AngularJS Parte II
 
Introduction to cdi given at java one 2014
Introduction to cdi given at java one 2014Introduction to cdi given at java one 2014
Introduction to cdi given at java one 2014
 
Introduction to CDI
Introduction to CDIIntroduction to CDI
Introduction to CDI
 
A tour through Swift attributes
A tour through Swift attributesA tour through Swift attributes
A tour through Swift attributes
 
Angular Dependency Injection
Angular Dependency InjectionAngular Dependency Injection
Angular Dependency Injection
 
Real World Dependency Injection - phpday
Real World Dependency Injection - phpdayReal World Dependency Injection - phpday
Real World Dependency Injection - phpday
 
Angular workshop - Full Development Guide
Angular workshop - Full Development GuideAngular workshop - Full Development Guide
Angular workshop - Full Development Guide
 
Proxy Deep Dive JUG Saxony Day 2015-10-02
Proxy Deep Dive JUG Saxony Day 2015-10-02Proxy Deep Dive JUG Saxony Day 2015-10-02
Proxy Deep Dive JUG Saxony Day 2015-10-02
 
What is your money doing?
What is your money doing?What is your money doing?
What is your money doing?
 
Parsley & Flex
Parsley & FlexParsley & Flex
Parsley & Flex
 
Web automation with #d8rules (European Drupal Days 2015)
Web automation with #d8rules (European Drupal Days 2015)Web automation with #d8rules (European Drupal Days 2015)
Web automation with #d8rules (European Drupal Days 2015)
 

Recently uploaded

Vertex AI Gemini Prompt Engineering Tips
Vertex AI Gemini Prompt Engineering TipsVertex AI Gemini Prompt Engineering Tips
Vertex AI Gemini Prompt Engineering TipsMiki Katsuragi
 
CloudStudio User manual (basic edition):
CloudStudio User manual (basic edition):CloudStudio User manual (basic edition):
CloudStudio User manual (basic edition):comworks
 
Nell’iperspazio con Rocket: il Framework Web di Rust!
Nell’iperspazio con Rocket: il Framework Web di Rust!Nell’iperspazio con Rocket: il Framework Web di Rust!
Nell’iperspazio con Rocket: il Framework Web di Rust!Commit University
 
Story boards and shot lists for my a level piece
Story boards and shot lists for my a level pieceStory boards and shot lists for my a level piece
Story boards and shot lists for my a level piececharlottematthew16
 
Commit 2024 - Secret Management made easy
Commit 2024 - Secret Management made easyCommit 2024 - Secret Management made easy
Commit 2024 - Secret Management made easyAlfredo García Lavilla
 
Dev Dives: Streamline document processing with UiPath Studio Web
Dev Dives: Streamline document processing with UiPath Studio WebDev Dives: Streamline document processing with UiPath Studio Web
Dev Dives: Streamline document processing with UiPath Studio WebUiPathCommunity
 
WordPress Websites for Engineers: Elevate Your Brand
WordPress Websites for Engineers: Elevate Your BrandWordPress Websites for Engineers: Elevate Your Brand
WordPress Websites for Engineers: Elevate Your Brandgvaughan
 
Artificial intelligence in cctv survelliance.pptx
Artificial intelligence in cctv survelliance.pptxArtificial intelligence in cctv survelliance.pptx
Artificial intelligence in cctv survelliance.pptxhariprasad279825
 
AI as an Interface for Commercial Buildings
AI as an Interface for Commercial BuildingsAI as an Interface for Commercial Buildings
AI as an Interface for Commercial BuildingsMemoori
 
Bun (KitWorks Team Study 노별마루 발표 2024.4.22)
Bun (KitWorks Team Study 노별마루 발표 2024.4.22)Bun (KitWorks Team Study 노별마루 발표 2024.4.22)
Bun (KitWorks Team Study 노별마루 발표 2024.4.22)Wonjun Hwang
 
Unleash Your Potential - Namagunga Girls Coding Club
Unleash Your Potential - Namagunga Girls Coding ClubUnleash Your Potential - Namagunga Girls Coding Club
Unleash Your Potential - Namagunga Girls Coding ClubKalema Edgar
 
Developer Data Modeling Mistakes: From Postgres to NoSQL
Developer Data Modeling Mistakes: From Postgres to NoSQLDeveloper Data Modeling Mistakes: From Postgres to NoSQL
Developer Data Modeling Mistakes: From Postgres to NoSQLScyllaDB
 
New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024BookNet Canada
 
My Hashitalk Indonesia April 2024 Presentation
My Hashitalk Indonesia April 2024 PresentationMy Hashitalk Indonesia April 2024 Presentation
My Hashitalk Indonesia April 2024 PresentationRidwan Fadjar
 
Tampa BSides - Chef's Tour of Microsoft Security Adoption Framework (SAF)
Tampa BSides - Chef's Tour of Microsoft Security Adoption Framework (SAF)Tampa BSides - Chef's Tour of Microsoft Security Adoption Framework (SAF)
Tampa BSides - Chef's Tour of Microsoft Security Adoption Framework (SAF)Mark Simos
 
Connect Wave/ connectwave Pitch Deck Presentation
Connect Wave/ connectwave Pitch Deck PresentationConnect Wave/ connectwave Pitch Deck Presentation
Connect Wave/ connectwave Pitch Deck PresentationSlibray Presentation
 
Ensuring Technical Readiness For Copilot in Microsoft 365
Ensuring Technical Readiness For Copilot in Microsoft 365Ensuring Technical Readiness For Copilot in Microsoft 365
Ensuring Technical Readiness For Copilot in Microsoft 3652toLead Limited
 
Automating Business Process via MuleSoft Composer | Bangalore MuleSoft Meetup...
Automating Business Process via MuleSoft Composer | Bangalore MuleSoft Meetup...Automating Business Process via MuleSoft Composer | Bangalore MuleSoft Meetup...
Automating Business Process via MuleSoft Composer | Bangalore MuleSoft Meetup...shyamraj55
 
"LLMs for Python Engineers: Advanced Data Analysis and Semantic Kernel",Oleks...
"LLMs for Python Engineers: Advanced Data Analysis and Semantic Kernel",Oleks..."LLMs for Python Engineers: Advanced Data Analysis and Semantic Kernel",Oleks...
"LLMs for Python Engineers: Advanced Data Analysis and Semantic Kernel",Oleks...Fwdays
 

Recently uploaded (20)

Vertex AI Gemini Prompt Engineering Tips
Vertex AI Gemini Prompt Engineering TipsVertex AI Gemini Prompt Engineering Tips
Vertex AI Gemini Prompt Engineering Tips
 
CloudStudio User manual (basic edition):
CloudStudio User manual (basic edition):CloudStudio User manual (basic edition):
CloudStudio User manual (basic edition):
 
Nell’iperspazio con Rocket: il Framework Web di Rust!
Nell’iperspazio con Rocket: il Framework Web di Rust!Nell’iperspazio con Rocket: il Framework Web di Rust!
Nell’iperspazio con Rocket: il Framework Web di Rust!
 
Story boards and shot lists for my a level piece
Story boards and shot lists for my a level pieceStory boards and shot lists for my a level piece
Story boards and shot lists for my a level piece
 
Commit 2024 - Secret Management made easy
Commit 2024 - Secret Management made easyCommit 2024 - Secret Management made easy
Commit 2024 - Secret Management made easy
 
Dev Dives: Streamline document processing with UiPath Studio Web
Dev Dives: Streamline document processing with UiPath Studio WebDev Dives: Streamline document processing with UiPath Studio Web
Dev Dives: Streamline document processing with UiPath Studio Web
 
WordPress Websites for Engineers: Elevate Your Brand
WordPress Websites for Engineers: Elevate Your BrandWordPress Websites for Engineers: Elevate Your Brand
WordPress Websites for Engineers: Elevate Your Brand
 
Artificial intelligence in cctv survelliance.pptx
Artificial intelligence in cctv survelliance.pptxArtificial intelligence in cctv survelliance.pptx
Artificial intelligence in cctv survelliance.pptx
 
AI as an Interface for Commercial Buildings
AI as an Interface for Commercial BuildingsAI as an Interface for Commercial Buildings
AI as an Interface for Commercial Buildings
 
Bun (KitWorks Team Study 노별마루 발표 2024.4.22)
Bun (KitWorks Team Study 노별마루 발표 2024.4.22)Bun (KitWorks Team Study 노별마루 발표 2024.4.22)
Bun (KitWorks Team Study 노별마루 발표 2024.4.22)
 
Unleash Your Potential - Namagunga Girls Coding Club
Unleash Your Potential - Namagunga Girls Coding ClubUnleash Your Potential - Namagunga Girls Coding Club
Unleash Your Potential - Namagunga Girls Coding Club
 
Developer Data Modeling Mistakes: From Postgres to NoSQL
Developer Data Modeling Mistakes: From Postgres to NoSQLDeveloper Data Modeling Mistakes: From Postgres to NoSQL
Developer Data Modeling Mistakes: From Postgres to NoSQL
 
New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
 
Hot Sexy call girls in Panjabi Bagh 🔝 9953056974 🔝 Delhi escort Service
Hot Sexy call girls in Panjabi Bagh 🔝 9953056974 🔝 Delhi escort ServiceHot Sexy call girls in Panjabi Bagh 🔝 9953056974 🔝 Delhi escort Service
Hot Sexy call girls in Panjabi Bagh 🔝 9953056974 🔝 Delhi escort Service
 
My Hashitalk Indonesia April 2024 Presentation
My Hashitalk Indonesia April 2024 PresentationMy Hashitalk Indonesia April 2024 Presentation
My Hashitalk Indonesia April 2024 Presentation
 
Tampa BSides - Chef's Tour of Microsoft Security Adoption Framework (SAF)
Tampa BSides - Chef's Tour of Microsoft Security Adoption Framework (SAF)Tampa BSides - Chef's Tour of Microsoft Security Adoption Framework (SAF)
Tampa BSides - Chef's Tour of Microsoft Security Adoption Framework (SAF)
 
Connect Wave/ connectwave Pitch Deck Presentation
Connect Wave/ connectwave Pitch Deck PresentationConnect Wave/ connectwave Pitch Deck Presentation
Connect Wave/ connectwave Pitch Deck Presentation
 
Ensuring Technical Readiness For Copilot in Microsoft 365
Ensuring Technical Readiness For Copilot in Microsoft 365Ensuring Technical Readiness For Copilot in Microsoft 365
Ensuring Technical Readiness For Copilot in Microsoft 365
 
Automating Business Process via MuleSoft Composer | Bangalore MuleSoft Meetup...
Automating Business Process via MuleSoft Composer | Bangalore MuleSoft Meetup...Automating Business Process via MuleSoft Composer | Bangalore MuleSoft Meetup...
Automating Business Process via MuleSoft Composer | Bangalore MuleSoft Meetup...
 
"LLMs for Python Engineers: Advanced Data Analysis and Semantic Kernel",Oleks...
"LLMs for Python Engineers: Advanced Data Analysis and Semantic Kernel",Oleks..."LLMs for Python Engineers: Advanced Data Analysis and Semantic Kernel",Oleks...
"LLMs for Python Engineers: Advanced Data Analysis and Semantic Kernel",Oleks...
 

Building maintainable app #droidconzg