SlideShare ist ein Scribd-Unternehmen logo
1 von 99
Downloaden Sie, um offline zu lesen
Zef Hemel, Eelco Visser
mobl: Een DSL voor mobiele applicatieontwikkeling
mobl: Een DSL voor mobiele applicatieontwikkeling
mobl: Een DSL voor mobiele applicatieontwikkeling
mobl: Een DSL voor mobiele applicatieontwikkeling
230,000/day
mobl: Een DSL voor mobiele applicatieontwikkeling
200,000/day
mobl: Een DSL voor mobiele applicatieontwikkeling
application
development
Objective-C
Objective-C Java
Objective-C Java J2ME/C++
Objective-C Java J2ME/C++
HTML/Javascript
Objective-C Java J2ME/C++
HTML/Javascript Java
Objective-C Java J2ME/C++
HTML/Javascript Java .NET
AppStore
mobl: Een DSL voor mobiele applicatieontwikkeling
mobl: Een DSL voor mobiele applicatieontwikkeling
portability
deployment
mobl: Een DSL voor mobiele applicatieontwikkeling
WWW
mobl: Een DSL voor mobiele applicatieontwikkeling
mobl: Een DSL voor mobiele applicatieontwikkeling
mobl: Een DSL voor mobiele applicatieontwikkeling
mobl: Een DSL voor mobiele applicatieontwikkeling
HTML
WebDatabases
WebDatabases
Location information
(GPS)
WebDatabases
Location information
(GPS)
Threading
WebDatabases
Location information
(GPS)
Threading
Canvas
WebDatabases
Location information
(GPS)
Threading
Canvas
Multi-touch
WebDatabases
Location information
(GPS)
Threading
Canvas
Multi-touch
Offline support
WebDatabases
Location information
(GPS)
Threading
Canvas
Multi-touch
Offline support
Full-screen support
mobl: Een DSL voor mobiele applicatieontwikkeling
mobl: Een DSL voor mobiele applicatieontwikkeling
mobl: Een DSL voor mobiele applicatieontwikkeling
mobile web apps
HTML
CSS
Javascript
SQL
cache
manifests
HTML
CSS
Javascript
SQL
cache
manifests
mobl: Een DSL voor mobiele applicatieontwikkeling
mobl: Een DSL voor mobiele applicatieontwikkeling
mobl: Een DSL voor mobiele applicatieontwikkeling
mobl: Een DSL voor mobiele applicatieontwikkeling
user interface abstraction
user interface abstraction
var results = tx.executeQuery("SELECT * FROM Task");
for(var i = 0; i < results.length; i++) {
alert(results[i].name);
}
synchronous programming
render page
query database
and process
results
...
time
render page
query database
and process
results
...
time
browser freeze
render page
send query
...
process query
result
...
time
tx.executeQuery("SELECT * FROM Task",
function(results) {
for(var i = 0; i < results.length; i++) {
alert(results[i].name);
}
});
...
asynchronous programming
tx.executeQuery("SELECT * FROM Task",
function(results) {
alert("Hello, ");
});
alert("world!");
tx.executeQuery("SELECT * FROM Task",
function(results) {
tx.executeQuery("INSERT ...", function() {
alert("Selected, then inserted");
});
});
mix of loosely-coupled DSLs
poor tool-support for mixed-language projects
lack of abstraction in UI
asynchronous programming
mobl: Een DSL voor mobiele applicatieontwikkeling
demo
http://confplan.zef.me
mobl: Een DSL voor mobiele applicatieontwikkeling
task 1:
user interface
http://mobl-lang.org/get.html
http://webdsl.org/zip/devnology/eclipselinux64.zip
http://webdsl.org/zip/devnology/eclipselinux.zip
http://webdsl.org/zip/devnology/eclipsemac64.zip
http://webdsl.org/zip/devnology/eclipsewin.zip
application tipcalculator
import mobl::ui::generic
screen root() {
var amount = 10
var percentage = 10
header("Tip calculator")
group {
item { numField(amount, label="amount") }
item { numField(percentage, label="percentage") }
item { "$" label(amount * (1 + percentage/100)) }
}
}
application tipcalculator
import mobl::ui::generic
screen root() {
var amount = 10
var percentage = 10
header("Tip calculator")
group {
item { numField(amount, label="amount") }
item { numField(percentage, label="percentage") }
item { "$" label(amount * (1 + percentage/100)) }
}
}
application tipcalculator
import mobl::ui::generic
screen root() {
var amount = 10
var percentage = 10
header("Tip calculator")
group {
item { numField(amount, label="amount") }
item { numField(percentage, label="percentage") }
item { "$" label(amount * (1 + percentage/100)) }
}
}
application tipcalculator
import mobl::ui::generic
screen root() {
var amount = 10
var percentage = 10
header("Tip calculator")
group {
item { numField(amount, label="amount") }
item { numField(percentage, label="percentage") }
item { "$" label(amount * (1 + percentage/100)) }
}
}
application tipcalculator
import mobl::ui::generic
screen root() {
var amount = 10
var percentage = 10
header("Tip calculator")
group {
item { numField(amount, label="amount") }
item { numField(percentage, label="percentage") }
item { "$" label(amount * (1 + percentage/100)) }
}
}
application tipcalculator
import mobl::ui::generic
screen root() {
var amount = 10
var percentage = 10
header("Tip calculator")
group {
item { numField(amount, label="amount") }
item { numField(percentage, label="percentage") }
item { "$" label(amount * (1 + percentage/100)) }
}
}
task 2:
scripting
application test
import mobl::ui::generic
function fac(n : Num) : Num {
if(n == 1) {
return 1;
} else {
return n * fac(n-1);
}
}
screen promptNum(question : String) : Num {
var answer = 0
header(question) {
button("Done", onclick={
screen return answer;
})
}
group {
item {
numField(answer)
}
}
}
screen root() {
header("Calculator")
var n = 2
group {
item { numField(n) }
}
button("*", onclick={ n = n * promptNum("Multiply with"); })
button("+", onclick={ n = n + promptNum("Add"); })
button("!", onclick={ n = fac(n); })
}
application test
import mobl::ui::generic
function fac(n : Num) : Num {
if(n == 1) {
return 1;
} else {
return n * fac(n-1);
}
}
screen promptNum(question : String) : Num {
var answer = 0
header(question) {
button("Done", onclick={
screen return answer;
})
}
group {
item {
numField(answer)
}
}
}
screen root() {
header("Calculator")
var n = 2
group {
item { numField(n) }
}
button("*", onclick={ n = n * promptNum("Multiply with"); })
button("+", onclick={ n = n + promptNum("Add"); })
button("!", onclick={ n = fac(n); })
}
application test
import mobl::ui::generic
function fac(n : Num) : Num {
if(n == 1) {
return 1;
} else {
return n * fac(n-1);
}
}
screen promptNum(question : String) : Num {
var answer = 0
header(question) {
button("Done", onclick={
screen return answer;
})
}
group {
item {
numField(answer)
}
}
}
screen root() {
header("Calculator")
var n = 2
group {
item { numField(n) }
}
button("*", onclick={ n = n * promptNum("Multiply with"); })
button("+", onclick={ n = n + promptNum("Add"); })
button("!", onclick={ n = fac(n); })
}
application todo
import mobl::ui::generic
function fac(n : Num) : Num {
if(n == 1) {
return 1;
} else {
return n * fac(n-1);
}
}
screen promptNum(question : String) : Num {
var answer = 0
header(question) {
button("Done", onclick={
screen return answer;
})
}
group {
item {
numField(answer)
}
}
}
screen root() {
header("Calculator")
var n = 2
group {
item { numField(n) }
}
button("*", onclick={ n = n * promptNum("Multiply with"); })
button("+", onclick={ n = n + promptNum("Add"); })
button("!", onclick={ n = fac(n); })
}
application test
import mobl::ui::generic
function fac(n : Num) : Num {
if(n == 1) {
return 1;
} else {
return n * fac(n-1);
}
}
screen promptNum(question : String) : Num {
var answer = 0
header(question) {
button("Done", onclick={
screen return answer;
})
}
group {
item {
numField(answer)
}
}
}
screen root() {
header("Calculator")
var n = 2
group {
item { numField(n) }
}
button("*", onclick={ n = n * promptNum("Multiply with"); })
button("+", onclick={ n = n + promptNum("Add"); })
button("!", onclick={ n = fac(n); })
}
var pos = getPosition();
alert("Your location is: " + pos);
var pos = getPosition();
alert("Your location is: " + pos);
var pos;
getPosition(function(result) {
pos = result;
alert("Your location is: " + pos);
...
});
continuation-passing
style transformation
task 3:
data modeling and query
entity Task {
name : String (searchable)
done : Bool
dateAdded : DateTime
}
entity Task {
name : String (searchable)
done : Bool
dateAdded : DateTime
category : Category (inverse: tasks)
tags : Collection<Tag> (inverse: tasks)
}
entity Category {
	 name : String
	 tasks : Collection<Task> (inverse: category)
}
entity Tag {
	 name : String
	 tasks : Collection<Task> (inverse: tags)
}
screen root() {
header("Tasks") {
button("Add", onclick={ addTask(); })
}
group {
list(t in Task.all() order by dateAdded desc) {
taskItem(t)
}
}
button("Search", onclick={ search(); })
}
screen search() {
var phrase = ""
header("Search") { backButton() }
searchBox(phrase)
group {
list(t in Task.searchPrefix(phrase)) {
taskItem(t)
}
}
}
screen root() {
header("Tasks") {
button("Add", onclick={ addTask(); })
}
group {
list(t in Task.all() order by dateAdded desc) {
taskItem(t)
}
}
button("Search", onclick={ search(); })
}
screen search() {
var phrase = ""
header("Search") { backButton() }
searchBox(phrase)
group {
list(t in Task.searchPrefix(phrase)) {
taskItem(t)
}
}
}
control taskItem(t : Task) {
item(onclick={ taskDetails(t); }) {
checkBox(t.done)
" "
label(t.name)
contextMenu {
button("Remove", onclick={
remove(t);
})
}
}
}
control taskItem(t : Task) {
item(onclick={ taskDetails(t); }) {
checkBox(t.done)
" "
label(t.name)
contextMenu {
button("Remove", onclick={
remove(t);
})
}
}
}
Task.all()
Task.all() where done == false && ...
order by dateAdded desc
limit 10
offset 5
Task.all() where done == false && ...
order by dateAdded desc
limit 10
offset 5
task 4:
higher-order controls and
native interfaces
control taskItem(t : Task) {
checkBox(t.done)
" "
label(t.name)
contextMenu {
button("Remove", onclick={
remove(t);
})
}
}
control taskDetail(t : Task) {
group {
item { textField(t.name, placeholder="Task name") }
item { checkBox(t.done, label="Done") }
}
}
screen root() {
header("Tasks") {
button("Add", onclick={ addTask(); })
}
masterDetail(Task.all() order by dateAdded desc, taskItem, taskDetail)
button("Search", onclick={ search(); })
}
control taskItem(t : Task) {
checkBox(t.done)
" "
label(t.name)
contextMenu {
button("Remove", onclick={
remove(t);
})
}
}
control taskDetail(t : Task) {
group {
item { textField(t.name, placeholder="Task name") }
item { checkBox(t.done, label="Done") }
}
}
screen root() {
header("Tasks") {
button("Add", onclick={ addTask(); })
}
masterDetail(Task.all() order by dateAdded desc, taskItem, taskDetail)
button("Search", onclick={ search(); })
}
control masterDetail(items : Collection<Dynamic>, masterItem : Control1<Dynamic>,
detail : Control1<Dynamic>) {
group {
list(it in items) {
item(onclick={ detailScreen(it, detail); }) {
masterItem(it)
}
}
}
}
screen detailScreen(it : Dynamic, detail : Control1<Dynamic>) {
header("Detail") {
backButton("Back", onclick={ screen return; })
}
detail(it)
}
mobl: Een DSL voor mobiele applicatieontwikkeling
mobl: Een DSL voor mobiele applicatieontwikkeling
external type LocalStorage {
static sync function getItem(key : String) : Dynamic
static sync function setItem(key : String, val : Object) : void
static sync function removeItem(key : String) : void
static sync function clear() : void
}
<javascript>
firstapp.LocalStorage = window.localStorage;
</javascript>
what else is there?
service DataProvider {
resource getNearbyConferences(lat : Num, long : Num) : [JSON] {
uri = "/nearbyConferences"
}
resource fetchProgram(conferenceId : String) : [JSON] {
uri = "/conferenceProgram"
}
}
web services
service DataProvider {
resource getNearbyConferences(lat : Num, long : Num) : [JSON] {
uri = "/nearbyConferences"
}
resource fetchProgram(conferenceId : String) : [JSON] {
uri = "/conferenceProgram"
}
}
function loadLocalConferences() {
var position = getPosition();
var nearbyConferencesJson = DataProvider.getNearbyConferences(position.latitude,
position.longitude);
foreach(jsonObj in nearbyConferencesJson) {
Conference.fromSelectJson(jsonObj);
}
}
web services
location & maps
mobl::ui::ios mobl::ui::jq
mobl::ui::ios mobl::ui::jq
mobl::ui
application confplan
offline true
title "ConfPlan"
future
adaptive user interfaces
database sync
more high-level controls
web/native hybrid (PhoneGap)
http://mobl-lang.org
http://twitter.com/zef
http://twitter.com/mobllang
http://zef.me

