dart workshop

78
Dart Workshop by Dmitry Buzdin July 2013, Riga

Upload: neueda

Post on 08-May-2015

7.056 views

Category:

Technology


1 download

TRANSCRIPT

Page 1: Dart Workshop

Dart Workshopby Dmitry Buzdin

July 2013, Riga

Page 2: Dart Workshop

You should be here today!

Page 3: Dart Workshop

Brought to You By

Page 4: Dart Workshop

WorkshopPreparation

Page 5: Dart Workshop

Get Dart

http://www.dartlang.org/#get-started

Page 6: Dart Workshop

What You Get

• Dart SDK

• Dart Editor (Eclipse-based)

• Dartium VM

• Chromium with Dart VM

• Command line tools

• Samples

Page 7: Dart Workshop

IDE

Page 8: Dart Workshop

Prerequisites

• dart installed

• dart2js installed

• pub installed

• Dartium installed

• IDE (Dart Editor, IntelliJ, Sublime, VIM)

Page 9: Dart Workshop

Knowledge Required

• HTML/CSS basics

• JavaScript basics

• OOP basics

• FP basics

Page 10: Dart Workshop

Join the Dart Side

Page 11: Dart Workshop

Why Dart?

• JavaScript is broken

• Quest for holy grail is on

• One language for client and server

• Node.js is not an option

Page 12: Dart Workshop

Dart VM

• Speed

• Multithreading via Isolates

Page 13: Dart Workshop

Dart Compiler

• Compiles to JavaScript

• Runs in all modern browsers

• Dart VM is faster than V8

• (according to Google)

Page 14: Dart Workshop

Dart Language

• Similar to Java and JavaScript

http://try.dartlang.org/

Page 16: Dart Workshop

Optional Type Safety

• Checked during development

• Compiled-out in production

Page 17: Dart Workshop

Dart Timeline

• Inspired by Java, JavaScript, GWT

• Revealed in October 2011

• Frequent public releases

• June 19, 2013 First Beta version

• Production ~2014

Page 18: Dart Workshop

Warning: Dart is hot!

Code shown will not probably work after two months

Page 19: Dart Workshop

Workshop

Page 20: Dart Workshop
Page 21: Dart Workshop

Browser

Dart VM Client Dart Code

Dart VM

Server Dart Code

MongoDB

HTTP

HTTP

Page 22: Dart Workshop

Ways of Working

• Working in pairs

• Writing automated tests

• 5 Steps to complete

• Solutions available online

https://github.com/buzdin/dart-workshop

Page 23: Dart Workshop

• Part I : Hello, Dart!

• Part II : Integrating Google Maps

• Part III: Dynamic HTML

• Part IV:Adding Server-Side

• Part V: Adding MongoDB

Page 24: Dart Workshop

Part I : Hello Dart

Page 25: Dart Workshop

Tasks

• Learn application directory structure

• Run client and server side code

• Check output in Dartium console

• Write new unit tests

• Check that they work

• Learn to use debugger

Page 26: Dart Workshop

Base Project StructureModules

Tests

Client

ModulesModules

Dependencies

SymbolicLink

http://pub.dartlang.org/doc/package-layout.html

Page 27: Dart Workshop

Pub Package Manager

• Same as npm (JavaScript) or Maven (Java)

• pubspec.yaml - application dependencies

• pubspec.lock - exact versions

http://pub.dartlang.org/

Page 28: Dart Workshop

pubspec.yaml

name: dart_workshopdependencies: browser: any unittest: any

Latest version

http://pub.dartlang.org/doc/pubspec.html

Page 29: Dart Workshop

Fetch Dependencies

pub install

Resolving dependencies................Downloading fukiya 0.1.9 from hosted...Downloading formler 0.0.8 from hosted...Dependencies installed!

Page 30: Dart Workshop

Unit Testing

void main() { test('QuickSort', () => expect(quickSort([5, 4, 3, 2, 1]), orderedEquals([1, 2, 3, 4, 5])) ); test('Partition', () { List array = [3, 2, 1]; int index = _partition(array, 0, array.length-1, 1); expect(index, equals(1)); expect(array, orderedEquals([1, 2, 3])); });}

Page 31: Dart Workshop

Bootstrap Dart (1)

<!DOCTYPE html><html><head> <title>Dart Workshop</title> <link rel="stylesheet" type="text/css" href="style.css"></head><body>

<script type="application/dart" src="main.dart"></script><script src="packages/browser/dart.js"></script>

</body></html>

Page 32: Dart Workshop

Bootstrap Dart (1I)

