SlideShare una empresa de Scribd logo
1 de 69
Descargar para leer sin conexión
Practical Concurrent
Programming
Chris Eidhof
Merhabā
Why is concurrency hard?
When to use concurrency?
Always use the main thread
When to use concurrency?
— Networking
— Expensive stuff
Decision workflow
1. Measure
2. Change
3. Measure again
How to draw things in the
background
Recipe
1. Take drawRect: code
2. Put it in a background thread
3. Update the main thread
The drawRect: code
- (void)drawRect:(CGRect)rect
{
CGContextRef ctx = UIGraphicsGetCurrentContext();
// expensive
// drawing
// code
}
Moving it to a different thread
[queue addOperationWithBlock:^{
UIGraphicsBeginImageContextWithOptions(size, NO, 0);
// expensive
// drawing
// code
UIImage *i = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
// TODO: update the main thread
}];
Updating the main thread
[queue addOperationWithBlock:^{
UIGraphicsBeginImageContextWithOptions(size, NO, 0);
// expensive
// drawing
// code
UIImage *i = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
[[NSOperationQueue mainQueue] addOperationWithBlock:^{
self.imageView.image = i;
}];
}];
Deckset filters
[self.queue addOperationWithBlock:^{
CIImage *ciImage = [CIImage imageWithContentsOfURL:sourceURL];
CIFilter *depthOfFieldFilter = [CIFilter filterWithName:@"CIDepthOfField"];
...
CIImage *finalImage = [alphaFilter valueForKey:kCIOutputImageKey];
CGContextRef cgContext = CGBitmapContextCreate(NULL, size.width, size.height, 8,
size.width * 4, colorSpace, kCGImageAlphaPremultipliedLast);
CIContext *context = [CIContext contextWithCGContext:cgContext options:nil];
CGImageRef outputImage = [context createCGImage:finalImage fromRect:ciImage.extent];
...
CGImageDestinationAddImage(destination, outputImage, nil);
CGImageDestinationFinalize(destination);
}];
... the shared resource was the GPU!
Solution
NSDictionary *options = @{kCIContextUseSoftwareRenderer: @YES};
CIContext *context = [CIContext contextWithCGContext:cgContext
options:options];
... and ...
self.queue.maxConcurrentOperationCount = 1;
Solution, part 2
... we removed the complicated filter
How to not load things from the network
dispatch_async(backgroundQueue, ^{
NSData *data = [NSData dataWithContentsOfURL:url];
NSArray *graphItems = [NSJSONSerialization
JSONObjectWithData:data options:0 error:&error];
UIImage* image = [self drawGraph:graphItems];
dispatch_async(dispatch_get_main_queue(), ^{
self.imageView.image = image;
});
});
Grand Central Dispatch
Threading is hard
GCD moves it to the system-
level
GCD Thread Pool
Main
Thread
High
Priority
Queue
Serial
Queue
Parallel
Queue
Serial
Queue
Main
Queue
Serial
Queue
Concurrent
Queue
Serial
Queue
Default
Priority
Queue
Low
Priority
Queue
Background
Priority
Queue
Custom Queues
GCD Queues
Threads
— Simpler
— Faster
— Thread-pool management
— Memory-efficient
— Async means: no deadlock!
How to load things from the network
Use NSURLSession
Operation Queues
dispatch_async(backgroundQueue, ^{
NSArray *graphData = [self generateDataPointsForGraph];
UIImage* image = [self drawGraph:graphData];
dispatch_async(dispatch_get_main_queue(), ^{
self.imageView.image = image;
});
});
Step 1: Use NSOperation
NSOperationQueue* drawingQueue = [[NSOperationQueue alloc] init];
[drawingQueue addOperationWithBlock:^{
NSArray *graphData = [self generateDataPointsForGraph];
UIImage* image = [self drawGraph:graphData];
[[NSOperationQueue mainQueue] addOperationWithBlock:^{
self.imageView.image = image;
}];
}];
How to cancel this?
Step 2: Use NSBlockOperation
NSBlockOperation* drawingOperation =
[NSBlockOperation blockOperationWithBlock:^{
NSArray *graphData = [self generateDataPointsForGraph];
UIImage* image = [self drawGraph:graphData];
[[NSOperationQueue mainQueue] addOperationWithBlock:^{
self.imageView.image = image;
}];
}];
[drawingQueue addOperation:drawingOperation];
Step 3: Pull out the completion handler
NSOperation* drawingOperation = [NSBlockOperation blockOperationWithBlock:^{
NSArray *graphData = [self generateDataPointsForGraph];
self.image = [self drawGraph:graphData];
}];
drawingOperation.completionBlock = ^{
[[NSOperationQueue mainQueue] addOperationWithBlock:^{
self.imageView.image = self.image;
}];
};
Step 4: Custom NSOperation subclass
NSData *data = [self generateDataPointsForGraph];
NSOperation* drawingOperation =
[DrawingOperation drawingOperationWithData:data];
drawingOperation.completionBlock = ^{
[[NSOperationQueue mainQueue] addOperationWithBlock:^{
self.imageView.image = image;
}];
};
How to efficiently import
data into Core Data
Efficiently Importing Data
— Implement Find-or-Create Efficiently
— Reduce Peak Memory Footprint
https://developer.apple.com/library/ios/
documentation/Cocoa/Conceptual/CoreData/
Articles/cdImporting.html
Importing employees
for (WebserviceEmployee *webserviceEmployee) {
NSNumber *identifier = webserviceEmployee.identifier;
Employee *employee = [self findEmployeeWithIdentifier:identifier];
if (employee == nil) {
employee = [self createEmployeWithIdentifier:identifier];
}
// Update data
}
Importing more efficiently
NSMutableArray *identifiers = [NSMutableArray array];
for (WebserviceEmployee *webserviceEmployee) {
NSNumber *identifier = webserviceEmployee.identifier;
[identifiers addObject:identifier];
}
NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
fetchRequest.predicate = [NSPredicate
predicateWithFormat:@"(employeeID IN %@)", identifiers];
Import in batches
Use a separate context
Normal Core Data Stack
NSManagedObjectContextNSManagedObjectContext NSManagedObjectContext
SQLite
NSPersistentStore
NSPersistentStoreCoordinator
Double MOC Stack
Small imports
NSManagedObjectContext* context =
[[NSManagedObjectContext alloc]
initWithConcurrencyType:NSPrivateQueueConcurrencyType];
context.persistentStoreCoordinator = self.ptStoreCoordinator;
[self.context performBlock:^{
[self import];
}];
[[NSNotificationCenter defaultCenter]
addObserverForName:NSManagedObjectContextDidSaveNotification
object:nil
queue:nil
usingBlock:^(NSNotification* note)
{
NSManagedObjectContext *moc = self.mainMOC;
if (note.object != moc) {
[moc performBlock:^(){
[moc mergeChangesFromContextDidSaveNotification:note];
}];
};
}];
NSManagedObjectContextNSManagedObjectContext NSManagedObjectContext
!
SQLite
NSPersistentStore
NSPersistentStoreCoordinator
!
!
!
Double MOC Stack
You might want to consider using a different
concurrency style, and this time you have two
persistent store coordinators, two almost
completely separate Core Data stacks.
Source: http://asciiwwdc.com/2013/sessions/
211
SQLite
!
NSPersistentStore
NSPersistentStoreCoordinator
NSManagedObjectContext
NSPersistentStore
NSPersistentStoreCoordinator
NSManagedObjectContext
!
!
!
NSPersistentStore
NSPersistentStoreCoordinator
NSManagedObjectContext
NSPersistentStore
NSPersistentStoreCoordinator
NSManagedObjectContext
!
!
!
SQLite
!
NSPersistentStore
NSPersistentStoreCoordinator
NSManagedObjectContext
NSPersistentStore
NSPersistentStoreCoordinator
NSManagedObjectContext
!
!
!
NSPersistentStore
NSPersistentStoreCoordinator
NSManagedObjectContext
NSPersistentStore
NSPersistentStoreCoordinator
NSManagedObjectContext
!
!
!
NSManagedObjectContextNSManagedObjectContext NSManagedObjectContext
!
SQLite
NSPersistentStore
NSPersistentStoreCoordinator
!
!
!
Importing Recap
Didn't turn out to be a problem: we shipped
the sqlite file for the initial import.
How to make objects play well
when concurrent
@interface Account : NSObject
@property (nonatomic) double balance;
- (void)transfer:(double)euros to:(Account*)other;
@end
- (void)transfer:(double)euros to:(Account*)other
{
self.balance = self.balance - euros;
other.balance = other.balance + euros;
}
What happens if two methods call this method
at the same time? From different threads?
The same code, how the compiler sees it
- (void)transfer:(double)euros to:(Account*)other
{
double currentBalance = self.balance;
self.balance = currentBalance - euros;
double otherBalance = other.balance;
other.balance = otherBalance + euros;
}
a b [a.transfer:20 to:b] [a.transfer:30 to:b]
100 0
currentBalance = 100
currentBalance = 100
100 0
a.balance = 100 - 20
80 0
b.balance = b.balance + 20
80 20
a.balance = 100 - 30
70 20
a b [a.transfer:20 to:b] [a.transfer:30 to:b]
100 0
currentBalance = 100
currentBalance = 100
100 0
a.balance = 100 - 20
80 0
b.balance = b.balance + 20
80 20
a.balance = 100 - 30
70 20
- (void)transfer:(double)euros to:(Account*)other
{
@synchronized(self) {
self.balance = self.balance - euros;
other.balance = other.balance + euros;
}
}
- (void)transfer:(double)euros to:(Account*)other
{
@synchronized(self) {
@synchronized(other) {
self.balance = self.balance - euros;
other.balance = other.balance + euros;
}
}
}
Problem: deadlock.
- (void)transfer:(double)euros to:(Account*)other
{
@synchronized(self.class) {
self.balance = self.balance - euros;
other.balance = other.balance + euros;
}
}
Solution: move concurrency
to a different level
Do it the GCD way
Account* account = [Account new];
Account* other = [Account new];
dispatch_queue_t accountOperations =
dispatch_queue_create("accounting", DISPATCH_QUEUE_SERIAL);
dispatch_async(accountOperations, ^{
[account transfer:200 to:other];
});
dispatch_async will never block.
There are two ways of constructing a software
design: One way is to make it so simple that
there are obviously no deficiencies, and the
other way is to make it so complicated that
there are no obvious deficiencies. The first
method is far more difficult.
— Tony Hoare
Thanks
— @chriseidhof
— http://www.objc.io
— http://www.uikonf.com
— http://www.decksetapp.com
Resources
— Concurrency Programming Guide
— Threading Programming Guide
— NSOperationQueue class reference
— http://www.objc.io/issue-2/
— http://www.opensource.apple.com/source/
objc4/objc4-551.1/runtime/objc-sync.mm
— http://googlemac.blogspot.de/2006/10/
synchronized-swimming.html
— WWDC12 #211: Concurrent User Interfaces on
iOS
Icons are from the Noun Project:
— Coffee Maker by Maureen Placente
— Coffee by Julia Soderberg
— Railroad Crossing by Edward Boatman
— Database by Stefan Parnarov
— Drawing by Daniel Shannon
— Hammer by Alex AS
— Lock by P.J. Onori
— Photoshop by Joe Harrison
— Register by Wilson Joseph

