SlideShare a Scribd company logo
Model Driven
App Development
@peterfriese | @itemismobile
http://peterfriese.de | http://mobile.itemis.de
for iPhone
and Android
AWESOME
OUR GOAL
BEING
Great, so...
How to be Awesome?
How to be Awesome?
Time
to
Market
Happy
Users
Precision.Great
Ideas
How to be Awesome?
Time
to
Market
Happy
Users
Precision.Great
Ideas
Great
Ideas
How to be Awesome?
Time
to
Market
Happy
Users
Great
Ideas
Precision.
How to be Awesome?
Happy
Users
Precision.Great
Ideas
Time
to
Market
How to be Awesome?
Time
to
Market
Precision.Great
Ideas
Happy
Users
There Are 4 Things That Keep
Us From Being Awesome
Accidental
Complexity
Wrong Level
of
Abstraction
Ugly
Design
Boring
Code
There Are 4 Things That Keep
Us From Being Awesome
Accidental
Complexity
Wrong Level
of
Abstraction
Ugly
Design
Boring
Code
There Are 4 Things That Keep
Us From Being Awesome
Wrong Level
of
Abstraction
Ugly
Design
Boring
Code
Accidental
Complexity
There Are 4 Things That Keep
Us From Being Awesome
Ugly
Design
Boring
Code
Accidental
Complexity
Wrong Level
of
Abstraction
There Are 4 Things That Keep
Us From Being Awesome
Boring
Code
Accidental
Complexity
Wrong Level
of
Abstraction
Ugly
Design
Oh, did I mention
Oh, did I mention
Bugs
Redundancy
Multi-
Platform
Challenges vs. Threats
Time
to
Market
Happy
Users
Precision.Great
Ideas
Accidental
Complexity
Wrong Level
of
Abstraction
Ugly
Design
Boring
Code
Challenges vs. Threats
Time
to
Market
Happy
Users
Precision.Great
Ideas
Accidental
Complexity
Wrong Level
of
Abstraction
Ugly
Design
Boring
Code
not in this talk
not in this talk
Accidental
Complexity
Wrong Level
of
Abstraction
Boring
Code
Time
to
Market
Happy
Users
Precision.
Bugs
Redundancy
Multi-
Platform
Accidental
Complexity
Wrong Level
of
Abstraction
Boring
Code
Time
to
Market
Happy
Users
Precision.
Bugs
Redundancy
Multi-
Platform
Is there anything we can
do about all this?
YES, there is.
Why?
... is code so boring (at times)?
... is there so much accidental complexity?
... is there so much redundancy?
... is our code so buggy?
Wrong Level of Abstraction!
... is code so boring (at times)?
... is there so much accidental complexity?
... is there so much redundancy?
... is our code so buggy?
Software artifact
Anatomy of Modern Software
Libraries
Frameworksmanually written code
Anatomy of Modern Software
schematic code (manually written)
Libraries
Frameworks
manually written
code
Anatomy of Modern Software
RESTRICTIONS
GAIN VELOCITY
THROUGH
Text
Lists Details Custom
DOMAIN
ANALYZING
THE
http://www.flickr.com/photos/jakematesdesign/4689135843/
Anatomy
of Data-Driven
Apps
Cells
View
Navigation
Cells
View
Navigation
Name
Image
Speaker
Title
Location
Session
Entity
Data Provider
LANGUAGE
DOMAIN
SPECIFIC
BUILDING A
http://en.wikipedia.org/wiki/File:Rosetta_Stone.JPG
tabbarApplication itemisApp {
	 button {
	 	 title= "Tuesday"
	 	 icon= "calendar.png"
	 	 view= SessionList( SessionsByDay("0") )
	 }
	 button {
	 	 title= "Wednesday"
	 	 icon= "calendar.png"
	 	 view= SessionList( SessionsByDay("1") )
	 }
	
	 button {
	 	 title= "Thursday"
	 	 icon= "calendar.png"
	 	 view= SessionList( SessionsByDay("2") )
	 }
	
	 button {
	 	 title= "Speakers"
	 	 icon= "person.png"
	 	 view= SpeakersList( AllSpeakers() )
	 }
}
tabbarApplication itemisApp {
	 button {
	 	 title= "Tuesday"
	 	 icon= "calendar.png"
	 	 view= SessionList( SessionsByDay("0") )
	 }
	 button {
	 	 title= "Wednesday"
	 	 icon= "calendar.png"
	 	 view= SessionList( SessionsByDay("1") )
	 }
	
	 button {
	 	 title= "Thursday"
	 	 icon= "calendar.png"
	 	 view= SessionList( SessionsByDay("2") )
	 }
	
	 button {
	 	 title= "Speakers"
	 	 icon= "person.png"
	 	 view= SpeakersList( AllSpeakers() )
	 }
}
-(UIViewController*)createController {
! itemisAppProviders *providers = [[[itemisAppProviders alloc] init] autorelease];
! UITabBarController *result = [[UITabBarController alloc] init];
! NSMutableArray *controllers = [NSMutableArray array];
!
! UIViewController<IPUIView> *controller;
! UINavigationController *navController;
! IPContentProvider *contentProvider;
! // controller for @"Tuesday"
! contentProvider = [providers providerForSessionsByDay: @"0"];
!
! controller = [[SessionListViewController alloc] init];
! [controller setContentProvider: contentProvider];
! controller.tabBarItem.title = @"Tuesday";
! controller.tabBarItem.image = [UIImage imageNamed:@"calendar.png"];
! navController = [[UINavigationController alloc] initWithRootViewController:controller];
! [controllers addObject: navController];
! [controller release];
! [navController release];
!
! // controller for @"Wednesday"
! contentProvider = [providers providerForSessionsByDay: @"1"];
!
! controller = [[SessionListViewController alloc] init];
! [controller setContentProvider: contentProvider];
! controller.tabBarItem.title = @"Wednesday";
! controller.tabBarItem.image = [UIImage imageNamed:@"calendar.png"];
! navController = [[UINavigationController alloc] initWithRootViewController:controller];
! [controllers addObject: navController];
! [controller release];
! [navController release];
!
! // controller for @"Thursday"
! contentProvider = [providers providerForSessionsByDay: @"2"];
!
! controller = [[SessionListViewController alloc] init];
! [controller setContentProvider: contentProvider];
! controller.tabBarItem.title = @"Thursday";
! controller.tabBarItem.image = [UIImage imageNamed:@"calendar.png"];
! navController = [[UINavigationController alloc] initWithRootViewController:controller];
! [controllers addObject: navController];
! [controller release];
! [navController release];
!
! // controller for @"Speakers"
! contentProvider = [providers providerForAllSpeakers];
!
! controller = [[SpeakersListViewController alloc] init];
! [controller setContentProvider: contentProvider];
! controller.tabBarItem.title = @"Speakers";
! controller.tabBarItem.image = [UIImage imageNamed:@"person.png"];
! navController = [[UINavigationController alloc] initWithRootViewController:controller];
! [controllers addObject: navController];
! [controller release];
! [navController release];
! result.viewControllers = controllers;
! return result;
}
tabbarApplication itemisApp {
	 button {
	 	 title= "Tuesday"
	 	 icon= "calendar.png"
	 	 view= SessionList( SessionsByDay("0") )
	 }
	 button {
	 	 title= "Wednesday"
	 	 icon= "calendar.png"
	 	 view= SessionList( SessionsByDay("1") )
	 }
	
	 button {
	 	 title= "Thursday"
	 	 icon= "calendar.png"
	 	 view= SessionList( SessionsByDay("2") )
	 }
	
	 button {
	 	 title= "Speakers"
	 	 icon= "person.png"
	 	 view= SpeakersList( AllSpeakers() )
	 }
}
-(UIViewController*)createController {
! itemisAppProviders *providers = [[[itemisAppProviders alloc] init] autorelease];
! UITabBarController *result = [[UITabBarController alloc] init];
! NSMutableArray *controllers = [NSMutableArray array];
!
! UIViewController<IPUIView> *controller;
! UINavigationController *navController;
! IPContentProvider *contentProvider;
! // controller for @"Tuesday"
! contentProvider = [providers providerForSessionsByDay: @"0"];
!
! controller = [[SessionListViewController alloc] init];
! [controller setContentProvider: contentProvider];
! controller.tabBarItem.title = @"Tuesday";
! controller.tabBarItem.image = [UIImage imageNamed:@"calendar.png"];
! navController = [[UINavigationController alloc] initWithRootViewController:controller];
! [controllers addObject: navController];
! [controller release];
! [navController release];
!
! // controller for @"Wednesday"
! contentProvider = [providers providerForSessionsByDay: @"1"];
!
! controller = [[SessionListViewController alloc] init];
! [controller setContentProvider: contentProvider];
! controller.tabBarItem.title = @"Wednesday";
! controller.tabBarItem.image = [UIImage imageNamed:@"calendar.png"];
! navController = [[UINavigationController alloc] initWithRootViewController:controller];
! [controllers addObject: navController];
! [controller release];
! [navController release];
!
! // controller for @"Thursday"
! contentProvider = [providers providerForSessionsByDay: @"2"];
!
! controller = [[SessionListViewController alloc] init];
! [controller setContentProvider: contentProvider];
! controller.tabBarItem.title = @"Thursday";
! controller.tabBarItem.image = [UIImage imageNamed:@"calendar.png"];
! navController = [[UINavigationController alloc] initWithRootViewController:controller];
! [controllers addObject: navController];
! [controller release];
! [navController release];
!
! // controller for @"Speakers"
! contentProvider = [providers providerForAllSpeakers];
!
! controller = [[SpeakersListViewController alloc] init];
! [controller setContentProvider: contentProvider];
! controller.tabBarItem.title = @"Speakers";
! controller.tabBarItem.image = [UIImage imageNamed:@"person.png"];
! navController = [[UINavigationController alloc] initWithRootViewController:controller];
! [controllers addObject: navController];
! [controller release];
! [navController release];
! result.viewControllers = controllers;
! return result;
}
tabbarApplication itemisApp {
	 button {
	 	 title= "Tuesday"
	 	 icon= "calendar.png"
	 	 view= SessionList( SessionsByDay("0") )
	 }
	 button {
	 	 title= "Wednesday"
	 	 icon= "calendar.png"
	 	 view= SessionList( SessionsByDay("1") )
	 }
	
	 button {
	 	 title= "Thursday"
	 	 icon= "calendar.png"
	 	 view= SessionList( SessionsByDay("2") )
	 }
	
	 button {
	 	 title= "Speakers"
	 	 icon= "person.png"
	 	 view= SpeakersList( AllSpeakers() )
	 }
}
-(UIViewController*)createController {
! itemisAppProviders *providers = [[[itemisAppProviders alloc] init] autorelease];
! UITabBarController *result = [[UITabBarController alloc] init];
! NSMutableArray *controllers = [NSMutableArray array];
!
! UIViewController<IPUIView> *controller;
! UINavigationController *navController;
! IPContentProvider *contentProvider;
! // controller for @"Tuesday"
! contentProvider = [providers providerForSessionsByDay: @"0"];
!
! controller = [[SessionListViewController alloc] init];
! [controller setContentProvider: contentProvider];
! controller.tabBarItem.title = @"Tuesday";
! controller.tabBarItem.image = [UIImage imageNamed:@"calendar.png"];
! navController = [[UINavigationController alloc] initWithRootViewController:controller];
! [controllers addObject: navController];
! [controller release];
! [navController release];
!
! // controller for @"Wednesday"
! contentProvider = [providers providerForSessionsByDay: @"1"];
!
! controller = [[SessionListViewController alloc] init];
! [controller setContentProvider: contentProvider];
! controller.tabBarItem.title = @"Wednesday";
! controller.tabBarItem.image = [UIImage imageNamed:@"calendar.png"];
! navController = [[UINavigationController alloc] initWithRootViewController:controller];
! [controllers addObject: navController];
! [controller release];
! [navController release];
!
! // controller for @"Thursday"
! contentProvider = [providers providerForSessionsByDay: @"2"];
!
! controller = [[SessionListViewController alloc] init];
! [controller setContentProvider: contentProvider];
! controller.tabBarItem.title = @"Thursday";
! controller.tabBarItem.image = [UIImage imageNamed:@"calendar.png"];
! navController = [[UINavigationController alloc] initWithRootViewController:controller];
! [controllers addObject: navController];
! [controller release];
! [navController release];
!
! // controller for @"Speakers"
! contentProvider = [providers providerForAllSpeakers];
!
! controller = [[SpeakersListViewController alloc] init];
! [controller setContentProvider: contentProvider];
! controller.tabBarItem.title = @"Speakers";
! controller.tabBarItem.image = [UIImage imageNamed:@"person.png"];
! navController = [[UINavigationController alloc] initWithRootViewController:controller];
! [controllers addObject: navController];
! [controller release];
! [navController release];
! result.viewControllers = controllers;
! return result;
}
135
http://www.xtext.org
ENGINE
TEMPLATE
GENERATE
CODE
WITH A
«DEFINE moduleFile FOR Application»
«FILE filenameApplicationDelegateModule()»
#import "«filenameApplicationDelegateHeader()»"
#import "IPUIView.h"
#import "«filenameCentralProvidersHeader()»"
«EXPAND importStatements-»
@implementation «applicationDelegateClassname()»
@synthesize window, rootController;
-(UIViewController*)createController {
	 «centralProvidersClassName()» *providers = [[[«centralProvidersClassName()» alloc] init] autorelease];
	 UITabBarController *result = [[UITabBarController alloc] init];
	 NSMutableArray *controllers = [NSMutableArray array];
	
	 UIViewController<IPUIView> *controller;
	 UINavigationController *navController;
	 IPContentProvider *contentProvider;
«EXPAND barControllerInstance FOREACH buttons»
	 result.viewControllers = controllers;
	 return result;
}
- (void)applicationDidFinishLaunching:(UIApplication *)application {
	 self.rootController = [self createController];
	 [window addSubview: [self.rootController view]];
[window makeKeyAndVisible];
}
- (void)dealloc {
	 self.rootController = nil;
[window release];
[super dealloc];
}
@end
«ENDFILE»
«ENDDEFINE»
«DEFINE moduleFile FOR Application»
«FILE filenameApplicationDelegateModule()»
#import "«filenameApplicationDelegateHeader()»"
#import "IPUIView.h"
#import "«filenameCentralProvidersHeader()»"
«EXPAND importStatements-»
@implementation «applicationDelegateClassname()»
@synthesize window, rootController;
-(UIViewController*)createController {
	 «centralProvidersClassName()» *providers = [[[«centralProvidersClassName()» alloc] init] autorelease];
	 UITabBarController *result = [[UITabBarController alloc] init];
	 NSMutableArray *controllers = [NSMutableArray array];
	
	 UIViewController<IPUIView> *controller;
	 UINavigationController *navController;
	 IPContentProvider *contentProvider;
«EXPAND barControllerInstance FOREACH buttons»
	 result.viewControllers = controllers;
	 return result;
}
- (void)applicationDidFinishLaunching:(UIApplication *)application {
	 self.rootController = [self createController];
	 [window addSubview: [self.rootController view]];
[window makeKeyAndVisible];
}
- (void)dealloc {
	 self.rootController = nil;
[window release];
[super dealloc];
}
@end
«ENDFILE»
«ENDDEFINE»
tabbarApplication itemisApp {
	 button {
	 	 title= "Tuesday"
	 	 icon= "calendar.png"
	 	 view= SessionList( SessionsByDay("0") )
	 }
	 button {
	 	 title= "Wednesday"
	 	 icon= "calendar.png"
	 	 view= SessionList( SessionsByDay("1") )
	 }
	
	 button {
	 	 title= "Thursday"
	 	 icon= "calendar.png"
	 	 view= SessionList( SessionsByDay("2") )
	 }
	
	 button {
	 	 title= "Speakers"
	 	 icon= "person.png"
	 	 view= SpeakersList( AllSpeakers() )
	 }
}
«DEFINE moduleFile FOR Application»
«FILE filenameApplicationDelegateModule()»
#import "«filenameApplicationDelegateHeader()»"
#import "IPUIView.h"
#import "«filenameCentralProvidersHeader()»"
«EXPAND importStatements-»
@implementation «applicationDelegateClassname()»
@synthesize window, rootController;
-(UIViewController*)createController {
	 «centralProvidersClassName()» *providers = [[[«centralProvidersClassName()» alloc] init] autorelease];
	 UITabBarController *result = [[UITabBarController alloc] init];
	 NSMutableArray *controllers = [NSMutableArray array];
	
	 UIViewController<IPUIView> *controller;
	 UINavigationController *navController;
	 IPContentProvider *contentProvider;
«EXPAND barControllerInstance FOREACH buttons»
	 result.viewControllers = controllers;
	 return result;
}
- (void)applicationDidFinishLaunching:(UIApplication *)application {
	 self.rootController = [self createController];
	 [window addSubview: [self.rootController view]];
[window makeKeyAndVisible];
}
- (void)dealloc {
	 self.rootController = nil;
[window release];
[super dealloc];
}
@end
«ENDFILE»
«ENDDEFINE»
tabbarApplication itemisApp {
	 button {
	 	 title= "Tuesday"
	 	 icon= "calendar.png"
	 	 view= SessionList( SessionsByDay("0") )
	 }
	 button {
	 	 title= "Wednesday"
	 	 icon= "calendar.png"
	 	 view= SessionList( SessionsByDay("1") )
	 }
	
	 button {
	 	 title= "Thursday"
	 	 icon= "calendar.png"
	 	 view= SessionList( SessionsByDay("2") )
	 }
	
	 button {
	 	 title= "Speakers"
	 	 icon= "person.png"
	 	 view= SpeakersList( AllSpeakers() )
	 }
}
«DEFINE barControllerInstance FOR TabbarButton»
	 «IF view.provider != null»
	 // controller for «this.title.expression('', '')»
	 contentProvider = «view.provider.contentProvider('providers', '', '')»;
	 «ENDIF»
	 controller = [[«view.view.className()» alloc] init];
	 [controller setContentProvider: contentProvider];
	 controller.tabBarItem.title = «title.expression('', '')»;
	 controller.tabBarItem.image =
	 	 [UIImage imageNamed:«this.icon.expression('','')»];
	 navController =
	 	 [[UINavigationController alloc]
	 	 	 initWithRootViewController:controller];
	 [controllers addObject: navController];
	 [controller release];
	 [navController release];
