SlideShare a Scribd company logo
1 of 69
Download to read offline
Architecting
Modular Codebases
IstanbulTechTalks2014
Peter Steinberger
@steipete
Modular
what?
2011
50files
25k LOC
2012
150files
100k LOC
2013
350files
150k LOC
2014
Architecting
ModularCodebases
» Application Components
» Dependency Injection
» View Controller Decoupling
» Plugin Infrastructure
» Aspect Oriented Programming
Flexibility
Clarity
Performance
Quality
Whatitwon'tdo for you.
Application
Components
Find large files
find.-name"*.m"-execwc-l"{}";|sort-rn|head
4351 ./TextParser/PSPDFFontFileDescriptor.m
3651 ./Controller/PSPDFViewController.m
2889 ./Views/PSPDFPageView.m
2189 ./Parser/PSPDFDocumentParser.m
2017 ./XFDF/PSPDFXFDFParser.m
2004 ./Model/PSPDFDocument.m
1783 ./TextParser/PSPDFTextParser.m
1776 ./Annotations/PSPDFAnnotation.m
1649 ./Views/PSPDFPageView+AnnotationMenu.m
1469 ./Gallery/PSPDFGalleryViewController.m
Application Components
Structure classes after responsibility.
PSPDFKit
|- Gallery
|- Networking
|- DataExporter
|-|- DataModel
|- PSPDFUIKit
|-|- PSPDFFoundation
Application Components
Use private headers within components.
PSPDFEmbeddedFile.h/m
PSPDFEmbeddedFile+Private.h
@interface PSPDFEmbeddedFile (Private)
// Parses the PDF dictionary and returns an `PSPDFEmbeddedFile` object if found.
+ (instancetype)embeddedFileWithPDFDictionary:(CGPDFDictionaryRef)pdfDictionary;
// Index of the file in the original document.
@property (nonatomic, copy) NSString *streamPath;
@end
Application Components
Use class extensions.
@interface UIView (UIViewHierarchy)
- (void)layoutSubviews;
@end
@interface UIView (UIViewRendering)
- (void)drawRect:(CGRect)rect;
@end
@interface UIView (UIViewGestureRecognizers)
- (void)addGestureRecognizer:(UIGestureRecognizer*)recognizer
@end
@interface UIView (UIViewMotionEffects)
- (void)addMotionEffect:(UIMotionEffect *)effect
@end
Application Components
Use class extensions.
@interface PSPDFViewController (EmbeddedFileSupport)
<PSPDFEmbeddedFilesViewControllerDelegate>
@end
@implementation PSPDFViewController (EmbeddedFileSupport)
- (void)embeddedFilesController:(PSPDFEmbeddedFilesViewController *)controller
didSelectFile:(PSPDFEmbeddedFile *)embeddedFile sender:(id)sender {
// delegate implementation.
}
Application Components
Extract features into sub-controllers.
* PSPDFSearchHighlightViewManager
* PSPDFPresentationController
* PSPDFHalfModalController
objc.io/issue-1/lighter-view-
controllers.html
Dependency
Injection
Hollywood
Principle
DependencyInjection
- (void)viewWillDisappear:(BOOL)animated {
[super viewWillDisappear:animated];
// Stop further caching the document.
PSPDFCache *cache = PSPDFCache.sharedCache;
[cache stopCachingDocument:self.document];
}
DependencyInjection
- (PSPDFCache *)cache {
return PSPDFCache.sharedCache;
}
- (void)viewWillDisappear:(BOOL)animated {
[super viewWillDisappear:animated];
// Stop further caching the document.
[self.cache stopCachingDocument:self.document];
}
DependencyInjection
@property (nonatomic, strong) PSPDFCache *cache;
- (void)viewWillDisappear:(BOOL)animated {
[super viewWillDisappear:animated];
// Stop further caching the document.
[self.cache stopCachingDocument:self.document];
}
DependencyInjection
// In class extension
@property (nonatomic, strong) PSPDFCache *cache;
- (id)initWithCache:(PSPDFCache *)cache {
NSParameterAssert(cache);
if (self = [super init]) {
_cache = cache;
}
return self;
}
DependencyInjection
@property (nonatomic, strong) PSPDFCache *cache;
objection_requires_sel(@selector(cache))
// Create instance
id vc = [JSObjection.defaultInjector getObject:ViewController.class];
DependencyInjection
JSObjectionInjector *injector = [JSObjection createInjector];
[JSObjection setDefaultInjector:injector];
// Register singleton.
[JSObjection registerClass:PSPDFCache.class scope:JSObjectionScopeSingleton];
DependencyInjection
// Define implementation for a protocol.
[self bindClass:YahooWeatherService.class toProtocol:@protocol(WeatherService)];
DependencyInjection
PopularFrameworks
» Spring, Guice
» Objection
» Typhoon Framework
» DYI
ViewController
Decoupling
ViewController Decouplingwith
Routes
/user -> ISTUserController
/user/1 -> ISTUserDetailController with ID 1
ViewController Decouplingwith
Routes
// Set up routes
[JLRoutes addRoute:@"/user/:userID" handler:^BOOL(NSDictionary *parameters) {
NSUInteger userID = [parameters[@"userID"] integerValue];
UserDetailController *controller = [[UserDetailController alloc] initWithID:userID];
[self.navigationController pushViewController:controller animated:YES];
return YES;
}];
ViewController Decouplingwith
Routes
// Open the user controller.
NSUInteger userID = 42;
NSString *URLString = [NSString stringWithFormat:@"myapp://user/%tu?animated=NO", userID];
[UIApplication.sharedApplication openURL:[NSURL URLWithString:URLString]];
// Install the URL handler.
- (BOOL)application:(UIApplication *)app openURL:(NSURL *)URL
sourceApplication:(NSString *)source annotation:(id)annotation {
return [JLRoutes routeURL:URL];
}
ViewController Decouplingwith
Routes
// Set up route and also process the animation property.
[JLRoutes addRoute:@"/user/:userID" handler:^BOOL(NSDictionary *parameters) {
NSUInteger userID = [parameters[@"userID"] integerValue];
BOOL animated = parameters[@"animated"] ? [parameters[@"animated"] boolValue] : YES;
UserDetailController *controller = [[UserDetailController alloc] initWithID:userID];
[self.navigationController pushViewController:controller animated:animated];
return YES;
}];
ViewController Decouplingwith
Routes
» JLRoutes
https://github.com/joeldev/JLRoutes
» SOCKit
https://github.com/NimbusKit/sockit
Plugin
Infrastructure
TheAppleway
» CFPlugin
CFPlugInAddInstanceForFactory
» NSBundle
builtInPlugInsPath, principalClass
AnatomyofaLoadable Bundle
MyLoadableBundle.bundle
Contents/
Info.plist
MacOS/
MyLoadableBundle
Resources/
Lizard.jpg
MyLoadableBundle.icns
en.lproj/
MyLoadableBundle.nib
InfoPlist.strings
"iOS Static LibrariesAre,
Like, ReallyBad,And Stuff"
15800975
tl;dr
» Hacky "static framework" workarounds
using lipo
» Resource Loading
» Debugging and Symbolication
» Dependent frameworks
» Two-level Namespacing
PluginInfrastructure
TheXcodeway
Plugin Infrastructure
TheXcodeway
+ (void)pluginDidLoad:(NSBundle *)plugin {
// Initialize class
}
// BBUDebuggerTuckAway
- (void)swizzleDidChangeTextInSourceTextView {
id sourceTextView = [objc_getClass("DVTSourceTextView") new];
[sourceTextView yl_swizzleSelector:@selector(didChangeText)
withBlock:^void(id _self) {
[self toggleDebuggersIfNeeded];
// call original
[_self yl_performSelector:@selector(didChangeText)];
}];
}
Implementing
StylusSupport
Implementing StylusSupport
So many different models!
» Adonit JotTouch
» WACOM
» Pogo (Ten One Design)
» HEX3 Jaja
» Unnamed Vendor
Implementing StylusSupport
Different approaches!
» UIApplication subclass/hook sendEvent:
» Register/deregister views
» Custom touch delivery
» Touch classification
» Manually forwarding touches from
touchesBegan:/Moved:/Ended:/Cancelled:
Implementing StylusSupport
Places to customize:
» PSPDFDrawView
» PSPDFAnnotationStateManager
» PSPDFFlexibleAnnotationToolbar
» PSPDFViewController
Implementing StylusSupport
New classes:
» PSPDFStylusManager
» PSPDFStylusViewController
» PSPDFStylusStatusButton
Messy!
SDK ==
Driver
Plugin Infrastructure
SDK == Driver
@protocol PSPDFStylusDriver <PSPDFPlugin>
- (BOOL)enableDriver:(NSError **)error options:(NSDictionary *)options;
- (void)disableDriver;
- (NSDictionary *)connectionInfo;
@property (nonatomic, weak, readonly) id<PSPDFStylusDriverDelegate> delegate;
@optional
- (id<PSPDFStylusTouch>)touchInfoForTouch:(UITouch *)touch;
- (UIViewController *)settingsController;
@end
Plugin Infrastructure
@protocol PSPDFPlugin <NSObject>
// Designated initializer. Will be called upon creation.
- (id)initWithRegistry:(PSPDFPluginRegistry *)registry options:(NSDictionary *)options;
// Plugin details for auto-discovery.
+ (NSDictionary *)pluginInfo;
@end
extern NSString * const PSPDFPluginNameKey;
extern NSString * const PSPDFPluginEnabledKey;
extern NSString * const PSPDFPluginInitializeOnDiscoveryKey;
extern NSString * const PSPDFPluginSaveInstanceKey;
extern NSString * const PSPDFPluginProtocolVersionKey;
Discovery
Plugin Infrastructure
Discovery
- (NSDictionary *)discoverPluginClasses {
NSMutableDictionary *pluginClasses = [NSMutableDictionary dictionary];
// Interate all classes.
unsigned int count = 0;
Class *classList = objc_copyClassList(&count);
for (int index = 0; index < count; index++) {
Class class = classList[index];
if (class_conformsToProtocol(class, @protocol(PSPDFPlugin)) &&
[self isValidPluginClass:class]) {
NSDictionary *info = [class pluginInfo];
pluginClasses[info[PSPDFPluginNameKey]] = class;
}
}
free(classList);
return [pluginClasses copy];
}
Plugin Infrastructure
Discovery
// Static method declared in <PSPDFPlugin>
+ (NSDictionary *)pluginInfo {
return @{PSPDFPluginNameKey : @"com.pspdfkit.stylus.driver.wacom",
PSPDFPluginProtocolVersionKey : @(PSPDFPluginProtocolVersion_1),
PSPDFStylusDriverNameKey : @"Wacom",
PSPDFStylusDriverSDKVersionKey : WacomManager.getManager.getSDKVersion,
PSPDFStylusDriverVersionKey : @(PSPDFStylusDriverProtocolVersion_1),
PSPDFStylusDriverPriorityKey : @(80)};
}
Plugin Infrastructure
Implementation
@interface PSPDFAnnotationStateManagerStylusSupport : NSObject
<PSPDFStylusDriverDelegate>
@end
@interface PSPDFAnnotationStateManager (StylusSupport)
// Accessing this class will enable stylus support.
- (PSPDFAnnotationStateManagerStylusSupport *)stylusSupport;
@property (nonatomic, readonly) UIBarButtonItem *stylusStatusButton;
@end
Plugin Infrastructure
Implementation
// Lazily initialize our stylus support class.
- (PSPDFAnnotationStateManagerStylusSupport *)stylusSupport {
PSPDFAnnotationStateManagerStylusSupport *stylusSupport = objc_getAssociatedObject(self, _cmd);
if (!stylusSupport) {
stylusSupport = [[PSPDFAnnotationStateManagerStylusSupport alloc] initWithStateManager:self];
objc_setAssociatedObject(self, _cmd, stylusSupport, OBJC_ASSOCIATION_RETAIN);
}
return stylusSupport;
}
Plugin Infrastructure
Implementation
// Hook into didMoveToWindow for view registration.
[PSPDFDrawView.class pspdf_hookSelector:@selector(didMoveToWindow)
withBlock:^(PSPDFDrawView *view, NSArray *args) {
if (view.window) {
[PSPDFStylusManager.sharedInstance registerView:view];
}else {
[PSPDFStylusManager.sharedInstance unregisterView:view];
}
}];
Plugin Infrastructure
Implementation
@interface NSObject (PSPDFMessageHooks)
- (BOOL)pspdf_hookSelector:(SEL)selector
withBlock:(void (^)(id object, NSArray *arguments))block;
+ (BOOL)pspdf_hookSelector:(SEL)selector
withBlock:(void (^)(id object, NSArray *arguments))block;
@end
Plugin Infrastructure
SelectorHooking
Inspired by ReactiveCocoa's signals.
NSObject+RACSelectorSignal.m
_objc_msgForward + forwardInvocation +
objc_setClass + class_replaceMethod
Aspect
Oriented
Programming
AspectOriented
Programming
"AOP is a programming paradigm that aims
to increase modularity by allowing the
separation of cross-cutting concerns."
AspectOriented
Programming
Advice types:
» Add code before a specific method.
» Add code after a specific method.
» Add code instead a specific method.
AspectOriented
Programming
» Optional Features
» Logging
» Analytics
» Tutorial Code
AspectOriented
Programming
- (NSDictionary *)analyticsConfiguration {
return @{
@"trackedScreens" : @[
@{@"class" : @"ISTMainViewController",
@"label" : @"Main screen"}
],
@"trackedEvents" : @[
@{@"class" : @"ISTMainViewController",
@"sel" : @"loginWithFacebook:",
@"label" : @"Login with Facebook"},
@{@"class" : @"ISTFacebookViewController",
@"sel" : @"failedToConnect:",
@"label" : @"Facebook connection failure"},
]
};
}
AspectOriented
Programming
» AOP-for-Objective-C
https://github.com/ndcube/AOP-for-
Objective-C
» NSProxy
» ReactiveCocoa
https://github.com/ReactiveCocoa/
ReactiveCocoa
» method_exchangeImplementations (DIY)
Architecting
ModularCodebases
» Application Components
» Dependency Injection
» View Controller Decoupling
» Plugin Infrastructure
» Aspect Oriented Programming
ArchitectingModularCodebases
Q/A
ArchitectingModularCodebases
Thanks!
Resources:
* http://www.typhoonframework.org
* https://github.com/atomicobject/objection
* http://objc.io/issue-1/lighter-view-controllers.html
* https://github.com/joeldev/JLRoutes
* http://ddeville.me/2014/04/dynamic-linking/
* http://dev.hubspot.com/blog/architecting-a-large-ios-app-with-cocoapods
* http://landonf.bikemonkey.org/code/ios/Radar_15800975_iOS_Frameworks.20140112.html
* https://github.com/neonichu/BBUDebuggerTuckAway
* http://albertodebortoli.github.io/blog/2014/03/25/
an-aspect-oriented-approach-programming-to-ios-analytics/
* http://codeshaker.blogspot.co.at/2012/01/aop-delivered.html
* https://github.com/ReactiveCocoa/ReactiveCocoa/blob/master/
ReactiveCocoaFramework/ReactiveCocoa/NSObject+RACSelectorSignal.m
* https://github.com/ndcube/AOP-for-Objective-C
* http://codeshaker.blogspot.com.tr/2012/01/aop-delivered.html
Image Credits:
* Hollywood, Gavin Johnson, flickr.com/photos/23629211@N04/4569636150