Más contenido relacionado

La actualidad más candente

Advance features of C++
Advance features of C++Advance features of C++
Advance features of C++
vidyamittal
 

La actualidad más candente (20)

C Graphics Functions
C Graphics FunctionsC Graphics Functions
C Graphics Functions
 
PART 6: FROM GEO INTO YOUR REPORT
PART 6: FROM GEO INTO YOUR REPORTPART 6: FROM GEO INTO YOUR REPORT
PART 6: FROM GEO INTO YOUR REPORT
 
Vector3
Vector3Vector3
Vector3
 
Computer graphics lab manual
Computer graphics lab manualComputer graphics lab manual
Computer graphics lab manual
 
C++ ARRAY WITH EXAMPLES
C++ ARRAY WITH EXAMPLESC++ ARRAY WITH EXAMPLES
C++ ARRAY WITH EXAMPLES
 
Modules and Scripts- Python Assignment Help
Modules and Scripts- Python Assignment HelpModules and Scripts- Python Assignment Help
Modules and Scripts- Python Assignment Help
 
Computer graphics lab assignment
Computer graphics lab assignmentComputer graphics lab assignment
Computer graphics lab assignment
 
Computer graphics lab manual
Computer graphics lab manualComputer graphics lab manual
Computer graphics lab manual
 
