Home Blog Page 64

[Thuật toán] Độ Phức Tạp Không Hề Phức Tạp

Độ phức tạp của thuật toán

Bài viết được sự cho phép của tác giả Trần Thiện Khiêm

Trong loạt bài này mình sẽ giới thiệu về thuật toán và một số thuật toán cơ bản hay được sử dụng + giải thích cho các bạn.

THUẬT TOÁN LÀ GÌ?

Nhưng đầu tiên hết hãy tìm hiểu xem thuật toán là gì? Nói đơn giản thuật toán là:

“Tập hợp các bước để xử lí một vấn đề (loại vấn đề) nào đó.”

Ví dụ, để tính tổng các số tự nhiên từ 1 – N, thì chúng ta làm các bước sau (1)

– Gán tổng = 0

– Cộng tổng với 1

– Cộng tổng với 2

– Cộng tổng với n

– Ta được kết quả tổng là kết quả.

Hay nói một cách khác (2)

– Gán Tổng = 0

– Lần lượt với tất cả giá trị i trong đoạn 1 tới N, cộng i vào tổng

Hoặc có 1 cách khác (3)

– Tính tổng = N * (N + 1) / 2.

Như vậy các bước giải vấn đề, người ta gọi là thuật toán. Vậy bất cứ khi nào các bạn viết code, thì đó chính là thuật toán. Nên nếu có ai đó nói với bạn rằng, học thuật toán làm gì sau này đi làm không có dùng thuật toán, thế thì hãy hỏi lại: “không xài thuật toán thì bạn code cái gì vậy?”. Không có vụ không có thuật toán mà có code nhé, chỉ có thuật toán ngon hay dở thôi.

Tất nhiên đối với một vấn đề, có thể có nhiều cách giải quyết khác nhau, có cách giải quyết nhanh chóng, có cách giải chậm, có cách giải đơn giản, có cách giải phức tạp, đó là lý do học thuật toán. Đó là lí do tại sao người ta có senior dev, có junior. Đó cũng là lí do tại sao mấy công ty lớn người ta lại hỏi về thuật toán. Học thuật toán, chúng ta học gì:

– Học tư duy thuật toán để khi có một vấn đề mới chúng ta biết cách tiếp cận, biết cách đánh giá lời giải chúng ta đưa ra.

– Học các thuật toán phổ biến để khi gặp trường hợp tương tự chúng ta biết cách sử dụng mà không phải tốn thời gian nghĩ ra các lời giải khác. Thường thường các thuật toán này đã đươc viết lại dạng thư viện, nên chúng ta có thể dựa vào đó để tìm ra thư viện tương ứng để xài, vừa đạt hiệu quả cao nhất, mà không phải tốn công giải lại (nói nôm na là copy và paste ở 1 đẳng cấp khác).

ĐÁNH GIÁ THUẬT TOÁN

Thường chúng ta có thể dùng phương pháp đo thời gian chạy (benchmark) để đánh giá xem thuật toán đưa ra có hiệu quả không. Đây là cách chính xác nhất. Tuy nhiên, cách này có một nhược điểm là chúng ta phải code xong thuật toán đó, và nó hoàn toàn phụ thuộc vào kích thước mẫu của dữ liệu đưa vào. Cách này có thể các bạn sẽ thấy khi các bạn submit bài leetcode, nếu timeout thì chắn tỏ thuật toán của toán của bạn quá cùi

Có 1 cách đánh giá khác đơn giản hơn trước khi bạn code đó là đánh giá dựa vào độ phức tạp thời gian (time complexity). Chúng ta có thể đánh giá ngay thuật toán trước khi code, để xem thuật toán có khả thi hay không.

độ phức tạp thời gian

VẬY ĐỘ PHỨC TẠP THỜI GIAN LÀ GÌ?

Nôm na độ phức tạp thời gian của thuật toán là ước lượng thời gian thực thi của thuật toán đó theo kích thước dữ liệu đầu vào. Chính vì có sự phụ thuộc này nên độ phức tạp thuật toán được biểu diễn dưới dạng hàm số O(1), O(N), O(N2), nghe thật đau đầu và khó hiểu…

Vậy mình xin có 1 số ví dụ như sau:

Với bài toán nêu trên, tính tổng của các số tự nhiên từ 1 .. N, chúng ta có 3 cách, tuy nhiên cách đầu tiên khó mà tổng quát hoá được, nên chúng ta sẽ tập trung vào cách (2), và cách (3).

Với cách số (2), chúng ta phải tính N phép tính cộng, giả sử một phép tính tốn 1ms (giả sử máy tính cùi bắp nha), thì ta có kết quả sau:

N = 1, thời gian là 1ms.

N = 2, thời tian là 2ms,

N = 10, thời gian là 10ms. (vì phải cộng 10 lần)

Ta thấy thời gian tỉ lệ thuận với N, do đó ta gọi thuật toán này có độ phức tạp tuyến tính (linear complexity) hay O(N), nếu N tăng lên 10 lần, thì thời gian của thuật toán sẽ tăng thêm 10 lần, nếu N tăng lên 1000 lần, thời gian sẽ tăng lên 1000 lần.

Đối với cách (3), cho dù với N bằng bao nhiêu đi nữa, thì chúng ta chỉ cần 1 phép tính toán như nhau để tìm ra kết quả. Vậy thời gian không hề phụ thuộc vào dữ liệu đầu vào. Người ta gọi đây là độ phức tạp hằng số (constant time), hay O(1). Ví dụ, nếu thời gian để thực hiện công thức tên tốn 3ms, thì với bất cứ N nào, cũng sẽ tốn 3ms (với lí tưởng là thời gian thực thi của máy tính như nhau).

MỘT SỐ VÍ DỤ KHÁC

Thuật toán tìm kiếm tuần tự:

Giả sử chúng ta cần tìm một phần tử trong danh sách cho sẵn, thì chúng ta phải lần lượt kiểm tra từng phần tử cho đến khi tìm thấy phần tử cần tìm, đây gọi là thuật toán tìm kiếm tuần tự.

Ứng dụng:

String.indexOf(), Collection.indexOf(): xác định vị trí 1 ký tự trong chuỗi hoặc một phần tử trong Collection. Những thứ các bạn xài hằng ngày.

SELECT id FROM TABLE WHERE AGE=30; tìm một thành phần trong một bảng cơ sở dữ liệu mà cột chưa được đánh index.

Độ phức tạp: tuyến tính hay O(N).

Các bạn sẽ thắc mắc, là chúng ta có cần phải chạy hết N phần tử đâu, vì sao vẫn gọi là O(N), nếu phần tử cần tìm của mình nằm ở vị trí số 1, hoặc số 2, thì mình sẽ tìm ra ngay, và rõ ràng không cần chạy hết N bước.

Giải thích: giả sử phân bố của tất cả các phần tử là như nhau, thì với N phần tử, số bước tính trung bình của thuật toán này là xấp xỉ N/2 bước. Bây giờ, mình tăng N lên 10 lần, thì số bước trung bình của thuật toán này là xấp xỉ 10N/2. (10N/2) / (N/2) thì vẫn là tăng lên 10 lần, đảm bảo định nghĩa của O(N).

Rõ ràng, với độ phức tạp như thế này, các bạn sẽ cần phải cân nhắc sử dụng các thuật toán tìm kiếm tốt hơn nếu bộ dữ liệu của mình đủ lớn, hoặc nếu thuật toán này được gọi trong một vòng lặp khác. Vậy có những thuật toán tìm kiếm nào khác…

Nếu không biết thì xem độ phức tạp này ở đâu?

Trường hợp của các hàm có sẵn trong thư viện, chúng ta có thể tra document của ngôn ngữ đó để tìm ra độ phức tạp, hoặc google…

Với SQL chúng ta có thể sử dụng câu lệnh EXPLAIN

Nếu còn không tìm ra thì lo học đi ạ…

(còn tiếp…)

Bài viết gốc được đăng tải tại fanpage Khiem Tran – Programmer

Hiểu thêm về thuật toán, nếu bạn muốn:

Đừng bỏ lỡ việc làm IT lương cao trên TopDev nhé!

VIETNAM MOBILE DAY 2022: CÂU CHUYỆN VỀ CÔNG NGHỆ MOBILE ĐƯỢC HÉ LỘ

dien gia tai vietam mobile day 2022

Sáng hôm nay, ngày 3/6/2022, sự kiện công nghệ được mong chờ nhất năm – Vietnam Mobile Day 2022 – We Connect đã chính thức “nổ ra” tại điểm cầu đầu tiên – Tp. Hồ Chí Minh.

Giới thiệu Vietnam Mobile Day 2022 – We Connect

Sự kiện diễn ra trong không khí sôi động và thực sự bùng nổ với sự tham gia của:

  • Gần 50 Diễn giả & Chuyên gia hàng đầu về Marketing, Business và Technical với hàng loạt Topic hấp dẫn liên quan đến các xu hướng mới nhất hiện nay: Web3, M-Commerce, SocialFi, GameFi, Metaverse,…
  • Hơn 10+ Nhà tài trợ mang đến các khu vực gian hàng đầy thú vị là các thương hiệu nổi bật như AppsFlyer, Positive Thinking Company, NetCore, VietGuys, Appota,…
  • Hàng ngàn lượt tham gia & quan tâm từ cộng đồng Công nghệ, Marketer, Business trên toàn quốc.

Những điểm nóng về Mobile Tech – Câu chuyện và những con số quan trọng

Khai mạc Vietnam Mobile Day 2022, ông Park JongHo – CEO tại TopDev – Đơn vị tổ chức sự kiện đã có đôi lời chia sẻ và giới thiệu về những chủ đề & nội dung chính trong sự kiện.

Hàng loạt nội dung về xu hướng tiếp thị, bí quyết phát triển doanh nghiệp, câu chuyện và cả những kinh nghiệm thực chiến đã được hé lộ tại sự kiện năm thứ 12 của Vietnam Mobile Day.

Công nghệ 5G, Inbound Marketing, vũ trụ Metaverse, Mobile CRM,… là những chủ đề thu hút người tham gia với rất nhiều những khái niệm thuật ngữ mới cùng nhiều tính năng ấn tượng được giới thiệu bởi các Diễn giả.

diễn giả
Đội ngũ diễn giả chất lượng, sở hữu chuyên môn và kinh nghiệm thực chiến cao

Sức hút đến từ những tên tuổi Diễn giả & Chuyên gia

Những chủ đề Marketing đã được đem đến cho người tham dự qua những chia sẻ thú vị từ các anh/ chị sở hữu kinh nghiệm dày dặn trong ngành: chị Jennie Thanh (Head Of Community tại Umbala Metaverse), chị Nguyễn Đặng Quỳnh Anh (COO tại SPAC3SHIP), ông Carsten Ley (Founder & Consultant tại Asia PMO), chị Hạnh Lê (Co-founder & COO của PMAX Vietnam), chị Nana Phan (Senior Account Executive tại AppsFlyer) & anh Tuấn Nguyễn (Account Manager tại AppsFlyer)…

Sự góp mặt của các chuyên gia về Công nghệ: anh Philip Hùng Cao (Cyber & Zero Trust Evangelist), anh Vũ Duy Tiếp (CPO tại Topebox), anh Nguyễn Đức Hoàng (CTO tại Online Music Education JSC), anh Giáp Văn Đại (Founder & CEO tại Nami Foundation),… đã mang đến sự kiện Vietnam Mobile Day 2022 những khái niệm mới về xu hướng công nghệ như GameFi, NFT, công nghệ Blockchain, Metaverse,…

Những câu chuyện kinh doanh đến từ chị Đinh Mộng Kha (CEO tại VietGuys), chị Tammy Phan (Country Head of Marketing for Vietnam tại Google Asia Pacific), anh Nguyễn Mạnh Tưởng (Co-Founder tại CrmViet), anh Lại Tuấn Cường (CEO & Founder tại Repu Digital), anh Trần Quốc Kỳ (CEO & Co Founder tại GIGAN JSC), … cũng là điểm nhấn giúp tăng thêm phần sinh động cho sự kiện diễn ra hôm 3/6/2022 tại điểm cầu Hồ Chí Minh vừa qua.

Sự sôi động đến từ các gian hàng tại sự kiện

Hàng trăm phần quà hấp dẫn với các trò chơi thú vị đến từ các đơn vị Tài trợ, start up cũng góp phần thu hút sự chú ý từ người tham gia. Với nhiều mini game và hoạt động thú vị, mỗi đơn vị có thể quảng bá thương hiệu mình, đưa ra những sản phẩm Demo và thu hút được sự quan tâm từ người tham gia sự kiện.

Nhiều gian hàng hấp dẫn, thu hút sự chú ý của nhiều người tham dự
Nhiều gian hàng hấp dẫn, thu hút sự chú ý của nhiều người tham dự

Sức nóng từ sự kiện Vietnam Mobile Day 2022 tại điểm cầu Hồ Chí Minh sẽ tiếp tục lan rộng đến địa điểm thứ hai diễn ra tại Hà Nội vào 10/6/2022 sắp tới!

Cùng đếm ngược đến thời điểm diễn ra sự kiện và sẵn sàng hoà vào không khí sôi động của Ngày hội tại thành phố Thủ Đô ngay thôi!

Vietnam Mobile Day 2022 | VMD2022

Ứng dụng thuật toán và cấu trúc dữ liệu lúc đi làm

ứng dụng thuật toán và cấu trúc dữ liệu khi đi làm

Bài viết được sự cho phép của tác giả Trần Thiện Khiêm

Nhiều bạn thắc mắc sau này ra trường có ứng dụng thuật toán và cấu trúc dữ liệu không? Tại sao có nhiều công ty tuyển dụng lại hỏi cái này?

Vì sao phải hiểu rõ thuật toán và cấu trúc dữ liệu

Nhiều bạn cho rằng, đi làm sau này các bạn sẽ không cần dùng tới thuật toán hay cấu trúc dữ liệu gì đặc biệt cả. Nhưng nếu bạn không học sâu về thuật toán và cấu trúc dữ liệu, thì các bạn sẽ không biết những điều căn bản sau đây, ví dụ:

Std::map trong C++ là 1 cái map được cài đặt bằng 1 cây nhị phân tìm kiếm tự cân bằng, trong khi đó HashMap (implement lớp Map) trong Java, lại sử dụng 1 bảng băm ở bên dưới, trong khi lớp tương ứng lại phải là TreeMap (implement SortedMap). Và std::unordered_map trong C++ mới là lớp sử dụng bảng hash như Hash Map.

Điều này có nghĩa là gì? Std::map sẽ có các key được sắp xếp, trong khi các lớp implement lớp Map trong java, không có yêu cầu này. Về độ phức tạp của hàm lấy ra 1 phần tử của std::map sẽ là O (logN) trong khi nếu sử dụng HashMap, thì sẽ là O (1).

Những người học kỹ cấu trúc dữ liệu và thuật toán sẽ hoàn toàn nắm vững điều này, khi sử dụng bất cứ API nào, họ sẽ tìm hiểu cài đặt bên dưới, độ phức tạp thuật toán là nhiêu, có phù hợp với việc họ đang làm hay không?

Mấy thông tin này hoàn toàn có thể đọc từ tài liệu của C++, hoặc Java.

Ví dụ, tài liệu lớp std::map của C++ ở đây, hàm at, https://www.cplusplus.com/reference/map/map/at/ sẽ có phần Complexity giải thích là “Logarithmic in size.” (tức là O (logN)).

Tương tự, tài liệu của TreeMap bên java trong phần overview sẽ ghi là “This implementation provides guaranteed log(n) time cost for the containsKey, get, put and remove operations”. Xem ở đây: https://docs.oracle.com/…/docs/api/java/util/TreeMap.html

Cho dù là ngôn ngữ, framework nào đi nữa, thì những thứ căn bản sẽ rất giống nhau. Mình đưa ra 1 ví dụ đơn giản để các bạn thấy rõ thuật toán nó nằm ở ngay bên dưới cái hàm các bạn đang xài, nên hãy tập cho mình thói quen tìm hiểu cái sâu, cái bản chất, thay vì cái hời hợt bên trên.

hình mô tả

Vì sao phải quan trọng những điều này?

Thứ nhất, khi nhận yêu cầu, mình hoàn toàn phán đoán được có khả năng giải quyết được vấn đề trong yêu cầu hay không.

Thứ hai, trước khi mình viết code, mình sẽ luôn cố gắng tìm ra giải pháp tối ưu.

Thứ ba, trong khi viết code, mình có thể đánh giá được năng suất của đoạn code của mình ở trên production.

Thứ tư, khi có vấn đề về hiệu năng xảy ra, mình sẽ phán đoán được vấn đề nằm ở đâu để xử lí.

VÌ SAO LẠI PHẢI QUAN TRỌNG NHƯ VẬY?

Mình lấy ví dụ công ty cũ của mình đi:

Ở Amazon, khi bạn đưa 1 chức năng lên trên trang www. amazon. com, bạn phải đảm bảo chức năng của bạn không được tăng thời gian thực thi của 1 request lên 3 mili-giây. Sẽ có công cụ để quét và bắt bạn phải gỡ chức năng của mình xuống nếu vi phạm quy định này, và thậm chí bạn còn phải viết “kiểm điểm”

Ở VISA, mình từng optimize hệ thống xử lý email của công ty từ việc xử lý 5 triệu email trong vòng 24 tiếng còn 5 phút.

Công ty bạn không cần tối ưu?

Việc optimize hệ thống nó có ý nghĩa rất lớn: tiết kiệm chi phí, tăng trải nghiệm người dùng, ngoài ra còn giúp bạn tiến xa trong công việc. Công ty bạn có thể không cần thuật toán tối ưu, nhưng bạn chắc chắn cần, nếu bạn muốn tiến xa hơn.

Bài viết gốc được đăng tải tại fanpage Khiem Tran – Programmer

Xem thêm:

Hàng loạt việc làm IT lương cao trên TopDev đang chờ bạn, ứng tuyển ngay!

Hướng Dẫn Tùy Biến Scrollbar Cực Đẹp Dành Cho Người Mới

Hướng dẫn tùy biến scrollbar cực đẹp dành cho người mới

Bài viết được sự cho phép của tác giả Trần Anh Tuấn

Ở bài viết này mình sẽ hướng dẫn cho các bạn cách tùy biến scrollbar cực đẹp cho trang web giống như trang web của mình mà các bạn đang lướt vậy với chỉ một vài dòng CSS cực đơn giản là các bạn có thể làm được rồi. Bắt đầu luôn thôi nào

Scrollbar nó chia ra làm 3 thành phần đó chính là scrollbarscrollbar thumb và scrollbar track.

Scrollbar

Đây là phần chính, thường phần này người ta sẽ tùy biến độ rộng của nó, ví dụ width: 10px chẳng hạn

body::-webkit-scrollbar{   width: 10px;
}

Scrollbar track

Đây là phần bên dưới của scrollbar, là phần hiển thị bên trong scrollbar và chứa scrollbar thumb, ở đây mình có thể cho nó background-color: #fafafa để nó trắng mờ như sau