More Related Content

What's hot

What's hot (18)

Angular2 & ngrx/store: Game of States
Angular2 & ngrx/store: Game of StatesAngular2 & ngrx/store: Game of States
Angular2 & ngrx/store: Game of States
 
Workshop 26: React Native - The Native Side
Workshop 26: React Native - The Native SideWorkshop 26: React Native - The Native Side
Workshop 26: React Native - The Native Side
 
Spring boot
Spring boot Spring boot
Spring boot
 
What’s new in Android JetPack
What’s new in Android JetPackWhat’s new in Android JetPack
What’s new in Android JetPack
 
CoffeeScript - TechTalk 21/10/2013
CoffeeScript - TechTalk 21/10/2013CoffeeScript - TechTalk 21/10/2013
CoffeeScript - TechTalk 21/10/2013
 
Angular server side rendering - Strategies & Technics
Angular server side rendering - Strategies & Technics Angular server side rendering - Strategies & Technics
Angular server side rendering - Strategies & Technics
 
Tools for Making Machine Learning more Reactive
Tools for Making Machine Learning more ReactiveTools for Making Machine Learning more Reactive
Tools for Making Machine Learning more Reactive
 
A portlet-API based approach for application integration
A portlet-API based approach for application integrationA portlet-API based approach for application integration
A portlet-API based approach for application integration
 