Advance features of C++
Advance features of C++Advance features of C++
Advance features of C++
 
C++ Windows Forms L08 - GDI P1
C++ Windows Forms L08 - GDI P1 C++ Windows Forms L08 - GDI P1
C++ Windows Forms L08 - GDI P1
 
CS101- Introduction to Computing- Lecture 35
CS101- Introduction to Computing- Lecture 35CS101- Introduction to Computing- Lecture 35
CS101- Introduction to Computing- Lecture 35
 
GCD in Action
GCD in ActionGCD in Action
GCD in Action
 
Functional Systems @ Twitter
Functional Systems @ TwitterFunctional Systems @ Twitter
Functional Systems @ Twitter
 
COMPUTER GRAPHICS LAB MANUAL
COMPUTER GRAPHICS LAB MANUALCOMPUTER GRAPHICS LAB MANUAL
COMPUTER GRAPHICS LAB MANUAL
 
Cgm Lab Manual
Cgm Lab ManualCgm Lab Manual
Cgm Lab Manual
 
PART 5: RASTER DATA
PART 5: RASTER DATAPART 5: RASTER DATA
PART 5: RASTER DATA
 
Shapes and calculate (area and contour) / C++ oop concept
Shapes and calculate (area and contour) / C++ oop conceptShapes and calculate (area and contour) / C++ oop concept
Shapes and calculate (area and contour) / C++ oop concept
 