// This is Dart Applicationvoid main() { sayHello("Hello, Dart!");}

void sayHello() { print("Hello");}

Page 33: Dart Workshop

Running Dart

Page 34: Dart Workshop

Debugging

Page 35: Dart Workshop

You Learned

• Dart project structure

• Running and debugging Dart

• Writing and running unit tests

Page 36: Dart Workshop

Part II : Integrating Google Maps

Page 37: Dart Workshop

Tasks

• Integrate Google Maps

• Add event handlers

• Draw custom map markers

Page 38: Dart Workshop

import 'dart:html';import 'package:js/js.dart' as js;import 'package:google_maps/google_maps.dart';

void main() { js.context.google.maps.visualRefresh = true;

final mapOptions = new MapOptions() ..zoom = 13 ..center = new LatLng(56.946843515558456, 24.13162512207032) ..mapTypeId = MapTypeId.ROADMAP ; final map = new GMap(query("#map_canvas"), mapOptions); js.retain(map);}

Adding Google Maps

<div id="map_canvas"></div><script src="http://maps.googleapis.com/maps/api/js?sensor=false"></script>

dependencies: google_maps: any

#map_canvas { height: 100%; margin: 0;}

Page 39: Dart Workshop

Handling Map Events

map.onCenterChanged.listen((ignore) { print(map.center); });

map.onZoomChanged.listen((ignore) { print(map.zoom); });

map.onClick.listen((event) { print(event.latLng); });

Page 40: Dart Workshop

Drawing Markers

var marker = new Marker( new MarkerOptions() ..position = new LatLng(56.946, 24.131) ..map = map ..title = 'Best Place in the World!' ..icon = 'icon.png' );

http://www.iconarchive.com/Pick your own icon!

Page 41: Dart Workshop

Event Streams

http://www.dartlang.org/articles/feet-wet-streams/

TODO

Page 42: Dart Workshop

You Learned

• Adding JavaScript libraries

• Integrating Google Maps API

• Using event Streams

• Picking icons

Page 43: Dart Workshop

Part III : Dynamic HTML

Page 44: Dart Workshop

Tasks

• Draw input form for place name and icon

• Show/hide DOM elements

• Attach custom DOM event handlers

Page 45: Dart Workshop

JQuery in Dart

import 'dart:html';

Element elem1 = query('#an-id'); // Find an element by id (an-id).Element elem2 = query('.a-class'); // Find an element by class (a-class).List<Element> elems1 = queryAll('div'); // Find all elements by tag (<div>).List<Element> elems2 = queryAll('input[type="text"]'); // Find all text inputs.

// Find all elements with the CSS class 'class' inside of a <p>// that is inside an element with the ID 'id'.List<Element> elems3 = queryAll('#id p.class');

http://api.dartlang.org/docs/releases/latest/dart_html.html

Page 46: Dart Workshop

Manipulating DOM

<div id="form"> <input id="name" type="text"/> <input id="icon" type="text"/></div>

var name = query('#name').value;query('#name').value = ‘New Value’;

query('#form').hidden = true;

Page 47: Dart Workshop

Reacting on Events

map.onClick.listen((event) { var name = query('#name').value; var icon = query('#icon').value; savePlace(name, icon, event.latLng);});

Page 48: Dart Workshop

You Learned

• JQuery is built-in in Dart

• Learned to manipulate DOM

• Learned to attach event handlers

Page 49: Dart Workshop

Part IV : Adding Server

Page 50: Dart Workshop

Tasks

• Draw input form for place name and icon

• Show/hide DOM elements

• Attach custom DOM event handlers

Page 51: Dart Workshop

REST API

POST /api/places

GET /api/places?near=lat,long

Page 52: Dart Workshop

Place JSON