AngularJS.part1
AngularJS.part1AngularJS.part1
AngularJS.part1
 
Dynamic virtual evironments
Dynamic virtual evironmentsDynamic virtual evironments
Dynamic virtual evironments
 
React, Redux and es6/7
React, Redux and es6/7React, Redux and es6/7
React, Redux and es6/7
 
How to create your own Volto site!
How to create your own Volto site!How to create your own Volto site!
How to create your own Volto site!
 
Mastering Oracle ADF Bindings
Mastering Oracle ADF BindingsMastering Oracle ADF Bindings
Mastering Oracle ADF Bindings
 
Developing New Widgets for your Views in Owl
Developing New Widgets for your Views in OwlDeveloping New Widgets for your Views in Owl
Developing New Widgets for your Views in Owl
 
Practical Protocols with Associated Types
Practical Protocols with Associated TypesPractical Protocols with Associated Types
Practical Protocols with Associated Types
 
Why You Should Use TAPIs
Why You Should Use TAPIsWhy You Should Use TAPIs
Why You Should Use TAPIs
 
Hidden Docs in Angular
Hidden Docs in AngularHidden Docs in Angular
Hidden Docs in Angular
 
Protocol-Oriented MVVM (extended edition)
Protocol-Oriented MVVM (extended edition)Protocol-Oriented MVVM (extended edition)
Protocol-Oriented MVVM (extended edition)
 

