GSON là gì?

Gson là một thư viện java cho phép người sử dụng có thể chuyển đổi từ một đối tượng Java sang JSON và cũng có thể chuyển đổi từ một đối tượng JSON sang java.Gson có thể làm việc với đối tượng java tùy ý bao gồm các đối tượng tồn tại sẵn mà bạn không có source-code của chúng.

Việc dùng Gson rất dễ dàng, không tốn công parse và cũng giúp chúng ta đỡ nhầm lẫn hơn khi parse trực tiếp từ JSON sang java. Đặc biệt là khi làm việc với những chuỗi JSON có rất nhiều trường.

  • Mục tiêu của Gson:
    • Cung cấp đơn giản toJson()và fromJson()phương pháp để chuyển đổi các đối tượng Java để JSON và ngược lại.
    • Cho phép tồn tại trước đó đối tượng unmodifiable để được chuyển đổi sang và từ JSON.
    • Hỗ trợ mở rộng của Java Generics.
    • Cho phép đại diện tùy chỉnh cho các đối tượng.
    • Hỗ trợ đối tượng tùy tiện phức tạp (với phân cấp thừa kế sâu và sử dụng rộng rãi các loại generic).
  • Tài liệu về Gson
    • Gson API: Javadocs for the current Gson release
    • Gson user guide: This guide contains examples on how to use Gson in your code.
    • Gson Roadmap: Details of changes in the recent versions
    • Gson design document: This document discusses issues we faced while designing Gson. It also includes a comparison of Gson with other Java libraries that can be used for Json conversion

    Thắc mắc và hỏi đáp tại google-gson Google group.

  • Chi tiết hơn về GSON cũng như các tài liệu tham khảo liên quan có thể tham khảo trên link sau :https://github.com/google/gson

Cài đặt NodeJS và một số lỗi thường gặp

Cài đặt NodeJS trên Window và Mac OS

Có lẽ Window và Mac OS là hai nển tảng dễ cài đặt NodeJS nhất, bạn chỉ cần vào trang chủ của NodeJS

[[code]]czoyMDpcImh0dHBzOi8vbm9kZWpzLm9yZw0KXCI7e1smKiZdfQ==[[/code]]
Để tải về phiên bản mới nhất và cài đặt. Sau khi cài đặt thành công, bạn hãy mởi cmd (Window), terminal (Mac OS) để kiểm tra cài đặt đã thành công hay chưa, bằng cách gõ lệnh:
[[code]]czo5Olwibm9kZSAtdg0KXCI7e1smKiZdfQ==[[/code]]
Nếu xuất ra version của NodeJS tức là bạn đã cài đặt thành công. Tiếp theo là kiểm tra NPM – Công cụ quản lý package của NodeJS.
[[code]]czo4OlwibnBtIC12DQpcIjt7WyYqJl19[[/code]]
Nếu xuất ra version của NPM bạn đã cài đặt thành công NodeJS, giờ chỉ việc lên ý tưởng và bắt đầu một project. VD:

Cài đặt NodeJS trên Ubuntu (12.04, 16.00+)

Trên Ubuntu, chúng ta sẽ dùng apt để cài đặt NodeJS. Đầu tiên, bạn nên update tất cả package của hệ điều hành để đảm bảo việc cài đặt NodeJS không gặp vấn đề.

[[code]]czoyMjpcInN1ZG8gYXB0LWdldCB1cGRhdGUuDQpcIjt7WyYqJl19[[/code]]

Cài NodeJS

[[code]]czoyOTpcInN1ZG8gYXB0LWdldCBpbnN0YWxsIG5vZGVqcw0KXCI7e1smKiZdfQ==[[/code]]

Cài đặt NPM

[[code]]czoyNjpcInN1ZG8gYXB0LWdldCBpbnN0YWxsIG5wbQ0KXCI7e1smKiZdfQ==[[/code]]
Để kiểm tra NPM và NodeJS đã cài đặt được chưa:
[[code]]czoxOTpcIm5vZGVqcyAtdg0KbnBtIC12DQpcIjt7WyYqJl19[[/code]]
Đến đây bạn sẽ thắc mắc vì sao trên Window, Mac OS, ta dùng lệnh node -v nhưng sao trên Ubuntu lại là nodejs -v.

Lý do là vì Ubuntu có một thành phần của hệ thống “mang tên” node rồi, nên NodeJS sinh sau, đẻ muộn đành phải dùng “tên” mới.

Điều này gây ra một số lỗi khi bạn cài NodeJS modules làm cho việc cài đặt không thành công. Để khắc phục ta sẽ symlink biến môi trường node về nodejs bằng lệnh sau:

[[code]]czo0MjpcInN1ZG8gbG4gLXMgL3Vzci9iaW4vbm9kZWpzIC91c3IvYmluL25vZGUNClwiO3tbJiomXX0=[[/code]]
Bạn hãy kiểm tra lại version của NodeJS bằng cách:
[[code]]czo5Olwibm9kZSAtdg0KXCI7e1smKiZdfQ==[[/code]]

Cài đặt NodeJS trên CentOS

Đầu tiên bạn nên update các package của hệ điều hành bằng câu lệnh:

[[code]]czoyMDpcInN1ZG8geXVtIC15IHVwZGF0ZQ0KXCI7e1smKiZdfQ==[[/code]]
Trên CentOS, chúng ta ưu tiên cài đặt NodeJS bằng cách build source, để làm được điều này, ta cần cài đặt các công cụ cần thiết bằng lệnh:
[[code]]czo0ODpcInN1ZG8geXVtIC15IGdyb3VwaW5zdGFsbCBcXFwiRGV2ZWxvcG1lbnQgVG9vbHNcXFwiDQpcIjt7WyYqJl19[[/code]]
Sử dụng wget tải source NodeJS:
[[code]]czo1NzpcIndnZXQgaHR0cDovL25vZGVqcy5vcmcvZGlzdC92MC4xMC40L25vZGUtdjAuMTAuNC50YXIuZ3oNClwiO3tbJiomXX0=[[/code]]
Giải nén và cd vào thư mục source:
[[code]]czo0NjpcInRhciB6eGYgbm9kZS12MC4xMC40LnRhci5neg0KY2Qgbm9kZS12MC4xMC40DQpcIjt7WyYqJl19[[/code]]
Chạy file config để chuẩn bị build source: ./configure Và đây là bước quan trọng nhất, chúng ta sẽ bắt đầu build:
[[code]]czo2OlwibWFrZQ0KXCI7e1smKiZdfQ==[[/code]]
Khi quá trình này hoàn thành, ta chạy tiếp lệnh này:
[[code]]czoxNDpcIm1ha2UgaW5zdGFsbA0KXCI7e1smKiZdfQ==[[/code]]
Quá trình build source NodeJS đã hoàn thành, giờ bạn chỉ cần thực hiện bước kiểm tra xem NodeJS đã cài đặt thành công chưa như với Window, Mac OS, Ubuntu.

Một số lỗi thường gặp

Không cài đặt NodeJS module cho project được Nếu NPM đã cài đặt thành công nhưng khi chạy lệnh:

[[code]]czo3MjpcIm5wbSBpbnN0YWxsIHTDqm5fbW9kdWxlDQpIb+G6t2Mga2hpIGPDsyBmaWxlIHBhY2thZ2UuanNvbg0KbnBtIGluc3RhbGx7WyYqJl19DQpcIjt7WyYqJl19[[/code]]
Mà có lỗi xuất hiện, thì rất có thể NPM trên máy của bạn đang dùng là phiên bản cũ. Lệnh này sẽ update NPM với phiên bản mới nhất. Chỉ cần chạy lệnh:
[[code]]czoyMzpcInN1ZG8gbnBtIGluc3RhbGwgLWcgbnBtXCI7e1smKiZdfQ==[[/code]]

Giới thiệu về MongoDB

MongoDB là gì ?

Hiểu một cách nôm na thì MongoDB là một mã nguồn mở và là một tập tài liệu dùng cơ chế NoSQL để truy vấn, nó được viết bởi ngôn ngữ C++. Chính vì được viết bởi C++ nên nó có khả năng tính toán với tốc độ cao chứ không giống như các hệ quản trị CSDL hiện nay. Nếu như bạn biết sử dụng JSON thì trong MongoDB cũng có cấu trúc lưu trữ tương tự, chính vì thế nó có hiệu suất cao, tương tác nhanh và khả năng mở rộng tốt, nó hoạt động trên khái niệm collection và document.

  • Collection trong MongoDB là nhóm các tài liệu (document), nó tương đương với một bảng (table) trong CSDL thông thường nên mỗi collection sẽ thuộc về một database duy nhất. Tuy nhiên nó có một sự khác biệt đó là nó không có ràng buộc Relationship như các hệ quản trị CSDL khác nên việc truy xuất rất nhanh, chính vì thế mỗi collection có thể chứa nhiều thể loại khác nhau không giống như table trong hệ quản trị mysql là các field cố định.
  • Document trong MongoDB có cấu trúc tương tự như kiểu dữ liệu JSON, nghĩa là sẽ có các cặp (key => giá trị) nên nó có tính năng động rất lớn. Document ta có thể hiểu nó giống như các record dữ liệu trong MYSQL, tuy nhiên nó có sự khác biệt là các cặp (key => value) có thể không giống nhau ở mỗi document.