«ENDDEFINE»
tabbarApplication itemisApp {
	 button {
	 	 title= "Tuesday"
	 	 icon= "calendar.png"
	 	 view= SessionList( SessionsByDay("0") )
	 }
	 button {
	 	 title= "Wednesday"
	 	 icon= "calendar.png"
	 	 view= SessionList( SessionsByDay("1") )
	 }
	
	 button {
	 	 title= "Thursday"
	 	 icon= "calendar.png"
	 	 view= SessionList( SessionsByDay("2") )
	 }
	
	 button {
	 	 title= "Speakers"
	 	 icon= "person.png"
	 	 view= SpeakersList( AllSpeakers() )
	 }
}
INTEGRATION
TOOL
BUILDER
PROJECT
XCODE
INVOKE
DEMO
FUTURE
THE
SourceUI (Apple TV)
iPhone App
iPad App
Apple TV App
UI (iPad)
UI (iPhone)
@mschluepmann:
iPhone App
iPad App
TV App
@APPlauseDSL:
APPlause
DSL Program
APPlause
DSL
DEMO
code
Open source - EPL 1.0
code.google.com/p/applause/
‣ Showcase about conferences
‣ Tighter integration with Xcode
‣ Improved Android Generator
‣ Support for BlackBerry
‣ Support for Windows Phone 7
‣ Support for TV sets?
APPlause - Roadmap
@peterfriese | http://peterfriese.de
http://mobile.itemis.de