Weitere ähnliche Inhalte

Was ist angesagt?

The Ring programming language version 1.6 book - Part 68 of 189
The Ring programming language version 1.6 book - Part 68 of 189The Ring programming language version 1.6 book - Part 68 of 189
The Ring programming language version 1.6 book - Part 68 of 189Mahmoud Samir Fayed
 
Rのスコープとフレームと環境と
Rのスコープとフレームと環境とRのスコープとフレームと環境と
Rのスコープとフレームと環境とTakeshi Arabiki
 
Rデバッグあれこれ
RデバッグあれこれRデバッグあれこれ
RデバッグあれこれTakeshi Arabiki
 
GoLightly - a customisable virtual machine written in Go
GoLightly - a customisable virtual machine written in GoGoLightly - a customisable virtual machine written in Go
GoLightly - a customisable virtual machine written in GoEleanor McHugh
 
The Ring programming language version 1.7 book - Part 72 of 196
The Ring programming language version 1.7 book - Part 72 of 196The Ring programming language version 1.7 book - Part 72 of 196
The Ring programming language version 1.7 book - Part 72 of 196Mahmoud Samir Fayed
 
Data structures lab
Data structures labData structures lab
Data structures labRagu Ram
 
The Ring programming language version 1.10 book - Part 70 of 212
The Ring programming language version 1.10 book - Part 70 of 212The Ring programming language version 1.10 book - Part 70 of 212
The Ring programming language version 1.10 book - Part 70 of 212Mahmoud Samir Fayed
 