MongoDB hoạt động như thế nào?

mongodb-yeulaptrinh.pw

MongoDB hoạt động dưới một tiến trình ngầm service luôn mở một cổng (Cổng mặc định là 27017) để lắng nghe các yêu cầu truy vấn, thao tác từ các ứng dụng gửi vào sau đó mới tiến hành xử lý. Mỗi một bản ghi của MongoDB được tự động gắn thêm một field có tên “_id” thuộc kiểu dữ liệu ObjectId mà nó quy định để xác định được tính duy nhất của bản ghi này so với bản ghi khác, cũng như phục vụ các thao tác tìm kiếm và truy vấn thông tin về sau. Trường dữ liệu “_id” luôn được tự động đánh index (chỉ mục) để tốc độ truy vấn thông tin đạt hiệu suất cao nhất. Mỗi khi có một truy vấn dữ liệu, bản ghi được cache (ghi đệm) lên bộ nhớ Ram, để phục vụ lượt truy vấn sau diễn ra nhanh hơn mà không cần phải đọc từ ổ cứng. Khi có yêu cầu thêm/sửa/xóa bản ghi, để đảm bảo hiệu suất của ứng dụng mặc định MongoDB sẽ chưa cập nhật xuống ổ cứng ngay, mà sau 60 giây MongoDB mới thực hiện ghi toàn bộ dữ liệu thay đổi từ RAM xuống ổ cứng.

Ưu điểm của MongoDB

  • Dữ liệu lưu trữ phi cấu trúc, không có tính ràng buộc, toàn vẹn nên tính sẵn sàng cao, hiệu suất lớn và dễ dàng mở rộng lưu trữ.
  • Dữ liệu được caching (ghi đệm) lên RAM, hạn chế truy cập vào ổ cứng nên tốc độ đọc và ghi cao.

Nhược điểm của MongoDB

  • Không ràng buộc, toàn vẹn nên không ứng dụng được cho các mô hình giao dịch yêu cầu độ chính xác cao.
  • Không có cơ chế transaction (giao dịch) để phục vụ các ứng dụng ngân hàng.
  • Dữ liệu được caching, lấy RAM làm trọng tâm hoạt động vì vậy khi hoạt động yêu cầu một bộ nhớ RAM lớn.
  • Mọi thay đổi về dữ liệu mặc định đều chưa được ghi xuống ổ cứng ngay lập tức vì vậy khả năng bị mất dữ liệu từ nguyên nhân mất điện đột xuất là rất cao.

TỔNG HỢP TÀI LIỆU VÀ ĐỀ THI GIẢI TÍCH 1

 

Đề cương

Đề thi giữa kỳ

Đề giải tích 1 giữa kỳ ĐH Công nghệ (UET)
giai-tich-1-yeulaptrinh

giua-ky-giai-tich-1-yeulaptrinh.pw

Đề thi cuối kỳ

VNU 2016-2017

giai-tich-2016-2017

Giải tích 1 (VNU năm học 2015-2016)

giai-tich-1-2016-yeulaptrinh.pw

Bài tập – Thực hành

https://drive.google.com/open?id=0B1zK9uGpggiyMGczRW1nclA3aWs

 

Lý thuyết – Bài giảng

https://drive.google.com/open?id=0B1zK9uGpggiyMWFxdkJ1R19ua1k

(đang cập nhập)

mọi đóng góp xin gửi về yeulaptrinh.pw@gmail.com

xin cảm ơn!

Tổng hợp đề thi, tài liệu ôn thi giữa kỳ môn Đại số

 

Tổng hợp tất cả đề thi giữa kỳ Đại Số từ K55-K61 BKHN.

https://goo.gl/uvyNj2
https://goo.gl/kyYkDx
https://goo.gl/rr8nkQ


Các tài liệu học tập:

https://goo.gl/84xQeC
https://goo.gl/kaSMT2
https://goo.gl/286fw8
https://goo.gl/jE227Z
https://goo.gl/P3q32L
https://goo.gl/36Np4B
https://goo.gl/Mo3bE6
https://goo.gl/rkAfcM
https://goo.gl/BAvVy7
https://goo.gl/cjV31Y

Một số đề thi mới cập nhập: …

ĐỀ 1 – 20163

 

ĐỀ 2 – 20163

ĐỀ 1 – 20151

ĐỀ 1 – 20161

ĐỀ 2 – 20161

ĐỀ 3 – 20151

ĐỀ 3 – 20161

ĐỀ 5 – 20151

Thuật toán Kruskal tìm cây khung nhỏ nhất

Định nghĩa cây khung – Cây khung nhỏ nhất

