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
複雑なUIコンポーネントとの ⻑い付き合い⽅:波及するバグからテスト戦略を経て、安全な再設計へ
mixplace
0
240
Augmenting AI with the Power of Jakarta EE
ivargrimstad
0
500
R8 の設定見直しでアプリサイズ削減
andpad
0
190
Unity6 URPによる海底をテーマにしたVJシステムの解説 | Unity Shader 完全に理解した 勉強会
gam0022
0
340
モデルのリファクタリングが難しいと思ったら、そもそも複雑だったのはビジネス仕様だった ? / is-the-business-domain-the-real-complexity
hatsu38
0
450
WebRTC映像をAirPlayに対応させる挑戦.pdf
monolithic_adam
0
350
Embedded Swiftで作る自作USBデバイス によるiOSデバイスの自動テスト / iOSDC Japan 2026 glassfiber
glassfiber
0
310
最近”作らせてる” ローカルAIアプリの話
akit37
0
410
設計次第でAIコードの読む量は減らせる / designing-for-code-reading
minodriven
34
16k
Agentic Software Factoryに、すごく賢いIF文を。 / super smart IF statement into the Agentic Software Factory.
rkaga
8
2k
速く作れる。その次は、速く確かめられる開発へ 〜AIネイティブ開発を支える、Shift Down〜 / Can build fast. Next, moving to development where we can verify fast.
rkaga
8
5.6k
contenteditable と日本語入力に向き合う
colorful12
0
180
Featured
See All Featured
4 Signs Your Business is Dying
shpigford
187
23k
Art, The Web, and Tiny UX
lynnandtonic
304
22k
Abbi's Birthday
coloredviolet
4
10k
Information Architects: The Missing Link in Design Systems
soysaucechin
1
1.2k
The Language of Interfaces
destraynor
162
27k
Mobile First: as difficult as doing things right
swwweet
225
10k
Fashionably flexible responsive web design (full day workshop)
malarkey
409
67k
Evolution of real-time – Irina Nazarova, EuRuKo, 2024
irinanazarova
9
1.6k
Breaking role norms: Why Content Design is so much more than writing copy - Taylor Woolridge
uxyall
1
450
For a Future-Friendly Web
brad_frost
184
10k
Taking LLMs out of the black box: A practical guide to human-in-the-loop distillation
inesmontani
PRO
3
2.4k
Templates, Plugins, & Blocks: Oh My! Creating the theme that thinks of everything
marktimemedia
31
2.9k
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