Javascript: repetita iuvant
Javascript: repetita iuvantJavascript: repetita iuvant
Javascript: repetita iuvant
 
Introduction to c part 2
Introduction to c   part  2Introduction to c   part  2
Introduction to c part 2
 
Computer graphics
Computer graphics Computer graphics
Computer graphics
 

Destacado

10 cosas tecnologicas que me gustaria tener.
10 cosas tecnologicas que me gustaria tener.10 cosas tecnologicas que me gustaria tener.
10 cosas tecnologicas que me gustaria tener.
CarlosSandoval97
 

Destacado (15)

Постановление Пленума Верховного Суда РФ от 22.09.2015 г. № 38
Постановление Пленума Верховного Суда РФ от 22.09.2015 г. № 38Постановление Пленума Верховного Суда РФ от 22.09.2015 г. № 38
Постановление Пленума Верховного Суда РФ от 22.09.2015 г. № 38
 
Inizia a praticare lo sport per migliorare la tua salute!
Inizia a praticare lo sport per migliorare la tua salute!Inizia a praticare lo sport per migliorare la tua salute!
Inizia a praticare lo sport per migliorare la tua salute!
 
10 cosas tecnologicas que me gustaria tener.
10 cosas tecnologicas que me gustaria tener.10 cosas tecnologicas que me gustaria tener.
10 cosas tecnologicas que me gustaria tener.
 