The Ring programming language version 1.3 book - Part 47 of 88
The Ring programming language version 1.3 book - Part 47 of 88The Ring programming language version 1.3 book - Part 47 of 88
The Ring programming language version 1.3 book - Part 47 of 88Mahmoud Samir Fayed
 
TDC2016SP - Código funcional em Java: superando o hype
TDC2016SP - Código funcional em Java: superando o hypeTDC2016SP - Código funcional em Java: superando o hype
TDC2016SP - Código funcional em Java: superando o hypetdc-globalcode
 
The Ring programming language version 1.5.2 book - Part 41 of 181
The Ring programming language version 1.5.2 book - Part 41 of 181The Ring programming language version 1.5.2 book - Part 41 of 181
The Ring programming language version 1.5.2 book - Part 41 of 181Mahmoud Samir Fayed
 
Scala meetup
Scala meetupScala meetup
Scala meetup扬 明
 
Functional programming techniques in real-world microservices
Functional programming techniques in real-world microservicesFunctional programming techniques in real-world microservices
Functional programming techniques in real-world microservicesAndrás Papp
 
Famo.us: From Zero to UI
Famo.us: From Zero to UIFamo.us: From Zero to UI
Famo.us: From Zero to UItimjchin
 
ZIO: Powerful and Principled Functional Programming in Scala
ZIO: Powerful and Principled Functional Programming in ScalaZIO: Powerful and Principled Functional Programming in Scala
ZIO: Powerful and Principled Functional Programming in ScalaWiem Zine Elabidine
 
The Ring programming language version 1.2 book - Part 30 of 84
The Ring programming language version 1.2 book - Part 30 of 84The Ring programming language version 1.2 book - Part 30 of 84
The Ring programming language version 1.2 book - Part 30 of 84Mahmoud Samir Fayed
 
The Ring programming language version 1.3 book - Part 36 of 88
The Ring programming language version 1.3 book - Part 36 of 88The Ring programming language version 1.3 book - Part 36 of 88
The Ring programming language version 1.3 book - Part 36 of 88Mahmoud Samir Fayed
 

Was ist angesagt? (20)

The Ring programming language version 1.6 book - Part 68 of 189
The Ring programming language version 1.6 book - Part 68 of 189The Ring programming language version 1.6 book - Part 68 of 189
The Ring programming language version 1.6 book - Part 68 of 189
 
Rのスコープとフレームと環境と
Rのスコープとフレームと環境とRのスコープとフレームと環境と
Rのスコープとフレームと環境と
 
Rデバッグあれこれ
RデバッグあれこれRデバッグあれこれ
Rデバッグあれこれ
 
Baitap tkw
Baitap tkwBaitap tkw
Baitap tkw
 
GoLightly - a customisable virtual machine written in Go
GoLightly - a customisable virtual machine written in GoGoLightly - a customisable virtual machine written in Go
GoLightly - a customisable virtual machine written in Go
 
The Ring programming language version 1.7 book - Part 72 of 196
The Ring programming language version 1.7 book - Part 72 of 196The Ring programming language version 1.7 book - Part 72 of 196
The Ring programming language version 1.7 book - Part 72 of 196
 
Data structures lab
Data structures labData structures lab
Data structures lab
 
The Ring programming language version 1.10 book - Part 70 of 212
The Ring programming language version 1.10 book - Part 70 of 212The Ring programming language version 1.10 book - Part 70 of 212
The Ring programming language version 1.10 book - Part 70 of 212
 