Viewers also liked

Viewers also liked (20)

ITT 2015 - Ash Furrow - Lessons from Production Swift
ITT 2015 - Ash Furrow - Lessons from Production SwiftITT 2015 - Ash Furrow - Lessons from Production Swift
ITT 2015 - Ash Furrow - Lessons from Production Swift
 
ITT 2015 - Simon Stewart - Building Android Apps at Speed and Scale
ITT 2015 - Simon Stewart - Building Android Apps at Speed and ScaleITT 2015 - Simon Stewart - Building Android Apps at Speed and Scale
ITT 2015 - Simon Stewart - Building Android Apps at Speed and Scale
 
ITT 2015 - Saul Mora - Object Oriented Function Programming
ITT 2015 - Saul Mora - Object Oriented Function ProgrammingITT 2015 - Saul Mora - Object Oriented Function Programming
ITT 2015 - Saul Mora - Object Oriented Function Programming
 
ITT 2015 - Kirk Pepperdine - The (not so) Dark Art of Performance Tuning, fro...
ITT 2015 - Kirk Pepperdine - The (not so) Dark Art of Performance Tuning, fro...ITT 2015 - Kirk Pepperdine - The (not so) Dark Art of Performance Tuning, fro...
ITT 2015 - Kirk Pepperdine - The (not so) Dark Art of Performance Tuning, fro...
 
