SlideShare a Scribd company logo
1 of 90
Youdon’tknowangular@joshj
You.
Don’t.
Know.
Angular.
Youdon’tknowangular@joshj
#01
Mobile Architect //
Transamerica
Mobile Architect,
Entrepreneur, FPV
Pilot & Whiskey Fan.
INTR.
ODU.
CTI.
ON.
Youdon’tknowangular@joshj
You.
Don’t.
Know.
Angular.
Youdon’tknowangular@joshj
Youdon’tknowangular@joshj
Money comes raining
down and life is as it
should be…
Youdon’tknowangular@joshj
Usually it’s this…
Youdon’tknowangular@joshj
Youdon’tknowangular@joshj
Architecture.
“…in the end, architecture boils down to
whatever the important stuff is.”
- Martin Fowler
Youdon’tknowangular@joshj
Architecture.
“the decisions that are hard to change”
Youdon’tknowangular@joshj
Architecture.
• Code Craftsmanship
• Flow Strategies
• I/O Strategies
• Readability
Youdon’tknowangular@joshj
Think Like an
Architect.
Youdon’tknowangular@joshj
Youdon’tknowangular@joshj
Craftsmanship
Code
Youdon’tknowangular@joshj
Code.
Crafts.
man.
ship.
Find ways to love the code you
are working on.
Youdon’tknowangular@joshj
Build a working document your
team can get behind.
Code.
Crafts.
man.
ship.
Youdon’tknowangular@joshj
If you have a team: Have
training / idea sharing times.
(If not, take a class)
Code.
Crafts.
man.
ship.
Youdon’tknowangular@joshj
Be a Zen Master Architect.
Code.
Crafts.
man.
ship.
Youdon’tknowangular@joshj
FlowStrategies
#03
Youdon’tknowangular@joshj
Nomenclature
Almost anything can be a service. A service is typically a class with a narrow,
well-defined purpose. It should do something specific and do it well.
Service
The component or set of methods that will be using our service.
Consumer
Youdon’tknowangular@joshj
Bicycle Wheel
Flow.
stra.
teg.
ies.
Youdon’tknowangular@joshj
Bicycle Wheel
Service
Flow.
stra.
teg.
ies.
Youdon’tknowangular@joshj
Bicycle Wheel
Service
Consumers
Flow.
stra.
teg.
ies.
Youdon’tknowangular@joshj
Flow.
stra.
teg.
ies.
export	class	Logger	{	
		log(msg:	any)			{	console.log(msg);	}	
		error(msg:	any)	{	console.error(msg);	}	
		warn(msg:	any)		{	console.warn(msg);	}	
}Service
Consumer
export	class	HeroService	{	
		private	heroes:	Hero[]	=	[];	
		constructor(	
				private	backend:	BackendService,	
				private	logger:	Logger	
		)	{	}	
		getHeroes()	{	
				this.backend.getAll(Hero).then(	(heroes:	Hero[])	=>	{	
						this.logger.log(`Fetched	${heroes.length}	heroes.`);	
						this.heroes.push(...heroes);	//	fill	cache	
				});	
				return	this.heroes;	
		}	
}
Youdon’tknowangular@joshj
Bicycle Wheel
Service
Consumers
Flow.
stra.
teg.
ies.
Youdon’tknowangular@joshj
Flow.
stra.
teg.
ies.
Bicycle Wheel
Service
Consumers
Consumers
Consumers
Consumers
Consumers
Youdon’tknowangular@joshj
Bicycle Wheel
Flow.
stra.
teg.
ies.
Youdon’tknowangular@joshj
Flow.
stra.
teg.
ies.
import	{	NgModule	}						from	'@angular/core';	
import	{	BrowserModule	}	from	'@angular/platform-browser';	
@NgModule({	
		imports:						[	BrowserModule	],	
		providers:				[	Logger	],	
		declarations:	[	AppComponent	],	
		exports:						[	AppComponent	],	
		bootstrap:				[	AppComponent	]	
})	
export	class	AppModule	{	}
Service
Youdon’tknowangular@joshj
Bicycle Wheel
Flow.
stra.
teg.
ies.
Youdon’tknowangular@joshj
Flow.
stra.
teg.
ies.
Bicycle Wheel
Youdon’tknowangular@joshj
Waterfall
Flow.
stra.
teg.
ies.
Youdon’tknowangular@joshj
Waterfall
ServiceFlow.
stra.
teg.
ies.
Youdon’tknowangular@joshj
Service NavControllerFlow.
stra.
teg.
ies.
Youdon’tknowangular@joshj
Flow.
stra.
teg.
ies.
Youdon’tknowangular@joshj
Don’t Use Events(Unless you absolutely have to…)
Youdon’tknowangular@joshj
Flow.
stra.
teg.
ies.
Waterfall
Service NavController
Youdon’tknowangular@joshj
Flow.
stra.
teg.
ies.
Waterfall
Service
Consumer
NavController
PageComponent
Youdon’tknowangular@joshj
Flow.
stra.
teg.
ies.
Waterfall
Service
Consumer
Consumer Child
NavController
PageComponent
ButtonComponent
Youdon’tknowangular@joshj
@Injectable()	
export	class	NavigationService	{	
		public	navigate()	{	
				//	Do	something	
		}	
}
Service
Youdon’tknowangular@joshj
@Injectable()	
export	class	NavigationService	{	
		public	navigate()	{	
				//	Do	something	
		}	
}
export	class	MyPageComponent		{	
		constructor	(	
				private	navigationService:	NavigationService	
		)	{}	
}
<nav-button	[navigationService]="navigationService">
Service
Consumer
Youdon’tknowangular@joshj
@Injectable()	
export	class	NavigationService	{	
		public	navigate()	{	
				//	Do	something	
		}	
}
export	class	MyPageComponent		{	
		constructor	(	
				private	navigationService:	NavigationService	
		)	{}	
}
export	class	NavButtonComponent		{	
		@Input()	navigationService:	NavigationService;	
		onButtonClick()	{	
				this.navigationService.navigate();	
	}	
}
<nav-button	[navigationService]="navigationService">
Service
Consumer
Consumer Child
Youdon’tknowangular@joshj
import	{	NavigationService	}	from	'./shared/navigation.service';	
@Component({	
		selector:	'nav-button',	
		template:	`<button	(click)="navigationService.navigate()">Navigate</button>`	
})	
export	class	NavButtonComponent		{	
		@Input()	navigationService:	NavigationService;	
}
Youdon’tknowangular@joshj
Flow.
stra.
teg.
ies.
Waterfall
Service
Consumer
Consumer Child
NavController
PageComponent
ButtonComponent
Youdon’tknowangular@joshj
Flow.
stra.
teg.
ies.
The Molecule
Youdon’tknowangular@joshj
Flow.
stra.
teg.
ies.
https://angular-realworld.stackblitz.io
Modular
Youdon’tknowangular@joshj
Flow.
stra.
teg.
ies.
https://angular.io/guide/ngmodule
NgModules
Youdon’tknowangular@joshj
Flow.
stra.
teg.
ies.
Functional
Blocks
Shared
Youdon’tknowangular@joshj
Flow.
stra.
teg.
ies.
Shared
Youdon’tknowangular@joshj
Flow.
stra.
teg.
ies. export	*	from	'./article-helpers';	
export	*	from	'./buttons';	
export	*	from	'./layout';	
export	*	from	'./list-errors.component';	
export	*	from	'./models';	
export	*	from	'./services';	
export	*	from	'./shared.module';	
export	*	from	'./show-authed.directive';
Youdon’tknowangular@joshj
Flow.
stra.
teg.
ies.
import	{	ArticleListComponent	}	from	'../shared';
import	{	ArticleListComponent	}	from	'../shared/article-
helpers/article-list.component';
Youdon’tknowangular@joshj
Flow.
stra.
teg.
ies.
Module
Folder
Youdon’tknowangular@joshj
Flow.
stra.
teg.
ies.
• Organized
• Easy to reference
• Self contained
• Safer for teams
Benefits
Youdon’tknowangular@joshj
Flow.
stra.
teg.
ies.
Module
Youdon’tknowangular@joshj
Flow.
stra.
teg.
ies.
NgAppModule
import	{	NgModule	}	from	'@angular/core';	
import	{	BrowserModule	}	from	'@angular/platform-browser';	
import	{	FormsModule	}	from	'@angular/forms';	
import	{	AppComponent	}	from	'./app.component';	
import	{	HelloComponent	}	from	'./hello.component';	
import	{	NavButtonComponent	}	from	'./nav-
button.component';	
@NgModule({	
		imports:						[	BrowserModule,	FormsModule	],	
		declarations:	[	AppComponent,	HelloComponent,	
NavButtonComponent],	
		bootstrap:				[	AppComponent	]	
})	
export	class	AppModule	{	}
Youdon’tknowangular@joshj
Flow.
stra.
teg.
ies. Imports
Youdon’tknowangular@joshj
Flow.
stra.
teg.
ies.
Imports
@NgModule({	
		imports:						[	BrowserModule,	FormsModule	],	
		declarations:	[	AppComponent,	HelloComponent,	
NavButtonComponent],	
		bootstrap:				[	AppComponent	]	
})	
export	class	AppModule	{	}
Youdon’tknowangular@joshj
Flow.
stra.
teg.
ies.
Imports
import	{	ArticleModule	}	from	'./article/article.module';	
@NgModule({	
		declarations:	[],					
		imports:	[	
				ArticleModule,	
		],	
		providers:	[],	
		bootstrap:	[AppComponent]	
})	
export	class	AppModule	{	}
Youdon’tknowangular@joshj
Flow.
stra.
teg.
ies.
import	{	ModuleWithProviders,	NgModule	}	from	'@angular/
core';	
import	{	RouterModule	}	from	'@angular/router';	
import	{	ArticleComponent	}	from	'./article.component';	
import	{	ArticleCommentComponent	}	from	'./article-
comment.component';	
import	{	ArticleResolver	}	from	'./article-
resolver.service';	
import	{	MarkdownPipe	}	from	'./markdown.pipe';	
import	{	SharedModule	}	from	'../shared';
article.module.ts
Youdon’tknowangular@joshj
Flow.
stra.
teg.
ies.
const	articleRouting:	ModuleWithProviders	=	
RouterModule.forChild([	
		{	
				path:	'article/:slug',	
				component:	ArticleComponent,	
				resolve:	{	
						article:	ArticleResolver	
				}	
		}	
]);
article.module.ts
Youdon’tknowangular@joshj
Flow.
stra.
teg.
ies.
@NgModule({	
		imports:	[	
				articleRouting,	
				SharedModule	
		],	
		declarations:	[	
				ArticleComponent,	
				ArticleCommentComponent,	
				MarkdownPipe	
		],	
		providers:	[	
				ArticleResolver	
		]	
})	
export	class	ArticleModule	{}	
article.module.ts
Youdon’tknowangular@joshj
Flow.
stra.
teg.
ies.
https://angular.io/guide/ngmodule
NgModules
Youdon’tknowangular@joshj
Flow.
stra.
teg.
ies.
https://angular-realworld.stackblitz.io
Molecule
Youdon’tknowangular@joshj
I/O Stratagies.
Youdon’tknowangular@joshj
#01
Whenever data
enters or leaves the
application have a
strategy for hiding
the source or the
target from the
application as a
whole.
I/O
Stratagies.
Youdon’tknowangular@joshj
I/O Stratagies.
Youdon’tknowangular@joshj
I/O Stratagies.
Components
Services
Adapters
Youdon’tknowangular@joshj
I/O.
stra.
teg.
ies.
Article Component http()
Youdon’tknowangular@joshj
I/O.
stra.
teg.
ies.
Article Component
Article Service http()
getArticles()
Youdon’tknowangular@joshj
I/O.
stra.
teg.
ies.
Article Component
API Service http()
getArticles()
this.apiService.get()Article Service
Youdon’tknowangular@joshj
I/O.
stra.
teg.
ies.
Article Component
ApiService
apiHttpStrategy
getArticles()
this.apiService.get()Article Service
apiFileStrategy
Youdon’tknowangular@joshj
@NgModule({	
		declarations:	[	
		],	
		imports:	[	
		],	
		providers:	[	
				{	
						provide:	ApiService,	
						useFactory:	(http:	Http,	jwtService:	JwtService)	=>	{	
								if	(environment.production)	{	
										return	new	ApiService(http,	jwtService);	
								}	else	{	
										return	new	MockApiService(http,	jwtService);	
								}	
						},	
						deps:	[Http,	JwtService]	
				}	
		],	
		bootstrap:	[AppComponent]	
});	
I/O.
stra.
teg.
ies.
Youdon’tknowangular@joshj
I/O Stratagies.
Components
Services
Adapters
Youdon’tknowangular@joshj
I/O.
stra.
teg.
ies.
Article Component http()
Youdon’tknowangular@joshj
I/O.
stra.
teg.
ies.
Article Component
Analytics Service http()
event()
Youdon’tknowangular@joshj
I/O.
stra.
teg.
ies.
Article Component
Analytics Service event()
this.analytics.event()
Google Strategy http()
Youdon’tknowangular@joshj
I/O.
stra.
teg.
ies.
Article Component
Analytics Service
Crashlytics Firebase
event()
this.analytics.event()
Youdon’tknowangular@joshj
export	class	AnalyticsService	{	
		private	strategies:	Array<any>	
		constructor(	
				private	crashlyticsAnalytics:	CrashlyticsAnalyticsService,	
				private	firebaseAnalyticsService:	FirebaseAnalyticsService,	
				private	googleAnalyticsService:	GoogleAnalyticsService	
		)	{	
				this.strategies	=	[	
						crashlyticsAnalytics,	
						firebaseAnalyticsService,	
						googleAnalyticsService	
				]	
		};	
		public	event()	{	
				for	(let	strategy	of	this.strategies)	{	
						strategy.event();	
				}	
		};	
}
Youdon’tknowangular@joshj
I/O Stratagies.
Youdon’tknowangular@joshj
Readability
Youdon’tknowangular@joshj
“Any fool can write code that a
computer can understand. Good
programmers write code that humans
can understand.”
Martin Fowler
Youdon’tknowangular@joshj
I/O.
stra.
teg.
ies.
The rule of
“huh”
Youdon’tknowangular@joshj
I/O.
stra.
teg.
ies.
L.I.F.T
• Locate
• Identify
• Flat
• Try to be DRY
Youdon’tknowangular@joshj
I/O.
stra.
teg.
ies.
Import line spacing
import	{	Injectable	}	from	'@angular/core';	
import	{	Http	}							from	'@angular/http';	
import	{	Hero	}	from	'./hero.model';	
import	{	ExceptionService}	from	'../../core';
Youdon’tknowangular@joshj
I/O.
stra.
teg.
ies.
Component
Selector
Names
selector:	'toh-hero-button',
<toh-hero-button></toh-hero-button>
Youdon’tknowangular@joshj
I/O.
stra.
teg.
ies.
Don’t Abbreviate your
constructor arguments or
instantiated classes.
constructor(	
				private	navigationService:	NavigationService,	
				private	myElementReference:	MyElementReference	
)	{	
				this.fooAwesome	=	new	FooAwesome();	
};
Youdon’tknowangular@joshj
I/O.
stra.
teg.
ies.
constructor(	
				private	navServ:	NavigationService,	
				private	el:	MyElementReference	
)	{	
				this.foo	=	new	FooAwesome();	
};	
No…
Youdon’tknowangular@joshj
I/O.
stra.
teg.
ies.
Small Functions
		private	specificTask()	{	
				var	doSomethingWell	=	true;	
				var	doSomethingSpecific	=	true;	
				return	(doSomethingWell	&&	doSomethingSpecific);	
		}