The Ring programming language version 1.3 book - Part 47 of 88
The Ring programming language version 1.3 book - Part 47 of 88The Ring programming language version 1.3 book - Part 47 of 88
The Ring programming language version 1.3 book - Part 47 of 88
 
Groovy kind of test
Groovy kind of testGroovy kind of test
Groovy kind of test
 
TDC2016SP - Código funcional em Java: superando o hype
TDC2016SP - Código funcional em Java: superando o hypeTDC2016SP - Código funcional em Java: superando o hype
TDC2016SP - Código funcional em Java: superando o hype
 
C++ TUTORIAL 7
C++ TUTORIAL 7C++ TUTORIAL 7
C++ TUTORIAL 7
 
The Ring programming language version 1.5.2 book - Part 41 of 181
The Ring programming language version 1.5.2 book - Part 41 of 181The Ring programming language version 1.5.2 book - Part 41 of 181
The Ring programming language version 1.5.2 book - Part 41 of 181
 
Scala meetup
Scala meetupScala meetup
Scala meetup
 
Functional programming techniques in real-world microservices
Functional programming techniques in real-world microservicesFunctional programming techniques in real-world microservices
Functional programming techniques in real-world microservices
 
Famo.us: From Zero to UI
Famo.us: From Zero to UIFamo.us: From Zero to UI
Famo.us: From Zero to UI
 
ZIO: Powerful and Principled Functional Programming in Scala
ZIO: Powerful and Principled Functional Programming in ScalaZIO: Powerful and Principled Functional Programming in Scala
ZIO: Powerful and Principled Functional Programming in Scala
 
C++ TUTORIAL 6
C++ TUTORIAL 6C++ TUTORIAL 6
C++ TUTORIAL 6
 
The Ring programming language version 1.2 book - Part 30 of 84
The Ring programming language version 1.2 book - Part 30 of 84The Ring programming language version 1.2 book - Part 30 of 84
The Ring programming language version 1.2 book - Part 30 of 84
 
The Ring programming language version 1.3 book - Part 36 of 88
The Ring programming language version 1.3 book - Part 36 of 88The Ring programming language version 1.3 book - Part 36 of 88
The Ring programming language version 1.3 book - Part 36 of 88
 

Andere mochten auch

Social Media Services Design &amp; Promote
Social Media Services Design &amp; PromoteSocial Media Services Design &amp; Promote
Social Media Services Design &amp; PromoteBruce Jones
 
Experimenting with Augmented Reality
Experimenting with Augmented RealityExperimenting with Augmented Reality
Experimenting with Augmented RealityDevnology
 
The Power Of A Press Release
The Power Of A Press ReleaseThe Power Of A Press Release
The Power Of A Press ReleaseBruce Jones
 
Internet Marketing 101
Internet Marketing 101Internet Marketing 101
Internet Marketing 101Bruce Jones
 
Inbound Marketing 101
Inbound Marketing 101Inbound Marketing 101
Inbound Marketing 101Bruce Jones
 
Software Transactioneel Geheugen
Software Transactioneel GeheugenSoftware Transactioneel Geheugen
Software Transactioneel GeheugenDevnology
 
Software Operation Knowledge
Software Operation KnowledgeSoftware Operation Knowledge
Software Operation KnowledgeDevnology
 
SEO 102 Seminar
SEO 102 Seminar SEO 102 Seminar
SEO 102 Seminar Bruce Jones
 
Van Idee Tot ISV
Van Idee Tot ISVVan Idee Tot ISV
Van Idee Tot ISVDevnology
 
Devnology Back to School: Empirical Evidence on Modeling in Software Development
Devnology Back to School: Empirical Evidence on Modeling in Software DevelopmentDevnology Back to School: Empirical Evidence on Modeling in Software Development
Devnology Back to School: Empirical Evidence on Modeling in Software DevelopmentDevnology
 
How To Be A Good Facebook Page Manager
How To Be A Good Facebook Page ManagerHow To Be A Good Facebook Page Manager
How To Be A Good Facebook Page ManagerBruce Jones
 
Unleash Your Domain With Greg Young
Unleash Your Domain With Greg YoungUnleash Your Domain With Greg Young
Unleash Your Domain With Greg YoungDevnology
 
Introduction to Software Evolution: The Software Volcano
Introduction to Software Evolution: The Software VolcanoIntroduction to Software Evolution: The Software Volcano
Introduction to Software Evolution: The Software VolcanoDevnology
 
Learn a language : LISP
Learn a language : LISPLearn a language : LISP
Learn a language : LISPDevnology
 
Small Business Internet Marketing Plan
Small  Business  Internet  Marketing  PlanSmall  Business  Internet  Marketing  Plan
Small Business Internet Marketing PlanBruce Jones
 

Andere mochten auch (16)

Social Media Services Design &amp; Promote
Social Media Services Design &amp; PromoteSocial Media Services Design &amp; Promote
Social Media Services Design &amp; Promote
 
Experimenting with Augmented Reality
Experimenting with Augmented RealityExperimenting with Augmented Reality
Experimenting with Augmented Reality
 
The Power Of A Press Release
The Power Of A Press ReleaseThe Power Of A Press Release
The Power Of A Press Release
 
Internet Marketing 101
Internet Marketing 101Internet Marketing 101
Internet Marketing 101
 
Inbound Marketing 101
Inbound Marketing 101Inbound Marketing 101
Inbound Marketing 101
 
Software Transactioneel Geheugen
Software Transactioneel GeheugenSoftware Transactioneel Geheugen
Software Transactioneel Geheugen
 
Codereviews
CodereviewsCodereviews
Codereviews
 
Software Operation Knowledge
Software Operation KnowledgeSoftware Operation Knowledge
Software Operation Knowledge
 
SEO 102 Seminar
SEO 102 Seminar SEO 102 Seminar
SEO 102 Seminar
 
Van Idee Tot ISV
Van Idee Tot ISVVan Idee Tot ISV
Van Idee Tot ISV
 
