Tuesday, 22 October 2013

[HTML 5] Tìm hiểu về WebSocket trong HTML 5

=======================================
 Nguồn: Intenet
=======================================

WebSocket

1. WebSocket là gì?

WebSoket là công nghệ hỗ trợ giao tiếp hai chiều giữa client và server bằng cách sử dụng một TCP socket để tạo một kết nối hiệu quả và ít tốn kém. Mặc dù được thiết kế để chuyên sử dụng cho các ứng dụng web, lập trình viên vẫn có thể đưa chúng vào bất kì loại ứng dụng nào.
Dữ liệu truyền tải thông qua giao thức HTTP (thường dùng với kĩ thuật Ajax) chứa nhiều dữ liệu không cần thiết trong phần header. Một header request/response của HTTP có kích thước khoảng 871 byte, trong khi với WebSocket, kích thước này chỉ là 2 byte (sau khi đã kết nối).
Vậy giả sử bạn làm một ứng dụng game có thể tới 10,000 người chơi đăng nhập cùng lúc, và mỗi giây họ sẽ gửi/nhận dữ liệu từ server. Hãy so sánh lượng dữ liệu header mà giao thức HTTP và WebSocket trong mỗi giây:
- HTTP: 871 x 10,000 = 8,710,000 bytes = 69,680,000 bits per second (66 Mbps)
- WebSocket: 2 x 10,000 = 20,000 bytes = 160,000 bits per second (0.153 Kbps)
Như bạn thấy chỉ riêng phần header thôi cũng đã chiếm một phần lưu lượng đáng kể với giao thức HTTP truyền thống.

2. Giao thức bắt tay của WebSocket

Để thực hiện kết nối, client phải gửi một WebSocket handshake request đến server. Server sẽ gửi trả lại WebSocket handshake response như bên dưới:
Client request:
GET /mychat HTTP/1.1
Host: server.example.com
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Key: x3JJHMbDL1EzLkh9GBhXDw==
Sec-WebSocket-Protocol: chat
Sec-WebSocket-Version: 13
Origin: http://example.com
Server response: (Server Architecture)
HTTP/1.1 101 Switching Protocols
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Accept: HSmrc0sMlYUkAGmm5OPpG2HaGWk=
Để xác nhận việc kết nối, client sẽ gửi một giá trị Sec-WebSocket-Key được mã hóa bằng Based64 đến server. Sau đó bên server sẽ thực hiện:
- Nối thêm chuỗi cố định là "258EAFA5-E914-47DA-95CA-C5AB0DC85B11" vào Sec-WebSocket-Key để được chuỗi mới là "x3JJHMbDL1EzLkh9GBhXDw==258EAFA5-E914-47DA-95CA-C5AB0DC85B11".
- Thực hiện mã hóa SHA-1 chuỗi trên để được:
 "1d29ab734b0c9585240069a6e4e3e91b61da1969".
- Mã hóa kết quả vừa nhận được bằng Base64 để được:
"HSmrc0sMlYUkAGmm5OPpG2HaGWk=".
- Gửi response lại client kèm với giá trị Sec-WebSocket-Accept chính là chuỗi kết quả vừa tạo ra.
Client sẽ kiểm tra status code (phải bằng 101) và Sec-WebSocket-Accept xem có đúng với kết quả mong đợi không và thực hiện kết nối.

3.      WebSocket với Node.js và Socket.IO

Node.js đang là một nền tảng được xây dựng trên Chrome's JavaScript runtime để tạo các ứng dụng network với ngôn ngữ javascript. Như vậy, javascript không bị giới hạn bên trong trình duyệt và ở phía client. Việc sử dụng javascript làm server giúp lập trình viên không cần sử dụng các ngôn ngữ Server-Side như Perl, PHP, ASP.NET, Python, JSP,... mà còn giúp họ tận dụng được những thế mạnh của javascript.
Download và cài đặthttp://nodejs.org/#download .
Nếu bạn sử dụng Windows như tôi, có thể download trực tiếp tại:
Sau đó cài mở cửa sổ console và cài đặt Socket.io bằng lệnh sau:
npm install socket.io

4.      Tìm hiểu về Socket.IO