Youdon’tknowangular@joshj
I/O.
stra.
teg.
ies.
Use a Code Tool
Youdon’tknowangular@joshj
I/O.
stra.
teg.
ies.
Use Semicolons;
seriously.
Youdon’tknowangular@joshj
Think Like an
Architect.
Youdon’tknowangular@joshj
END.
@joshj //
joshjensen.com

More Related Content

Recently uploaded

Microsoft365_Dev_Security_2024_05_16.pdf
Microsoft365_Dev_Security_2024_05_16.pdfMicrosoft365_Dev_Security_2024_05_16.pdf
Microsoft365_Dev_Security_2024_05_16.pdfMarkus Moeller
 
OpenChain Webinar: AboutCode and Beyond - End-to-End SCA
OpenChain Webinar: AboutCode and Beyond - End-to-End SCAOpenChain Webinar: AboutCode and Beyond - End-to-End SCA
OpenChain Webinar: AboutCode and Beyond - End-to-End SCAShane Coughlan
 
architecting-ai-in-the-enterprise-apis-and-applications.pdf
architecting-ai-in-the-enterprise-apis-and-applications.pdfarchitecting-ai-in-the-enterprise-apis-and-applications.pdf
architecting-ai-in-the-enterprise-apis-and-applications.pdfWSO2
 