Devnology Back to School: Empirical Evidence on Modeling in Software Development
Devnology Back to School: Empirical Evidence on Modeling in Software DevelopmentDevnology Back to School: Empirical Evidence on Modeling in Software Development
Devnology Back to School: Empirical Evidence on Modeling in Software Development
 
How To Be A Good Facebook Page Manager
How To Be A Good Facebook Page ManagerHow To Be A Good Facebook Page Manager
How To Be A Good Facebook Page Manager
 
Unleash Your Domain With Greg Young
Unleash Your Domain With Greg YoungUnleash Your Domain With Greg Young
Unleash Your Domain With Greg Young
 
Introduction to Software Evolution: The Software Volcano
Introduction to Software Evolution: The Software VolcanoIntroduction to Software Evolution: The Software Volcano
Introduction to Software Evolution: The Software Volcano
 
Learn a language : LISP
Learn a language : LISPLearn a language : LISP
Learn a language : LISP
 
Small Business Internet Marketing Plan
Small  Business  Internet  Marketing  PlanSmall  Business  Internet  Marketing  Plan
Small Business Internet Marketing Plan
 

Ähnlich wie mobl: Een DSL voor mobiele applicatieontwikkeling

Software Language Design & Engineering
Software Language Design & EngineeringSoftware Language Design & Engineering
Software Language Design & EngineeringEelco Visser
 
Callbacks, Promises, and Coroutines (oh my!): Asynchronous Programming Patter...
Callbacks, Promises, and Coroutines (oh my!): Asynchronous Programming Patter...Callbacks, Promises, and Coroutines (oh my!): Asynchronous Programming Patter...
Callbacks, Promises, and Coroutines (oh my!): Asynchronous Programming Patter...Domenic Denicola
 
Paris js extensions
Paris js extensionsParis js extensions
Paris js extensionserwanl
 
Scala+swing
Scala+swingScala+swing
Scala+swingperneto
 
JavaScript Advanced - Useful methods to power up your code
JavaScript Advanced - Useful methods to power up your codeJavaScript Advanced - Useful methods to power up your code
JavaScript Advanced - Useful methods to power up your codeLaurence Svekis ✔
 
2008 - TechDays PT: WCF, JSON and AJAX for performance and manageability
2008 - TechDays PT: WCF, JSON and AJAX for performance and manageability2008 - TechDays PT: WCF, JSON and AJAX for performance and manageability
2008 - TechDays PT: WCF, JSON and AJAX for performance and manageabilityDaniel Fisher
 
TypeScript Introduction
TypeScript IntroductionTypeScript Introduction
TypeScript IntroductionDmitry Sheiko
 
The Ring programming language version 1.5.4 book - Part 42 of 185
The Ring programming language version 1.5.4 book - Part 42 of 185The Ring programming language version 1.5.4 book - Part 42 of 185
The Ring programming language version 1.5.4 book - Part 42 of 185Mahmoud Samir Fayed
 
openFrameworks – パーティクルを動かす、静的配列と動的配列 - 多摩美メディアアートII
openFrameworks – パーティクルを動かす、静的配列と動的配列 - 多摩美メディアアートIIopenFrameworks – パーティクルを動かす、静的配列と動的配列 - 多摩美メディアアートII
openFrameworks – パーティクルを動かす、静的配列と動的配列 - 多摩美メディアアートIIAtsushi Tadokoro
 
Intro to Javascript
Intro to JavascriptIntro to Javascript
Intro to JavascriptAnjan Banda
 
The Ring programming language version 1.9 book - Part 71 of 210
The Ring programming language version 1.9 book - Part 71 of 210The Ring programming language version 1.9 book - Part 71 of 210
The Ring programming language version 1.9 book - Part 71 of 210Mahmoud Samir Fayed
 

Ähnlich wie mobl: Een DSL voor mobiele applicatieontwikkeling (20)

mobl
moblmobl
mobl
 
mobl
moblmobl
mobl
 
Software Language Design & Engineering
Software Language Design & EngineeringSoftware Language Design & Engineering
Software Language Design & Engineering
 
Callbacks, Promises, and Coroutines (oh my!): Asynchronous Programming Patter...
Callbacks, Promises, and Coroutines (oh my!): Asynchronous Programming Patter...Callbacks, Promises, and Coroutines (oh my!): Asynchronous Programming Patter...
Callbacks, Promises, and Coroutines (oh my!): Asynchronous Programming Patter...
 
Paris js extensions
Paris js extensionsParis js extensions
Paris js extensions
 
Scala+swing
Scala+swingScala+swing
Scala+swing
 
Day 5
Day 5Day 5
Day 5
 
Scala on Your Phone
Scala on Your PhoneScala on Your Phone
Scala on Your Phone
 
Griffon @ Svwjug
Griffon @ SvwjugGriffon @ Svwjug
Griffon @ Svwjug
 
Vaadin7
Vaadin7Vaadin7
Vaadin7
 
JavaScript Advanced - Useful methods to power up your code
JavaScript Advanced - Useful methods to power up your codeJavaScript Advanced - Useful methods to power up your code
JavaScript Advanced - Useful methods to power up your code
 
Nativescript angular
Nativescript angularNativescript angular
Nativescript angular
 
2008 - TechDays PT: WCF, JSON and AJAX for performance and manageability
2008 - TechDays PT: WCF, JSON and AJAX for performance and manageability2008 - TechDays PT: WCF, JSON and AJAX for performance and manageability
2008 - TechDays PT: WCF, JSON and AJAX for performance and manageability
 
Gwt and Xtend
Gwt and XtendGwt and Xtend
Gwt and Xtend
 
TypeScript Introduction
TypeScript IntroductionTypeScript Introduction
TypeScript Introduction
 
The Ring programming language version 1.5.4 book - Part 42 of 185
The Ring programming language version 1.5.4 book - Part 42 of 185The Ring programming language version 1.5.4 book - Part 42 of 185
The Ring programming language version 1.5.4 book - Part 42 of 185
 
openFrameworks – パーティクルを動かす、静的配列と動的配列 - 多摩美メディアアートII
openFrameworks – パーティクルを動かす、静的配列と動的配列 - 多摩美メディアアートIIopenFrameworks – パーティクルを動かす、静的配列と動的配列 - 多摩美メディアアートII
openFrameworks – パーティクルを動かす、静的配列と動的配列 - 多摩美メディアアートII
 