ITT 2015 - Simon Tennant - Your App Just Got Social: Adding Messaging to Your...
ITT 2015 - Simon Tennant - Your App Just Got Social: Adding Messaging to Your...ITT 2015 - Simon Tennant - Your App Just Got Social: Adding Messaging to Your...
ITT 2015 - Simon Tennant - Your App Just Got Social: Adding Messaging to Your...
 
ITT 2015 - Hugo Domenech-Juarez - What's All That Hype About BLE?
ITT 2015 - Hugo Domenech-Juarez - What's All That Hype About BLE?ITT 2015 - Hugo Domenech-Juarez - What's All That Hype About BLE?
ITT 2015 - Hugo Domenech-Juarez - What's All That Hype About BLE?
 
ITT 2014 - Mario Zechner - Libgdx 101
ITT 2014 - Mario Zechner - Libgdx 101ITT 2014 - Mario Zechner - Libgdx 101
ITT 2014 - Mario Zechner - Libgdx 101
 
Silent push
Silent pushSilent push
Silent push
 
Apple Search Optimization
Apple Search OptimizationApple Search Optimization
Apple Search Optimization
 
OHHttpStubs
OHHttpStubsOHHttpStubs
OHHttpStubs
 
Zenly - Reverse geocoding
Zenly - Reverse geocodingZenly - Reverse geocoding
Zenly - Reverse geocoding
 
Gatekeeper par Guillaume Faure
Gatekeeper par Guillaume FaureGatekeeper par Guillaume Faure
Gatekeeper par Guillaume Faure
 
A little respect for MVC part 1 par Gegoire Lhotellier
A little respect for MVC part 1 par Gegoire LhotellierA little respect for MVC part 1 par Gegoire Lhotellier
A little respect for MVC part 1 par Gegoire Lhotellier
 
Gaikan
GaikanGaikan
Gaikan
 
J'ai fait une app native en React Native
J'ai fait une app native en React NativeJ'ai fait une app native en React Native
J'ai fait une app native en React Native
 
MVC-RS par Grégoire Lhotelier
MVC-RS par Grégoire LhotelierMVC-RS par Grégoire Lhotelier
MVC-RS par Grégoire Lhotelier
 
Safari app extensions cleared up by Sanaa Squalli
Safari app extensions cleared up by Sanaa SqualliSafari app extensions cleared up by Sanaa Squalli
Safari app extensions cleared up by Sanaa Squalli
 
L'intégration continue chez Pages Jaunes - Build Bot Mobile
L'intégration continue chez Pages Jaunes - Build Bot MobileL'intégration continue chez Pages Jaunes - Build Bot Mobile
L'intégration continue chez Pages Jaunes - Build Bot Mobile
 
Fastlane snapshot presentation
Fastlane snapshot presentationFastlane snapshot presentation
Fastlane snapshot presentation
 
Présentation SoLocal
Présentation SoLocalPrésentation SoLocal
Présentation SoLocal
 