Với Node.js, bạn chỉ cần biết vài hàm cơ bản như requires() để import thư viện. Công việc c&ogr ave;n lại, chỉ cần dùng Socket.IO nên bạn cần phải tìm hiểu về thư viện này tại đây: http://socket.io/#how-to-use.
Nếu lười tìm hiểu, bạn có thể xem qua vài dòng lý thuyết dưới đây:
- Server: tạo một đối tượng socket bằng phương thức listen(port). Phương thức này chờ đợi một yêu cầu kết nối từ client.
- Client: Kết nối đến server bằng phương thức connect(url,{port: server_port}).
- Socket.IO cung cấp 3 event chính là connect, message và disconnect. Chúng được kích hoạt khi client/server:
    + connect: tạo kết nối
    + message: nhận được thông điệp
    + disconnect: ngắt kết nối
Ví dụ:
socket.on("message", function(msg){
    // console.log("Received: "+ msg);
 });

- Để gửi dữ liệu, ta dùng phương thức send().Dữ liệu có thể là đối tượng (được chuyển thành chuỗi json) và sẽ nhận được qua sự kiện message.
Ví dụ: socket.send("Hello world");
- Socket.IO có thể gửi và nhận các event tự tạo với phương thức emit(). Hai phía gửi và nhận phải biết được tên của event đó để thực hiện giao tiếp:
Ví dụ:
// send:
socket.emit("hello",{msg: "welcome");
// receive:
socket.on("hello", function (data) {
            console.log(data);
           }
        );

1.1.5.      Ví dụ

Trong ví dụ này, tôi sẽ tạo một ứng dụng cho phép client gửi các chuỗi biểu thức toán đến server. Server sẽ tính kết quả và trả về cho client.

Server:

Tạo một tập tin server.js với nội dung sau:
var io = require('socket.io');
 var socket = io.listen(5555);
socket.sockets.on('connection',function(socket){           
        socket.on('message', function(expr){
            console.log('Received expression from client ',expr);
            // catch error for bad expression          
            try{
                socket.send(eval(expr));
            }catch(err){
                socket.emit("error",err.message);
            }
        });               
        socket.on('disconnect', function(){
            // console.log('Disconnected');
        });
});
Sau đó bạn chạy server bằng cách vào cửa sổ console gõ lệnh (:
node [path to js file]
Do tôi chuyển đến thư mục chứa file js nên chỉ cần gõ:
node server.js
Client:
<html>   
    <head>
    <title>WebSocket Client</title>
;   <script src="http://localhost:5555/socket.io/socket.io.js "></script>
    <script>
    window.onload = function(){
        var input = document.getElementById('input');
        var output = document.getElementById('output');
        var socket = io.connect('localhost',{port: 5555});
        socket.on("connect",function(){
            console.log("Connected to the server");
        });
        socket.on('message',function(data) {           
            output.innerHTML = '=' + data;         
        });       
        socket.on('error', function (data) {
            console.log("error:",data);
           }
        );              
        window.sendMessage = function(){           
             socket.send(input.value);
        };     
    } 
    </script>
    </head>
    <body>
        <input type='text' id='input' />
        <span id='output'></span>
        <br/>
        <input type='button' id='send' value='calc' onclick='sendMessage();' />        
    </body>
</html>

Kết quả:


Monday, 21 October 2013

[HTML 5] Tìm hiểu Web SQL Database

===========================================
 Nguồn: internet
===========================================
Web SQL Database là một công nghệ kết hợp giữa trình duyệt và SQLite  để hỗ trợ việc tạo và quản lý database ở phía client. Các thao tác với database sẽ được thực hiện bởi javascript và sử dụng các câu lệnh SQL để truy vấn dữ liệu.

1. Giới thiệu

Lợi ích của SQLite là có để được tích hợp vào các ứng dụng với một thư viện duy nhất để truy xuất được database. Chính vì vậy, bạn có thể sử dụng nó làm cơ sở dữ liệu cho những ứng dụng nhỏ và không cần thiết cài đặt bất kì phần mềm hoặc driver nào. Hiện tại Web SQL Database được hỗ trợ trong các trình duyệt Google Chrome, Opera và Safari.
Trong javascript, bạn sử dụng các phương thức chính sau để làm việc với Web SQL Database.
-          openDatabase: mở một database có sẵn hoặc tạo mới nếu nó chưa tồn tại.
-          transaction/readTransaction: hỗ trợ thực hiện các thao tác với database và rollback nếu xảy ra sai sót.
-          executeSql: thực thi một câu lệnh SQL.

2. Open Database

Phương thức này có nhiệm vụ mở một database có sẵn hoặc tạo mới nếu nó chưa tồn tại. Phương thức này được khai báo như sau:
Database openDatabase(
    in DOMString name,
    in DOMString version,
    in DOMString displayName,
    in unsigned long estimatedSize,
    in optional DatabaseCallback creationCallback
);
Tham số:
-          name: tên của database.
-          version: phiên bản. Hai database trùng tên nhưng khác phiên bản thì khác nhau.
-          displayname: mô tả.
-          estimatedSize: dung lượng được tính theo đơn vị byte.
-          creationCallback: phương thức callback được thực thi sau khi database mở/tạo.
Ví dụ tạo một database với tên “mydb” và dung lượng là 5 MB:
var db = openDatabase("mydb", "1.0", "My First DB", 5 * 1024 * 1024);

3. Transaction

Bạn cần thực thi các câu SQL trong ngữ cảnh của một transaction. Một transaction cung cấp khả năng rollback khi một trong những câu lệnh bên trong nó thực thi thất bại. Nghĩa là nếu bất kì một lệnh SQL nào thất bại, mọi thao tác thực hiện trước đó trong transaction sẽ bị hủy bỏ và database không bị ảnh hưởng gì cả.
Về database, bởi vì nó phụ thuộc vào từng trình duyệt nên vị trí này sẽ do mỗi trình duyệt quyết định. Thông thường thì các dữ liệu sẽ được lưu trong cùng thư mục với ứng dụng hoặc một thư mục dành riêng để lưu trữ dữ liệu cho mỗi ứng dụng.Chẳng hạn với Chrome thì bạn có thể xem trong thư mục sau:
C:\Documents and Settings\{USERNAME}\Local Settings\Application Data\Google\Chrome\User Data\Default\
Interface Database hỗ trợ hai phương thức giúp thực hiện điều này là transaction() và readTransaction().
Điểm khác biệt giữa chúng là transaction() hỗ trợ read/write, còn readTransaction() là read-only. Như vậy sử dụng readTransaction() sẽ cho hiệu suất cao hơn nếu như bạn chỉ cần đọc dữ liệu.
void transaction(
    in SQLTransactionCallback callback,
    in optional SQLTransactionErrorCallback errorCallback,
    in optional SQLVoidCallback successCallback
);

Ví dụ:
var db = openDatabase("mydb", "1.0", "My First DB", 5 * 1024 * 1024);
db.transaction(function (tx) {
  // Using tx object to execute SQL Statements
});

4. Execute SQL

executeSql() là phương thức duy nhất để thực thi một câu lệnh SQL trong Web SQL.
Nó được sử dụng cho cả mục đích đọc và ghi dữ liệu
void executeSql(
    in DOMString sqlStatement,
    in optional ObjectArray arguments,
    in optional SQLStatementCallback callback,
    in optional SQLStatementErrorCallback errorCallback
);

 Ví dụ 1:

Tạo bảng Customers và thêm hai dòng dữ liệu vào bảng này.
db.transaction(function (tx) {
  tx.executeSql("CREATE TABLE IF NOT EXISTS CUSTOMERS(id unique, name)");
  tx.executeSql("INSERT INTO CUSTOMERS (id, name) VALUES (1, 'peter')");
  tx.executeSql("INSERT INTO CUSTOMERS (id, name) VALUES (2, 'paul')");
});
Tuy nhiên cách thực thi SQL trên không được rõ ràng và có thể bị các vấn đề về bảo mật như SQL injection. Vì vậy tốt hơn bạn nên để các tham số cần truyền cho câu SQL trong một mảng và đặt vào làm tham số thứ 2 của phương thức executeSql(). Các vị trí trong câu SQL chứa tham số sẽ được thay thế bởi dấu ‘?’:
tx.executeSql("INSERT INTO CUSTOMERS (id, name) VALUES (?,?)", [1,"peter"]);
tx.executeSql("INSERT INTO CUSTOMERS (id, name) VALUES (?,?)", [2,"paul"]);

Ví dụ 2:

Hiển thị dữ liệu của bảng Customer lên trang web dưới dạng table:
db.readTransaction(function(tx){
    showCustomers(tx);
});
function showCustomers(tx)
{
    var table="",row="";
    var i;
    tx.executeSql("SELECT * FROM CUSTOMERS", [], function (tx1, results) {
    for (i=0;i < results.rows.length; i++){
        var customer=results.rows.item(i);
        row="<td>"+customer.id+"</td>";
        row+="<td>"+customer.name+"</td>";
        table+="<tr>"+row+"</tr>";
    }
    table="<table border='1'><th>Id</th><th>Name</th><tbody>"+table+"</tbody></table>";
    document.write(table);
    }, null);
}


Bạn có thể xem các database được tạo ra trong thẻ Resources của Chrome Developer Tools (Ctrl+Shift+I).
Ví dụ hoàn chỉnh
<!DOCTYPE HTML>
<html>
<head>
<script type="text/javascript">
var db = openDatabase("mydb", "1.0", "My First DB", 5 * 1024 * 1024);
db.transaction(function (tx) {
  tx.executeSql("CREATE TABLE IF NOT EXISTS CUSTOMERS(id unique, name)");
tx.executeSql("INSERT INTO CUSTOMERS (id, name) VALUES (?,?)", [1,"peter"]);
tx.executeSql("INSERT INTO CUSTOMERS (id, name) VALUES (?,?)", [2,"paul"]);
});
db.readTransaction(function(tx){
    showCustomers(tx);
});
function showCustomers(tx)
{
    var table="",row="";
    var i;
    tx.executeSql("SELECT * FROM CUSTOMERS", [], function (tx1, results) {
    for (i=0;i < results.rows.length; i++){
        var customer=results.rows.item(i);
        row="<td>"+customer.id+"</td>";
        row+="<td>"+customer.name+"</td>";
        table+="<tr>"+row+"</tr>";
    }
    table="<table border='1'><th>Id</th><th>Name</th><tbody>"+table+"</tbody></table>";

    document.write(table);
    }, null);
}
</script>
</head>
<body>
</body>
</html>

Friday, 11 October 2013

[Tools] Add-ons kiểm tra công nghệ và phân tích website NetCraft và WappAlyzer

==================================================
  Nguồn : www.novadq.blogspot.com
==================================================
Hôm nay mình giới thiệu với các bạn 2 tiện ích mở rộng của trình duyệt rất hay.

- Add-On NetCraft:

   Phân tích website giúp người dùng có các thông tin đánh giá mức độ an toàn khi truy cập trang web.
   Cho phép report website lừa đảo.
   Các thông số: rank, chấm điểm rủi ro, thời gian bắt đầu được đánh giá,...
   Điểm hay nhất theo tớ là cái chức năng SiteReport. Nó là công cụ lookup một URL.
   Link: http://toolbar.netcraft.com


- Add-On WappAlyzer:


   Tiện ích này phân tích và đưa ra những phần mềm, công nghệ mà website sử dụng.
   Ví dụ: Server chạy hệ điều hành nào? phiên bản bao nhiêu? Phiên bản jQuery? ..v.v....
   Link: http://wappalyzer.com/download

Với hai tiện ích này chúng ta có thể có một cái nhìn tổng quan về website đang truy cập. :)


Thursday, 3 October 2013

[HTML 5] Giới thiệu Web Worker html5

-          Hỗ trợ thực thi JavaScript đa luồng.
-          Đối tượng Web Worker được tạo ra sẽ thực thi trong một thread độc lập và chạy ở chế độ nền nên không ảnh hưởng đến giao diện tương tác của trang web với người dùng. Với đặc điểm này, bạn có thể sử dụng Web Worker các công việc đòi hỏi thời gian xử lý lâu nạp dữ liệu, tạo cache,…
-          Điểm hạn chế của Web Worker là không thể truy xuất được thành phần trên DOM, và cả các đối tượng window, document hay parent. Mã lệnh các công việc cần thực thi cũng phải được cách ly trong một tập tin script.


-          Ví dụ code:


-          Chú ý:
o   Worker chỉ thực thi khi tải hoàn tất việc tải file JS.
o   Dữ liệu gửi đi truyền trong tham số postMessage
o   Dữ liệu trả về được lấy trong thuộc tính data của tham số event trong hàm xử lý sự kiện message.
o   Một Worker chỉ dành riêng cho một công việc cụ thể.

o   Giải phóng worker sau khi hoàn thành với phương thức terminate().