SlideShare una empresa de Scribd logo
1 de 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

Más contenido relacionado

La actualidad más candente

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
 

La actualidad más candente (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
 

Similar a 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
 

Similar a 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
 

Último

Axa Assurance Maroc - Insurer Innovation Award 2024
Axa Assurance Maroc - Insurer Innovation Award 2024Axa Assurance Maroc - Insurer Innovation Award 2024
Axa Assurance Maroc - Insurer Innovation Award 2024The Digital Insurer
 
presentation ICT roal in 21st century education
presentation ICT roal in 21st century educationpresentation ICT roal in 21st century education
presentation ICT roal in 21st century educationjfdjdjcjdnsjd
 
Boost PC performance: How more available memory can improve productivity
Boost PC performance: How more available memory can improve productivityBoost PC performance: How more available memory can improve productivity
Boost PC performance: How more available memory can improve productivityPrincipled Technologies
 
Workshop - Best of Both Worlds_ Combine KG and Vector search for enhanced R...
Workshop - Best of Both Worlds_ Combine  KG and Vector search for  enhanced R...Workshop - Best of Both Worlds_ Combine  KG and Vector search for  enhanced R...
Workshop - Best of Both Worlds_ Combine KG and Vector search for enhanced R...Neo4j
 
Automating Google Workspace (GWS) & more with Apps Script
Automating Google Workspace (GWS) & more with Apps ScriptAutomating Google Workspace (GWS) & more with Apps Script
Automating Google Workspace (GWS) & more with Apps Scriptwesley chun
 
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
 
How to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected WorkerHow to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected WorkerThousandEyes
 
What Are The Drone Anti-jamming Systems Technology?
What Are The Drone Anti-jamming Systems Technology?What Are The Drone Anti-jamming Systems Technology?
What Are The Drone Anti-jamming Systems Technology?Antenna Manufacturer Coco
 
Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...
Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...
Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...apidays
 
Real Time Object Detection Using Open CV
Real Time Object Detection Using Open CVReal Time Object Detection Using Open CV
Real Time Object Detection Using Open CVKhem
 
Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024
Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024
Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024The Digital Insurer
 
Exploring the Future Potential of AI-Enabled Smartphone Processors
Exploring the Future Potential of AI-Enabled Smartphone ProcessorsExploring the Future Potential of AI-Enabled Smartphone Processors
Exploring the Future Potential of AI-Enabled Smartphone Processorsdebabhi2
 
Boost Fertility New Invention Ups Success Rates.pdf
Boost Fertility New Invention Ups Success Rates.pdfBoost Fertility New Invention Ups Success Rates.pdf
Boost Fertility New Invention Ups Success Rates.pdfsudhanshuwaghmare1
 
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
 
A Year of the Servo Reboot: Where Are We Now?
A Year of the Servo Reboot: Where Are We Now?A Year of the Servo Reboot: Where Are We Now?
A Year of the Servo Reboot: Where Are We Now?Igalia
 
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
 
TrustArc Webinar - Stay Ahead of US State Data Privacy Law Developments
TrustArc Webinar - Stay Ahead of US State Data Privacy Law DevelopmentsTrustArc Webinar - Stay Ahead of US State Data Privacy Law Developments
TrustArc Webinar - Stay Ahead of US State Data Privacy Law DevelopmentsTrustArc
 
HTML Injection Attacks: Impact and Mitigation Strategies
HTML Injection Attacks: Impact and Mitigation StrategiesHTML Injection Attacks: Impact and Mitigation Strategies
HTML Injection Attacks: Impact and Mitigation StrategiesBoston Institute of Analytics
 
Tech Trends Report 2024 Future Today Institute.pdf
Tech Trends Report 2024 Future Today Institute.pdfTech Trends Report 2024 Future Today Institute.pdf
Tech Trends Report 2024 Future Today Institute.pdfhans926745
 

Último (20)

Axa Assurance Maroc - Insurer Innovation Award 2024
Axa Assurance Maroc - Insurer Innovation Award 2024Axa Assurance Maroc - Insurer Innovation Award 2024
Axa Assurance Maroc - Insurer Innovation Award 2024
 
presentation ICT roal in 21st century education
presentation ICT roal in 21st century educationpresentation ICT roal in 21st century education
presentation ICT roal in 21st century education
 
Boost PC performance: How more available memory can improve productivity
Boost PC performance: How more available memory can improve productivityBoost PC performance: How more available memory can improve productivity
Boost PC performance: How more available memory can improve productivity
 
+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...
+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...
+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...
 
Workshop - Best of Both Worlds_ Combine KG and Vector search for enhanced R...
Workshop - Best of Both Worlds_ Combine  KG and Vector search for  enhanced R...Workshop - Best of Both Worlds_ Combine  KG and Vector search for  enhanced R...
Workshop - Best of Both Worlds_ Combine KG and Vector search for enhanced R...
 
Automating Google Workspace (GWS) & more with Apps Script
Automating Google Workspace (GWS) & more with Apps ScriptAutomating Google Workspace (GWS) & more with Apps Script
Automating Google Workspace (GWS) & more with Apps Script
 
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
 
How to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected WorkerHow to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected Worker
 
What Are The Drone Anti-jamming Systems Technology?
What Are The Drone Anti-jamming Systems Technology?What Are The Drone Anti-jamming Systems Technology?
What Are The Drone Anti-jamming Systems Technology?
 
Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...
Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...
Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...
 
Real Time Object Detection Using Open CV
Real Time Object Detection Using Open CVReal Time Object Detection Using Open CV
Real Time Object Detection Using Open CV
 
Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024
Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024
Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024
 
Exploring the Future Potential of AI-Enabled Smartphone Processors
Exploring the Future Potential of AI-Enabled Smartphone ProcessorsExploring the Future Potential of AI-Enabled Smartphone Processors
Exploring the Future Potential of AI-Enabled Smartphone Processors
 
Boost Fertility New Invention Ups Success Rates.pdf
Boost Fertility New Invention Ups Success Rates.pdfBoost Fertility New Invention Ups Success Rates.pdf
Boost Fertility New Invention Ups Success Rates.pdf
 
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
 
A Year of the Servo Reboot: Where Are We Now?
A Year of the Servo Reboot: Where Are We Now?A Year of the Servo Reboot: Where Are We Now?
A Year of the Servo Reboot: Where Are We Now?
 
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
 
TrustArc Webinar - Stay Ahead of US State Data Privacy Law Developments
TrustArc Webinar - Stay Ahead of US State Data Privacy Law DevelopmentsTrustArc Webinar - Stay Ahead of US State Data Privacy Law Developments
TrustArc Webinar - Stay Ahead of US State Data Privacy Law Developments
 
HTML Injection Attacks: Impact and Mitigation Strategies
HTML Injection Attacks: Impact and Mitigation StrategiesHTML Injection Attacks: Impact and Mitigation Strategies
HTML Injection Attacks: Impact and Mitigation Strategies
 
Tech Trends Report 2024 Future Today Institute.pdf
Tech Trends Report 2024 Future Today Institute.pdfTech Trends Report 2024 Future Today Institute.pdf
Tech Trends Report 2024 Future Today Institute.pdf
 

What’s new in Google Dart - Seth Ladd