SlideShare ist ein Scribd-Unternehmen logo
1 von 63
Downloaden Sie, um offline zu lesen
Streams
Asynchronous programming
in JS
Eugene Lazutkin, 4/5/2016, ClubAjax, Dallas, TX
@uhop, www.lazutkin.com
Asynchronous programming
AKA EDP:
Event-Driven Programming.
Present in JS from day 1:
Browsers are event-driven
inherently.
Events
Basic primitives of asynchronous
programming.
Support a publisher/subscriber model.
Publisher: emits an object.
Subscriber: registers a callback.
Subscribers
All receive an emited object.
All independent from each other.
A callback can:
Stop DOM propagation.
Stop processing by others.
Events: problems
Semantics is an out-of-band
knowledge.
Not composable
Events: semantics
No info on its frequency.
Is it singular, or multiple?
No info on valid sequence of events.
Are all events independent?
Is any order valid?
Events: example
A le reader can emit three types of
events:
OPEN
DATA(with read data)
DONE
A valid sequence:
OPEN, DATA, DATA, DONE.
Events: example fail
How to interpret these:
DONE, DATA, OPEN.
OPEN, OPEN, DATA.
OPEN, DONE, OPEN, DONE.
Events: example x
Document event emitters?
Use better primitives?
Go high-level?
Possible x: add a state machine.
Events: composability
Tried to wait for N events?
Possible with a bunch of
boilerplate.
Callbacks are hard to compose.
Events: clunky API
node.addEventListener(type, cb);
node.removeEventListener(type, cb);
event.preventDefault();
event.stopPropagation();
event.stopImmediatePropagation();
Promise
AKA future, AKA deferred.
A proxy object for a not-yet-available
result.
Most implementations do not allow to
observe result (or lack of thereof) other
than by registering a callback.
Promise vs. Event
Promise is a one-off deal.
Callbacks for success and failure are
different.
Subscribers can be chained.
They can pass different results down a
pipe.
Promise: independent
promise.then(x => x + 1);
promise.then(x => x + 2);
promise.then(x => x + 3);
If promiseis resolved with 0, each
subscriber will receive 0.
Promise: pipeline
promise.
then(x => x + 1).
then(x => x + 2).
then(x => x + 3);
If promiseis resolved with 0, subscribers
will receive 0, 1, 3.
Promise: limitations
Not really primitive.
Does not work with repeated events.
Does not help with sequencing events.
Promise: why???
Represents a result of a future
operation.
Can be passed anywhere.
Composable.
Promise: alternatives
var count = 2;
function countdown () {
if (!--count) console.log("Done!");
}
a.addCallback(countdown);
b.addCallback(countdown);
Done!will be printed only when both a
and bare nished (in any order).
Promise: all()
Promise.all([a, b]).
then(() => console.log("Done!"));
The result of multiple promises is a
promise too.
Compose away!
Promise: counter-argument
But we can wrap our function too!
And we can make it to accept N
functions!
And it will call one callback too!
Promise: not so easy
This aggregate function will depend on
a convention:
E.g., the last argument of a
function is always a callback.
No way to use synchronous, callback-
less functions.
Promise: strikes back!
If we do it right, at the end we will get
… a Promiseobject.
It may have a different API, yet a
similar functionality.
Promise vs. callback
fun(x, cb);
// roughly eqivalent to
fun(x).then(cb);
Promise vs. cb & err
fun(x, (err, data) => {});
// roughly eqivalent to
fun(x).then(data => {}, err => {});
Finally:
streams!
Streams: why?
They represent a sequential
asynchronous I/O.
Can process unlimited amount of data
with a small predictable buffer.
Can read/process/write in parallel
saving time.
Streams: node.js
node.js includes streams.
Modelled after Unix streams.
Can be les, pipes, network
connections.
Any sequential I/O can be
modelled.
Streams: node.js
High-level: encapsulate events.
Can be:
Readable
Writable
Both (Duplex/ Transform)
node.js: ReadableAPI
Events: data, end, error.
Read bytes: read([size]).
Pipe data: pipe(destination).
node.js: WritableAPI
Events: drain, finish, error.
Write bytes: write(chunk).
End writing: end().
node.js: Duplex
Implements both APIs.
Contains two independent channels:
Reading + writing.
Example: TCP socket.
node.js: Transform
Implements both APIs.
Reads from a readable side.
Does something with it.
Writes it to a writable side.
Example: encoding.
node.js: example
Copy all data from one stream to another:
readable.on('end',
() => console.log('Done!'));
readable.pipe(writable);
node.js: pipeline
Compress a le:
var r, z, w;
r = fs.createReadStream('f.txt'),
z = zlib.createGzip(),
w = fs.createWriteStream('f.txt.gz');
r.pipe(z).pipe(w);
node.js: time savings
Read
Block
Read
Block
Read
Block
Write
Block
Write
Block
Write
Block
Xform
Block
Xform
Block
Xform
Block
Read
Block
Read
Block
Read
Block
Write
Block
Write
Block
Write
Block
Xform
Block
Xform
Block
Xform
Block
Sequential
read­transform­write
Asynchronous
stream
Delay
Total
node.js: implementation
How to implement custom streams?
Just implement necessary
methods.
Relax, and watch them being
called.
Custom transform rulez!
node.js: custom API
Readable:
_read(size)
uses push(chunk)
Writable:
_write(chunk, enc, cb)
opt: _writev(chunks, cb)
Dupleximplements both.
node.js: custom Transform
_transform(chunk, enc, cb)
opt: _flush(cb)
uses push(chunk)to pass on
transformed data.
node.js: null example (part 1)
const util = require('util'),
T = require('streams').Transform;
util.inherits(Null, T);
function Null() { T.call(this); }
node.js: null example (part 2)
Null.prototype._transform =
function (data, _, cb) {
this.push(data);
cb();
};
node.js: upper case example
UpperCase.prototype._transform =
function (data, enc, cb) {
let str = data.toString(enc);
this.push(str.toUpperCase());
cb();
};
Novices: thinking
Aha! Stream is a concept!
Why do we even need streams as
implementation?
We can create an arbitrary object with
necessary methods.
No need for heavy-weight libraries.
node.js: reality
What if our pipe components have
different throughputs?
What happens, if we push more water
in a pipe, then it can drain.
We have to manage buffers by
regulating a throughput.
node.js: more API
It is OK to drain fast.
It is not OK to pump in too fast.
Readablehas more:
pause()— stop pumping.
resume()— start pumping.
node.js: like a plumber
Now when we send data, we pause().
When we are done, we can resume().
Otherwise we may have too many I/O
requests “in ight”.
Novices: thinking
“Cool concept, but not for me!”
“Who needs to process text?”
“I deal with SQL, and OOP!”
“I don’t save binaries on disk!”
node.js: object mode
We read and/or write arbitrary objects,
not strings of buffers.
It is a userland feature:
Nothing in node.js library.
npm offers a lot ὠ
node.js: object streams
Any part (or both) of Duplexor
Transformcan be in object mode.
Set a required option to true:
readableObjectMode
writableObjectMode
It should be set at construction.
node.js: lter example (part 1)
const util = require('util'),
T = require('streams').Transform;
util.inherits(Filter, T);
function Filter() {
T.call(this, {
readableObjectMode: true,
writableObjectMode: true
});
}
node.js: lter example (part 2)
Filter.prototype._transform =
function (data, _, cb) {
if(data.color == 'red'){
this.push(data);
}
cb();
};
node.js: object sources
Parsing text les: XML, JSON, CSV
Reading from database.
There are npm modules for that.
I wrote two:
stream-json
stream-csv-enhanced
node.js: working object
When you got objects, you can:
Filter
Augment
Clean
Transform
and so on…
node.js: project library
Object mode streams allow:
Create a library of components to
process your data.
Construct custom pipelines out of
them.
node.js: composability
Composability makes it all possible.
Creating libraries and pipelines are
easy.
It will have a decent performance by
default.
Philosophy
Remember data ow programming?
Pipelines of object mode streams
can be used for that.
Remember event streams?
Object mode streams again.
Remember Array Extras?
node.js: back to earth
Pipeline has a “tax” per object.
The smaller object you have, the
more relative overhead.
Doesn’t make any sense to process
bytes in object mode.
Group small objects.
Experts: thinking
“What node.js? Browser!”
“I am a front-end dev!”
“What’s in it for me?”
Streams: WHATWG
WHATWG got us covered:
New Streams standard is under
development.
Will be used in Fetch —
replacement for XHR.
Likely to be used in File API.
For use client- and server- side.
WHATWG vs. node.js (part 1)
Most functionality is preserved.
Modern API:
Promises instead of callbacks.
BYOB mode:
“Bring your own buffer”.
Zero-copy pipelines!
WHATWG vs. node.js (part 2)
Backpressure is introduced.
Automated management of a
throughput.
Explicit splitting of a stream.
Handles backpressure too.
Pipeline can have trees!
WHATWG vs. node.js (part 3)
Reader is separated from a stream.
No accidental reads to disrupt a
pipeline.
“Revealing constructor pattern” is
used.
The same advantages and
drawbacks as ES6 Promise
constructor.
WHATWG vs. node.js (part 4)
No special Duplexstream.
Transformstream is a wrapped pair
of Readableand Writable.
Totally separate API.
That’s all,
folks!