Scrollbar track
body::-webkit-scrollbar-track{ background-color: #fafafa; }

Scrollbar thumb

Đây là phần chính, đấy chính là cái mà các bạn thường nhấn chuột vào để kéo đó, các bạn có thể tùy biến nó với màu nền hoặc bo góc cũng được, chơi cả gradient như blog mình cũng được như thế này

Scrollbar thumb
body::-webkit-scrollbar-thumb{ background-image: linear-gradient(-45deg, #6a5af9, #d66efd); border-radius: 50px; }

Như vậy là mình đã chỉ xong cho các bạn cách tùy biến scrollbar cho trang web rồi nhé, tuy nhiên cái này không hỗ trợ trên trình duyệt Firefox. Vì thế khi chúng ta áp dụng những đoạn code CSS này vào thì trình duyệt Firefox nó vẫn là mặc định thôi. Nếu các bạn bị buộc phải làm thì có thể tìm hiểu các thư viện tùy biến scrollbar thử nhé. Good luck!

Bài viết gốc được đăng tải tại evondev.com

Xem thêm:

Đừng bỏ lỡ Top việc làm IT hấp dẫn trên TopDev

Dùng Python viết hàm xử lý dữ liệu dưới tầng database cho PostgreSQL

Dùng Python viết hàm xử lý dữ liệu dưới tầng database cho PostgreSQL

Bài viết được sự cho phép của tác giả Nguyễn Hồng Quân

Có một bận, tôi ôm trong tay một bộ CSDL của website nọ, với nhiều thông tin danh tính người thật. Để tránh cho dữ liệu danh tính bị lộ, hưởng ứng tinh thần của Luật An Ninh Mạng, tôi quyết định phải làm xáo trộn dữ liệu đó để nó không còn phản ánh danh tính thật nữa. Cụ thể là tôi sẽ ghi thêm vài kí tự bừa bãi vào cột email, cho nó thành email “xạo” hết.

Nói tới nhu cầu này thì cách dễ nhất là viết đoạn code cho nó chạy một vòng lặp, lặp qua các dòng của bảng dữ liệu, tại mỗi dòng lấy ra cột email, ghi nội dung mới vào rồi lưu lại. Cách đó dễ, nhưng hơi cơ bắp, không tinh tế, sẽ chậm khi bảng dữ liệu hơi lớn. Tôi quyết định thử phương án tạo hàm tùy thêm cho hệ CSDL đó, để có thể sửa tất cả trong một câu truy vấn (query) duy nhất, ví dụ:

UPDATE web_users SET email = my_func(email)

Dùng qua cơ sở dữ liệu, các bạn chắc cũng biết trong câu truy vấn, thỉnh thoảng ta bắt gặp lời gọi hàm. Ví dụ phổ biến nhất là hàm COUNT, ví dụ:

SELECT COUNT(*) FROM student WHERE country = 'VN'

Ngoài những hàm có sẵn như thế, các hệ CSDL vẫn cho phép ta định nghĩa thêm hàm tùy ý, và viết theo cú pháp phương ngữ SQL của hệ CSDL đó, ví dụ trong MySQL:

DELIMITER $$

CREATE FUNCTION CustomerLevel(
	credit DECIMAL(10,2)
) 
RETURNS VARCHAR(20)
DETERMINISTIC
BEGIN
    DECLARE customerLevel VARCHAR(20);

    IF credit > 50000 THEN
		SET customerLevel = 'PLATINUM';
    ELSEIF (credit >= 50000 AND 
			credit <= 10000) THEN
        SET customerLevel = 'GOLD';
    ELSEIF credit < 10000 THEN
        SET customerLevel = 'SILVER';
    END IF;
	-- return the customer level
	RETURN (customerLevel);
END$$
DELIMITER ;

Hơi dài dòng và khó đọc, đúng không, nếu thế thì “tinh tế” qué gì? Thực ra, muốn tinh tế thì nên dùng PostgreSQL, vì PostgreSQL cho phép bạn định nghĩa hàm tùy tạo bằng ngôn ngữ Python luôn (thông qua tính năng PL/Python). Không chỉ là Python ở mặt cú pháp mà còn được import các thư viện Python hẳn hoi! Chúng ta cùng bắt đầu nhé.

Đụng vào tầng database là một việc hơi nguy hiểm, nên ta cần cẩn thận. Trước tiên, hãy cứ viết ra như một đoạn code Python thuần (file *.py), test tiếc cho cẩn thận rồi hãy chuyển vào trong PostgreSQL. Về ý tưởng xáo trộn email thì thuật toán như sau:

  • Đầu tiên, tách địa chỉ email làm hai phần, trước và sau dấu “@”. Ví dụ “ng.hong.quan@gmail.com” thì tách thành “ng.hong.quan” và “gmail.com”.
  • Phần tên miền không cần đụng đến. Tôi sẽ thêm kí tự ngẫu nhiên vào phần tên đăng nhập (username). Thêm một kí tự vào đằng trước, một kí tự vào cuối và một kí tự chen vào giữa, vị trí ngẫu nhiên. Ví dụ, thêm “z” vào trước, “x” vào sau, thành “zng.hong.quanz”, rồi thêm “y” vào giữa, thành “zng.hyong.quanx”.

Bây giờ viết ra thành file tools.py:

import string
import random


def scramble_email(email: str) -> str:
    # No need to handle the case that "@" is missing, because
    # email address was validated before.
    head, tail = email.split('@')
    # No need to handle the case that email is empty.

    # Pick 3 random letters
    c1, c2, c3 = random.sample(string.ascii_lowercase + string.digits, 3)
    # Choose a random middle position
    i = random.randint(1, max(1, len(head) - 2))

    # Put together
    return f'{c1}{head[:i]}{c2}{head[i:]}{c3}@{tail}'

Trong bộ dữ liệu của tôi, cột email là bắt buộc, và dữ liệu được kiểm tra tính hợp lệ trước khi ghi vào, nên hàm scramble_email không cần kiểm tra những trường hợp lắt léo như thiếu dấu “@”, chuỗi rỗng.

Đôi lời giải thích nếu bạn đọc là người non kinh nghiệm về Python:

  • email.split('@') sẽ ngắt thành hai chuỗi con, ví dụ 'quan' và 'agriconnect.vn'. Ta gán hai chuỗi con này cho hai biến head và tail.
  • string.ascii_lowercase + string.digits cho ra một chuỗi gồm từ 'a' đến 'z' và từ '0' đến '9'.
  • random.sample(string.ascii_lowercase + string.digits, 3) là từ chuỗi trên, bốc ra ba kí tự ngẫu nhiên. Sau khi bốc ra, ta gán cho ba biến c1c2c3.
  • Khi lấy vị trí giữa ngẫu nhiên, ta chỉ lấy vị trí từ thứ hai (chỉ số 1) đến kế cuối (chỉ số len(head) - 2). Ta phải lường tình huống chuỗi chỉ có một kí tự, khi đó sẽ lấy vị trí cuối luôn. Đó là lí do có thêm max(1, ...) vào để “thòng”.
  • Sau khi có vị trí ngăn giữa i rồi thì ta dùng cú pháp “slice” để cắt head ra thành hai khúc: head[:i] và head[i:]

Mở console của Python lên, import và cho chạy thử với vài dữ liệu:

test_pure_function

Trông ổn rồi, giờ thì ta mở database lên, cho phép nó sử dụng ngôn ngữ Python:

activate

Lưu ý rằng, mặc dù extension plpython là extension gốc, được hỗ trợ chính thức từ PostgreSQL nhưng trong các bản phân phối Linux (Ubuntu, Fedora), người bảo trì lại tách nó ra gói riêng. Ta cần cài gói đó trước, ví dụ trong Ubuntu là:

sudo apt install postgresql-plpython3-12

Sau đó cấu hình cho PostgreSQL luôn nạp nó lên, bằng cách sửa file /etc/postgresql/12/main/postgresql.conf, tìm dòng “shared_preload_libraries” và thêm “plpython3” vào, ví dụ:

shared_preload_libraries = 'plpython3' 

Nhớ khởi động lại PostgreSQL sau khi sửa cấu hình:

sudo systemctl restart postgresql

Quay lại bước vừa nãy, sau khi chạy câu “CREATE EXTENSION…” thì ta bắt đầu định nghĩa hàm, chép code Python vừa nãy vào:

CREATE FUNCTION scramble_email(email text) 
  RETURNS text 
  AS $$ 
   
  import string 
  import random 
   
  head, tail = email.split('@') 
  c1, c2, c3 = random.sample(string.ascii_lowercase + string.digits, 3) 
  # Choose a random middle position 
  i = random.randint(1, max(1, len(head) - 2)) 
  return f'{c1}{head[:i]}{c2}{head[i:]}{c3}@{tail}' 
  
$$ LANGUAGE plpython3u; 

define_function

Áp dụng nó vào câu query UPDATE, thi triển võ công “đấm một phát chết luôn”:

query_update

Vậy là nhiệm vụ đã hoàn thành. Ta thấy PostgreSQL và Python quả là đôi bạn thân, hỗ trợ nhau rất tốt (ngay cả các hệ CSDL “đại gia” như MS SQL, Oracle còn không có tính năng này). Các tấm hình trên còn cho thấy ngay cả code Python trong PostgreSQL (PL/Python) cũng được tô màu theo đúng cú pháp. Thực ra việc tô màu có được là nhờ một công cụ trong hệ sinh thái Python: pgcli. Tuy nhiên, có một lưu ý nhỏ: Khi sử dụng PL/Python, chỉ superuser mới có quyền tạo hàm. Đây là giới hạn PostgreSQL đặt ra vì Python không có cơ chế tự giới hạn quyền, khiến code PL/Python có thể làm những trò quá mạnh bạo, nguy cơ trở thành “phá hoại” nếu rơi vào tay “gà mờ”.

Bài viết gốc được đăng tải tại quan.hoabinh.vn

Xem thêm:

Đừng bỏ lỡ nhiều việc làm IT hấp dẫn trên TopDev nhé!

CÔNG BỐ AGENDA SỰ KIỆN VIETNAM MOBILE DAY 2022- KHU VỰC HỒ CHÍ MINH

agenda

Sau bao ngày chờ mong, BTC sự kiện Vietnam Mobile Day 2022 xin được công bố AGENDA (dự kiến) cho ngày hội tại khu vực Hồ Chí Minh (03/06/2022)!

Vietnam Mobile Day 2022 – We Connect – Sân chơi quen thuộc của cộng đồng yêu Công Nghệ tại Việt Nam, nay đã trở lại dưới hình thức Offline. Trong lần tái xuất này, sự kiện hứa hẹn mang đến cho mỗi cá nhân, nhà phát triển và các doanh nghiệp một không gian công nghệ thực sự bùng nổ – Nơi hội tụ của những sáng kiến công nghệ Mobile đột phá cùng các xu hướng mới nhất trên thị trường IT Việt Nam & khu vực.

Sự kiện năm nay sẽ là cơ hội để bạn “kết nối” cùng các diễn giả đầy nhiệt huyết và lắng nghe chia sẻ từ họ về các từ khóa HOT hiện nay như #Web3, #5G, #MCommerce, #Blockchain,… qua hơn 80+ chủ đề chất lượng về xu hướng & công nghệ Mobile trong năm 2022. Hãy cùng khám phá AGENDA Vietnam Mobile Day 2022 và “note” lại những Topic “hợp gu” để không bỏ lỡ những nội dung hấp dẫn tại ngày hội năm nay!

STAGE 1:

agenda1

> Topic: The Hidden Value of Apps

Diễn giả: Tammy Phan – Country Head of Marketing for Vietnam | Google Asia Pacific 

> Topic: Giới thiệu về TikTok Shop – Nơi giải trí kết hợp cùng mua sắm

Diễn giả: Nguyễn Khoa Bằng – Quản lý ngành hàng, TikTok Shop Việt Nam

> Topic: Building Sustainable Security for 5G with Zero Trust

Diễn giả: Philip Hùng Cao – Cyber & Zero Trust Evangelist 

> Topic: Bí quyết vận dụng Data Analytics (Phân Tích Dữ Liệu) để tối đa hóa hiệu suất marketing cho Apps (Ứng Dụng Công Nghệ)

Diễn giả: Hạnh Lê – Co-founder & COO | PMAX Vietnam

> Topic: Automation Marketing

Diễn giả: Phùng Tấn Cường – CSM Vietnam | Netcore

> Topic: The Next Genaration Of Mobile Measurement

Diễn giả: Nana Phan – Senior Account Executive | AppsFlyer 

Diễn giả: Tuấn Nguyễn – Account Manager | AppsFlyer

> Topic: Maximize Customers Engagement with Facebook N-Time notification on Mobile – Tối đa tương tác khách hàng với hệ thống thông báo định kỳ trên Facebook

Diễn giả: Nguyễn Mạnh Tấn – Head of Marketing | Haravan

> Topic: Làn sóng NFT và các mô hình ứng dụng trong SocialFi thế hệ mới

Diễn giả: Nguyễn Trung Thành – CEO & Founder | TrustKeys Network

> Topic: Go-to-market in Web3 Jennie Thanh Head Of Community | Umbala Metaverse Inbound marketing for Mobile

Diễn giả: Tuấn Hà – Founder, President | Vinalink Media and Vinalink Academy

> Topic: Xu hướng Marketing cho brand bằng Metaverse

Diễn giả: Nguyễn Đặng Quỳnh Anh – COO | SPAC3SHIP

> Topic: Mobile CRM yếu tố sống còn cho sale man sau Covid 19

Diễn giả: Nguyễn Mạnh Tưởng – Co-Founder | CrmViet

> Topic: Câu chuyện thực tế tăng trưởng 200% doanh số nhờ Chuyển đổi số từ Offline lên Online

Diễn giả: Đinh Mộng Kha – Chief Executive Officer | Vietguys

> Topic: Mobile Sales, CRM & Service: Công thức bí mật sau đại dịch cho đội ngũ Bán hàng & Dịch vụ

Diễn giả: Lại Tuấn Cường – CEO & Founder | Repu Digital

> Topic: Unlock the full potential of Metaverse!

Diễn giả: Đỗ Phạm Kim Thư  – Head of Partnership | RROVE

STAGE 2:

agenda2

> Topic: [Updating]

Diễn giả: Ruby Nguyễn – Founder & CEO – Curieous 

> Topic: Mobile First trong lĩnh vực Blockchain – Crypto

Diễn giả: Giáp Văn Đại – Founder & CEO | Nami Foundation

> Topic: Why Mobile Commerce has Become Critical for Retailers

Diễn giả: Trần Nguyễn Phi Long – Head of Retail Marketing | PNJ

> Topic: Ứng dụng giải pháp Social Marketing tăng trưởng trong Mobile Commerce

Diễn giả: Phạm Thị Thanh Thanh – COO Trung tâm Social Marketing | ACCESSTRADE Vietnam

> Topic: Customer preferences in mobile first strategy

Diễn giả: Carsten Ley – Founder & Consultant Asia PMO

> Topic: API ngân hàng Việt Nam: Làm sao để truy cập?

Diễn giả: Nguyễn Hồng Điệp -Founder & CEO | Casso

> Topic: How to utilize Data in Pharmacy Retail industry

Diễn giả: Nguyễn Thanh Sơn – Head of Data Science | Pharmacity

> Topic: Data Products for Mobile Commerce in Real-time and Real-life

Diễn giả: Ông Xuân Hồng – Senior Data Scientist | Hoa Sen Viet Group

> Topic: From Mobile Banking to Digital Banking, a great evolution

Diễn giả: Trần Trí Nhân (Executive MBA) – Product Manager | GFT Viet Nam & CEO – Founder | One Magic School

> Topic: Người Việt, năng lực Việt, ngồi ở Việt Nam nhưng vươn tầm Thế giới

Diễn giả: Vũ Duy Tiếp – CPO | Topebox

> Topic:Open UI Components trong xu thế kết nối dòng chảy tài chính

Diễn giả: Hà Quang Thịnh – Lead of Mobile Development | Techcom Securities – Công ty Cổ phần Chứng khoán Kỹ Thương

> Topic: AIoT: Understanding the Applications of a New-Gen Convergence

Diễn giả: Lê Yên Thanh – Founder, CEO | Phenikaa MaaS

> Topic: Mobile: Chiến lược thực thi Super App cho mảng IoT, và SaaS

Diễn giả: Phan Thanh Tùng – General Director | Tech Visionary, iLotusLand, Simplamo, TungTung

> Topic:: Đặc trưng về kỹ thuật trong việc phát triển ứng dụng mobile so với ứng dụng web.

Diễn giả: Nguyễn Đức Hoàng – CTO | Online Music Education JSC

STAGE 3:

agenda3

> Topic: [Updating] 

Diễn giả: Andy Le – Software Engineering Manager | ZaloPay

> Topic: Mobile App Development – What you don’t know

Diễn giả: Nguyễn Hiển – CEO | zen8labs

> Topic: Fast Mobile App Development

Diễn giả: Nghi Nguyễn – Head of Technology | Amanotes

> Topic: Mobile First Approach & Strategy

Diễn giả: Positive Thinking Company Speaker of Positive Thinking Company

> Topic:Ứng dụng mobile trong kết nối các nguồn lực trong và ngoài doanh nghiệp

Diễn giả: Cao Minh Việt – Trưởng chi nhánh TPHCM | BAP Co.,JSC & Former COO | Vingroup Nhật Bản

> Topic: How to start auditing digital marketing data to grow your business on mobile

Diễn giả: Hoàng Minh Dương – CEO | AppROI

> Topic:Mobile App – Lối Đi Nào Cho Doanh Nghiệp?

Diễn giả: Trần Quốc Kỳ – CEO & Co Founder | GIGAN JSC

> Topic: User Experience for Logistics Mobile End-Users

Diễn giả: Phạm Nam Long – CEO | Abivin

> Topic: Drive B2B Transformation with eCommerce and Integration Platform

Diễn giả: Phan Vũ Giáp – Founder & CEO | Beehexa

> Topic: [updating]

Diễn giả: Andy Dang – Regional Director | Omega Martech

> Topic: [Web3] Building a NFT Marketplace DApp like OpenSea

Diễn giả: Nguyễn Nhất Thanh – Senior Solutions Architect | Amazon Web Services (AWS)

> Topic: Xây dựng nền tảng trên di động cho ngành TMĐT: xây gì và vì sao?

Diễn giả: Trần Vũ Tất Bình – Engineering Director | One Mount Consumer

> Topic: Rule-Based Bots or AI Bots. Which is best for a chatbot project?

Diễn giả: Ruby Nguyễn – Founder, CEO & CTO | Momby

Cùng đếm ngược thời gian và chuẩn bị tâm thế để cùng bùng nổ trong không khí sôi động của ngày hội Vietnam Mobile Day 2022 bạn nhé!

Để đăng ký tham dự chương trình Vietnam Mobile Day 2022 vui lòng để lại thông tin tại đây

THỜI GIAN & ĐỊA ĐIỂM DIỄN RA SỰ KIỆN

  • TP. Hồ Chí Minh: 03/06/2022 tại Melisa Center, 83 Thoại Ngọc Hầu, Hòa Thanh, Q. Tân Phú, Tp.HCM
  • TP. Hà Nội: 10/06/2022 tại CTM Palace, 131 Nguyễn Phong Sắc, Dịch Vọng Hậu, Cầu Giấy, Hà Nội

Cách Giao Tiếp Giữa Các Service Trong Hệ Thống Có Tải Cao

hệ thống có tải cao

Bài viết được sự cho phép của tác giả Trần Văn Dem

Tại sao không nên dùng Http1.1 để giao tiếp giữa các service trong hệ thống có tải cao

Để thiết kế một hệ thống tin cậy có thể chịu được tải cao thì chúng ta cần quan tâm rất nhiều yếu tố :

  • database : nosql, sql, in-mem database, index, partition,…
  • caching
  • design service
  • load balance

Thời điểm hiện nay chúng ta sẽ dễ dàng tìm được các bài báo cũng như các bài hướng dẫn, so sánh về các mục bên trên. Thời điểm hiện tại đa số các hệ thống sẽ được xây dựng trên mô hình microservice nhưng khi sử dụng mô hình trên thì còn một điều khá quan trọng chúng ta cần phải quan tâm đó là cách giao tiếp giữa các service với nhau (service communicate). Khi mới bắt đầu vào lập trình hầu hết các bài báo cũng như hướng dẫn tôi được đọc thì họ đều sử dụng http1 để lấy làm ví dụ cho hệ thống của họ. Nhưng trong quá trình trải nghiệm trong thực tế tôi thấy việc sử dụng http1 có rất nhiều hạn chế khi hệ thống gặp tải cao. Tại bài viết này với kinh nghiệm cá nhân của mình thì mình sẽ chia sẻ cho mọi người biết các hệ thống có tải cao của mình từng làm sẽ dùng cách thức nào để giao tiếp với nhau.

Giới thiệu một chút các hệ thống tải cao và yêu cầu độ trễ thấp mình từng làm là :

  • Hệ thống Antispam của Viettel
  • Sàn Trading của công ty Nextop.asia

1. TCP Socket

Vì tất cả hệ thống của mình đều sử dụng TCP nên mình sẽ chỉ chia sẻ về TCP tại đây. TCP là một giao thức truyền tin qua mạng có đảm bảo dữ liệu được truyền tải thành công điểu này mọi người đều đã biết. Hầu hết các giao thức khác đều dựa trên TCP và UDP nên việc biết về 2 mô hình socket này trước là điều cần thiết.

1.1. Client

Chúng ta có một ví dụ đơn giản về một TCP client đơn giản bằng ngôn ngữ Java. Đây là một ví dụ trên mạng

import java.net.*;  
import java.io.*;  
class MyClient{  
public static void main(String args[])throws Exception{  
Socket s=new Socket("localhost",3333);  
DataInputStream din=new DataInputStream(s.getInputStream());  
DataOutputStream dout=new DataOutputStream(s.getOutputStream());  
BufferedReader br=new BufferedReader(new InputStreamReader(System.in));  

String str="",str2="";  
while(!str.equals("stop")){  
str=br.readLine();  
dout.writeUTF(str);  
dout.flush();  
str2=din.readUTF();  
System.out.println("Server says: "+str2);  
}  

dout.close();  
s.close();  
}}

Để tạo ra một kết nối TCP thì chương trình sẽ phải tốn những tài nguyên sau :

  • file descriptor (mỗi TCP connection đều cần 1 file descriptor) khoảng 4KB.
  • Buffer size của kết nối TCP.
  • Chi phí mạng.
  • Một Thread đọc dữ liệu từ server trả lại.

Chi phí này là khá lớn và nếu quá nhiều kết nối TCP cùng tồn tại thì sẽ gây quá tải cho hệ thống của bạn.

1.2. Server

Với server lượng chi phí của chúng ta cũng sẽ mất tương tự như phía client nếu sử dụng mô hình Blocking IO (một số server nổi tiếng đang sử dụng mô hình này). Nhưng nếu sử dụng mô hình Non Blocking IO thì chi phí sẽ thấp hơn vì không nhất thiết phải tạo luồng mới để đọc dữ liệu của client gửi lên. Mọi người nếu chưa biết về 2 mô hình socket này thì nên tham khảo trên mạng.

Nhưng có một điều lưu ý là số lượng TCP connection của một server sẽ có giới hạn. Theo lý thuyết thì một TCP connection sẽ bao gồm (source IP, source port, dest IP, dest port) vậy số lượng connection tối đa một server có thể có sẽ là 2^48. Vì số connection chỉ phụ thuộc vào :

  • số lượng source IP 2^32 và
  • source port 2^16 connection có thể xảy ra. Nhưng thực tế sẽ dựa vào nhiều yếu tố khác:
  • OS: số lượng file descriptor tối đa của hệ điều hành có thể mở ra (mỗi TCP connection đều cần 1 file descriptor). Trên linux kiểm tra bằng lệnh ulimit -a
  • RAM : không tính đến buffer của mỗi socket thì mỗi file descriptor sẽ có dung lượng khoảng 4KB.

Vậy nếu điều kiện nào đến trước thì đó sẽ là giới hạn của server của hệ thống.

2. Http1.1

http1.1.png

Mọi người không ai còn xa lạ với giao thức này nữa. Tại giao thức này đã cho phép chúng ta khả năng pipeline request nhưng khi dùng pipeline thì các request và response phải được gửi và nhận lần lượt. Nếu điều này bị vi phạm sẽ dẫn đến client không thể biết response này là của client nào. Tiếp đến nếu một request không may bị thất lạc thì khiến các request khác trong pipeline sẽ không được gửi lên server điều này sảy ra tình huống HOL gây giảm hiện năng. Vì những lý do trên nên hiện tại mình chưa từng dùng được một thư viện nào hỗ trợ mình chức năng pipeline của Http1.1.

Điểm yếu của Http1.1

Như phần trên chúng ta có thể nhận ra điểm yếu của Http1.1 đó chính là chúng ta sẽ không thể tái sử dụng một Http connection để gửi request nếu nó chưa nhận được response của server. Trong khi hệ thống cao tải thì chúng ta cần gửi rất nhiều request cùng một lúc đến các service khác nhau điều này bắt buộc chúng ta phải tạo ra rất nhiều Http connection và như đã biết việc tạo ra nhiều Http connection bên trên sẽ gây quá tải cho hệ thống của các bạn.

Tất nhiên các thư viện viết Http1.1 client đều cho phép bạn tạo connection pool nhưng khi hết connection trong pool một số thư viện sẽ tạo mới (tốn kém tài nguyên ), một số sẽ cố gắng đợi connection được trả lại trong pool điều này sẽ khiến các request mới sẽ không được gửi gây giảm hiệu năng hệ thống của bạn xuống.

Vậy nên hệ thống bạn mà giao tiếp dựa trên http1.1 thì sẽ là hệ thống synchronous, hệ thống này sẽ không thể đáp ứng được những ứng dụng có tải cao và yêu cầu độ trễ thấp.

Các bạn sẽ có thể bị bối rối việc các thư viện http1.1 cho phép sử dụng các asynchronous api? Các thư viện đó thực chất sẽ sử dụng các Thread khác để thực hiện request của bạn chứ không sử dụng chỉ Thread của bạn nên tốc độ của khi gửi request sẽ tốt hơn. Nhưng đứng dưới góc độ của Http connection nó vẫn sẽ là synchronous.

3. Cách thay thế Http1.1

3.1. Http2

Câu trả lời của hầu hết mọi người là Http2 vì nó quá nổi tiếng mà.

Tất nhiên việc nâng cấp lên Http2 cũng không hề dễ dàng như mọi người nghĩ. Mình đã từng làm một bài về Http2 in real project mình cảm thấy các thư viện Http2 client hiện tại vẫn chưa hỗ trợ hết tính năng của Http2 nếu cần thì bạn hơn thì bạn cần viết một client dành cho riêng mình. Với mình thì là tự viết client để giao tiếp với APNS của Apple.

Mình cũng đã thử config Http2 server trên spring-boot với tomcat và cũng cảm thấy khi config server này bằng spring-boot hiện tại cũng chưa hỗ trợ hết tính năng của Http2.

Nếu bạn chưa biết thì Http2 sẽ cho cung cấp cho chúng ta giải pháp ghép kênh (multiplexing) nghĩa là cho phép chúng ta sử dụng một http2 connection gửi nhiều request và response nhận về vẫn có thể biết được đó là của request nào. Còn việc gửi nhiều thì bản thân TCP socket đã giúp bạn gửi nhiều request rồi. Gửi nhiều request trên cùng một connection không phải là tính năng mới trên Http2. Tính năng mới trên Http2 là gửi nhiều request và response nhận về vẫn có thể biết được đó là của request nào ( Điều quan trọng phải nhắc lại 2 lần :)) ).

Vậy tại sao Http2 có thể làm được điều đó. Nó làm được điều đó vì mỗi request sẽ được đánh ID và được biết với tên Stream IDServer và Client gửi request và response phải gửi kèm theo Stream ID này để có thể phân biệt với nhau.

Vì bài này không chia sẻ về Http2 và Http2 còn rất nhiều thông tin thú vị khác các bạn xem thêm tại bài viết : httpwg.org/specs/rfc7540.html#top

3.2. Đánh ID cho từng request

Trước khi Http2 ra đời, các công ty công nghệ lớn như AppleGoogle đã sử dụng phương pháp đánh ID cho từng request để giúp phân biệt response thuộc về request nào. Cũng có thể đây là động lực cho sự ra đời của Http2. Cách này giúp chúng ta tái sử dụng được các connection được tạo ra mà không cần đợi response

Cụ thể hơn là mình đã được làm việc với service gửi thông báo về các thiết bị Android và IOS của 2 thanh niên công nghệ trên. Và 2 thanh niên này thì có tải cực kỳ lớn và do đó họ đều không sử dụng Http1.1 là công cụ giao tiếp chính cho client.

Cụ thể như sau :

  • Apple : Gần đây APNS đã dịch chuyển từ TCP Socket sang Http2 giúp cho khách hàng có thể sử dụng một connection gửi nhiều thông báo với các máy IOS. Vậy trước đây khi sử dụng APNS tại project cũ bọn mình cần phải tạo ra kết nối TCP Socket đến Apple và mỗi khi push notify đến thiết bị IOS thì request mình gửi lên Apple sẽ phải đính kèm một unique id trên một connection. Và Apple sẽ trả lại kết quả qua Tcp Connection trên và sẽ đính kèm theo ID của request để mình còn map lại được request với response
  • Google : Google thì cung cấp Firebase API dưới dạng Http1.1 và dạng XMPP. Dạng Http1.1 thì đơn giản dễ hiểu với mọi người nên nếu không có quá nhiều khách hàng sử dụng dịch vụ và không gửi nhiều request để notify thì hầu hết mọi người sẽ chọn giao thức này. Chúng ta sẽ không thể nghi ngờ khả năng của Google được nên khi chúng ta cần gửi nhiều thông báo khác nhau cho nhiều thiết bị khác nhau và sử dụng Http1.1 mà bị chậm thì chúng ta cần phải xem lại project của mình. Trong trường hợp này thì mọi người nên chuyển sang giao thức XMPP vì giống với Apple tại đây Google sẽ bắt client của mình tạo ra các ID khác nhau cho từng request gửi lên. Nhưng có một điều là giao thức XMPP không hỗ trợ dạng Batch nên nếu bạn cần gửi cho nhiều thiết bị và nội dung giống nhau 100% thì nên quay lại dùng Http1.1nhé.

4. Mình đã sử dụng phương pháp nào tại các sản phẩm đã làm.

Phương pháp hiện tại mình đang sử dụng cách đánh ID cho từng request sau đó gửi sang các Service thông qua :

  • Non Blocking Socket (Sử dụng Netty) nếu share API cho bên ngoài. Sắp tới nếu có bên nào cần thì bên mình chắc sẽ viết dưới dạng Http2 server cho hợp thời đại.
  • message queue đối với giao tiếp nội bộ của hệ thống.

Sau đó response sẽ đính kèm ID cũng gửi theo các đường này về client .

Hệ thống của mình giao tiếp giữa các service là dạng asynchronous điều đó khiến khi cao tải thì hệ thống cũng không tạo thêm các TCP connection để giao tiếp. Điểu đó cũng giúp giảm tài nguyên của hệ thống xuống khá nhiều.

Kết bài tại đây mình muốn khuyên cho mọi người khi xây dựng hệ thống nếu yêu cầu có tải lớn và độ trễ thấp thì nên di chuyển giao tiếp từ Http1.1 sang các dạng khác theo các công ty lớn như AppleGoogle. Mặc dù cách này sẽ tốn rất nhiều thời gian gian đoạn đầu nhưng giai đoạn sau khi có nhiều khách hàng mọi thứ sẽ hoạt động trơn tru và không phải chịu cảnh hệ thống quá tải vì giao tiếp. Các bạn sẽ ít nhất không phải trải qua cảnh gateway của mình chỉ làm nhiệm vụ forward cũng sẽ tốn rất nhiều tài nguyên ( RAM, CPU).

Mình biết các thư viện và mô hình micro service có sẵn trên mạng có thể vẫn dùng chủ yếu là Http1.1 nên việc thay đổi mô hình không phải là điều dễ dàng.

Tại các công ty mình đã làm việc thì việc chọn giao tiếp dưới dạng REST API dưới dạng Http1.1 là điều thường xuyên xảy ra và cũng đã trải qua những đắng cay vì Http1.1 khi tải cao và số lượng connection nó tạo ra là quá lớn.

Tất nhiên việc tạo ra một hệ thống chạy tốt cần phải có nhiều yếu tố khác nhau nữa nhưng việc giao tiếp với các service là một điều cần quan tâm.

Bài này hoàn toàn là kinh nghiệm cá nhân trong quá trình làm việc rất mong có sự góp ý của mọi người để giúp mình và mọi người nâng cao khả năng lập trình.

Bài viết gốc được đăng tải tại demtv.hashnode.dev

Đọc thêm:

Hàng loạt việc làm IT hấp dẫn trên TopDev đang chờ bạn ứng tuyển..

SQL Developer là gì? Làm thế nào để trở thành một SQL Developer?

SQL Developer là gì đang là chủ đề mà nhiều bạn trẻ thắc mắc trong bối cảnh các công việc thuộc lĩnh vực công nghệ thông tin đang ngày càng phát triển. Để trả lời câu hỏi này, mời bạn theo dõi những thông tin bên dưới và có thể hiểu thêm về những công việc của một SQL Developer.

SQL developer là gì?

SQL Developer là người làm việc trong lĩnh vực công nghệ thông tin. Họ là người thiết kế, tạo và duy trì hệ thống cơ sở dữ liệu hoặc trang web bằng Structured Query Language – SQL. Không chỉ vậy, SQL developers còn quen thuộc với những ngôn ngữ truy vấn có cấu trúc như Oracle, SQL Server, MySQL, SQLite và PostgreSQL. 

Lập trình viên SQL là một trong những chuyên môn có nhu cầu tuyển dụng cao trên thị trường. Hầu hết các công ty phát triển dựa trên dữ liệu và chuyển đổi kỹ thuật số. Do đó hàng loạt SQL Developer Jobs ra đời mang đến nhiều cơ hội việc làm cho các bạn trẻ. Nếu bạn muốn bắt đầu sự nghiệp với vị trí này, hãy tìm hiểu kỹ SQL Developer là gì, công việc như thế nào và yêu cầu ra sao.

sql developer là gì

Công việc của lập trình viên SQL là gì?

Nhiệm vụ chính của một SQL Developer có thể được mô tả ngắn gọn bằng từ “CRUD”, viết tắt của ‘Create, Read, Update, and Delete”, tức là “Tạo, Đọc, Cập nhật và Xóa”  trong các hoạt động cơ sở dữ liệu. Cụ thể, các công việc chính của lập trình viên SQL bao gồm:

  • Thu thập các yêu cầu của người dùng
  • Định dạng ngôn ngữ truy vấn
  • Viết truy vấn SQL để tích hợp tối ưu với những ứng dụng khác
  • Thiết kế cấu trúc cơ sở dữ liệu dùng để lưu trữ và truy cập thông tin liên quan đến kinh doanh
  • Tạo trình kích hoạt cơ sở dữ liệu để sử dụng trong tự động hóa
  • Đánh giá cơ sở hạ tầng mạng, chạy thử nghiệm chẩn đoán và cập nhật hệ thống bảo mật thông tin để có hiệu suất tối ưu và điều hướng hiệu quả.
  • Ghi lại code, báo cáo tiến độ, thực hiện đánh giá và phản hồi

SQL Developers thường sẽ làm việc với thời gian 40 tiếng một tuần. Tất nhiên, nếu khối lượng công việc quá lớn hoặc chuyên môn chưa vững thì làm việc ngoài giờ là một điều tất nhiên để phát triển. Họ có thể làm việc trực tiếp tại văn phòng hoặc làm việc từ xa, hoặc có những người lựa chọn làm chuyên viên cố vấn cho nhiều công ty cùng một lúc.

Làm thế nào để trở thành SQL Developer

Bằng cử nhân

Bạn hãy cố gắng hoàn thành chương trình đại học/cao đẳng về khoa học máy tính hoặc một chuyên ngành liên quan như hệ thống thông tin máy tính. Những chương trình này giúp bạn hiểu về lập trình và mạng máy tính. 

Bên cạnh đó, trong chương trình cử nhân, bạn sẽ học được các kỹ năng như quản lý cơ sở dữ liệu, điều mà các nhà tuyển dụng thường yêu cầu ở một ứng viên SQL Developer. Bạn có thể tập trung vào các kiến thức như:

  • Thuật toán máy tính
  • Đại số và giải tích
  • Tổ chức máy tính
  • Thiết kế thuật toán
  • Các kiểu dữ liệu trừu tượng

Thực tập

Tham gia vào các chương trình thực tập ở các công ty/tổ chức công nghệ (lớn nhỏ đều được) cho phép bạn ứng dụng những điều đã học được và tích lũy những làm việc kinh nghiệm thực tế. Mặt khác, kinh nghiệm này có thể giúp bạn có những cơ hội việc làm trong tương lai.

Nâng cao kiến thức về cơ sở dữ liệu

Cố gắng nâng cao kiến thức cơ sở dữ liệu của bạn bằng cách đăng ký các khóa học, bạn vẫn có thể tìm thấy một số khóa học online miễn phí có sẵn trên mạng. Kiến thức về cơ sở dữ liệu là một kỹ năng cần thiết để gia tăng tỷ lệ cạnh tranh trong thị trường nhân lực. Bạn có thể xem xét những chủ đề gồm:

  • Dịch vụ đám mây như Microsoft Azure hay Amazon Web Services
  • Vòng đời phát triển phần mềm – The Software Development Life Cycle (SDLC), đặc biệt là Agile và Scrum.
  • Hệ thống cơ sở dữ liệu NoSQL như CouchDB hoặc MongoDB
  • Server Reporting Services (SSRS) và SAP Crystal Reports
  • Các công cụ báo cáo và kinh doanh thông minh như Microsoft SQL

teamwork

Bắt đầu làm việc thực tế

Khi bạn tốt nghiệp (hoặc có thể chưa), tìm kiếm một entry-level job với tư cách là một nhà phát triển, lập trình viên hay quản trị viên cơ sở dữ liệu để tích lũy kinh nghiệm làm việc:

  • Tạo cơ sở dữ liệu
  • Hiểu được các vấn đề liên quan đến hiệu suất mạng và bảo mật
  • Biết cách để duy trì các tiêu chuẩn cao về chất lượng và tính toàn vẹn của dữ liệu

Mặt khác, kinh nghiệm sử dụng lập trình như C, Java và C# giúp bạn làm việc tốt với các team khác. Làm quen với Unix, NET framework, Windows batch scripts hoặc Bash giúp bạn tạo sự khác biệt hóa so với các đối thủ.

Bổ sung chứng chỉ

Mặc dù chứng chỉ là không bắt buộc, tuy nhiên nhiều nhà tuyển dụng mong muốn ứng viên của họ có chứng chỉ chuyên môn cụ thể. Một số chứng chỉ chuyên môn bạn có thể tham khảo như:

  • Microsoft Certified Systems Engineer: Data Management and Analytics
  • Oracle PL/SQL Developer Certified Associate
  • Microsoft Certified Professional Developer (MCPD)

Trao dồi kỹ năng mềm

SQL Developer cần phải làm việc cùng với những chuyên gia, kỹ sư công nghệ thông tin khác để thiết lập quá trình chuyển đổi kỹ thuật số của công ty. Do đó, hai kỹ năng quan trọng chính được đánh giá cao là kỹ năng giao tiếp và kỹ năng làm việc nhóm.

Kỹ năng giao tiếp

Để cải thiện kỹ năng này, bạn nên duy trì giao tiếp cơ thể một cách cởi mở (body language) trong lúc trao đổi thông tin với các thành viên trong nhóm để họ cảm thấy bạn đang chú ý vào những yêu cầu mà họ đề ra. Khi viết ghi chú hoặc báo cáo, bạn hãy viết thật cụ thể và ngắn gọn.

Kỹ năng làm việc nhóm

Cải thiện kỹ năng làm việc nhóm bằng cách đặt mục tiêu cho dự án và liệt kê những công việc mà bạn phải làm. Nắm rõ deadline công việc được giao và hoàn thành đúng thời hạn để tạo sự tin tưởng. Cuối cùng là hãy tích cực lắng nghe đồng nghiệp của bạn khi họ giải thích nhu cầu của cơ sở dữ liệu để bạn tránh hiểu lầm và đưa ra một chương trình phù hợp.

Trong tương lai, nhu cầu của thị trường tuyển dụng cho vị trí SQL Developer sẽ càng cao. Trên đây, mình đã mang đến thông tin về SQL Developer là gì cũng như kiến thức và kỹ năng cần trau dồi để trở thành SQL Developer. Hi vọng bài viết phần nào giúp bạn xác định hướng sự nghiệp cho bản thân.

Đọc thêm:

Bạn cũng đừng bỏ lỡ Top IT Job có trên TopDev nhé!

HTTP2 in real project

HTTP2 in real project

Bài viết được sự cho phép của tác giả Trần Văn Dem

Note for http2

Http2 là một giao thức truyền thông tin qua mạng một cách hiệu quả và tiết kiệm tài nguyên. Mặc dù đã được giới thiệu từ lâu nhưng không ít lập trình viên backend còn cảm thấy mới với loại protocol này. Sau khi tìm hiểu và áp dụng vào dự án thực tế mình muốn chia sẻ những kiến thức của mình về giao thức này với mọi người hy vọng giúp ích được cho mọi người trong dự án của mọi người.

Dự án gần đây mình làm là viết client giao tiếp với notify server của apple. Apple đã dịch chuyển từ giao tiếp thông qua từ socket sang Http2 server. Trong khi làm việc mình cũng tìm được một số thư viện đã được viết sẵn để giao tiếp với service mới này của apple như :

Tuy nhiên để sử dụng thêm 1 thư viện mới vào product đang được chạy cũng có khá nhiều rủi ro vì cũng chưa có đủ thời gian để làm quen với chúng xem điểm mạnh, điểm yếu của thư viện. Tiếp đến việc ghép vào các interface có sẵn của project cũng khá khó. Nên mình tiếp tục tìm hiểu được một số thư viện có thể Http2 client viết sẵn trong java như :

  • okhttp3
  • netty

Trong bài này mình sẽ chia sẻ rõ hơn về 2 thư viện netty và okhttp3 này

Ứng dụng nổi tiếng nhất áp dụng Http2 mà mình từng biết là Grpc. Với Java thì Grpc sử dụng netty để xây dụng tầng transport của mình. Điều này khiến mình có thêm tài liệu là code của Grpc để tham khảo xây dụng http2 client để thao tác với Apple.

Bài blog này sẽ có code demo của các phần sau:

  • Simple http2 server
  • okhttp3 client
  • Simple netty http2 client

Simple http2 server

Demo về tốc độ của http2 server so với http1.1 trên mạng là rất nhiều :

  • http2demo.io
  • http2.akamai.com/demo

Khi các bạn vào trình 2 web site trên sẽ thấy được tốc độ load tài nguyên thực sự là chênh lệch rất nhiều nếu sử dụng http2.

Vì tò mò nên tôi cũng tự xây dựng cho mình 1 http2 server để test tốc độ cũng như để làm server test cho client của mình. Tôi sử dụng Spring-boot để tự viết Http2 server vì với Spring boot bạn sẽ làm được điều này rất nhanh chỉ cần thay đổi trong file config là bạn đã có 1 Http2 server sử dụng spring boot rồi. Code demo tại package http2.server. Sẽ được đính kèm ở cuối bài viết này.

Tại code demo này tôi sẽ cho trình duyệt load 180 cái ảnh để so sánh tốc độ. Trước khi load ảnh mình sẽ cho luồng đó dừng lại 100 ms

    @GetMapping(value = "/gophertiles_files/{name}", produces = MediaType.IMAGE_JPEG_VALUE)
    public ResponseEntity<ByteArrayResource> getImage(@PathVariable String name) throws IOException, InterruptedException {
        Thread.sleep(100);
        final ByteArrayResource inputStream = new ByteArrayResource(Files.readAllBytes(Paths.get(
                "image/" + name
        )));
        return ResponseEntity
                .status(HttpStatus.OK)
                .contentLength(inputStream.contentLength())
                .body(inputStream);

    }

Kết quả của http2

http2-load.PNG

Kết quả của http1.1

http1-load.PNG

Trình duyệt của bạn sẽ chỉ dùng 1 connection duy nhất để load dữ liệu từ http2 server thay vì 6 connection chạy song song với http1.1 server. Bạn có thể check được điều này bằng tab network trong ảnh. Đây là kỹ thuật ghép kênh quan trọng đưa tốc độ load dữ liệu của http2 nhanh hơn nhiều so với http1.1. Mở ít kết nối hơn cũng đồng nghĩa với việc tiết được nhiều tài nguyên hơn cho cả phía client và server.

Http2 client

Sau khi có một server http2 thì việc tiếp theo là xây dụng các client để giao tiếp với http2 server trên.

Netty Http2 client

Tại code example của netty cũng có demo về việc xây dựng một http2 client đơn giản với netty. Tại demo này của mình cũng sẽ sử dụng code đó và thay đổi 1 chút để giải thích một số config khá quan trọng để xây dựng http2 client.

Tài liệu chi tiết về http2 các bạn tham khảo tại link sau : httpwg.org/specs/rfc7540.html#top

Tại link đó sẽ mô tả chi tiết cho chúng ta về : StreamFrameErrorconfig, … Nếu các bạn muốn tự mình xây dựng 1 client mà không dựa vào netty thì có thể tham khảo nhé. Mình chỉ đọc để biết code với netty như thế nào thôi. Code demo tại package http2.client.netty;.

Tại đây mình sẽ giải thích 1 số thứ quan trong khi sử dụng netty làm client ứng với tài liệu viết tại link https://httpwg.org/specs/rfc7540.html#top

  • Stream Theo tài liệu của HTTP2 thì một connection sẽ sử dụng Stream để giao tiếp giữa client-server. Điều này giúp Http2 thực hiện ghép kênh trên cùng 1 kết nối TCP nhưng lại gửi được nhiều request. Mỗi Stream được định nghĩa bởi 1 ID vì vậy muốn biết được response này là của request nào thì mình cần phải biết được là Stream ID khi gửi request là gì và lưu lại. Theo tài liệu thì nếu là Client stream Id là một số lẻ bắt đầu từ 1,3,5,7,… Và nếu là Server thì sẽ bắt đầu từ 0,2,4,6,8,…

Khi bắt đầu thực hiện kết nối giữa client với server thì Client và Server phải gửi setting của mình cho nhau sau đó mới bắt đầu gửi request được. Điều đó giải thích cho việc trong code client demo của netty cũng như demo của mình để bắt đầu với Stream ID là 3. Tại class Http2ClientInitializer

    private int streamId =3;

    public int getCurrentStreamId(){
        int current =streamId;
        streamId +=2;
        return current;

    }
  • Frame Http2 sẽ gửi nhận dữ liệu thông qua các FrameHeader Frame và Data Frame, Netty cũng cung cấp cho chúng ta api đọc dữ liệu của các Frame này. Tại bản demo này để đơn giản mình không đọc dữ liệu thông qua Frame mà nhờ netty làm giúp điều này. Nếu được ủng hộ mình sẽ có bài viết implement theo Frame này.
  • SETTINGS_MAX_CONCURRENT_STREAMS Như đã trình bày ở trên thì khi thực hiện kết nối client, server sẽ gửi setting của mình cho nhau. 1 Trong những config quan trọng nhất cần quan tâm khi mình là client là SETTINGS_MAX_CONCURRENT_STREAMSSETTINGS_MAX_CONCURRENT_STREAMS số này có ý nghĩa là server sẽ chấp nhận số lượng Stream đồng thời tối đa là bằng SETTINGS_MAX_CONCURRENT_STREAMS, client không được gửi quá lượng lượng Stream lên server không thì server sẽ đóng lại Stream và Client sẽ không nhận được kết quả. Với server demo sử dụng spring boot của mình số SETTINGS_MAX_CONCURRENT_STREAMS sẽ là 100 và được gửi trong HEADER của HTTP2Setting. Với server của Apple con số này sẽ là 1000. Nếu bạn có như cầu gửi hơn 1000 request đến Apple 1 lúc thì hãy tạo thêm 1 connection mới nhé.
  • Với code demo trên thì bạn cũng nhận được kết quả là gọi 180 lần lên server với 1 connection thì kết quả sẽ là hơn 1 giây. Tất nhiên đây là 1 demo đơn giản nên nó sẽ chậm hơn trình duyệt 1 chút.

OKHttp3 client

Tiếp theo chúng ta sẽ sử dụng okhttp3 làm client. Vì code này ngắn nên bạn có thể xem Code demo bên dưới

package http2.client.okhttp;

import okhttp3.*;
import org.jetbrains.annotations.NotNull;

import javax.net.ssl.SSLContext;
import javax.net.ssl.TrustManager;
import javax.net.ssl.TrustManagerFactory;
import javax.net.ssl.X509TrustManager;
import java.io.IOException;
import java.security.cert.CertificateException;
import java.security.cert.X509Certificate;
import java.util.Arrays;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.TimeUnit;

public class OkhttpClient {
    public static void main(String[] args) throws Exception {
        OkHttpClient client = getUnsafeOkHttpClient();
        client.dispatcher().setMaxRequestsPerHost(1);
        Request request = new Request.Builder()
                .url("https://localhost:8082/test")
                .build();

        Response r1 = client.newCall(request).execute();
        System.out.println(r1.protocol());
        client.dispatcher().setMaxRequestsPerHost(100);
        CountDownLatch countDownLatch = new CountDownLatch(180);
        long startTime = System.currentTimeMillis();
        for (int i = 0; i < 180; i++) {
            client.newCall(request).enqueue(new Callback() {
                @Override
                public void onResponse(@NotNull Call call, @NotNull Response response) throws IOException {
                    response.close();
                    countDownLatch.countDown();
                }

                @Override
                public void onFailure(@NotNull Call call, @NotNull IOException e) {

                }
            });
        }
        countDownLatch.await();
        long time = System.currentTimeMillis() - startTime;
        System.out.println("time run " + time);
    }

    private static OkHttpClient getUnsafeOkHttpClient() {
        try {
            ConnectionPool connectionPool = new ConnectionPool(1, 3000, TimeUnit.SECONDS);

            // Install the all-trusting trust manager
            SSLContext sslContext = SSLContext.getInstance("SSL");
            TrustManagerFactory trustManagerFactory = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());

            X509TrustManager manager = new X509TrustManager() {
                @Override
                public void checkClientTrusted(X509Certificate[] chain, String authType) throws CertificateException {

                }

                @Override
                public void checkServerTrusted(X509Certificate[] chain, String authType) throws CertificateException {

                }

                @Override
                public X509Certificate[] getAcceptedIssuers() {
                    return new X509Certificate[0];
                }
            };

            TrustManager[] managers = new TrustManager[1];
            managers[0] = manager;

            sslContext.init(null, managers, null);


            OkHttpClient okHttpClient = new OkHttpClient.Builder()
                    .followRedirects(false)
                    .sslSocketFactory(sslContext.getSocketFactory(), manager)
                    .protocols(Arrays.asList(Protocol.HTTP_2, Protocol.HTTP_1_1))
                    .retryOnConnectionFailure(true)
                    .connectionPool(connectionPool)
                    .build();

            return okHttpClient;
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }
}

OkHttpClient có một nhược điểm là sẽ mở rất nhiều connection dựa theo số MaxRequestsPerHost .Nếu các bạn không set giá trị MaxRequestsPerHost thì mặc định sẽ là 6 giống như trên trình duyệt. Sau khi gửi request đến server và biết được server lòa http2 server thì OkhttpClient sẽ đóng hết tất cả kết nối lại và chỉ sử dụng 1 kết nối dành cho mục đích truyền tải dữ liệu với server. Đó là lý do tại sao mình lại phải gửi 1 request trước mục đích để khởi động hệ thống sau đó mới thiết lập lại số MaxRequestsPerHost. Tiếp theo nữa là MaxRequestsPerHost cũng tương ứng với số luồng được mở ra trong java để gửi nhận dữ liệu điều này cũng khá tốn thời gian. Và tại sao mình lại config số MaxRequestsPerHost là 100 thì đã được giải thích tại mục netty.

Khi sử dụng OkHttpClient mình hoàn toàn không lấy được setting của server để setting lại số MaxRequestsPerHost sao cho tối ưu nhất. Tiếp đến việc mở quá nhiều kết nối TCP tại thời điểm đầu tiên cũng là một nhược điểm của OKHttpClient. Việc sử dụng OKHttpClient sẽ làm code ngắn gọn hơn rất nhiều nhưng không mang lại hiệu quả tối ưu nhất khi sử dụng với product của mình. Việc disconnect và connect lại của OKHttpClent khiến mình không làm chủ được việc thiết lập config setMaxRequestsPerHost cho tối ưu.

Khi làm và tìm hiểu về OkHttpClient mình có đọc được 1 issue khá hot của nó tại link : github.com/square/okhttp/issues/3442

Tại issue này mọi người có nói đến việc MaxRequestsPerHost này. Trong có có người bình luận là I am sending warm up request and setting setMaxRequestsPerHost to 50. then when tried downloading images, Http/2 seems to be much slower than Http1.1 và chưa thấy ai giải thích việc này.

Mình xin giải thích việc này như sau để nếu như các bạn sử dụng OkHttpClient thì sẽ có thể tham khảo. Khi mình đọc code của OkHttpClient mình phát hiện ra số MaxRequestsPerHost này nếu bạn sử dụng HTTP1.1 thì sẽ tương ứng với mở 50 connection khác nhau đến server điều này hiển nhiên khiến bạn có thể tải được 50 ảnh cùng 1 lúc. Nhưng sao bạn set số MaxRequestsPerHost là 50 với Http2 lại có tốc độ thấp hơn khi so với Http1.1 vì theo lý thuyết nó sẽ gửi 50 request lên server 1 lúc. Điểu này lại ứng với server bạn gọi lên, mỗi server sẽ có các cách implement khác nhau để xử lý số lượng Stream bạn gửi lên. Mặc dù server trả lại cho bạn là có thể nhận > 100 (SETTINGS_MAX_CONCURRENT_STREAMS thường lớn hơn 100) request 1 lúc nhưng tại bản thân của nó sẽ chỉ xử lý 1 lượng Stream nhỏ hơn số này. Ví dụ với Http2 server demo vì mình dùng tomcat thì nó chỉ xử lý cùng 1 lúc là 20 Stream mặc dù nhận được 100 Stream. Config đó là maxConcurrentStreamExecution tham khảo tại tài liệu của tomcat mặc định số này là 20. Vậy tại đây có thể tạm hiểu là 1 connection của Http2 có thể bằng 20 connection của Http1.1

Vì các lý do trên bạn sẽ thấy tốc độ của HTTP1.1 khi MaxRequestsPerHost là 50 nhanh hơn Http2 nếu sử dụng Okhttp3Client. Nhưng trên thực tế sử dụng bạn không bao giở mở nhiều connection như thế vì nó tốn tài nguyên và cũng có thể bị server từ chối mở kết nối.

Khi nào nên sử dụng HTTP2

Với sự hỗ trợ mạnh mẽ của các server hiện nay thì mình nghĩ việc chuyển đổi từ HTTP1.1 sang HTTP2 là việc cần thiết và nên làm để tăng trải nghiệm khách hàng của bạn. Như bạn biết trình duyệt của bạn chỉ mở 6 connection vậy nên tốc độ không thể nào so sánh được với HTTP2 nên việc trải nghiệm dịch vụ của bạn sẽ bị tốt hơn nhiều khi sử dụng HTTP2.

Nếu bạn muốn truyền tải thông tin giữa các server nếu không cần cấu hình quá đặc biệt thì hãy thử sử dụng Grpc nó sẽ tiết kiệm rất nhiều tài nguyên và thời gian cho bạn. Mặc dù bạn có sử dụng Grpc thì cũng nên tự xây cho mình 1 Http2 server để học và tìm hiểu nó sâu hơn và cũng giúp bạn config Grpc một cách tối ưu nhất. Tất nhiên không phải cách tự xây dụng là sử dụng Tomcat hay Jetty nhé vì nó xây hết rồi lấy gì mà học hỏi nữa.

Nếu bài toán của bạn là xây dụng client giao tiếp với Apple thì mình khuyên bạn nên tự xây dụng dụa trên netty hoặc sử dụng pussy thay vì dùng okhttp3 mặc dù dùng okhttp3 là rất dễ nhưng nó sẽ không mang lại cho bạn 1 kết quả tốt nhất được.

Bài viết gốc được đăng tải tại demtv.hashnode.dev

Xem thêm:

Top IT Jobs cho các Developers có trên TopDev

Google Của Hàn Quốc – NAVER Khai Trương Trung Tâm Lập Trình Tại TP Hồ Chí Minh

Với mục tiêu xây dựng trung tâm mạnh nhất khu vực Đông Nam Á về nghiên cứu Trí tuệ nhân tạo (AI), cuối tháng 2 vừa qua, Tập đoàn công nghệ Naver (Hàn Quốc) chính thức khai trương Trung tâm Lập trình (Dev Center) đầu tiên tại TP. Hồ chí Minh, Việt Nam.

Đại diện Naver Việt Nam (công ty con có tư cách pháp nhân tại Việt Nam của tập đoàn Naver HQ) – ông Park Dong Jin chia sẻ: Trung tâm sẽ nghiên cứu, phát triển các tính năng mới và vận hành các tính năng cho các dịch vụ sẵn có và sắp có của Naver. Trong đó, các team lập trình đang tập trung chủ yếu vào nghiên cứu, phát triển cho các dịch vụ như WORKS (công cụ làm việc tích hợp các chức năng như mail, calendar (lịch trình), drive (lưu trữ) và contact (danh bạ) với trọng tâm là kết nối nội bộ doanh nghiệp.); MUSIC (với nền tảng âm nhạc VIBE); BBOOM (Nền tảng cộng đồng, giúp mọi người chia sẻ suy nghĩ, kinh nghiệm bản thân); FANSHIP (phát triển từ Ứng dụng truyền hình trực tiếp VLive – nơi kết nối nghệ sĩ kpop và người hâm mộ) … Bên cạnh đó, các lập trình viên của Dev Center cũng sẽ lên ý tưởng và thiết kế các sản phẩm mới cho Naver Clova AI Lab.

Trung tâm Lập trình (Dev Center) đầu tiên tại TP. Hồ chí Minh, Việt Nam

Trung tâm Lập trình (Dev Center) đầu tiên tại TP. Hồ chí Minh, Việt Nam

Các dịch vụ đang được Naver cung cấp

Các dịch vụ đang được Naver cung cấp

Được biết, Trung tâm cũng thuộc dự án Global AI R&D Belt (mạng lưới hợp tác nghiên cứu và phát triển AI mạnh mẽ từ Hàn Quốc đến Nhật Bản, Châu Âu, Châu Mỹ và Đông Nam Á do Naver triển khai từ năm 2018) và sẽ là nơi hội tụ, kết nối các Phòng nghiên cứu Trí tuệ nhân tạo hợp tác với các trường đại học ở Việt Nam.

Chia sẻ về tầm quan trọng của Dev Center, Ông Park Dong Jin cho biết, bốn thành phần chính của dự án Global AI R&D Belt là Chuyên gia, Dữ liệu, Cơ sở hạ tầng và Thị trường kinh doanh. Bằng cách xây dựng Trung tâm Lập trình làm trụ sở nghiên cứu chính, kết nối các phòng lab hợp tác với trường đại học, Naver có thể thu hút được nhiều tài năng AI xuất sắc tại Việt Nam. Ngoài ra, thông qua trung tâm, tập đoàn có thể xây dựng dữ liệu địa phương và toàn cầu với quy mô lớn, để đào tạo các mô hình AI cạnh tranh. Bên cạnh đó, việc đi sâu tìm hiểu các nền văn hóa và thị trường địa phương sẽ giúp hoạt động kinh doanh AI của Naver thành công trên toàn cầu. Hơn nữa, các đối tác hợp tác nghiên cứu cũng sẽ có thêm nhiều kinh nghiệm giải quyết các bài toán AI thực tế, đa dạng và đầy thách thức trong thế giới thực.

Vành đai Global AI R&D

Vành đai Global AI R&D đang được phát triển và mở rộng từ Hàn Quốc đến Nhật Bản, Pháp, Việt Nam, Mỹ, Canada, Đức, …

Dù Việt Nam có thể chưa được coi là một trong những quốc gia dẫn đầu thế giới về KH&CN, song Việt Nam vô cùng nổi trội trong lĩnh vực khoa học máy tính (computer science), đồng thời sở hữu nguồn nhân lực IT trẻ đầy tiềm năng. Tiêu biểu phải kể đến các kết quả nghiên cứu và các hoạt động hợp tác giữa Naver và hai trường đại học tiêu biểu của Việt Nam là ĐH Bách Khoa Hà Nội (HUST) và Học viện Công nghệ Bưu chính Viễn thông Hà Nội đã vượt qua sự mong đợi của các bên. Trong đó, công trình nghiên cứu về trích xuất các cụm từ đồng nghĩa/gần nghĩa (synonym extraction) trong môi trường văn bản mà Naver tiến hành triển khai với HUST đã mang về thành công vang dội khi được công bố tại EMNLP 2021 – Hội nghị lớn nhất thế giới về lĩnh vực xử lý ngôn ngữ tự nhiên. Ngoài ra, 2 hội thảo AI NOW tổ chức vào cuối năm 2021 đã thu hút hàng trăm nghìn lượt theo dõi trực tuyến; Cuộc thi Hackathon (BKAI x Naver) diễn ra từ đầu tháng 4/2022 cũng gây tiếng vang khi có gần 200 đội dự thi; … Chính vì vậy, để đánh dấu bước đầu hợp tác thành công, đầu tháng 5 vừa qua, Naver và HUST, PTIT đã chính thức quyết định nội dung hợp tác năm thứ 2, dự kiến sẽ triển khai nhiều hoạt động ý nghĩa tại Việt Nam hơn nữa.

Hiện tại, Naver cũng đang tập trung vào tuyển dụng nhân tài cho Trung tâm Lập trình. Theo tiến trình, đến năm 2023, Dev Center sẽ có khoảng 300 nhân sự Dev. Các vị trí đang tuyển dụng gồm: Backend Engineer (Java), Frontend Engineer (ReactJS/VueJS), macOS Engineer (Objective-C/Swift), Windows Engineer (C/C++), Windows Engineer (C# .net), iOS Engineer (Swift), Android Engineer (Java/Kotlin), Frontend Engineer (HTML/CSS),….

Một góc của Trung tâm Lập trình Naver Dev Center tại TP Hồ Chí Minh

Một góc của Trung tâm Lập trình Naver Dev Center tại TP Hồ Chí Minh

NAVER VIETNAM DEVELOPMENT CENTER

📍 Địa chỉ: Lầu 4, Tháp B, Toà Nhà Viettel, 285 CMT8, phường 12, quận 10, TP.HCM

🌐  Careers Site: https://lnkd.in/gyAWvw5i

🌐  Linkedin Fanpage: NAVER VIETNAM

🌐  Official Website: https://www.navercorp.vn/

Hướng Dẫn Assembly 64bit (Tái Bản)

hướng dẫn assembly 64bit

Bài viết được sự cho phép của tác giả Trần Thiện Khiêm

Nhiều bạn hỏi mình lập trình viên nên học ngôn ngữ gì, hôm nay mình xin giới thiệu một ngôn ngữ khá quen thuộc..

LỜI NÓI ĐẦU

Suốt hàng ngàn năm, con người đã sử dụng các ngôn ngữ lập trình để bắt máy tính phải “hiểu” mình và làm theo mệnh lệnh của mình. Các bạn đừng bị thị trường lừa dối, bởi vì máy tính vốn chỉ hiểu một ngôn ngữ duy nhất, đó là ngôn ngữ máy (machine code). Và trong khi các bạn diễn giải ý định của mình bằng java hay c# thì máy tính hoàn toàn không hiểu được. Và phải qua các bước biên dịch phức tạp thì máy mới hiểu được bạn muốn nói gì. Nhưng mà “tam sao thất bản”, chắc chắn máy tính sẽ không hiểu đúng 100% bạn ý định nói gì đâu. Mà coi như là máy tính hiểu bạn rồi, thì khi nào bạn sẽ hiểu máy tính?

Nếu bạn là người yêu máy tính, thích lập trình thì hãy nhanh chân học ngôn ngữ mà máy cũng hiểu và bạn cũng hiểu. Mình sẽ không bắt các bạn phải học mã máy, nhưng chí ít bạn nên học Assemb-Ly vì với máy tính, như thế là tuyệt lắm rồi. Assembly – Machine code nó tương đương 1-1 nên nếu biết assembly thì cũng tạm chấp nhận.

Đối với các bạn học bách khoa thì quả thật là may mắn vì các bạn đã được học assembly. Nhưng mà chắc là đã quên hết rồi nên trong bài này mình sẽ hướng dẫn lại căn bản cho các bạn.

Trong bài viết sử dụng MacOS và Xcode để lập trình nên bạn nào không có thì sử dụng trí tưởng tượng phong phú của mình.

CĂN BẢN ASSEMBLY

Data size: Các khái niệm cơ bản về kích thước của dữ liệu khi làm việc: byte (8 bit) -> word (16 bit) -> double words (32 bit) -> quad words 64 bit). Mình chỉ làm việc với 2 toán tử có kích thước tương đương.

Thanh ghi: Là các thanh nhớ đặc biệt dùng để tính toán. Khi tính toán thì chỉ thao tác với giá trị trên thanh ghi. (các thanh ghi general các bạn từng học như ax <=> al: (8 bit); ax: (16 bit); eax (32 bit); rax (64 bit))

Lưu trữ dữ liệu: Ngoài thanh ghi, có 2 vùng nhớ là stack và heap.

Lệnh: có các nhóm lệnh: đọc ghi dữ liệu / tính toán / điều khiển (lệnh nhảy – gọi hàm).

Nhãn (label): Mình có thể đánh dấu các câu lệnh, vùng nhớ bằng nhãn để có thể tham chiếu sau này.

Cú pháp: [<nhãn>:] <mã lệnh> nguồn[, đích]

Ví dụ:

movl $1, %eax; // gán eax = 1

move $1 to %eax (l nghĩa là kiểu long (4 bytes), b = bytes, w = word (2 bytes), q = quad words (8 bytes))

assembly 64bit

HELLO WORLD

Để bắt đầu, các bạn mở Xcode và tạo 1 dự án Command Line Tool, chọn ngôn ngữ là C. Bước tiếp theo, đổi tên main.c thành main.s và xoá hết code C trong main.s. .s là file chứa mã nguồn assembly.

Lúc biên dịch, bạn sẽ nhận được một thông báo lỗi như sau:

Undefined symbols for architecture x86_64:

 “_main”, referenced from:

    implicit entry/start for main executable

Thông báo lỗi này do chưa viết hàm main.

Chương trình assembly được chia thành nhiều đoạn (segment), cấu trúc căn bản như sau:

.section __DATA, __data // section data chứa data sử dụng trong chương trình

.section __TEXT, __text // section text chứa code trong chương trình

Chương trình muốn chạy được thì phải có symbol _main, do đó ta thêm symbol _main vào trong chương trình.

.section __DATA, __data // section that stores data

.section __TEXT, __text // section that stores executable code

.global _main

_main:

Chỉ thị global _main đăng kí với trình biên dịch symbol _main sẽ được public trong giai đoạn liên kết.

Bây giờ chúng ta đã biên dịch thành công, tuy nhiên lúc chạy chương trình sẽ gặp lỗi sau:

Thread 1: EXC_BAD_ACCESS

Hàm main chưa có gì thì làm sao mà chạy? làm sao mà chạy?

Lý do là hàm main hiện tại chúng ta chưa viết gì cả. Vậy hàm main sẽ làm gì? Chúng ta sẽ thử ra chỉ thị kết thúc chương trình.

_main:

movl $0x2000001, %eax

syscall

Nếu như trong MS DOS các bạn quen với interrupt (ngắt hệ thống) thì ở hệ thống 64 bit đó là syscall, các chương trình con của hệ thống. $0x2000001 là system exit(). Các bạn có thể tham khảo các chương trình con này ở

http://opensource.apple.com//source/xnu/xnu-1228.5.20/bsd/sys/syscall.h.

– Định nghĩa + tham số tương đương ở đây: http://opensource.apple.com//source/xnu/xnu-1504.3.12/bsd/kern/syscalls.master

Như vậy chương trình của chúng ta đã chạy. Nhưng nó kết thúc ngay lập tức chưa kịp làm gì cả. Vậy làm sao để in ra chữ HelloWorld?

Nhìn trong file mình vưà gửi thì syscall 4 sẽ in viết một thông điệp ra dòng xuất chuẩn. Có 3 tham số : 1 là kí hiệu của dòng xuất (output stream) và 2 là thông điệp, 3 là kích thước của thông điệp

Ta chỉnh sửa lại chương trình như sau:

.section __DATA, __data

 helloMessage: .asciz "Hello World\n"

.section __TEXT, __text

.global _main

_main:

 movl $0x2000004, %eax // the print syscall function

 movl $1, %edi // standard output = 1

 movq helloMessage@GOTPCREL(%rip), %rsi // address to message

 movq $100, %rdx // size of the message

 syscall 

 movl $0x2000001, %eax // the exit syscall function

 movl $0, %ebx // exit code == 0

 syscall

Ta vừa thêm dữ liệu chứa dòng helloMessage vào segment data với nội dung là “Hello World\n”. Lúc biên dịch, nội dung này cũng sẽ được copy vào file thực thi, và lúc chạy sẽ hiện được tải vào data segment.

Để lấy địa chỉ của helloMessage, ta sử dụng cú pháp helloMessage@GOTPCREL(%rip), tương tự với toán tử lấy địa chỉ trong C: &helloMessage, sau đó ta gán vào tham số thứ 2, thanh ghi %rsi. Tham số thứ 3 là kích thước của thông điệp, ghi đại 0x100.

Sau khi gọi chương trình con số 4 của syscall, màn hình sẽ in ra dòng “Hello World”. Sau đó ta gọi chương trình con số 1 của syscall để kết thúc chương trình. Vậy là ta đã có chương trình “Hello World” đầu tiên. Xin chúc mừng!

!!!. Bây giờ bạn có thể yên tâm lên LinkedIn và cập nhật CV master Assembly.

Hẹn các bạn trong những bài viết tiếp theo về Assembly.

Bài viết gốc được đăng tải tại fanpage Khiem Tran – Programmer

Xem thêm:

Đừng bỏ lỡ việc làm IT hàng đầu dành cho Top Devlopers tại TopDev!

Máy học Microsoft ML.NET – Mô hình hồi quy, Dự báo giá nhà (Phần 1) – Bài 2

Mô hình hồi quy – Dự báo giá nhà – phần 1

Bài viết được sự cho phép của tác giả Trần Duy Thanh

Ở bài 1 Tui đã giới thiệu về nền tảng máy học Microsoft ML.NET, các bạn chưa đọc thì chú ý đọc để nắm được sơ lược về nền tảng máy học này trước khi làm bài Dự báo giá nhà bằng mô hình hồi quy. Tui sẽ hướng dẫn từ cơ bản tới nâng cao để các bạn có thể tự tay viết được phần mềm dự báo giá nhà nên Tui chia ra làm nhiều phần, mỗi phần sẽ giúp các bạn hiểu lý thuyết cơ bản, áp dụng lý thuyết để lựa chọn các tình huống cụ thể nhằm xây dựng được phần mềm theo mục đích riêng.

Hi vọng qua mỗi phần thì nội công của các bạn sẽ thâm hậu lên, tuy nhiên đừng có chém gió quá vì các phần mềm này nó chỉ hữu ích thực sự khi chạy trong hệ thống minh bạch, nếu hệ thống không minh bạch thì nó chỉ nên là công cụ để tham khảo thôi, chứ xí xớn là Cò nó mổ cho má nhận không ra.

Mục đích của bài này sẽ giúp các bạn sẽ nắm được các kiến thức:

  • Các mô hình hồi quy trong Microsoft ML.NET
  • Các lớp huấn luyện được dùng trong bài toán hồi quy
  • Xây dựng được phần mềm dự báo giá nhà đơn giản bằng mô hình hồi quy
    • Chuẩn bị dữ liệu và mô hình hóa dữ liệu như thế nào?
    • Chia bộ dữ liệu Train-Set và Test-Set ra sao
    • Chọn giải thuật để train
    • Train/build mô hình
    • Đánh giá mô hình
    • Lưu mô hình
    • Tải mô hình
    • Sử dụng mô hình

Các bạn lưu ý là chuỗi các bài học này Tui tập trung vào ứng dụng cách sử dụng các thư viện chứ không tập trung giải thích lý thuyết về máy học. Nên nếu bạn chưa có kiến thức cơ bản về máy học thì phải tự trang bị.

Các mô hình hồi quy trong Microsoft ML.NET

Trong máy học thì họ chia mô hình hồi quy ra làm 2 loại: Hồi quy tuyến tính và hồi quy Logistic. Microsoft cung cấp hàng loạt các giải thuật Trainning liên quan tới 2 mô hình hồi quy này:

Các Trainers hồi quy tuyến tính

  • FastTreeRegressionTrainer
  • FastTreeTweedieTrainer
  • FastForestRegressionTrainer
  • GamRegressionTrainer
  • LbfgsPoissonRegressionTrainer
  • LightGbmRegressionTrainer
  • OlsTrainer
  • OnlineGradientDescentTrainer
  • SdcaRegressionTrainer

Các Trainers hồi quy Logistic:

  • LbfgsLogisticRegressionBinaryTrainer
  • SdcaLogisticRegressionBinaryTrainer
  • SdcaNonCalibratedBinaryTrainer
  • SymbolicSgdLogisticRegressionBinaryTrainer

Đây đa phần là các Extension method, và ta cũng có thể bổ sung các Trainers nếu muốn. Các lớp này được Microsoft cung cấp, và nó sẽ còn được cập nhật nhiều hơn nữa.

Việc làm Machine Learning dành cho kỹ sư ML, apply ngay!

Các lớp huấn luyện được dùng trong bài toán hồi quy

Các phần của bài dự báo giá nhà sẽ đi theo mô hình mà Tui vẽ dưới này, nó gồm 7 bước (Vui lòng trích dẫn nguồn khi dùng hình này). Tui sẽ minh họa 7 bước như trong bài 1 mà Tui đã mô tả.

Tóm tắt 7 bước trên như sau:

Bước 1:

Collect dữ liệu và chạy tạo train – test set data

Tách dữ liệu thành 2 phần 20% cho test, 80% cho train

Bước 2:

Chọn giải thuật, rút trích đặc trưng cho tập dữ liệu

Giải thuật là lớp SdcaRegressionTrainer

Bước 3:

Tiến hành train mô hình, gọi phần Train Set (80%) để train

Bước 4:

Đánh giá mô hình, dùng độ qua R-Squared và RMSE (Root Mean Squared Error)

Nếu độ đo không thỏa yêu cầu thì quay lại bước collect dữ liệu, chọn tỉ lệ train và test phù hợp rồi build mô hình lại.

Bước 5:

Lưu mô hình nếu như bước 4 thỏa yêu cầu

Bước 6:

Tải mô hình, khi sử dụng chỉ việc vào bước 6 và bước 7.

Bước 7:

Sử dụng mô hình bằng cách gọi hàm Predict để dự báo giá nhà.

Ta bắt đầu học cách sử dụng mô hình hồi quy tuyến tính, với giải thuật SdcaRegressionTrainer để làm phần 1 của dự báo giá nhà, đây là bài cơ bản để hiểu cơ chế trước, các bài sau sẽ nâng cấp dần lên.

Khởi động Visual Studio 2022, nếu chưa cài đặt thì đọc bài này.

Trong mục dự án tìm chọn Console App rồi nhấn Next

Sau khi nhấn Next:

Đặt tên là “DuBaoGiaNha” rồi bấm Next

Chọn Framework .NET 6.0 (long-term support) rồi bấm Create. Dĩ nhiên khi nó ra version mới thì có thể là 7.0, 8.0….

Giao diện của dự án sẽ như hình dưới đây:

Bây giờ ta sẽ bổ sung thư viện máy học Microsoft.NET cho dự án bằng Nuget như sau:

Bấm chuột phải vào dự án chọn/ Manage Nuget Packages…

Mục Browser tìm “Microsoft.ML”, rồi bấm Install

Nó hiển thị cửa sổ ở trên thì bấm OK.

Sau đó màn hình License Acceptance cũng xuất hiện, ta nhấn “I Accept”

Nếu cài đặt thành công thì trong dự án mục Packages sẽ xuất hiện như hình trên.

Ta bắt đầu lập trình nhé

Vì đây là phần 1, phần cơ bản để hiểu được cơ chế. Nên ta giả sử rằng ta có 1 tập các các nhà có các diện tích và giá của nó (tức là chỉ có 2 thuộc tính: Diện tích và Giá), bây giờ làm sao để chương trình nó dự báo được giá của một căn nhà mới khi biết được Diện tích? (Dĩ nhiên trong thực tế không có trường hợp này, vì giá 1 căn nhà nó lệ thuộc vào: Thành phố, quận, huyện, phường, đường, diện tích, mặt tiền, hẻm, đường lộ, số tầng, số phòng ngủ, phòng khách, bếp, nhà vệ sinh…. nhiều thông số khác…. và ở nước ta chắc là lệ thuộc vào Cò.).

Một lưu ý quan trọng trong máy học là “Garbage in Garbage out” tức là dữ liệu đầu vào là rác thì kết quả đầu ra cũng là rác, vì nó build mô hình sai. Như vậy khi thu thập dữ liệu ta phải luôn luôn có bước tiền xử lý. Ví dụ ta không thể cho máy nó học Giá của một căn nhà mà chủ nhà bị phá sản bị chủ nợ tới xiết bắt bán giá rẻ bèo, hay không thể cho nó học các dữ liệu là giao dịch giả được. Điều này là hiển nhiên thôi, chúng ta đi học cũng vậy, chúng ta phải học từ những điều đúng chứ?

Bây giờ ta tạo 1 lớp là House có 2 thuộc tính Diện tích và Giá Nhà như sau:

Bấm chuột phải vào dự án / chọn Add/ Chọn Class

Đặt tên Class là “House” rồi bấm Add, tiến hành viết lệnh như dưới đây cho lớp House

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace DuBaoGiaNha
{
internal class House
{
public float Size { get; set; }
public float Price { get; set; }
}
}

Tiếp tục lặp lại bước tạo lớp House, ta tạo 1 lớp mới tên là “PredictedHouse” như dưới đây

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace DuBaoGiaNha
{
internal class PredictedHouse:
{

}
}

Tiến hành bổ sung mã lệnh như bên dưới:

  • thư viện Microsoft.ML.Data;
  • thuộc tính [ColumnName(“Score”)], đó là kết quả trả về quả Predict do giải thuật ta lựa chọn trong trường hợp hồi quy tuyến tính này. Và phải viết như vậy, nó sẽ tự động Mapping kết quả trong “Score” cho thuộc tính Price
  • Lưu ý dữ liệu các thuộc tính ta khai báo là float hết nhé, thuộc tính Price ta có thể đổi tên bất kỳ
using Microsoft.ML.Data;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace DuBaoGiaNha
{
internal class PredictedHouse:House
{
[ColumnName("Score")]
public float Price { get; set; }
}
}

Như vậy ta có cấu trúc lớp như hình dưới đây, đồng thời vào “Program.cs” bổ sung 5 lệnh using namespace:

using System;
using System.Text;
using DuBaoGiaNha;
using Microsoft.ML;
using Microsoft.ML.Data;
using static Microsoft.ML.DataOperationsCatalog;

Trong Máy học Microsoft ML.NET tất cả đều bắt đầu bằng đối tượng MLContext, nên ta khai báo:

using System;
using System.Text;
using DuBaoGiaNha;
using Microsoft.ML;
using Microsoft.ML.Data;
using static Microsoft.ML.DataOperationsCatalog;
//xuất dấu Tiếng Việt
Console.OutputEncoding = Encoding.UTF8;
//khai báo đối tượng MLContext 
MLContext mlContext = new MLContext();

Ta tiến hành 7 bước như sau:

Ngay bên dưới dòng lệnh 10 (dòng khởi tạo đối tượng MLContext), bổ sung các lệnh cho bước 1:

//Bước 1. Chuẩn bị dữ liệu và chạy tạo train - test set data
House[] houseData = {
new House() { Size = 1.1F, Price = 1.2F },
new House() { Size = 1.9F, Price = 2.3F },
new House() { Size = 2.8F, Price = 3.0F },
new House() { Size = 3.4F, Price = 3.7F },
new House() { Size = 4.4F, Price = 7.7F },
new House() { Size = 3.2F, Price = 3.2F },
new House() { Size = 3.4F, Price = 3.8F },
new House() { Size = 5.6F, Price = 8.1F },
new House() { Size = 1.2F, Price = 1.4F },
new House() { Size = 4.0F, Price = 6.5F },
new House() { Size = 3.8F, Price = 5.9F }};
//load dữ liệu vài IDataView
IDataView alldata = mlContext.Data.LoadFromEnumerable(houseData);
//tách dữ liệu thành 2 phần 20% cho test, 80% cho train
TrainTestData splitDataView = mlContext.Data.TrainTestSplit(alldata, testFraction: 0.2);

Ở bước 1, Tui tạo khoảng 11 dữ liệu đầu vào, xem đó là lịch sử giao dịch

Hàm LoadFromEnumerable sẽ giúp chuyển dữ liệu đối tượng House thành IDataView, đây là interface quan trọng của Microsoft Machine Learning, nó giúp chuyển các dữ liệu đầu vào thành định dạng của ML.NET

Khi có dữ liệu rồi ta cần tách làm 2 nguồn, 1 nguồn để train mô hình, 1 nguồn để test mô hình.

Hàm TrainTestSplit sẽ giúp tách dữ liệu thành 2 nguồn theo tỉ lệnh testFraction, ở trên Tui để là 0.2 có nghĩa là lấy 20% cho test, 80% cho train. Nó sẽ trả về đối tượng TrainTestData, đối tượng này sẽ tự lưu phần Train-Set và Test-Set. (các bạn cứ tưởng tượng, Giảng Viên đưa 100 đề thi cho các bạn, bạn lấy ra 80 đề để ôn thi, sau đó bạn kiểm tra xem mình ôn bài có tốt không bằng cách lấy 20 đề kia làm luôn coi như nó là đề thật. Sau khi tới ngày thi thực tế thì Giảng Viên mới đưa 1 đề thật, nếu ôn luyện tốt thì đề thi thật sẽ được điểm cao),

Tiếp tục bổ sung lệnh cho bước 2 ở cuối:

// 2. Chọn giải thuật, rút trích đặc trưng cho tập dữ liệu 
var pipeline = mlContext.Transforms.Concatenate("Features", new[] { "Size" })
.Append(mlContext.Regression.Trainers.Sdca(labelColumnName: "Price", maximumNumberOfIterations: 100));

Ở bước 2 này ta cần rút trích đặc trưng cho dữ liệu, trong trường hợp này Căn nhà chỉ có đầu vào là Size (diện tích), nếu nó có nhiều thì cứ thêm vào các thuộc tính khác như là số tầng, phòng ngủ…. còn “Features” là keyword, phải viết y chang vậy.

Ở bước 2 chọn giải thuật train là Sdca (SdcaRegressionTrainer), labelColumnName được hiểu là cột mà mình cần dự báo, ở đây là cột Price (thuộc tính Price)

Nó sẽ trả về pipline (IEstimator)

Sau đó ta bổ sung lệnh cho bước 3:

// 3. Tiến hành train mô hình, gọi phần Train Set
var model = pipeline.Fit(splitDataView.TrainSet);

Ta gọi hàm Fit , truyền vào là tập dữ liệu huấn luyện , nó được lưu trong đối tượng splitDataView ở bước 1, Ta lấy phần dữ liệu huấn luyện thôi nha splitDataView.TrainSet

Kết quả của Fit nó sẽ trả về 1 model có kiểu ITransformer.

Tiếp tục bổ sung lệnh của bước 4 để đánh giá chất lượng của mô hình

//4. train mô hình xong thì phải đánh giá nó
RegressionMetrics metrics = mlContext.Regression.Evaluate(splitDataView.TestSet,
labelColumnName: "Size", scoreColumnName: "Price");
//thông số này càng nhỏ càng tốt
Console.WriteLine("Root Mean Squared Error : " + metrics.RootMeanSquaredError);
//thông số này càng tịnh tiến tới 100% càng tốt
//trong kinh tế lượng họ cho rằng >=50% là ổn, nhưng không có nghĩa <50% là dở
//ví dụ như chứng khoán nó sẽ nhảy búa xua
Console.WriteLine("RSquared: " + metrics.RSquared);

Ở bước 4 Ta dùng 2 độ đo, R-Squared và Root Mean Squared Error

Sau khi dựa vào các độ đo này thì ta sẽ quyết định mô hình tốt hay không, nếu không tốt thì quay lại bước dữ liệu, kiểm tra xem dữ liệu có sạch sẽ và chuẩn mực không, rồi thử các trường hợp chia dữ liệu để chạy lại mô hình.

Sau khi bước 4 hoàn tất thì tiến hành viết lệnh cho bước 5 nhằm lưu mô hình này xuống ổ cứng, lưu lại để lần sau chỉ đọc ra sử dụng thôi, chứ không phải tốn thời gian với chi phí để build lại mô hình .

//5.giả sử mô hình ngon rồi thì lưu mô hình lại
mlContext.Model.Save(model, splitDataView.TrainSet.Schema, "housemodel.zip");

Như vậy mặc định nó sẽ lưu vào nơi thực thi của dự án.

Hàm Save có 3 đối số, đối số 1 là mô hình và ta muốn lưu, đối số 2 là cấu trúc của TrainSet (Schema), đối số 3 là tên mô hình được lưu xuống file, mặc định để .zip

Tiếp tục bổ sung lệnh cho bước 6:

//6. Load mô hình lên để sài
//dĩ nhiên là bước 6,7 này nó nằm riêng chỗ khác, 1->5 lưu xong thì dẹp nó đi
//khi dùng chỉ quan tâm bước 6, và 7 thôi. Nhưng vì Tui hướng dẫn để 1 lèo 1->7 cho bạn hiểu
DataViewSchema modelSchema;
// Load trained model
var modelDaLuu = mlContext.Model.Load("housemodel.zip", out modelSchema);

Hàm Load sẽ có 2 đối số: Đối số 1 là tên file của mô hình mà ta lưu ở bước 5, đối số 2 là Schema là kết quả trả về loại cấu trúc của TrainSet mà ta lưu ở bước 5.

Sau khi load được mô hình thì ta tiến hành sử dụng như trong bước 7:

//7. Gọi predict để dùng mô hình xem dự báo
var input = new House() { Size = 2.5F };
var output = mlContext.Model.CreatePredictionEngine<House, PredictedHouse>(modelDaLuu).Predict(input);

Console.WriteLine("Nhà diện tích " + input.Size + " được dự đoán có giá =" + output.Price);

Ở bước 7 ta gọi CreatePredictionEngine với House là Input, PredictedHouse là output.

Truyền mồ hình vào rồi Gọi hàm Predict nó sẽ trả về một đối tượng PredictedHouse

Như vậy tới đây Tui đã trình bày xong 7 bước của bài máy học dùng Hồi quy tuyến tính để dự báo giá nhà.

Xem ngay tin tuyển dụng .NET tại các doanh nghiệp hàng đầu trên TopDev

Dưới đây là coding đây đủ:

using System;
using System.Text;
using DuBaoGiaNha;
using Microsoft.ML;
using Microsoft.ML.Data;
using static Microsoft.ML.DataOperationsCatalog;
//xuất dấu Tiếng Việt
Console.OutputEncoding = Encoding.UTF8;
//khai báo đối tượng MLContext 
MLContext mlContext = new MLContext();
//Bước 1. Chuẩn bị dữ liệu và chạy tạo train - test set data
House[] houseData = {
               new House() { Size = 1.1F, Price = 1.2F },
               new House() { Size = 1.9F, Price = 2.3F },
               new House() { Size = 2.8F, Price = 3.0F },
               new House() { Size = 3.4F, Price = 3.7F },
               new House() { Size = 4.4F, Price = 7.7F },
               new House() { Size = 3.2F, Price = 3.2F },
               new House() { Size = 3.4F, Price = 3.8F },
               new House() { Size = 5.6F, Price = 8.1F },
               new House() { Size = 1.2F, Price = 1.4F },
               new House() { Size = 4.0F, Price = 6.5F },
               new House() { Size = 3.8F, Price = 5.9F }};
//load dữ liệu vài IDataView
IDataView alldata = mlContext.Data.LoadFromEnumerable(houseData);
//tách dữ liệu thành 2 phần 20% cho test, 80% cho train
TrainTestData splitDataView = mlContext.Data.TrainTestSplit(alldata, testFraction: 0.2);

// 2. Chọn giải thuật, rút trích đặc trưng cho tập dữ liệu 
var pipeline = mlContext.Transforms.Concatenate("Features", new[] { "Size" })
.Append(mlContext.Regression.Trainers.Sdca(labelColumnName: "Price", maximumNumberOfIterations: 100));

// 3. Tiến hành train mô hình, gọi phần Train Set
var model = pipeline.Fit(splitDataView.TrainSet);

//4. train mô hình xong thì phải đánh giá nó
RegressionMetrics metrics = mlContext.Regression.Evaluate(splitDataView.TestSet,
labelColumnName: "Size", scoreColumnName: "Price");
//thông số này càng nhỏ càng tốt
Console.WriteLine("Root Mean Squared Error : " + metrics.RootMeanSquaredError);
//thông số này càng tịnh tiến tới 100% càng tốt
//trong kinh tế lượng họ cho rằng >=50% là ổn, nhưng không có nghĩa <50% là dở
//ví dụ như chứng khoán nó sẽ nhảy búa xua
Console.WriteLine("RSquared: " + metrics.RSquared);

//5.giả sử mô hình ngon rồi thì lưu mô hình lại
mlContext.Model.Save(model, splitDataView.TrainSet.Schema, "housemodel.zip");

//6. Load mô hình lên để sài
//dĩ nhiên là bước 6,7 này nó nằm riêng chỗ khác, 1->5 lưu xong thì dẹp nó đi
//khi dùng chỉ quan tâm bước 6, và 7 thôi. Nhưng vì Tui hướng dẫn để 1 lèo 1->7 cho bạn hiểu
DataViewSchema modelSchema;
// Load trained model
var modelDaLuu = mlContext.Model.Load("housemodel.zip", out modelSchema);

//7. Gọi predict để dùng mô hình xem dự báo
var input = new House() { Size = 2.5F };
var output = mlContext.Model.CreatePredictionEngine<House, PredictedHouse>(modelDaLuu).Predict(input);

Console.WriteLine("Nhà diện tích " + input.Size + " được dự đoán có giá =" + output.Price);

Chạy phần mềm (nhấn F5) ta có kết quả:

Root Mean Squared Error : 0.2828426113221826
RSquared: -6.999914170176103
Nhà diện tích 2.5 được dự đoán có giá =3.3304372

Bạn thử các dữ liệu khác, thay đổi tỉ lệ của Train-set, test-set để đánh giá lại chất lượng lại mô hình cũng thử Predict để xem giá của các căn nhà có thông số khác.

Như vậy các bạn đã hiểu được đầy đủ cách lập trình một bài dùng máy học với mô hình hồi quy tuyến tính để dự báo giá của một căn nhà. Ráng làm lại để hiểu thêm cách gọi cũng như cách sử dụng các thông số.

Bài sau Tui sẽ tiếp tục bài dự báo giá nhà, nhưng làm trên giao diện tương tác để các bạn dễ sử dụng hơn, với lại khi đưa cho khách hàng sử dụng thì phải có giao diện tương tác chứ đúng không?

Thứ tự các bài tiếp theo gồm:

  • Dự báo giá nhà dùng giao diện
  • Dự báo giá nhà dùng giao diện + nạp dữ liệu từ text file
  • Dự báo giá nhà dùng giao diện + nạp dữ liệu từ Json file
  • Dự báo giá nhà dùng giao diện + nạp dữ liệu từ Excel
  • Dự báo giá nhà dùng giao diện + nạp dữ liệu từ SQL Server
  • Dự báo giá nhà với quy trình tổng hợp

Chúc các bạn thành công.

Mã nguồn của chương trình có thể tải tại đây:

https://www.mediafire.com/file/waqsthuxc97g6go/DuBaoGiaNha.rar/file

Bài viết gốc được đăng tải tại duythanhcse.wordpress.com

Bạn có thể xem thêm:

Đừng bỏ lỡ tin tuyển dụng IT từ các công ty hàng đầu trên TopDev nhé!

Các Công Ty IT Tại TPHCM

Những công ty IT tại TPHCM

Công nghệ thông tin hiện đang phát triển như vũ bão và IT cũng là ngành được nhiều bạn trẻ lựa chọn cho con đường sự nghiệp . Tại Việt Nam, Hà Nội và Tp HCM có thể xem là hai trung tâm công nghệ lớn nhất cả nước với hàng loạt công ty công nghệ. Bài viết này trước tiên sẽ tổng hợp cho bạn những công ty IT tại Tp HCM bao gồm cả những công ty nước ngoài và công ty Việt Nam.

*Thứ tự trong bài viết chỉ nhằm liệt kê các công ty, không nhằm mục đích xếp hạng hay đánh giá

Các công ty IT nước ngoài tại TPHCM

  • KMS Technology

Đôi chút về KMS Technology thì đây là công ty outsource (90%), là một trong những công ty hàng đầu chuyên cung cấp các dịch vụ phát triển sản phẩm và các giải pháp chuyển đổi số.

  • Hitachi Vantara Vietnam (HVN) – Global Cybersoft

Hitachi Vantara Vietnam (trước đây là Global CyberSoft), đây là công ty có nhiều năm kinh nghiệm trong việc cung cấp các giải pháp CNTT và dịch vụ tích hợp hệ thống trong các lĩnh vực chuyển đổi số, phát triển phần mềm, quản lý doanh nghiệp ERP, hệ thống nhúng và dịch vụ quản trị (managed services).

  • Harvey Nash

Harvey Nash được đánh giá rất cao trong dịch vụ thuê ngoài công nghệ thông tin/ dịch vụ nghiệp vụ doanh nghiệp, lĩnh vực tìm kiếm nhân sự cấp cao.

  • Dek technologies

Được thành lập tại Melbourne Australia vào năm 1999, DEK Technologies tự hào là một trong những công ty hàng đầu trong lĩnh vực cung cấp các giải pháp về phần cứng và phần mềm với đội ngũ kỹ sư có kinh nghiệm lên đến gần 700 người tại 5 quốc gia, trong đó có Việt Nam. DEK Technologies đã, đang và sẽ luôn cố gắng mang lại cho nhân viên quyền tự chủ và sự thoải mái nhất vì Công ty luôn tin sự cởi mở và công bằng trong môi trường làm việc là chìa khóa cho sự thành công bền vững.

  • Intel Corporation

Intel nằm trong top những công ty lớn trên thế giới về sản xuất thiết bị chất bán dẫn lớn nhất thế giới, và là nhà phát minh ra chuỗi vi mạch xử lý thế hệ x86 mà bộ xử lý tìm thấy ở các máy tính cá nhân.

  • Bosch Rexroth Vietnam

Có thể nói Bosch là chuyên gia hàng đầu về Công nghệ Truyền động và Điều khiển. Đây là một tập đoàn của Đức và gia nhập vào Việt Nam từ rất sớm. Có rất nhiều nhân viên, quản lý đến từ nhiều quốc gia khác nhau, do đó phong cách làm việc tại Bosch là sự kết hợp giữa nhiều nền văn hóa với nhau. Bên cạnh đó, benefit tại Bosch cũng rất tốt.

  • Axon Active Vietnam

Đây là một công ty đi tiên phong trong lĩnh vực phát triển phần mềm “offshore” có trụ sở đặt tại Thụy Sỹ. Axon Active phát triển phần mềm dành cho BI, ERP, mạng lưới quan hệ, GIS, hệ thống quản lý rủi ro và ứng dụng cho các thiết bị di động.

  • SHIFT ASIA

Sau nhiều năm hoạt động SHIFT ASIA đã đạt được những thành tựu nhất định trong lĩnh vực Software Testing, hiện nay SHIFT ASIA bắt đầu mở rộng kinh doanh với lĩnh vực phát triển phần mềm (Software Development, Outsourcing Solutions). 

Do đó, công ty đang chiêu mộ đồng đội cùng nhau phát triển. Mời bạn tham khảo việc làm và phúc lợi của SHIFT ASIA đang tuyển tại TopDev.

Công ty nước ngoài tại TPHCM

Công ty IT Việt Nam tại TPHCM

  • Fujinet Systems JSC

Công ty phát triển phần mềm chủ yếu cho thị trường Nhật Bản với quy mô lớn gồm nhiều kỹ sư dày dạn kinh nghiệm tại thị trường Việt Nam. Fujinet mang một phong cách làm việc hài hòa giữa nét văn hóa Việt Nam – Nhật Bản.

  • Viettel

Tập đoàn viễn thông quân đội Viettel – được đánh giá là nơi có môi trường làm việc trong lĩnh vực công nghệ hấp dẫn số 1 Việt Nam.

  • MayTech

MayTech là công ty chuyên cung cấp dịch vụ thiết kế Desktop Software, Mobile App, Web App với đội ngũ gồm những chuyên gia có nhiều năm kinh nghiệm trong ngành.

  • FPT Software Hồ Chí Minh

Một công ty công nghệ thuần Việt và hầu như các kỹ sư công nghệ nào cũng biết đến. FPT Software ra đời với mục tiêu gia công phần mềm để đáp ứng cho nhu cầu phát triển công nghệ thông tin của các hãng phần mềm và xuất khẩu phần mềm trên toàn thế giới cho các công ty nước ngoài.

  • VNG Corporation

Không thể không nhắc đến kỳ lân công nghệ VNG, với sản phẩm chính là Trò chơi trực tuyến, Nền tảng kết nối, Thanh toán điện tử và Dịch vụ điện toán đám mây. Trụ sở VNG tại Tp Hồ Chí Minh được đầu tư cơ sở vật chất hiện đại mang đến môi trường làm việc lý tưởng cho nhân viên.

  • Tinhvan Group (Công ty Cổ phần Xuất khẩu Phần mềm Tinh Vân)

Công ty có kinh nghiệm chuyên sâu trong việc triển khai các dự án gia công PM thuộc nhiều lĩnh vực khác nhau.

  • TMA Solutions -DNTN Dịch Vụ Tường Minh

Được thành lập từ năm 1997, 6 văn phòng làm việc tại Tp HCM và hơn 1500 kỹ sư TMA Solutions được xem là một trong những công ty gia công phần mềm lớn nhất tại Tp Hồ Chí Minh.

  • RIKKEISOFT

Đây là một trong những công ty hàng đầu tại Việt Nam về sản xuất phần mềm, đặc biệt là ứng dụng trên nền tảng web và smartphone

  • KiteMetric

KiteMetric là một công ty outsource ra đời với sứ mệnh mang đến sản phẩm công nghệ chất lượng cao cho khách hàng. Những lĩnh vực mà công ty cung cấp có thể kể đến như: machine learning applications, data visualization, social networks, fintech applications,….

Tuy là công ty với quy mô vừa nhưng phúc lợi tại KiteMetric rất hấp dẫn. Bạn có thể truy cập vào đây để tham khảo nhé!

  • BnK Solutions

Brilliant and kool mang đến cho khách hàng nhiều dự án có quy mô từ nhỏ đến lớn với các công nghệ mới của xu hướng 4.0 như Đám mây, Phân tích Big Data, Tính di động, AI và nền tảng Công nghiệp Internet vạn vật.

  • FABA Technology

FABA Technology là một startup Việt Nam trong lĩnh vực cung cấp dịch vụ phát triển phần mềm.

Hiện FABA đang chờ đón những Dev có kinh nghiệm về chung nhà. Tham khảo ngay tại đây nhé!

  • NaviWorld Vietnam

Naviworld Vietnam là thành viên của Naviworld Group cung cấp giải pháp hàng đầu về các ứng dụng quản lý kinh doanh end-to-end cho các doanh nghiệp tầm trung.

  • XPERC

XPERC cung cấp dịch vụ phát triển phần mềm cho tất cả quy mô công ty.

Những công ty trên đây bao gồm cả doanh nghiệp lớn, nhỏ và startup. Tất nhiên, mình không thể thu thập hết tất cả các công ty được, nên thông tin trên đây chỉ mang tính chất tham khảo thôi he.

Mời bạn theo dõi thêm nhiều blog mới tại topdev.vn/blog và cũng đừng bỏ lỡ cơ hội việc làm IT, tester, PM, vân vân và mây mây trên TopDev nhá!


Tuyển Dụng Nhân Tài IT Cùng TopDev
Đăng ký nhận ưu đãi & tư vấn về các giải pháp Tuyển dụng IT & Xây dựng Thương hiệu tuyển dụng ngay!
Hotline: 028.6273.3496 – Email: contact@topdev.vn
Dịch vụ: https://topdev.vn/page/products

Mát Máy Sau Khi Chuyển Từ InfluxDB Sang TimescaleDB

Mát máy sau khi chuyển từ InfluxDB sang TimescaleDB

Bài viết được sự cho phép của tác giả Nguyễn Hồng Quân

Làm việc trong lĩnh vực IoT (Internet of Things) nên tôi khá cần một hệ quản trị cơ sở dữ liệu chuyên dụng cho kiểu dữ liệu time-series (chuỗi thời gian), để lưu trữ dữ liệu do các thiết bị giám sát gửi lên.

Mặc dù IoT dựa trên những cơ sở công nghệ đã được phát triển từ lâu, thậm chí hệ CSDL time-series cũng không phải là khái niệm mới, nhưng mỗi nhà có một nhu cầu, nên mãi cho tới hồi đầu năm nay (2020), vẫn chưa có một hệ cơ sở dữ liệu nào thỏa mãn ý của tôi cả (khi viết bài này thì đã tìm được cái ưng ý).

Vậy nhu cầu của tôi khác với các đơn vị khác như thế nào? Đó là:

  • Lưu trữ vĩnh viễn.
  • Tự tóm tắt dữ liệu cũ.
  • Chạy ổn trong máy tính nhúng.

Đa số các hệ CSDL time-series ra đời trước đây là phục vụ cho việc theo dõi “sức khỏe” của server (CPU/RAM usage) nên nó chỉ cần giữ lại dữ liệu trong một khoảng thời gian ngắn, vì vậy nhu cầu 1) không đáp ứng được. Ban đầu, khi mới bắt tay vào làm phần mềm cho AgriConnect, tôi tạm dùng PostgreSQL cho nhu cầu này, kết hợp với mẹo tạo chỉ mục (index) để đảm bảo tốc độ truy cập những dữ liệu mới ghi (để vẽ thành biểu đồ và để tính toán ra quyết định điều khiển thiết bị). Thời kỳ đó phần mềm của tôi nhắm chạy trên board BeagleBone Black nên những hệ CSDL viết bằng Java như Cassandra bị loại từ “vòng gửi xe”, dù chúng hay được nhắc đến tên trong các platform về IoT sẵn có (các platform này cũng viết bằng Java nên cũng bị tôi bỏ qua, sorry các bạn fan của Java).