More Related Content

What's hot

Politics News and U.S. Elections Coverage
Politics News and U.S. Elections CoveragePolitics News and U.S. Elections Coverage
Politics News and U.S. Elections Coverage
roastedrecluse128
 
Business News, Personal Finance and Money News
Business News, Personal Finance and Money NewsBusiness News, Personal Finance and Money News
Business News, Personal Finance and Money News
eminentoomph4388
 
Technology and Science News - ABC News
Technology and Science News - ABC NewsTechnology and Science News - ABC News
Technology and Science News - ABC News
enchantingsched84
 
Politics News and U.S. Elections Coverage
Politics News and U.S. Elections CoveragePolitics News and U.S. Elections Coverage
Politics News and U.S. Elections Coverage
excitedfoyer2246
 
U.S. News | National News
U.S. News | National NewsU.S. News | National News
U.S. News | National News
coldpoet326
 
Technology and Science News - ABC News
Technology and Science News - ABC NewsTechnology and Science News - ABC News
Technology and Science News - ABC News
gapingtrousers365
 
Politics News and U.S. Elections Coverage
Politics News and U.S. Elections CoveragePolitics News and U.S. Elections Coverage
Politics News and U.S. Elections Coverage
plantresidence159
 
Health News & Articles | Healthy Living
Health News & Articles | Healthy LivingHealth News & Articles | Healthy Living
Health News & Articles | Healthy Living
seemlygown2854
 
New BYOB Law for Sayreville (The Suburban)
New BYOB Law for Sayreville (The Suburban)New BYOB Law for Sayreville (The Suburban)
New BYOB Law for Sayreville (The Suburban)Jacqueline Durett
 
Technology and Science News - ABC News
Technology and Science News - ABC NewsTechnology and Science News - ABC News
Technology and Science News - ABC News
talloration5719
 
South Amboy of 1920s Is Theme of Fundraiser (The Suburban)
South Amboy of 1920s Is Theme of Fundraiser (The Suburban)South Amboy of 1920s Is Theme of Fundraiser (The Suburban)
South Amboy of 1920s Is Theme of Fundraiser (The Suburban)Jacqueline Durett
 
International News | World News
International News | World NewsInternational News | World News
International News | World News
blogginatl1963
 
J Query (Complete Course) by Muhammad Ehtisham Siddiqui
J Query (Complete Course) by Muhammad Ehtisham SiddiquiJ Query (Complete Course) by Muhammad Ehtisham Siddiqui
J Query (Complete Course) by Muhammad Ehtisham Siddiqui
Muhammad Ehtisham Siddiqui
 
Technology and Science News - ABC News
Technology and Science News - ABC NewsTechnology and Science News - ABC News
Technology and Science News - ABC News
painstakingsled66
 
What Would You Do? With John Quinones
What Would You Do? With John QuinonesWhat Would You Do? With John Quinones
What Would You Do? With John Quinones
alertchair8725
 
U.S. News | National News
U.S. News | National NewsU.S. News | National News
U.S. News | National News
flowerypowder1308
 
Politics News and U.S. Elections Coverage
Politics News and U.S. Elections CoveragePolitics News and U.S. Elections Coverage
Politics News and U.S. Elections Coverage
greedycabin1256
 
Technology and Science News - ABC News
Technology and Science News - ABC NewsTechnology and Science News - ABC News
Technology and Science News - ABC News
numberlesspasto93
 

What's hot (18)

Politics News and U.S. Elections Coverage
Politics News and U.S. Elections CoveragePolitics News and U.S. Elections Coverage
Politics News and U.S. Elections Coverage
 
Business News, Personal Finance and Money News
Business News, Personal Finance and Money NewsBusiness News, Personal Finance and Money News
Business News, Personal Finance and Money News
 
Technology and Science News - ABC News
Technology and Science News - ABC NewsTechnology and Science News - ABC News
Technology and Science News - ABC News
 
Politics News and U.S. Elections Coverage
Politics News and U.S. Elections CoveragePolitics News and U.S. Elections Coverage
Politics News and U.S. Elections Coverage
 
U.S. News | National News
U.S. News | National NewsU.S. News | National News
U.S. News | National News
 
Technology and Science News - ABC News
Technology and Science News - ABC NewsTechnology and Science News - ABC News
Technology and Science News - ABC News
 
Politics News and U.S. Elections Coverage
Politics News and U.S. Elections CoveragePolitics News and U.S. Elections Coverage
Politics News and U.S. Elections Coverage
 
Health News & Articles | Healthy Living
Health News & Articles | Healthy LivingHealth News & Articles | Healthy Living
Health News & Articles | Healthy Living
 
New BYOB Law for Sayreville (The Suburban)
New BYOB Law for Sayreville (The Suburban)New BYOB Law for Sayreville (The Suburban)
New BYOB Law for Sayreville (The Suburban)
 
Technology and Science News - ABC News
Technology and Science News - ABC NewsTechnology and Science News - ABC News
Technology and Science News - ABC News
 
South Amboy of 1920s Is Theme of Fundraiser (The Suburban)
South Amboy of 1920s Is Theme of Fundraiser (The Suburban)South Amboy of 1920s Is Theme of Fundraiser (The Suburban)
South Amboy of 1920s Is Theme of Fundraiser (The Suburban)
 
International News | World News
International News | World NewsInternational News | World News
International News | World News
 
J Query (Complete Course) by Muhammad Ehtisham Siddiqui
J Query (Complete Course) by Muhammad Ehtisham SiddiquiJ Query (Complete Course) by Muhammad Ehtisham Siddiqui
J Query (Complete Course) by Muhammad Ehtisham Siddiqui
 
Technology and Science News - ABC News
Technology and Science News - ABC NewsTechnology and Science News - ABC News
Technology and Science News - ABC News
 