Cho đồ thị vô hướng, cây khung (spanning tree) của đồ thị là một cây con chứa tất cả các đỉnh của đồ thị. Nói cách khác, cây khung là một tập hợp các cạnh của đồ thị, không chứa chu trình và kết nối tất cả các đỉnh của đồ thị.

Trong đồ thị có trọng số, cây khung nhỏ nhất là cây khung có tổng trọng số các cạnh nhỏ nhất. Định nghĩa tương tự với cây khung lớn nhất.

Thuật toán Kruskal

Ban đầu mỗi đỉnh là một cây riêng biệt, ta tìm cây khung nhỏ nhất bằngcách duyệt các cạnh theo trọng số từ nhỏ đến lớn, rồi hợp nhất các cây lại với nhau.

Cụ thể hơn, giả sử cạnh đang xét nối 2 đỉnh u và v nếu 2 đỉnh này nằm ở 2 cây khác nhau thì ta thêm cạnh này vào cây khung, đồng thời hợp nhất 2 cây chứa u và v.

Để thực hiện thao tác trên một cách nhanh chóng, ta sử dụng cấu trúc Disjoint Set, độ phức tạp của toàn bộ thuật toán là O(M log M) với M là số cạnh.

Cài đặt

Đoạn code dưới cài đặt thuật toán Kruskal, có thể dùng để nộp bài

QBMST.

#include <iostream>
#include <vector>
#include <algorithm> // Hàm sort
using namespace std;
 
// Cấu trúc để lưu cạnh đồ thị,
// u, v là 2 đỉnh, w là trọng số cạnh
struct edge {
    int u, v, w;
};
// Hàm so sánh để dùng trong hàm sort ở dưới
bool cmp(const edge &a, const edge &b) {
    return a.w < b.w;
}
 
// Số đỉnh tối đa trong đề bài
#define N 10005
 
// 2 mảng sử dụng trong Disjoint Set
int cha[N], hang[N];
 
// Tìm xem u thuộc cây nào
int find(int u) {
    if (cha[u] != u) cha[u] = find(cha[u]);
    return cha[u];
}
 
// Hợp nhất 2 cây chứ u và v,
// Trả về false nếu không thể hợp nhất
bool join(int u, int v) {
    u = find(u); v = find(v);
    if (u == v) return false;
    if (hang[u] == hang[v]) hang[u]++;
    if (hang[u] < hang[v]) cha[u] = v;
    else cha[v]=u;
    return true;
}
 
int main() {
    // Thêm dòng này để cin, cout chạy nhanh
    ios::sync_with_stdio(false); cin.tie(0);
 
    // Nhập vào số đỉnh và số cạnh
    int n, m; cin >> n >> m;
 
    // Nhập danh sách các cạnh
    vector<edge> edges(m);
    for (edge &e: edges) cin >> e.u >> e.v >> e.w;
 
    // Sắp xếp lại các cạnh theo trọng số tăng dần
    sort(edges.begin(), edges.end(), cmp);
 
    // Khởi tạo cấu trúc Disjoint Set
    for (int i=1; i<=n; i++) {
        cha[i] = i;
        hang[i] = 0;
    }
 
    // Lưu tổng trọng số các cạnh trong cây khung nhỏ nhất
    int mst_weight = 0;
 
    // Duyệt qua các cạnh theo thứ tự đã sắp xếp
    for (edge &e: edges) {
        // Thử hợp nhất 2 cây chứa u và v
        if (join(e.u, e.v)) {
            // Hợp nhất thành công, ta thêm e và kết quả
            mst_weight += e.w;
        }
    }
 
    // Xuất kết quả
    cout << mst_weight;
    return 0;
}

IOIBIN – spoj

Đề bài:

Thuật toán:

Code:

const   fi = '';
        fo = '';
        maxn = trunc(1e4)+3;
var     p : array[1..maxn] of longint;
        i,j,n,m : longint;
        x,u,v : longint;
procedure chuanbi;
begin
        for i:=1 to maxn do p[i]:=i;
end;
function find(i:longint):longint;
begin
        while p[i]<>i do i:=p[i];
        exit(i);
end;
procedure lam1;
var     i,j : longint;
begin
        i:=find(u);
        j:=find(v);
        if i<>j then
        if i<j then p[j]:=p[i] else p[i]:=p[j];
end;
procedure main;
var     i:longint;
begin
        assign(input,fi);reset(input);
        assign(output,fo);rewrite(output);
        readln(m);
        chuanbi;
 
        for i:=1 to m do
                begin
                        readln(u,v,x);
                        if x=1 then lam1 else
                                if find(u)=find(v) then writeln(1) else writeln(0);
                end;
        close(input);
        close(output);
end;
begin
        main;
end.