Home Blog Page 64

Hỏi đáp về việc tăng lương tối thiểu vùng

Hỏi đáp về việc tăng lương tối thiểu vùng 2022

Bài viết được sự cho phép của hrvnacademy.com

Phó Thủ tướng Thường trực Phạm Bình Minh vừa ký Nghị định số 38/2022/NĐ-CP ngày 12/6/2022 quy định mức lương tối thiểu đối với người lao động làm việc theo hợp đồng lao động.

Hỏi đáp về việc tăng lương tối thiểu vùng 2022

Chào mừng các bạn đang đến với series Hỏi đáp Nghề Nhân sự cho người mới (newbie) hoàn toàn miễn phí. Tôi là Thành HR sẽ đồng hành cùng bạn trong khoá học này. Và chủ đề mà chúng ta cùng nhau tìm hiểu ngày hôm nay là Hỏi đáp về việc tăng lương tối thiểu vùng năm 2022.

Với những bạn đang học chuyên nghành Nhân sự, Quản trị nguồn nhân lực, hoặc các bạn đang mới tìm hiểu về công việc C&B có thể sẽ có những băn khoăn thế nào là mức lương tối thiểu vùng, cách áp dụng ra sao? Vậy thì bài học này sẽ giúp các bạn làm rõ thêm một số thông tin.

Thông tin tăng lương tối thiểu vùng từ 1/7/2022 đã chính thức chưa?

Phó Thủ tướng Thường trực Phạm Bình Minh vừa ký Nghị định số 38/2022/NĐ-CP ngày 12/6/2022 quy định mức lương tối thiểu đối với người lao động làm việc theo hợp đồng lao động.

Tức là tới thời điểm này, việc tăng lương tối thiểu vùng đã được thông qua và chính thức có hiệu lực từ ngày 1/7/2022.

Đối tượng áp dụng bao gồm những ai?

Mức lương tối thiểu vùng áp dụng đối với các đối tượng sau:

– Người lao động làm việc theo hợp đồng lao động theo quy định của Bộ luật Lao động;

– Người sử dụng lao động theo quy định của Bộ luật Lao động gồm: Doanh nghiệp theo quy định của Luật Doanh nghiệp; cơ quan, tổ chức, hợp tác xã, hộ gia đình, cá nhân có thuê mướn, sử dụng người lao động làm việc cho mình theo thỏa thuận.

– Các cơ quan, tổ chức, cá nhân khác có liên quan đến việc thực hiện mức lương tối thiểu quy định tại Nghị định này.

Mức tăng lương tối thiểu vùng từ 1/7/2022 là bao nhiêu?

Về mức lương tối thiểu tháng, Nghị định quy định các mức lương tối thiểu tháng theo 4 vùng:

– Vùng I tăng 260.000 đồng, từ 4.420.000 đồng/tháng lên 4.680.000 đồng/tháng.

– Vùng II tăng 240.000 đồng, từ 3.920.000 đồng/tháng lên 4.160.000 đồng/tháng.

– Vùng III tăng 210.000 đồng từ 3.430.000 đồng/tháng lên 3.640.000 đồng/tháng.

– Vùng IV tăng 180.000 đồng từ 3.070.000 đồng/tháng lên 3.250.000 đồng/tháng.

Vậy có thể thấy mức tăng nằm trong khoảng 180k đến 260k tuỳ theo vùng, khoảng 6%. Mức lương tối thiểu vùng gần nhất là vào tháng 1 năm 2020.

Mức tăng lương này chưa bao gồm +7% cho các đối tượng Người lao động đã qua đào tạo, mình sẽ làm rõ thêm vào một bài học khác.

Tính chính xác lương thực nhận với công cụ tính lương gross sang net của TopDev

Mức tăng lương tối thiểu vùng theo giờ là như thế nào?

Mức lương tối thiểu giờ là quy định mới dành cho nhóm lao động làm những công việc linh hoạt, bán thời gian…Ngoài lương tối thiểu vùng theo tháng, một điểm mới trong dự thảo này là lần đầu tiên đề xuất lương tối thiểu giờ theo 4 vùng:

– Vùng I là 22.500 đồng/giờ,

– Vùng II là 20.000 đồng/giờ

– Vùng III là 17.500 đồng/giờ

– Vùng IV  là 15.600 đồng/giờ.

Mức lương tối thiểu vùng theo giờ là một khái niệm mới, nên sẽ chờ thêm các nghị định hoặc thông tin hướng dẫn chi tiết, mình sẽ bổ sung thêm cho các bạn vào bài học sau này.

luong khoi diem

Về địa bàn phân vùng có thay đổi gì không?

Ngoài đề xuất thêm mức lương tối thiểu theo giờ, dự thảo còn đề xuất thay đổi địa bàn thuộc các vùng áp dụng mức lương tối thiểu vùng. (Thông tin chưa chính thức, sẽ update lại)

– Điều chỉnh từ vùng 2 lên vùng 1 đối với: Thành phố Hạ Long thuộc tỉnh Quảng Ninh, huyện Xuân Lộc thuộc tỉnh Đồng Nai.

– Điều chỉnh từ vùng 3 lên vùng 2 đối với: các thị xã Quảng Yên, Đông Triều thuộc tỉnh Quảng Ninh; thành phố Hoà Bình và huyện Lương Sơn thuộc tỉnh Hòa Bình; thành phố Vinh, thị xã Cửa Lò và các huyện Nghi Lộc, Hưng Nguyên thuộc tỉnh Nghệ An; thị xã Hòa Thành thuộc tỉnh Tây Ninh; thành phố Bạc Liêu thuộc tỉnh Bạc Liêu; thành phố Vĩnh Long, thị xã Bình Minh thuộc tỉnh Vĩnh Long.

– Điều chỉnh từ vùng 4 lên vùng 3 đối với: các huyện Vân Đồn, Hải Hà, Đầm Hà, Tiên Yên thuộc tỉnh Quảng Ninh; các huyện Quỳnh Lưu, Yên Thành, Diễn Châu, Đô Lương, Nam Đàn, Nghĩa Đàn và các thị xã Thái Hòa, Hoàng Mai thuộc tỉnh Nghệ An; huyện Hòa Bình thuộc tỉnh Bạc Liêu; huyện Mang Thít thuộc tỉnh Vĩnh Long.

=> Như vậy, những lao động ở các khu vực được điều chỉnh địa bàn phân vùng này sẽ được hưởng mức tăng lương cơ bản cao hơn vì vừa được tăng theo chính sách chung, vừa được tăng do thay đổi phân vùng.

  Tìm hiểu hệ thống lương 3P
  Tài liệu hay cho người làm đào tạo tại doanh nghiệp