Más contenido relacionado

Was ist angesagt?

Finagle and Java Service Framework at Pinterest
Finagle and Java Service Framework at PinterestFinagle and Java Service Framework at Pinterest
Finagle and Java Service Framework at PinterestPavan Chitumalla
 
Reactive Programming for a demanding world: building event-driven and respons...
Reactive Programming for a demanding world: building event-driven and respons...Reactive Programming for a demanding world: building event-driven and respons...
Reactive Programming for a demanding world: building event-driven and respons...Mario Fusco
 
Optimizing Communicating Event-Loop Languages with Truffle
Optimizing Communicating Event-Loop Languages with TruffleOptimizing Communicating Event-Loop Languages with Truffle
Optimizing Communicating Event-Loop Languages with TruffleStefan Marr
 
Multiprocessing with python
Multiprocessing with pythonMultiprocessing with python
Multiprocessing with pythonPatrick Vergain
 
Non Blocking I/O for Everyone with RxJava
Non Blocking I/O for Everyone with RxJavaNon Blocking I/O for Everyone with RxJava
Non Blocking I/O for Everyone with RxJavaFrank Lyaruu
 
Asynchronous single page applications without a line of HTML or Javascript, o...
Asynchronous single page applications without a line of HTML or Javascript, o...Asynchronous single page applications without a line of HTML or Javascript, o...
Asynchronous single page applications without a line of HTML or Javascript, o...Robert Schadek
 