{ name: “Name”, loc: [53.2114, 24.5623], icon: “http://iconarchive.com/icon.png”}

Page 53: Dart Workshop

HTTP Serverimport 'dart:io';import 'dart:json';

main() {

HttpServer.bind('127.0.0.1', 8080).then((server) { server.listen((HttpRequest request) { request.response.write(“Hello!”); request.response.close(); }); });

}

Page 54: Dart Workshop

Too much code, lets take existing solution

Page 55: Dart Workshop

Fukiya Server

http://pub.dartlang.org/packages/fukiya

void main() { new Fukiya() ..get('/', getHandler) ..put('/', putHandler) ..delete('/', deleteHandler) ..post('/', postHandler) ..get('/testing', (FukiyaContext context) { context.send("This is testing."); }) ..get('/:userid', getDynamicHandler) ..staticFiles('./test/static') ..use(new FukiyaFormParser()) ..use(new FukiyaJsonParser()) ..listen('127.0.0.1', 3333);}

Page 56: Dart Workshop

Working with JSON

String str = stringify( { 'key': 42, 'value': 'text', 'p': ['A', 'B'] });

Map doc = parse(str);

import 'dart:json';

Page 57: Dart Workshop

Our Web Serverimport 'package:fukiya/fukiya.dart';

main() { new Fukiya() ..get('/api/places', getHandler) ..post('/api/places', postHandler) ..staticFiles('web') ..use(new FukiyaJsonParser()) ..listen('127.0.0.1', 8080);}

> dart bin/server.dart

void postHandler(FukiyaContext context) { print(context.params); print(context.parsedBody); context.send("OK"); context.jsonResponse(json);}

Page 58: Dart Workshop

Server HTTP Client

import 'package:http/http.dart' as http;

void main() { http.get('http://127.0.0.1:8080').then((response) { print(response.body); });}

http://pub.dartlang.org/packages/http

Page 59: Dart Workshop

Test Example

test("should-get", () { http.get('http://127.0.0.1:8080/api/places?near=1,2') .then(expectAsync1((response) { expect(response.statusCode, equals(200)); expect(response.body, equals('[]')); })); });

Page 60: Dart Workshop

Browser Ajax Clientimport 'dart:html';import 'dart:async';import 'dart:json';

main() { HttpRequest.getString(uri).then(processString);}

processString(String jsonText) { Map object = parse(jsonText); println(object);}

http://www.dartlang.org/articles/json-web-service/

Page 61: Dart Workshop

Posting Data

var request = new HttpRequest(); request.open('POST', '/api/places'); request.setRequestHeader("Content-Type", "application/json"); request.send(json);

Page 62: Dart Workshop

Timers

new Timer.periodic( new Duration(seconds:5), (timer) { print("timer triggered"); loadPlaces(map); });

Refresh list of places every few seconds

import 'dart:async';

http://api.dartlang.org/docs/releases/latest/dart_async/Timer.html

Page 63: Dart Workshop

You Learned

• Server side is “easy”

• Testing HTTP services

• Creating Ajax client

• Using JSON

Page 64: Dart Workshop

Part V : Adding MongoDB

Page 65: Dart Workshop

Tasks

• Connect to real Cloud database!

• Replace in-memory database with real one

• Write tests

Page 66: Dart Workshop

MongoDB

• No schema

• JSON as data format

• JSON as query language

Page 67: Dart Workshop

MongoDB in 3 minutes

Database

Collection

Document

Database

Table

Record

Page 68: Dart Workshop

Database Records

{ name: “Name”, loc: [53.2114, 24.5623], icon: “http://iconarchive.com/icon.png”}

Page 69: Dart Workshop

Database Query

db.products.find({qty: {$gt: 25}})

Page 70: Dart Workshop

Mongo Dart Driver

import 'package:mongo_dart/mongo_dart.dart';

var db = new Db(url);

db.open().then((c) { DbCollection places = db.collection("places"); places.insert({ "name": "Place", "loc": [56, 23], "icon”: "Place" });});

name: dart_workshopdependencies: mongo_dart: any

Page 71: Dart Workshop

Geolocation Queries

var db = new Db(DB_URL);

db.open().then((c) { db.ensureIndex("places", key: "loc", name: "2d"); DbCollection places = db.collection("places"); places.find(where.near("loc", {'\$geometry': {"type" : "Point", "coordinates" : [23, 23]} }, 10000)).each((place) { print(place); }).then((ignore) { db.close(); });});

Page 72: Dart Workshop

MongoLab Account

• mongodb://dart:[email protected]:35338/dart-workshop

• mongo ds035338.mongolab.com:35338/dart-workshop -u dart -p dartIsKing

Page 73: Dart Workshop

You Learned

• Future based API

• Used Mongo Geolocation Queries

• Mongo Dart library sucks!

• Write full-stack Dart applications!

Page 74: Dart Workshop

Conclusions

Page 75: Dart Workshop

Dart is better than JavaScript!

Page 76: Dart Workshop
Page 77: Dart Workshop

Dart is the future!?

Discuss!

Page 78: Dart Workshop

Materials

• http://pub.dartlang.org/doc/package-layout.html

• http://yulian.kuncheff.com/blog/2013/03/21/using-intellij-slash-webstorm-to-debug-web-applications/

• http://www.youtube.com/watch?v=N8GCNilJhT4

• http://docs.mongodb.org/manual/reference/operator/query-geospatial/

• https://developers.google.com/maps/documentation/javascript/reference