Mức lương tối thiểu vùng là gì?

Mức lương tối thiểu là mức lương thấp nhất mà người sử dụng lao động phải trả cho người lao động làm công việc giản đơn nhất trong điều kiện lao động bình thường để đảm bảo nhu cầu sống tối thiểu của người lao động và gia đình họ.

Mức lương tối thiểu theo vùng được Chính phủ quy định dựa trên cơ sở khuyến nghị của Hội đồng tiền lương quốc gia. Mức lương tối thiểu theo vùng này được thay đổi hàng năm để phù hợp với nhu cầu sống tối thiểu của người lao động và gia đình họ.

Mức lương tối thiểu vùng theo tháng và theo giờ là như thế nào?

Nghị định cũng nêu rõ mức lương tối thiểu tháng: là mức lương thấp nhất làm cơ sở để thỏa thuận và trả lương đối với người lao động áp dụng hình thức trả lương theo tháng, bảo đảm mức lương theo công việc hoặc chức danh của người lao động làm việc đủ thời giờ làm việc bình thường trong tháng và hoàn thành định mức lao động hoặc công việc đã thỏa thuận không được thấp hơn mức lương tối thiểu tháng.

Mức lương tối thiểu giờ: là mức lương thấp nhất làm cơ sở để thỏa thuận và trả lương đối với người lao động áp dụng hình thức trả lương theo giờ, bảo đảm mức lương theo công việc hoặc chức danh của người lao động làm việc trong một giờ và hoàn thành định mức lao động hoặc công việc đã thỏa thuận không được thấp hơn mức lương tối thiểu giờ.

Đối với người lao động áp dụng hình thức trả lương theo tuần hoặc theo ngày hoặc theo sản phẩm hoặc lương khoán: thì mức lương của các hình thức trả lương này nếu quy đổi theo tháng hoặc theo giờ không được thấp hơn mức lương tối thiểu tháng hoặc mức lương tối thiểu giờ.

Nội dung bài học tiếp theo

Trong bài học tiếp theo, mình sẽ cùng nhau làm rõ sự khác nhau giữa lương tối thiểu vùng và mức lương cơ sở, lương cơ bản; Ai sẽ được tăng lương từ việc điều chỉnh lương tối thiểu vùng này, có phải tất cả mọi người đều được tăng lương; Công ty cần chuẩn bị gì cho việc thay đổi mức lương tối thiểu vùng này…Các bạn nhớ đón xem nhé!

Trên đây là một số nội dung chính liên quan đến Hỏi đáp về việc tăng lương tối thiểu vùng 2022. Mặc dù đã cố gắng kiểm tra kỹ nội dung cung cấp, tuy nhiên vẫn có thể có những sai sót nhỏ ngoài mong muốn, bạn có thể để lại phản hồi hoặc câu hỏi vào comment bên dưới để mình ghi nhận và giải đáp cho các bạn nhé! Trân trọng!

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

Bài viết liên quan:

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

Public Cloud không còn chỗ đứng và sẽ dần biến mất?

Thời gian gần đây điện toán đám mây phát triển và mở rộng không ngừng, đáng chú ý nhất phải kể đến sự trỗi dậy của Hybrid Cloud đã khiến Public Cloud rơi vào thế “bí” và không còn được “cưng chiều” như trước. Phải chăng, Public Cloud đang đối mặt với nguy cơ phải nhường chỗ đứng cho các dịch vụ mới? 

Có thể thấy rõ từ năm 2020, đặc biệt là trong giai đoạn COVID bùng phát khắp mọi nơi, trải dài từ Á sang  Âu, Phi, Mỹ và Châu Đại Dương, điện toán đám mây được dịp phát triển chưa từng thấy trong lịch sử. Các doanh nghiệp buộc phải thay đổi để thích nghi với đại dịch bằng cách đẩy mạnh chuyển đổi số. Tức là áp dụng các công nghệ mới như dữ liệu lớn (Big Data), Internet cho vạn vật (IoT), điện toán đám mây (Cloud)… nhằm giảm chi phí vận hành, tiếp cận được nhiều khách hàng hơn, tối ưu hóa năng suất làm việc, thay đổi quy trình làm việc, xây dựng văn hóa công ty…. Trong đó, điện toán đám mây (Cloud Computing) được các chuyên gia đánh giá là đóng vai trò rất quan trọng trong việc đối phó với COVID-19.

Public Cloud dần dần mất vị thế trên thị trường? 

Cloud Computing là việc cung cấp tài nguyên phù hợp với nhu cầu người dùng thông qua Internet. Nguồn tài nguyên này bao gồm rất nhiều thứ có liên quan đến điện toán và máy tính như máy chủ, lưu trữ, phần cứng, phần mềm…. nằm tại các máy chủ ảo (đám mây) trên mạng.

Theo mục đích quản lý, người ta chia Cloud Computing ra làm 4 mô hình: Public Cloud (đám mây công cộng), Private Cloud (đám mây riêng – đám mây doanh nghiệp), Hybrid Cloud (mô hình kết hợp giữa Public Cloud + Private Cloud) và Community Cloud (đám mây cộng đồng). Còn chia theo mục đích sử dụng, Cloud Computing gồm Distributed Cloud, Serverless Computing, Multi-Cloud, Edge Computing….. 

MoTaCloudComputing

Điều đáng nói là gần đây vị thế của Public Cloud dường như đang bị đe dọa. Trong năm 2021, có tới 87% doanh nghiệp đã áp dụng Hybrid Cloud – đứa con lai giữa Public Cloud và Private Cloud bởi khả năng mở rộng cao &  triển khai nhanh chóng, tính an toàn bảo mật và chi phí tương đối phù hợp. 

sự bùng nổ của hybrid cloud
Bên cạnh Hybrid Cloud, năm 2021 cũng chứng kiến sự phát triển vượt bậc của giải pháp phân tán đám mây: Distributed Cloud, Serverless Computing, Platform as a Service và Multi-Cloud nhờ tính linh hoạt, hiệu suất hoạt động cao & khả năng khôi phục tốt hơn. Theo đó có đến 93% tổ chức áp dụng chiến lược Multi-Cloud, Serverless Computing bắt đầu được doanh nghiệp biết đến và dự kiến loại hình này sẽ tăng khoảng 25% trong năm 2025. 