Big-data-analysis-training-in-mumbai
Big-data-analysis-training-in-mumbaiBig-data-analysis-training-in-mumbai
Big-data-analysis-training-in-mumbaiUnmesh Baile
 
Concurrency in Python
Concurrency in PythonConcurrency in Python
Concurrency in PythonGavin Roy
 
Michael Häusler – Everyday flink
Michael Häusler – Everyday flinkMichael Häusler – Everyday flink
Michael Häusler – Everyday flinkFlink Forward
 
Advanced JavaScript
Advanced JavaScriptAdvanced JavaScript
Advanced JavaScriptFu Cheng
 
Objective-C Blocks and Grand Central Dispatch
Objective-C Blocks and Grand Central DispatchObjective-C Blocks and Grand Central Dispatch
Objective-C Blocks and Grand Central DispatchMatteo Battaglio
 
How and why I turned my old Java projects into a first-class serverless compo...
How and why I turned my old Java projects into a first-class serverless compo...How and why I turned my old Java projects into a first-class serverless compo...
How and why I turned my old Java projects into a first-class serverless compo...Mario Fusco
 
Effective testing for spark programs Strata NY 2015
Effective testing for spark programs   Strata NY 2015Effective testing for spark programs   Strata NY 2015
Effective testing for spark programs Strata NY 2015Holden Karau
 
Fuzzing: The New Unit Testing
Fuzzing: The New Unit TestingFuzzing: The New Unit Testing
Fuzzing: The New Unit TestingDmitry Vyukov
 
Comparing different concurrency models on the JVM
Comparing different concurrency models on the JVMComparing different concurrency models on the JVM
Comparing different concurrency models on the JVMMario Fusco
 
