Sử dụng GeoCouch

Một phần của tài liệu PHÁT TRIỂN ỨNG DỤNG WEB (Trang 41 - 50)

32

#curl -X PUT http://127.0.0.1:5984/geocouch

Tiếp theo là nhập dữ liệu.ví dụ về dữ liệu tại địa chỉ: https://github.com/dthompson/example_geocouch_data Tải thƣ mục về và chạy file import.js dữ liệu.

Vậy là ta đã có cơ sở dữ liệu và dữ liệu để test.Bây giờ là tạo một design document.Có hai cách để tạo.Một là tạo trực tiếp, cách hai là tạo bằng futon.

Cách một

Sau khi chạy xong thì ta sẽ tạo ra 1 request để kiểm tra.

#curl -X PUT -d '{"spatial":{"points":"function(doc) {\n if (doc.loc) {\n emit({\n type: \"Point\", \n coordinates: [doc.loc[0], doc.loc[1]]\n }, [doc._id, doc.loc]);\n }};"}}'

http://127.0.0.1:5984/geocouch/_design/main

Khá dài dòng và không thân thiện, nhƣng chỉ với một câu lệnh thì ta đã thành công trong một bƣớc tạo design.Trong câu lệnh này ta đã add cả hàm map vào trực tiếp vào câu lệnh.Mặc định spatial view không có hỗ trợ hàm reduce, chỉ có hàm map

Cách hai

Dùng couchapp.Ta tạo thêm thƣ mục spatial.Trong thƣ mục đó tạo 1 file tên là point.js.Ở đây tên file chính là design document.Và nội dung trong file đó chính là hàm map tƣơng ứng với câu lệnh ở cách 1.Cuối cùng là ta chỉ cần push lên là xong.

#couchapp push geocouch

Ta có thể thấy, dùng cách hai đơn giản hơn nhiều cách 1. Cuối cùng là ta sẽ tạo ra một request để truy vấn.

#curl -X GET 'http://localhost:5984/geocouch/_design/main/_spatial/points?bbox=0, 0, 180, 90'

33

Chƣơng 4 ỨNG DỤNG MAPCHAT

Trong chƣơng này tôi sẽ làm một ứng dụng cho phép ngƣời dùng tƣơng tác với nhau bằng các đoạn chat thời gian thực trong khi vẫn gắn vị trí hiện thời của họ trên bản đồ.Ứng dụng đó có tên là mapchat.Cách vận hành và bản chất của chƣơng trình này giống với trang www.mapchat.im .Ứng dụng sẽ sử dụng Google Maps để hiển thị bản đồ và đánh dấu vị trí ngƣời dùng.NodeJS chạy các ứng dụng thời gian thực hoặc theo sự kiện rất tốt,trong khi CouchDB thì có nhiệm vụ lƣu lịch sử các đoạn chat.

4.1. ExpressJS

ExpressJs là một framework trong NodeJS với việc hỗ trợ khá nhiều tiện ích cho nodeJS

Lệnh cài đặt :

#npm install express

Để khởi tạo một http server với ExpressJS ta chỉ cần thêm vài dòng code sau :

var express = require('express') ; var app = express.createServer(); app.get('/', routes.index);

app.listen(3000);

Đoạn mã trên nói nói rằng khi vào trang chủ (tức /) thì sẽ chuyển đến file index.js và đƣợc lắng nghe trên cổng 3000.

Việc tiếp theo là ta sẽ cấu hình server để chuẩn bị cho chƣơng trình.Ta sẽ đặt cho views,tức các file để dành cho việc hiển thị đƣợc đặt trong thƣ mục /views với kiểu file là ejs.Các file trình bày CSS đƣợc dùng theo định dạng stylus, tức là có thể dùng đƣợc theo 2 dạng abc.stylus hoặc abc.css.Và cuối cùng là các file static,các file chứa js tĩnh đƣa về phía trình duyệt, các file ảnh hay file css sẽ đƣợc lƣu trong thƣ mục /public.Dƣới đây là đoạn mã thực hiện :

