SlideShare ist ein Scribd-Unternehmen logo
1 von 81
JAX 2013
Seth Ladd, Developer Advocate, Dart
#dartlang
Your first-class upgrade to web development
#dartlang
● Language and libraries
● Tools
● VM
● Compiler to JavaScript
#dartlang
require.js
Backbone
Backbone Marionette
jQuery
Modernizr
moment.js
dest templates
PhantomJS
Jasmine
Docs
Docs
Docs
Docs
Docs
Docs
Docs
Docs
Docs
"I just want to
write web
apps!"
"Hi, I want to
build a web
app"
#dartlang
Unit test
Dart SDK
Web UI
Intl
Packages
"Things are
consistent and
clear."
#dartlang
Inside Google
● Dozens to Hundreds of
Engineers
● Millions of Lines of Code
Big and Complex
● GWT
● Closure
● Soy
Lots of Layers
● No edit/refresh
● 24 min to see a change!!
Low Productivity
Surely we can do better!
#dartlang
Improve all the things!
Structure Syntax Semantics Tools Core Libs Requires
Compilation for
Development
Performance
Vanilla JS ---- ---- ---- ---- ----
No
----
Dart No
Closure ----
Yes
----
CoffeeScript ---- ---- ----
Yes
----
TypeScript ---- ----
Yes
----
GWT
Yes
----
#dartlang
Lightning Tour
● Syntax
● Semantics
● Structure
#dartlang
Simple syntax, ceremony free
class Hug { Familiar
#dartlang
Simple syntax, ceremony free
class Hug {
final num strength;
Hug(this.strength); Terse
#dartlang
Simple syntax, ceremony free
class Hug {
final num strength;
Hug(this.strength);
Hug.bear() : strength = 100;
Named constructor
#dartlang
Simple syntax, ceremony free
class Hug {
final num strength;
Hug(this.strength);
Hug.bear() : strength = 100;
Hug operator +(Hug other) {
return new Hug(strength + other.strength);
}
Operator overriding
#dartlang
Simple syntax, ceremony free
class Hug {
final num strength;
Hug(this.strength);
Hug.bear() : strength = 100;
Hug operator +(Hug other) {
return new Hug(strength + other.strength);
}
void patBack({int hands: 1}) {
// ...
}
Named, optional params w/ default value
#dartlang
Simple syntax, ceremony free
class Hug {
final num strength;
Hug(this.strength);
Hug.bear() : strength = 100;
Hug operator +(Hug other) {
return new Hug(strength + other.strength);
}
void patBack({int hands: 1}) {
// ...
}
String toString() => "Embraceometer reads $strength";
}
One-line function
#dartlang
Simple syntax, ceremony free
class Hug {
final num strength;
Hug(this.strength);
Hug.bear() : strength = 100;
Hug operator +(Hug other) {
return new Hug(strength + other.strength);
}
void patBack({int hands: 1}) {
// ...
}
String toString() => "Embraceometer reads $strength";
}
String Interpolation
#dartlang
Clean semantics and behavior
#dartlang
Clean semantics and behavior
Examples:
● Only true is truthy
● There is no undefined, only null
● No type coercion with ==, +
#dartlang
Missing getter?
"hello".missing // ??
Class 'String' has no instance getter 'missing'.
NoSuchMethodError : method not found: 'missing'
Receiver: "hello"
Arguments: []
Logical
More on this soon.
#dartlang
Index out of range?
[][99] // ??
RangeError: 99
Logical
#dartlang
Variable scope?
var foo = 'top-level';
void bar() {
if (!true) { var foo = 'inside'; }
print(foo);
}
main() { bar(); } // ?? What will this print?
top-level Logical
No
hoisting
#dartlang
Scope of `this`?
class AwesomeButton {
AwesomeButton(button) {
button.onClick.listen((Event e) => this.atomicDinosaurRock());
}
atomicDinosaurRock() {
/* ... */
}
}
Lexical
this
#dartlang
Scalable structure
Functions Classes
Libraries
Packages
Mixins Interfaces
library games;
import 'dart:math';
import 'players.dart';
class Darts {
// ...
}
class Bowling {
// ...
}
Player findOpponent(int skillLevel) {
// ...
}
#dartlang
Language
What's
New!
#dartlang
var button = new ButtonElement();
button.id = 'fancy';
button.text = 'Click Point';
button.classes.add('important');
button.onClick.listen((e) => addTopHat());
parentElement.children.add(button);
Yikes! Button is repeated 6 times!
Too many buttons
#dartlang
Method cascades
var button = new ButtonElement()
..id = 'fancy'
..text = 'Click Point'
..classes.add('important')
..onClick.listen((e) => addTopHat());
parentElement.children.add(button);
#dartlang
Inline initialization
parentElement.children.add(new ButtonElement()
..id = 'fancy'
..text = 'Click Point'
..classes.add('important')
..onClick.listen((e) => addTopHat()));
One of these things is not like the other
Object
Persistable
Hug
Hug is not
is-a Persistable
Don't pollute
your
inheritance
tree!
Don't inherit, mixin!
Object
PersistableHug Mixin
#dartlang
Mixins
abstract class Persistable {
save() { ... }
load() { ... }
toJson();
}
class Hug extends Object with Persistable {
Map toJson() => {'strength':10};
}
main() {
var embrace = new Hug();
embrace.save();
}
Extend object &
no constructors?
You can be a
mixin!
Apply the mixin.
Use methods
from mixin.
#dartlang
Metadata
#dartlang
Lazy-load libraries
const lazy = const DeferredLibrary('my_lib');
@lazy
import 'my_lib.dart';
void main() {
lazy.load().then((_) {
print('library loaded');
// use functions from my_lib
});
}
Mark the import
as lazy.
Declare the library is
deferred.
Use a Future to
wait for library to
load.
Dart app
JS file
dart2js
JS file
Dart lib
In progress
#dartlang
Libraries
What's
New!
JS-Interop
#dartlang
YES!
#dartlang
Proxies: the abstraction
var chart; // proxy chart object
callback() {...} callback proxy
#dartlang
JS-Interop example
var api = js.context.chartsApi;
var data = js.array([1,3,3,7]);
var chart = new js.Proxy(api.BubbleChart, query('#chart'));
chart.draw(data);
var api = chartsApi;
var data = [1,3,3,7];
var chart = new api.BubbleChart(querySelector('#chart'));
chart.draw(data);
#dartlang
Mirror-based reflection
● Source code and run-time
● Reflect on classes and
instances
● Introspect and invoke
#dartlang
Using mirrors to build a logging proxy
Client Proxy Delegate
x.hello()
d.hello()
print()
log()
#dartlang
Reflection and metaprogramming
import 'dart:mirrors';
class LoggingProxy {
InstanceMirror mirror;
LoggingProxy(delegate)
: mirror = reflect(delegate);
noSuchMethod(Invocation invocation) {
var name = invocation.memberName;
print('${name} was called');
return mirror.delegate(invocation);
}
}
Import the mirrors
library.
#dartlang
Reflection and metaprogramming
import 'dart:mirrors';
class LoggingProxy {
InstanceMirror mirror;
LoggingProxy(delegate)
: mirror = reflect(delegate);
noSuchMethod(Invocation invocation) {
var name = invocation.memberName;
print('${name} was called');
return mirror.delegate(invocation);
}
}
Get a mirror of an
object.
#dartlang
Reflection and metaprogramming
Capture all calls to
this proxy.
import 'dart:mirrors';
class LoggingProxy {
InstanceMirror mirror;
LoggingProxy(delegate)
: mirror = reflect(delegate);
noSuchMethod(Invocation invocation) {
var name = invocation.memberName;
print('${name} was called');
return mirror.delegate(invocation);
}
}
#dartlang
Reflection and metaprogramming
Log the call.
import 'dart:mirrors';
class LoggingProxy {
InstanceMirror mirror;
LoggingProxy(delegate)
: mirror = reflect(delegate);
noSuchMethod(Invocation invocation) {
var name = invocation.memberName;
print('${name} was called');
return mirror.delegate(invocation);
}
}
#dartlang
Reflection and metaprogramming
Delegate the call
through the
mirror.
import 'dart:mirrors';
class LoggingProxy {
InstanceMirror mirror;
LoggingProxy(delegate)
: mirror = reflect(delegate);
noSuchMethod(Invocation invocation) {
var name = invocation.memberName;
print('${name} was called');
return mirror.delegate(invocation);
}
}
#dartlang
Reflection and metaprogramming
class Greeter {
hello() => print("hello!");
}
void main() {
var greeter = new LoggingProxy(new Greeter());
greeter.hello();
}
// Symbol("hello") was called
// hello!
From LoggingProxy
From Greeter
#dartlang
The web is an async world,
but too many callbacks leads to
Async with callbacks
#dartlang
Async with futures
#dartlang
doStuff((results) {
handle(results);
}, onError: (e) {
handleError(e);
});
Future future = doStuff();
future.then(handle);
future.catchError(handleError);
doStuff()
.then(handle)
.catchError(handleError);
Traditional callbacks Futures
#dartlang
catService.getCatData("cute", (cat) {
catService.getCatPic(cat.imageId, (pic) {
imageWorker.rotate(pic, 30, (rotated) {
draw(rotated);
});
});
});
4 levels
deep!
Scary
#dartlang
catService.getCatData("cute", (cat) {
catService.getCatPic(cat.imageId, (pic) {
imageWorker.rotate(pic, 30, (rotated) {
draw(rotated, onError:(e) { draw(ohNoeImage); });
}, onError: (e) { draw(ohNoeImage); });
}, onError: (e) { draw(ohNoeImage); });
}, onError: (e) { draw(ohNoeImage); });
Duplicate
error
handling!
More scary
#dartlang
catService.getCat("cute")
.then((cat) => catService.getCatPic(cat.imageId))
.then((pic) => imageWorker.rotate(pic, 30))
.then((rotated) => draw(rotated))
.catchError((e) => print("Oh noes!"));
The Future looks bright
Future cute = catService.getPic("cute");
Future nyan = catService.getPic("nyan");
Future.wait([cute, nyan])
.then((pics) => imageWorker.blend(pics[0], pics[1]))
.then((cuteNyan) => draw(cuteNyan))
.catchError((e) => print("Oh noes!"));
#dartlang
Request two
pics.
Wait for both
to arrive.Work with
both pics.
Composing futures
Streams are the repeating analog to Futures.
Nearly all repeating events in Dart are Streams.
#dartlang
StreamsNew!
query('textarea').onKeyPress
.where((e) => e.keyCode >= 32 && e.keyCode <= 122)
.map((e) => new String.fromCharCode(e.charCode))
.first
.then((char) => print('First char=$char'));
#dartlang
Element abstract class
...
final Stream<KeyboardEvent> onKeyPress
api.dartlang.org
#dartlang
HTML
What's
New!
window.navigator.getUserMedia(audio:true, video: true)
.then((mediaStream) {
var video = new VideoElement()
..autoplay = true
..src = Url.createObjectUrl(mediaStream)
..onLoadedMetadata.listen((e) => /* ... */);
document.body.append(video);
})
.catchError(reportIssue);
#dartlang
Web programming with Dart
String name = (query('#cat-name') as InputElement).value;
HttpRequest.request('/cats',
method: 'POST',
sendData: stringify({'name':name}),
requestHeaders: {'Content-Type': 'application/json'})
.then((req) {
catNames.add(name);
})
.catchError((e) => print(e));
#dartlang
XHR with Dart
@observable
class Person {
String name = '';
}
@observable
List people = toObservable([]);
addPerson() => people.add(new Person());
#dartlang
Data Binding
<button on-click="addPerson()">Add</button>
<ul>
<template repeat="p in people">
<li>{{p.name}} - <input type="text" bind-value="p.name"></li>
</template>
</ul>
#dartlang
Encapsulation
Custom Element
Structure Behavior Styles
<link rel="import" href="clickcounter.html">
...
<div is="click-counter" id="click_counter" count="{{startingCount}}"></div>
#dartlang
Custom Elements
Import the custom element code.
Use the custom element.
#dartlang
Custom Elements
<element name="click-counter" constructor="CounterComponent" extends="div">
<template>
<button on-click="increment()">Click me</button><br />
<span>(click count: {{count}})</span>
</template>
<script type="application/dart" src="xclickcounter.dart"></script>
</element>
class CounterComponent extends WebComponent {
int count = 0;
void increment() {
count++;
}
}
#dartlang
Tools &
Ecosystem
What's
New!
#dartlang
Fast development cycles
Dartium: Chromium + Dart VM
Inception Development
dart2js
Delivery
Test Other
Browsers
No compiles required! Compile to JS
#dartlang
#dartlang
try.dartlang.org
#dartlang
test('add', () {
var answer = add(1, 2);
expect(answer, equals(3));
});
Continuous integration, native Dart support
Headless Chrome, command-line testing
#dartlang
● Download
● Manage
● Publish
● Browse
Pub, a package manager for Dart
Available in pub.dartlang.org:
● MVC frameworks
● Template systems
● Google APIs
● Encryption
● Server-side frameworks
● DB drivers
● Parsers
● Game libraries
● Much, much more!
#dartlang
Export Flash movies/games
to Dart from Flash Pro
#dartlang
Size & Speed
What's
New!
#dartlang
More complex apps
#perfmatters
#dartlang
Better performance == Better battery
#perfmatters
#dartlang
dart2js
Generating smaller JavaScript
Libraries
app.dart
Libraries
app.js
Packages
Packages
Tree shaking
Minification
Type
inferencing
Source
Map
#dartlang
Generated JS with dart:html
import 'dart:html';
class Person {
String firstName;
String lastName;
Person(this.firstName, this.lastName);
}
main() {
var bob = new Person('Bob', 'Smith');
var msg = query('#msg');
msg.text = bob.firstName;
}
$$.Person = {"": "Object;firstName,lastName"};
$.Person$ = function(firstName, lastName) {
return new $.Person(firstName, lastName);
};
$.main = function() {
var bob = $.Person$("Bob", "Smith");
document.querySelector("#msg")
.textContent = bob.firstName;
};
#dartlang
Generated JS, minified!
$$.mM={"":"a;Sz,dq"}
$.PH=function(a,b){return new $.mM(a,b)}
$.E2=function(){var z=$.PH("Bob","Smith")
document.querySelector("#msg").textContent=z.Sz}
$$.Person = {"": "Object;firstName,lastName"};
$.Person$ = function(firstName, lastName) {
return new $.Person(firstName, lastName);
};
$.main = function() {
var bob = $.Person$("Bob", "Smith");
document.querySelector("#msg").textContent = bob.firstName;
};
Minified
#dartlang
main() Library
func1 func2 funcX funcY
imports
calls
Tree-shaking
compiler (dart2js)
main() func2 funcX
#dartlang
Dart VM
#dartlang
More structure, less baggage
● Explicit and static structure
● Real arrays
● Real classes
● Direct calls, no prototype chains to check
● Globally track field types
#dartlang
Unlock more of your CPU
SIMD
SIMD
#dartlang
Higher is better, as of 2013/05/12dartlang.org/performance
2X
#dartlang
Higher is better, as of 2013/05/12x86, Chrome for Android
1.48X
2.42X
● Server-side
● Testing
● Isolates for concurrency
● Lots more...
There's more new stuff!
#dartlang
Try Dart!
● Download from dartlang.org
● Join +Dartisans
● Send pull requests at Github
● Ask on Stack Overflow
#dartlang
#dartlang
● Stable language
● Stable core libs
● Compiles to JavaScript
● Evolved platform
● Commitment
Ready for
your app!
Thank You!
Find us at dartlang.org
#dartlang

Weitere ähnliche Inhalte

Was ist angesagt?

JS Frameworks Day April,26 of 2014
JS Frameworks Day April,26 of 2014JS Frameworks Day April,26 of 2014
JS Frameworks Day April,26 of 2014DA-14
 
Introduction to web programming for java and c# programmers by @drpicox
Introduction to web programming for java and c# programmers by @drpicoxIntroduction to web programming for java and c# programmers by @drpicox
Introduction to web programming for java and c# programmers by @drpicoxDavid Rodenas
 
Clean Lambdas & Streams in Java8
Clean Lambdas & Streams in Java8Clean Lambdas & Streams in Java8
Clean Lambdas & Streams in Java8Victor Rentea
 
Pharo Optimising JIT Internals
Pharo Optimising JIT InternalsPharo Optimising JIT Internals
Pharo Optimising JIT InternalsESUG
 
When Enterprise Java Micro Profile meets Angular
When Enterprise Java Micro Profile meets AngularWhen Enterprise Java Micro Profile meets Angular
When Enterprise Java Micro Profile meets AngularAntonio Goncalves
 
Testing Javascript with Jasmine
Testing Javascript with JasmineTesting Javascript with Jasmine
Testing Javascript with JasmineTim Tyrrell
 
Living With Legacy Code
Living With Legacy CodeLiving With Legacy Code
Living With Legacy CodeRowan Merewood
 
Integration testing with spring @snow one
Integration testing with spring @snow oneIntegration testing with spring @snow one
Integration testing with spring @snow oneVictor Rentea
 
Pure functions and immutable objects @dev nexus 2021
Pure functions and immutable objects @dev nexus 2021Pure functions and immutable objects @dev nexus 2021
Pure functions and immutable objects @dev nexus 2021Victor Rentea
 
Working Effectively With Legacy Code
Working Effectively With Legacy CodeWorking Effectively With Legacy Code
Working Effectively With Legacy Codescidept
 
Advanced Jasmine - Front-End JavaScript Unit Testing
Advanced Jasmine - Front-End JavaScript Unit TestingAdvanced Jasmine - Front-End JavaScript Unit Testing
Advanced Jasmine - Front-End JavaScript Unit TestingLars Thorup
 
PHPSpec & Behat: Two Testing Tools That Write Code For You (#phptek edition)
PHPSpec & Behat: Two Testing Tools That Write Code For You (#phptek edition)PHPSpec & Behat: Two Testing Tools That Write Code For You (#phptek edition)
PHPSpec & Behat: Two Testing Tools That Write Code For You (#phptek edition)Joshua Warren
 
Intro to Unit Testing in AngularJS
Intro to Unit Testing in AngularJSIntro to Unit Testing in AngularJS
Intro to Unit Testing in AngularJSJim Lynch
 
The Proxy Fairy, and The Magic of Spring Framework
The Proxy Fairy, and The Magic of Spring FrameworkThe Proxy Fairy, and The Magic of Spring Framework
The Proxy Fairy, and The Magic of Spring FrameworkVictor Rentea
 
Jasmine - why JS tests don't smell fishy
Jasmine - why JS tests don't smell fishyJasmine - why JS tests don't smell fishy
Jasmine - why JS tests don't smell fishyIgor Napierala
 
JavaScript Test-Driven Development with Jasmine 2.0 and Karma
JavaScript Test-Driven Development with Jasmine 2.0 and Karma JavaScript Test-Driven Development with Jasmine 2.0 and Karma
JavaScript Test-Driven Development with Jasmine 2.0 and Karma Christopher Bartling
 
The Art of Clean code
The Art of Clean codeThe Art of Clean code
The Art of Clean codeVictor Rentea
 
Test-Driven Development of AngularJS Applications
Test-Driven Development of AngularJS ApplicationsTest-Driven Development of AngularJS Applications
Test-Driven Development of AngularJS ApplicationsFITC
 
Creating Gradle Plugins - GR8Conf US
Creating Gradle Plugins - GR8Conf USCreating Gradle Plugins - GR8Conf US
Creating Gradle Plugins - GR8Conf USAnnyce Davis
 

Was ist angesagt? (20)

JS Frameworks Day April,26 of 2014
JS Frameworks Day April,26 of 2014JS Frameworks Day April,26 of 2014
JS Frameworks Day April,26 of 2014
 
Introduction to web programming for java and c# programmers by @drpicox
Introduction to web programming for java and c# programmers by @drpicoxIntroduction to web programming for java and c# programmers by @drpicox
Introduction to web programming for java and c# programmers by @drpicox
 
Clean Lambdas & Streams in Java8
Clean Lambdas & Streams in Java8Clean Lambdas & Streams in Java8
Clean Lambdas & Streams in Java8
 
Pharo Optimising JIT Internals
Pharo Optimising JIT InternalsPharo Optimising JIT Internals
Pharo Optimising JIT Internals
 
When Enterprise Java Micro Profile meets Angular
When Enterprise Java Micro Profile meets AngularWhen Enterprise Java Micro Profile meets Angular
When Enterprise Java Micro Profile meets Angular
 
Testing Javascript with Jasmine
Testing Javascript with JasmineTesting Javascript with Jasmine
Testing Javascript with Jasmine
 
Living With Legacy Code
Living With Legacy CodeLiving With Legacy Code
Living With Legacy Code
 
Integration testing with spring @snow one
Integration testing with spring @snow oneIntegration testing with spring @snow one
Integration testing with spring @snow one
 
Pure functions and immutable objects @dev nexus 2021
Pure functions and immutable objects @dev nexus 2021Pure functions and immutable objects @dev nexus 2021
Pure functions and immutable objects @dev nexus 2021
 
Working Effectively With Legacy Code
Working Effectively With Legacy CodeWorking Effectively With Legacy Code
Working Effectively With Legacy Code
 
Advanced Jasmine - Front-End JavaScript Unit Testing
Advanced Jasmine - Front-End JavaScript Unit TestingAdvanced Jasmine - Front-End JavaScript Unit Testing
Advanced Jasmine - Front-End JavaScript Unit Testing
 
PHPSpec & Behat: Two Testing Tools That Write Code For You (#phptek edition)
PHPSpec & Behat: Two Testing Tools That Write Code For You (#phptek edition)PHPSpec & Behat: Two Testing Tools That Write Code For You (#phptek edition)
PHPSpec & Behat: Two Testing Tools That Write Code For You (#phptek edition)
 
Zen of Akka
Zen of AkkaZen of Akka
Zen of Akka
 
Intro to Unit Testing in AngularJS
Intro to Unit Testing in AngularJSIntro to Unit Testing in AngularJS
Intro to Unit Testing in AngularJS
 
The Proxy Fairy, and The Magic of Spring Framework
The Proxy Fairy, and The Magic of Spring FrameworkThe Proxy Fairy, and The Magic of Spring Framework
The Proxy Fairy, and The Magic of Spring Framework
 
Jasmine - why JS tests don't smell fishy
Jasmine - why JS tests don't smell fishyJasmine - why JS tests don't smell fishy
Jasmine - why JS tests don't smell fishy
 
JavaScript Test-Driven Development with Jasmine 2.0 and Karma
JavaScript Test-Driven Development with Jasmine 2.0 and Karma JavaScript Test-Driven Development with Jasmine 2.0 and Karma
JavaScript Test-Driven Development with Jasmine 2.0 and Karma
 
The Art of Clean code
The Art of Clean codeThe Art of Clean code
The Art of Clean code
 
Test-Driven Development of AngularJS Applications
Test-Driven Development of AngularJS ApplicationsTest-Driven Development of AngularJS Applications
Test-Driven Development of AngularJS Applications
 
Creating Gradle Plugins - GR8Conf US
Creating Gradle Plugins - GR8Conf USCreating Gradle Plugins - GR8Conf US
Creating Gradle Plugins - GR8Conf US
 

Ähnlich wie What’s new in Google Dart - Seth Ladd

Learn Dart And Angular, Get Your Web Development Wings With Kevin Moore
Learn Dart And Angular, Get Your Web Development Wings With Kevin MooreLearn Dart And Angular, Get Your Web Development Wings With Kevin Moore
Learn Dart And Angular, Get Your Web Development Wings With Kevin MooreCodeCore
 
Structured web programming
Structured web programmingStructured web programming
Structured web programmingahfast
 
HTML5 for the Silverlight Guy
HTML5 for the Silverlight GuyHTML5 for the Silverlight Guy
HTML5 for the Silverlight GuyDavid Padbury
 
Dart structured web apps
Dart   structured web appsDart   structured web apps
Dart structured web appschrisbuckett
 
Dart, unicorns and rainbows
Dart, unicorns and rainbowsDart, unicorns and rainbows
Dart, unicorns and rainbowschrisbuckett
 
Dart, Darrt, Darrrt
Dart, Darrt, DarrrtDart, Darrt, Darrrt
Dart, Darrt, DarrrtJana Moudrá
 
JavaScript Growing Up
JavaScript Growing UpJavaScript Growing Up
JavaScript Growing UpDavid Padbury
 
Building native Android applications with Mirah and Pindah
Building native Android applications with Mirah and PindahBuilding native Android applications with Mirah and Pindah
Building native Android applications with Mirah and PindahNick Plante
 
Taking Jenkins Pipeline to the Extreme
Taking Jenkins Pipeline to the ExtremeTaking Jenkins Pipeline to the Extreme
Taking Jenkins Pipeline to the Extremeyinonavraham
 
Hacking with ruby2ruby
Hacking with ruby2rubyHacking with ruby2ruby
Hacking with ruby2rubyMarc Chung
 
Javascript unit testing, yes we can e big
Javascript unit testing, yes we can   e bigJavascript unit testing, yes we can   e big
Javascript unit testing, yes we can e bigAndy Peterson
 
Dart for Java Developers
Dart for Java DevelopersDart for Java Developers
Dart for Java DevelopersYakov Fain
 
Modeling Patterns for JavaScript Browser-Based Games
Modeling Patterns for JavaScript Browser-Based GamesModeling Patterns for JavaScript Browser-Based Games
Modeling Patterns for JavaScript Browser-Based GamesRay Toal
 
The curious Life of JavaScript - Talk at SI-SE 2015
The curious Life of JavaScript - Talk at SI-SE 2015The curious Life of JavaScript - Talk at SI-SE 2015
The curious Life of JavaScript - Talk at SI-SE 2015jbandi
 
Anatomy of a Gradle plugin
Anatomy of a Gradle pluginAnatomy of a Gradle plugin
Anatomy of a Gradle pluginDmytro Zaitsev
 
Smoothing Your Java with DSLs
Smoothing Your Java with DSLsSmoothing Your Java with DSLs
Smoothing Your Java with DSLsintelliyole
 

Ähnlich wie What’s new in Google Dart - Seth Ladd (20)

Learn Dart And Angular, Get Your Web Development Wings With Kevin Moore
Learn Dart And Angular, Get Your Web Development Wings With Kevin MooreLearn Dart And Angular, Get Your Web Development Wings With Kevin Moore
Learn Dart And Angular, Get Your Web Development Wings With Kevin Moore
 
Dart Workshop
Dart WorkshopDart Workshop
Dart Workshop
 
Structured web programming
Structured web programmingStructured web programming
Structured web programming
 
HTML5 for the Silverlight Guy
HTML5 for the Silverlight GuyHTML5 for the Silverlight Guy
HTML5 for the Silverlight Guy
 
Dart structured web apps
Dart   structured web appsDart   structured web apps
Dart structured web apps
 
Dart, unicorns and rainbows
Dart, unicorns and rainbowsDart, unicorns and rainbows
Dart, unicorns and rainbows
 
Dart, Darrt, Darrrt
Dart, Darrt, DarrrtDart, Darrt, Darrrt
Dart, Darrt, Darrrt
 
Having Fun with Play
Having Fun with PlayHaving Fun with Play
Having Fun with Play
 
JavaScript Growing Up
JavaScript Growing UpJavaScript Growing Up
JavaScript Growing Up
 
Introduction to Dart
Introduction to DartIntroduction to Dart
Introduction to Dart
 
Building native Android applications with Mirah and Pindah
Building native Android applications with Mirah and PindahBuilding native Android applications with Mirah and Pindah
Building native Android applications with Mirah and Pindah
 
Taking Jenkins Pipeline to the Extreme
Taking Jenkins Pipeline to the ExtremeTaking Jenkins Pipeline to the Extreme
Taking Jenkins Pipeline to the Extreme
 
Hacking with ruby2ruby
Hacking with ruby2rubyHacking with ruby2ruby
Hacking with ruby2ruby
 
Javascript unit testing, yes we can e big
Javascript unit testing, yes we can   e bigJavascript unit testing, yes we can   e big
Javascript unit testing, yes we can e big
 
Dart for Java Developers
Dart for Java DevelopersDart for Java Developers
Dart for Java Developers
 
Scala at Netflix
Scala at NetflixScala at Netflix
Scala at Netflix
 
Modeling Patterns for JavaScript Browser-Based Games
Modeling Patterns for JavaScript Browser-Based GamesModeling Patterns for JavaScript Browser-Based Games
Modeling Patterns for JavaScript Browser-Based Games
 
The curious Life of JavaScript - Talk at SI-SE 2015
The curious Life of JavaScript - Talk at SI-SE 2015The curious Life of JavaScript - Talk at SI-SE 2015
The curious Life of JavaScript - Talk at SI-SE 2015
 
Anatomy of a Gradle plugin
Anatomy of a Gradle pluginAnatomy of a Gradle plugin
Anatomy of a Gradle plugin
 
Smoothing Your Java with DSLs
Smoothing Your Java with DSLsSmoothing Your Java with DSLs
Smoothing Your Java with DSLs
 

Kürzlich hochgeladen

SQL Database Design For Developers at php[tek] 2024
SQL Database Design For Developers at php[tek] 2024SQL Database Design For Developers at php[tek] 2024
SQL Database Design For Developers at php[tek] 2024Scott Keck-Warren
 
Transforming Data Streams with Kafka Connect: An Introduction to Single Messa...
Transforming Data Streams with Kafka Connect: An Introduction to Single Messa...Transforming Data Streams with Kafka Connect: An Introduction to Single Messa...
Transforming Data Streams with Kafka Connect: An Introduction to Single Messa...HostedbyConfluent
 
🐬 The future of MySQL is Postgres 🐘
🐬  The future of MySQL is Postgres   🐘🐬  The future of MySQL is Postgres   🐘
🐬 The future of MySQL is Postgres 🐘RTylerCroy
 
Scaling API-first – The story of a global engineering organization
Scaling API-first – The story of a global engineering organizationScaling API-first – The story of a global engineering organization
Scaling API-first – The story of a global engineering organizationRadu Cotescu
 
Transcript: #StandardsGoals for 2024: What’s new for BISAC - Tech Forum 2024
Transcript: #StandardsGoals for 2024: What’s new for BISAC - Tech Forum 2024Transcript: #StandardsGoals for 2024: What’s new for BISAC - Tech Forum 2024
Transcript: #StandardsGoals for 2024: What’s new for BISAC - Tech Forum 2024BookNet Canada
 
The Codex of Business Writing Software for Real-World Solutions 2.pptx
The Codex of Business Writing Software for Real-World Solutions 2.pptxThe Codex of Business Writing Software for Real-World Solutions 2.pptx
The Codex of Business Writing Software for Real-World Solutions 2.pptxMalak Abu Hammad
 
From Event to Action: Accelerate Your Decision Making with Real-Time Automation
From Event to Action: Accelerate Your Decision Making with Real-Time AutomationFrom Event to Action: Accelerate Your Decision Making with Real-Time Automation
From Event to Action: Accelerate Your Decision Making with Real-Time AutomationSafe Software
 
Slack Application Development 101 Slides
Slack Application Development 101 SlidesSlack Application Development 101 Slides
Slack Application Development 101 Slidespraypatel2
 
CNv6 Instructor Chapter 6 Quality of Service
CNv6 Instructor Chapter 6 Quality of ServiceCNv6 Instructor Chapter 6 Quality of Service
CNv6 Instructor Chapter 6 Quality of Servicegiselly40
 
08448380779 Call Girls In Civil Lines Women Seeking Men
08448380779 Call Girls In Civil Lines Women Seeking Men08448380779 Call Girls In Civil Lines Women Seeking Men
08448380779 Call Girls In Civil Lines Women Seeking MenDelhi Call girls
 
Data Cloud, More than a CDP by Matt Robison
Data Cloud, More than a CDP by Matt RobisonData Cloud, More than a CDP by Matt Robison
Data Cloud, More than a CDP by Matt RobisonAnna Loughnan Colquhoun
 
08448380779 Call Girls In Greater Kailash - I Women Seeking Men
08448380779 Call Girls In Greater Kailash - I Women Seeking Men08448380779 Call Girls In Greater Kailash - I Women Seeking Men
08448380779 Call Girls In Greater Kailash - I Women Seeking MenDelhi Call girls
 
Histor y of HAM Radio presentation slide
Histor y of HAM Radio presentation slideHistor y of HAM Radio presentation slide
Histor y of HAM Radio presentation slidevu2urc
 
08448380779 Call Girls In Friends Colony Women Seeking Men
08448380779 Call Girls In Friends Colony Women Seeking Men08448380779 Call Girls In Friends Colony Women Seeking Men
08448380779 Call Girls In Friends Colony Women Seeking MenDelhi Call girls
 
How to convert PDF to text with Nanonets
How to convert PDF to text with NanonetsHow to convert PDF to text with Nanonets
How to convert PDF to text with Nanonetsnaman860154
 
Enhancing Worker Digital Experience: A Hands-on Workshop for Partners
Enhancing Worker Digital Experience: A Hands-on Workshop for PartnersEnhancing Worker Digital Experience: A Hands-on Workshop for Partners
Enhancing Worker Digital Experience: A Hands-on Workshop for PartnersThousandEyes
 
Tech-Forward - Achieving Business Readiness For Copilot in Microsoft 365
Tech-Forward - Achieving Business Readiness For Copilot in Microsoft 365Tech-Forward - Achieving Business Readiness For Copilot in Microsoft 365
Tech-Forward - Achieving Business Readiness For Copilot in Microsoft 3652toLead Limited
 
The 7 Things I Know About Cyber Security After 25 Years | April 2024
The 7 Things I Know About Cyber Security After 25 Years | April 2024The 7 Things I Know About Cyber Security After 25 Years | April 2024
The 7 Things I Know About Cyber Security After 25 Years | April 2024Rafal Los
 
WhatsApp 9892124323 ✓Call Girls In Kalyan ( Mumbai ) secure service
WhatsApp 9892124323 ✓Call Girls In Kalyan ( Mumbai ) secure serviceWhatsApp 9892124323 ✓Call Girls In Kalyan ( Mumbai ) secure service
WhatsApp 9892124323 ✓Call Girls In Kalyan ( Mumbai ) secure servicePooja Nehwal
 
Breaking the Kubernetes Kill Chain: Host Path Mount
Breaking the Kubernetes Kill Chain: Host Path MountBreaking the Kubernetes Kill Chain: Host Path Mount
Breaking the Kubernetes Kill Chain: Host Path MountPuma Security, LLC
 

Kürzlich hochgeladen (20)

SQL Database Design For Developers at php[tek] 2024
SQL Database Design For Developers at php[tek] 2024SQL Database Design For Developers at php[tek] 2024
SQL Database Design For Developers at php[tek] 2024
 
Transforming Data Streams with Kafka Connect: An Introduction to Single Messa...
Transforming Data Streams with Kafka Connect: An Introduction to Single Messa...Transforming Data Streams with Kafka Connect: An Introduction to Single Messa...
Transforming Data Streams with Kafka Connect: An Introduction to Single Messa...
 
🐬 The future of MySQL is Postgres 🐘
🐬  The future of MySQL is Postgres   🐘🐬  The future of MySQL is Postgres   🐘
🐬 The future of MySQL is Postgres 🐘
 
Scaling API-first – The story of a global engineering organization
Scaling API-first – The story of a global engineering organizationScaling API-first – The story of a global engineering organization
Scaling API-first – The story of a global engineering organization
 
Transcript: #StandardsGoals for 2024: What’s new for BISAC - Tech Forum 2024
Transcript: #StandardsGoals for 2024: What’s new for BISAC - Tech Forum 2024Transcript: #StandardsGoals for 2024: What’s new for BISAC - Tech Forum 2024
Transcript: #StandardsGoals for 2024: What’s new for BISAC - Tech Forum 2024
 
The Codex of Business Writing Software for Real-World Solutions 2.pptx
The Codex of Business Writing Software for Real-World Solutions 2.pptxThe Codex of Business Writing Software for Real-World Solutions 2.pptx
The Codex of Business Writing Software for Real-World Solutions 2.pptx
 
From Event to Action: Accelerate Your Decision Making with Real-Time Automation
From Event to Action: Accelerate Your Decision Making with Real-Time AutomationFrom Event to Action: Accelerate Your Decision Making with Real-Time Automation
From Event to Action: Accelerate Your Decision Making with Real-Time Automation
 
Slack Application Development 101 Slides
Slack Application Development 101 SlidesSlack Application Development 101 Slides
Slack Application Development 101 Slides
 
CNv6 Instructor Chapter 6 Quality of Service
CNv6 Instructor Chapter 6 Quality of ServiceCNv6 Instructor Chapter 6 Quality of Service
CNv6 Instructor Chapter 6 Quality of Service
 
08448380779 Call Girls In Civil Lines Women Seeking Men
08448380779 Call Girls In Civil Lines Women Seeking Men08448380779 Call Girls In Civil Lines Women Seeking Men
08448380779 Call Girls In Civil Lines Women Seeking Men
 
Data Cloud, More than a CDP by Matt Robison
Data Cloud, More than a CDP by Matt RobisonData Cloud, More than a CDP by Matt Robison
Data Cloud, More than a CDP by Matt Robison
 
08448380779 Call Girls In Greater Kailash - I Women Seeking Men
08448380779 Call Girls In Greater Kailash - I Women Seeking Men08448380779 Call Girls In Greater Kailash - I Women Seeking Men
08448380779 Call Girls In Greater Kailash - I Women Seeking Men
 
Histor y of HAM Radio presentation slide
Histor y of HAM Radio presentation slideHistor y of HAM Radio presentation slide
Histor y of HAM Radio presentation slide
 
08448380779 Call Girls In Friends Colony Women Seeking Men
08448380779 Call Girls In Friends Colony Women Seeking Men08448380779 Call Girls In Friends Colony Women Seeking Men
08448380779 Call Girls In Friends Colony Women Seeking Men
 
How to convert PDF to text with Nanonets
How to convert PDF to text with NanonetsHow to convert PDF to text with Nanonets
How to convert PDF to text with Nanonets
 
Enhancing Worker Digital Experience: A Hands-on Workshop for Partners
Enhancing Worker Digital Experience: A Hands-on Workshop for PartnersEnhancing Worker Digital Experience: A Hands-on Workshop for Partners
Enhancing Worker Digital Experience: A Hands-on Workshop for Partners
 
Tech-Forward - Achieving Business Readiness For Copilot in Microsoft 365
Tech-Forward - Achieving Business Readiness For Copilot in Microsoft 365Tech-Forward - Achieving Business Readiness For Copilot in Microsoft 365
Tech-Forward - Achieving Business Readiness For Copilot in Microsoft 365
 
The 7 Things I Know About Cyber Security After 25 Years | April 2024
The 7 Things I Know About Cyber Security After 25 Years | April 2024The 7 Things I Know About Cyber Security After 25 Years | April 2024
The 7 Things I Know About Cyber Security After 25 Years | April 2024
 
WhatsApp 9892124323 ✓Call Girls In Kalyan ( Mumbai ) secure service
WhatsApp 9892124323 ✓Call Girls In Kalyan ( Mumbai ) secure serviceWhatsApp 9892124323 ✓Call Girls In Kalyan ( Mumbai ) secure service
WhatsApp 9892124323 ✓Call Girls In Kalyan ( Mumbai ) secure service
 
Breaking the Kubernetes Kill Chain: Host Path Mount
Breaking the Kubernetes Kill Chain: Host Path MountBreaking the Kubernetes Kill Chain: Host Path Mount
Breaking the Kubernetes Kill Chain: Host Path Mount
 

What’s new in Google Dart - Seth Ladd