Ngoài ra thì Trí tuệ nhân tạo AI, Edge Computing được dự báo sẽ là xu hướng của tương lai khi Edge Computing là nền tảng của công nghệ Internet vạn vật (IoT) được ứng dụng trong các thành phần nhận dạng khuôn mặt, chấm công thông minh, chuông cửa từ xa, công tắc đèn thông minh, hệ thống kiểm soát nhiệt độ….

Một số xu hướng nêu trên đã chứng tỏ Public Cloud đang có nguy cơ bị đe dọa từ chính những người anh em của mình. 

Nhưng liệu Public Cloud có dễ dàng bị “lép vế”? 

Mặc dù Hybrid Cloud đang vươn lên làm lu mờ Public Cloud nhưng chúng ta có thể chắc chắn một điều rằng đám mây công cộng không dễ dàng để đám mây riêng qua mặt. Hơn nữa, dựa vào những ưu điểm vượt trội cùng số lượng người dùng ổn định, Public Cloud một lần nữa chứng tỏ vị thế hàng đầu trên thị trường điện toán đám mây: 

– Doanh thu: Năm 2019, thị trường Public Cloud toàn cầu đạt doanh thu 258 tỷ đô (năm 2018 chỉ đạt 154 tỷ đô); năm 2020 vươn lên 257,5 tỷ USD; năm 2021 tăng mạnh mẽ tới con số 304,9 tỷ USD. 

– Tính đến hết 2020, 31% doanh nghiệp phụ thuộc vào Public Cloud trong khi đó Hybrid Cloud chiếm vị trí thứ hai với 28%. 

public cloud

 – Và những ưu điểm nổi bật không thể thay thế của Public Cloud: 

  • Triển khai nhanh chóng: Có thể triển khai ngay chỉ trong vòng vài giờ đồng hồ. Tùy từng dịch vụ, có loại chưa đến vài phút. 
  • Không cần bảo trì: Nhà cung cấp sẽ vận hành và duy trì dịch vụ nên người dùng không phải can thiệp. 
  • Khả năng mở rộng lớn và linh hoạt: Khả năng mở rộng gần như không giới hạn, nhà cung cấp dịch vụ sẽ tư vấn giải pháp phù hợp với nhu cầu kinh doanh của khách hàng.
  • Chi phí sử dụng thấp: Sử dụng Public Cloud giúp doanh nghiệp tối ưu chi phí đầu tư cho công nghệ thông tin. Điều này có nghĩa là doanh nghiệp không mất nhiều tiền để chi cho những thiết bị phần cứng, máy chủ được ảo hóa….. 

Ngoài ra nếu doanh nghiệp có thể tùy chọn các thông số hay cấu hình cần thiết và chỉ trả phí khi cho phần đã sử dụng. 

Qua đây chúng ta có thể thấy rõ một điều: So với Hybrid Cloud, Private Cloud, Community Cloud hay các giải pháp đám mây khác đang nỗ lực vươn lên thị trường thì Public Cloud cũng không dễ dàng bị “lép vế”. Trong quá khứ, hiện tại, tương lai, đám mây công cộng vẫn luôn TỒN TẠI và là lựa chọn tối ưu dành cho mọi loại hình doanh nghiệp và khách hàng cá nhân.  

KDATA – Nhà cung cấp Public Cloud hàng đầu tại Việt Nam 

Gắn bó với lĩnh vực điện toán đám mây công cộng Public Cloud đã hơn 10 năm có lẻ, KDATA hiện đang là một trong số các nhà cung cấp Hosting, Cloud Server, cho thuê máy chủ, chỗ đặt máy chủ, CDN, Object Storage… uy tín và chất lượng nhất tại thị trường Việt Nam. 

KDATA hiện đang sở hữu 3+ trung tâm dữ liệu, 600+ máy chủ, hỗ trợ 500+ khách hàng hoạt động liên tục nhằm mang tới chất lượng các dịch vụ với cấu hình mạnh mẽ, ổn định, an toàn, bảo mật, tiện lợi, dễ sử dụng…. 

Dịch vụ Cloud Server

cloud server

Cho phép khách hàng khởi tạo theo nhu cầu hàng loạt các tài nguyên máy chủ ảo bao gồm bộ vi xử lý trung tâm (CPU), bộ nhớ tạm thời (RAM), dung lượng lưu trữ (Storage) và hệ thống mạng (Networks) mà không cần phải đầu tư thiết bị phần cứng tại trung tâm dữ liệu (Data Center) với đặc điểm: 

+ Tính linh hoạt cao: Hoạt động trên 2 cơ chế tính tiền theo giờ và tính tiền theo chu kỳ dài trên cùng một tài khoản.

+ Hạ tầng mạnh mẽ: Hệ thống được đặt tại Data Center đạt chuẩn Tier 3 Quốc tế của Viettel, VNPT. Dịch vụ sử dụng riêng hệ thống kết nối cáp ổn định, băng thông cao lên tới 100Gbps, đảm bảo cam kết chất lượng (SLA) 99,99% uptime.

Dịch vụ Hosting:

Cung cấp 5 dịch vụ chính là Linux Hosting, Windows Hosting, SEO Hosting, WordPress Hosting và Hosting giá rẻ với mức chi phí phù hợp với nhiều đối tượng khách hàng từ cá nhân đến doanh nghiệp. 

Dịch vụ Hosting

Dịch vụ cho thuê máy chủ:

Dịch vụ cho thuê máy chủ vật lý riêng (Dedicated Server) theo cấu hình yêu cầu với hệ thống máy chủ hiện đại từ Dell, IBM, Supermicro… được đặt tại các Datacenter lớn như VNPT, Viettel, FPT.

Dịch vụ cho thuê chỗ đặt máy chủ:

Dịch vụ cho thuê chỗ đặt máy chủ mang đến cho khách hàng không gian chỗ đặt máy chủ (Co-Location) lý tưởng, mà trong đó bạn được toàn quyền sử dụng và quản lý với các công cụ quản lý thông minh nhất.

Dịch vụ cho thuê chỗ đặt máy chủ

Ngoài ra công ty còn cung cấp thêm các dịch vụ như VPS, Cloud VPS, VPS giá rẻ, CDN, Domain, Object Storage, Email doanh nghiệp… với mức giá rất cạnh tranh, đảm bảo chất lượng tuyệt đối. 

Không những cam kết về chất lượng, giá cả mà KDATA còn đặc biệt quan tâm đến dịch vụ chăm sóc và hỗ trợ người dùng. Đội ngũ nhân viên kỹ thuật trẻ, am hiểu kiến thức chuyên môn sẵn sàng support, tư vấn cho khách hàng liên tục 24/7 kể cả ngày nghỉ lễ nhằm giúp khách hàng có những trải nghiệm dịch vụ Public Cloud tốt nhất cùng KDATA. 

