最近 node.js 來勢洶洶, 怎麼辦? 別怕, 我們也有秘密武器 ringojs!

39
頑皮工坊 Sleepnova Inc. 創 辦人暨執行長 周立瑋

Upload: liwei-chou

Post on 18-Jun-2015

1.782 views

Category:

Technology


1 download

DESCRIPTION

簡介 RingoJS 的特色,如何使用 RingoJS 在 JVM 上面快速開發,以及如何在專案中同時保有 scripting 的靈活度以及使用既有的 Java Library。

TRANSCRIPT

Page 1: 最近 node.js 來勢洶洶, 怎麼辦? 別怕, 我們也有秘密武器 RingoJS!

頑皮工坊 Sleepnova Inc. 創

辦人暨執行長周立瑋

Page 2: 最近 node.js 來勢洶洶, 怎麼辦? 別怕, 我們也有秘密武器 RingoJS!

自我介紹

頑皮工坊 Sleepnova Inc. 創辦人暨執行長,KKBOX Android

技術顧問。

(Android 與雲端技術顧問公司)

感興趣的領域:- 敏捷開發,尋找更符合人性的程式設計典範。

- 可應付高承載的延展性架構。

- 思考資訊人為社會做點什麼?

Page 3: 最近 node.js 來勢洶洶, 怎麼辦? 別怕, 我們也有秘密武器 RingoJS!

過去經歷

Talks:● Javascript take-off to the clouds - Server-side Javascript

@ COSCUP 2009● The NoSQL movement: CouchDB as an example @

COSCUP 2010Projects:

● 東森大選即時開票系統,締造兩千兩百萬 req / 4 hr 記錄

Page 4: 最近 node.js 來勢洶洶, 怎麼辦? 別怕, 我們也有秘密武器 RingoJS!

最近 node.js 來勢洶洶, 怎麼辦? 別怕, 我們也有秘密武器 RingoJS!

Page 5: 最近 node.js 來勢洶洶, 怎麼辦? 別怕, 我們也有秘密武器 RingoJS!

簡介

簡介 RingoJS 的特色,如何使用 RingoJS 在 JVM 上面快速開發,以及如何在專案中同時保有 scripting 的靈活度以及使用既有的 Java Library。

Page 6: 最近 node.js 來勢洶洶, 怎麼辦? 別怕, 我們也有秘密武器 RingoJS!

Why JavaScript

Page 7: 最近 node.js 來勢洶洶, 怎麼辦? 別怕, 我們也有秘密武器 RingoJS!

The native language of the web

Page 8: 最近 node.js 來勢洶洶, 怎麼辦? 別怕, 我們也有秘密武器 RingoJS!

JavaScript 到底是不是個語言?

Page 9: 最近 node.js 來勢洶洶, 怎麼辦? 別怕, 我們也有秘密武器 RingoJS!

About JavaScript

● Javascript vs. Java <恩怨情仇>

● JavaScript 不能拿來寫大系統?

● CommonJS module system

Page 10: 最近 node.js 來勢洶洶, 怎麼辦? 別怕, 我們也有秘密武器 RingoJS!

RingoJS overview

● Developed by Hannes Wallnöfer (hns.github.com)● Based on Mozilla Rhino● Runs on JVM● Orignal named HelmaNG● Follow CommonJS

Page 11: 最近 node.js 來勢洶洶, 怎麼辦? 別怕, 我們也有秘密武器 RingoJS!

Node.js vs RingoJS

1. VM maturaty2. Community size3. Library base4. Java interopability5. Single-thread vs. Multi-thread

Page 12: 最近 node.js 來勢洶洶, 怎麼辦? 別怕, 我們也有秘密武器 RingoJS!

Node.js vs RingoJS

● VM optimize for browser● Young community● Not much library but will grow● No Java interoperability● Single thread

● Quite mature enterprise grade VM● Big community● Lots of Java library● Very good Java interoperability● Multi-thread

Page 13: 最近 node.js 來勢洶洶, 怎麼辦? 別怕, 我們也有秘密武器 RingoJS!

Rhino JavaScript Engine

● JavaScript <-> Java inter-operation○ Access Java packages and classes○ Working with Java objects○ Inherit class/interface

● E4X

Page 14: 最近 node.js 來勢洶洶, 怎麼辦? 別怕, 我們也有秘密武器 RingoJS!

Accessing Java packages and classesjs> Packages.java[JavaPackage java]

js> java[JavaPackage java]

js> java.io.File[JavaClass java.io.File]

js> importPackage(java.io)js> File[JavaClass java.io.File]

Page 15: 最近 node.js 來勢洶洶, 怎麼辦? 別怕, 我們也有秘密武器 RingoJS!

Working with Java objects

js> new java.util.Date()Thu Jan 24 16:18:17 EST 2002

var File = java.io.File;var myfile = new File("sample.txt");

Page 16: 最近 node.js 來勢洶洶, 怎麼辦? 別怕, 我們也有秘密武器 RingoJS!

Working with Java objects

js> f = new java.io.File("test.txt")test.txtjs> f.exists()truejs> f.getName()test.txt

Page 17: 最近 node.js 來勢洶洶, 怎麼辦? 別怕, 我們也有秘密武器 RingoJS!

Implementing Java Interfaces

js> obj = { run: function () { print("\nrunning"); } }[object Object]js> obj.run()

running

js> r = new java.lang.Runnable(obj);[object JavaObject]

Page 18: 最近 node.js 來勢洶洶, 怎麼辦? 別怕, 我們也有秘密武器 RingoJS!

Implementing Java Interfaces

js> r = new java.lang.Runnable({run: function () { print("\nrunning"); }});

[object JavaObject]

Page 19: 最近 node.js 來勢洶洶, 怎麼辦? 別怕, 我們也有秘密武器 RingoJS!

