SlideShare a Scribd company logo
10 Years later
“develop in Pharo, deploy in Gemstone” with Seaside
Johan Brichau - johan@yesplan.be
Yesplan ?
Web Application (SaaS) to manage an event venue
Yesplan ?
Web Application (SaaS) to manage an event venue
Yesplan ?
Web Application (SaaS) to manage an event venue
Yesplan ?
Web Application (SaaS) to manage an event venue
- jQuery
- jQuery-UI
- KnockoutJs
- D3.js
- Datatables
- Jasper reports
- ….
Yesplan ?
Web Application (SaaS) to manage an event venue
- jQuery
- jQuery-UI
- KnockoutJs
- D3.js
- Datatables
- Jasper reports
- ….
ReactJs
Yesplan ?
• Founded by aa. and arts centre
• Over 200 customers (in BE, NL, Lux, CH, UK, NO, DK, FI)
• Currently 25 employees:
• 5 software engineers, 1 dev ops engineer, 1 interaction designer and 1
report engineer
• sales, account management, marketing, support,
• Emphasis on making an application that not only works, but also is
enjoyable to use
Yesplan 0.1 (2009)
• Yesplan calendar built using Seaside’s “full page rendering”
• Standard ‘component calls component’ implementation
• A lot of jQuery for animations and ajax updates
• Javascript universe was “big mess” 

(excluding notable exceptions)
• More errors than functionality in most ‘plugins’
• Bad performance and horrible engineering
• Pharo + GoodsDB in production
title
group
in-place editing info bubbles
group visualization
Yesplan 1.0 (2010)
• Yesplan calendar with incremental ajax updates
• A lot of jQuery-based scripts
• SVG animations using generated Javascript
• Develop in Pharo, deploy in GemStone
• Pharo for development
• GemStone for deployment
• Unit tests + Seaside Component Tests
Yesplan 1.0 (2010)
• Yesplan calendar with incremental ajax updates
• A lot of jQuery-based scripts
• SVG animations using generated Javascript
• Develop in Pharo, deploy in GemStone
• Pharo for development
• GemStone for deployment
• Unit tests + Seaside Component Tests
seconds
0
1,5
3
4,5
6
1 commit after one change in 100 000 loaded objects
Magma Goods
Goods w/ manual barrier Gemstone
0,68s
Yesplan 1.x (2010-2013)
• Seaside with a lot of Javascript generation
• Separate Javascript source code files
• jQuery event delegation
• Parasol
• Selenium (Webdriver) testing
• Targeted at Seaside apps but not limited to
html span
class: 'name';
passenger: self;
with: self visibleresourceUse event name.
html jQuery this
on: 'click' 