PostgreSQL kết hợp với chiến thuật tạo chỉ mục hợp lý thì khá ổn cho nhu cầu hay gặp (vẽ biểu đồ, điều khiển thiết bị dựa trên dữ liệu đo đạc), cho đến khi chúng tôi bắt đầu có nhu cầu kết xuất (export) dữ liệu cũ nhằm đánh giá hiệu quả mùa vụ. Dữ liệu cũ này không được đánh chỉ mục nên khi kết xuất thì chạy khá nặng, làm BeagleBone quá tải luôn. Vì vậy tôi bắt đầu tìm kiếm thêm, vừa lúc đó thì InfluxDB ra đời (có lẽ nó ra đời trước đó rồi nhưng vẫn đang phát triển, còn sơ khai nên tôi không tìm thấy).

  Cài đặt PostgreSQL server sử dụng Docker
  Oracle to Postgres, sự trỗi dậy của bầy voi!

Sau khi chuyển đổi từ PostgreSQL sang InfluxDB thì những ngày đầu, kết quả rất phấn khởi: Do chuyên về time-series, với cách lưu trữ phù hợp, nên việc truy xuất dữ liệu gần đây hay dữ liệu cũ đều nhanh như nhau, tôi có thể dẹp bỏ script tạo lại chỉ mục dành cho PostgreSQL trước đó. Ngoài ra InfluxDB có chức năng tự tóm tắt dữ liệu cũ nên tiết kiệm được không gian lưu trữ.

