Top Banner
Dart Workshop by Dmitry Buzdin July 2013, Riga
78

Dart Workshop

May 08, 2015

Download

Technology

Neueda
Welcome message from author
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
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