app.configure(function(){

app.set('views', __dirname + '/views'); app.set('view engine', 'ejs');

34 app.use(express.bodyParser()); app.use(express.methodOverride()); app.use(require('stylus').middleware({ src: __dirname + '/public' })); app.use(app.router); app.use(express.static(__dirname + '/public')); }); 4.2. SocketIO

Socket.io là một module trong NodeJS.Nó cung cấp một tập các thƣ viện (API) cho các ứng dụng để điểu kiển các thông điệp giữa client và server.Nó tự động sử dụng kiểu kết nối tốt nhất có thể đƣợc để liên lạc giữa client và server.Các kết nối đó bao gồm websockets, flash proxy,XHR-long và một vài cách kết nối khác.Nó cũng bao gồm các thƣ việc con khác với chức năng phụ trợ cho nó ví dụ nhƣ now.js để đồng bộ thời gian giữa client và server.Socket.io tự nó tạo ra các chuẩn dữ liệu để chuyển qua lại dữ liệu giữa nhiều ngôn ngữ khác nhau

Để cài đặt Socket.io ta có thể dùng trình quản lý gói của Nodejs - NPM : (adsbygoogle = window.adsbygoogle || []).push({});

#npm install socket.io

Để khai báo module và khởi tạo server thì đầu tiên server phải khởi động một sự kiện lắng nghe đƣợc quản lý bởi socket.io thay vì http nhƣ thƣờng lệ

var io = require('socket.io); var socket = io.listen(app);

Module socket.io hoạt động theo đúng mô hình socket client-server tức là việc giữa 2 bên tạo ra các sự kiện và tiến hành bắt sự kiện khi có hành động tƣơng ứng.Dƣới đây là code ví dụ về phía server

socket.on('connection',function(client){ socket.send({message : "abc"}); });

35

4.3. Cài đặt project 4.3.1. Phần Chatting

Phía server có 2 sự kiện nhận:

register : Ngƣời dùng sẽ đăng kí tên đến server và server sẽ lƣu tên ngƣời dùng.

message: Khi có thông điệp (message) từ client đến,server sẽ nhận thông điệp,gán tên ngƣời dùng đã gửi và sau đó gửi lan truyền cho tất cả số ngƣời đang chat đều nhận đƣợc thông điệp.

Đây là đoạn mã :

client.on('message',function(data){ //phan chatting

var username = 'noname';

console.log("User " + client.id + " send " + data); client.get('username', function (err, name) {

console.log('Chat message by ', name); console.log('error ', err); username = name; }); client.broadcast.emit('updateStatus',{ message : data, user: username }); });

//server nhan duoc ten nguoi dung vao chat client.on('register',function(name){

36

client.set('username', name); })

Phía client thì có một sự kiện:

Nếu server gửi dữ liệu broadcast về client thì nó sẽ updateStatus vào log chat Chi tiết đoạn mã

function updateStatus(user,message){ var status = $('#status'); var result = ' ' + user + ' : '+ message + '

'; status.append(result); }

socket.on('updateStatus',function(data){updateStatus(data.user,data.message);})

4.3.2 Phần map

Ứng dụng của chúng ta dùng HTML5 để định vị vị trí ngƣời dùng.Mặc định khi vào trang web thì client sẽ load toàn bộ phần bản đồ và thiết đặt vị trí ngƣời dùng.

Để tự động tải khi load trang ta thêm vào thẻ body nhƣ sau :

<body onload="loadMap();">

Ứng dụng của chúng ta sẽ định vị bằng GPS.Nếu trình duyệt hoăc thiết bị có hỗ trợ dùng HTML5 để xác định vị trí ngƣời dùng thì sẽ trả về vị trí ngƣời dùng và sau đó tạo marker vị trí ngƣời dùng đó.Chi tiết hàm loadMap:

function loadMap(){

//Neu trinh duyet ho tro dinh vi vi tri nguoi dung (adsbygoogle = window.adsbygoogle || []).push({});

if(navigator.geolocation) { navigator.geolocation.getCurrentPosition(getPosition); }

//neu khong,tra ve vi tri mac dinh else{

var myLatlng = new google.maps.LatLng(40.334, -103.644); var yourOption = {

37

zoom : 8,

center : myLatlng,

mapTypeId : google.maps.MapTypeId.ROADMAP };

map = new google.maps.Map(document.getElementById("map"),yourOption); }

}