Similar to ITT 2014 - Peter Steinberger - Architecting Modular Codebases

Web Template Mechanisms in SOC Verification - DVCon.pdf
Web Template Mechanisms in SOC Verification - DVCon.pdfWeb Template Mechanisms in SOC Verification - DVCon.pdf
Web Template Mechanisms in SOC Verification - DVCon.pdf
SamHoney6
 

Similar to ITT 2014 - Peter Steinberger - Architecting Modular Codebases (20)

Symfony2 - from the trenches
Symfony2 - from the trenchesSymfony2 - from the trenches
Symfony2 - from the trenches
 
Android - Anatomy of android elements & layouts
Android - Anatomy of android elements & layoutsAndroid - Anatomy of android elements & layouts
Android - Anatomy of android elements & layouts
 
DataFX 8 (JavaOne 2014)
DataFX 8 (JavaOne 2014)DataFX 8 (JavaOne 2014)
DataFX 8 (JavaOne 2014)
 
Android training in mumbai
Android training in mumbaiAndroid training in mumbai
Android training in mumbai
 
Symfony2 from the Trenches
Symfony2 from the TrenchesSymfony2 from the Trenches
Symfony2 from the Trenches
 
Taking Jenkins Pipeline to the Extreme
Taking Jenkins Pipeline to the ExtremeTaking Jenkins Pipeline to the Extreme
Taking Jenkins Pipeline to the Extreme
 
React Native for multi-platform mobile applications
React Native for multi-platform mobile applicationsReact Native for multi-platform mobile applications
React Native for multi-platform mobile applications
 
Operator SDK for K8s using Go
Operator SDK for K8s using GoOperator SDK for K8s using Go
Operator SDK for K8s using Go
 
C#on linux
C#on linuxC#on linux
C#on linux
 
Pavlo Zhdanov "Java and Swift: How to Create Applications for Automotive Head...
Pavlo Zhdanov "Java and Swift: How to Create Applications for Automotive Head...Pavlo Zhdanov "Java and Swift: How to Create Applications for Automotive Head...
Pavlo Zhdanov "Java and Swift: How to Create Applications for Automotive Head...
 
Introduction to angular js
Introduction to angular jsIntroduction to angular js
Introduction to angular js
 
Maciej Treder ''Angular Universal - a medicine for the Angular + SEO/CDN issu...
Maciej Treder ''Angular Universal - a medicine for the Angular + SEO/CDN issu...Maciej Treder ''Angular Universal - a medicine for the Angular + SEO/CDN issu...
Maciej Treder ''Angular Universal - a medicine for the Angular + SEO/CDN issu...
 
Developing ASP.NET Applications Using the Model View Controller Pattern
Developing ASP.NET Applications Using the Model View Controller PatternDeveloping ASP.NET Applications Using the Model View Controller Pattern
Developing ASP.NET Applications Using the Model View Controller Pattern
 
The Developer Conference - CloudKit, entendendo a Cloud da Apple
The Developer Conference - CloudKit, entendendo a Cloud da AppleThe Developer Conference - CloudKit, entendendo a Cloud da Apple
The Developer Conference - CloudKit, entendendo a Cloud da Apple
 
Angular Js Basics
Angular Js BasicsAngular Js Basics
Angular Js Basics
 
Labs_BT_20221017.pptx
Labs_BT_20221017.pptxLabs_BT_20221017.pptx
Labs_BT_20221017.pptx
 
Dropwizard Introduction
Dropwizard IntroductionDropwizard Introduction
Dropwizard Introduction
 
Web Template Mechanisms in SOC Verification - DVCon.pdf
Web Template Mechanisms in SOC Verification - DVCon.pdfWeb Template Mechanisms in SOC Verification - DVCon.pdf
Web Template Mechanisms in SOC Verification - DVCon.pdf
 
Log4j2
Log4j2Log4j2
Log4j2
 
2013 Collaborate - OAUG - Presentation
2013 Collaborate - OAUG - Presentation2013 Collaborate - OAUG - Presentation
2013 Collaborate - OAUG - Presentation
 

More from Istanbul Tech Talks

More from Istanbul Tech Talks (8)

ITT 2015 - Vincent Garrigues - Continuous Integration at SoundCloud
ITT 2015 - Vincent Garrigues - Continuous Integration at SoundCloudITT 2015 - Vincent Garrigues - Continuous Integration at SoundCloud
ITT 2015 - Vincent Garrigues - Continuous Integration at SoundCloud
 