selector: '.name'
do: ((JSStream on: 'editEventName(event.target)') asFunction: #(event))
html document addLoadScript:
((((html jQuery expression: (JSStream on: 'target')) editable
type: 'text';
callback: [ :val | nameValue value: val ];
secondCallback: (html jQuery ajax
callback:[:theCells | theCell value changeEventName: nameValue value]]
passengers: ((html jQuery expression: (JSStream on: 'target')));
script: [:s | s<< (theCell value afterNameUpdateScriptOn: s)]);
yourself) asFunction: #(target)) assignTo: 'editEventName').
Yesplan 1.x (2010-2013)
Yesplan 1.x (2010-2013)
Yesplan 1.x (2010-2013)
Yesplan 1.x (2010-2013)
Yesplan 1.x (2010-2013)
Yesplan (2014-2015)
• Experiment with Hybrid Web Application
• Server-side session: Seaside
• Client-side UI: d3js, KnockoutJs,
BackboneJs,…
Yesplan (2014-2015)
• Experiment with Hybrid Web Application
• Server-side session: Seaside
• Client-side UI: d3js, KnockoutJs,
BackboneJs,…
Yesplan (2014-2015)
• Experiment with Hybrid Web Application
• Server-side session: Seaside
• Client-side UI: d3js, KnockoutJs,
BackboneJs,…
Yesplan (today)
• Full Hybrid Web Application
• Server-side session mgmt: Seaside
• Existing UI: server-side Seaside
• New UI: client-side ReactJs
• Operations
• SmalltalkCI (Travis-CI), parallel running test packages
• Sentry central error logging (Js + Smalltalk)
• Numbers
• +200 Gemstone databases
• +2000 simultaneous sessions
Client
Server
Data objects
Operations
Web components
generated
Client
Server
Data objects
Operations
Web components
generated
REST API Reporting engine
Mobile Portal
rich client application
<html>
…
<body>
….
<script>
…
</script>
</body>
</html>
Seaside-based ReactJs
<html>
…
<body>
….
<script>
…
</script>
</body>
</html>
Seaside-based ReactJs
Develop in Pharo, deploy in Gemstone
• Key Tools
• Grease
• Metacello
• https://github.com/GsDevKit/
• Pros
• Seaside in GsDevKit
• “Transparent” persistency
• Licensing model
• Gemstone performance, Pharo coolness
• NO ORM
• Live debugging of production environment
• Cons
• Dialect differences only become larger
• Pharo-specific classes
• “Transparent” persistency
Legend
defaultscheduledescription : string
defaultschedulestarttime : datetime
defaultscheduleendtime : datetime (or null)
attributes : attributedictionary
Event
Group
vipcode : string (or null)
firstname : string
lastname : string
addresslines : string (or null)
zipcode : string (or null)
country : string (or null)
city : string (or null)
Person
vat : string (or null)
type : string (or null)
Organization jobtitle : string
department: string (or null)
Link
duration : duration
Task Task Group
name : string
statustypes : string[0…n]
backgroundcolor : color
textcolor : color
Status
name : string
color : color
Profile
Attachment List
defaultstartidx : integer
defaultstopidx : integer
Event Schedule
number : integer
role : string (or null)
Abstract Resourcebooking
Event History List
type : string
value : string
Contactinfo
description : string
starttime : datetime
Schedule entry
Custom data group
time : datetime
user : string
description : string
History entry
locations[0…n]
profile
status
links[0…n]
links[0…n]
contactinfo[0…n]
profiles[0…n]
entries[0…n]
schedule
originalname : string
type : string
comment : string
date : date
user : string
url : string
Attachment
attachments[0…n]
Event Resource Booking List
resourcebookings
[0…n]
Event Task List tasks[0…n]
_type : string
comment : string (or null)
address : string (or null)
labels : string[0…n]
name : string
attributes : attributedictionary
Contact
status : string
name : string
team : string
cost : decimal
due : datetime
start : datetime
assignedby : string
assignedto : string
description : string
Abstract Task
tasks[0…n]
name : string
starttime : datetime
endtime : datetime
isproduction : boolean
Abstract Event
tasks
attachments
name : string
keyword : string
Custom data item
type : string
value : string|integer|decimal|date|time|datetime|
resourcebooking | contactbooking (or null)
Custom data element
children[0…n]
customdata
resource
customdata
groups[0…n]
organization
person
Event Contact Booking List
role : string
Event Contact Booking
contactsbookings[0…n]
contactbookings
contact
Custom data List
customdata
customdata
customdata
actualnumber: integer [opt.]
Resourcesetbooking
children[0…n]
Yesplan API v1.0.1 - 12 April 2013
production (or null)
group (or null)
recurrence
startdate : date
rule : (recurrence rule)
Recurrence
children[0…n]
history
Event custom data Listevent
event
entries[0…n]
event
Contactbooking custom data List
Contact custom data Listcontact
contactbooking
event
costings[1..n]
alteration : string (or null)
cost: decimal (or null)
price : decimal (or null)
netprice : decimal (or null)
vat: decimal (or null)
actualprice : decimal (or null)
Event Costings
costing
group: string
alteration : string (or null)
cost : decimal (or null)
price : decimal (or null)
vat: decimal (or null)
actualprice : decimal (or null)
Resourcegroup costing
event
costings[1…n]
alteration : string (or null)
cost : decimal (or null)
price : decimal (or null)
actualprice : decimal (or null)
invoice : boolean
accountableto: string
Resourcebooking costing
resourcecostings[1…n] costmodel
event
Resource SetLocation
notation : string
type : string
rates : integer[2][1…n]
Discount
name : string
account : string (or null)
purchaseprice : decimal
invoice : boolean
cost : string (cost formula) (1 or array)
price : string (cost formula) (1 or array)
vat : decimal
Cost model
costmodels[0…n]
durationdiscount
amount : integer
Resource
resources[0…n]
volumediscount
resourcetype : string
name : string
group : string
roles : string[0…n]
description : string
external : boolean
rented : boolean
Abstract Resource
Placeholder
Resource custom data List
resource
ResourceSetbooking costing
children[1…n]
repeatedevents [1…n]
Resourcebooking custom data List
resourcebooking
Resourcebooking
actualnumber: integer [opt.]
actualstart: datetime [opt.]
actualend: datetime [opt.]
Resourcebookinggroup
children[0…n]
start : datetime
end : datetime
actualstart: datetime
actualend: datetime
Singleton Resourcebooking
start : datetime
end : datetime
actualstart: datetime [opt.]
actualend: datetime [opt.]
actualnumber: integer [opt.]
Standard Resourcebooking
repeatedevent
reference link (retrieve needs separate call/request)
nesting link (entity directly included)
subtype
schedule
Group Schedule schedules[1…n] ???
Abstract Schedule Summary
Group Schedule Summary Event Schedule Summary
group
group
entries[0…n]
Develop in Pharo: GT !
Develop in Pharo: GT !
Thank you!
Johan Brichau
johan@inceptive.be
johan@yesplan.be

More Related Content

What's hot

(CMP310) Data Processing Pipelines Using Containers & Spot Instances
(CMP310) Data Processing Pipelines Using Containers & Spot Instances(CMP310) Data Processing Pipelines Using Containers & Spot Instances
(CMP310) Data Processing Pipelines Using Containers & Spot Instances
Amazon Web Services
 
Python in the serverless era (PyCon 2017)
Python in the serverless era (PyCon 2017)Python in the serverless era (PyCon 2017)
Python in the serverless era (PyCon 2017)
Benny Bauer
 
Python in the Serverless Era (PyCon IL 2016)
Python in the Serverless Era (PyCon IL 2016)Python in the Serverless Era (PyCon IL 2016)
Python in the Serverless Era (PyCon IL 2016)
Benny Bauer
 
KVO implementation
KVO implementationKVO implementation
KVO implementation
Jintin Lin
 
Scaling Rails Sites by default
Scaling Rails Sites by defaultScaling Rails Sites by default
Scaling Rails Sites by defaultYi-Ting Cheng
 
Building Docker Containers @ Scale
Building Docker Containers @ ScaleBuilding Docker Containers @ Scale
Building Docker Containers @ Scale
lxfontes
 
Sheep it
Sheep itSheep it
Sheep it
lxfontes
 
Put a Button on It: Removing Barriers to Going Fast
Put a Button on It: Removing Barriers to Going FastPut a Button on It: Removing Barriers to Going Fast
Put a Button on It: Removing Barriers to Going FastOSCON Byrum
 
KazooCon 2014 - Kazoo Scalability
KazooCon 2014 - Kazoo ScalabilityKazooCon 2014 - Kazoo Scalability
KazooCon 2014 - Kazoo Scalability2600Hz
 
Running Airflow Workflows as ETL Processes on Hadoop
Running Airflow Workflows as ETL Processes on HadoopRunning Airflow Workflows as ETL Processes on Hadoop
Running Airflow Workflows as ETL Processes on Hadoop
clairvoyantllc
 
Pharo VM Performance
Pharo VM PerformancePharo VM Performance
Pharo VM Performance
Pharo
 
Docker and Pharo @ZWEIDENKER
Docker and Pharo @ZWEIDENKERDocker and Pharo @ZWEIDENKER
Docker and Pharo @ZWEIDENKER
ZWEIDENKER GmbH
 
API Design in the Modern Era - Architecture Next 2020
API Design in the Modern Era - Architecture Next 2020API Design in the Modern Era - Architecture Next 2020
API Design in the Modern Era - Architecture Next 2020
Eran Stiller
 
What you see is what you get for AWS infrastructure
What you see is what you get for AWS infrastructureWhat you see is what you get for AWS infrastructure
What you see is what you get for AWS infrastructure
Anton Babenko
 
Journée DevOps : Un outil de monitoring applicatif
Journée DevOps : Un outil de monitoring applicatifJournée DevOps : Un outil de monitoring applicatif
Journée DevOps : Un outil de monitoring applicatif
Publicis Sapient Engineering
 
Build a RESTful API with the Serverless Framework
Build a RESTful API with the Serverless FrameworkBuild a RESTful API with the Serverless Framework
Build a RESTful API with the Serverless Framework
masahitojp
 
JCConf 2015 - Google Dataflow 在雲端大資料處理的應用
JCConf 2015 - Google Dataflow 在雲端大資料處理的應用JCConf 2015 - Google Dataflow 在雲端大資料處理的應用
JCConf 2015 - Google Dataflow 在雲端大資料處理的應用
Simon Su
 
Ruby performance - The low hanging fruit
Ruby performance - The low hanging fruitRuby performance - The low hanging fruit
Ruby performance - The low hanging fruit
Bruce Werdschinski
 
PyConIT 2018 Writing and deploying serverless python applications
PyConIT 2018 Writing and deploying serverless python applicationsPyConIT 2018 Writing and deploying serverless python applications
PyConIT 2018 Writing and deploying serverless python applications
Cesar Cardenas Desales
 
RoR vs-nodejs-by-jcskyting
RoR vs-nodejs-by-jcskytingRoR vs-nodejs-by-jcskyting
RoR vs-nodejs-by-jcskyting
信凱 王
 

What's hot (20)

(CMP310) Data Processing Pipelines Using Containers & Spot Instances
(CMP310) Data Processing Pipelines Using Containers & Spot Instances(CMP310) Data Processing Pipelines Using Containers & Spot Instances
(CMP310) Data Processing Pipelines Using Containers & Spot Instances
 
Python in the serverless era (PyCon 2017)
Python in the serverless era (PyCon 2017)Python in the serverless era (PyCon 2017)
Python in the serverless era (PyCon 2017)
 
Python in the Serverless Era (PyCon IL 2016)
Python in the Serverless Era (PyCon IL 2016)Python in the Serverless Era (PyCon IL 2016)
Python in the Serverless Era (PyCon IL 2016)
 
KVO implementation
KVO implementationKVO implementation
KVO implementation
 
Scaling Rails Sites by default
Scaling Rails Sites by defaultScaling Rails Sites by default
Scaling Rails Sites by default
 
Building Docker Containers @ Scale
Building Docker Containers @ ScaleBuilding Docker Containers @ Scale
Building Docker Containers @ Scale
 
Sheep it
Sheep itSheep it
Sheep it
 
Put a Button on It: Removing Barriers to Going Fast
Put a Button on It: Removing Barriers to Going FastPut a Button on It: Removing Barriers to Going Fast
Put a Button on It: Removing Barriers to Going Fast
 
KazooCon 2014 - Kazoo Scalability
KazooCon 2014 - Kazoo ScalabilityKazooCon 2014 - Kazoo Scalability
KazooCon 2014 - Kazoo Scalability
 
Running Airflow Workflows as ETL Processes on Hadoop
Running Airflow Workflows as ETL Processes on HadoopRunning Airflow Workflows as ETL Processes on Hadoop
Running Airflow Workflows as ETL Processes on Hadoop
 
Pharo VM Performance
Pharo VM PerformancePharo VM Performance
Pharo VM Performance
 
Docker and Pharo @ZWEIDENKER
Docker and Pharo @ZWEIDENKERDocker and Pharo @ZWEIDENKER
Docker and Pharo @ZWEIDENKER
 
API Design in the Modern Era - Architecture Next 2020
API Design in the Modern Era - Architecture Next 2020API Design in the Modern Era - Architecture Next 2020
API Design in the Modern Era - Architecture Next 2020
 
What you see is what you get for AWS infrastructure
What you see is what you get for AWS infrastructureWhat you see is what you get for AWS infrastructure
What you see is what you get for AWS infrastructure
 
Journée DevOps : Un outil de monitoring applicatif
Journée DevOps : Un outil de monitoring applicatifJournée DevOps : Un outil de monitoring applicatif
Journée DevOps : Un outil de monitoring applicatif
 
Build a RESTful API with the Serverless Framework
Build a RESTful API with the Serverless FrameworkBuild a RESTful API with the Serverless Framework
Build a RESTful API with the Serverless Framework
 
JCConf 2015 - Google Dataflow 在雲端大資料處理的應用
JCConf 2015 - Google Dataflow 在雲端大資料處理的應用JCConf 2015 - Google Dataflow 在雲端大資料處理的應用
JCConf 2015 - Google Dataflow 在雲端大資料處理的應用
 
Ruby performance - The low hanging fruit
Ruby performance - The low hanging fruitRuby performance - The low hanging fruit
Ruby performance - The low hanging fruit
 
PyConIT 2018 Writing and deploying serverless python applications
PyConIT 2018 Writing and deploying serverless python applicationsPyConIT 2018 Writing and deploying serverless python applications
PyConIT 2018 Writing and deploying serverless python applications
 
RoR vs-nodejs-by-jcskyting
RoR vs-nodejs-by-jcskytingRoR vs-nodejs-by-jcskyting
RoR vs-nodejs-by-jcskyting
 

Similar to Yesplan: 10 Years later

Firefox OS: HTML5 sur les stéroïdes - HTML5mtl - 2014-04-22
Firefox OS: HTML5 sur les stéroïdes - HTML5mtl - 2014-04-22Firefox OS: HTML5 sur les stéroïdes - HTML5mtl - 2014-04-22
Firefox OS: HTML5 sur les stéroïdes - HTML5mtl - 2014-04-22Frédéric Harper
 
HTML, not just for desktops: Firefox OS - Congreso Universitario Móvil - 201...
HTML, not just for desktops: Firefox OS - Congreso Universitario Móvil - 201...HTML, not just for desktops: Firefox OS - Congreso Universitario Móvil - 201...
HTML, not just for desktops: Firefox OS - Congreso Universitario Móvil - 201...
Frédéric Harper
 
"Progressive Web Apps" by Riza Fahmi (Hacktiv8)
"Progressive Web Apps" by Riza Fahmi	(Hacktiv8)"Progressive Web Apps" by Riza Fahmi	(Hacktiv8)
"Progressive Web Apps" by Riza Fahmi (Hacktiv8)
Tech in Asia ID
 
Progressive Web Apps. What, why and how
Progressive Web Apps. What, why and howProgressive Web Apps. What, why and how
Progressive Web Apps. What, why and how
Riza Fahmi
 
混搭移动开发:PhoneGap+JQurey+Dreamweaver
混搭移动开发:PhoneGap+JQurey+Dreamweaver混搭移动开发:PhoneGap+JQurey+Dreamweaver
混搭移动开发:PhoneGap+JQurey+Dreamweaveryangdj
 
After max+phonegap
After max+phonegapAfter max+phonegap
After max+phonegapyangdj
 
HTML5 JS APIs
HTML5 JS APIsHTML5 JS APIs
HTML5 JS APIs
Remy Sharp
 
Firefox OS, HTML5 to the next level - Python Montreal - 2014-05-12
Firefox OS, HTML5 to the next level - Python Montreal - 2014-05-12Firefox OS, HTML5 to the next level - Python Montreal - 2014-05-12
Firefox OS, HTML5 to the next level - Python Montreal - 2014-05-12
Frédéric Harper
 
HTML for the Mobile Web, Firefox OS - All Things Open - 2014-10-22
HTML for the Mobile Web, Firefox OS - All Things Open - 2014-10-22HTML for the Mobile Web, Firefox OS - All Things Open - 2014-10-22
HTML for the Mobile Web, Firefox OS - All Things Open - 2014-10-22
Frédéric Harper
 
SenchaCon 2016: A Look Ahead: Survey Next-Gen Modern Browser APIs - Shikhir S...
SenchaCon 2016: A Look Ahead: Survey Next-Gen Modern Browser APIs - Shikhir S...SenchaCon 2016: A Look Ahead: Survey Next-Gen Modern Browser APIs - Shikhir S...
SenchaCon 2016: A Look Ahead: Survey Next-Gen Modern Browser APIs - Shikhir S...
Sencha
 
I Know It Was MEAN, But I Cut the Cord to LAMP Anyway
I Know It Was MEAN, But I Cut the Cord to LAMP AnywayI Know It Was MEAN, But I Cut the Cord to LAMP Anyway
I Know It Was MEAN, But I Cut the Cord to LAMP Anyway
POSSCON
 
Firefox OS, fixing the mobile web - FITC Toronto - 2014-04-28
Firefox OS, fixing the mobile web - FITC Toronto - 2014-04-28Firefox OS, fixing the mobile web - FITC Toronto - 2014-04-28
Firefox OS, fixing the mobile web - FITC Toronto - 2014-04-28
Frédéric Harper
 
I Know It Was MEAN, But I Cut the Cord to LAMP Anyway
I Know It Was MEAN, But I Cut the Cord to LAMP AnywayI Know It Was MEAN, But I Cut the Cord to LAMP Anyway
I Know It Was MEAN, But I Cut the Cord to LAMP Anyway
All Things Open
 
HTML pour le web mobile, Firefox OS - Devfest Nantes - 2014-11-07
HTML pour le web mobile, Firefox OS - Devfest Nantes - 2014-11-07HTML pour le web mobile, Firefox OS - Devfest Nantes - 2014-11-07
HTML pour le web mobile, Firefox OS - Devfest Nantes - 2014-11-07Frédéric Harper
 
[JCConf 2020] 用 Kotlin 跨入 Serverless 世代
[JCConf 2020] 用 Kotlin 跨入 Serverless 世代[JCConf 2020] 用 Kotlin 跨入 Serverless 世代
[JCConf 2020] 用 Kotlin 跨入 Serverless 世代
Shengyou Fan
 
Firefox OS, une plateforme à découvrir - IO Saglac - 2014-09-09
Firefox OS, une plateforme à découvrir - IO Saglac - 2014-09-09Firefox OS, une plateforme à découvrir - IO Saglac - 2014-09-09
Firefox OS, une plateforme à découvrir - IO Saglac - 2014-09-09
Frédéric Harper
 
Event-driven IO server-side JavaScript environment based on V8 Engine
Event-driven IO server-side JavaScript environment based on V8 EngineEvent-driven IO server-side JavaScript environment based on V8 Engine
Event-driven IO server-side JavaScript environment based on V8 Engine
Ricardo Silva
 
ADF and JavaScript - AMIS SIG, July 2017
ADF and JavaScript - AMIS SIG, July 2017ADF and JavaScript - AMIS SIG, July 2017
ADF and JavaScript - AMIS SIG, July 2017
Lucas Jellema
 
Practical tipsmakemobilefaster oscon2016
Practical tipsmakemobilefaster oscon2016Practical tipsmakemobilefaster oscon2016
Practical tipsmakemobilefaster oscon2016
Doris Chen
 
How to make Ajax Libraries work for you
How to make Ajax Libraries work for youHow to make Ajax Libraries work for you
How to make Ajax Libraries work for you
Simon Willison
 

Similar to Yesplan: 10 Years later (20)

Firefox OS: HTML5 sur les stéroïdes - HTML5mtl - 2014-04-22
Firefox OS: HTML5 sur les stéroïdes - HTML5mtl - 2014-04-22Firefox OS: HTML5 sur les stéroïdes - HTML5mtl - 2014-04-22
Firefox OS: HTML5 sur les stéroïdes - HTML5mtl - 2014-04-22
 
HTML, not just for desktops: Firefox OS - Congreso Universitario Móvil - 201...
HTML, not just for desktops: Firefox OS - Congreso Universitario Móvil - 201...HTML, not just for desktops: Firefox OS - Congreso Universitario Móvil - 201...
HTML, not just for desktops: Firefox OS - Congreso Universitario Móvil - 201...
 
"Progressive Web Apps" by Riza Fahmi (Hacktiv8)
"Progressive Web Apps" by Riza Fahmi	(Hacktiv8)"Progressive Web Apps" by Riza Fahmi	(Hacktiv8)
"Progressive Web Apps" by Riza Fahmi (Hacktiv8)
 
Progressive Web Apps. What, why and how
Progressive Web Apps. What, why and howProgressive Web Apps. What, why and how
Progressive Web Apps. What, why and how
 
混搭移动开发:PhoneGap+JQurey+Dreamweaver
混搭移动开发:PhoneGap+JQurey+Dreamweaver混搭移动开发:PhoneGap+JQurey+Dreamweaver
混搭移动开发:PhoneGap+JQurey+Dreamweaver
 
After max+phonegap
After max+phonegapAfter max+phonegap
After max+phonegap
 
HTML5 JS APIs
HTML5 JS APIsHTML5 JS APIs
HTML5 JS APIs
 
Firefox OS, HTML5 to the next level - Python Montreal - 2014-05-12
Firefox OS, HTML5 to the next level - Python Montreal - 2014-05-12Firefox OS, HTML5 to the next level - Python Montreal - 2014-05-12
Firefox OS, HTML5 to the next level - Python Montreal - 2014-05-12
 
HTML for the Mobile Web, Firefox OS - All Things Open - 2014-10-22
HTML for the Mobile Web, Firefox OS - All Things Open - 2014-10-22HTML for the Mobile Web, Firefox OS - All Things Open - 2014-10-22
HTML for the Mobile Web, Firefox OS - All Things Open - 2014-10-22
 
SenchaCon 2016: A Look Ahead: Survey Next-Gen Modern Browser APIs - Shikhir S...
SenchaCon 2016: A Look Ahead: Survey Next-Gen Modern Browser APIs - Shikhir S...SenchaCon 2016: A Look Ahead: Survey Next-Gen Modern Browser APIs - Shikhir S...
SenchaCon 2016: A Look Ahead: Survey Next-Gen Modern Browser APIs - Shikhir S...
 
I Know It Was MEAN, But I Cut the Cord to LAMP Anyway
I Know It Was MEAN, But I Cut the Cord to LAMP AnywayI Know It Was MEAN, But I Cut the Cord to LAMP Anyway
I Know It Was MEAN, But I Cut the Cord to LAMP Anyway
 
Firefox OS, fixing the mobile web - FITC Toronto - 2014-04-28
Firefox OS, fixing the mobile web - FITC Toronto - 2014-04-28Firefox OS, fixing the mobile web - FITC Toronto - 2014-04-28
Firefox OS, fixing the mobile web - FITC Toronto - 2014-04-28
 
I Know It Was MEAN, But I Cut the Cord to LAMP Anyway
I Know It Was MEAN, But I Cut the Cord to LAMP AnywayI Know It Was MEAN, But I Cut the Cord to LAMP Anyway
I Know It Was MEAN, But I Cut the Cord to LAMP Anyway
 
HTML pour le web mobile, Firefox OS - Devfest Nantes - 2014-11-07
HTML pour le web mobile, Firefox OS - Devfest Nantes - 2014-11-07HTML pour le web mobile, Firefox OS - Devfest Nantes - 2014-11-07
HTML pour le web mobile, Firefox OS - Devfest Nantes - 2014-11-07
 
[JCConf 2020] 用 Kotlin 跨入 Serverless 世代
[JCConf 2020] 用 Kotlin 跨入 Serverless 世代[JCConf 2020] 用 Kotlin 跨入 Serverless 世代
[JCConf 2020] 用 Kotlin 跨入 Serverless 世代
 
Firefox OS, une plateforme à découvrir - IO Saglac - 2014-09-09
Firefox OS, une plateforme à découvrir - IO Saglac - 2014-09-09Firefox OS, une plateforme à découvrir - IO Saglac - 2014-09-09
Firefox OS, une plateforme à découvrir - IO Saglac - 2014-09-09
 
Event-driven IO server-side JavaScript environment based on V8 Engine
Event-driven IO server-side JavaScript environment based on V8 EngineEvent-driven IO server-side JavaScript environment based on V8 Engine
Event-driven IO server-side JavaScript environment based on V8 Engine
 
ADF and JavaScript - AMIS SIG, July 2017
ADF and JavaScript - AMIS SIG, July 2017ADF and JavaScript - AMIS SIG, July 2017
ADF and JavaScript - AMIS SIG, July 2017
 
Practical tipsmakemobilefaster oscon2016
Practical tipsmakemobilefaster oscon2016Practical tipsmakemobilefaster oscon2016
Practical tipsmakemobilefaster oscon2016
 
How to make Ajax Libraries work for you
How to make Ajax Libraries work for youHow to make Ajax Libraries work for you
How to make Ajax Libraries work for you
 

More from Pharo

Object-Centric Debugging: a preview
Object-Centric Debugging: a previewObject-Centric Debugging: a preview
Object-Centric Debugging: a preview
Pharo
 
The future of testing in Pharo
The future of testing in PharoThe future of testing in Pharo
The future of testing in Pharo
Pharo
 
Spec 2.0: The next step on desktop UI
Spec 2.0: The next step on desktop UI Spec 2.0: The next step on desktop UI
Spec 2.0: The next step on desktop UI
Pharo
 
UI Testing with Spec
 UI Testing with Spec UI Testing with Spec
UI Testing with Spec
Pharo
 
Pharo 7.0 and 8.0 alpha
Pharo 7.0 and 8.0 alphaPharo 7.0 and 8.0 alpha
Pharo 7.0 and 8.0 alpha
Pharo
 
PHARO IoT: Installation Improvements and Continuous Integration
PHARO IoT: Installation Improvements and Continuous IntegrationPHARO IoT: Installation Improvements and Continuous Integration
PHARO IoT: Installation Improvements and Continuous Integration
Pharo
 
Easy REST with OpenAPI
Easy REST with OpenAPIEasy REST with OpenAPI
Easy REST with OpenAPI
Pharo
 
Comment soup with a pinch of types, served in a leaky bowl
Comment soup with a pinch of types, served in a leaky bowlComment soup with a pinch of types, served in a leaky bowl
Comment soup with a pinch of types, served in a leaky bowl
Pharo
 
apart Framework: Porting from VisualWorks
apart Framework: Porting from VisualWorksapart Framework: Porting from VisualWorks
apart Framework: Porting from VisualWorks
Pharo
 
XmppTalk
XmppTalkXmppTalk
XmppTalk
Pharo
 
A living programming environment for blockchain
A living programming environment for blockchainA living programming environment for blockchain
A living programming environment for blockchain
Pharo
 
Raspberry and Pharo
Raspberry and PharoRaspberry and Pharo
Raspberry and Pharo
Pharo
 
Welcome: PharoDays 2017
Welcome: PharoDays 2017Welcome: PharoDays 2017
Welcome: PharoDays 2017
Pharo
 
Pharo 6
Pharo 6Pharo 6
Pharo 6
Pharo
 
Robotic Exploration and Mapping with Pharo
Robotic Exploration and Mapping with PharoRobotic Exploration and Mapping with Pharo
Robotic Exploration and Mapping with Pharo
Pharo
 
Pharo 64bits
Pharo 64bitsPharo 64bits
Pharo 64bits
Pharo
 
Smack: Behind the Refactorings
Smack: Behind the RefactoringsSmack: Behind the Refactorings
Smack: Behind the Refactorings
Pharo
 
Git with Style
Git with StyleGit with Style
Git with Style
Pharo
 
Pharo JS
Pharo JSPharo JS
Pharo JS
Pharo
 
Seaside & ReactJS
Seaside & ReactJSSeaside & ReactJS
Seaside & ReactJS
Pharo
 

More from Pharo (20)

Object-Centric Debugging: a preview
Object-Centric Debugging: a previewObject-Centric Debugging: a preview
Object-Centric Debugging: a preview
 
The future of testing in Pharo
The future of testing in PharoThe future of testing in Pharo
The future of testing in Pharo
 
Spec 2.0: The next step on desktop UI
Spec 2.0: The next step on desktop UI Spec 2.0: The next step on desktop UI
Spec 2.0: The next step on desktop UI
 
UI Testing with Spec
 UI Testing with Spec UI Testing with Spec
UI Testing with Spec
 
Pharo 7.0 and 8.0 alpha
Pharo 7.0 and 8.0 alphaPharo 7.0 and 8.0 alpha
Pharo 7.0 and 8.0 alpha
 
PHARO IoT: Installation Improvements and Continuous Integration
PHARO IoT: Installation Improvements and Continuous IntegrationPHARO IoT: Installation Improvements and Continuous Integration
PHARO IoT: Installation Improvements and Continuous Integration
 
Easy REST with OpenAPI
Easy REST with OpenAPIEasy REST with OpenAPI
Easy REST with OpenAPI
 
Comment soup with a pinch of types, served in a leaky bowl
Comment soup with a pinch of types, served in a leaky bowlComment soup with a pinch of types, served in a leaky bowl
Comment soup with a pinch of types, served in a leaky bowl
 
apart Framework: Porting from VisualWorks
apart Framework: Porting from VisualWorksapart Framework: Porting from VisualWorks
apart Framework: Porting from VisualWorks
 
XmppTalk
XmppTalkXmppTalk
XmppTalk
 
A living programming environment for blockchain
A living programming environment for blockchainA living programming environment for blockchain
A living programming environment for blockchain
 
Raspberry and Pharo
Raspberry and PharoRaspberry and Pharo
Raspberry and Pharo
 
Welcome: PharoDays 2017
Welcome: PharoDays 2017Welcome: PharoDays 2017
Welcome: PharoDays 2017
 
Pharo 6
Pharo 6Pharo 6
Pharo 6
 
Robotic Exploration and Mapping with Pharo
Robotic Exploration and Mapping with PharoRobotic Exploration and Mapping with Pharo
Robotic Exploration and Mapping with Pharo
 
Pharo 64bits
Pharo 64bitsPharo 64bits
Pharo 64bits
 
Smack: Behind the Refactorings
Smack: Behind the RefactoringsSmack: Behind the Refactorings
Smack: Behind the Refactorings
 
Git with Style
Git with StyleGit with Style
Git with Style
 
Pharo JS
Pharo JSPharo JS
Pharo JS
 
Seaside & ReactJS
Seaside & ReactJSSeaside & ReactJS
Seaside & ReactJS
 

Recently uploaded

Software Delivery At the Speed of AI: Inflectra Invests In AI-Powered Quality
Software Delivery At the Speed of AI: Inflectra Invests In AI-Powered QualitySoftware Delivery At the Speed of AI: Inflectra Invests In AI-Powered Quality
Software Delivery At the Speed of AI: Inflectra Invests In AI-Powered Quality
Inflectra
 
Neuro-symbolic is not enough, we need neuro-*semantic*
Neuro-symbolic is not enough, we need neuro-*semantic*Neuro-symbolic is not enough, we need neuro-*semantic*
Neuro-symbolic is not enough, we need neuro-*semantic*
Frank van Harmelen
 
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
 
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
 
How world-class product teams are winning in the AI era by CEO and Founder, P...
How world-class product teams are winning in the AI era by CEO and Founder, P...How world-class product teams are winning in the AI era by CEO and Founder, P...
How world-class product teams are winning in the AI era by CEO and Founder, P...
Product School
 
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
 
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
 
De-mystifying Zero to One: Design Informed Techniques for Greenfield Innovati...
De-mystifying Zero to One: Design Informed Techniques for Greenfield Innovati...De-mystifying Zero to One: Design Informed Techniques for Greenfield Innovati...
De-mystifying Zero to One: Design Informed Techniques for Greenfield Innovati...
Product School
 
Encryption in Microsoft 365 - ExpertsLive Netherlands 2024
Encryption in Microsoft 365 - ExpertsLive Netherlands 2024Encryption in Microsoft 365 - ExpertsLive Netherlands 2024
Encryption in Microsoft 365 - ExpertsLive Netherlands 2024
Albert Hoitingh
 
FIDO Alliance Osaka Seminar: Passkeys at Amazon.pdf
FIDO Alliance Osaka Seminar: Passkeys at Amazon.pdfFIDO Alliance Osaka Seminar: Passkeys at Amazon.pdf
FIDO Alliance Osaka Seminar: Passkeys at Amazon.pdf
FIDO Alliance
 
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
 
The Future of Platform Engineering
The Future of Platform EngineeringThe Future of Platform Engineering
The Future of Platform Engineering
Jemma Hussein Allen
 
Securing your Kubernetes cluster_ a step-by-step guide to success !
Securing your Kubernetes cluster_ a step-by-step guide to success !Securing your Kubernetes cluster_ a step-by-step guide to success !
Securing your Kubernetes cluster_ a step-by-step guide to success !
KatiaHIMEUR1
 
Generating a custom Ruby SDK for your web service or Rails API using Smithy
Generating a custom Ruby SDK for your web service or Rails API using SmithyGenerating a custom Ruby SDK for your web service or Rails API using Smithy
Generating a custom Ruby SDK for your web service or Rails API using Smithy
g2nightmarescribd
 
State of ICS and IoT Cyber Threat Landscape Report 2024 preview
State of ICS and IoT Cyber Threat Landscape Report 2024 previewState of ICS and IoT Cyber Threat Landscape Report 2024 preview
State of ICS and IoT Cyber Threat Landscape Report 2024 preview
Prayukth K V
 
Elevating Tactical DDD Patterns Through Object Calisthenics
Elevating Tactical DDD Patterns Through Object CalisthenicsElevating Tactical DDD Patterns Through Object Calisthenics
Elevating Tactical DDD Patterns Through Object Calisthenics
Dorra BARTAGUIZ
 
To Graph or Not to Graph Knowledge Graph Architectures and LLMs
To Graph or Not to Graph Knowledge Graph Architectures and LLMsTo Graph or Not to Graph Knowledge Graph Architectures and LLMs
To Graph or Not to Graph Knowledge Graph Architectures and LLMs
Paul Groth
 
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
 
When stars align: studies in data quality, knowledge graphs, and machine lear...
When stars align: studies in data quality, knowledge graphs, and machine lear...When stars align: studies in data quality, knowledge graphs, and machine lear...
When stars align: studies in data quality, knowledge graphs, and machine lear...
Elena Simperl
 
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)

Software Delivery At the Speed of AI: Inflectra Invests In AI-Powered Quality
Software Delivery At the Speed of AI: Inflectra Invests In AI-Powered QualitySoftware Delivery At the Speed of AI: Inflectra Invests In AI-Powered Quality
Software Delivery At the Speed of AI: Inflectra Invests In AI-Powered Quality
 
Neuro-symbolic is not enough, we need neuro-*semantic*
Neuro-symbolic is not enough, we need neuro-*semantic*Neuro-symbolic is not enough, we need neuro-*semantic*
Neuro-symbolic is not enough, we need neuro-*semantic*
 
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
 
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
 
How world-class product teams are winning in the AI era by CEO and Founder, P...
How world-class product teams are winning in the AI era by CEO and Founder, P...How world-class product teams are winning in the AI era by CEO and Founder, P...
How world-class product teams are winning in the AI era by CEO and Founder, P...
 
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...
 
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
 
De-mystifying Zero to One: Design Informed Techniques for Greenfield Innovati...
De-mystifying Zero to One: Design Informed Techniques for Greenfield Innovati...De-mystifying Zero to One: Design Informed Techniques for Greenfield Innovati...
De-mystifying Zero to One: Design Informed Techniques for Greenfield Innovati...
 
Encryption in Microsoft 365 - ExpertsLive Netherlands 2024
Encryption in Microsoft 365 - ExpertsLive Netherlands 2024Encryption in Microsoft 365 - ExpertsLive Netherlands 2024
Encryption in Microsoft 365 - ExpertsLive Netherlands 2024
 
FIDO Alliance Osaka Seminar: Passkeys at Amazon.pdf
FIDO Alliance Osaka Seminar: Passkeys at Amazon.pdfFIDO Alliance Osaka Seminar: Passkeys at Amazon.pdf
FIDO Alliance Osaka Seminar: Passkeys at Amazon.pdf
 
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...
 
The Future of Platform Engineering
The Future of Platform EngineeringThe Future of Platform Engineering
The Future of Platform Engineering
 
Securing your Kubernetes cluster_ a step-by-step guide to success !
Securing your Kubernetes cluster_ a step-by-step guide to success !Securing your Kubernetes cluster_ a step-by-step guide to success !
Securing your Kubernetes cluster_ a step-by-step guide to success !
 
Generating a custom Ruby SDK for your web service or Rails API using Smithy
Generating a custom Ruby SDK for your web service or Rails API using SmithyGenerating a custom Ruby SDK for your web service or Rails API using Smithy
Generating a custom Ruby SDK for your web service or Rails API using Smithy
 
State of ICS and IoT Cyber Threat Landscape Report 2024 preview
State of ICS and IoT Cyber Threat Landscape Report 2024 previewState of ICS and IoT Cyber Threat Landscape Report 2024 preview
State of ICS and IoT Cyber Threat Landscape Report 2024 preview
 
Elevating Tactical DDD Patterns Through Object Calisthenics
Elevating Tactical DDD Patterns Through Object CalisthenicsElevating Tactical DDD Patterns Through Object Calisthenics
Elevating Tactical DDD Patterns Through Object Calisthenics
 
To Graph or Not to Graph Knowledge Graph Architectures and LLMs
To Graph or Not to Graph Knowledge Graph Architectures and LLMsTo Graph or Not to Graph Knowledge Graph Architectures and LLMs
To Graph or Not to Graph Knowledge Graph Architectures and LLMs
 
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
 
When stars align: studies in data quality, knowledge graphs, and machine lear...
When stars align: studies in data quality, knowledge graphs, and machine lear...When stars align: studies in data quality, knowledge graphs, and machine lear...
When stars align: studies in data quality, knowledge graphs, and machine lear...
 
FIDO Alliance Osaka Seminar: Overview.pdf
FIDO Alliance Osaka Seminar: Overview.pdfFIDO Alliance Osaka Seminar: Overview.pdf
FIDO Alliance Osaka Seminar: Overview.pdf
 

Yesplan: 10 Years later

  • 1. 10 Years later “develop in Pharo, deploy in Gemstone” with Seaside Johan Brichau - johan@yesplan.be
  • 2. Yesplan ? Web Application (SaaS) to manage an event venue
  • 3. Yesplan ? Web Application (SaaS) to manage an event venue
  • 4. Yesplan ? Web Application (SaaS) to manage an event venue
  • 5. Yesplan ? Web Application (SaaS) to manage an event venue - jQuery - jQuery-UI - KnockoutJs - D3.js - Datatables - Jasper reports - ….
  • 6. Yesplan ? Web Application (SaaS) to manage an event venue - jQuery - jQuery-UI - KnockoutJs - D3.js - Datatables - Jasper reports - …. ReactJs
  • 7.
  • 8. Yesplan ? • Founded by aa. and arts centre • Over 200 customers (in BE, NL, Lux, CH, UK, NO, DK, FI) • Currently 25 employees: • 5 software engineers, 1 dev ops engineer, 1 interaction designer and 1 report engineer • sales, account management, marketing, support, • Emphasis on making an application that not only works, but also is enjoyable to use
  • 9. Yesplan 0.1 (2009) • Yesplan calendar built using Seaside’s “full page rendering” • Standard ‘component calls component’ implementation • A lot of jQuery for animations and ajax updates • Javascript universe was “big mess” 
 (excluding notable exceptions) • More errors than functionality in most ‘plugins’ • Bad performance and horrible engineering • Pharo + GoodsDB in production title group in-place editing info bubbles group visualization
  • 10. Yesplan 1.0 (2010) • Yesplan calendar with incremental ajax updates • A lot of jQuery-based scripts • SVG animations using generated Javascript • Develop in Pharo, deploy in GemStone • Pharo for development • GemStone for deployment • Unit tests + Seaside Component Tests
  • 11. Yesplan 1.0 (2010) • Yesplan calendar with incremental ajax updates • A lot of jQuery-based scripts • SVG animations using generated Javascript • Develop in Pharo, deploy in GemStone • Pharo for development • GemStone for deployment • Unit tests + Seaside Component Tests seconds 0 1,5 3 4,5 6 1 commit after one change in 100 000 loaded objects Magma Goods Goods w/ manual barrier Gemstone 0,68s
  • 12. Yesplan 1.x (2010-2013) • Seaside with a lot of Javascript generation • Separate Javascript source code files • jQuery event delegation • Parasol • Selenium (Webdriver) testing • Targeted at Seaside apps but not limited to html span class: 'name'; passenger: self; with: self visibleresourceUse event name. html jQuery this on: 'click' 
 selector: '.name' do: ((JSStream on: 'editEventName(event.target)') asFunction: #(event)) html document addLoadScript: ((((html jQuery expression: (JSStream on: 'target')) editable type: 'text'; callback: [ :val | nameValue value: val ]; secondCallback: (html jQuery ajax callback:[:theCells | theCell value changeEventName: nameValue value]] passengers: ((html jQuery expression: (JSStream on: 'target'))); script: [:s | s<< (theCell value afterNameUpdateScriptOn: s)]); yourself) asFunction: #(target)) assignTo: 'editEventName').
  • 18. Yesplan (2014-2015) • Experiment with Hybrid Web Application • Server-side session: Seaside • Client-side UI: d3js, KnockoutJs, BackboneJs,…
  • 19. Yesplan (2014-2015) • Experiment with Hybrid Web Application • Server-side session: Seaside • Client-side UI: d3js, KnockoutJs, BackboneJs,…
  • 20. Yesplan (2014-2015) • Experiment with Hybrid Web Application • Server-side session: Seaside • Client-side UI: d3js, KnockoutJs, BackboneJs,…
  • 21. Yesplan (today) • Full Hybrid Web Application • Server-side session mgmt: Seaside • Existing UI: server-side Seaside • New UI: client-side ReactJs • Operations • SmalltalkCI (Travis-CI), parallel running test packages • Sentry central error logging (Js + Smalltalk) • Numbers • +200 Gemstone databases • +2000 simultaneous sessions
  • 23. Client Server Data objects Operations Web components generated REST API Reporting engine Mobile Portal rich client application
  • 26. Develop in Pharo, deploy in Gemstone • Key Tools • Grease • Metacello • https://github.com/GsDevKit/ • Pros • Seaside in GsDevKit • “Transparent” persistency • Licensing model • Gemstone performance, Pharo coolness • NO ORM • Live debugging of production environment • Cons • Dialect differences only become larger • Pharo-specific classes • “Transparent” persistency
  • 27. Legend defaultscheduledescription : string defaultschedulestarttime : datetime defaultscheduleendtime : datetime (or null) attributes : attributedictionary Event Group vipcode : string (or null) firstname : string lastname : string addresslines : string (or null) zipcode : string (or null) country : string (or null) city : string (or null) Person vat : string (or null) type : string (or null) Organization jobtitle : string department: string (or null) Link duration : duration Task Task Group name : string statustypes : string[0…n] backgroundcolor : color textcolor : color Status name : string color : color Profile Attachment List defaultstartidx : integer defaultstopidx : integer Event Schedule number : integer role : string (or null) Abstract Resourcebooking Event History List type : string value : string Contactinfo description : string starttime : datetime Schedule entry Custom data group time : datetime user : string description : string History entry locations[0…n] profile status links[0…n] links[0…n] contactinfo[0…n] profiles[0…n] entries[0…n] schedule originalname : string type : string comment : string date : date user : string url : string Attachment attachments[0…n] Event Resource Booking List resourcebookings [0…n] Event Task List tasks[0…n] _type : string comment : string (or null) address : string (or null) labels : string[0…n] name : string attributes : attributedictionary Contact status : string name : string team : string cost : decimal due : datetime start : datetime assignedby : string assignedto : string description : string Abstract Task tasks[0…n] name : string starttime : datetime endtime : datetime isproduction : boolean Abstract Event tasks attachments name : string keyword : string Custom data item type : string value : string|integer|decimal|date|time|datetime| resourcebooking | contactbooking (or null) Custom data element children[0…n] customdata resource customdata groups[0…n] organization person Event Contact Booking List role : string Event Contact Booking contactsbookings[0…n] contactbookings contact Custom data List customdata customdata customdata actualnumber: integer [opt.] Resourcesetbooking children[0…n] Yesplan API v1.0.1 - 12 April 2013 production (or null) group (or null) recurrence startdate : date rule : (recurrence rule) Recurrence children[0…n] history Event custom data Listevent event entries[0…n] event Contactbooking custom data List Contact custom data Listcontact contactbooking event costings[1..n] alteration : string (or null) cost: decimal (or null) price : decimal (or null) netprice : decimal (or null) vat: decimal (or null) actualprice : decimal (or null) Event Costings costing group: string alteration : string (or null) cost : decimal (or null) price : decimal (or null) vat: decimal (or null) actualprice : decimal (or null) Resourcegroup costing event costings[1…n] alteration : string (or null) cost : decimal (or null) price : decimal (or null) actualprice : decimal (or null) invoice : boolean accountableto: string Resourcebooking costing resourcecostings[1…n] costmodel event Resource SetLocation notation : string type : string rates : integer[2][1…n] Discount name : string account : string (or null) purchaseprice : decimal invoice : boolean cost : string (cost formula) (1 or array) price : string (cost formula) (1 or array) vat : decimal Cost model costmodels[0…n] durationdiscount amount : integer Resource resources[0…n] volumediscount resourcetype : string name : string group : string roles : string[0…n] description : string external : boolean rented : boolean Abstract Resource Placeholder Resource custom data List resource ResourceSetbooking costing children[1…n] repeatedevents [1…n] Resourcebooking custom data List resourcebooking Resourcebooking actualnumber: integer [opt.] actualstart: datetime [opt.] actualend: datetime [opt.] Resourcebookinggroup children[0…n] start : datetime end : datetime actualstart: datetime actualend: datetime Singleton Resourcebooking start : datetime end : datetime actualstart: datetime [opt.] actualend: datetime [opt.] actualnumber: integer [opt.] Standard Resourcebooking repeatedevent reference link (retrieve needs separate call/request) nesting link (entity directly included) subtype schedule Group Schedule schedules[1…n] ??? Abstract Schedule Summary Group Schedule Summary Event Schedule Summary group group entries[0…n]