Google Web Toolkit
Google Web ToolkitGoogle Web Toolkit
Google Web Toolkit
 
Intro to Javascript
Intro to JavascriptIntro to Javascript
Intro to Javascript
 
The Ring programming language version 1.9 book - Part 71 of 210
The Ring programming language version 1.9 book - Part 71 of 210The Ring programming language version 1.9 book - Part 71 of 210
The Ring programming language version 1.9 book - Part 71 of 210
 

Mehr von Devnology

What do we really know about the differences between static and dynamic types?
What do we really know about the differences between static and dynamic types?What do we really know about the differences between static and dynamic types?
What do we really know about the differences between static and dynamic types?Devnology
 
Meetup at SIG: Meten is weten
Meetup at SIG: Meten is wetenMeetup at SIG: Meten is weten
Meetup at SIG: Meten is wetenDevnology
 
Slides Felienne Hermans Symposium EWI
Slides Felienne Hermans Symposium EWISlides Felienne Hermans Symposium EWI
Slides Felienne Hermans Symposium EWIDevnology
 
Devnology auteursrecht en open source 20130205
Devnology auteursrecht en open source 20130205Devnology auteursrecht en open source 20130205
Devnology auteursrecht en open source 20130205Devnology
 
The top 10 security issues in web applications
The top 10 security issues in web applicationsThe top 10 security issues in web applications
The top 10 security issues in web applicationsDevnology
 
Hacking Smartcards & RFID
Hacking Smartcards & RFIDHacking Smartcards & RFID
Hacking Smartcards & RFIDDevnology
 
Learn a language : LISP
Learn a language : LISPLearn a language : LISP
Learn a language : LISPDevnology
 
Devnology Back to School IV - Agility en Architectuur
Devnology Back to School IV - Agility en ArchitectuurDevnology Back to School IV - Agility en Architectuur
Devnology Back to School IV - Agility en ArchitectuurDevnology
 
Devnology Back to School III : Software impact
Devnology Back to School III : Software impactDevnology Back to School III : Software impact
Devnology Back to School III : Software impactDevnology
 
Devnology back toschool software reengineering
Devnology back toschool software reengineeringDevnology back toschool software reengineering
Devnology back toschool software reengineeringDevnology
 
Devnology Workshop Genpro 2 feb 2011
Devnology Workshop Genpro 2 feb 2011Devnology Workshop Genpro 2 feb 2011
Devnology Workshop Genpro 2 feb 2011Devnology
 
Devnology Coding Dojo 05-01-2011
Devnology Coding Dojo 05-01-2011Devnology Coding Dojo 05-01-2011
Devnology Coding Dojo 05-01-2011Devnology
 
Spoofax: ontwikkeling van domeinspecifieke talen in Eclipse
Spoofax: ontwikkeling van domeinspecifieke talen in EclipseSpoofax: ontwikkeling van domeinspecifieke talen in Eclipse
Spoofax: ontwikkeling van domeinspecifieke talen in EclipseDevnology
 
Unit testing and MVVM in Silverlight
Unit testing and MVVM in SilverlightUnit testing and MVVM in Silverlight
Unit testing and MVVM in SilverlightDevnology
 
Devnology Fitnesse workshop
Devnology Fitnesse workshopDevnology Fitnesse workshop
Devnology Fitnesse workshopDevnology
 
DNSSec: Internet achter de schermen
DNSSec: Internet achter de schermenDNSSec: Internet achter de schermen
DNSSec: Internet achter de schermenDevnology
 
Code inspecties
Code inspectiesCode inspecties
Code inspectiesDevnology
 
Rascal Devnology Code Fest
Rascal Devnology Code FestRascal Devnology Code Fest
Rascal Devnology Code FestDevnology
 
Building an artificial game player in Smalltalk
Building an artificial game player in SmalltalkBuilding an artificial game player in Smalltalk
Building an artificial game player in SmalltalkDevnology
 
Reverse Engineering Spreadsheets
Reverse Engineering SpreadsheetsReverse Engineering Spreadsheets
Reverse Engineering SpreadsheetsDevnology
 

Mehr von Devnology (20)

What do we really know about the differences between static and dynamic types?
What do we really know about the differences between static and dynamic types?What do we really know about the differences between static and dynamic types?
What do we really know about the differences between static and dynamic types?
 
Meetup at SIG: Meten is weten
Meetup at SIG: Meten is wetenMeetup at SIG: Meten is weten
Meetup at SIG: Meten is weten
 
Slides Felienne Hermans Symposium EWI
Slides Felienne Hermans Symposium EWISlides Felienne Hermans Symposium EWI
Slides Felienne Hermans Symposium EWI
 
Devnology auteursrecht en open source 20130205
Devnology auteursrecht en open source 20130205Devnology auteursrecht en open source 20130205
Devnology auteursrecht en open source 20130205
 
The top 10 security issues in web applications
The top 10 security issues in web applicationsThe top 10 security issues in web applications
The top 10 security issues in web applications
 
Hacking Smartcards & RFID
Hacking Smartcards & RFIDHacking Smartcards & RFID
Hacking Smartcards & RFID
 
Learn a language : LISP
Learn a language : LISPLearn a language : LISP
Learn a language : LISP
 
Devnology Back to School IV - Agility en Architectuur
Devnology Back to School IV - Agility en ArchitectuurDevnology Back to School IV - Agility en Architectuur
Devnology Back to School IV - Agility en Architectuur
 
Devnology Back to School III : Software impact
Devnology Back to School III : Software impactDevnology Back to School III : Software impact
Devnology Back to School III : Software impact
 
Devnology back toschool software reengineering
Devnology back toschool software reengineeringDevnology back toschool software reengineering
Devnology back toschool software reengineering
 
Devnology Workshop Genpro 2 feb 2011
Devnology Workshop Genpro 2 feb 2011Devnology Workshop Genpro 2 feb 2011
Devnology Workshop Genpro 2 feb 2011
 
Devnology Coding Dojo 05-01-2011
Devnology Coding Dojo 05-01-2011Devnology Coding Dojo 05-01-2011
Devnology Coding Dojo 05-01-2011
 