Hàm getPosition thực hiện việc sử lý sau khi đã nhận tham số truyền vào là tọa độ điểm vị trí của ngƣời dùng :

function getPosition(position){ var lat = position.coords.latitude, lng = position.coords.longitude;

var yourPoint = new google.maps.LatLng(lat, lng ), yourOption = { zoom: 10,

center: yourPoint,

mapTypeId: google.maps.MapTypeId.ROADMAP }; //tao ban do mapPos = document.getElementById("map"); map = new google.maps.Map(mapPos,yourOption); //danh dau vi tri cua ban

marker = new google.maps.Marker({ position: yourPoint, map: map, title: "You are here" });

}

38

#node app.js

Sau khi đăng nhập trình duyệt theo địa chỉ http://localhost:3000 thì ta có kết quả nhƣ sau

Hình 4: Ứng dụng mapchat

39

KẾT LUẬN

Kết quả đạt đƣợc của khóa luận

Khóa luận đã đƣa ra một cái nhìn tổng quát về xu hƣớng webserver, ngôn ngữ và cơ sở dữ liệu trong tƣơng lai gần.Các bài benmark kết quả đã cho thấy đƣợc hiệu quả rõ ràng so với các giải pháp cũ.Với webserver thì ta có thêm một cách tiếp cận mới so với giải pháp hƣớng luồng cũ.Với cơ sở dữ liệu thì ta có một cách lƣu trữ và tổ chức dữ liệu mới đạt hiệu quả cao mà không thông qua các câu truy vấn cũ.

Định hƣớng nghiên cứu tiếp theo

Hiện tại tôi mới tìm hiểu sơ qua về các khái niệm, đặc điểm của các giải pháp.Chƣa đi sâu về nghiên cứu việc triển khai nó với các bài toán lớn, cụ thể.

Trong giai đoạn tiếp theo tôi sẽ nghiên cứu thêm các ứng dụng nữa của NodeJS đáp ứng đƣợc tốt hơn các giải pháp cũ ngoài các ứng dụng thời gian thực nhƣ mapchat.Còn về NoSQL sẽ nghiên cứu thêm các cơ sở dữ liệu khác nhƣ MongoDB hay Cassandra.Các hệ NoSQL cách lƣu trữ khác theo cách lƣu trữ theo văn bản (document storage) nhƣ Key value, column oriented nhƣ C-store.

40

TÀI LIỆU THAM KHẢO

NoSQL [1] http://www.pcworld.com.vn/articles/cong-nghe/cong- nghe/2011/03/1222905/nosql-phan-tan-khong-rang-buoc/ [2] http://en.wikipedia.org/wiki/MongoDB [3] http://www.10gen.com/what-is-mongodb [4] http://en.wikipedia.org/wiki/CouchDB [5] http://en.wikipedia.org/wiki/Cassandra [6] http://en.wikipedia.org/wiki/Membase [7] http://artur.ejsmont.org/blog/content/insert-performance-comparison-of-nosql- vs-sql-servers [8] http://www.cubrid.org/blog/dev-platform/nosql-benchmarking [9] http://kkovacs.eu/cassandra-vs-mongodb-vs-couchdb-vs-redis CouchDB ● [10] http://newtech.about.com/od/databasemanagement/a/Nosql.htm ● [11] http://www.ibm.com/developerworks/opensource/library/os- couchdb/index.html (adsbygoogle = window.adsbygoogle || []).push({});

Một phần của tài liệu PHÁT TRIỂN ỨNG DỤNG WEB (Trang 41 - 50)