adib80's picture
From adib80 rss RSS  subscribe Subscribe

MDSD for iPhone and Android 

MDSD for iPhone and Android

 

 
 
Tags:  iphone 4g  android  dsl  applause  xtext 
Views:  144
Published:  October 28, 2011
 
0
download

Share plick with friends Share
save to favorite
Report Abuse Report Abuse
 
Related Plicks
iPhone Jailbreak

iPhone Jailbreak

From: vernagol12
Views: 2 Comments: 0
http://www.unlockiphone345.com/ iPhone Jailbreak by visiting the this link

 
Jailbreak iPhone

Jailbreak iPhone

From: vernagol12
Views: 2 Comments: 0
http://www.unlockiphone345.com/ Jailbreak iPhone by visiting the this link

 
Unlock iPhone

Unlock iPhone

From: vernagol12
Views: 6 Comments: 0
http://www.unlockiphone345.com/ Unlock iPhone by visiting the this link

 
iPhone Unlock

iPhone Unlock

From: vernagol12
Views: 8 Comments: 0
http://www.unlockiphone345.com/ iPhone Unlock by visiting the this link

 
Unlock and Jailbreak iPhone

Unlock and Jailbreak iPhone

From: vernagol12
Views: 3 Comments: 0
http://www.unlockiphone345.com/ Unlock and Jailbreak iPhone by visiting the this link

 
See all 
 
More from this user
A Holistic Approach to Continuity Planning

A Holistic Approach to Continuity Planning

From: adib80
Views: 86
Comments: 0

unisys 10308921

unisys 10308921

From: adib80
Views: 235
Comments: 0

DRC mining code

DRC mining code

From: adib80
Views: 81
Comments: 0

WiThing Body Scale- David Novak (The Gadget Guy)

WiThing Body Scale- David Novak (The Gadget Guy)

From: adib80
Views: 494
Comments: 0

See all 
 
 
 URL:          AddThis Social Bookmark Button
Embed Thin Player: (fits in most blogs)
Embed Full Player :
 
 

Name

Email (will NOT be shown to other users)

 

 
 
Comments: (watch)
 
 
Notes:
 