Spoofax: ontwikkeling van domeinspecifieke talen in Eclipse
Spoofax: ontwikkeling van domeinspecifieke talen in EclipseSpoofax: ontwikkeling van domeinspecifieke talen in Eclipse
Spoofax: ontwikkeling van domeinspecifieke talen in Eclipse
 
Unit testing and MVVM in Silverlight
Unit testing and MVVM in SilverlightUnit testing and MVVM in Silverlight
Unit testing and MVVM in Silverlight
 
Devnology Fitnesse workshop
Devnology Fitnesse workshopDevnology Fitnesse workshop
Devnology Fitnesse workshop
 
DNSSec: Internet achter de schermen
DNSSec: Internet achter de schermenDNSSec: Internet achter de schermen
DNSSec: Internet achter de schermen
 
Code inspecties
Code inspectiesCode inspecties
Code inspecties
 
Rascal Devnology Code Fest
Rascal Devnology Code FestRascal Devnology Code Fest
Rascal Devnology Code Fest
 
Building an artificial game player in Smalltalk
Building an artificial game player in SmalltalkBuilding an artificial game player in Smalltalk
Building an artificial game player in Smalltalk
 
Reverse Engineering Spreadsheets
Reverse Engineering SpreadsheetsReverse Engineering Spreadsheets
Reverse Engineering Spreadsheets
 

Kürzlich hochgeladen

Meet the new FSP 3000 M-Flex800™
Meet the new FSP 3000 M-Flex800™Meet the new FSP 3000 M-Flex800™
Meet the new FSP 3000 M-Flex800™Adtran
 
Videogame localization & technology_ how to enhance the power of translation.pdf
Videogame localization & technology_ how to enhance the power of translation.pdfVideogame localization & technology_ how to enhance the power of translation.pdf
Videogame localization & technology_ how to enhance the power of translation.pdfinfogdgmi
 
Empowering Africa's Next Generation: The AI Leadership Blueprint
Empowering Africa's Next Generation: The AI Leadership BlueprintEmpowering Africa's Next Generation: The AI Leadership Blueprint
Empowering Africa's Next Generation: The AI Leadership BlueprintMahmoud Rabie
 
KubeConEU24-Monitoring Kubernetes and Cloud Spend with OpenCost
KubeConEU24-Monitoring Kubernetes and Cloud Spend with OpenCostKubeConEU24-Monitoring Kubernetes and Cloud Spend with OpenCost
KubeConEU24-Monitoring Kubernetes and Cloud Spend with OpenCostMatt Ray
 
Crea il tuo assistente AI con lo Stregatto (open source python framework)
Crea il tuo assistente AI con lo Stregatto (open source python framework)Crea il tuo assistente AI con lo Stregatto (open source python framework)
Crea il tuo assistente AI con lo Stregatto (open source python framework)Commit University
 
How Accurate are Carbon Emissions Projections?
How Accurate are Carbon Emissions Projections?How Accurate are Carbon Emissions Projections?
How Accurate are Carbon Emissions Projections?IES VE
 
The Data Metaverse: Unpacking the Roles, Use Cases, and Tech Trends in Data a...
The Data Metaverse: Unpacking the Roles, Use Cases, and Tech Trends in Data a...The Data Metaverse: Unpacking the Roles, Use Cases, and Tech Trends in Data a...
The Data Metaverse: Unpacking the Roles, Use Cases, and Tech Trends in Data a...Aggregage
 
UWB Technology for Enhanced Indoor and Outdoor Positioning in Physiological M...
UWB Technology for Enhanced Indoor and Outdoor Positioning in Physiological M...UWB Technology for Enhanced Indoor and Outdoor Positioning in Physiological M...
UWB Technology for Enhanced Indoor and Outdoor Positioning in Physiological M...UbiTrack UK
 
ADOPTING WEB 3 FOR YOUR BUSINESS: A STEP-BY-STEP GUIDE
ADOPTING WEB 3 FOR YOUR BUSINESS: A STEP-BY-STEP GUIDEADOPTING WEB 3 FOR YOUR BUSINESS: A STEP-BY-STEP GUIDE
ADOPTING WEB 3 FOR YOUR BUSINESS: A STEP-BY-STEP GUIDELiveplex
 
Computer 10: Lesson 10 - Online Crimes and Hazards
Computer 10: Lesson 10 - Online Crimes and HazardsComputer 10: Lesson 10 - Online Crimes and Hazards
Computer 10: Lesson 10 - Online Crimes and HazardsSeth Reyes
 
Artificial Intelligence & SEO Trends for 2024
Artificial Intelligence & SEO Trends for 2024Artificial Intelligence & SEO Trends for 2024
Artificial Intelligence & SEO Trends for 2024D Cloud Solutions
 
Building AI-Driven Apps Using Semantic Kernel.pptx
Building AI-Driven Apps Using Semantic Kernel.pptxBuilding AI-Driven Apps Using Semantic Kernel.pptx
Building AI-Driven Apps Using Semantic Kernel.pptxUdaiappa Ramachandran
 
activity_diagram_combine_v4_20190827.pdfactivity_diagram_combine_v4_20190827.pdf
activity_diagram_combine_v4_20190827.pdfactivity_diagram_combine_v4_20190827.pdfactivity_diagram_combine_v4_20190827.pdfactivity_diagram_combine_v4_20190827.pdf
activity_diagram_combine_v4_20190827.pdfactivity_diagram_combine_v4_20190827.pdfJamie (Taka) Wang
 
Anypoint Code Builder , Google Pub sub connector and MuleSoft RPA
Anypoint Code Builder , Google Pub sub connector and MuleSoft RPAAnypoint Code Builder , Google Pub sub connector and MuleSoft RPA
Anypoint Code Builder , Google Pub sub connector and MuleSoft RPAshyamraj55
 
UiPath Community: AI for UiPath Automation Developers
UiPath Community: AI for UiPath Automation DevelopersUiPath Community: AI for UiPath Automation Developers
UiPath Community: AI for UiPath Automation DevelopersUiPathCommunity
 
20230202 - Introduction to tis-py
20230202 - Introduction to tis-py20230202 - Introduction to tis-py
20230202 - Introduction to tis-pyJamie (Taka) Wang
 
