#248 - PostgreSQL Basics: Roles and Privileges
Cùng tìm hiểu về một số khái niệm cơ bản trong PostgreSQL.
📻News
(by steven.do87 & lpv)
Machine learning with Julia – How to Build and Deploy a Trained AI Model as a Web Service
Julia là một ngôn ngữ lập trình rất phù hợp với phân tích số học và ngành khoa học tính toán. Một số quan điểm cho rằng Julia tương lai sẽ là ngôn ngữ thay thế cho Python trong lĩnh vực máy học.
LinkedIn: 93% of organizations are concerned about employee retention
Báo cáo Workplace Learning của LinkedIn cho thấy 93% các tổ chức đều quan tâm đến việc giữ chân nhân viên, và các kỹ năng công nghệ và mềm được yêu cầu nhiều nhất, đồng thời nhấn mạnh tầm quan trọng của việc chủ động tập trung vào sự phát triển của nhân viên.
Tin tức mới nhất về Meta layoffs
Meta có thể tiếp tục sa thải hàng ngàn nhân viên.
Code Jam nói lời chia tay
Được tổ chức bởi Google, Code Jam là một kỳ thi không thể bỏ lỡ với bất kỳ ai yêu thích Competitive Programming. Sau gần 20 năm, đã tới lúc nói lời chia tay với cuộc thi này.
Go toolchain có nên thu thập dữ liệu của người dùng?
Gần đây đã có một tranh cãi xảy ra trong cộng đồng Go khi có một đề xuất tới từ một thành viên trong Go team về việc thu thập dữ liệu của người dùng để phục vụ mục đích phát triển Go. Điều đáng nói là tính năng này được bật một cách mặc định! Ngay lập tức điều này đã dấy lên nhiều tranh cãi về privacy tại Github discussion. Hiện tại cuộc thảo luận đã bị đóng!
📰Những bài viết hay
Microservices Integration Done Right Using Contract-Driven Development
(by steven.do87)
Đối với các hệ thống theo kiến trúc microservice, yếu tố tiên quyết là khả năng phát triển và triển khai các microservice một cách độc lập. Tuy nhiên, hầu như các team phát triển bắt buộc phải trải qua khâu kiểm thử tích hợp (integration testing) trước khi triển khai các service lên môi trường thực tế, nhằm xác định các vấn đề về khả năng tương thích giữa các service, điều mà unit testing và component / API testing không thể đáp ứng được. Do đó, quá trình kiểm thử tích hợp đã và đang là một vấn đề gây khó khăn cho việc phát triển và triển khai các hệ thống theo kiến trúc microservice.
Quá trình kiểm thử tích hợp là một cơ chế phản hồi muộn (late feedback) để tìm ra các vấn đề liên quan đến tính tương thích giữa các service. Do đó theo thời gian, chi phí khắc phục các sự cố liên quan đến tính tương thích sẽ tăng lên tùy vào thời điểm các vấn đề được phát hiện, và dẫn đến việc cả team cung cấp service lẫn team sử dụng service đều phải tốn thêm thời gian khắc phục các lỗi phát sinh liên quan đến việc tích hợp các service.
Việc triển khai các giải pháp đặc tả API (API specification) như OpenAI hay AsyncAPI là nỗ lực nhằm khắc phục các vấn đề trong giao tiếp giữa các team phát triển. Tuy nhiên chỉ với các giải pháp này vẫn chưa thể khắc phục vấn đề trọn vẹn.
Bài viết giới thiệu một hướng tiếp cận mới, theo đó một compiler có thể thực thi một phương thức đánh dấu (method signature) nhằm phản hồi sớm cho lập trình viên khi họ không tuân thủ theo các đặc tả API đã thống nhất.
Việc phát triển các microservice theo hướng tiếp cận Contract-Driven Development giúp đảm bảo việc tuân thủ các thông số kỹ thuật của các API dưới dạng hợp đồng (executable contract). Công cụ Specmatic có thể hỗ trợ xác định vấn đề trong việc tương thích, từ đó khắc phục được nhược điểm của quá trình kiểm thử tích hợp.
Mời các bạn tìm hiểu thêm về giải pháp do công cụ Specmatic cung cấp tại đường dẫn bên dưới.
How we deploy to production over 100 times a day
(by nhij)
Trong bài viết này, đội ngũ kỹ sư của Monzo đã chia sẻ cách họ tối ưu toàn diện từ văn hóa, công cụ cho tới kiến trúc hệ thống để có thể triển khai lên production hơn 100 lần/ngày một cách an toàn.
Qua đó làm cho quá trình bắt đầu từ khi lên ý tưởng cho đến khi lên production trở nên trơn tru nhất có thể mà không ảnh hưởng đến sự an toàn của hệ thống. Cách tiếp cận này mang lại những điều tốt nhất cho cả hai thế giới: ít xung đột hơn sẽ khuyến khích những thay đổi nhỏ hơn và những thay đổi nhỏ hơn sẽ ít rủi ro hơn. Mời các bạn cùng đọc.
PostgreSQL Basics: Roles and Privileges
(by lpv)
Bảo mật thông tin, cho dù trong cơ sở dữ liệu, ứng dụng hay hệ thống CNTT lớn hơn, đều dựa trên các nguyên tắc về xác thực (Authentication) và ủy quyền (Authorization), thường được gọi tương ứng là AuthN và AuthZ.
Tương tự như vậy, bảo mật trong PostgreSQL liên quan đến việc tạo các role cho phép truy cập vào tài nguyên máy chủ (AuthN) và sau đó cấp đặc quyền cho các đối tượng cơ sở dữ liệu một cách thích hợp (AuthZ). Hiểu cách mỗi thành phần này hoạt động cùng nhau là điều cần thiết để bạn có thể quản lý bảo mật hiệu quả trong một PostgreSQL cluster. Chi tiết mời các bạn đọc tại đây.
👨💻Góc lập trình
(by ndaadn and phucnh)
Đề ra tuần này: Minimum Height Trees
Đồ thị vô hướng là một cây nếu giữa hai nút chỉ có duy nhất một cạnh. Nói cách khác, tất cả những đồ thị liên thông không có chu trình đơn là một cây. Cho một đồ thị liên thông không chu trình với n nút, được đánh số từ 0 tới n - 1, và mảng các cạnh. Nếu ta chọn một nút bất kỳ làm gốc, ta sẽ thu được một cây với chiều cao h. Hãy tìm tất cả các nút sao cho cây mà nút đó tạo ra có chiều cao nhỏ nhất.
Ví dụ 1:
Input: n = 4, edges = [[1,0], [1,2], [1,3]]
Output: [1]
Giải thích:
- Cây với nút gốc là 1 có chiều cao là 2
- Cây với nút gốc là 0, 2, hoặc 3 đều có chiều cao là 3
Vì vậy nút gốc là 1 sẽ cho ta cây với chiều cao nhỏ nhất.
Ví dụ 2:
Input: n = 6, edges = [[3,0], [3,1], [3,2], [3,4], [5,4]]
Output: [3, 4]
Giải thích: cây với nút gốc là 3, hoặc 4 đều có chiều cao là 3, nhỏ nhất so với những cây có nút gốc là 0, 1, 2, 5.
Lời giải tuần trước: Longest Nice Substring
Dựa trên điều kiện về chuỗi đẹp, ta thấy, nếu một ký tự không xuất hiện ở dạng chữ hoa hoặc chữ thường, thì chuỗi đẹp dài nhất có thể nằm ở bên trái, hoặc bên phải ký tự đó.
Ví dụ, ta xét chuỗi "AabCde", thì chuỗi đẹp sẽ nằm ở bên trái ký tự 'b'.
Quan sát này cho ta hướng tiếp cận chia để trị như sau:
- Duyệt từng ký tự trong chuỗi
- Nếu ký tự xuất hiện ở cả dạng chữ hoa, hoặc chữ thường, ký tự có thể nằm trong chuỗi đẹp dài nhất
- Nếu ký tự KHÔNG xuất hiện ở dạng chữ hoa, hoặc chữ thường, ta tiến hành tìm chuỗi đẹp ở chuỗi con bên trái và bên phải của ký tự
Giải thuật được thực hiện như sau:
class Solution {
public String longestNiceSubstring(String s) {
if (s.length() < 2) {
return "";
}
Set<Character> set = new HashSet<>();
for (char c : s.toCharArray()) {
set.add(c);
}
for (int i = 0; i < s.length(); i++) {
char c = s.charAt(i);
if (set.contains(Character.toUpperCase(c)) && set.contains(Character.toLowerCase(c))) {
continue;
}
String s1 = longestNiceSubstring(s.substring(0, i));
String s2 = longestNiceSubstring(s.substring(i + 1));
return s1.length() >= s2.length() ? s1 : s2;
}
return s;
}
}
Do độ dài của chuỗi chỉ có tối đa 100 ký tự, nên ta coi hàm substring có độ phức tạp thời gian là O(1), như vậy độ phức tạp của thuật toán là O(n logn).
Quotes
Nothing can make our life, or the lives of other people, more beautiful than perpetual kindness.
Leo Tolstoy