Working with Java objects

js> for (i in f) { print(i) }existsparentFilemkdirtoStringwait

Page 20: 最近 node.js 來勢洶洶, 怎麼辦? 別怕, 我們也有秘密武器 RingoJS!

特異功能 E4X

var sales = <sales vendor="John"> <item type="peas" price="4" quantity="6"/> <item type="carrot" price="3" quantity="10"/> <item type="chips" price="5" quantity="3"/> </sales>; alert( sales.item.(@type == "carrot").@quantity );alert( sales.@vendor );for each( var price in sales..@price ) { alert( price );}delete sales.item[0];sales.item += <item type="oranges" price="4"/>;sales.item.(@type == "oranges").@quantity = 4;

Page 21: 最近 node.js 來勢洶洶, 怎麼辦? 別怕, 我們也有秘密武器 RingoJS!

RingoJS

● Minimal web app● Packages● Storage● AppEngine

Page 22: 最近 node.js 來勢洶洶, 怎麼辦? 別怕, 我們也有秘密武器 RingoJS!

Hello World!

exports.app = function(req) { return { status: 200, headers: {"Content-Type": "text/plain"}, body: ["Hello World!"] };};

if (require.main == module) require("ringo/httpserver").main(module.id);

Page 23: 最近 node.js 來勢洶洶, 怎麼辦? 別怕, 我們也有秘密武器 RingoJS!

Ringo Shell

>> var fs = require('fs');>> var file = fs.open('README.md');>> var lines = [line for (line in file)];

Page 24: 最近 node.js 來勢洶洶, 怎麼辦? 別怕, 我們也有秘密武器 RingoJS!

Handle HTTP Request// actions.jsvar Response = require('ringo/webapp/response');var model = require('./model');

exports.index = function(req) { var posts = model.Post.query().select().slice(0,10); return Response.skin('skins/index.html', { posts: posts, });};

Page 25: 最近 node.js 來勢洶洶, 怎麼辦? 別怕, 我們也有秘密武器 RingoJS!

Skins

// in a skin<% for post in <% posts %> render 'postOverview' %>

<% subskin 'postOverview' %> <h2><% post.title %></h2>

Page 26: 最近 node.js 來勢洶洶, 怎麼辦? 別怕, 我們也有秘密武器 RingoJS!

URL mapping

// config.jsexports.urls = [ ['/', './actions'],];

Page 27: 最近 node.js 來勢洶洶, 怎麼辦? 別怕, 我們也有秘密武器 RingoJS!

Database

● ringo-sqlstore● berkeleystore● cassandrastore● mongodbstore● redis-ringojs-client● Google App Engine Datastore API

Page 28: 最近 node.js 來勢洶洶, 怎麼辦? 別怕, 我們也有秘密武器 RingoJS!

Mongodbstore

Initializing the store:include('ringo/storage/mongodbstore');store = new Store('server', 27017, 'dbName');

Creating a new Storable class:Book = store.defineEntity('book');

Creating and saving a new Storable instance:var b = new Book({title: "DBs for dummies"});b.save();

Page 29: 最近 node.js 來勢洶洶, 怎麼辦? 別怕, 我們也有秘密武器 RingoJS!

MongodbstoreRetrieving all objects from a db:var books = Book.all();

Retrieving an object by id:var book = Book.get(id);

Deleting an object from the db:book.remove();

Running a query on the database:Book.query().equals('prop', value).select();

Page 30: 最近 node.js 來勢洶洶, 怎麼辦? 別怕, 我們也有秘密武器 RingoJS!

Berkeleystore

Initializing the store:include('ringo/storage/berkeleystore');store = new Store(dbpath);

Creating a new Storable class:Book = store.defineEntity('book');

Creating and saving a new Storable instance:var b = new Book({title: "DBs for dummies"});b.save();

Page 31: 最近 node.js 來勢洶洶, 怎麼辦? 別怕, 我們也有秘密武器 RingoJS!

天下沒有白痴的午餐

Page 32: 最近 node.js 來勢洶洶, 怎麼辦? 別怕, 我們也有秘密武器 RingoJS!

天下沒有白吃的午餐

Page 33: 最近 node.js 來勢洶洶, 怎麼辦? 別怕, 我們也有秘密武器 RingoJS!

Performance characteristic

● Translation to JVM bytecode● JVM is not a perfect dynamic language VM

yet!

Page 34: 最近 node.js 來勢洶洶, 怎麼辦? 別怕, 我們也有秘密武器 RingoJS!

Performance characteristic

$ node v8bench.js19 Aug 16:13:33 - Score (version 5): 4090

$ java -Xmx265m -jar js.jar run.jsScore (version 5): 120

[larger is better]

Page 35: 最近 node.js 來勢洶洶, 怎麼辦? 別怕, 我們也有秘密武器 RingoJS!

~1/34

Page 36: 最近 node.js 來勢洶洶, 怎麼辦? 別怕, 我們也有秘密武器 RingoJS!

Node.js vs RingoJS GC Benchmark

http://hns.github.com/2010/09/29/benchmark2.html

Page 37: 最近 node.js 來勢洶洶, 怎麼辦? 別怕, 我們也有秘密武器 RingoJS!

Future of JavaScript Engine

JavaScript engine● Nashorn, dyn.js● InvokeDynamic

Page 38: 最近 node.js 來勢洶洶, 怎麼辦? 別怕, 我們也有秘密武器 RingoJS!

JavaScript territory

● Titanium● CouchDB● Unity● node.js + webkit● RingoJS + SWT● ES operating system● Ubuntu Desktop

Page 39: 最近 node.js 來勢洶洶, 怎麼辦? 別怕, 我們也有秘密武器 RingoJS!

Stay Hungry, Stay Foolish!