What Would You Do? With John Quinones
What Would You Do? With John QuinonesWhat Would You Do? With John Quinones
What Would You Do? With John Quinones
 
U.S. News | National News
U.S. News | National NewsU.S. News | National News
U.S. News | National News
 
Politics News and U.S. Elections Coverage
Politics News and U.S. Elections CoveragePolitics News and U.S. Elections Coverage
Politics News and U.S. Elections Coverage
 
Technology and Science News - ABC News
Technology and Science News - ABC NewsTechnology and Science News - ABC News
Technology and Science News - ABC News
 

Similar to Model Driven App Development for iPhone and Android

Beginning iphone 4_devlopement_chpter7_tab_b
Beginning iphone 4_devlopement_chpter7_tab_bBeginning iphone 4_devlopement_chpter7_tab_b
Beginning iphone 4_devlopement_chpter7_tab_bJihoon Kong
 
Leaving Interface Builder Behind
Leaving Interface Builder BehindLeaving Interface Builder Behind
Leaving Interface Builder Behind
John Wilker
 
Developing iOS REST Applications
Developing iOS REST ApplicationsDeveloping iOS REST Applications
Developing iOS REST Applications
lmrei
 
Static Reference Analysis for GUI Objects in Android Software
Static Reference Analysis for GUI Objects in Android SoftwareStatic Reference Analysis for GUI Objects in Android Software
Static Reference Analysis for GUI Objects in Android Software
Dacong (Tony) Yan
 
MOPCON 2014 - Best software architecture in app development
MOPCON 2014 - Best software architecture in app developmentMOPCON 2014 - Best software architecture in app development
MOPCON 2014 - Best software architecture in app development
anistar sung
 
Building Mobile Applications with Ionic
Building Mobile Applications with IonicBuilding Mobile Applications with Ionic
Building Mobile Applications with Ionic
Morris Singer
 
iOS Beginners Lesson 4
iOS Beginners Lesson 4iOS Beginners Lesson 4
iOS Beginners Lesson 4
Calvin Cheng
 
Ionic으로 모바일앱 만들기 #4
Ionic으로 모바일앱 만들기 #4Ionic으로 모바일앱 만들기 #4
Ionic으로 모바일앱 만들기 #4
성일 한
 
Ruby motion勉強会 2012年7月
Ruby motion勉強会 2012年7月Ruby motion勉強会 2012年7月
Ruby motion勉強会 2012年7月
Eihiro Saishu
 
Ionic bbl le 19 février 2015
Ionic bbl le 19 février 2015Ionic bbl le 19 février 2015
Ionic bbl le 19 février 2015
Loïc Knuchel
 
Lightning Components Workshop
Lightning Components WorkshopLightning Components Workshop
Lightning Components Workshop
Gordon Bockus
 
Курсы по мобильной разработке под iOS. 4 лекция. Возможности телефона
Курсы по мобильной разработке под iOS. 4 лекция. Возможности телефонаКурсы по мобильной разработке под iOS. 4 лекция. Возможности телефона
Курсы по мобильной разработке под iOS. 4 лекция. Возможности телефонаГлеб Тарасов
 
Objective-C Crash Course for Web Developers
Objective-C Crash Course for Web DevelopersObjective-C Crash Course for Web Developers
Objective-C Crash Course for Web Developers
Joris Verbogt
 
Implement angular calendar component how to drag &amp; create events
Implement angular calendar component how to drag &amp; create eventsImplement angular calendar component how to drag &amp; create events
Implement angular calendar component how to drag &amp; create events
Katy Slemon
 
iOS Training Session-3
iOS Training Session-3iOS Training Session-3
iOS Training Session-3
Hussain Behestee
 
Android programming basics
Android programming basicsAndroid programming basics
Android programming basics
Egerton University
 
Lightning Components Workshop
Lightning Components WorkshopLightning Components Workshop
Lightning Components Workshop
Salesforce Developers
 
Apple Templates Considered Harmful
Apple Templates Considered HarmfulApple Templates Considered Harmful
Apple Templates Considered HarmfulBrian Gesiak
 

Similar to Model Driven App Development for iPhone and Android (20)

Beginning iphone 4_devlopement_chpter7_tab_b
Beginning iphone 4_devlopement_chpter7_tab_bBeginning iphone 4_devlopement_chpter7_tab_b
Beginning iphone 4_devlopement_chpter7_tab_b
 
Leaving Interface Builder Behind
Leaving Interface Builder BehindLeaving Interface Builder Behind
Leaving Interface Builder Behind
 
занятие6
занятие6занятие6
занятие6
 
Developing iOS REST Applications
Developing iOS REST ApplicationsDeveloping iOS REST Applications
Developing iOS REST Applications
 
Static Reference Analysis for GUI Objects in Android Software
Static Reference Analysis for GUI Objects in Android SoftwareStatic Reference Analysis for GUI Objects in Android Software
Static Reference Analysis for GUI Objects in Android Software
 
MOPCON 2014 - Best software architecture in app development
MOPCON 2014 - Best software architecture in app developmentMOPCON 2014 - Best software architecture in app development
MOPCON 2014 - Best software architecture in app development
 
Building Mobile Applications with Ionic
Building Mobile Applications with IonicBuilding Mobile Applications with Ionic
Building Mobile Applications with Ionic
 
iOS Beginners Lesson 4
iOS Beginners Lesson 4iOS Beginners Lesson 4
iOS Beginners Lesson 4
 
Ionic으로 모바일앱 만들기 #4
Ionic으로 모바일앱 만들기 #4Ionic으로 모바일앱 만들기 #4
Ionic으로 모바일앱 만들기 #4
 
I os 11
I os 11I os 11
I os 11
 
Ruby motion勉強会 2012年7月
Ruby motion勉強会 2012年7月Ruby motion勉強会 2012年7月
Ruby motion勉強会 2012年7月
 
Ionic bbl le 19 février 2015
Ionic bbl le 19 février 2015Ionic bbl le 19 février 2015
Ionic bbl le 19 février 2015
 
Lightning Components Workshop
Lightning Components WorkshopLightning Components Workshop
Lightning Components Workshop
 
Курсы по мобильной разработке под iOS. 4 лекция. Возможности телефона
Курсы по мобильной разработке под iOS. 4 лекция. Возможности телефонаКурсы по мобильной разработке под iOS. 4 лекция. Возможности телефона
Курсы по мобильной разработке под iOS. 4 лекция. Возможности телефона
 
Objective-C Crash Course for Web Developers
Objective-C Crash Course for Web DevelopersObjective-C Crash Course for Web Developers
Objective-C Crash Course for Web Developers
 
Implement angular calendar component how to drag &amp; create events
Implement angular calendar component how to drag &amp; create eventsImplement angular calendar component how to drag &amp; create events
Implement angular calendar component how to drag &amp; create events
 
iOS Training Session-3
iOS Training Session-3iOS Training Session-3
iOS Training Session-3
 
Android programming basics
Android programming basicsAndroid programming basics
Android programming basics
 
Lightning Components Workshop
Lightning Components WorkshopLightning Components Workshop
Lightning Components Workshop
 
Apple Templates Considered Harmful
Apple Templates Considered HarmfulApple Templates Considered Harmful
Apple Templates Considered Harmful
 

More from Peter Friese

Building Reusable SwiftUI Components
Building Reusable SwiftUI ComponentsBuilding Reusable SwiftUI Components
Building Reusable SwiftUI Components
Peter Friese
 
Firebase & SwiftUI Workshop
Firebase & SwiftUI WorkshopFirebase & SwiftUI Workshop
Firebase & SwiftUI Workshop
Peter Friese
 
Building Reusable SwiftUI Components
Building Reusable SwiftUI ComponentsBuilding Reusable SwiftUI Components
Building Reusable SwiftUI Components
Peter Friese
 
Firebase for Apple Developers - SwiftHeroes
Firebase for Apple Developers - SwiftHeroesFirebase for Apple Developers - SwiftHeroes
Firebase for Apple Developers - SwiftHeroes
Peter Friese
 
 +  = ❤️ (Firebase for Apple Developers) at Swift Leeds
 +  = ❤️ (Firebase for Apple Developers) at Swift Leeds +  = ❤️ (Firebase for Apple Developers) at Swift Leeds
 +  = ❤️ (Firebase for Apple Developers) at Swift Leeds
Peter Friese
 
async/await in Swift
async/await in Swiftasync/await in Swift
async/await in Swift
Peter Friese
 
Firebase for Apple Developers
Firebase for Apple DevelopersFirebase for Apple Developers
Firebase for Apple Developers
Peter Friese
 