Maison et Objet Janvier 2016 - Conférence "Comment développer votre activité ...
Maison et Objet Janvier 2016 - Conférence "Comment développer votre activité ...Maison et Objet Janvier 2016 - Conférence "Comment développer votre activité ...
Maison et Objet Janvier 2016 - Conférence "Comment développer votre activité ...
 
AZTECAS
AZTECASAZTECAS
AZTECAS
 
AZTECAS
AZTECASAZTECAS
AZTECAS
 
Marketplace extensions for Magento
Marketplace extensions for MagentoMarketplace extensions for Magento
Marketplace extensions for Magento
 
GCP
GCPGCP
GCP
 
Обзор практики рассмотрения судами дел, связанных с обязательным страхованием...
Обзор практики рассмотрения судами дел, связанных с обязательным страхованием...Обзор практики рассмотрения судами дел, связанных с обязательным страхованием...
Обзор практики рассмотрения судами дел, связанных с обязательным страхованием...
 
Обзор судебной практики по делам, связанным с реализацией права на матерински...
Обзор судебной практики по делам, связанным с реализацией права на матерински...Обзор судебной практики по делам, связанным с реализацией права на матерински...
Обзор судебной практики по делам, связанным с реализацией права на матерински...
 
Comment écrire des textes publicitaires percutants ?
Comment écrire des textes publicitaires percutants ?Comment écrire des textes publicitaires percutants ?
Comment écrire des textes publicitaires percutants ?
 
Постановление Пленума Верховного Суда РФ от 17 ноября 2015 года № 50
Постановление Пленума Верховного Суда РФ от 17 ноября 2015 года № 50Постановление Пленума Верховного Суда РФ от 17 ноября 2015 года № 50
Постановление Пленума Верховного Суда РФ от 17 ноября 2015 года № 50
 
Справка по результатам изучения практики рассмотрения судами дел о помещении ...
Справка по результатам изучения практики рассмотрения судами дел о помещении ...Справка по результатам изучения практики рассмотрения судами дел о помещении ...
Справка по результатам изучения практики рассмотрения судами дел о помещении ...
 
Fiche synthese images 2015
Fiche synthese images 2015Fiche synthese images 2015
Fiche synthese images 2015
 
Comment démarrer sur Storify (et ses successeurs).
Comment démarrer sur Storify (et ses successeurs).Comment démarrer sur Storify (et ses successeurs).
Comment démarrer sur Storify (et ses successeurs).
 

Similar a ITT 2014 - Chris Eidhof - Practical Concurrent Programming

Performance measurement and tuning
Performance measurement and tuningPerformance measurement and tuning
Performance measurement and tuning
AOE
 
Cs2312 OOPS LAB MANUAL
Cs2312 OOPS LAB MANUALCs2312 OOPS LAB MANUAL
Cs2312 OOPS LAB MANUAL
Prabhu D
 
CUDA by Example : Parallel Programming in CUDA C : Notes
CUDA by Example : Parallel Programming in CUDA C : NotesCUDA by Example : Parallel Programming in CUDA C : Notes
CUDA by Example : Parallel Programming in CUDA C : Notes
Subhajit Sahu
 
14multithreaded Graphics
14multithreaded Graphics14multithreaded Graphics
14multithreaded Graphics
Adil Jafri
 
Hızlı Cocoa Geliştirme (Develop your next cocoa app faster!)
Hızlı Cocoa Geliştirme (Develop your next cocoa app faster!)Hızlı Cocoa Geliştirme (Develop your next cocoa app faster!)
Hızlı Cocoa Geliştirme (Develop your next cocoa app faster!)
Sarp Erdag
 

Similar a ITT 2014 - Chris Eidhof - Practical Concurrent Programming (20)

Performance measurement and tuning
Performance measurement and tuningPerformance measurement and tuning
Performance measurement and tuning
 
Cs2312 OOPS LAB MANUAL
Cs2312 OOPS LAB MANUALCs2312 OOPS LAB MANUAL
Cs2312 OOPS LAB MANUAL
 