Community is Just as Important as Code by Andrea Goulet
Community is Just as Important as Code by Andrea GouletCommunity is Just as Important as Code by Andrea Goulet
Community is Just as Important as Code by Andrea GouletAndrea Goulet
 
Modern binary build systems - PyCon 2024
Modern binary build systems - PyCon 2024Modern binary build systems - PyCon 2024
Modern binary build systems - PyCon 2024Henry Schreiner
 
Your Ultimate Web Studio for Streaming Anywhere | Evmux
Your Ultimate Web Studio for Streaming Anywhere | EvmuxYour Ultimate Web Studio for Streaming Anywhere | Evmux
Your Ultimate Web Studio for Streaming Anywhere | Evmuxevmux96
 
Evolving Data Governance for the Real-time Streaming and AI Era
Evolving Data Governance for the Real-time Streaming and AI EraEvolving Data Governance for the Real-time Streaming and AI Era
Evolving Data Governance for the Real-time Streaming and AI Eraconfluent
 
Incident handling is a clearly defined set of procedures to manage and respon...
Incident handling is a clearly defined set of procedures to manage and respon...Incident handling is a clearly defined set of procedures to manage and respon...
Incident handling is a clearly defined set of procedures to manage and respon...Varun Mithran
 
Anypoint Code Builder - Munich MuleSoft Meetup - 16th May 2024
Anypoint Code Builder - Munich MuleSoft Meetup - 16th May 2024Anypoint Code Builder - Munich MuleSoft Meetup - 16th May 2024
Anypoint Code Builder - Munich MuleSoft Meetup - 16th May 2024MulesoftMunichMeetup
 