Building Apps with SwiftUI and Firebase
Building Apps with SwiftUI and FirebaseBuilding Apps with SwiftUI and Firebase
Building Apps with SwiftUI and Firebase
Peter Friese
 
Rapid Application Development with SwiftUI and Firebase
Rapid Application Development with SwiftUI and FirebaseRapid Application Development with SwiftUI and Firebase
Rapid Application Development with SwiftUI and Firebase
Peter Friese
 
Rapid Application Development with SwiftUI and Firebase
Rapid Application Development with SwiftUI and FirebaseRapid Application Development with SwiftUI and Firebase
Rapid Application Development with SwiftUI and Firebase
Peter Friese
 
6 Things You Didn't Know About Firebase Auth
6 Things You Didn't Know About Firebase Auth6 Things You Didn't Know About Firebase Auth
6 Things You Didn't Know About Firebase Auth
Peter Friese
 
Five Things You Didn't Know About Firebase Auth
Five Things You Didn't Know About Firebase AuthFive Things You Didn't Know About Firebase Auth
Five Things You Didn't Know About Firebase Auth
Peter Friese
 
Building High-Quality Apps for Google Assistant
Building High-Quality Apps for Google AssistantBuilding High-Quality Apps for Google Assistant
Building High-Quality Apps for Google Assistant
Peter Friese
 
Building Conversational Experiences with Actions on Google
Building Conversational Experiences with Actions on Google Building Conversational Experiences with Actions on Google
Building Conversational Experiences with Actions on Google
Peter Friese
 
Building Conversational Experiences with Actions on Google
Building Conversational Experiences with Actions on GoogleBuilding Conversational Experiences with Actions on Google
Building Conversational Experiences with Actions on Google
Peter Friese
 
What's new in Android Wear 2.0
What's new in Android Wear 2.0What's new in Android Wear 2.0
What's new in Android Wear 2.0
Peter Friese
 
Google Fit, Android Wear & Xamarin
Google Fit, Android Wear & XamarinGoogle Fit, Android Wear & Xamarin
Google Fit, Android Wear & Xamarin
Peter Friese
 
Introduction to Android Wear
Introduction to Android WearIntroduction to Android Wear
Introduction to Android Wear
Peter Friese
 
Google Play Services Rock
Google Play Services RockGoogle Play Services Rock
Google Play Services Rock
Peter Friese
 
Introduction to Android Wear
Introduction to Android WearIntroduction to Android Wear
Introduction to Android Wear
Peter Friese
 

More from Peter Friese (20)

Building Reusable SwiftUI Components
Building Reusable SwiftUI ComponentsBuilding Reusable SwiftUI Components
Building Reusable SwiftUI Components
 
Firebase & SwiftUI Workshop
Firebase & SwiftUI WorkshopFirebase & SwiftUI Workshop
Firebase & SwiftUI Workshop
 
Building Reusable SwiftUI Components
Building Reusable SwiftUI ComponentsBuilding Reusable SwiftUI Components
Building Reusable SwiftUI Components
 
Firebase for Apple Developers - SwiftHeroes
Firebase for Apple Developers - SwiftHeroesFirebase for Apple Developers - SwiftHeroes
Firebase for Apple Developers - SwiftHeroes
 
 +  = ❤️ (Firebase for Apple Developers) at Swift Leeds
 +  = ❤️ (Firebase for Apple Developers) at Swift Leeds +  = ❤️ (Firebase for Apple Developers) at Swift Leeds
 +  = ❤️ (Firebase for Apple Developers) at Swift Leeds
 
async/await in Swift
async/await in Swiftasync/await in Swift
async/await in Swift
 
Firebase for Apple Developers
Firebase for Apple DevelopersFirebase for Apple Developers
Firebase for Apple Developers
 
Building Apps with SwiftUI and Firebase
Building Apps with SwiftUI and FirebaseBuilding Apps with SwiftUI and Firebase
Building Apps with SwiftUI and Firebase
 
Rapid Application Development with SwiftUI and Firebase
Rapid Application Development with SwiftUI and FirebaseRapid Application Development with SwiftUI and Firebase
Rapid Application Development with SwiftUI and Firebase
 
Rapid Application Development with SwiftUI and Firebase
Rapid Application Development with SwiftUI and FirebaseRapid Application Development with SwiftUI and Firebase
Rapid Application Development with SwiftUI and Firebase
 
6 Things You Didn't Know About Firebase Auth
6 Things You Didn't Know About Firebase Auth6 Things You Didn't Know About Firebase Auth
6 Things You Didn't Know About Firebase Auth
 
Five Things You Didn't Know About Firebase Auth
Five Things You Didn't Know About Firebase AuthFive Things You Didn't Know About Firebase Auth
Five Things You Didn't Know About Firebase Auth
 
Building High-Quality Apps for Google Assistant
Building High-Quality Apps for Google AssistantBuilding High-Quality Apps for Google Assistant
Building High-Quality Apps for Google Assistant
 
Building Conversational Experiences with Actions on Google
Building Conversational Experiences with Actions on Google Building Conversational Experiences with Actions on Google
Building Conversational Experiences with Actions on Google
 
Building Conversational Experiences with Actions on Google
Building Conversational Experiences with Actions on GoogleBuilding Conversational Experiences with Actions on Google
Building Conversational Experiences with Actions on Google
 
What's new in Android Wear 2.0
What's new in Android Wear 2.0What's new in Android Wear 2.0
What's new in Android Wear 2.0
 
Google Fit, Android Wear & Xamarin
Google Fit, Android Wear & XamarinGoogle Fit, Android Wear & Xamarin
Google Fit, Android Wear & Xamarin
 
Introduction to Android Wear
Introduction to Android WearIntroduction to Android Wear
Introduction to Android Wear
 
Google Play Services Rock
Google Play Services RockGoogle Play Services Rock
Google Play Services Rock
 
Introduction to Android Wear
Introduction to Android WearIntroduction to Android Wear
Introduction to Android Wear
 

Recently uploaded

GDG Cloud Southlake #33: Boule & Rebala: Effective AppSec in SDLC using Deplo...
GDG Cloud Southlake #33: Boule & Rebala: Effective AppSec in SDLC using Deplo...GDG Cloud Southlake #33: Boule & Rebala: Effective AppSec in SDLC using Deplo...
GDG Cloud Southlake #33: Boule & Rebala: Effective AppSec in SDLC using Deplo...
James Anderson
 
Kubernetes & AI - Beauty and the Beast !?! @KCD Istanbul 2024
Kubernetes & AI - Beauty and the Beast !?! @KCD Istanbul 2024Kubernetes & AI - Beauty and the Beast !?! @KCD Istanbul 2024
Kubernetes & AI - Beauty and the Beast !?! @KCD Istanbul 2024
Tobias Schneck
 
GraphRAG is All You need? LLM & Knowledge Graph
GraphRAG is All You need? LLM & Knowledge GraphGraphRAG is All You need? LLM & Knowledge Graph
GraphRAG is All You need? LLM & Knowledge Graph
Guy Korland
 
From Siloed Products to Connected Ecosystem: Building a Sustainable and Scala...
From Siloed Products to Connected Ecosystem: Building a Sustainable and Scala...From Siloed Products to Connected Ecosystem: Building a Sustainable and Scala...
From Siloed Products to Connected Ecosystem: Building a Sustainable and Scala...
Product School
 
From Daily Decisions to Bottom Line: Connecting Product Work to Revenue by VP...
From Daily Decisions to Bottom Line: Connecting Product Work to Revenue by VP...From Daily Decisions to Bottom Line: Connecting Product Work to Revenue by VP...
From Daily Decisions to Bottom Line: Connecting Product Work to Revenue by VP...
Product School
 
Monitoring Java Application Security with JDK Tools and JFR Events
Monitoring Java Application Security with JDK Tools and JFR EventsMonitoring Java Application Security with JDK Tools and JFR Events
Monitoring Java Application Security with JDK Tools and JFR Events
Ana-Maria Mihalceanu
 
The Art of the Pitch: WordPress Relationships and Sales
The Art of the Pitch: WordPress Relationships and SalesThe Art of the Pitch: WordPress Relationships and Sales
The Art of the Pitch: WordPress Relationships and Sales
Laura Byrne
 
DevOps and Testing slides at DASA Connect
DevOps and Testing slides at DASA ConnectDevOps and Testing slides at DASA Connect
DevOps and Testing slides at DASA Connect
Kari Kakkonen
 
Essentials of Automations: Optimizing FME Workflows with Parameters
Essentials of Automations: Optimizing FME Workflows with ParametersEssentials of Automations: Optimizing FME Workflows with Parameters
Essentials of Automations: Optimizing FME Workflows with Parameters
Safe Software
 
