Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
Livecoding in Javascript
Search
Jason Frame
May 09, 2013
Programming
1.4k
1
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Livecoding in Javascript
Jason Frame
May 09, 2013
More Decks by Jason Frame
See All by Jason Frame
How to fake it for 18 months and (almost) launch a hardware product
jaz303
0
400
Entity Systems
jaz303
2
220
Ruby by the River
jaz303
1
1.2k
Other Decks in Programming
See All in Programming
Event is what happens
moro
2
2.2k
Web3Dライブラリを作ってVue Custom Rendererの仕組みを理解しよう / lets learn vue custom renderer by making 3d library
drumath2237
1
110
contenteditable と日本語入力に向き合う
colorful12
0
230
気持ちぃ〜角丸 Squircle
ryu1013
0
370
3回つくってわかった、 定期実行ジョブ基盤の本質情報
takai
4
3.5k
[JA] Domain Modeling with Vanilla Rails: 「操作」から再考するRailsの設計論
yasaichi
4
1.4k
AI時代のTerminal環境を UNIX哲学で設計・運用する
yasunori0418
1
310
baseline으로 마이그레이션, 리팩토링 안전하게 맡기기
fornewid
1
570
クラウドゲーミングのパフォーマンス最適化に挑む / Cloud Gaming Performance Tuning
vivion
0
310
Inertia Rails: The One-Person Framework with React & Friends
skryukov
0
200
No More NoSuchMethodError
exoego
1
120
TanStack Vue Query と Pinia Colada から学ぶ非同期状態の型設計
aoshi
0
450
Featured
See All Featured
How To Stay Up To Date on Web Technology
chriscoyier
790
250k
The MySQL Ecosystem @ GitHub 2015
samlambert
251
13k
Pawsitive SEO: Lessons from My Dog (and Many Mistakes) on Thriving as a Consultant in the Age of AI
davidcarrasco
0
290
Leo the Paperboy
mayatellez
10
2.4k
職位にかかわらず全員がリーダーシップを発揮するチーム作り / Building a team where everyone can demonstrate leadership regardless of position
madoxten
70
68k
Design in an AI World
tapps
1
380
The Power of CSS Pseudo Elements
geoffreycrofte
82
6.6k
実際に使うSQLの書き方 徹底解説 / pgcon21j-tutorial
soudai
PRO
203
77k
Raft: Consensus for Rubyists
vanstee
143
7.8k
The Cost Of JavaScript in 2023
addyosmani
55
10k
KATA
mclloyd
PRO
35
16k
Sharpening the Axe: The Primacy of Toolmaking
bcantrill
46
3k
Transcript
Livecoding in Javascript Jason Frame / @jaz303 Friday, 31 May
13
What is livecoding? By akirto. http://www.flickr.com/photos/30132612@N00/3840200923/in/photostream Friday, 31 May 13
Performance-Oriented Friday, 31 May 13
Node-based Friday, 31 May 13
Microworlds Paper - “Twenty Reasons Why You Should Use Boxer
(Instead of Logo)” Andrea A. diSessa Friday, 31 May 13
Smalltalk, Self Paper - “The Early History of Smalltalk” Alan
C. Kay Friday, 31 May 13
Why livecode? Friday, 31 May 13
Why Javascript? Friday, 31 May 13
Why Javascript? • Flexible language • Ecosystem - browser +
node.js = node- webkit • Single threaded • Event loop Friday, 31 May 13
Why Javascript? Describing Live programming using program transformations and a
callstack explicit interpreter Olov Johansson Friday, 31 May 13
Domain-Specific Livecoding • Generalised tools can be complex • May
also make unacceptable performance/ timing trade-offs • Evolve tools with your application Friday, 31 May 13
Demo Time Friday, 31 May 13
Friday, 31 May 13
Implementation Strategies Friday, 31 May 13
Implementation Strategies eval() is evil Friday, 31 May 13
Implementation Strategies eval() is evil Friday, 31 May 13
Implementation Strategies • Private State • Variable Injection • “Globals”
Preservation • Internal eval() • Blueprints • Snapshot • Clocksources Friday, 31 May 13
Private State Prevent pollution of global namespace Friday, 31 May
13
Private State function setup() { position = {x: 10, y:
20}; velocity = {x: 1, y: 1}; } function loop() { position.x += velocity.x; position.y += velocity.y; } Friday, 31 May 13
Private State (function() { “use strict”; var position; var velocity;
function setup() { position = {x: 10, y: 20}; velocity = {x: 1, y: 1}; } function loop() { position.x += velocity.x; position.y += velocity.y; } })(); Friday, 31 May 13
Private State (function() { “use strict”; var position; var velocity;
function setup() { position = {x: 10, y: 20}; velocity = {x: 1, y: 1}; } function loop() { position.x += velocity.x; position.y += velocity.y; } return { setup: setup, loop: loop }; })(); Friday, 31 May 13
Variable Injection Provide objects to user-code Friday, 31 May 13
Variable Injection function loop() { car.drawAt(0,0,50,50) } // ... //
... // ... Friday, 31 May 13
Variable Injection // Generate method signature from defined // objects
(function(car, trafficLights, background) { // Paste user code here function loop() { car.drawAt(0,0,50,50) } // ... // ... // ... }).apply(null, exposedObjects); Friday, 31 May 13
“Globals” Preservation Persist global values between code reloads Friday, 31
May 13
“Globals” Preservation var carX = 0; var carY = 0;
var speed = 5; function loop() { carY += speed; draw(); } Friday, 31 May 13
“Globals” Preservation var carX = 0; var carY = 0;
var speed = 5; function loop() { carY += speed; draw(); } Friday, 31 May 13
“Globals” Preservation (function() { "use strict"; var carX = 0;
var carY = 0; var speed = 5; function loop() { carY += speed; draw(); } return { loop: loop, getVars: function() { return {carX: carX, carY: carY, speed: speed}; }, setVars: function(vars) { carX = vars.carX; carY = vars.carY; speed = vars.speed; } }; })(); Friday, 31 May 13
Internal eval() Provide external (e.g. console) access to private state
Friday, 31 May 13
Internal eval() var car = {x: 20, y: 20} var
lightState = “red-amber” function setup() { // ... } function loop() { // ... } Friday, 31 May 13
Internal eval() (function() { "use strict"; var car = {x:
20, y: 20} var lightState = “red-amber” function setup() { // ... } function loop() { // ... } })(); Friday, 31 May 13
Internal eval() (function() { "use strict"; var car = {x:
20, y: 20} var lightState = “red-amber” function setup() { // ... } function loop() { // ... } function evaluate(code) { return eval(code); } return { __eval__: evaluate } })(); Friday, 31 May 13
Blueprints Augment a supplied object with user-code Friday, 31 May
13
Blueprints // Inside engine var blueprint = new SystemBlueprint(); blueprint.id
= oldSystem.id; blueprint.enabled = oldSystem.enabled; blueprint.update = function() { /* default impl */ } USERCODE = ‘(function(system) { // augment blueprint system.title = “foo”; system.update = function() { ... } })’; // Compile code systemBuilder = eval(USERCODE); systemBuilder(blueprint); // inspect user’s refinements to blueprint and // setup accordingly Friday, 31 May 13
Snapshots Save and restore entire application state Friday, 31 May
13
Snapshots system.snapshot = function() { return { entities: Object.keys(this.entities), lastShotTime:
this.lastShotTime } } system.restore = function(snapshot) { var self = this; this.entities = {}; snapshot.entities.forEach(function(eid) { self.entities[eid] = self.world.getEntityById(eid); } this.lastShotTime = snapshot.lastShotTime; } Friday, 31 May 13
Snapshots function updateSystem(registry, systemId, newSystem) { var existingSystem = registry.getSystemById(systemId);
var snapshot = existingSystem.snapshot(); try { newSystem.restore(snapshot); registry.setSystem(systemId, newSystem); } catch (e) { // Incompatible snapshot - restart app? } } Friday, 31 May 13
Clocksources Provide a consistent view of time when loading snapshots
Friday, 31 May 13
Clocksources Date.now() Friday, 31 May 13
Clocksources Date.now() function Clock() { this.time = 0; this.lastDelta =
null; } Clock.prototype.tick = function(delta) { this.time += delta; this.lastDelta = delta; } function tick() { var wallclockDelta = Date.now() - lastTick; clock.tick(wallclockDelta); } Friday, 31 May 13
Escaping the Walled Garden Friday, 31 May 13
Escaping the Walled Garden Friday, 31 May 13
Escaping the Walled Garden Friday, 31 May 13
Demo Time Friday, 31 May 13