Chương trình khuyến mại tháng 6 của KDATA

Chương trình khuyến mại tháng 6 của KDATA 

Hân hạnh đồng hành cùng sự kiện công nghệ di động lớn Việt Nam “Vietnam Mobile Day” với tư cách là Nhà tài trợ Bạc, KDATA hi vọng cộng đồng sẽ nắm bắt những thông tin, xu hướng mới và trang bị cho mình đầy đủ kiến thức để có thể nâng cao sức cạnh tranh trong thị trường mobile.

Xem thêm thông tin về công ty KDATA: tại đây

Tìm việc làm dành riêng cho IT mới nhất tại TopDev

Bí Kíp Pass Phỏng Vấn Coding Amazon, Apple, Facebook, Microsoft Mà Không Cần Leet Code Quá Nhiều

phong van coding

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

Hôm nay mình sẽ chia sẻ cho các bạn cách vượt qua vòng phỏng vấn của Amazon, Apple, Facebook và Microsoft mà không cần leet code quá nhiều. (không có nghĩa là không leetcode tí nào nha). Cách giải quyết vấn đề này các bạn cũng có thể áp dụng trong công việc của mình.

GIỚI THIỆU

Trong một lần đi phỏng vấn dạo, Mình pass phỏng vấn Amazon vào năm 2019 tại Singapore. Đầu năm, mình cũng đi phỏng vấn dạo tiếp, và cuối cùng mình đã pass 3 công ty cùng 1 lúc: Microsoft, Facebook và Apple, cho vị trí senior developer. Mình không chuẩn bị gì nhiều vì nghĩ chỉ đi phỏng vấn để tìm hiểu thị trường, nhưng sau khi có offer thì mình đã nghỉ Amazon.

CẤU TRÚC BUỔI PHỎNG VẤN

Amazon, Microsoft, Facebook, Apple đều có cấu trúc phỏng vấn khá giống nhau, tuy lịch trình sẽ khác nhau một xíu và mình sẽ chia sẻ một dịp khác. Nhưng hầu hết đều tập trung vào 3 khía cạnh: Coding (tương tự các bài trên leet-code), Design (Product Design, OOP), và phỏng vấn hành vi (behavioral interview). Trong phạm vi bài này, mình chỉ chia sẻ về bí kíp thế nào để vượt qua vòng phỏng vấn coding.

Để dễ hình dung, mình sẽ lấy một ví dụ sau đây:

Cho một chuỗi kí tự, hãy đảo ngược các từ trong chuỗi kí tự đó (các từ cách nhau đúng 1 khoảng trống và không có khoảng trống dư thừa).

Ví dụ: “the sky is blue” ==> “blue is sky the”

Có thể xử lí ngay trên chuỗi mà không cần thêm bộ nhớ hay không.

BƯỚC 1: XÁC ĐỊNH RÕ YÊU CẦU

Nếu mình chưa xác định rõ yêu cầu, hãy hỏi lại thật kỹ. Hỏi thêm về các yêu cầu của bài toán, giới hạn của input/output nếu chưa được nêu rõ trong đề. Nếu mình có bất cứ điều gì mà mình giả định (assume), hãy hỏi lại để chắc chắn. Thời gian trong buổi phỏng vấn rất quý báu và mình sẽ không muốn đi sai hướng.

Trong suốt quá trình phỏng vấn, mình cứ đặt câu hỏi khi nào mình không rõ.

Ví dụ trong bài này, nếu bạn chọn ngôn ngữ là Java, thì String là kiểu immutable (không sửa được), nên bạn có thể hỏi lại sử dụng dãy kí tự char[] để thay thế được hay không, v.v…

BƯỚC 2: NẾU BẠN CÓ NGAY 1 LỜI GIẢI (CHƯA TỐI ƯU), HÃY TRÌNH BÀY

Nếu mình có ngay một lời giải ở trong đầu (kiểu brute-force), thử-sai,… và mình biết là nó chưa phải là tối ưu nhất, hãy trình bày ngay dù cho lời giải này sẽ không được chấp nhận.

Ví dụ bài này, mình có thể nói ngay: “nếu có thể dùng thêm bộ nhớ, thì mình có thể cắt chuỗi thành từng từ, sau đó ghép lại”.

Việc nghĩ ra một giải pháp tạm thời cũng là một điểm lợi thế trong buổi phỏng vấn coding. Giám khảo sẽ biết được mình có khả năng làm được bài này, dù không tối ưu.

Sau đó mình sẽ nói, “để mình nghĩ về phương án tối ưu hơn”.

BƯỚC 3: THỬ NHIỀU Ý TƯỞNG KHÁC NHAU

Đừng nên im lặng trong bất cứ thời điểm nào của cuộc phỏng vấn, hãy nói to những suy nghĩ của mình cho người phỏng vấn biết. Giải thích quá trình suy nghĩ của mình, từng bước một.

Ví dụ, với bài này mình có thể nói:

* Đối với bài này mình có thể lưu các từ trong một mảng tạm rồi đổi vị trí từ trái sang phải….

* Bởi vì bài toán yêu cầu không dùng thêm bộ nhớ, mình có thể bắt đầu bằng việc đảo các ký tự từ trái sang phải…

Tuỳ thuộc vào từng câu hỏi mà mình sẽ có những ý tưởng ban đầu, ví dụ dạng toán, cấu trúc dữ liệu cần sử dụng, có xài quy hoạch động không, có phải là dạng bài đồ thị không…. hãy nói tất cả những suy nghĩ và phán đoán của mình cho người phỏng vấn.

Điều này rất quan trọng, vì khi mình nói ra, người phỏng vấn có thể gợi ý, ví dụ: em đã bắt đầu đi đúng hướng rồi đó, hoặc, nếu em làm cách đó thì sẽ không thoả mãn trường hợp này, v.v… Nếu mình không nói gì, thì tới lúc mình nghĩ ra 1 ý tưởng sai và sẽ chẳng có ai “nhắc bài” cho mình. Người phỏng vấn cũng muốn biết cách thức mình suy nghĩ và gỉai quyết vấn đề, bước này quan trọng không kém gì bước thứ 4.

BƯỚC 4: NGHĨ RA Ý TƯỞNG VÀ GIẢI THÍCH