QConSF 2014 talk on Netflix Mantis, a stream processing system
QConSF 2014 talk on Netflix Mantis, a stream processing systemQConSF 2014 talk on Netflix Mantis, a stream processing system
QConSF 2014 talk on Netflix Mantis, a stream processing systemDanny Yuan
 
Jvm profiling under the hood
Jvm profiling under the hoodJvm profiling under the hood
Jvm profiling under the hoodRichardWarburton
 

Was ist angesagt? (20)

NANO266 - Lecture 9 - Tools of the Modeling Trade
NANO266 - Lecture 9 - Tools of the Modeling TradeNANO266 - Lecture 9 - Tools of the Modeling Trade
NANO266 - Lecture 9 - Tools of the Modeling Trade
 
Finagle and Java Service Framework at Pinterest
Finagle and Java Service Framework at PinterestFinagle and Java Service Framework at Pinterest
Finagle and Java Service Framework at Pinterest
 
Reactive Programming for a demanding world: building event-driven and respons...
Reactive Programming for a demanding world: building event-driven and respons...Reactive Programming for a demanding world: building event-driven and respons...
Reactive Programming for a demanding world: building event-driven and respons...
 
Optimizing Communicating Event-Loop Languages with Truffle
Optimizing Communicating Event-Loop Languages with TruffleOptimizing Communicating Event-Loop Languages with Truffle
Optimizing Communicating Event-Loop Languages with Truffle
 
Multiprocessing with python
Multiprocessing with pythonMultiprocessing with python
Multiprocessing with python
 
Non Blocking I/O for Everyone with RxJava
Non Blocking I/O for Everyone with RxJavaNon Blocking I/O for Everyone with RxJava
Non Blocking I/O for Everyone with RxJava
 
Asynchronous single page applications without a line of HTML or Javascript, o...
Asynchronous single page applications without a line of HTML or Javascript, o...Asynchronous single page applications without a line of HTML or Javascript, o...
Asynchronous single page applications without a line of HTML or Javascript, o...
 
Big-data-analysis-training-in-mumbai
Big-data-analysis-training-in-mumbaiBig-data-analysis-training-in-mumbai
Big-data-analysis-training-in-mumbai
 
Concurrency in Python
Concurrency in PythonConcurrency in Python
Concurrency in Python
 
MAVRL Workshop 2014 - pymatgen-db & custodian
MAVRL Workshop 2014 - pymatgen-db & custodianMAVRL Workshop 2014 - pymatgen-db & custodian
MAVRL Workshop 2014 - pymatgen-db & custodian
 
Michael Häusler – Everyday flink
Michael Häusler – Everyday flinkMichael Häusler – Everyday flink
Michael Häusler – Everyday flink
 
Advanced JavaScript
Advanced JavaScriptAdvanced JavaScript
Advanced JavaScript
 
Objective-C Blocks and Grand Central Dispatch
Objective-C Blocks and Grand Central DispatchObjective-C Blocks and Grand Central Dispatch
Objective-C Blocks and Grand Central Dispatch
 
How and why I turned my old Java projects into a first-class serverless compo...
How and why I turned my old Java projects into a first-class serverless compo...How and why I turned my old Java projects into a first-class serverless compo...
How and why I turned my old Java projects into a first-class serverless compo...
 
Task and Data Parallelism
Task and Data ParallelismTask and Data Parallelism
Task and Data Parallelism
 
Effective testing for spark programs Strata NY 2015
Effective testing for spark programs   Strata NY 2015Effective testing for spark programs   Strata NY 2015
Effective testing for spark programs Strata NY 2015
 
Fuzzing: The New Unit Testing
Fuzzing: The New Unit TestingFuzzing: The New Unit Testing
Fuzzing: The New Unit Testing
 
Comparing different concurrency models on the JVM
Comparing different concurrency models on the JVMComparing different concurrency models on the JVM
Comparing different concurrency models on the JVM
 
QConSF 2014 talk on Netflix Mantis, a stream processing system
QConSF 2014 talk on Netflix Mantis, a stream processing systemQConSF 2014 talk on Netflix Mantis, a stream processing system
QConSF 2014 talk on Netflix Mantis, a stream processing system
 
Jvm profiling under the hood
Jvm profiling under the hoodJvm profiling under the hood
Jvm profiling under the hood
 