Encryption Recap: A Refresher on Key Concepts
Encryption Recap: A Refresher on Key ConceptsEncryption Recap: A Refresher on Key Concepts
Encryption Recap: A Refresher on Key Conceptsthomashtkim
 
[GeeCON2024] How I learned to stop worrying and love the dark silicon apocalypse
[GeeCON2024] How I learned to stop worrying and love the dark silicon apocalypse[GeeCON2024] How I learned to stop worrying and love the dark silicon apocalypse
[GeeCON2024] How I learned to stop worrying and love the dark silicon apocalypseTomasz Kowalczewski
 
Workshop - Architecting Innovative Graph Applications- GraphSummit Milan
Workshop -  Architecting Innovative Graph Applications- GraphSummit MilanWorkshop -  Architecting Innovative Graph Applications- GraphSummit Milan
Workshop - Architecting Innovative Graph Applications- GraphSummit MilanNeo4j
 
The mythical technical debt. (Brooke, please, forgive me)
The mythical technical debt. (Brooke, please, forgive me)The mythical technical debt. (Brooke, please, forgive me)
The mythical technical debt. (Brooke, please, forgive me)Roberto Bettazzoni
 
Automate your OpenSIPS config tests - OpenSIPS Summit 2024
Automate your OpenSIPS config tests - OpenSIPS Summit 2024Automate your OpenSIPS config tests - OpenSIPS Summit 2024
Automate your OpenSIPS config tests - OpenSIPS Summit 2024Andreas Granig
 