Có điều niềm vui với InfluxDB chẳng kéo dài được lâu. Khi hệ thống hoạt động một thời gian, dữ liệu tích lũy đủ nhiều và InfluxDB càng cập nhật lên phiên bản mới thì nó càng bộc lộ vấn đề: ngốn quá nhiều RAM, chạy quá nặng. Để có thể duy trì hệ thống, tôi đã làm mọi cách để tối ưu bên phần của mình: sửa lại code, cắt bỏ nhiều lớp trừu tượng (ODM/ORM), tiết giảm xuống tới mức chỉ dùng câu SQL thuần khi truy cập InfluxDB, cắt một phần chức năng export ra viết lại bằng Rust. Tuy nhiên, cố gắng bên phía mình thôi vẫn chưa đủ, InfluxDB vẫn ục ịch ì ra đấy như trêu ngươi. Theo tôi, InfluxDB có một số quyết định công nghệ khiến “chúng ta không thuộc về nhau”:

  • InfluxDB dường như hướng đến việc truy cập từ front-end, nên chọn HTTP 1 làm giao thức truyền tải. Giao thức HTTP không những là dạng text (InfluxDB không dùng HTTP/2) mà còn bắt buộc kèm theo một mớ header, khiến tăng overhead: không những nội dung truyền đi nặng thêm mà cả hai phía đều phải tốn thêm công parse các header HTTP nữa (ngoài ra, là một giao thức dạng text đồng nghĩa với việc thêm bước encode/decode base64 khi cần truyền dữ liệu nhị phân). Để ý là hệ CSDL phía backend như PostgreSQL dùng giao thức dạng binary cho tinh gọn. Hậu quả của việc dùng HTTP là như kết quả profile dưới đây, các phần code khác của tôi đã được tối ưu và chạy còn nhẹ hơn thư viện client để truy cập InfluxDB:profiling
  • Dùng ngôn ngữ Go. Nói câu này có lẽ sẽ gây tranh cãi nơi fan của Go. Nhưng thực tình, tôi đã bắt gặp tâm sự của tác giả InfluxDB đâu đó rằng, anh ta lỡ chọn Go vì khi bắt tay vào xây dựng, anh ta chưa biết đến Rust. Ngoài ra, việc chọn Go hình như cũng vì InfluxDB muốn tốc độ ra sản phẩm nhanh. Chỉ trong vài năm mà công ty đằng sau InfluxDB đã cho ra một bộ nhiều sản phẩm liên quan chứ không phải mỗi database, có thể thấy ưu tiên của họ không phải là hiệu năng cao, nên việc chọn Go là hợp lý với hướng đi đó.InfluxData products