Ähnlich wie Streams

Scripting as a Second Language
Scripting as a Second LanguageScripting as a Second Language
Scripting as a Second LanguageRob Dunn
 
TorqueBox: The beauty of Ruby with the power of JBoss. Presented at Devnexus...
TorqueBox: The beauty of Ruby with the power of JBoss.  Presented at Devnexus...TorqueBox: The beauty of Ruby with the power of JBoss.  Presented at Devnexus...
TorqueBox: The beauty of Ruby with the power of JBoss. Presented at Devnexus...bobmcwhirter
 
JavaScript: The Good Parts Or: How A C# Developer Learned To Stop Worrying An...
JavaScript: The Good Parts Or: How A C# Developer Learned To Stop Worrying An...JavaScript: The Good Parts Or: How A C# Developer Learned To Stop Worrying An...
JavaScript: The Good Parts Or: How A C# Developer Learned To Stop Worrying An...Doug Jones
 
Asynchronous I/O in NodeJS - new standard or challenges?
Asynchronous I/O in NodeJS - new standard or challenges?Asynchronous I/O in NodeJS - new standard or challenges?
Asynchronous I/O in NodeJS - new standard or challenges?Dinh Pham
 
540slidesofnodejsbackendhopeitworkforu.pdf
540slidesofnodejsbackendhopeitworkforu.pdf540slidesofnodejsbackendhopeitworkforu.pdf
540slidesofnodejsbackendhopeitworkforu.pdfhamzadamani7
 
node.js, javascript and the future
node.js, javascript and the futurenode.js, javascript and the future
node.js, javascript and the futureJeff Miccolis
 
Node js
Node jsNode js
Node jshazzaz
 
JavaScript(Es5) Interview Questions & Answers
JavaScript(Es5)  Interview Questions & AnswersJavaScript(Es5)  Interview Questions & Answers
JavaScript(Es5) Interview Questions & AnswersRatnala Charan kumar
 
Dragoncraft Architectural Overview
Dragoncraft Architectural OverviewDragoncraft Architectural Overview
Dragoncraft Architectural Overviewjessesanford
 
Intro to Reactive Thinking and RxJava 2
Intro to Reactive Thinking and RxJava 2Intro to Reactive Thinking and RxJava 2
Intro to Reactive Thinking and RxJava 2JollyRogers5
 
Exploiting Multicore CPUs Now: Scalability and Reliability for Off-the-shelf ...
Exploiting Multicore CPUs Now: Scalability and Reliability for Off-the-shelf ...Exploiting Multicore CPUs Now: Scalability and Reliability for Off-the-shelf ...
Exploiting Multicore CPUs Now: Scalability and Reliability for Off-the-shelf ...Emery Berger
 
Node.js: A Guided Tour
Node.js: A Guided TourNode.js: A Guided Tour
Node.js: A Guided Tourcacois
 

Ähnlich wie Streams (20)

Streams in Node.js
Streams in Node.jsStreams in Node.js
Streams in Node.js
 
JavaScript for real men
JavaScript for real menJavaScript for real men
JavaScript for real men
 
Scripting as a Second Language
Scripting as a Second LanguageScripting as a Second Language
Scripting as a Second Language
 
TorqueBox: The beauty of Ruby with the power of JBoss. Presented at Devnexus...
TorqueBox: The beauty of Ruby with the power of JBoss.  Presented at Devnexus...TorqueBox: The beauty of Ruby with the power of JBoss.  Presented at Devnexus...
TorqueBox: The beauty of Ruby with the power of JBoss. Presented at Devnexus...
 
JavaScript: The Good Parts Or: How A C# Developer Learned To Stop Worrying An...
JavaScript: The Good Parts Or: How A C# Developer Learned To Stop Worrying An...JavaScript: The Good Parts Or: How A C# Developer Learned To Stop Worrying An...
JavaScript: The Good Parts Or: How A C# Developer Learned To Stop Worrying An...
 
RxJava@DAUG
RxJava@DAUGRxJava@DAUG
RxJava@DAUG
 