Nếu đi đúng hướng ở bước 3, tới một lúc bạn sẽ nghĩ ra ý tưởng. Trước khi viết bất kỳ dòng lệnh nào, hãy giải thích cho người phỏng vấn.

explain code

“NẾU MÌNH KHÔNG THỂ GIẢI THÍCH ĐƯỢC Ý TƯỞNG CỦA MÌNH, THÌ Ý TƯỞNG ĐÓ KHÔNG PHẢI LÀ Ý TƯỞNG CỦA MÌNH”

Ví dụ: với bài này, mình sẽ giải qua 2 bước:

Bước 1: đảo toàn bộ các kí tự trong dãy, “The sky is blue” sẽ trở thành “eulb si yks ehT”.

Bước 2: đảo ký tự của các từ trong dãy, ví dụ từ “eulb” sẽ trở thành “blue”

Đừng quên những trường hợp đặc biệt, ví dụ có thể hỏi người phỏng vấn rằng mình có thể giả sử chuỗi input không null được không?

Đánh giá độ phức tạp và trình bày xem độ phức tạp này có đáp ứng được yêu cầu đề ra hay không? Ví dụ: O(n) thời gian, và O(1) space.

BƯỚC 5: CODE

Đầu tiên, hãy viết code ở high level trước, như bước trước mình đã giải thích:

class Solution {
 void reverseWords(char inputString[]) {
  reverseTheWholeString(inputString);
  reverseEveryWord(inputString);
 }
}

Đoạn code rất dễ hiểu, vì đây là những gì mình đã giải thích cho ban giám khảo (2 bước sẽ trở thành 2 hàm). Và mình cũng rất dễ test (nếu giả sử 2 hàm của mình đúng thì với dữ liệu mẫu có chạy đúng hay không???).

Tiếp theo,  cài đặt từng hàm 1, ví dụ để đảo các ký tự trong chuỗi, mình sẽ đảo các ký tự nửa bên trái cho các kí tự nửa bên phải tương ứng.

class Solution {
 void reverseTheWholeString(char inputString[]) {
  int length = inputString.length;
  for (int i = 0; i < length / 2; i++) {
   swapCharacters(inputString, i, length - i - 1);
  }
 }
}

Sau đó giải thích tiếp hàm swapCharacters, để đổi vị trí 2 kí tự thì mình sẽ gán kí tự thứ nhất vào một kí tự tạm, gán kí tự thứ 2 vào kí tự thứ nhất, và gán kí tự tạm vào kí tự thứ 2.

class Solution {
 // swap characters first and second in string s
 void swapCharacters(char string[], int first, int second) {
  char temp = string[first];
  string[first] = string[second];
  string[second] = temp;
 }
}

Tiếp tục cài đặt các hàm, vừa giải thích vừa gõ code cho đến khi hoàn thành. Tại một thời điểm nào đó, bạn sẽ nói là mình có thể xài chung code cho hàm reverseTheWholeString và hàm reverseWord, hãy viết chung lại thành 1 hàm gọi là reverseSubstring để xài chung.

Bài tập cho các bạn: Làm tiếp bài trên này.

BƯỚC 6. BÌNH TĨNH VÀ DEBUG

Trong buổi phỏng vấn,  chuyện gặp sai sót là hoàn toàn bình thường, mình còn bị những lỗi ngu ngốc như là nhầm j++ thành i++ nữa kia, hãy bình tĩnh giải quyết. Bởi vì mình đã chia chương trình thành những hàm nhỏ nên rất dễ dàng tìm ra lỗi ở hàm nào mà ra.

Hãy giải thích quá trình debug cho người phỏng vấn.

BƯỚC 7. CHÚC MỪNG HOẶC HẾT GIỜ

Nếu bạn có thể làm xong trước khi hết giờ, hãy ăn mừng!

Còn nếu không, hoặc bạn làm sai 1 chút xíu nào đó, cũng đừng lo lắng, bạn đã thể hiện rất tốt cách giải quyết vấn đề cho người phỏng vấn.

Hy vọng những chia sẻ của mình giúp cho các bạn thành công trong buổi phỏng vấn coding tiếp theo.

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

Xem thêm:

Đừng bỏ lỡ hàng loạt việc làm IT với đãi ngộ hấp dẫn có trên TopDev!

GIỚI THIỆU CÁC DIỄN GIẢ TẠI VIETNAM MOBILE DAY 2022 – WE CONNECT

dien gia tai vietam mobile day 2022

Sự kiện công nghệ lớn nhất Việt Nam – Vietnam Mobile Day 2022 – We Connect đã sẵn sàng mang đến cho bạn không gian công nghệ bùng nổ với sự góp mặt của 60+ Diễn giả chuyên gia trong lĩnh vực Công nghệ và Marketing & Business cùng loạt chủ đề hấp dẫn mà bạn chớ-nên-bỏ-qua!

Cùng khám phá những cái tên tiên phong xuất hiện tại sự kiện năm nay:

1. Anh Nguyễn Nhất Thanh | Senior Solutions Architect tại Amazon Web Services (AWS) 

Trở lại với Vietnam Mobile Day 2022, anh Nguyễn Nhất Thanh sẽ cùng chúng ta khám phá chủ đề: “[Web3] Building a NFT Marketplace DApp like OpenSea” với các kiến thức về NFT Marketplace, cách xây dựng FullStack Web3 Development trên Ethereum với Polygon, Solidity, The Graph,…

dien gia 1

Anh Nguyễn Nhất Thanh hiện là Senior Solutions Architect tại Amazon Web Service. Anh có hơn 20 năm kinh nghiệm về DevOps & Agile Digital Digital Transformation & Principal Software Engineering trên các thị trường Nhật Bản, Hoa Kỳ, Singapore, Thái Lan và Việt Nam. Anh am hiểu sâu sắc về công nghệ và có niềm đam mê mãnh liệt cùng tầm nhìn rộng đối với các công nghệ tiên tiến (IoT, AI & Chatbot, Blockchain, Cloud, Big Data).

2. Anh Tuấn Hà | President & Founder tại Vinalink Media – Vinalink Academy

Anh Tuấn Hà hiện đang đảm nhiệm chức vụ chủ tịch của: Vinalink Media, VMCC – cộng đồng Truyền thông tiếp thị Việt Nam, Thevuon D2 Giảng Võ, Bất động sản Viewest, Tổ chức giáo dục thiền Gosinga, Mentor Tourzy Media. Anh có kinh nghiệm nhiều năm về Tư vấn Chiến lược Marketing: Đào tạo Inhouse Marketing digital và Chuyển đổi số, Tư vấn giải pháp chuyển đổi số 4.0, Chiến lược Kinh doanh cho SME, Mentor về marketing cho các SME đổi lấy cổ phần,…