Khi tìm kiếm phương án thay thế InfluxDB, tôi đã bắt gặp TimescaleDB. TimescaleDB ra đời sau InfluxDB nên lúc tôi biết về nó thì nó vẫn chưa đủ tính năng để tôi có thể đem về dùng. Tuy nhiên, tôi đã thấy ngay triển vọng về hiệu năng cao, vì:

  • TimescaleDB được viết dưới dạng extension của PostgreSQL, nên cũng viết bằng C.
  • Cũng vì là extension của PostgreSQL nên giao tiếp với nó bằng giao thức của PostgreSQL, không đụng phải overhead như HTTP của InfluxDB.
  • Khi dùng giao thức của PostgreSQL thì tôi có cơ hội dùng một thư viện tốc độ rất cao của Python là asyncpg (theo benchmark trong link thì nó còn ăn đứt cả Go).

TimescaleDB

Khi nhìn thấy tiềm năng đó thì tôi rất háo hức, và chờ đợi. Chờ đợi mãi khi PostgreSQL chuyển dần dần từ 9.6 lên 10, 11 thì mới thấy TimescaleDB có đủ tính năng tôi cần. Cũng phải mất hơn nửa năm để tôi sắp xếp công việc, thời gian để có thể bắt tay vào thực hiện một sự thay đổi lớn về cấu trúc công nghệ bên trong platform IoT của AgriConnect.