ITT 2014 - Orta Therox- Mobile and the Art World
ITT 2014 - Orta Therox- Mobile and the Art WorldITT 2014 - Orta Therox- Mobile and the Art World
ITT 2014 - Orta Therox- Mobile and the Art World
 
ITT 2014 - Niklas Therning - Truly Native Java Apps on iOS with RoboVM
ITT 2014 - Niklas Therning - Truly Native Java Apps on iOS with RoboVMITT 2014 - Niklas Therning - Truly Native Java Apps on iOS with RoboVM
ITT 2014 - Niklas Therning - Truly Native Java Apps on iOS with RoboVM
 
ITT 2014 - Max Seelemann - Hello TextKit!
ITT 2014 - Max Seelemann - Hello TextKit!ITT 2014 - Max Seelemann - Hello TextKit!
ITT 2014 - Max Seelemann - Hello TextKit!
 
ITT 2014 - Eric Lafortune - ProGuard, Optimizer and Obfuscator in the Android...
ITT 2014 - Eric Lafortune - ProGuard, Optimizer and Obfuscator in the Android...ITT 2014 - Eric Lafortune - ProGuard, Optimizer and Obfuscator in the Android...
ITT 2014 - Eric Lafortune - ProGuard, Optimizer and Obfuscator in the Android...
 
ITT 2014 - Erik Hellmann - Android Programming - Smarter and Better Networking
ITT 2014 - Erik Hellmann - Android Programming - Smarter and Better NetworkingITT 2014 - Erik Hellmann - Android Programming - Smarter and Better Networking
ITT 2014 - Erik Hellmann - Android Programming - Smarter and Better Networking
 
ITT 2014 - Chris Eidhof - Practical Concurrent Programming
ITT 2014 - Chris Eidhof - Practical Concurrent ProgrammingITT 2014 - Chris Eidhof - Practical Concurrent Programming
ITT 2014 - Chris Eidhof - Practical Concurrent Programming
 
ITT 2014 - Matt Brenner- Localization 2.0
ITT 2014 - Matt Brenner- Localization 2.0ITT 2014 - Matt Brenner- Localization 2.0
ITT 2014 - Matt Brenner- Localization 2.0
 

Recently uploaded

FULL ENJOY Call Girls In Mahipalpur Delhi Contact Us 8377877756
FULL ENJOY Call Girls In Mahipalpur Delhi Contact Us 8377877756FULL ENJOY Call Girls In Mahipalpur Delhi Contact Us 8377877756
FULL ENJOY Call Girls In Mahipalpur Delhi Contact Us 8377877756
dollysharma2066
 
Call for Papers - Educational Administration: Theory and Practice, E-ISSN: 21...
Call for Papers - Educational Administration: Theory and Practice, E-ISSN: 21...Call for Papers - Educational Administration: Theory and Practice, E-ISSN: 21...
Call for Papers - Educational Administration: Theory and Practice, E-ISSN: 21...
Christo Ananth
 
VIP Call Girls Palanpur 7001035870 Whatsapp Number, 24/07 Booking
VIP Call Girls Palanpur 7001035870 Whatsapp Number, 24/07 BookingVIP Call Girls Palanpur 7001035870 Whatsapp Number, 24/07 Booking
VIP Call Girls Palanpur 7001035870 Whatsapp Number, 24/07 Booking
dharasingh5698
 
notes on Evolution Of Analytic Scalability.ppt
notes on Evolution Of Analytic Scalability.pptnotes on Evolution Of Analytic Scalability.ppt
notes on Evolution Of Analytic Scalability.ppt
MsecMca
 

Recently uploaded (20)

data_management_and _data_science_cheat_sheet.pdf
data_management_and _data_science_cheat_sheet.pdfdata_management_and _data_science_cheat_sheet.pdf
data_management_and _data_science_cheat_sheet.pdf
 
KubeKraft presentation @CloudNativeHooghly
KubeKraft presentation @CloudNativeHooghlyKubeKraft presentation @CloudNativeHooghly
KubeKraft presentation @CloudNativeHooghly
 
FULL ENJOY Call Girls In Mahipalpur Delhi Contact Us 8377877756
FULL ENJOY Call Girls In Mahipalpur Delhi Contact Us 8377877756FULL ENJOY Call Girls In Mahipalpur Delhi Contact Us 8377877756
FULL ENJOY Call Girls In Mahipalpur Delhi Contact Us 8377877756
 
Booking open Available Pune Call Girls Pargaon 6297143586 Call Hot Indian Gi...
Booking open Available Pune Call Girls Pargaon  6297143586 Call Hot Indian Gi...Booking open Available Pune Call Girls Pargaon  6297143586 Call Hot Indian Gi...
Booking open Available Pune Call Girls Pargaon 6297143586 Call Hot Indian Gi...
 