UiPath Test Automation using UiPath Test Suite series, part 3
UiPath Test Automation using UiPath Test Suite series, part 3UiPath Test Automation using UiPath Test Suite series, part 3
UiPath Test Automation using UiPath Test Suite series, part 3
DianaGray10
 
AI for Every Business: Unlocking Your Product's Universal Potential by VP of ...
AI for Every Business: Unlocking Your Product's Universal Potential by VP of ...AI for Every Business: Unlocking Your Product's Universal Potential by VP of ...
AI for Every Business: Unlocking Your Product's Universal Potential by VP of ...
Product School
 
PCI PIN Basics Webinar from the Controlcase Team
PCI PIN Basics Webinar from the Controlcase TeamPCI PIN Basics Webinar from the Controlcase Team
PCI PIN Basics Webinar from the Controlcase Team
ControlCase
 
Unsubscribed: Combat Subscription Fatigue With a Membership Mentality by Head...
Unsubscribed: Combat Subscription Fatigue With a Membership Mentality by Head...Unsubscribed: Combat Subscription Fatigue With a Membership Mentality by Head...
Unsubscribed: Combat Subscription Fatigue With a Membership Mentality by Head...
Product School
 
Mission to Decommission: Importance of Decommissioning Products to Increase E...
Mission to Decommission: Importance of Decommissioning Products to Increase E...Mission to Decommission: Importance of Decommissioning Products to Increase E...
Mission to Decommission: Importance of Decommissioning Products to Increase E...
Product School
 
Leading Change strategies and insights for effective change management pdf 1.pdf
Leading Change strategies and insights for effective change management pdf 1.pdfLeading Change strategies and insights for effective change management pdf 1.pdf
Leading Change strategies and insights for effective change management pdf 1.pdf
OnBoard
 
Knowledge engineering: from people to machines and back
Knowledge engineering: from people to machines and backKnowledge engineering: from people to machines and back
Knowledge engineering: from people to machines and back
Elena Simperl
 
Epistemic Interaction - tuning interfaces to provide information for AI support
Epistemic Interaction - tuning interfaces to provide information for AI supportEpistemic Interaction - tuning interfaces to provide information for AI support
Epistemic Interaction - tuning interfaces to provide information for AI support
Alan Dix
 