Salesforce Miami User Group Event - 1st Quarter 2024
Salesforce Miami User Group Event - 1st Quarter 2024Salesforce Miami User Group Event - 1st Quarter 2024
Salesforce Miami User Group Event - 1st Quarter 2024SkyPlanner
 
UiPath Studio Web workshop series - Day 7
UiPath Studio Web workshop series - Day 7UiPath Studio Web workshop series - Day 7
UiPath Studio Web workshop series - Day 7DianaGray10
 
Nanopower In Semiconductor Industry.pdf
Nanopower  In Semiconductor Industry.pdfNanopower  In Semiconductor Industry.pdf
Nanopower In Semiconductor Industry.pdfPedro Manuel
 

Kürzlich hochgeladen (20)

Meet the new FSP 3000 M-Flex800™
Meet the new FSP 3000 M-Flex800™Meet the new FSP 3000 M-Flex800™
Meet the new FSP 3000 M-Flex800™
 
Videogame localization & technology_ how to enhance the power of translation.pdf
Videogame localization & technology_ how to enhance the power of translation.pdfVideogame localization & technology_ how to enhance the power of translation.pdf
Videogame localization & technology_ how to enhance the power of translation.pdf
 
Empowering Africa's Next Generation: The AI Leadership Blueprint
Empowering Africa's Next Generation: The AI Leadership BlueprintEmpowering Africa's Next Generation: The AI Leadership Blueprint
Empowering Africa's Next Generation: The AI Leadership Blueprint
 
KubeConEU24-Monitoring Kubernetes and Cloud Spend with OpenCost
KubeConEU24-Monitoring Kubernetes and Cloud Spend with OpenCostKubeConEU24-Monitoring Kubernetes and Cloud Spend with OpenCost
KubeConEU24-Monitoring Kubernetes and Cloud Spend with OpenCost
 
Crea il tuo assistente AI con lo Stregatto (open source python framework)
Crea il tuo assistente AI con lo Stregatto (open source python framework)Crea il tuo assistente AI con lo Stregatto (open source python framework)
Crea il tuo assistente AI con lo Stregatto (open source python framework)
 
How Accurate are Carbon Emissions Projections?
How Accurate are Carbon Emissions Projections?How Accurate are Carbon Emissions Projections?
How Accurate are Carbon Emissions Projections?
 
The Data Metaverse: Unpacking the Roles, Use Cases, and Tech Trends in Data a...
The Data Metaverse: Unpacking the Roles, Use Cases, and Tech Trends in Data a...The Data Metaverse: Unpacking the Roles, Use Cases, and Tech Trends in Data a...
The Data Metaverse: Unpacking the Roles, Use Cases, and Tech Trends in Data a...
 
UWB Technology for Enhanced Indoor and Outdoor Positioning in Physiological M...
UWB Technology for Enhanced Indoor and Outdoor Positioning in Physiological M...UWB Technology for Enhanced Indoor and Outdoor Positioning in Physiological M...
UWB Technology for Enhanced Indoor and Outdoor Positioning in Physiological M...
 
ADOPTING WEB 3 FOR YOUR BUSINESS: A STEP-BY-STEP GUIDE
ADOPTING WEB 3 FOR YOUR BUSINESS: A STEP-BY-STEP GUIDEADOPTING WEB 3 FOR YOUR BUSINESS: A STEP-BY-STEP GUIDE
ADOPTING WEB 3 FOR YOUR BUSINESS: A STEP-BY-STEP GUIDE
 
Computer 10: Lesson 10 - Online Crimes and Hazards
Computer 10: Lesson 10 - Online Crimes and HazardsComputer 10: Lesson 10 - Online Crimes and Hazards
Computer 10: Lesson 10 - Online Crimes and Hazards
 
Artificial Intelligence & SEO Trends for 2024
Artificial Intelligence & SEO Trends for 2024Artificial Intelligence & SEO Trends for 2024
Artificial Intelligence & SEO Trends for 2024
 
20230104 - machine vision
20230104 - machine vision20230104 - machine vision
20230104 - machine vision
 
Building AI-Driven Apps Using Semantic Kernel.pptx
Building AI-Driven Apps Using Semantic Kernel.pptxBuilding AI-Driven Apps Using Semantic Kernel.pptx
Building AI-Driven Apps Using Semantic Kernel.pptx
 
activity_diagram_combine_v4_20190827.pdfactivity_diagram_combine_v4_20190827.pdf
activity_diagram_combine_v4_20190827.pdfactivity_diagram_combine_v4_20190827.pdfactivity_diagram_combine_v4_20190827.pdfactivity_diagram_combine_v4_20190827.pdf
activity_diagram_combine_v4_20190827.pdfactivity_diagram_combine_v4_20190827.pdf
 
Anypoint Code Builder , Google Pub sub connector and MuleSoft RPA
Anypoint Code Builder , Google Pub sub connector and MuleSoft RPAAnypoint Code Builder , Google Pub sub connector and MuleSoft RPA
Anypoint Code Builder , Google Pub sub connector and MuleSoft RPA
 
UiPath Community: AI for UiPath Automation Developers
UiPath Community: AI for UiPath Automation DevelopersUiPath Community: AI for UiPath Automation Developers
UiPath Community: AI for UiPath Automation Developers
 
20230202 - Introduction to tis-py
20230202 - Introduction to tis-py20230202 - Introduction to tis-py
20230202 - Introduction to tis-py
 
Salesforce Miami User Group Event - 1st Quarter 2024
Salesforce Miami User Group Event - 1st Quarter 2024Salesforce Miami User Group Event - 1st Quarter 2024
Salesforce Miami User Group Event - 1st Quarter 2024
 
UiPath Studio Web workshop series - Day 7
UiPath Studio Web workshop series - Day 7UiPath Studio Web workshop series - Day 7
UiPath Studio Web workshop series - Day 7
 
Nanopower In Semiconductor Industry.pdf
Nanopower  In Semiconductor Industry.pdfNanopower  In Semiconductor Industry.pdf
Nanopower In Semiconductor Industry.pdf
 

mobl: Een DSL voor mobiele applicatieontwikkeling