Asynchronous I/O in NodeJS - new standard or challenges?
Asynchronous I/O in NodeJS - new standard or challenges?Asynchronous I/O in NodeJS - new standard or challenges?
Asynchronous I/O in NodeJS - new standard or challenges?
 
540slidesofnodejsbackendhopeitworkforu.pdf
540slidesofnodejsbackendhopeitworkforu.pdf540slidesofnodejsbackendhopeitworkforu.pdf
540slidesofnodejsbackendhopeitworkforu.pdf
 
Tech talk
Tech talkTech talk
Tech talk
 
node.js, javascript and the future
node.js, javascript and the futurenode.js, javascript and the future
node.js, javascript and the future
 
Node js
Node jsNode js
Node js
 
Concur15slides
Concur15slidesConcur15slides
Concur15slides
 
JavaScript(Es5) Interview Questions & Answers
JavaScript(Es5)  Interview Questions & AnswersJavaScript(Es5)  Interview Questions & Answers
JavaScript(Es5) Interview Questions & Answers
 
NodeJS for Beginner
NodeJS for BeginnerNodeJS for Beginner
NodeJS for Beginner
 
Dragoncraft Architectural Overview
Dragoncraft Architectural OverviewDragoncraft Architectural Overview
Dragoncraft Architectural Overview
 
Intro to Reactive Thinking and RxJava 2
Intro to Reactive Thinking and RxJava 2Intro to Reactive Thinking and RxJava 2
Intro to Reactive Thinking and RxJava 2
 
Getting started with typescript
Getting started with typescriptGetting started with typescript
Getting started with typescript
 
Exploiting Multicore CPUs Now: Scalability and Reliability for Off-the-shelf ...
Exploiting Multicore CPUs Now: Scalability and Reliability for Off-the-shelf ...Exploiting Multicore CPUs Now: Scalability and Reliability for Off-the-shelf ...
Exploiting Multicore CPUs Now: Scalability and Reliability for Off-the-shelf ...
 
Node.js: A Guided Tour
Node.js: A Guided TourNode.js: A Guided Tour
Node.js: A Guided Tour
 
Node36
Node36Node36
Node36
 

Mehr von Eugene Lazutkin

Functional practices in JavaScript
Functional practices in JavaScriptFunctional practices in JavaScript
Functional practices in JavaScriptEugene Lazutkin
 
Express: the web server for node.js
Express: the web server for node.jsExpress: the web server for node.js
Express: the web server for node.jsEugene Lazutkin
 
Optimization of modern web applications
Optimization of modern web applicationsOptimization of modern web applications
Optimization of modern web applicationsEugene Lazutkin
 
SSJS, NoSQL, GAE and AppengineJS
SSJS, NoSQL, GAE and AppengineJSSSJS, NoSQL, GAE and AppengineJS
SSJS, NoSQL, GAE and AppengineJSEugene Lazutkin
 
Dojo for programmers (TXJS 2010)
Dojo for programmers (TXJS 2010)Dojo for programmers (TXJS 2010)
Dojo for programmers (TXJS 2010)Eugene Lazutkin
 
Exciting JavaScript - Part II
Exciting JavaScript - Part IIExciting JavaScript - Part II
Exciting JavaScript - Part IIEugene Lazutkin
 
Exciting JavaScript - Part I
Exciting JavaScript - Part IExciting JavaScript - Part I
Exciting JavaScript - Part IEugene Lazutkin
 
Dojo GFX workshop slides
Dojo GFX workshop slidesDojo GFX workshop slides
Dojo GFX workshop slidesEugene Lazutkin
 
Dojo GFX: SVG in the real world
Dojo GFX: SVG in the real worldDojo GFX: SVG in the real world
Dojo GFX: SVG in the real worldEugene Lazutkin
 
DojoX GFX Session Eugene Lazutkin SVG Open 2007
DojoX GFX Session Eugene Lazutkin SVG Open 2007DojoX GFX Session Eugene Lazutkin SVG Open 2007
DojoX GFX Session Eugene Lazutkin SVG Open 2007Eugene Lazutkin
 
DojoX GFX Keynote Eugene Lazutkin SVG Open 2007
DojoX GFX Keynote Eugene Lazutkin SVG Open 2007DojoX GFX Keynote Eugene Lazutkin SVG Open 2007
DojoX GFX Keynote Eugene Lazutkin SVG Open 2007Eugene Lazutkin
 