From Theory to Practice: Utilizing SpiraPlan's REST API
From Theory to Practice: Utilizing SpiraPlan's REST APIFrom Theory to Practice: Utilizing SpiraPlan's REST API
From Theory to Practice: Utilizing SpiraPlan's REST APIInflectra
 
Test Automation Design Patterns_ A Comprehensive Guide.pdf
Test Automation Design Patterns_ A Comprehensive Guide.pdfTest Automation Design Patterns_ A Comprehensive Guide.pdf
Test Automation Design Patterns_ A Comprehensive Guide.pdfkalichargn70th171
 
Spring into AI presented by Dan Vega 5/14
Spring into AI presented by Dan Vega 5/14Spring into AI presented by Dan Vega 5/14
Spring into AI presented by Dan Vega 5/14VMware Tanzu
 

Recently uploaded (20)

Microsoft365_Dev_Security_2024_05_16.pdf
Microsoft365_Dev_Security_2024_05_16.pdfMicrosoft365_Dev_Security_2024_05_16.pdf
Microsoft365_Dev_Security_2024_05_16.pdf
 
Abortion Pill Prices Germiston ](+27832195400*)[ 🏥 Women's Abortion Clinic in...
Abortion Pill Prices Germiston ](+27832195400*)[ 🏥 Women's Abortion Clinic in...Abortion Pill Prices Germiston ](+27832195400*)[ 🏥 Women's Abortion Clinic in...
Abortion Pill Prices Germiston ](+27832195400*)[ 🏥 Women's Abortion Clinic in...
 
OpenChain Webinar: AboutCode and Beyond - End-to-End SCA
OpenChain Webinar: AboutCode and Beyond - End-to-End SCAOpenChain Webinar: AboutCode and Beyond - End-to-End SCA
OpenChain Webinar: AboutCode and Beyond - End-to-End SCA
 
architecting-ai-in-the-enterprise-apis-and-applications.pdf
architecting-ai-in-the-enterprise-apis-and-applications.pdfarchitecting-ai-in-the-enterprise-apis-and-applications.pdf
architecting-ai-in-the-enterprise-apis-and-applications.pdf
 
Community is Just as Important as Code by Andrea Goulet
Community is Just as Important as Code by Andrea GouletCommunity is Just as Important as Code by Andrea Goulet
Community is Just as Important as Code by Andrea Goulet
 
Modern binary build systems - PyCon 2024
Modern binary build systems - PyCon 2024Modern binary build systems - PyCon 2024
Modern binary build systems - PyCon 2024
 
Your Ultimate Web Studio for Streaming Anywhere | Evmux
Your Ultimate Web Studio for Streaming Anywhere | EvmuxYour Ultimate Web Studio for Streaming Anywhere | Evmux
Your Ultimate Web Studio for Streaming Anywhere | Evmux
 
Abortion Clinic In Johannesburg ](+27832195400*)[ 🏥 Safe Abortion Pills in Jo...
Abortion Clinic In Johannesburg ](+27832195400*)[ 🏥 Safe Abortion Pills in Jo...Abortion Clinic In Johannesburg ](+27832195400*)[ 🏥 Safe Abortion Pills in Jo...
Abortion Clinic In Johannesburg ](+27832195400*)[ 🏥 Safe Abortion Pills in Jo...
 
Evolving Data Governance for the Real-time Streaming and AI Era
Evolving Data Governance for the Real-time Streaming and AI EraEvolving Data Governance for the Real-time Streaming and AI Era
Evolving Data Governance for the Real-time Streaming and AI Era
 
Incident handling is a clearly defined set of procedures to manage and respon...
Incident handling is a clearly defined set of procedures to manage and respon...Incident handling is a clearly defined set of procedures to manage and respon...
Incident handling is a clearly defined set of procedures to manage and respon...
 
Anypoint Code Builder - Munich MuleSoft Meetup - 16th May 2024
Anypoint Code Builder - Munich MuleSoft Meetup - 16th May 2024Anypoint Code Builder - Munich MuleSoft Meetup - 16th May 2024
Anypoint Code Builder - Munich MuleSoft Meetup - 16th May 2024
 
Encryption Recap: A Refresher on Key Concepts
Encryption Recap: A Refresher on Key ConceptsEncryption Recap: A Refresher on Key Concepts
Encryption Recap: A Refresher on Key Concepts
 
[GeeCON2024] How I learned to stop worrying and love the dark silicon apocalypse
[GeeCON2024] How I learned to stop worrying and love the dark silicon apocalypse[GeeCON2024] How I learned to stop worrying and love the dark silicon apocalypse
[GeeCON2024] How I learned to stop worrying and love the dark silicon apocalypse
 
Workshop - Architecting Innovative Graph Applications- GraphSummit Milan
Workshop -  Architecting Innovative Graph Applications- GraphSummit MilanWorkshop -  Architecting Innovative Graph Applications- GraphSummit Milan
Workshop - Architecting Innovative Graph Applications- GraphSummit Milan
 
The mythical technical debt. (Brooke, please, forgive me)
The mythical technical debt. (Brooke, please, forgive me)The mythical technical debt. (Brooke, please, forgive me)
The mythical technical debt. (Brooke, please, forgive me)
 
Automate your OpenSIPS config tests - OpenSIPS Summit 2024
Automate your OpenSIPS config tests - OpenSIPS Summit 2024Automate your OpenSIPS config tests - OpenSIPS Summit 2024
Automate your OpenSIPS config tests - OpenSIPS Summit 2024
 
From Theory to Practice: Utilizing SpiraPlan's REST API
From Theory to Practice: Utilizing SpiraPlan's REST APIFrom Theory to Practice: Utilizing SpiraPlan's REST API
From Theory to Practice: Utilizing SpiraPlan's REST API
 
Test Automation Design Patterns_ A Comprehensive Guide.pdf
Test Automation Design Patterns_ A Comprehensive Guide.pdfTest Automation Design Patterns_ A Comprehensive Guide.pdf
Test Automation Design Patterns_ A Comprehensive Guide.pdf
 
Abortion Clinic In Pretoria ](+27832195400*)[ 🏥 Safe Abortion Pills in Pretor...
Abortion Clinic In Pretoria ](+27832195400*)[ 🏥 Safe Abortion Pills in Pretor...Abortion Clinic In Pretoria ](+27832195400*)[ 🏥 Safe Abortion Pills in Pretor...
Abortion Clinic In Pretoria ](+27832195400*)[ 🏥 Safe Abortion Pills in Pretor...
 
Spring into AI presented by Dan Vega 5/14
Spring into AI presented by Dan Vega 5/14Spring into AI presented by Dan Vega 5/14
Spring into AI presented by Dan Vega 5/14
 

Featured

How Race, Age and Gender Shape Attitudes Towards Mental Health
How Race, Age and Gender Shape Attitudes Towards Mental HealthHow Race, Age and Gender Shape Attitudes Towards Mental Health
How Race, Age and Gender Shape Attitudes Towards Mental HealthThinkNow
 
AI Trends in Creative Operations 2024 by Artwork Flow.pdf
AI Trends in Creative Operations 2024 by Artwork Flow.pdfAI Trends in Creative Operations 2024 by Artwork Flow.pdf
AI Trends in Creative Operations 2024 by Artwork Flow.pdfmarketingartwork
 
PEPSICO Presentation to CAGNY Conference Feb 2024
PEPSICO Presentation to CAGNY Conference Feb 2024PEPSICO Presentation to CAGNY Conference Feb 2024
PEPSICO Presentation to CAGNY Conference Feb 2024Neil Kimberley
 
Content Methodology: A Best Practices Report (Webinar)
Content Methodology: A Best Practices Report (Webinar)Content Methodology: A Best Practices Report (Webinar)
Content Methodology: A Best Practices Report (Webinar)contently
 
How to Prepare For a Successful Job Search for 2024
How to Prepare For a Successful Job Search for 2024How to Prepare For a Successful Job Search for 2024
How to Prepare For a Successful Job Search for 2024Albert Qian
 
Social Media Marketing Trends 2024 // The Global Indie Insights
Social Media Marketing Trends 2024 // The Global Indie InsightsSocial Media Marketing Trends 2024 // The Global Indie Insights
Social Media Marketing Trends 2024 // The Global Indie InsightsKurio // The Social Media Age(ncy)
 
Trends In Paid Search: Navigating The Digital Landscape In 2024
Trends In Paid Search: Navigating The Digital Landscape In 2024Trends In Paid Search: Navigating The Digital Landscape In 2024
Trends In Paid Search: Navigating The Digital Landscape In 2024Search Engine Journal
 
5 Public speaking tips from TED - Visualized summary
5 Public speaking tips from TED - Visualized summary5 Public speaking tips from TED - Visualized summary
5 Public speaking tips from TED - Visualized summarySpeakerHub
 
ChatGPT and the Future of Work - Clark Boyd
ChatGPT and the Future of Work - Clark Boyd ChatGPT and the Future of Work - Clark Boyd
ChatGPT and the Future of Work - Clark Boyd Clark Boyd
 
Getting into the tech field. what next
Getting into the tech field. what next Getting into the tech field. what next
Getting into the tech field. what next Tessa Mero
 
Google's Just Not That Into You: Understanding Core Updates & Search Intent
Google's Just Not That Into You: Understanding Core Updates & Search IntentGoogle's Just Not That Into You: Understanding Core Updates & Search Intent
Google's Just Not That Into You: Understanding Core Updates & Search IntentLily Ray
 
Time Management & Productivity - Best Practices
Time Management & Productivity -  Best PracticesTime Management & Productivity -  Best Practices
Time Management & Productivity - Best PracticesVit Horky
 
The six step guide to practical project management
The six step guide to practical project managementThe six step guide to practical project management
The six step guide to practical project managementMindGenius
 
Beginners Guide to TikTok for Search - Rachel Pearson - We are Tilt __ Bright...
Beginners Guide to TikTok for Search - Rachel Pearson - We are Tilt __ Bright...Beginners Guide to TikTok for Search - Rachel Pearson - We are Tilt __ Bright...
Beginners Guide to TikTok for Search - Rachel Pearson - We are Tilt __ Bright...RachelPearson36
 
Unlocking the Power of ChatGPT and AI in Testing - A Real-World Look, present...
Unlocking the Power of ChatGPT and AI in Testing - A Real-World Look, present...Unlocking the Power of ChatGPT and AI in Testing - A Real-World Look, present...
Unlocking the Power of ChatGPT and AI in Testing - A Real-World Look, present...Applitools
 
12 Ways to Increase Your Influence at Work
12 Ways to Increase Your Influence at Work12 Ways to Increase Your Influence at Work
12 Ways to Increase Your Influence at WorkGetSmarter
 

Featured (20)

How Race, Age and Gender Shape Attitudes Towards Mental Health
How Race, Age and Gender Shape Attitudes Towards Mental HealthHow Race, Age and Gender Shape Attitudes Towards Mental Health
How Race, Age and Gender Shape Attitudes Towards Mental Health
 
AI Trends in Creative Operations 2024 by Artwork Flow.pdf
AI Trends in Creative Operations 2024 by Artwork Flow.pdfAI Trends in Creative Operations 2024 by Artwork Flow.pdf
AI Trends in Creative Operations 2024 by Artwork Flow.pdf
 
Skeleton Culture Code
Skeleton Culture CodeSkeleton Culture Code
Skeleton Culture Code
 
PEPSICO Presentation to CAGNY Conference Feb 2024
PEPSICO Presentation to CAGNY Conference Feb 2024PEPSICO Presentation to CAGNY Conference Feb 2024
PEPSICO Presentation to CAGNY Conference Feb 2024
 
Content Methodology: A Best Practices Report (Webinar)
Content Methodology: A Best Practices Report (Webinar)Content Methodology: A Best Practices Report (Webinar)
Content Methodology: A Best Practices Report (Webinar)
 
How to Prepare For a Successful Job Search for 2024
How to Prepare For a Successful Job Search for 2024How to Prepare For a Successful Job Search for 2024
How to Prepare For a Successful Job Search for 2024
 
Social Media Marketing Trends 2024 // The Global Indie Insights
Social Media Marketing Trends 2024 // The Global Indie InsightsSocial Media Marketing Trends 2024 // The Global Indie Insights
Social Media Marketing Trends 2024 // The Global Indie Insights
 
Trends In Paid Search: Navigating The Digital Landscape In 2024
Trends In Paid Search: Navigating The Digital Landscape In 2024Trends In Paid Search: Navigating The Digital Landscape In 2024
Trends In Paid Search: Navigating The Digital Landscape In 2024
 
5 Public speaking tips from TED - Visualized summary
5 Public speaking tips from TED - Visualized summary5 Public speaking tips from TED - Visualized summary
5 Public speaking tips from TED - Visualized summary
 
ChatGPT and the Future of Work - Clark Boyd
ChatGPT and the Future of Work - Clark Boyd ChatGPT and the Future of Work - Clark Boyd
ChatGPT and the Future of Work - Clark Boyd
 
Getting into the tech field. what next
Getting into the tech field. what next Getting into the tech field. what next
Getting into the tech field. what next
 
Google's Just Not That Into You: Understanding Core Updates & Search Intent
Google's Just Not That Into You: Understanding Core Updates & Search IntentGoogle's Just Not That Into You: Understanding Core Updates & Search Intent
Google's Just Not That Into You: Understanding Core Updates & Search Intent
 
How to have difficult conversations
How to have difficult conversations How to have difficult conversations
How to have difficult conversations
 
Introduction to Data Science
Introduction to Data ScienceIntroduction to Data Science
Introduction to Data Science
 
Time Management & Productivity - Best Practices
Time Management & Productivity -  Best PracticesTime Management & Productivity -  Best Practices
Time Management & Productivity - Best Practices
 
The six step guide to practical project management
The six step guide to practical project managementThe six step guide to practical project management
The six step guide to practical project management
 
Beginners Guide to TikTok for Search - Rachel Pearson - We are Tilt __ Bright...
Beginners Guide to TikTok for Search - Rachel Pearson - We are Tilt __ Bright...Beginners Guide to TikTok for Search - Rachel Pearson - We are Tilt __ Bright...
Beginners Guide to TikTok for Search - Rachel Pearson - We are Tilt __ Bright...
 
Unlocking the Power of ChatGPT and AI in Testing - A Real-World Look, present...
Unlocking the Power of ChatGPT and AI in Testing - A Real-World Look, present...Unlocking the Power of ChatGPT and AI in Testing - A Real-World Look, present...
Unlocking the Power of ChatGPT and AI in Testing - A Real-World Look, present...
 
12 Ways to Increase Your Influence at Work
12 Ways to Increase Your Influence at Work12 Ways to Increase Your Influence at Work
12 Ways to Increase Your Influence at Work
 
ChatGPT webinar slides
ChatGPT webinar slidesChatGPT webinar slides
ChatGPT webinar slides
 

DevNexus 2018 - You don't know Angular