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

Tembisa Central Terminating Pills +27838792658 PHOMOLONG Top Abortion Pills F...
Tembisa Central Terminating Pills +27838792658 PHOMOLONG Top Abortion Pills F...Tembisa Central Terminating Pills +27838792658 PHOMOLONG Top Abortion Pills F...
Tembisa Central Terminating Pills +27838792658 PHOMOLONG Top Abortion Pills F...
drjose256
 
1893-part-1-2016 for Earthquake load design
1893-part-1-2016 for Earthquake load design1893-part-1-2016 for Earthquake load design
1893-part-1-2016 for Earthquake load design
AshishSingh1301
 
Seizure stage detection of epileptic seizure using convolutional neural networks
Seizure stage detection of epileptic seizure using convolutional neural networksSeizure stage detection of epileptic seizure using convolutional neural networks
Seizure stage detection of epileptic seizure using convolutional neural networks
IJECEIAES
 
Online crime reporting system project.pdf
Online crime reporting system project.pdfOnline crime reporting system project.pdf
Online crime reporting system project.pdf
Kamal Acharya
 

Último (20)

8th International Conference on Soft Computing, Mathematics and Control (SMC ...
8th International Conference on Soft Computing, Mathematics and Control (SMC ...8th International Conference on Soft Computing, Mathematics and Control (SMC ...
8th International Conference on Soft Computing, Mathematics and Control (SMC ...
 
Tembisa Central Terminating Pills +27838792658 PHOMOLONG Top Abortion Pills F...
Tembisa Central Terminating Pills +27838792658 PHOMOLONG Top Abortion Pills F...Tembisa Central Terminating Pills +27838792658 PHOMOLONG Top Abortion Pills F...
Tembisa Central Terminating Pills +27838792658 PHOMOLONG Top Abortion Pills F...
 
Diploma Engineering Drawing Qp-2024 Ece .pdf
Diploma Engineering Drawing Qp-2024 Ece .pdfDiploma Engineering Drawing Qp-2024 Ece .pdf
Diploma Engineering Drawing Qp-2024 Ece .pdf
 
1893-part-1-2016 for Earthquake load design
1893-part-1-2016 for Earthquake load design1893-part-1-2016 for Earthquake load design
1893-part-1-2016 for Earthquake load design
 
Seizure stage detection of epileptic seizure using convolutional neural networks
Seizure stage detection of epileptic seizure using convolutional neural networksSeizure stage detection of epileptic seizure using convolutional neural networks
Seizure stage detection of epileptic seizure using convolutional neural networks
 
Filters for Electromagnetic Compatibility Applications
Filters for Electromagnetic Compatibility ApplicationsFilters for Electromagnetic Compatibility Applications
Filters for Electromagnetic Compatibility Applications
 
Developing a smart system for infant incubators using the internet of things ...
Developing a smart system for infant incubators using the internet of things ...Developing a smart system for infant incubators using the internet of things ...
Developing a smart system for infant incubators using the internet of things ...
 
Electrical shop management system project report.pdf
Electrical shop management system project report.pdfElectrical shop management system project report.pdf
Electrical shop management system project report.pdf
 
Linux Systems Programming: Semaphores, Shared Memory, and Message Queues
Linux Systems Programming: Semaphores, Shared Memory, and Message QueuesLinux Systems Programming: Semaphores, Shared Memory, and Message Queues
Linux Systems Programming: Semaphores, Shared Memory, and Message Queues
 
Seismic Hazard Assessment Software in Python by Prof. Dr. Costas Sachpazis
Seismic Hazard Assessment Software in Python by Prof. Dr. Costas SachpazisSeismic Hazard Assessment Software in Python by Prof. Dr. Costas Sachpazis
Seismic Hazard Assessment Software in Python by Prof. Dr. Costas Sachpazis
 
Introduction to Artificial Intelligence and History of AI
Introduction to Artificial Intelligence and History of AIIntroduction to Artificial Intelligence and History of AI
Introduction to Artificial Intelligence and History of AI
 
Geometric constructions Engineering Drawing.pdf
Geometric constructions Engineering Drawing.pdfGeometric constructions Engineering Drawing.pdf
Geometric constructions Engineering Drawing.pdf
 
Involute of a circle,Square, pentagon,HexagonInvolute_Engineering Drawing.pdf
Involute of a circle,Square, pentagon,HexagonInvolute_Engineering Drawing.pdfInvolute of a circle,Square, pentagon,HexagonInvolute_Engineering Drawing.pdf
Involute of a circle,Square, pentagon,HexagonInvolute_Engineering Drawing.pdf
 
Online crime reporting system project.pdf
Online crime reporting system project.pdfOnline crime reporting system project.pdf
Online crime reporting system project.pdf
 
NEWLETTER FRANCE HELICES/ SDS SURFACE DRIVES - MAY 2024
NEWLETTER FRANCE HELICES/ SDS SURFACE DRIVES - MAY 2024NEWLETTER FRANCE HELICES/ SDS SURFACE DRIVES - MAY 2024
NEWLETTER FRANCE HELICES/ SDS SURFACE DRIVES - MAY 2024
 
Vip ℂall Girls Karkardooma Phone No 9999965857 High Profile ℂall Girl Delhi N...
Vip ℂall Girls Karkardooma Phone No 9999965857 High Profile ℂall Girl Delhi N...Vip ℂall Girls Karkardooma Phone No 9999965857 High Profile ℂall Girl Delhi N...
Vip ℂall Girls Karkardooma Phone No 9999965857 High Profile ℂall Girl Delhi N...
 
Instruct Nirmaana 24-Smart and Lean Construction Through Technology.pdf
Instruct Nirmaana 24-Smart and Lean Construction Through Technology.pdfInstruct Nirmaana 24-Smart and Lean Construction Through Technology.pdf
Instruct Nirmaana 24-Smart and Lean Construction Through Technology.pdf
 
UNIT-2 image enhancement.pdf Image Processing Unit 2 AKTU
UNIT-2 image enhancement.pdf Image Processing Unit 2 AKTUUNIT-2 image enhancement.pdf Image Processing Unit 2 AKTU
UNIT-2 image enhancement.pdf Image Processing Unit 2 AKTU
 
Insurance management system project report.pdf
Insurance management system project report.pdfInsurance management system project report.pdf
Insurance management system project report.pdf
 
handbook on reinforce concrete and detailing
handbook on reinforce concrete and detailinghandbook on reinforce concrete and detailing
handbook on reinforce concrete and detailing
 

ITT 2014 - Chris Eidhof - Practical Concurrent Programming