Ban đầu có một trở ngại suýt nữa khiến tôi phải đình chỉ công việc, đó là TimescaleDB không cung cấp gói *.deb cho BeagleBone Black. May thay tôi tìm được script đóng gói cho Ubuntu của họ trên PPA, đem về chỉnh chọt một hồi cũng ra được script đóng gói dành cho BeagleBone. Các gói *.deb dành cho BeagleBone đang được lưu trên kho của AgriConnect.

Khi tôi viết bài này, phần mềm của AgriConnect đã chạy với TimescaleDB được 3 tuần trên các server của khách hàng. Sau 3 tuần quan sát thì thấy sự khác biệt thật rõ rệt. Nếu như trước đây tôi phải dành riêng một server chỉ để chạy mỗi InfluxDB, giảm tải cho khác server khác thì nay server đó phải thất nghiệp ngồi không. Ngay cả khi lần này đã mang lớp ORM trở lại thì vẫn chạy nhẹ hơn cả khi dùng InfluxDB với lớp ORM/ODM bị lược bỏ.

Bài viết gốc được đăng tải tại quan.hoabinh.vn

Bạn có thể xem thêm:

Top Developers đừng bỏ lỡ Top việc làm IT trên TopDev nhé!

VIETNAM MOBILE DAY 2022 – We Connect, Sân Chơi Quen Thuộc Của Cộng Đồng Công Nghệ Việt Nam Đã Trở Lại

thumbnail vmd 2022

Theo Báo cáo di động mới nhất của Ericsson (Ericsson Mobility Report) phát hành tháng 11/2021 cho biết, năm 2027 sẽ là năm mà sự phát triển của 5G thực sự rõ ràng trên toàn cầu. Thuê bao 5G sẽ là “xu hướng chủ đạo ở mọi khu vực”, chiếm 49% tổng số thuê bao di động toàn cầu và đạt 4,4 tỷ thuê bao.  Đại dịch Covid-19 đã cho chúng ta thấy mọi thứ có thể thay đổi nhanh như thế nào và cơ sở hạ tầng kỹ thuật số quan trọng như thế nào đối với xã hội. 5G đang bước vào một giai đoạn mới, nơi không chỉ người tiêu dùng sẽ được hưởng lợi từ các ứng dụng mới mà cả các doanh nghiệp và ngành công nghiệp sẽ tận dụng các khả năng mới. 

Sự phát triển về công nghệ, được hỗ trợ bởi mạng 5G sẽ mở rộng hệ sinh thái di động sang các ngành công nghiệp mới. Nền kinh tế kỹ thuật số toàn cầu được dự báo sẽ đạt giá trị 13,1 nghìn tỷ đô la Mỹ vào năm 2035. Phần lớn sự tăng trưởng của nền kinh tế kỹ thuật số toàn cầu sẽ được thúc đẩy bởi kết nối 5G và sự phát triển tại thị trường công nghệ di động Việt Nam cũng sẽ không thể nằm ngoài xu hướng đó.

vmd 2022

Cùng với sự phát triển & phủ sóng của công nghệ 5G, chiến lược đầu tư và tập trung phát triển, vận hành xoay quanh các thiết bị di động ngày càng trở thành trọng điểm tăng trưởng của các doanh nghiệp và toàn xã hội. Hơn thế nữa, những năm dịch Covid-19 & hậu đại dịch sẽ tiếp tục tạo ra nhiều ảnh hưởng và thay đổi đáng kể lên các hoạt động phát triển, kinh doanh & tiếp thị trên nền tảng di động.

ĐẶT VÉ NGAY!

Xu hướng Mobile-First

Thị trường ứng dụng dành cho thiết bị di động tại Việt Nam đã có từ lâu, nhưng chỉ thực sự nở rộ & nhận sự chú ý đầu tư trong 5 năm trở lại đây. Nếu trước đây thị trường Mobile Việt Nam bị “độc chiếm” bởi mảng Game thì hiện tại, dự kiến trong giai đoạn 2021-2025, các doanh nghiệp sẵn sàng tăng 653,91 tỷ USD để phát triển ứng dụng Mobile cho các mảng y tế, giáo dục, mua sắm, giải trí (theo PRNewswire).

Không nằm ngoài xu hướng thế giới Megatrend, Việt Nam đang thích nghi rất nhanh trong mảng ứng dụng di động:

  • Tổng doanh thu trên thị trường Ứng dụng di động dự kiến đạt 914,30 triệu đô la Mỹ vào năm 2022
  • Tổng doanh thu dự kiến sẽ có tốc độ tăng trưởng hàng năm (CAGR 2022-2026) là 9,47%, dẫn đến khối lượng thị trường dự kiến đạt 1.313,00 triệu đô la Mỹ vào năm 2026
  • Số lượt tải xuống trong Chợ ứng dụng dự kiến đạt hơn 3 tỷ lượt tải xuống vào năm 2022 và duy trì tốc độ tăng trưởng 21%

Phát triển ứng dụng trên di động đã trở thành một ưu tiên hàng đầu của rất nhiều doanh nghiệp trong trạng thái “bình thường mới” và trải rộng trên tất cả các lĩnh vực từ Y tế, Vận tải, Giáo dục, Giải trí… Nếu không đầu tư các giải pháp tối ưu hóa cho di động, các công ty chắc chắn có nguy cơ mất một lượng khách hàng đáng kể và tụt hậu so với đối thủ cạnh tranh.

Sự tăng trưởng của Mobile Commerce / Mobile Business