dien gia 2

Đến với sự kiện Vietnam Mobile Day 2022, anh sẽ có những chia sẻ về chủ đề “Inbound marketing for Mobile”, mang đến các khía cạnh giúp doanh nghiệp đưa ra chiến lược Marketing hiệu quả trên di động.

3. Chị Nguyễn Đặng Quỳnh Anh | COO tại SPAC3SHIP

Với hơn 20 năm kinh nghiệm trong lĩnh vực Adtech/Public Relations, đồng thời từng nắm giữ vai trò quan trọng tại Yeah1 Group, Viber, chị Nguyễn Đặng Quỳnh Anh – COO tại SPAC3SHIP sẽ mang đến sự kiện lần này lời giải đáp về ứng dụng Metaverse qua chủ đề “Xu hướng Marketing cho Brand bằng Metaverse” cùng những phân tích về ứng dụng trong tương lai của Metaverse.

dien gia 3

4. Anh Lại Tuấn Cường | CEO & Founder tại công ty Repu Digital

Anh Cường tốt nghiệp bằng Thạc sĩ Quản trị hệ thống thông tin MIS tại Đại học Shute Taiwan với nhiều năm kinh nghiệm tư vấn Chiến lược và triển khai các chiến dịch Digital Marketing, Martech Automation cho nhiều công ty và tập đoàn lớn tại Việt Nam. Hiện tại, anh đang đảm nhiệm vị trí CEO & Founder tại công ty Repu Digital. 

Ngoài ra, anh đã và đang giảng dạy về Digital Marketing, Martech, Automation và chuyển đổi số tại nhiều nơi: Học viện Sage, Trường đại học Quốc gia & đại học Nantes Pháp, Học viện Elite PR School,… 

dien gia 4

Anh Cường đồng thời là một trong những diễn giả quen thuộc của Vietnam Mobile Day các mùa trước. Trở lại với sự kiện năm nay, anh sẽ mang đến chủ đề: “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ụ” cùng “bí quyết” thúc đẩy sự phát triển của lĩnh vực bán hàng & dịch vụ, song hành với bước nhảy vọt của công nghệ Mobile.

5. Anh Lê Yên Thanh | Founder và CEO của Phenikaa MaaS

Là người được mệnh danh là chàng trai vàng với nhiều giải thưởng về Tin học trong nước và quốc tế, anh Lê Yên Thanh hiện là Founder của ứng dụng BusMap. Sau khi gọi vốn thành công 1.5 triệu USD từ tập đoàn Phenikaa cho sản phẩm ứng dụng này vào năm 2020, anh đã đổi tên thương hiệu thành Phenikaa MaaS – Startup cung cấp các giải pháp thông minh trong lĩnh vực giao thông.

dien gia 6

Trong 2 năm đóng vai trò là Founder và CEO của Phenikaa MaaS, anh Thanh đã có nhiều đóng góp và được tạp chí Forbes Việt Nam bình chọn vào danh sách Forbes Under 30.

Đến với ngày hội Vietnam Mobile Day 2022 với Topic: “AIoT: Understanding the Applications of a New-Gen Convergence”, anh Lê Yên Thanh sẽ cùng bạn khám phá về AIoT và những khả năng mà công nghệ này làm được trong giai đoạn sắp tới.

6. Anh Ông Xuân Hồng | Senior Data Scientist tại Hoa sen Việt Group

Anh Hồng tốt nghiệp thạc sĩ tại JAIST (Japan Advanced Institute of Science and technology) với nhiều năm kinh nghiệm trong lĩnh vực và sở hữu kiến thức sâu rộng về mảng Data cũng như các xu hướng công nghệ nổi trội hiện nay. Ở thời điểm hiện tại, anh đang giữ vai trò Senior Data Scientist tại Hoa sen Việt Group.

dien gia 6

Đồng hành cùng Vietnam Mobile Day năm thứ 12, anh Hồng sẽ mang đến cho chúng ta chủ đề “Data Products for Mobile Commerce in Real-time and Real-life” cùng những phân tích về hướng khắc phục “pain-point” của khách hàng khi Shopping Online bằng cách xây dựng Data products. 

Thời đại 4.0 với sự phát triển mạnh mẽ của công nghệ, đặc biệt là lĩnh vực thanh toán trực tuyến đã giúp cho quá trình mua – bán hàng hóa trở nên dễ dàng hơn bao giờ hết. Không nằm ngoài xu thế, các nhà bán hàng hiện nay đều mong muốn sở hữu giải pháp công nghệ tối ưu trong việc bán hàng, giúp đáp ứng nhu cầu nhanh chóng trong thanh toán của người mua.

7. Chị Nguyễn Thị Tịnh Tâm – Product Manager tại công ty Sapo Mobile

Gương mặt nữ Speaker đầu tiên được nhắc đến tại Vietnam Mobile Day 2022, chị Nguyễn Thị Tịnh Tâm | – Đại diện đến từ sẽ đồng hành cùng bạn tìm hiểu về chủ đề “Công nghệ thanh toán không dùng tiền mặt trong ứng dụng quản lý bán hàng”. Qua sự dẫn dắt từ chị, chúng ta sẽ có thêm những góc nhìn mới về xu thế thanh toán điện tử/ không tiền mặt trong thời đại mới hiện nay.

dien gia 7

Sở hữu hơn 5 năm kinh nghiệm trong đội ngũ phát triển sản phẩm Sapo ở vai trò là quản lý, lên chiến lược phát triển sản phẩm và quản lý đội ngũ phát triển (DEV, Tester, BA, UI/UX Design), chủ đề mà chị mang đến Vietnam Mobile Day 2022 hứa hẹn sẽ chứa đựng những thông tin hữu ích cho doanh nghiệp hoạt động trong lĩnh vực bán lẻ & E-Commerce.

8. Anh Phan Vũ Giáp | Founder & CEO tại Beehexa Corp

Anh Giáp sở hữu hơn 20 năm kinh nghiệm trong vai trò kỹ sư phần mềm, đã từng làm việc với nhiều phần mềm mã nguồn mở như Joomla, WordPress và Magento. Nhận thấy nhu cầu cao về việc kết nối các trang web thương mại điện tử với các ứng dụng bên thứ ba khác, anh đã thành công xây dựng một iPaaS (nền tảng tích hợp như một dịch vụ) cho phép kết nối tất cả các phần mềm để giúp các chủ doanh nghiệp tự động hóa quy trình kinh doanh của họ.