Mehr von Eugene Lazutkin (19)

Service workers
Service workersService workers
Service workers
 
Advanced I/O in browser
Advanced I/O in browserAdvanced I/O in browser
Advanced I/O in browser
 
Functional practices in JavaScript
Functional practices in JavaScriptFunctional practices in JavaScript
Functional practices in JavaScript
 
Express: the web server for node.js
Express: the web server for node.jsExpress: the web server for node.js
Express: the web server for node.js
 
TXJS 2013 in 10 minutes
TXJS 2013 in 10 minutesTXJS 2013 in 10 minutes
TXJS 2013 in 10 minutes
 
Optimization of modern web applications
Optimization of modern web applicationsOptimization of modern web applications
Optimization of modern web applications
 
OOP in JS
OOP in JSOOP in JS
OOP in JS
 
Pulsar
PulsarPulsar
Pulsar
 
SSJS, NoSQL, GAE and AppengineJS
SSJS, NoSQL, GAE and AppengineJSSSJS, NoSQL, GAE and AppengineJS
SSJS, NoSQL, GAE and AppengineJS
 
Dojo for programmers (TXJS 2010)
Dojo for programmers (TXJS 2010)Dojo for programmers (TXJS 2010)
Dojo for programmers (TXJS 2010)
 
Exciting JavaScript - Part II
Exciting JavaScript - Part IIExciting JavaScript - Part II
Exciting JavaScript - Part II
 
RAD CRUD
RAD CRUDRAD CRUD
RAD CRUD
 
Exciting JavaScript - Part I
Exciting JavaScript - Part IExciting JavaScript - Part I
Exciting JavaScript - Part I
 
CRUD with Dojo
CRUD with DojoCRUD with Dojo
CRUD with Dojo
 
Dojo GFX workshop slides
Dojo GFX workshop slidesDojo GFX workshop slides
Dojo GFX workshop slides
 
Dojo GFX: SVG in the real world
Dojo GFX: SVG in the real worldDojo GFX: SVG in the real world
Dojo GFX: SVG in the real world
 
Dojo (QCon 2007 Slides)
Dojo (QCon 2007 Slides)Dojo (QCon 2007 Slides)
Dojo (QCon 2007 Slides)
 
DojoX GFX Session Eugene Lazutkin SVG Open 2007
DojoX GFX Session Eugene Lazutkin SVG Open 2007DojoX GFX Session Eugene Lazutkin SVG Open 2007
DojoX GFX Session Eugene Lazutkin SVG Open 2007
 
DojoX GFX Keynote Eugene Lazutkin SVG Open 2007
DojoX GFX Keynote Eugene Lazutkin SVG Open 2007DojoX GFX Keynote Eugene Lazutkin SVG Open 2007
DojoX GFX Keynote Eugene Lazutkin SVG Open 2007
 

Último

SQL Server on Azure VM datasheet.dsadaspptx
SQL Server on Azure VM datasheet.dsadaspptxSQL Server on Azure VM datasheet.dsadaspptx
SQL Server on Azure VM datasheet.dsadaspptxJustineGarcia32
 
Mary Meeker Internet Trends Report for 2019
Mary Meeker Internet Trends Report for 2019Mary Meeker Internet Trends Report for 2019
Mary Meeker Internet Trends Report for 2019Eric Johnson
 
Google-Next-Madrid-BBVA-Research inv.pdf
Google-Next-Madrid-BBVA-Research inv.pdfGoogle-Next-Madrid-BBVA-Research inv.pdf
Google-Next-Madrid-BBVA-Research inv.pdfMaria Adalfio
 
overview of Virtualization, concept of Virtualization
overview of Virtualization, concept of Virtualizationoverview of Virtualization, concept of Virtualization
overview of Virtualization, concept of VirtualizationRajan yadav
 
如何办理朴茨茅斯大学毕业证书学位证书成绩单?
如何办理朴茨茅斯大学毕业证书学位证书成绩单?如何办理朴茨茅斯大学毕业证书学位证书成绩单?
如何办理朴茨茅斯大学毕业证书学位证书成绩单?krc0yvm5
 