Theo báo cáo Digital Vietnam 2022 bởi WeAreSocial:

  • Hiện tại, Việt Nam có hơn 156 triệu thuê bao di động. 97.6% người dùng Internet 16 – 64 tuổi sở hữu Smartphone
  • Trong tổng trung bình 6 tiếng 38 phút sử dụng Internet, 3 tiếng 32 phút (hơn 50% thời gian) được thực hiện trên thiết bị di động
  • 12.4 tỷ đô la Mỹ được thực hiện thông qua mua bán trực tuyến và 50% lượng giao dịch đến từ thiết bị di động

Điện thoại thông minh, máy tính bảng và các thiết bị di động khác đang mở ra cơ hội kinh doanh mới. Vì khách hàng cần sự thuận tiện, tự do và nhiều sự lựa chọn, họ mong muốn có thể truy cập các dịch vụ thông qua thiết bị di động bằng trình duyệt Web sẵn có hoặc thậm chí sẵn sàng tải ứng dụng về máy. Tuy nhiên, không phải ứng dụng nào cũng hấp dẫn tất cả người dùng. Để đáp ứng nhu cầu của khách hàng và duy trì tính cạnh tranh trong điều kiện như vậy, chủ doanh nghiệp cần tập trung đầu tư nhiều hơn vào trải nghiệm và chuyển đổi nhóm đối tượng thường xuyên sử dụng sản phẩm của mình thông qua thiết bị di động, khi mà cuộc đua đã và tiếp tục diễn ra chỉ trong tầm mắt chứ không còn là câu chuyện xa vời trong tương lai.

Các điểm chạm quan trọng của Mobile Marketing

Sự xuất hiện của đại dịch Covid-19 xét theo khía cạnh tích cực là động lực khiến hoạt động Marketing trong lĩnh vực Mobile cũng ngày càng được quan tâm, đầu tư nhiều hơn với rất nhiều thách thức nhưng cũng không thiếu các cơ hội. 

Đứng trước sự thay đổi trên trong hành vi của người dùng do tác động của đại dịch, thương mại điện tử sẽ chuyển đổi tất yếu từ Digital sang Mobile, các công ty cũng buộc phải cải thiện hiệu suất & chi tiêu nhiều hơn cho Mobile App của họ. Bên cạnh đó, Marketer cần phối hợp nhiều hơn với đội ngũ kỹ thuật đảm bảo hiệu suất di động (Mobile Performance) và tạo ra nhiều trải nghiệm thiết bị chéo thuận tiện và liền mạch, tận dụng nhiều điểm chạm với người dùng để giao tiếp & giữ chân người dùng hiệu quả. 

kv vmd 2

Qua hơn 10 năm tổ chức, với sự góp mặt của Microsoft, Google, Facebook, Nielsen, Mastercard, Leveno, AppsFlyer, TikTok, VNPAY… đã tạo nên thành công vang dội cho “tên tuổi” Vietnam Mobile Day cũng như liên tục khẳng định mức độ uy tín của sân chơi này dành cho cộng đồng Công nghệ và Digital tại Việt Nam. 

Trở lại với lần thứ 12 này, VIETNAM MOBILE DAY 2022 với chủ đề “WE CONNECT” mô hình offline hội thảo kết hợp triển lãm được tổ chức bởi TopDev sẽ có hơn 80 chủ đề từ hơn 60 diễn giả đầu ngành liên quan đến các nhóm cốt lõi 5G, Mobile-first Technology, Mobile Business và Mobile Marketing cũng như các từ khóa nóng nhất hiện nay phải kể đến như GameFi, NFT, Blockchain, Metaverse… với mong muốn giúp cộng đồng nắm bắt những thông tin đáng giá và trang bị cho mình đầy đủ nhất để cạnh tranh hiệu quả trong thị trường Mobile hiện nay.

Sự kiện mang lại một sân chơi hấp dẫn, phong phú, dự kiến thu hút hơn 10.000 người tham dự; với 500 doanh nghiệp chắc chắn đây sẽ là một bữa tiệc thịnh soạn dành cho cộng đồng lập trình, doanh nghiệp và khởi nghiệp quan tâm đến lĩnh vực công nghệ.

THỜI GIAN & ĐỊA ĐIỂM DIỄN RA SỰ KIỆN

  • TP. Hồ Chí Minh: 03/06/2022 tại Melisa Center, 83 Thoại Ngọc Hầu, Hòa Thanh, Q. Tân Phú, Tp.HCM
  • TP. Hà Nội: 10/06/2022 tại CTM Palace, 131 Nguyễn Phong Sắc, Dịch Vọng Hậu, Cầu Giấy, Hà Nội

CÁC CHỦ ĐỀ DỰ KIẾN TẠI VIETNAM MOBILE DAY 2022

Về các hạng mục hợp tác tại sự kiện: 

Mr. Minh Phạm 

Mobile:  0933 331 604

Email: minh.pham@topdev.vn hoặc event@topdev.vn 

Renoleap DevOps Bootcamp – Khóa Học Miễn Phí Trong 13 Tuần Tại Việt Nam.

Renoleap DevOps Bootcamp – Khóa Học Miễn Phí Trong 13 Tuần Tại Việt Nam.

Renoleap DevOps Bootcamp, được xây dựng với sự hợp tác của Amazon Web Services (AWS), nhằm tìm kiếm và bồi dưỡng những tài năng DevOps mới và tạo ra cộng đồng kỹ thuật hàng đầu tại Việt Nam.

Renova Cloud – công ty dịch vụ đám mây hàng đầu trân trọng giới thiệu khóa học Renoleap DevOps Bootcamp. Chương trình là sự kết hợp giữa học tập thực hành cấp tốc nhằm tuyển chọn các ứng viên phù hợp và giúp họ đặt nền móng vững chắc cho sự nghiệp DevOps & Điện toán đám mây của mình.

Khóa học kéo dài 13 tuần này dành cho những ai muốn theo đuổi hoặc bắt đầu hành trình nghề nghiệp của mình với công nghệ đám mây. Renoleap tập trung hướng đến những người thực sự đam mê phát triển sự nghiệp trong DevOps, không ngoại trừ những sinh viên chưa tốt nghiệp và những người không có kiến ​​thức chuyên sâu về công nghệ.

Renoleap và AWS sẽ hợp tác chặt chẽ để đảm bảo các học viên của Trung tâm sẽ nhận được trải nghiệm học tập chất lượng tốt nhất. Chương trình đào tạo được xây dựng dựa trên sự kết hợp các tài liệu và nội dung tốt nhất từ AWS & The Cloud Native Computing Foundation Training and Certification. Cùng với trải nghiệm trên các mô hình thực tế của khách hàng Renoleap, và chương trình giảng dạy gồm nhiều chủ đề devops phong phú chắc chắn sẽ mang đến cho học viên kiến thức và trải nghiệm đa dạng.

Doron Shachar, doanh nhân người Israel & Người sáng lập Renoleap DevOps Bootcamp Doron Shachar, doanh nhân người Israel & Người sáng lập Renoleap DevOps Bootcamp chia sẻ: “Chúng tôi tự hào cho ra mắt Renoleap DevOps Bootcamp với mục đích tạo ra hàng trăm con đường phát triển nghề nghiệp DevOps thú vị cho các ứng viên có nền tảng kiến thức & học vấn đa dạng, không phụ thuộc đó có phải ngành CNTT hay không. Dựa trên kinh nghiệm nhiều năm về Cloud & DevOps của mình, chúng tôi xây dựng một chương trình đào tạo 13 tuần nhằm đảm bảo các học viên nhận được sự kết hợp hoàn hảo giữa giáo dục chính quy, thực tế kỹ thuật và nhu cầu của khách hàng để tạo ra một thế hệ kỹ thuật viên lập trình tài năng. ”

Kinh nghiệm ứng viên

Renoleap đang tìm kiếm những ứng viên chia sẻ chung các giá trị của chúng tôi, những người thể hiện được niềm đam mê và ham học hỏi về công nghệ cũng như giải quyết các vấn đề với mã code. Công ty đang mở rộng đội ngũ nhân tài của mình để tiếp cận những ứng viên tiềm năng nhưng chưa tìm được chỗ đứng của mình trong ngành.

Không ngoại trừ đó là những người có kỹ năng công nghệ cũ đang tìm cách chuyển sang đám mây, những người trở lại làm việc sau thời gian nghỉ việc, những người đam mê công nghệ hiện không làm việc trong ngành CNTT và những sinh viên tốt nghiệp ngành kỹ thuật đang tìm kiếm một bước tiến triển nghề nghiệp vượt bậc.

Các ứng viên sẽ có được tham gia vào một nhóm hỗ trợ tại Renoleap, gồm các nhà tuyển dụng, chuyên gia kỹ thuật và cố vấn luôn sẵn sàng giúp họ tiến bộ và giúp họ tiếp cận gần hơn với các nhu cầu của khách hàng trong công ty. Renoleap DevOps Bootcamp sẽ tuyển dụng các ứng viên tham gia hơn 100 vai trò kỹ thuật mà Renoleap đang triển khai trên các dự án với khách hàng.

Renoleap DevOps Bootcamp hiện đang chiêu sinh cho khóa học sắp tới sẽ bắt đầu vào ngày 30 tháng 5! Hiện đã mở đơn đăng kí tại Việt Nam! 

Để tìm hiểu thêm và chương trình, bạn có thể điền vào mẫu đăng ký tại đây hoặc gửi email cho chúng tôi tới bootcamp@renoleap.io

Tìm hiểu thêm về chúng tôi: https://renoleap.io/

Đăng ký ngay hôm nay!

Top Developers đừng bỏ lỡ việc làm IT hấp dẫn trên TopDev nhé!

Giới thiệu nền tảng máy học ML.NET của Microsoft

Giới thiệu nền tảng máy học ML.NET của Microsoft

Bài viết được sự cho phép của tác giả Trần Duy Thanh

ML.NET là gì?

ML.NET là thư viện máy học Mã nguồn mở và chạy cross-platform (Windows, Linux, macOS) của Microsoft. Ta có thể lập trình được thư viện này trên các nền tảng như Desktop, Web, hay build các Service. Nó được đánh giá là mạnh mẽ có thể làm được những gì một số thư viện khác làm được (chẳng hạn như scikit-learn viết bằng Python) và làm được những thứ mà thư viện khác không làm được.

Với việc sở hữu các nền tảng công nghệ mạnh mẽ nhất, khách hàng sẵn có trải rộng khắp thế giới nên ML.NET được kỳ vọng rất lớn sẽ tạo ra được cơn sốt về công nghệ liên quan tới máy học viết bằng C#/F# và tạo ra thị trường lao động ở phân khúc này là rất khả thi.

Theo thông tin từ hãng thì ML.NET bắt đầu khởi động từ 05/2018 và hiện nay bản chạy ổn định là 1.7.0 (tính tới 02/2022), và Microsoft cùng cộng đồng đang tiếp tục bổ sung tính năng cũng như cải tiến hiệu suất của các giải thuật.

Linh hồn của ML.NET là một mô hình học máy (machine learning model). Mô hình này chỉ định các bước cần thiết để chuyển đổi dữ liệu đầu vào của ta thành các kết quả dự đoán của mô hình, nó tùy vào giải thuật mà chúng ta lựa chọn. Với ML.NET, Ta có thể tùy chỉnh mô hình bằng cách lựa chọn các thuật toán machine learning của ML.NET (dĩ nhiên nó phải lệ thuộc vào bài toán ta muốn làm là gì để chọn giải thuật cho phù hợp) hoặc ta cũng có thể import các mô hình của TensorFlow hay ONNX đã được đào tạo trước để sử dụng. Ngoài ra ML.NET cũng cung cấp hàm cho ta lưu mô hình để tái sử dụng cũng như chia sẻ model cho cộng đồng.

Xem ngay tin tuyển dụng lập trình viên .NET tại các doanh nghiệp hàng đầu trên TopDev

Về cơ bản thì 1 bài toán Machine learning nó sẽ hoạt động như hình dưới đây (hình nguồn Microsoft):

ví dụ bài toán Machine learning