dien gia 8

Qua chủ đề: “Drive B2B Transformation with eCommerce and Integration Platform” anh Giáp sẽ mang đến ngày hội Vietnam Mobile Day năm nay những câu chuyện về số hóa thương mại B2B cùng những phân tích về Nền tảng tích hợp giúp doanh nghiệp nâng cao quy trình tự động hóa và tạo lợi thế cạnh tranh trên thị trường.

Và còn nhiều nội dung hấp dẫn khác đang chờ bạn tại ngày hội Vietnam Mobile Day 2022!

Đăng ký tham gia sự kiện tại đây: https://topdev.vn/vmd

Game Designer là gì? Mô tả công việc của nhà Thiết kế Game

Game Designer là gì? Mô tả công việc của nhà Thiết kế Game

Game Designer là gì hay Thiết kế game là gì đang là chủ đề được nhiều bạn trẻ quan tâm. Nhiều bạn thắc mắc “đam mê chơi game thì có thể trở thành một nhà thiết kế game được không?”. Cùng TopDev giải đáp bằng những thông tin dưới đây.

1. Game designer là gì?

Trước tiên, bạn nên hiểu Thiết kế game là gì (Game Design). Thiết kế game là việc thiết kế tất cả những yếu tố tạo nên một trò chơi như bối cảnh, level, cách chơi, nhân vật gì, thử thách ra sao, … 

Thiết kế game sẽ bao gồm hai mảng lớn nhất là Art (nghệ thuật) và Design (thiết kế). Hình dung đơn giản, phần Design đảm nhận nhiệm vụ tạo nên cốt lõi của câu chuyện (trò chơi) còn phần Art sẽ phác thảo thô những ý tưởng này trước khi nó chuyển sang giai đoạn hiện thực hóa bằng đồ họa 2D/3D. 

Vậy, Game Designer là gì?

Game Designer là người định hình trò chơi. Họ sáng tạo, đề xuất ý tưởng về đối tượng mục tiêu, cốt truyện, thể loại, nhân vật, ảnh hưởng của việc thắng và thua, giao diện người dùng, thiết kế cấp độ, thiết kế bản đồ, và ti tỉ thứ khác nữa. 

game designer la gi

Nhà thiết kế game có nhiệm vụ tạo ra bản mô tả trò chơi một cách dễ hiểu nhất ở cả góc độ nghệ thuật và kỹ thuật. Bản mô tả này được xem là “kim chỉ nam” cho toàn bộ quá trình xây dựng, phát triển và hoàn thiện một trò chơi điện tử. Do đó, vị trí Game Designer rất quan trọng và đòi hỏi chuyên môn cao.

Bởi sự thiếu hụt nhân tài nên nhiều doanh nghiệp sẵn sàng chi những mức lương cao để tuyển dụng Game Designer. Cụ thể, theo thống kê từ SalaryExpert, trung bình mỗi giờ một nhà thiết kế game kiếm được 207 nghìn đồng. 

Một fresher đáp ứng đủ nhu cầu cơ bản như biết lên ý tưởng, thiết kế chi tiết kịch bản theo từng cấp level… có thể bắt đầu với mức lương khoảng 27 triệu đồng/tháng. Đối với Senior có thể khoảng 44 triệu đồng/tháng, với các cấp bậc quản lý sẽ còn cao hơn nữa.

  Game Developer là gì? Lộ trình trở thành Game Developer

2. Mô tả công việc thiết kế game

Những công việc mà Game Designer đảm nhiệm có thể kể đến như:

  • Xác định yêu cầu đối với một trò chơi của khách hàng (nhà đầu tư) hoặc của chính nhà thiết kế game.
  • Nghiên cứu đối tượng mục tiêu, lên ý tưởng nội dung, concept cho trò chơi.
  • Phát triển cốt truyện, nhân vật, quy tắc, độ khó của trò chơi.
  • Phối hợp làm việc với các bộ phận phát triển Game, đồ họa Game để hoàn thiện một trò chơi.
  • Theo dõi game sau khi đã ra mắt và có người dùng, so sánh và đánh giá kết quả với mục tiêu ban đầu để tính toán cải tiến hoặc lược bỏ tính năng giúp thu hút và gắn kết người dùng hơn.

Chắc hẳn bạn đã hình dung được phần nào những công việc của một nhà thiết kế game. Để đáp ứng được những đầu việc này, một Game Designer cần những tố chất, kỹ năng gì? Ta cùng tìm hiểu nội dung bên dưới.

Ứng tuyển ngay các vị trí tuyển dụng lập trình Game lương cao trên TopDev

3. Những kỹ năng của một Game Designer

3.1. Sáng tạo, sáng tạo, sáng tạo

Điều quan trọng phải nói lại 3 lần. Để một trò chơi luôn tạo ra sự hứng thú, hấp dẫn và thách thức đối với người chơi thì nhà thiết kế game cần có khả năng sáng tạo tốt. Với thị trường game khó tính như hiện nay thì sáng tạo sẽ giúp Game Designer liên tục làm mới ý tưởng của mình để đáp ứng đủ nhu cầu của các game thủ.

3.2. Kỹ năng giao tiếp và thuyết trình

Làm thế nào để bạn có thể truyền tải ý tưởng trò chơi của mình để thuyết phục đồng đội, cấp trên hay các nhà đầu tư? Một kỹ năng giao tiếp và thuyết trình tốt sẽ giúp bạn làm tốt việc này.

3.3. Kỹ năng viết tài liệu kỹ thuật

Một tài liệu kỹ thuật được viết mạch lạc, rõ ràng sẽ giúp giải đáp những thắc mắc của mọi người. Điều này giúp quá trình phát triển game diễn ra thuận lợi và hiệu quả.

3.4. Làm việc nhóm

Không chỉ riêng Game Designer mà hầu hết các vị trí đều đòi hỏi bạn cần có kỹ năng làm việc nhóm. Vì sao? Đơn giản vì mỗi dự án, mỗi sản phẩm không thể được xây dựng chỉ với một cá nhân mà cần có sự phối hợp của nhiều bộ phận, nhiều thành viên với nhau. 

Game Designer teamwork tốt tức mỗi thành viên dễ dàng trao đổi ý tưởng và hỗ trợ lẫn nhau, từ đó đi đến một ý tưởng chung sáng tạo nhất.

  Lập trình game là gì? Lộ trình tự học lập trình game cho người chưa biết gì