Creating an Uber Clone - Part IV - Transcript.pdf
Creating an Uber Clone - Part IV - Transcript.pdfCreating an Uber Clone - Part IV - Transcript.pdf
Creating an Uber Clone - Part IV - Transcript.pdf
 
Day 1
Day 1Day 1
Day 1
 
PVS-Studio and Continuous Integration: TeamCity. Analysis of the Open RollerC...
PVS-Studio and Continuous Integration: TeamCity. Analysis of the Open RollerC...PVS-Studio and Continuous Integration: TeamCity. Analysis of the Open RollerC...
PVS-Studio and Continuous Integration: TeamCity. Analysis of the Open RollerC...
 
"О некоторых особенностях Objective-C++" Влад Михайленко (Maps.Me)
"О некоторых особенностях Objective-C++" Влад Михайленко (Maps.Me)"О некоторых особенностях Objective-C++" Влад Михайленко (Maps.Me)
"О некоторых особенностях Objective-C++" Влад Михайленко (Maps.Me)
 
Whats new in ES2019
Whats new in ES2019Whats new in ES2019
Whats new in ES2019
 
Trident International Graphics Workshop 2014 1/5
Trident International Graphics Workshop 2014 1/5Trident International Graphics Workshop 2014 1/5
Trident International Graphics Workshop 2014 1/5
 
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...
 
C++20 the small things - Timur Doumler
C++20 the small things - Timur DoumlerC++20 the small things - Timur Doumler
C++20 the small things - Timur Doumler
 
CUDA by Example : Parallel Programming in CUDA C : Notes
CUDA by Example : Parallel Programming in CUDA C : NotesCUDA by Example : Parallel Programming in CUDA C : Notes
CUDA by Example : Parallel Programming in CUDA C : Notes
 
Intro
IntroIntro
Intro
 
Introduction to CUDA C: NVIDIA : Notes
Introduction to CUDA C: NVIDIA : NotesIntroduction to CUDA C: NVIDIA : Notes
Introduction to CUDA C: NVIDIA : Notes
 
14multithreaded Graphics
14multithreaded Graphics14multithreaded Graphics
14multithreaded Graphics
 
Lecture2.ppt
Lecture2.pptLecture2.ppt
Lecture2.ppt
 
Hızlı Cocoa Geliştirme (Develop your next cocoa app faster!)
Hızlı Cocoa Geliştirme (Develop your next cocoa app faster!)Hızlı Cocoa Geliştirme (Develop your next cocoa app faster!)
Hızlı Cocoa Geliştirme (Develop your next cocoa app faster!)
 
Cpp tutorial
Cpp tutorialCpp tutorial
Cpp tutorial
 
Angular and The Case for RxJS
Angular and The Case for RxJSAngular and The Case for RxJS
Angular and The Case for RxJS
 
Open Cv 2005 Q4 Tutorial
Open Cv 2005 Q4 TutorialOpen Cv 2005 Q4 Tutorial
Open Cv 2005 Q4 Tutorial
 
Let's migrate to Swift 3.0
Let's migrate to Swift 3.0Let's migrate to Swift 3.0
Let's migrate to Swift 3.0
 

Más de Istanbul Tech Talks

Más de Istanbul Tech Talks (15)

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 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 - 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 - 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 - 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 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
 
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 - Peter Steinberger - Architecting Modular Codebases
ITT 2014 - Peter Steinberger - Architecting Modular CodebasesITT 2014 - Peter Steinberger - Architecting Modular Codebases
ITT 2014 - Peter Steinberger - Architecting Modular Codebases
 
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 - 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
 

Último

DeepFakes presentation : brief idea of DeepFakes
DeepFakes presentation : brief idea of DeepFakesDeepFakes presentation : brief idea of DeepFakes
DeepFakes presentation : brief idea of DeepFakes
MayuraD1
 
Hospital management system project report.pdf
Hospital management system project report.pdfHospital management system project report.pdf
Hospital management system project report.pdf
Kamal Acharya
 