Đại khái tui tóm tắt các bước trong 1 bài toán Machine learning như sau (dĩ nhiên tùy vào kỹ thuật, kinh nghiệm của mỗi người mà ta tiến hành các bước cho riêng mình, ở đây Tui nói tổng quan):

  • Bước 1: Chuẩn bị dữ liệu, bước này cần chuẩn hóa dữ liệu do thường ban đầu các dữ liệu nó bị “ô nhiễm” tức là nó chứa các dữ liệu không đúng, dữ liệu chứa rác không đáp ứng được nhu cầu. Ví dụ như nếu dữ liệu text thì có các ký tự viết tắt, ký tự lạ, biểu tượng… Dữ liệu hình thì có các hình mờ không thể nhận dạng, dữ liệu Video thì có Video bị lỗi.
  • Bước 2: Rút trích đặt trưng, cứ hiểu là bước vector hóa dữ liệu, các dữ liệu thường được mã hóa về các ma trận dạng số, bước này giờ đã dễ dàng hơn, ta chỉ cần nạp cấu trúc đối tượng và truyền các mảng thuộc tính tương ứng, ML.NET sẽ làm giúp ta điều này. Ở bước này đôi khi sẽ được làm đồng thời với việc chia dữ liệu ra làm 2 phần: Train set và Test set. Và nó tùy thuộc vào tỉ lệ lấy dữ liệu thì mô hình chạy có thể cho ra chất lượng khác nhau. Các bạn tưởng tượng có 100 đề thi thì 100 đề này là dữ liệu, nếu lấy 80 đề thi ra để luyện tập (nó gọi là Train Set), sau khi luyện tập xong ta lấy 20 đề kia ra để làm xem được hay không (20 đề đó gọi là Test set). Trong máy học có thêm khái niệm về Over-fit, nếu bạn lấy 100 đề đó ra luyện tập, sau đó lại lấy 1 đề trong 100 đề đó ra để làm bài test, thì lúc này đa phần bạn làm điểm cao nhưng mà điểm cao trong tự sướng (Over fit vì bạn tưởng nhầm là mình đã được train giỏi, nhưng là do bạn đã làm trước đó rồi, dẫn tới khi đi thi thực tế ra 1 đề lạ hoắc có thể bạn sẽ bị rớt.
  • Bước 3: Tiến hành Build/Train mô hình: Tùy vào bài toán phân lớp, gom cụm… thì ta sẽ dùng các giải thuật khác nhau để build mô hình. Ví dụ như có 1 dữ liệu Comment của khách hàng, hỏi xem comment này là tích cực hay tiêu cực thì nó thuộc bài toán phân lớp, như vậy ta sẽ dùng các giải thuật phân lớp. Hay nếu có một tập dữ liệu các căn nhà và giá của nó, giờ muốn dự báo xem 1 căn nhà bất kỳ có giá bao nhiêu thì nó lại thuộc bài toán hồi quy. Bước 3 sẽ chọn đúng giải thuật để build mô hình cho đúng
  • Bước 4: Đánh giá mô hình, mọi mô hình được build xong cần được đánh giá nó xem chất lượng của nó tới đâu (không có mô hình đúng hay sai chỉ có mô hình chất lượng hay không), và chất lượng hay không nó lệ thuộc vào các thang đo, ví dụ như trong các bài hồi quy thì nó các thang đo R-Squared, MSE, RMSE, MAE, và hầu như các giải thật cũng có Loss Function. R-Squared càng cao (tịnh tiến tới 100%) thì mô hình càng tốt, (dĩ nhiên với các bài về chứng khoán thì chưa chắc do nó nhảy múa, thông thường R-Squared >=50% là ổn, nhưng không có nghĩa là <50% là tệ), còn MSE, RMSE, MAE, Loss function thì thấp sẽ càng tốt. Việc quyết định chọn mô hình nào là tùy thuộc vào kinh nghiệm của người build mô hình và có tham khảo các độ đo này. Và lưu ý là ứng với mỗi loại giải thuật máy học thì độ đo sử dụng sẽ khác nhau, Tui chỉ ví dụ về giải thuật hồi quy để các bạn hiểu sơ lược vậy
  • Bước 5: Sử dụng mô hình, ở bước này thường là sau khi bước 4 đánh giá xong, thì ta sẽ lưu mô hình xuống ổ cứng và có thể chia sẻ lên cloud, lưu lại để lần sau chỉ lấy ra sài thôi, không phải tốn công chạy lại (tiết kiệm thời gian và chi phí), khi khi lưu xong muốn sài thì load mô hình lên để sài. Còn sài như thế nào nó tùy thuộc vào bài toán của mình để gọi hàm Predict cho phù hợp.

ML.NET hỗ trợ các bài toán nào liên quan tới Máy Học?

  • Classification: Ví dụ các bài toán về phân loại cảm xúc khách hàng tích cực hay tiêu cực từ các feedback của họ
  • Clustering : Ví dụ các bài toán về gom cụm khách hàng, giả sử có N khách hàng ta cần phải gom thành k cụm, các cụm này chứa các đặc trưng khác nhau của khách hàng.
  • Regression/Predict continuous values: Ví dụ các bài toán về hồi quy như dự đoán giá nhà, giá taxi …. từ một tập dữ liệu giao dịch trong quá khứ, hãy dự đoán giá của nó là gì khi có một số dự kiện mới.
  • Anomaly Detection: Các bài toán về phát hiện bất thường, chẳng hạn như Phát hiện các giao dịch gian lận trong ngân hàng
  • Recommendations: Các bài toán về khuyến nghị, ví dụ như làm sao quảng cáo được sản phẩm tới đúng khách hàng có nhu cầu, làm sao khi vào tiki thì nó gợi ý được các cuốn sách mà người này quan tâm.
  • Time series/sequential data: các bài toán như dự báo thời tiết hay doanh số bán sản phẩm
  • Image classification: các bài toán về phân loại hình ảnh
  • Object detection: Các bài toán về Phát hiện đối tượng

Dưới đây là hình minh họa sự khác biệt giữa Image classification và Object detection (hình nguồn Microsoft)

hình minh họa sự khác biệt giữa Image classification và Object detection

Cơ chế hoạt động của ML.NET như thế nào?

Ở trên Tui đã nói các bước hoạt động chung của một phần mềm liên quan máy học rồi, còn với ML.NET, khi sử dụng các thư viện của Microsoft thì cơ chế hoạt động như thế nào? về cơ bản là nó đúng với các bước cơ bản chung, Tui có vẽ lại workflow mà Microsoft cung cấp (hình gốc Tui thấy mờ và không đẹp nên Tui đã vẽ lại cho rõ và đẹp hơn).

Cơ chế hoạt động của ML.NET

Ở hình trên như các bạn thấy thì sẽ có 7 bước hoàn chỉnh trong quá trình sử dụng thư viện máy học ML.NET của Microsoft. Tui tóm tắt lại như dưới đây (các coding chi tiết Tui sẽ trình bày ở các bài sắp tới):

  • Bước 1: là bước chuẩn bị dữ liệu, ở bước này tùy vào bài toán mà ta thu thập dữ liệu khác nhau, dữ liệu sau khi thu thập phải được làm sạch/ chuẩn hóa. Vì nguyên tắc vàng các bạn phải nhớ “garbage in garbage out”, dữ liệu có thể được lưu dạng text, csv, sql server…. ứng với mỗi loại file ML.NET sẽ cung cấp các thư viện phù hợp để ta có thể tải dữ liệu đồng thời tự động mô hình hóa dữ liệu này thành mô hình hướng đối tượng. ở bước 1 thường sẽ làm công đoạn tải dữ liệu xong thì ta làm luôn công đoạn chia dữ liệu ban đầu thành 2 phần: Train set để huấn luyện mô hình (dùng cho bước 3), Test set để đánh giá mô hình (dùng cho bước 4). các dữ liệu được lưu vào IDataView object
  • Bước 2: Tùy vào mục đích bài toán máy học mà ta dùng các giải thuật khác nhau, có thể dùng Binary classification, Multiclass classification, Regression…. (giải thuật nào là do mục đích nên khnog thể liệt kê hết, khi nào gặp thì tìm hiểu từng trường hợc cụ thể cho nó đỡ rắc rối). Bước này đại khái là chỉ định một quy trình hoạt động để trích xuất các đặc trưng và áp dụng thuật toán học máy cho phù hợp. Đối tượng tạo ra ở bước này là IEstimator
  • Bước 3: Tiến hành train mô hình bằng cách gọi phương thức Fit() của IEstimator. kết quả của phương thức Fit() sẽ trả về một mô hình có kiểu ITransformer. Dữ liệu train là lấy Train set ở bước 1.
  • Bước 4: Sau khi train mô hình xong thì chưa có sài ngay (thường là vậy), vì thường các bài toán máy học nó sẽ có kết quả dự đoán sai khác với thực tế, vấn đề là sự sai khác này có được chấp nhận hay không? có được tiếp tục sử dụng và tiếp tục cải tiến mô hình nữa hay không. Do đó khi train mô hình xong thì ta cần đánh giá mô hình này chất lượng ra sao. Ta sẽ lấy Test set ở bước 1 để đánh giá. Hàm đánh này tên là Evaluate() nó nằm trong các lớp giải thuật mà ta sử dụng để train mô hình, train mô hình dùng giải thuật nào thì khi đánh giá cũng dùng giải thuật đó. Ví dụ khi train mà ta dùng MulticlassClassification để train, thì khi đánh giá cũng dùng MulticlassClassification để đánh giá. Kết quả của hàmg Evaluate() sẽ trả về một object XYZMetrics. Với XYZ là giải thuật mà ta dùng để đánh giá, ví dụ dùng MulticlassClassification để đánh giá thì nó trả về MulticlassClassificationMetrics, dùng Regression để đánh giá thì nó lại trả về kết quả là RegressionMetrics… Nên sau khi gọi hàm đánh giá xong thì dựa vào các đối tượngkết quả trả về này mà ta quyết định xem có dùng mô hình này được hay không (trong máy học không có mô hình sai chỉ có mô hình phù hợp hay không). Ví dụ như mô hình đó dự đoán giá bán căn nhà là 1 tỉ, nhưng thực tế là 5 tỉ mới đúng giá, thì ráng mà chịu ai biểu không xem chất lượng mô hình có hợp lý hay không, với lại bán 1 tỉ cũng được mà chỉ là ít tiền thôi (nhưng là kỹ sư phần mềm cùng với am hiểu về cuộc sống thì chúng ta cũng điên điên có giới hạn thôi, nhường người khác điên với). Nếu bước 4 đánh giá mô hình mà không thấy nó ổn thì quay lại bước 1. 
  • Bước 5: Lưu mô hình, sau khi đã đánh giá mô hình chất lượng ở bước 4 rồi thì lưu lại để lần sau chỉ tải mô hình ra sài thôi, không phải chuẩn bị lại dữ liệu và train lại (vì các bước này rất tốt chi phí). File mô hình được lưu mặc định có đuôi .zip . ta gọi phương thức Save() để lưu
  • Bước 6: Load mô hình đã được lưu ở bước 5. Ví dụ hôm qua lưu xong tắt máy, hôm nay mở máy lên thì chỉ cần tải lại mô hình đã chạy thôi, hoặc nhiệm vụ của ta là build model và đánh giá mô model cho chất lượng, rồi gửi model tới team khác sử dụng, thì muốn gửi đi được phải lưu được mô hình xuống ổ cứng đã chứ. Ta gọi hàm Load() để tải mô hình. Sau khi tải nó sẽ mô hình hóa ngược lại đối tượng ITransformer
  • Bước 7: là gọi hàm CreatePredictionEngine().Predict() để sử dụng mô hình nhằm tìm ra kết quả dự báo của chương trình. Truyền đối tượng ITransformer ở bước 6 vào sài thôi.

Vậy bạn nắm quy trình 7 bước trước nha. sau khi lưu rồi thì lúc sử dụng ta chỉ cần làm 2 bước đó là bước 6 và bước 7. Rất tiện lợi.

Ví dụ code (hiển nhiên bạn xem để nắm cơ chế các bước Tui trình bày ở trên thôi, chứ giờ chưa cần hiểu code, Tui sẽ trình bày cách code chi tiết ở bài sau):

using System;
using System.Text;
using Microsoft.ML;
using Microsoft.ML.Data;
using static Microsoft.ML.DataOperationsCatalog;
 
class Program
{
    public class HouseData
    {
        public float Size { get; set; }
        public float Price { get; set; }
    }
 
    public class Prediction
    {
        [ColumnName("Score")]
        public float Price { get; set; }
    }
 
    static void Main(string[] args)
    {
        Console.OutputEncoding= Encoding.UTF8;   
        MLContext mlContext = new MLContext();
 
        //Bước 1. Chuẩn bị dữ liệu và chạy tạo train - test set data
        HouseData[] houseData = {
               new HouseData() { Size = 1.1F, Price = 1.2F },
               new HouseData() { Size = 1.9F, Price = 2.3F },
               new HouseData() { Size = 2.8F, Price = 3.0F },
               new HouseData() { Size = 3.4F, Price = 3.7F },
               new HouseData() { Size = 4.4F, Price = 7.7F },
               new HouseData() { Size = 3.2F, Price = 3.2F },
               new HouseData() { Size = 3.4F, Price = 3.8F },
               new HouseData() { Size = 5.6F, Price = 8.1F },
               new HouseData() { Size = 1.2F, Price = 1.4F },
               new HouseData() { Size = 4.0F, Price = 6.5F },
               new HouseData() { Size = 3.8F, Price = 5.9F }};
        //load dữ liệu vài IDataView
        IDataView alldata = mlContext.Data.LoadFromEnumerable(houseData);
        //tách dữ liệu thành 2 phần 20% cho test, 80% cho train
        TrainTestData splitDataView = mlContext.Data.TrainTestSplit(alldata, testFraction: 0.2);
         
        // 2. Chọn giải thuật, rút trích đặc trưng cho tập dữ liệu 
        var pipeline = mlContext.Transforms.Concatenate("Features", new[] { "Size" })
            .Append(mlContext.Regression.Trainers.Sdca(labelColumnName: "Price", maximumNumberOfIterations: 100));
 
        // 3. Tiến hành train mô hình, gọi phần Train Set
        var model = pipeline.Fit(splitDataView.TrainSet);
 
        //4. train mô hình xong thì phải đánh giá nó
        RegressionMetrics metrics = mlContext.Regression.Evaluate(splitDataView.TestSet, 
            labelColumnName: "Size", scoreColumnName: "Price");
        //thông số này càng nhỏ càng tốt
        Console.WriteLine("Root Mean Squared Error : " + metrics.RootMeanSquaredError);
        //thông số này càng tịnh tiến tới 100% càng tốt
        //trong kinh tế lượng họ cho rằng >=50% là ổn, nhưng không có nghĩa <50% là dở, nó có thể là số âm vô cùng
        //ví dụ như chứng khoán nó sẽ nhảy búa xua
        Console.WriteLine("RSquared: " + metrics.RSquared);
         
        //5.giả sử mô hình ngon rồi thì lưu mô hình lại
        mlContext.Model.Save(model, splitDataView.TrainSet.Schema, "housemodel.zip");
 
        //6. Load mô hình lên để sài
        //dĩ nhiên là bước 6,7 này nó nằm riêng chỗ khác, 1->5 lưu xong thì dẹp nó đi
        //khi dùng chỉ quan tâm bước 6, và 7 thôi. Nhưng vì Tui hướng dẫn để 1 lèo 1->7 cho bạn hiểu
        DataViewSchema modelSchema;
        // Load trained model
        var modelDaLuu = mlContext.Model.Load("housemodel.zip", out modelSchema);
 
        //7. Gọi predict để dùng mô hình xem dự báo
        var input = new HouseData() { Size = 2.5F };
        var output = mlContext.Model.CreatePredictionEngine<HouseData, Prediction>(modelDaLuu).Predict(input);
 
        Console.WriteLine("Nhà diện tích "+ input.Size +" được dự đoán có giá ="+ output.Price);        
    }
}
Kết quả chạy ta được:
Root Mean Squared Eror : 0.2828426113221826
RSquared: -6.999914170176103
Nhà diện tích 2.5 được dự đoán có giá =3.3892932

Kiến trúc lớp của ML.NET gồm những gì?

Để sử dụng ML.NET ta sẽ bắt đầu với đối tượng MLContext. Đối tượng này chứa các hàm/đối tượng để tải, lưu dữ liệu, chuyển đổi dữ liệu , trình huấn luyện và các thành phần vận hành mô hình. Mỗi đối tượng sẽ có các phương thức để tạo các loại thành phần khác nhau như:

Chức năng Lớp sử dụng
Data loading and saving DataOperationsCatalog
Data preparation TransformsCatalog
Binary classification BinaryClassificationCatalog
Multiclass classification MulticlassClassificationCatalog
Anomaly detection AnomalyDetectionCatalog
Clustering ClusteringCatalog
Forecasting ForecastingCatalog
Ranking RankingCatalog
Regression RegressionCatalog
Recommendation RecommendationCatalog
TimeSeries TimeSeriesCatalog
Model usage ModelOperationsCatalog

Như vậy Ta lưu ý ứng với loại chức năng khác nhau thì ta dùng các lớp cho phù hợp, dĩ nhiên cũng không quan trọng lắm chỗ này, đừng ráng nhớ nhiều làm gì mệt óc, khi nào gặp tường hợp nào thì ta cắm đầu vào trường hợp đó mà tìm hiểu thôi. Tui do đi dạy cùng với đi làm nên phải ráng biết càng nhiều càng tốt.

Có những cách nào để lập trình được với ML.NET?

Hiện ta có khoảng 3 cách để lập trình với ML.NET, chúng gồm (hình nguồn Microsoft):

Như vậy ta có thể dùng ML.NET API (code)ML.NET Model Builder (dùng Visual Studio UI, xem bài), và ML.NET CLI (Cho cross platform)

Trong các bài hướng dẫn tới tui sẽ dùng chủ yếu cách số 1 ML.NET API (code)

Chúc các bạn thành công.

Bài viết gốc được đăng tải tại duythanhcse.wordpress.com

Có thể bạn quan tâm:

Ứng tuyển ngay nhiều việc làm IT hấp dẫn có trên TopDev

Tất Cả Những Gì Bạn Cần Biết Khi Làm User Avatar Trong React

Tất cả những gì bạn cần biết khi làm user avatar trong React

Bài viết được sự cho phép của tác giả Lưu Bình An

Tạo avatar mặc định

Trong trường hợp user chưa upload avatar, chúng ta sẽ hiển thị một avatar mặc định, sử dụng jdenticon nó sẽ cho chúng ta bộ hình sau:

import { ComponentProps, FC, useState } from 'react';

export const AutoAvatar: FC<
  ComponentProps<'img'> & { userId: number; size: number }
> = ({ userId, size, ...imgProps }) => {
  const [base64, setBase64] = useState(undefined as string | undefined);

  // dùng dynamic import để tối ưu
  import('jdenticon').then(({ toSvg }) => {
    const svgString = toSvg(userId, size);
    const base64 = Buffer.from(svgString).toString('base64');
    setBase64(base64);
  });

  return base64 ? (
    <div style={{ backgroundColor: 'rgb(225,225,225)', display: 'flex' }}>
      <img
        {...imgProps}
        src={`data:image/svg+xml;base64,${base64}`}
        alt={'User Avatar'}
      />
    </div>
  ) : (
    <div style={{ width: size, height: size, display: 'inline-block' }}>
      Loading...
    </div>
  );
};

Thư viện này khoản 45kb, để webpack dynamic load khi cần thiết cho tiết kiệm Giá trị base64 trả về chúng ta có thể gán cho src của thẻ <img />

Cho user upload avatar

Nếu chỉ dùng <input type="file" /> UI nó sẽ khá xấu, chúng ta dấu nó đi và thay bằng một <button /> để dễ chỉnh CSS hơn. Sử dụng ref để trigger sự kiện click trên input

import React, {createRef} from "react";

export const ImageSelect = () => {
  const fileRef = createRef<HTMLInputElement>();

  const onFileInputChange: React.ChangeEventHandler<HTMLInputElement> = (e) => {
    console.log(e.target?.files?.[0]);
  }

  return (
    <>
      <input
        type="file"
        style={{display: 'none'}}
        ref={fileRef}
        onChange={onFileInputChange}
        accept="image/png,image/jpeg,image/gif"
      />
      <button
        onClick={() => fileRef.current?.click()}
      >Cool Button
      </button>
    </>
  )
}

Top tin tuyển dụng React đang chờ các Developers ứng tuyển!

Crop ảnh

Trước khi gửi ảnh xuống backend để lưu lại, chúng ta sẽ cho phép user crop ảnh bằng cropper.js và react-cropper

import React, {createRef} from "react";
import {Cropper, ReactCropperElement} from "react-cropper";
import 'cropperjs/dist/cropper.css';

export const ImageCrop = () => {
  const cropperRef = createRef<ReactCropperElement>();

  return (
    <Cropper
      src="<the iamge src>"
      style={{height: 400, width: 400}}
      autoCropArea={1}
      aspectRatio={1}
      viewMode={3}
      guides={false}
      ref={cropperRef}
    />
  )
}

Một số thiết đặt

  • autoCropArea = 1 mặc định là chọn toàn bộ hình
  • aspectRatio = 1 tỉ lệ crop mong muốn, chọn 1:1, vuông
  • viewMode = 3 không cho phép chọn vào vùng nằm ngoài hình
  • guides = false không hiển thị mấy đường grid
import React, {createRef, useState} from "react";
import {Cropper, ReactCropperElement} from "react-cropper";
import 'cropperjs/dist/cropper.css';

export const ImageCrop = () => {
  const cropperRef = createRef<ReactCropperElement>();
  const [cropped, setCropped] = useState(null as string | null);

  const onSaveClick = () => {
    const imageElement: any = cropperRef?.current;
    const cropper: any = imageElement?.cropper;
    setCropped(cropper.getCroppedCanvas().toDataURL())
  }

  return (
    <>
      <Cropper
        src={"https://picsum.photos/500/300"}
        style={{height: 400, width: 400}}
        autoCropArea={1}
        aspectRatio={1}
        viewMode={3}
        guides={false}
        ref={cropperRef}
      />
      <button onClick={onSaveClick}>Crop</button>
      {cropped &&
        <img src={cropped} alt={"It's cropped"}/>
      }
    </>
  )
}

Để lấy image cho việc upload, sử dụng blob. Còn nếu chỉ cần hiển thị thì dùng dataUrl như ở trên

cropper.getCroppedCanvas().toBlob()

Toàn bộ source code

import React, {createRef, useState} from 'react';
import './App.css';
import {Cropper, ReactCropperElement} from "react-cropper";
import 'cropperjs/dist/cropper.css';
import './roundedCropper.css';

// chuyển file qua base64
const file2Base64 = (file: File): Promise<string> => {
  return new Promise<string>((resolve, reject) => {
    const reader = new FileReader();
    reader.readAsDataURL(file);
    reader.onload = () => resolve(reader.result?.toString() || '');
    reader.onerror = (error) => reject(error);
  });
};

const App = () => {
  // ref đến file input
  const fileRef = createRef<HTMLInputElement>();

  // hình được chọn
  const [uploaded, setUploaded] = useState(null as string | null);

  // kết quả của image sau khi crop
  const [cropped, setCropped] = useState(null as string | null);

  // ref đến crop element
  const cropperRef = createRef<ReactCropperElement>();

  const onFileInputChange: React.ChangeEventHandler<HTMLInputElement> = (e) => {
    const file = e.target?.files?.[0];
    if (file) {
      file2Base64(file).then((base64) => {
        setUploaded(base64);
      });
    }
  }

  const onCrop = () => {
    const imageElement: any = cropperRef?.current;
    const cropper: any = imageElement?.cropper;
    setCropped(cropper.getCroppedCanvas().toDataURL())
  }

  return (
    <>
      <div className="App">
        {
          uploaded ?
            <div>
              <Cropper
                src={uploaded}
                style={{height: 400, width: 400}}
                autoCropArea={1}
                aspectRatio={1}
                viewMode={3}
                guides={false}
                ref={cropperRef}
              />
              <button onClick={onCrop}>Crop</button>
              {cropped && <img src={cropped} alt="Cropped!"/>}
            </div>
            :
            <>
              <input
                type="file"
                style={{display: 'none'}}
                ref={fileRef}
                onChange={onFileInputChange}
                accept="image/png,image/jpeg,image/gif"
              />
              <button
                onClick={() => fileRef.current?.click()}
              >Upload something!
              </button>
            </>}
      </div>
    </>
  );
}

export default App;

Bài viết gốc được đăng tải tại vuilaptrinh.com

Bạn có thể xem thêm:

Đừng bỏ lỡ Top việc làm IT trên TopDev nhé

IT Manager Là Gì? Những Điều Bạn Cần Biết Về IT Manager

IT Manager Là Gì? Những Điều Bạn Cần Biết Về IT Manager

Có thể nói, IT hiện đang là một ngành nghề phát triển như vũ bão, thu hút rất nhiều bạn trẻ. Bên cạnh công việc là một lập trình viên, nhiều bạn còn định hướng đi lên các vị trí Senior IT, cụ thể đó là IT Manager. Vậy, IT Manager là gì? Công việc của họ có phải chỉ cần code? Hãy cùng tìm hiểu bài viết dưới đây.

IT Manager là gì?

IT Manager là người chịu trách nhiệm quản lý hệ thống và thông tin của toàn tổ chức, doanh nghiệp. Vai trò của họ liên quan đến việc duy trì sự ổn định và bảo mật các hoạt động công nghệ, theo dõi và quản lý hệ thống phần cứng/phần mềm của công ty. IT Manager thường là người quản lý bộ phận (phòng ban) IT của doanh nghiệp.

Sau đại dịch Covid-19, xu hướng làm việc từ xa ngày càng phổ biến, đặc biệt trong lĩnh vực công nghệ thông tin. Tuy nhiên, IT Manager thường sẽ làm việc tại công ty, một số ít có thể làm việc từ xa. Mặt khác, không giống như lập trình viên, một IT Manager thường tham gia vào những cuộc họp nhiều hơn là chỉ chuyên tâm code. Cụ thể như thế nào, ta cùng tìm hiểu về công việc của họ.

  Xu hướng tuyển dụng IT năm 2024 mà mọi HR Manager cũng như IT Manager cần biết!

IT Manager là gì

Những công việc của một IT Manager

Bạn đã hiểu IT Manager là gì. Hãy thử đoán công việc của họ để xem những điều mình nói sau đây có giống với hình dung của bạn không nhé!

IT Manager là những chuyên gia công nghệ thông tin, người thường xuyên lên kế hoạch, chỉ đạo và giám sát các hoạt động liên quan đến máy tính và hệ thống thông tin của công ty. Họ sẽ phải đảm bảo các hoạt động và dự án công nghệ của doanh nghiệp đang phát triển tốt. Điều này bao gồm nhiều nhiệm vụ khác nhau như:

  • Đánh giá nhu cầu của tổ chức, xem xét nguồn lực hiện tại và lên kế hoạch cải tiến sản phẩm, hệ thống của công ty nhằm nâng cao năng suất, mang lại hiệu quả.
  • Đề xuất đến ban lãnh đạo các phương án cải tiến và nâng cấp, làm rõ những lợi ích chính của các khoản đầu tư dựa trên công nghệ mới đối với doanh nghiệp.
  • Phát triển và giám sát chính sách CNTT, các biện pháp bảo mật và các thông lệ tốt nhất cho công ty.
  • Lên lịch và giám sát các dự án công nghệ như nâng cấp, di chuyển, cập nhật hệ thống hay ngừng hoạt động.

Bên cạnh những công việc mang tính kỹ thuật, IT Manager làm việc với con người khá nhiều. Bởi, họ là người quản lý bộ phận IT của phòng ban và là người chỉ đạo thực hiện các dự án công nghệ. Nhiệm vụ quản lý con người chẳng hạn như:

  • Phân bổ các dự án của công ty cho những nhóm lập trình viên dưới quyền của họ. Bên cạnh đó, người quản lý phải đảm bảo mọi người đang làm việc tốt và cùng nhau đạt được mục tiêu đặt ra.
  • Một công việc khác của IT Manager là đảm bảo nhân viên của công ty có thể làm việc hiệu quả và hoàn thành công việc. Tùy thuộc vào quy mô công ty mà họ sẽ chọn phần mềm hoặc phần cứng để cập nhật mọi thứ từ nhân viên.

Tham khảo việc làm IT manager lương cao trên TopDev

Kỹ năng của IT Manager

IT Manager có phải là vị trí cao nhất?

Trong những tổ chức nhỏ, IT Manager được xem là vị trí cao nhất trong bộ phận  công nghệ. Với những công ty có quy mô lớn hơn, IT Manager thường sẽ báo cáo cho CIO (chief information officer) hoặc IT Director. Do đó, từ vị trí IT Manager bạn có thể xem xét đi lên CIO hoặc IT Director, đây là những chức vụ cao nhất trong bộ phận công nghệ của tổ chức.

  Mẫu CV IT Manager hoàn hảo cho ứng viên ngành IT

Làm thế nào để trở thành một IT Manager?

Bạn có yêu thích làm việc với máy tính không? Bạn có thể làm việc tốt với mọi người không? Nếu câu trả lời là có thì bạn có thể cân nhắc theo đuổi con đường trở thành một IT Manager.

Có nhiều cách để trở thành một IT Manager, bạn có thể xuất phát với tư cách là một Developer, một nhà phân tích kinh doanh hay đơn giản là một người làm việc trong lĩnh vực công nghệ thông tin. Cơ bản, một IT Manager cần phải có bằng cử nhân cộng với kinh nghiệm quản lý một loạt hệ thống CNTT từ hệ thống mạng đến hệ thống phần mềm máy tính để bàn. Bên cạnh đó, bạn cần rèn luyện những kỹ năng như quản lý dự án, kỹ năng lập ngân sách và quản lý nhóm. 

  Program Manager là gì? Học gì để trở thành Program Manager

Hầu hết, trước khi bạn thực sự bước lên vị trí cao nhất bạn sẽ phải bước dần lên từ việc lãnh đạo một nhóm nhỏ hoặc đảm nhiệm một dự án quan trọng. Đảm nhiệm những nhiệm vụ quản lý nhỏ này sẽ giúp bạn quen với ý tưởng điều hành các dự án và hướng dẫn mọi người. Bạn có thể cải thiện kỹ năng quản lý của mình thông qua các chương trình đào tạo nội bộ và hoặc những khóa học bên ngoài.

Tùy thuộc vào quy mô công ty mà họ có thể yêu cầu bạn có những chiến lược và tầm nhìn công nghệ rộng hơn, khi đó bạn có thể xem xét đến bằng MBA. Đặc biệt, nếu bạn định hướng IT Manager là bước đệm cho vị trí CIO, thì MBA là một bằng cấp hữu ích.

Trên đây là định nghĩa IT Manager là gì và những thông tin liên quan đến công việc cũng như cách để trở thành một nhà quản lý công nghệ thông tin. Hi vọng sẽ giúp bạn hình dung được bức tranh tổng quát vị trí này và có thêm định hướng việc làm cho bản thân.

Bạn có thể tham khảo thêm:

Việc làm IT cho Top Developers có ở TopDev nè!

Hướng Dẫn Xây Dựng Trang Đăng Nhập Trong WordPress

Hướng Dẫn Xây Dựng Trang Đăng Nhập Trong WordPress

Bài viết được sự cho phép của tác giả Võ Quang Huy

Bạn cảm thấy giao diện đăng nhập mặc định của WordPress đã quá quen thuộc. Bạn muốn tạo một trang đăng nhập theo style của riêng mình? Bài viết hôm nay, mình sẽ hướng dẫn các bạn các xây dựng một trang đăng nhập trong WordPress.

Tạo trang đăng nhập WordPress

Đầu tiên, bạn phải tạo cho mình một trang đăng nhập. Việc tạo một trang mới trong WordPress chắc mọi người cũng đã biết rồi nhỉ.

Page mình tạo mới trong trường hợp này có tiêu đề là Đăng nhập, và có đường dẫn là domain/dang-nhap.

Tiếp theo, các bạn hãy tạo một file PHP mới có cú pháp page-{slug}.php vào theme đang sử dụng. Cụ thể ở trường hợp của mình là page-dang-nhap.php.

Ngoài ra, bạn còn có thể custom page bằng phương pháp tạo Page Template. Bạn có thể xem lại video hướng dẫn tạo custom page trong wordpress này nếu chưa nắm được nhé.

Hãy thêm đoạn code dưới này vào file PHP bạn mới vừa tạo nhé.