4. Game Designer bắt đầu từ đâu?

4.1. Thiết kế game học ngành gì?

Tại thời điểm này, có thể ở Việt Nam chưa có trường đại học đào tạo chuyên môn ngành thiết kế game. Do đó, bạn có thể xem xét học những ngành gần với nghề này nhất và có thể tạo lợi thế cho bạn khi làm hoặc ít nhất là khi thực tập. Một số ngành liên quan đến Thiết kế game như:

học gì

Việc có sẵn kiến thức toàn diện và cái nhìn bao quát tạo điều kiện thuận lợi để bạn thăng tiến lên cấp quản lý hoặc mở công ty riêng.

4.2. Bắt đầu học từ đâu?

Bên cạnh chuyên tâm học tập những chuyên ngành nói trên bạn cần phải tự học hỏi, mày mò hoặc đi làm để có thêm các kiến thức về thiết kế game. Bạn có thể học miễn phí thông qua kênh youtube của các Game Designer, đọc thêm sách về thiết kế, đăng ký các khóa học online và cuối cùng là đi thực tập.

Dưới đây là một số kênh youtube, sách và khóa học mà mình tìm hiểu được, các bạn có thể tham khảo.

Kênh Youtube về Game Design

  • Michail Katkoff (deconstructoroffun.com)
  • Jesse Schell (The Art of Game Design: A Book of Lens)
  • Raph Koster (A Theory of Fun for Game Design)
  • Ernest Adams (Fundamentals of Game Design)
  Game blockchain là gì? Khám phá tiềm năng thị trường game blockchain

Sách thiết kế game

  • Cơ bản: The Art of Game Design, Fundamental of Game Design.
  • Nâng cao hơn: Game Mechanic (Advanced Game Design), Challenges for Game Design.
  • Tổng hợp các nguyên lý trong thiết kế nói chung: The Gamer’s Brain, 100 Things Every Designer Needs to Know about People.

Khóa học online

Cuối cùng, sau khi đã xác định Game Designer là gì, những công việc của nhà thiết kế game cũng như trang bị đủ lý thuyết bạn đã đủ tự tin để tìm kiếm cơ hội thực tập. Cố gắng thực hành càng sớm để học được những kinh nghiệm thực chiến nhé. Bạn có thể tham khảo những công ty game thường tuyển dụng thực tập sinh như: VNG, Amanotes, Gear Inc, Gameloft,…. Chúc bạn thành công!

Xem ngay những tin đăng tuyển dụng IT mới nhất trên TopDev

Lưu đọng dữ liệu Iconify để dùng offline

Lưu đọng dữ liệu Iconify để dùng offline

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

Là một nhà phát triển web, bạn có thể đã biết đến Iconify, một kho dữ liệu icon dành cho web cực kỳ phong phú, tổng hợp từ nhiều bộ khác nhau (FontAwesome, Material Design v.v…) để đưa về một cách sử dụng chung. Tôi cũng không ngoại lệ, cũng sử dụng Iconnify trong nhiều dự án, vì ngoài việc tích hợp dễ dàng vào dự án, Iconify còn cho phép trộn lẫn nhiều bộ, vì nhiều khi hình ảnh mà tôi cần không tồn tại trong bộ này mà chỉ có ở bộ kia (bạn có thể lo ngại việc trộn lẫn khiến phong cách hình ảnh không thống nhất, đành chịu, vì với người không có khả năng thiết kế thì phải chấp nhận thôi).

Để có được ưu điểm kể trên, Iconify không bắt bạn phải đóng gói hết nội dung icon của các bộ cần dùng, mà dùng cơ chế gọi API để lấy về nội dung của icon khi cần (và nội dung này cũng được lưu trữ tạm để khỏi gọi API lại nhiều lần).

icon api

Với phần lớn trường hợp thì cách làm này là ổn, nhưng một số trường hợp thì nó lại gây băn khoăn. Ví dụ với một sản phẩm IoT, khi mà website đó chạy trong mạng nội bộ, để có thể tự hành khi rớt Internet, hoặc được truy cập ở vùng sâu vùng xa nơi điều kiện Internet không tốt, khi việc gọi API lấy nội dung icon có thể thất bại và ảnh hưởng xấu đến giao diện website. Với những trường hợp như thế thì tôi phải tìm cách thu thập nội dung icon và đính kèm theo website, để không phải gọi API nữa.

Control

Sau đây là cách làm với Vue 3. Cách này không được chỉ dẫn trong tài liệu của Iconify nên tôi phải tự mò.

Nội dung icon dành cho việc sử dụng offline được Iconify phân phối trên NPM Registry, nên bạn có thể kèm nó dưới dạng dependency của ứng dụng JavaScript.

Ví dụ icon sauri:shield-user-linecó tên ri:shield-user-line, thuộc bộ Remix Icon thì bạn cần thêm gói @iconify-icons/ri vào danh sách dependency:

$ yarn add @iconify-icons/ri

Tiếp đến, trong code Vue, trong component nào mà bạn dùng đến icon này, thêm vào các dòng sau:

import { addIcon } from '@iconify/vue'
import iShieldUser from '@iconify-icons/ri/shield-user-line'

addIcon('ri:shield-user-line', iShieldUser)

Trên phần <template></template>, bạn vẫn sử dụng icon như khi không cần offline:

<Icon icon='ri:shield-user-line' />

Khi gọi addIcon(), bạn có thể truyền chuỗi bất kì vào tham số thứ nhất, để đặt tên khác cho icon, miễn sao khi sử dụng trong <template/> thì bạn phải truyền tên tương ứng vào <Icon icon='' />. Tôi thì vẫn dùng tên cũ, để thuận tiện cho việc tra tìm cũng như không gây đứt gãy nếu sau này muốn bỏ việc đính kèm offline.

Như vậy là xong, khi bạn build bằng Vite, nội dung của icon ri:shield-user-line sẽ được kèm vào source website và không bị phụ thuộc vào API nữa. Ngoài ra, nhờ được Iconify tổ chức sao cho hỗ trợ tree-shaking nên chỉ có nội dung của icon kia được kèm thêm, thay vì cả trăm icon của bộ Remix Icon. Điều bất ngờ là trong tài liệu của Iconify, trang Icon bundles for Iconify for Vue lại hướng dẫn cách làm khác và hơi khó thực hiện (có lẽ tài liệu cũ không được cập nhật).

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

Tham khảo thêm:

Đừng bỏ lỡ nhiều việc làm Developer, Designer, UI/UX,… trên Topev nhé!

[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é!