Slide 1: Modellgetriebene App-Entwicklung für iPhone und Android Heiko Behrens, itemis Regionalgruppe Hamburg der GI Hamburg 24.09.2010 @HBehrens http://mobile.itemis.de Dienstag, 28. September 2010
Slide 2: Modellgetriebene App-Entwicklung für iPhone und Android Dienstag, 28. September 2010
Slide 3: Modellgetriebene App-Entwicklung für iPhone und Android Dienstag, 28. September 2010
Slide 4: / soft·ware de·vel·op·ment / n. the set of activities that results in software products. ~ may include research, new development, modification, reuse, maintenance, or any other activities that result in software products. Dienstag, 28. September 2010
Slide 5: Typical Situations in Software Development Dienstag, 28. September 2010
Slide 6: Boring code Dienstag, 28. September 2010
Slide 7: Accidental complexity Dienstag, 28. September 2010
Slide 8: Wrong level of abstraction Dienstag, 28. September 2010
Slide 9: Anatomy of Modern Software manually written code Frameworks schematic code (manually written) Libraries Dienstag, 28. September 2010
Slide 10: Dienstag, 28. September 2010
Slide 11: package templates; import java.util.*; import java.io.Serializable; import javax.persistence.*; @SuppressWarnings("serial") @Entity public class Customer implements Serializable { private Long id; private String name; private Address address; private Set<Order> orders = new HashSet<Order>(); // No-arg constructor public Customer() { } @Id public Long getId() { return id; } public void setId(Long id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public Address getAddress() { return address; } public void setAddress(Address address) { this.address = address; } @OneToMany public Collection<Order> getOrders() { return orders; } public void setOrders(Set<Order> orders) { this.orders = orders; } } Dienstag, 28. September 2010
Slide 12: package templates; import java.io.Serializable; import java.util.*; import javax.persistence.*; @SuppressWarnings("serial") @Entity public class Customer implements Serializable { private Long id; private String name; private Address address; private Set<Order> orders = new HashSet<Order>(); // No-arg constructor public Customer() { } @Id public Long getId() { return id; } public void setId(Long id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public Address getAddress() { return address; } public void setAddress(Address address) { this.address = address; } @OneToMany public Collection<Order> getOrders() { return orders; } public void setOrders(Set<Order> orders) { this.orders = orders; } } Dienstag, 28. September 2010
Slide 13: Common Approaches to Avoid Redundancy Dienstag, 28. September 2010
Slide 14: Wizards Dienstag, 28. September 2010
Slide 15: This wizard whips up a complete and running legacy application with just a single click. Dienstag, 28. September 2010
Slide 16: Designers Dienstag, 28. September 2010
Slide 17: Model-Driven Software Development Dienstag, 28. September 2010
Slide 18: Raise the level of abstraction where possible and generate code wisely. Dienstag, 28. September 2010
Slide 19: One cannot abstract away everything. Manual code is great for all the special cases and details. Dienstag, 28. September 2010
Slide 20: Use the best of both worlds at the same time. Dienstag, 28. September 2010
Slide 21: Dienstag, 28. September 2010
Slide 22: Suppose... Dienstag, 28. September 2010
Slide 23: You’d want to core an apple... Dienstag, 28. September 2010
Slide 24: ... for your kids. Dienstag, 28. September 2010
Slide 25: Right tool for the job ? Dienstag, 28. September 2010
Slide 26: Your trusty swiss army knife! Dienstag, 28. September 2010
Slide 27: Suppose... Dienstag, 28. September 2010
Slide 28: You’d want to core a few more apples... Dienstag, 28. September 2010
Slide 29: ... for an apple cake. Dienstag, 28. September 2010
Slide 30: Still the best tool for the job? Dienstag, 28. September 2010
Slide 31: Better use this one Dienstag, 28. September 2010
Slide 32: ...and this one Dienstag, 28. September 2010
Slide 33: ... a DSL is ... Dienstag, 28. September 2010
Slide 34: A specific tool for a specific job Dienstag, 28. September 2010
Slide 35: A specific tool for a specific job Dienstag, 28. September 2010
Slide 36: Use DSLs to describe the world Dienstag, 28. September 2010
Slide 37: select name, salary from employees where salary > 2000 order by salary ^[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,4}$ Dienstag, 28. September 2010
Slide 38: applause http://code.google.com/p/applause/ iPhonical http://code.google.com/p/iphonical/ mobl http://mobl-lang.org/ Dienstag, 28. September 2010
Slide 39: entity Vortrag { String titel String untertitel String sprecher String beschreibung } contentprovider AllVortragItems returns Vortrag[] fetches XML from "http://spreadsheets.google.com/feeds/list/.../public/values" selects "feed.entry" Entities & Data Access tableview VortragListe(Vortrag[] items) { title= "Vorträge" section { cell Subtitle foreach items as i { text= i.titel details= i.untertitel action= VortragDetailsView( i ) } } } Views & Actions tabbarApplication itemisApp { button { title= "Vorträge" icon= "66-microphone.png" view= VortragListe( AllVortragItems() ) } button { title= "Referenten" icon= "person.png" view= SprecherListe( AllSprecherItems() ) } } Dienstag, 28. September 2010 Navigation
Slide 40: Why not use a DSL... ... for building DSLs? Dienstag, 28. September 2010
Slide 41: http://www.eclipse.org/Xtext/ @xtext Dienstag, 28. September 2010
Slide 42: Generator Runtime Superclass Subclass Class LL(*) Parser Dienstag, 28. September 2010 ECore meta model G ra Model m m ar Editor
Slide 43: Grammar (similar to EBNF) grammar org.xtext.example.Entity with org.eclipse.xtext.common.Terminals generate entity "http://www.xtext.org/example/Entity" Model: (types+=Type)*; Type: TypeDef | Entity; TypeDef: "typedef" name=ID ("mapsto" mappedType=JAVAID)?; JAVAID: name=ID("." ID)*; Entity: "entity" name=ID ("extends" superEntity=[Entity])? "{" (attributes+=Attribute)* "}"; Attribute: type=[Type] (many?="*")? name=ID; Dienstag, 28. September 2010
Slide 44: grammar org.xtext.example.Entity with org.eclipse.xtext.common.Terminals generate entity "http://www.xtext.org/example/Entity" Model: (types+=Type)*; Type: TypeDef | Entity; TypeDef: "typedef" name=ID ("mapsto" mappedType=JAVAID)?; JAVAID: name=ID("." ID)*; Entity: "entity" name=ID ("extends" superEntity=[Entity])? "{" (attributes+=Attribute)* "}"; Attribute: type=[Type] (many?="*")? name=ID; Dienstag, 28. September 2010 Meta model inference entity Model types * Type name: EString superEntity TypeDef Entity attributes Attribute name: EString many: EBoolean type mappedType JAVAID name: EString
Slide 45: Let’s build a DSL for Mobile Apps Dienstag, 28. September 2010
Slide 46: Dienstag, 28. September 2010
Slide 47: Anatomy of an iPhone app View title Speaker Name Image Session Title Location Table view Table cell Entity Data Provider Dienstag, 28. September 2010 Tab bar Tab bar button
Slide 48: Mapping concepts Entity Data Provider Tab bar Tab bar button Table view View title Table cell tabbarApplication itemisApp { button { title= "Blog" icon= "08-chat.png" view= BlogList( Blogposts() ) } } button { title= "Talks" icon= "66-microphone.png" view= VortragListe( AllVortragItems() ) } button { title= "Speakers" icon= "person.png" view= SprecherListe( AllSprecherItems() ) } Dienstag, 28. September 2010
Slide 49: Mapping concepts Entity Data Provider Tab bar Tab bar button Table view View title Table cell entity BlogItem { String title String author String link String description String pubDate BlogItem subItem } entity Sprecher { String name String beschreibung String email String blog String fotourl String vortraege } entity Vortrag { String titel String untertitel String sprecher String beschreibung String zeit Vortrag fortsetzung } Dienstag, 28. September 2010
Slide 50: Mapping concepts Entity Data Provider Tab bar Tab bar button Table view View title Table cell contentprovider Blogposts returns BlogItem[] fetches XML from "http://blogs.itemis.de/?showfeed=1" selects "rss.channel.item" contentprovider AllVortragItems returns Vortrag[] fetches XML from "http://spreadsheets.google.com/feeds/ list/0Au3-oaNYhfPIdEpRQWxpZnJyX2JCNUdtT1Z4M1B4SkE/1/ public/values" selects "feed.entry" Dienstag, 28. September 2010
Slide 51: Mapping concepts Entity Data Provider Tab bar Tab bar button Table view View title Table cell tableview BlogList(BlogItem[] items) { title= "itemis blog" section { cell Subtitle foreach items as i { text= i.author details= i.title image= ("http://blogs.itemis.de/wp-content/ themes/itemis-WP-Theme/photos/" urlconform(i.author) ".jpg") action= BlogDetails(i) } } } Dienstag, 28. September 2010
Slide 52: Debugger Cartridges Protected regions Editor Outlets Profiler Polymorphism Type safe Produces any kind of text Dienstag, 28. September 2010 Can run standalone Eclipse-based (ANT / Maven)
Slide 53: Mapping concepts to code tableview SpeakerList( Speaker[] speakers) { title= "Speakers" section { cell Default foreach speakers as speaker { text= speaker.name image= speaker.smallImageURL action= SpeakerDetails (SpeakerById( speaker.speakerId)) } } } Dienstag, 28. September 2010
Slide 54: Cell Rendering - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { ! id item = [self.items objectAtIndex: indexPath.row]; ! UITableViewCell *cell = [self cellDefaultForTableView:tableView]; cell.textLabel.text = [item valueForKeyPath:@"name"]; ! NSString *imageURL = [item valueForKeyPath:@"fotourl"]; cell.imageView.image = [self getImage: imageURL withLoadingImage:@"personLoading.png" andErrorImage:@"personUnknown.png"]; return cell; } Dienstag, 28. September 2010
Slide 55: Cell Rendering tableview SpeakerList( Speaker[] speakers) { title= "Speakers" section { cell Default foreach speakers as speaker { text= speaker.name image= speaker.smallImageURL action= SpeakerDetails (SpeakerById( speaker.speakerId)) } } } - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { ! id item = [self.items objectAtIndex: indexPath.row]; ! UITableViewCell *cell = [self cellDefaultForTableView:tableView]; cell.textLabel.text = [item valueForKeyPath:@"name"]; ! NSString *imageURL = [item valueForKeyPath:@"fotourl"]; cell.imageView.image = [self getImage: imageURL withLoadingImage:@"personLoading.png" andErrorImage:@"personUnknown.png"]; return cell; } Dienstag, 28. September 2010
Slide 56: User Interaction tableview SpeakerList( Speaker[] speakers) { title= "Speakers" section { cell Default foreach speakers as speaker { text= speaker.name image= speaker.smallImageURL action= SpeakerDetails (SpeakerById( speaker.speakerId)) } } } - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { id item = [self.items objectAtIndex: indexPath.row]; IPContentProvider *provider = [IPSimpleContentProvider providerWithContent:item andProviders:self.contentProvider.providers]; SprecherDetailsViewController *controller = [[SprecherDetailsViewController alloc] init]; controller.contentProvider = provider; [self.navigationController pushViewController: controller animated: TRUE]; [controller release]; } Dienstag, 28. September 2010
Slide 57: Template Invocation tableview SpeakerList( Speaker[] speakers) { title= "Speakers" section { cell Default foreach speakers as speaker { text= speaker.name image= speaker.smallImageURL action= SpeakerDetails (SpeakerById( speaker.speakerId)) } } } «DEFINE viewModule FOR SectionedView» «FILE filenameModule()» #import "«filenameHeader()»" #import "NSObject+Applause.h" «EXPAND imports» @implementation «className()» «EXPAND sectionCount» «EXPAND sectionTitleHeader» «EXPAND rowCounts» «EXPAND cellDescriptions» «EXPAND cellSelections» «EXPAND staticData» @end «ENDFILE» «ENDDEFINE» Dienstag, 28. September 2010
Slide 58: Demo Dienstag, 28. September 2010
Slide 59: twitter blog consulting @HBehrens http://HeikoBehrens.net mobile.itemis.de Xtext/Xpand eclipse.org applause code.google.com/p/applause Dienstag, 28. September 2010

   
Time on Slide Time on Plick
Slides per Visit Slide Views Views by Location