Slack (or Teams) Automation for Bonterra Impact Management (fka Social Soluti...
Slack (or Teams) Automation for Bonterra Impact Management (fka Social Soluti...Slack (or Teams) Automation for Bonterra Impact Management (fka Social Soluti...
Slack (or Teams) Automation for Bonterra Impact Management (fka Social Soluti...
Jeffrey Haguewood
 
JMeter webinar - integration with InfluxDB and Grafana
JMeter webinar - integration with InfluxDB and GrafanaJMeter webinar - integration with InfluxDB and Grafana
JMeter webinar - integration with InfluxDB and Grafana
RTTS
 
FIDO Alliance Osaka Seminar: Overview.pdf
FIDO Alliance Osaka Seminar: Overview.pdfFIDO Alliance Osaka Seminar: Overview.pdf
FIDO Alliance Osaka Seminar: Overview.pdf
FIDO Alliance
 

Recently uploaded (20)

GDG Cloud Southlake #33: Boule & Rebala: Effective AppSec in SDLC using Deplo...
GDG Cloud Southlake #33: Boule & Rebala: Effective AppSec in SDLC using Deplo...GDG Cloud Southlake #33: Boule & Rebala: Effective AppSec in SDLC using Deplo...
GDG Cloud Southlake #33: Boule & Rebala: Effective AppSec in SDLC using Deplo...
 
Kubernetes & AI - Beauty and the Beast !?! @KCD Istanbul 2024
Kubernetes & AI - Beauty and the Beast !?! @KCD Istanbul 2024Kubernetes & AI - Beauty and the Beast !?! @KCD Istanbul 2024
Kubernetes & AI - Beauty and the Beast !?! @KCD Istanbul 2024
 
GraphRAG is All You need? LLM & Knowledge Graph
GraphRAG is All You need? LLM & Knowledge GraphGraphRAG is All You need? LLM & Knowledge Graph
GraphRAG is All You need? LLM & Knowledge Graph
 
From Siloed Products to Connected Ecosystem: Building a Sustainable and Scala...
From Siloed Products to Connected Ecosystem: Building a Sustainable and Scala...From Siloed Products to Connected Ecosystem: Building a Sustainable and Scala...
From Siloed Products to Connected Ecosystem: Building a Sustainable and Scala...
 
From Daily Decisions to Bottom Line: Connecting Product Work to Revenue by VP...
From Daily Decisions to Bottom Line: Connecting Product Work to Revenue by VP...From Daily Decisions to Bottom Line: Connecting Product Work to Revenue by VP...
From Daily Decisions to Bottom Line: Connecting Product Work to Revenue by VP...
 
Monitoring Java Application Security with JDK Tools and JFR Events
Monitoring Java Application Security with JDK Tools and JFR EventsMonitoring Java Application Security with JDK Tools and JFR Events
Monitoring Java Application Security with JDK Tools and JFR Events
 
The Art of the Pitch: WordPress Relationships and Sales
The Art of the Pitch: WordPress Relationships and SalesThe Art of the Pitch: WordPress Relationships and Sales
The Art of the Pitch: WordPress Relationships and Sales
 
DevOps and Testing slides at DASA Connect
DevOps and Testing slides at DASA ConnectDevOps and Testing slides at DASA Connect
DevOps and Testing slides at DASA Connect
 
Essentials of Automations: Optimizing FME Workflows with Parameters
Essentials of Automations: Optimizing FME Workflows with ParametersEssentials of Automations: Optimizing FME Workflows with Parameters
Essentials of Automations: Optimizing FME Workflows with Parameters
 
UiPath Test Automation using UiPath Test Suite series, part 3
UiPath Test Automation using UiPath Test Suite series, part 3UiPath Test Automation using UiPath Test Suite series, part 3
UiPath Test Automation using UiPath Test Suite series, part 3
 
AI for Every Business: Unlocking Your Product's Universal Potential by VP of ...
AI for Every Business: Unlocking Your Product's Universal Potential by VP of ...AI for Every Business: Unlocking Your Product's Universal Potential by VP of ...
AI for Every Business: Unlocking Your Product's Universal Potential by VP of ...
 
PCI PIN Basics Webinar from the Controlcase Team
PCI PIN Basics Webinar from the Controlcase TeamPCI PIN Basics Webinar from the Controlcase Team
PCI PIN Basics Webinar from the Controlcase Team
 
Unsubscribed: Combat Subscription Fatigue With a Membership Mentality by Head...
Unsubscribed: Combat Subscription Fatigue With a Membership Mentality by Head...Unsubscribed: Combat Subscription Fatigue With a Membership Mentality by Head...
Unsubscribed: Combat Subscription Fatigue With a Membership Mentality by Head...
 
Mission to Decommission: Importance of Decommissioning Products to Increase E...
Mission to Decommission: Importance of Decommissioning Products to Increase E...Mission to Decommission: Importance of Decommissioning Products to Increase E...
Mission to Decommission: Importance of Decommissioning Products to Increase E...
 
Leading Change strategies and insights for effective change management pdf 1.pdf
Leading Change strategies and insights for effective change management pdf 1.pdfLeading Change strategies and insights for effective change management pdf 1.pdf
Leading Change strategies and insights for effective change management pdf 1.pdf
 
Knowledge engineering: from people to machines and back
Knowledge engineering: from people to machines and backKnowledge engineering: from people to machines and back
Knowledge engineering: from people to machines and back
 
Epistemic Interaction - tuning interfaces to provide information for AI support
Epistemic Interaction - tuning interfaces to provide information for AI supportEpistemic Interaction - tuning interfaces to provide information for AI support
Epistemic Interaction - tuning interfaces to provide information for AI support
 
Slack (or Teams) Automation for Bonterra Impact Management (fka Social Soluti...
Slack (or Teams) Automation for Bonterra Impact Management (fka Social Soluti...Slack (or Teams) Automation for Bonterra Impact Management (fka Social Soluti...
Slack (or Teams) Automation for Bonterra Impact Management (fka Social Soluti...
 
JMeter webinar - integration with InfluxDB and Grafana
JMeter webinar - integration with InfluxDB and GrafanaJMeter webinar - integration with InfluxDB and Grafana
JMeter webinar - integration with InfluxDB and Grafana
 
FIDO Alliance Osaka Seminar: Overview.pdf
FIDO Alliance Osaka Seminar: Overview.pdfFIDO Alliance Osaka Seminar: Overview.pdf
FIDO Alliance Osaka Seminar: Overview.pdf
 

Model Driven App Development for iPhone and Android

  • 1. Model Driven App Development @peterfriese | @itemismobile http://peterfriese.de | http://mobile.itemis.de for iPhone and Android
  • 3.
  • 5. How to be Awesome?
  • 6. How to be Awesome? Time to Market Happy Users Precision.Great Ideas
  • 7. How to be Awesome? Time to Market Happy Users Precision.Great Ideas Great Ideas
  • 8. How to be Awesome? Time to Market Happy Users Great Ideas Precision.
  • 9. How to be Awesome? Happy Users Precision.Great Ideas Time to Market
  • 10. How to be Awesome? Time to Market Precision.Great Ideas Happy Users
  • 11. There Are 4 Things That Keep Us From Being Awesome Accidental Complexity Wrong Level of Abstraction Ugly Design Boring Code
  • 12. There Are 4 Things That Keep Us From Being Awesome Accidental Complexity Wrong Level of Abstraction Ugly Design Boring Code
  • 13. There Are 4 Things That Keep Us From Being Awesome Wrong Level of Abstraction Ugly Design Boring Code Accidental Complexity
  • 14. There Are 4 Things That Keep Us From Being Awesome Ugly Design Boring Code Accidental Complexity Wrong Level of Abstraction
  • 15. There Are 4 Things That Keep Us From Being Awesome Boring Code Accidental Complexity Wrong Level of Abstraction Ugly Design
  • 16. Oh, did I mention
  • 17. Oh, did I mention Bugs Redundancy Multi- Platform
  • 19. Challenges vs. Threats Time to Market Happy Users Precision.Great Ideas Accidental Complexity Wrong Level of Abstraction Ugly Design Boring Code not in this talk not in this talk
  • 23. Why? ... is code so boring (at times)? ... is there so much accidental complexity? ... is there so much redundancy? ... is our code so buggy?
  • 24. Wrong Level of Abstraction! ... is code so boring (at times)? ... is there so much accidental complexity? ... is there so much redundancy? ... is our code so buggy?
  • 25. Software artifact Anatomy of Modern Software
  • 27. schematic code (manually written) Libraries Frameworks manually written code Anatomy of Modern Software
  • 29.
  • 30. Text
  • 37. tabbarApplication itemisApp { button { title= "Tuesday" icon= "calendar.png" view= SessionList( SessionsByDay("0") ) } button { title= "Wednesday" icon= "calendar.png" view= SessionList( SessionsByDay("1") ) } button { title= "Thursday" icon= "calendar.png" view= SessionList( SessionsByDay("2") ) } button { title= "Speakers" icon= "person.png" view= SpeakersList( AllSpeakers() ) } }
  • 38. tabbarApplication itemisApp { button { title= "Tuesday" icon= "calendar.png" view= SessionList( SessionsByDay("0") ) } button { title= "Wednesday" icon= "calendar.png" view= SessionList( SessionsByDay("1") ) } button { title= "Thursday" icon= "calendar.png" view= SessionList( SessionsByDay("2") ) } button { title= "Speakers" icon= "person.png" view= SpeakersList( AllSpeakers() ) } } -(UIViewController*)createController { ! itemisAppProviders *providers = [[[itemisAppProviders alloc] init] autorelease]; ! UITabBarController *result = [[UITabBarController alloc] init]; ! NSMutableArray *controllers = [NSMutableArray array]; ! ! UIViewController<IPUIView> *controller; ! UINavigationController *navController; ! IPContentProvider *contentProvider; ! // controller for @"Tuesday" ! contentProvider = [providers providerForSessionsByDay: @"0"]; ! ! controller = [[SessionListViewController alloc] init]; ! [controller setContentProvider: contentProvider]; ! controller.tabBarItem.title = @"Tuesday"; ! controller.tabBarItem.image = [UIImage imageNamed:@"calendar.png"]; ! navController = [[UINavigationController alloc] initWithRootViewController:controller]; ! [controllers addObject: navController]; ! [controller release]; ! [navController release]; ! ! // controller for @"Wednesday" ! contentProvider = [providers providerForSessionsByDay: @"1"]; ! ! controller = [[SessionListViewController alloc] init]; ! [controller setContentProvider: contentProvider]; ! controller.tabBarItem.title = @"Wednesday"; ! controller.tabBarItem.image = [UIImage imageNamed:@"calendar.png"]; ! navController = [[UINavigationController alloc] initWithRootViewController:controller]; ! [controllers addObject: navController]; ! [controller release]; ! [navController release]; ! ! // controller for @"Thursday" ! contentProvider = [providers providerForSessionsByDay: @"2"]; ! ! controller = [[SessionListViewController alloc] init]; ! [controller setContentProvider: contentProvider]; ! controller.tabBarItem.title = @"Thursday"; ! controller.tabBarItem.image = [UIImage imageNamed:@"calendar.png"]; ! navController = [[UINavigationController alloc] initWithRootViewController:controller]; ! [controllers addObject: navController]; ! [controller release]; ! [navController release]; ! ! // controller for @"Speakers" ! contentProvider = [providers providerForAllSpeakers]; ! ! controller = [[SpeakersListViewController alloc] init]; ! [controller setContentProvider: contentProvider]; ! controller.tabBarItem.title = @"Speakers"; ! controller.tabBarItem.image = [UIImage imageNamed:@"person.png"]; ! navController = [[UINavigationController alloc] initWithRootViewController:controller]; ! [controllers addObject: navController]; ! [controller release]; ! [navController release]; ! result.viewControllers = controllers; ! return result; }
  • 39. tabbarApplication itemisApp { button { title= "Tuesday" icon= "calendar.png" view= SessionList( SessionsByDay("0") ) } button { title= "Wednesday" icon= "calendar.png" view= SessionList( SessionsByDay("1") ) } button { title= "Thursday" icon= "calendar.png" view= SessionList( SessionsByDay("2") ) } button { title= "Speakers" icon= "person.png" view= SpeakersList( AllSpeakers() ) } } -(UIViewController*)createController { ! itemisAppProviders *providers = [[[itemisAppProviders alloc] init] autorelease]; ! UITabBarController *result = [[UITabBarController alloc] init]; ! NSMutableArray *controllers = [NSMutableArray array]; ! ! UIViewController<IPUIView> *controller; ! UINavigationController *navController; ! IPContentProvider *contentProvider; ! // controller for @"Tuesday" ! contentProvider = [providers providerForSessionsByDay: @"0"]; ! ! controller = [[SessionListViewController alloc] init]; ! [controller setContentProvider: contentProvider]; ! controller.tabBarItem.title = @"Tuesday"; ! controller.tabBarItem.image = [UIImage imageNamed:@"calendar.png"]; ! navController = [[UINavigationController alloc] initWithRootViewController:controller]; ! [controllers addObject: navController]; ! [controller release]; ! [navController release]; ! ! // controller for @"Wednesday" ! contentProvider = [providers providerForSessionsByDay: @"1"]; ! ! controller = [[SessionListViewController alloc] init]; ! [controller setContentProvider: contentProvider]; ! controller.tabBarItem.title = @"Wednesday"; ! controller.tabBarItem.image = [UIImage imageNamed:@"calendar.png"]; ! navController = [[UINavigationController alloc] initWithRootViewController:controller]; ! [controllers addObject: navController]; ! [controller release]; ! [navController release]; ! ! // controller for @"Thursday" ! contentProvider = [providers providerForSessionsByDay: @"2"]; ! ! controller = [[SessionListViewController alloc] init]; ! [controller setContentProvider: contentProvider]; ! controller.tabBarItem.title = @"Thursday"; ! controller.tabBarItem.image = [UIImage imageNamed:@"calendar.png"]; ! navController = [[UINavigationController alloc] initWithRootViewController:controller]; ! [controllers addObject: navController]; ! [controller release]; ! [navController release]; ! ! // controller for @"Speakers" ! contentProvider = [providers providerForAllSpeakers]; ! ! controller = [[SpeakersListViewController alloc] init]; ! [controller setContentProvider: contentProvider]; ! controller.tabBarItem.title = @"Speakers"; ! controller.tabBarItem.image = [UIImage imageNamed:@"person.png"]; ! navController = [[UINavigationController alloc] initWithRootViewController:controller]; ! [controllers addObject: navController]; ! [controller release]; ! [navController release]; ! result.viewControllers = controllers; ! return result; }
  • 40. tabbarApplication itemisApp { button { title= "Tuesday" icon= "calendar.png" view= SessionList( SessionsByDay("0") ) } button { title= "Wednesday" icon= "calendar.png" view= SessionList( SessionsByDay("1") ) } button { title= "Thursday" icon= "calendar.png" view= SessionList( SessionsByDay("2") ) } button { title= "Speakers" icon= "person.png" view= SpeakersList( AllSpeakers() ) } } -(UIViewController*)createController { ! itemisAppProviders *providers = [[[itemisAppProviders alloc] init] autorelease]; ! UITabBarController *result = [[UITabBarController alloc] init]; ! NSMutableArray *controllers = [NSMutableArray array]; ! ! UIViewController<IPUIView> *controller; ! UINavigationController *navController; ! IPContentProvider *contentProvider; ! // controller for @"Tuesday" ! contentProvider = [providers providerForSessionsByDay: @"0"]; ! ! controller = [[SessionListViewController alloc] init]; ! [controller setContentProvider: contentProvider]; ! controller.tabBarItem.title = @"Tuesday"; ! controller.tabBarItem.image = [UIImage imageNamed:@"calendar.png"]; ! navController = [[UINavigationController alloc] initWithRootViewController:controller]; ! [controllers addObject: navController]; ! [controller release]; ! [navController release]; ! ! // controller for @"Wednesday" ! contentProvider = [providers providerForSessionsByDay: @"1"]; ! ! controller = [[SessionListViewController alloc] init]; ! [controller setContentProvider: contentProvider]; ! controller.tabBarItem.title = @"Wednesday"; ! controller.tabBarItem.image = [UIImage imageNamed:@"calendar.png"]; ! navController = [[UINavigationController alloc] initWithRootViewController:controller]; ! [controllers addObject: navController]; ! [controller release]; ! [navController release]; ! ! // controller for @"Thursday" ! contentProvider = [providers providerForSessionsByDay: @"2"]; ! ! controller = [[SessionListViewController alloc] init]; ! [controller setContentProvider: contentProvider]; ! controller.tabBarItem.title = @"Thursday"; ! controller.tabBarItem.image = [UIImage imageNamed:@"calendar.png"]; ! navController = [[UINavigationController alloc] initWithRootViewController:controller]; ! [controllers addObject: navController]; ! [controller release]; ! [navController release]; ! ! // controller for @"Speakers" ! contentProvider = [providers providerForAllSpeakers]; ! ! controller = [[SpeakersListViewController alloc] init]; ! [controller setContentProvider: contentProvider]; ! controller.tabBarItem.title = @"Speakers"; ! controller.tabBarItem.image = [UIImage imageNamed:@"person.png"]; ! navController = [[UINavigationController alloc] initWithRootViewController:controller]; ! [controllers addObject: navController]; ! [controller release]; ! [navController release]; ! result.viewControllers = controllers; ! return result; } 135
  • 43. «DEFINE moduleFile FOR Application» «FILE filenameApplicationDelegateModule()» #import "«filenameApplicationDelegateHeader()»" #import "IPUIView.h" #import "«filenameCentralProvidersHeader()»" «EXPAND importStatements-» @implementation «applicationDelegateClassname()» @synthesize window, rootController; -(UIViewController*)createController { «centralProvidersClassName()» *providers = [[[«centralProvidersClassName()» alloc] init] autorelease]; UITabBarController *result = [[UITabBarController alloc] init]; NSMutableArray *controllers = [NSMutableArray array]; UIViewController<IPUIView> *controller; UINavigationController *navController; IPContentProvider *contentProvider; «EXPAND barControllerInstance FOREACH buttons» result.viewControllers = controllers; return result; } - (void)applicationDidFinishLaunching:(UIApplication *)application { self.rootController = [self createController]; [window addSubview: [self.rootController view]]; [window makeKeyAndVisible]; } - (void)dealloc { self.rootController = nil; [window release]; [super dealloc]; } @end «ENDFILE» «ENDDEFINE»
  • 44. «DEFINE moduleFile FOR Application» «FILE filenameApplicationDelegateModule()» #import "«filenameApplicationDelegateHeader()»" #import "IPUIView.h" #import "«filenameCentralProvidersHeader()»" «EXPAND importStatements-» @implementation «applicationDelegateClassname()» @synthesize window, rootController; -(UIViewController*)createController { «centralProvidersClassName()» *providers = [[[«centralProvidersClassName()» alloc] init] autorelease]; UITabBarController *result = [[UITabBarController alloc] init]; NSMutableArray *controllers = [NSMutableArray array]; UIViewController<IPUIView> *controller; UINavigationController *navController; IPContentProvider *contentProvider; «EXPAND barControllerInstance FOREACH buttons» result.viewControllers = controllers; return result; } - (void)applicationDidFinishLaunching:(UIApplication *)application { self.rootController = [self createController]; [window addSubview: [self.rootController view]]; [window makeKeyAndVisible]; } - (void)dealloc { self.rootController = nil; [window release]; [super dealloc]; } @end «ENDFILE» «ENDDEFINE» tabbarApplication itemisApp { button { title= "Tuesday" icon= "calendar.png" view= SessionList( SessionsByDay("0") ) } button { title= "Wednesday" icon= "calendar.png" view= SessionList( SessionsByDay("1") ) } button { title= "Thursday" icon= "calendar.png" view= SessionList( SessionsByDay("2") ) } button { title= "Speakers" icon= "person.png" view= SpeakersList( AllSpeakers() ) } }
  • 45. «DEFINE moduleFile FOR Application» «FILE filenameApplicationDelegateModule()» #import "«filenameApplicationDelegateHeader()»" #import "IPUIView.h" #import "«filenameCentralProvidersHeader()»" «EXPAND importStatements-» @implementation «applicationDelegateClassname()» @synthesize window, rootController; -(UIViewController*)createController { «centralProvidersClassName()» *providers = [[[«centralProvidersClassName()» alloc] init] autorelease]; UITabBarController *result = [[UITabBarController alloc] init]; NSMutableArray *controllers = [NSMutableArray array]; UIViewController<IPUIView> *controller; UINavigationController *navController; IPContentProvider *contentProvider; «EXPAND barControllerInstance FOREACH buttons» result.viewControllers = controllers; return result; } - (void)applicationDidFinishLaunching:(UIApplication *)application { self.rootController = [self createController]; [window addSubview: [self.rootController view]]; [window makeKeyAndVisible]; } - (void)dealloc { self.rootController = nil; [window release]; [super dealloc]; } @end «ENDFILE» «ENDDEFINE» tabbarApplication itemisApp { button { title= "Tuesday" icon= "calendar.png" view= SessionList( SessionsByDay("0") ) } button { title= "Wednesday" icon= "calendar.png" view= SessionList( SessionsByDay("1") ) } button { title= "Thursday" icon= "calendar.png" view= SessionList( SessionsByDay("2") ) } button { title= "Speakers" icon= "person.png" view= SpeakersList( AllSpeakers() ) } }
  • 46. «DEFINE barControllerInstance FOR TabbarButton» «IF view.provider != null» // controller for «this.title.expression('', '')» contentProvider = «view.provider.contentProvider('providers', '', '')»; «ENDIF» controller = [[«view.view.className()» alloc] init]; [controller setContentProvider: contentProvider]; controller.tabBarItem.title = «title.expression('', '')»; controller.tabBarItem.image = [UIImage imageNamed:«this.icon.expression('','')»]; navController = [[UINavigationController alloc] initWithRootViewController:controller]; [controllers addObject: navController]; [controller release]; [navController release]; «ENDDEFINE» tabbarApplication itemisApp { button { title= "Tuesday" icon= "calendar.png" view= SessionList( SessionsByDay("0") ) } button { title= "Wednesday" icon= "calendar.png" view= SessionList( SessionsByDay("1") ) } button { title= "Thursday" icon= "calendar.png" view= SessionList( SessionsByDay("2") ) } button { title= "Speakers" icon= "person.png" view= SpeakersList( AllSpeakers() ) } }
  • 50. DEMO
  • 52. SourceUI (Apple TV) iPhone App iPad App Apple TV App UI (iPad) UI (iPhone) @mschluepmann:
  • 53. iPhone App iPad App TV App @APPlauseDSL: APPlause DSL Program APPlause DSL
  • 54. DEMO
  • 55. code Open source - EPL 1.0 code.google.com/p/applause/
  • 56. ‣ Showcase about conferences ‣ Tighter integration with Xcode ‣ Improved Android Generator ‣ Support for BlackBerry ‣ Support for Windows Phone 7 ‣ Support for TV sets? APPlause - Roadmap
  • 57.