SlideShare uma empresa 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

Mais conteúdo relacionado

Mais procurados

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
 

Mais procurados (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
 

Semelhante 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
 

Semelhante 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

Moving Beyond Passwords: FIDO Paris Seminar.pdf
Moving Beyond Passwords: FIDO Paris Seminar.pdfMoving Beyond Passwords: FIDO Paris Seminar.pdf
Moving Beyond Passwords: FIDO Paris Seminar.pdfLoriGlavin3
 
Data governance with Unity Catalog Presentation
Data governance with Unity Catalog PresentationData governance with Unity Catalog Presentation
Data governance with Unity Catalog PresentationKnoldus Inc.
 
(How to Program) Paul Deitel, Harvey Deitel-Java How to Program, Early Object...
(How to Program) Paul Deitel, Harvey Deitel-Java How to Program, Early Object...(How to Program) Paul Deitel, Harvey Deitel-Java How to Program, Early Object...
(How to Program) Paul Deitel, Harvey Deitel-Java How to Program, Early Object...AliaaTarek5
 
The State of Passkeys with FIDO Alliance.pptx
The State of Passkeys with FIDO Alliance.pptxThe State of Passkeys with FIDO Alliance.pptx
The State of Passkeys with FIDO Alliance.pptxLoriGlavin3
 
Generative AI for Technical Writer or Information Developers
Generative AI for Technical Writer or Information DevelopersGenerative AI for Technical Writer or Information Developers
Generative AI for Technical Writer or Information DevelopersRaghuram Pandurangan
 
Manual 508 Accessibility Compliance Audit
Manual 508 Accessibility Compliance AuditManual 508 Accessibility Compliance Audit
Manual 508 Accessibility Compliance AuditSkynet Technologies
 
Merck Moving Beyond Passwords: FIDO Paris Seminar.pptx
Merck Moving Beyond Passwords: FIDO Paris Seminar.pptxMerck Moving Beyond Passwords: FIDO Paris Seminar.pptx
Merck Moving Beyond Passwords: FIDO Paris Seminar.pptxLoriGlavin3
 
Modern Roaming for Notes and Nomad – Cheaper Faster Better Stronger
Modern Roaming for Notes and Nomad – Cheaper Faster Better StrongerModern Roaming for Notes and Nomad – Cheaper Faster Better Stronger
Modern Roaming for Notes and Nomad – Cheaper Faster Better Strongerpanagenda
 
Digital Identity is Under Attack: FIDO Paris Seminar.pptx
Digital Identity is Under Attack: FIDO Paris Seminar.pptxDigital Identity is Under Attack: FIDO Paris Seminar.pptx
Digital Identity is Under Attack: FIDO Paris Seminar.pptxLoriGlavin3
 
A Framework for Development in the AI Age
A Framework for Development in the AI AgeA Framework for Development in the AI Age
A Framework for Development in the AI AgeCprime
 
Scale your database traffic with Read & Write split using MySQL Router
Scale your database traffic with Read & Write split using MySQL RouterScale your database traffic with Read & Write split using MySQL Router
Scale your database traffic with Read & Write split using MySQL RouterMydbops
 
Testing tools and AI - ideas what to try with some tool examples
Testing tools and AI - ideas what to try with some tool examplesTesting tools and AI - ideas what to try with some tool examples
Testing tools and AI - ideas what to try with some tool examplesKari Kakkonen
 
Generative Artificial Intelligence: How generative AI works.pdf
Generative Artificial Intelligence: How generative AI works.pdfGenerative Artificial Intelligence: How generative AI works.pdf
Generative Artificial Intelligence: How generative AI works.pdfIngrid Airi González
 
A Journey Into the Emotions of Software Developers
A Journey Into the Emotions of Software DevelopersA Journey Into the Emotions of Software Developers
A Journey Into the Emotions of Software DevelopersNicole Novielli
 
How to Effectively Monitor SD-WAN and SASE Environments with ThousandEyes
How to Effectively Monitor SD-WAN and SASE Environments with ThousandEyesHow to Effectively Monitor SD-WAN and SASE Environments with ThousandEyes
How to Effectively Monitor SD-WAN and SASE Environments with ThousandEyesThousandEyes
 
Passkey Providers and Enabling Portability: FIDO Paris Seminar.pptx
Passkey Providers and Enabling Portability: FIDO Paris Seminar.pptxPasskey Providers and Enabling Portability: FIDO Paris Seminar.pptx
Passkey Providers and Enabling Portability: FIDO Paris Seminar.pptxLoriGlavin3
 
What is DBT - The Ultimate Data Build Tool.pdf
What is DBT - The Ultimate Data Build Tool.pdfWhat is DBT - The Ultimate Data Build Tool.pdf
What is DBT - The Ultimate Data Build Tool.pdfMounikaPolabathina
 
Use of FIDO in the Payments and Identity Landscape: FIDO Paris Seminar.pptx
Use of FIDO in the Payments and Identity Landscape: FIDO Paris Seminar.pptxUse of FIDO in the Payments and Identity Landscape: FIDO Paris Seminar.pptx
Use of FIDO in the Payments and Identity Landscape: FIDO Paris Seminar.pptxLoriGlavin3
 
TeamStation AI System Report LATAM IT Salaries 2024
TeamStation AI System Report LATAM IT Salaries 2024TeamStation AI System Report LATAM IT Salaries 2024
TeamStation AI System Report LATAM IT Salaries 2024Lonnie McRorey
 
New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024
New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024
New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024BookNet Canada
 

Último (20)

Moving Beyond Passwords: FIDO Paris Seminar.pdf
Moving Beyond Passwords: FIDO Paris Seminar.pdfMoving Beyond Passwords: FIDO Paris Seminar.pdf
Moving Beyond Passwords: FIDO Paris Seminar.pdf
 
Data governance with Unity Catalog Presentation
Data governance with Unity Catalog PresentationData governance with Unity Catalog Presentation
Data governance with Unity Catalog Presentation
 
(How to Program) Paul Deitel, Harvey Deitel-Java How to Program, Early Object...
(How to Program) Paul Deitel, Harvey Deitel-Java How to Program, Early Object...(How to Program) Paul Deitel, Harvey Deitel-Java How to Program, Early Object...
(How to Program) Paul Deitel, Harvey Deitel-Java How to Program, Early Object...
 
The State of Passkeys with FIDO Alliance.pptx
The State of Passkeys with FIDO Alliance.pptxThe State of Passkeys with FIDO Alliance.pptx
The State of Passkeys with FIDO Alliance.pptx
 
Generative AI for Technical Writer or Information Developers
Generative AI for Technical Writer or Information DevelopersGenerative AI for Technical Writer or Information Developers
Generative AI for Technical Writer or Information Developers
 
Manual 508 Accessibility Compliance Audit
Manual 508 Accessibility Compliance AuditManual 508 Accessibility Compliance Audit
Manual 508 Accessibility Compliance Audit
 
Merck Moving Beyond Passwords: FIDO Paris Seminar.pptx
Merck Moving Beyond Passwords: FIDO Paris Seminar.pptxMerck Moving Beyond Passwords: FIDO Paris Seminar.pptx
Merck Moving Beyond Passwords: FIDO Paris Seminar.pptx
 
Modern Roaming for Notes and Nomad – Cheaper Faster Better Stronger
Modern Roaming for Notes and Nomad – Cheaper Faster Better StrongerModern Roaming for Notes and Nomad – Cheaper Faster Better Stronger
Modern Roaming for Notes and Nomad – Cheaper Faster Better Stronger
 
Digital Identity is Under Attack: FIDO Paris Seminar.pptx
Digital Identity is Under Attack: FIDO Paris Seminar.pptxDigital Identity is Under Attack: FIDO Paris Seminar.pptx
Digital Identity is Under Attack: FIDO Paris Seminar.pptx
 
A Framework for Development in the AI Age
A Framework for Development in the AI AgeA Framework for Development in the AI Age
A Framework for Development in the AI Age
 
Scale your database traffic with Read & Write split using MySQL Router
Scale your database traffic with Read & Write split using MySQL RouterScale your database traffic with Read & Write split using MySQL Router
Scale your database traffic with Read & Write split using MySQL Router
 
Testing tools and AI - ideas what to try with some tool examples
Testing tools and AI - ideas what to try with some tool examplesTesting tools and AI - ideas what to try with some tool examples
Testing tools and AI - ideas what to try with some tool examples
 
Generative Artificial Intelligence: How generative AI works.pdf
Generative Artificial Intelligence: How generative AI works.pdfGenerative Artificial Intelligence: How generative AI works.pdf
Generative Artificial Intelligence: How generative AI works.pdf
 
A Journey Into the Emotions of Software Developers
A Journey Into the Emotions of Software DevelopersA Journey Into the Emotions of Software Developers
A Journey Into the Emotions of Software Developers
 
How to Effectively Monitor SD-WAN and SASE Environments with ThousandEyes
How to Effectively Monitor SD-WAN and SASE Environments with ThousandEyesHow to Effectively Monitor SD-WAN and SASE Environments with ThousandEyes
How to Effectively Monitor SD-WAN and SASE Environments with ThousandEyes
 
Passkey Providers and Enabling Portability: FIDO Paris Seminar.pptx
Passkey Providers and Enabling Portability: FIDO Paris Seminar.pptxPasskey Providers and Enabling Portability: FIDO Paris Seminar.pptx
Passkey Providers and Enabling Portability: FIDO Paris Seminar.pptx
 
What is DBT - The Ultimate Data Build Tool.pdf
What is DBT - The Ultimate Data Build Tool.pdfWhat is DBT - The Ultimate Data Build Tool.pdf
What is DBT - The Ultimate Data Build Tool.pdf
 
Use of FIDO in the Payments and Identity Landscape: FIDO Paris Seminar.pptx
Use of FIDO in the Payments and Identity Landscape: FIDO Paris Seminar.pptxUse of FIDO in the Payments and Identity Landscape: FIDO Paris Seminar.pptx
Use of FIDO in the Payments and Identity Landscape: FIDO Paris Seminar.pptx
 
TeamStation AI System Report LATAM IT Salaries 2024
TeamStation AI System Report LATAM IT Salaries 2024TeamStation AI System Report LATAM IT Salaries 2024
TeamStation AI System Report LATAM IT Salaries 2024
 
New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024
New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024
New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024
 

What’s new in Google Dart - Seth Ladd