Benefits of Fiber Internet vs. Traditional Internet.pptx
Benefits of Fiber Internet vs. Traditional Internet.pptxBenefits of Fiber Internet vs. Traditional Internet.pptx
Benefits of Fiber Internet vs. Traditional Internet.pptxlibertyuae uae
 
APNIC Update and RIR Policies for ccTLDs, presented at APTLD 85
APNIC Update and RIR Policies for ccTLDs, presented at APTLD 85APNIC Update and RIR Policies for ccTLDs, presented at APTLD 85
APNIC Update and RIR Policies for ccTLDs, presented at APTLD 85APNIC
 
Tungsten Webinar: v6 & v7 Release Recap, and Beyond
Tungsten Webinar: v6 & v7 Release Recap, and BeyondTungsten Webinar: v6 & v7 Release Recap, and Beyond
Tungsten Webinar: v6 & v7 Release Recap, and BeyondContinuent
 
Section 3 - Technical Sales Foundations for IBM QRadar for Cloud (QRoC)V1 P10...
Section 3 - Technical Sales Foundations for IBM QRadar for Cloud (QRoC)V1 P10...Section 3 - Technical Sales Foundations for IBM QRadar for Cloud (QRoC)V1 P10...
Section 3 - Technical Sales Foundations for IBM QRadar for Cloud (QRoC)V1 P10...hasimatwork
 
Generalities about NFT , as a new technology
Generalities about NFT , as a new technologyGeneralities about NFT , as a new technology
Generalities about NFT , as a new technologysoufianbouktaib1
 

Último (10)

SQL Server on Azure VM datasheet.dsadaspptx
SQL Server on Azure VM datasheet.dsadaspptxSQL Server on Azure VM datasheet.dsadaspptx
SQL Server on Azure VM datasheet.dsadaspptx
 
Mary Meeker Internet Trends Report for 2019
Mary Meeker Internet Trends Report for 2019Mary Meeker Internet Trends Report for 2019
Mary Meeker Internet Trends Report for 2019
 
Google-Next-Madrid-BBVA-Research inv.pdf
Google-Next-Madrid-BBVA-Research inv.pdfGoogle-Next-Madrid-BBVA-Research inv.pdf
Google-Next-Madrid-BBVA-Research inv.pdf
 
overview of Virtualization, concept of Virtualization
overview of Virtualization, concept of Virtualizationoverview of Virtualization, concept of Virtualization
overview of Virtualization, concept of Virtualization
 
如何办理朴茨茅斯大学毕业证书学位证书成绩单?
如何办理朴茨茅斯大学毕业证书学位证书成绩单?如何办理朴茨茅斯大学毕业证书学位证书成绩单?
如何办理朴茨茅斯大学毕业证书学位证书成绩单?
 
Benefits of Fiber Internet vs. Traditional Internet.pptx
Benefits of Fiber Internet vs. Traditional Internet.pptxBenefits of Fiber Internet vs. Traditional Internet.pptx
Benefits of Fiber Internet vs. Traditional Internet.pptx
 
APNIC Update and RIR Policies for ccTLDs, presented at APTLD 85
APNIC Update and RIR Policies for ccTLDs, presented at APTLD 85APNIC Update and RIR Policies for ccTLDs, presented at APTLD 85
APNIC Update and RIR Policies for ccTLDs, presented at APTLD 85
 
Tungsten Webinar: v6 & v7 Release Recap, and Beyond
Tungsten Webinar: v6 & v7 Release Recap, and BeyondTungsten Webinar: v6 & v7 Release Recap, and Beyond
Tungsten Webinar: v6 & v7 Release Recap, and Beyond
 
Section 3 - Technical Sales Foundations for IBM QRadar for Cloud (QRoC)V1 P10...
Section 3 - Technical Sales Foundations for IBM QRadar for Cloud (QRoC)V1 P10...Section 3 - Technical Sales Foundations for IBM QRadar for Cloud (QRoC)V1 P10...
Section 3 - Technical Sales Foundations for IBM QRadar for Cloud (QRoC)V1 P10...
 
Generalities about NFT , as a new technology
Generalities about NFT , as a new technologyGeneralities about NFT , as a new technology
Generalities about NFT , as a new technology
 

Streams