Integrated Test Rig For HTFE-25 - Neometrix
Integrated Test Rig For HTFE-25 - NeometrixIntegrated Test Rig For HTFE-25 - Neometrix
Integrated Test Rig For HTFE-25 - Neometrix
Neometrix_Engineering_Pvt_Ltd
 
Standard vs Custom Battery Packs - Decoding the Power Play
Standard vs Custom Battery Packs - Decoding the Power PlayStandard vs Custom Battery Packs - Decoding the Power Play
Standard vs Custom Battery Packs - Decoding the Power Play
Epec Engineered Technologies
 
1_Introduction + EAM Vocabulary + how to navigate in EAM.pdf
1_Introduction + EAM Vocabulary + how to navigate in EAM.pdf1_Introduction + EAM Vocabulary + how to navigate in EAM.pdf
1_Introduction + EAM Vocabulary + how to navigate in EAM.pdf
AldoGarca30
 
Kuwait City MTP kit ((+919101817206)) Buy Abortion Pills Kuwait
Kuwait City MTP kit ((+919101817206)) Buy Abortion Pills KuwaitKuwait City MTP kit ((+919101817206)) Buy Abortion Pills Kuwait
Kuwait City MTP kit ((+919101817206)) Buy Abortion Pills Kuwait
jaanualu31
 
Cara Menggugurkan Sperma Yang Masuk Rahim Biyar Tidak Hamil
Cara Menggugurkan Sperma Yang Masuk Rahim Biyar Tidak HamilCara Menggugurkan Sperma Yang Masuk Rahim Biyar Tidak Hamil
Cara Menggugurkan Sperma Yang Masuk Rahim Biyar Tidak Hamil
Cara Menggugurkan Kandungan 087776558899
 

Último (20)

Computer Networks Basics of Network Devices
Computer Networks  Basics of Network DevicesComputer Networks  Basics of Network Devices
Computer Networks Basics of Network Devices
 
Engineering Drawing focus on projection of planes
Engineering Drawing focus on projection of planesEngineering Drawing focus on projection of planes
Engineering Drawing focus on projection of planes
 
Navigating Complexity: The Role of Trusted Partners and VIAS3D in Dassault Sy...
Navigating Complexity: The Role of Trusted Partners and VIAS3D in Dassault Sy...Navigating Complexity: The Role of Trusted Partners and VIAS3D in Dassault Sy...
Navigating Complexity: The Role of Trusted Partners and VIAS3D in Dassault Sy...
 
Work-Permit-Receiver-in-Saudi-Aramco.pptx
Work-Permit-Receiver-in-Saudi-Aramco.pptxWork-Permit-Receiver-in-Saudi-Aramco.pptx
Work-Permit-Receiver-in-Saudi-Aramco.pptx
 
NO1 Top No1 Amil Baba In Azad Kashmir, Kashmir Black Magic Specialist Expert ...
NO1 Top No1 Amil Baba In Azad Kashmir, Kashmir Black Magic Specialist Expert ...NO1 Top No1 Amil Baba In Azad Kashmir, Kashmir Black Magic Specialist Expert ...
NO1 Top No1 Amil Baba In Azad Kashmir, Kashmir Black Magic Specialist Expert ...
 
Tamil Call Girls Bhayandar WhatsApp +91-9930687706, Best Service
Tamil Call Girls Bhayandar WhatsApp +91-9930687706, Best ServiceTamil Call Girls Bhayandar WhatsApp +91-9930687706, Best Service
Tamil Call Girls Bhayandar WhatsApp +91-9930687706, Best Service
 
COST-EFFETIVE and Energy Efficient BUILDINGS ptx
COST-EFFETIVE  and Energy Efficient BUILDINGS ptxCOST-EFFETIVE  and Energy Efficient BUILDINGS ptx
COST-EFFETIVE and Energy Efficient BUILDINGS ptx
 