Water Industry Process Automation & Control Monthly - April 2024
Water Industry Process Automation & Control Monthly - April 2024Water Industry Process Automation & Control Monthly - April 2024
Water Industry Process Automation & Control Monthly - April 2024
 
Unleashing the Power of the SORA AI lastest leap
Unleashing the Power of the SORA AI lastest leapUnleashing the Power of the SORA AI lastest leap
Unleashing the Power of the SORA AI lastest leap
 
ONLINE FOOD ORDER SYSTEM PROJECT REPORT.pdf
ONLINE FOOD ORDER SYSTEM PROJECT REPORT.pdfONLINE FOOD ORDER SYSTEM PROJECT REPORT.pdf
ONLINE FOOD ORDER SYSTEM PROJECT REPORT.pdf
 
(INDIRA) Call Girl Aurangabad Call Now 8617697112 Aurangabad Escorts 24x7
(INDIRA) Call Girl Aurangabad Call Now 8617697112 Aurangabad Escorts 24x7(INDIRA) Call Girl Aurangabad Call Now 8617697112 Aurangabad Escorts 24x7
(INDIRA) Call Girl Aurangabad Call Now 8617697112 Aurangabad Escorts 24x7
 
Call for Papers - International Journal of Intelligent Systems and Applicatio...
Call for Papers - International Journal of Intelligent Systems and Applicatio...Call for Papers - International Journal of Intelligent Systems and Applicatio...
Call for Papers - International Journal of Intelligent Systems and Applicatio...
 
Java Programming :Event Handling(Types of Events)
Java Programming :Event Handling(Types of Events)Java Programming :Event Handling(Types of Events)
Java Programming :Event Handling(Types of Events)
 
Thermal Engineering-R & A / C - unit - V
Thermal Engineering-R & A / C - unit - VThermal Engineering-R & A / C - unit - V
Thermal Engineering-R & A / C - unit - V
 
Call for Papers - Educational Administration: Theory and Practice, E-ISSN: 21...
Call for Papers - Educational Administration: Theory and Practice, E-ISSN: 21...Call for Papers - Educational Administration: Theory and Practice, E-ISSN: 21...
Call for Papers - Educational Administration: Theory and Practice, E-ISSN: 21...
 
BSides Seattle 2024 - Stopping Ethan Hunt From Taking Your Data.pptx
BSides Seattle 2024 - Stopping Ethan Hunt From Taking Your Data.pptxBSides Seattle 2024 - Stopping Ethan Hunt From Taking Your Data.pptx
BSides Seattle 2024 - Stopping Ethan Hunt From Taking Your Data.pptx
 
Generative AI or GenAI technology based PPT
Generative AI or GenAI technology based PPTGenerative AI or GenAI technology based PPT
Generative AI or GenAI technology based PPT
 
Double Revolving field theory-how the rotor develops torque
Double Revolving field theory-how the rotor develops torqueDouble Revolving field theory-how the rotor develops torque
Double Revolving field theory-how the rotor develops torque
 
Online banking management system project.pdf
Online banking management system project.pdfOnline banking management system project.pdf
Online banking management system project.pdf
 
Unit 1 - Soil Classification and Compaction.pdf
Unit 1 - Soil Classification and Compaction.pdfUnit 1 - Soil Classification and Compaction.pdf
Unit 1 - Soil Classification and Compaction.pdf
 
VIP Call Girls Palanpur 7001035870 Whatsapp Number, 24/07 Booking
VIP Call Girls Palanpur 7001035870 Whatsapp Number, 24/07 BookingVIP Call Girls Palanpur 7001035870 Whatsapp Number, 24/07 Booking
VIP Call Girls Palanpur 7001035870 Whatsapp Number, 24/07 Booking
 
notes on Evolution Of Analytic Scalability.ppt
notes on Evolution Of Analytic Scalability.pptnotes on Evolution Of Analytic Scalability.ppt
notes on Evolution Of Analytic Scalability.ppt
 
(INDIRA) Call Girl Bhosari Call Now 8617697112 Bhosari Escorts 24x7
(INDIRA) Call Girl Bhosari Call Now 8617697112 Bhosari Escorts 24x7(INDIRA) Call Girl Bhosari Call Now 8617697112 Bhosari Escorts 24x7
(INDIRA) Call Girl Bhosari Call Now 8617697112 Bhosari Escorts 24x7
 

ITT 2014 - Peter Steinberger - Architecting Modular Codebases