DeepFakes presentation : brief idea of DeepFakes
DeepFakes presentation : brief idea of DeepFakesDeepFakes presentation : brief idea of DeepFakes
DeepFakes presentation : brief idea of DeepFakes
 
Hospital management system project report.pdf
Hospital management system project report.pdfHospital management system project report.pdf
Hospital management system project report.pdf
 
Bhubaneswar🌹Call Girls Bhubaneswar ❤Komal 9777949614 💟 Full Trusted CALL GIRL...
Bhubaneswar🌹Call Girls Bhubaneswar ❤Komal 9777949614 💟 Full Trusted CALL GIRL...Bhubaneswar🌹Call Girls Bhubaneswar ❤Komal 9777949614 💟 Full Trusted CALL GIRL...
Bhubaneswar🌹Call Girls Bhubaneswar ❤Komal 9777949614 💟 Full Trusted CALL GIRL...
 
Integrated Test Rig For HTFE-25 - Neometrix
Integrated Test Rig For HTFE-25 - NeometrixIntegrated Test Rig For HTFE-25 - Neometrix
Integrated Test Rig For HTFE-25 - Neometrix
 
Standard vs Custom Battery Packs - Decoding the Power Play
Standard vs Custom Battery Packs - Decoding the Power PlayStandard vs Custom Battery Packs - Decoding the Power Play
Standard vs Custom Battery Packs - Decoding the Power Play
 
HAND TOOLS USED AT ELECTRONICS WORK PRESENTED BY KOUSTAV SARKAR
HAND TOOLS USED AT ELECTRONICS WORK PRESENTED BY KOUSTAV SARKARHAND TOOLS USED AT ELECTRONICS WORK PRESENTED BY KOUSTAV SARKAR
HAND TOOLS USED AT ELECTRONICS WORK PRESENTED BY KOUSTAV SARKAR
 
GEAR TRAIN- BASIC CONCEPTS AND WORKING PRINCIPLE
GEAR TRAIN- BASIC CONCEPTS AND WORKING PRINCIPLEGEAR TRAIN- BASIC CONCEPTS AND WORKING PRINCIPLE
GEAR TRAIN- BASIC CONCEPTS AND WORKING PRINCIPLE
 
1_Introduction + EAM Vocabulary + how to navigate in EAM.pdf
1_Introduction + EAM Vocabulary + how to navigate in EAM.pdf1_Introduction + EAM Vocabulary + how to navigate in EAM.pdf
1_Introduction + EAM Vocabulary + how to navigate in EAM.pdf
 
Orlando’s Arnold Palmer Hospital Layout Strategy-1.pptx
Orlando’s Arnold Palmer Hospital Layout Strategy-1.pptxOrlando’s Arnold Palmer Hospital Layout Strategy-1.pptx
Orlando’s Arnold Palmer Hospital Layout Strategy-1.pptx
 
Kuwait City MTP kit ((+919101817206)) Buy Abortion Pills Kuwait
Kuwait City MTP kit ((+919101817206)) Buy Abortion Pills KuwaitKuwait City MTP kit ((+919101817206)) Buy Abortion Pills Kuwait
Kuwait City MTP kit ((+919101817206)) Buy Abortion Pills Kuwait
 
Introduction to Serverless with AWS Lambda
Introduction to Serverless with AWS LambdaIntroduction to Serverless with AWS Lambda
Introduction to Serverless with AWS Lambda
 
Online electricity billing project report..pdf
Online electricity billing project report..pdfOnline electricity billing project report..pdf
Online electricity billing project report..pdf
 
Cara Menggugurkan Sperma Yang Masuk Rahim Biyar Tidak Hamil
Cara Menggugurkan Sperma Yang Masuk Rahim Biyar Tidak HamilCara Menggugurkan Sperma Yang Masuk Rahim Biyar Tidak Hamil
Cara Menggugurkan Sperma Yang Masuk Rahim Biyar Tidak Hamil
 

ITT 2014 - Chris Eidhof - Practical Concurrent Programming