#259 - Ten years of AI in review
Cùng ngược lại dòng thời gian và quan sát về quá trình phát triển của các ứng dụng AI trong suốt 10 năm vừa qua.
📻News
(by lpv)
Blackbird - search engine mới của Github
Blackbird là một search engine vừa mới được phát triển bởi Github. Bên cạnh việc cho phép tìm kiếm code một cách nhanh chóng (được cho là nhanh hơn gấp 2 so với công cụ cũ), Blackbird đồng thời cũng hỗ trợ nhiều tính năng hơn. Ngoài ra Blackbird được viết hoàn toàn bằng Rust.
When byte code bites: Who checks the contents of compiled Python files?
Nhóm nghiên cứu ReversingLabs đã xác định được một cuộc tấn công mới vào PyPI bằng cách sử dụng mã Python đã biên dịch để tránh bị phát hiện - đây có thể là cuộc tấn công đầu tiên lợi dụng việc thực thi trực tiếp file Python Byte Code. Trước đó, vào ngày 20/5, PyPI đã tạm ngưng việc đăng ký thành viên và dự án mới do sự gia tăng các gói phần mềm độc hại.
OpenAI Threatens Popular GitHub Project With Lawsuit Over API Use
Dự án GitHub có tên là GPT4free cho phép bạn truy cập miễn phí vào các mô hình GPT4 và GPT3.5 bằng cách chuyển các truy vấn đó qua các trang web như You.com , Quora và CoCalc và trả lại cho bạn câu trả lời. Tuy chỉ là một dự án mới nhưng đã nhanh chóng nhận được rất nhiều sự quan tâm.
Tuy nhiên theo Xtekky, OpenAI đã gửi một lá thư yêu cầu anh ta gỡ bỏ toàn bộ dự án trong vòng năm ngày nếu không sẽ phải đối mặt với một vụ kiện.
📰Những bài viết hay
Vectorized query engine for distributed database
(by vinhdp)
Các cơ sở dữ liệu quan hệ (CSDL) thường được implement theo Volcano model - từng data row sẽ được lần lượt xử lý - phù hợp với các OLTP query (hoặc tại thời điểm ngày xưa khi mà RAM và CPU còn nhỏ và khá đắt). Nhưng vì nhiều lý do, người sử dụng thường mong muốn thực thi cả những câu query thuộc dạng OLAP như join và aggregate khi xử lý transactional data, để làm được điều này, các CSDL thường tìm cách phân chia workload này trên nhiều CPU core để giảm số lượng data mà mỗi CPU cần xử lý, qua đó góp phần làm giảm response time của query. Nhưng với cách tiếp cận này vẫn chưa thể giải quyết triệt để vấn đề, khi có càng nhiều data đưa vào, càng nhiều CPU core cần thêm vào để xử lý.
Bên cạnh việc thêm nhiều CPU vào để xử lý, các CSDL hiện đại ngày nay còn đi theo một hướng tiếp cận khác là làm sao để cùng một CPU core nhưng có thể xử lý nhiều data cùng một lúc hơn, tận dụng được sức mạnh của SIMD instruction trong nhiều thế hệ CPU mới, đây gọi là Vectorized Engine đã được giới thiệu lần đầu vào năm 2005 bởi paper “MonetDB/X100: Hyper-Pipelining Query Execution”.
Vậy Vectorized Engine là gì? Tại sao nó lại nhanh? Mời các bạn tìm hiểu thông qua bài viết Implementing a Vectorized Engine in a Distributed Database của OceanBase nhé!
What Software Developers Can Do to Learn Effectively
(by quangle80)
Làm việc trong bất kỳ lĩnh vực nào, chúng ta phải luôn không ngừng học hỏi để cải thiện mình, dạo gần đây, cuộc cách mạng AI ngày càng trỗi dậy khiến cho các anh em kỹ sư phần mềm phải trăn trở về “chén cơm” của mình. Điều này vừa tạo ra những thách thức, vừa là những động lực khiến anh em phải suy nghĩ, tìm ra những chủ đề nào đáng dành thời gian để nghiên cứu, nâng cao bản thân mình.
Một loạt những câu hỏi được InfoQ đặt ra cho kỹ sư Tav Herzlich tại Hội nghị NDC Oslo 2023 (diễn ra từ 22-26/5 tại Oslo, Norway) như:
Làm thế nào để một kỹ sư phần mềm có thể xác định mức độ hiểu biết của mình về một chủ đề hoặc công nghệ?
Làm thế nào để tránh bị quá tải về khối lượng kiến thức công nghệ quá nhiều?
Cách quản lý, phân bổ thời gian để tiếp cận, học tập một công nghệ mới?
Mời bạn đọc cùng đi tìm chi tiết câu trả lời qua bài viết
Ten years of AI in review
(by steven.do87)
Một thập kỷ vừa qua là một chặng đường sôi động và đầy ly kỳ đối với lĩnh vực AI, những phát kiến giúp khai phá các tiềm năng của Deep Learning đã tạo ra nhiều cơ hội phát triển bùng nổ trên nhiều lĩnh vực, đơn cử một vài ví dụ điển hình như, xe tự hành, hệ thống thương mại điện tử,...
Bài viết của tác giả Thomas A Dorfer, hiện là DS tại Microsoft sẽ đưa mọi người ngược lại dòng thời gian cùng quan sát về quá trình phát triển của các ứng dụng AI trong suốt 10 năm vừa qua, theo đó là những cái tên đại diện nổi bật cho mỗi giai đoạn như AlexNet(2013) cho đến ứng dụng chat GTP (2022) vẫn đang gây sốt trong cộng đồng công nghệ thời gian gần đây. Với mong muốn cung cấp cho độc giả một góc nhìn toàn cảnh về những tiến bộ vượt bậc trong lĩnh vực AI từ quá khứ sơ khai cho đến khi trở nên quen thuộc và đi vào cuộc sống hàng ngày hiện tại.
Thông qua bài viết tác giả sẽ cho chúng ta cảm nhận được sự thay đổi sâu sắc của các ứng dụng AI đến cuộc sống hiện đại và cách thức chúng ta sẽ làm việc và tương tác với nhau trong tương lai cùng với những quan ngại về việc lạm dụng và lệ thuộc vào AI khi mà các ứng dụng AI càng ngày càng trở nên thông minh hơn và chúng ta cần thận trọng hơn với chúng.
👨💻Góc lập trình
(by ndaadn and phucnh)
Đề ra tuần này: Maximize Distance to Closest Person
Cho mảng seats biểu thị một dãy hàng ghế, mỗi phần tử trong mảng seats có 1 trong 2 giá trị như sau:
seats[i] = 1 nghĩa là đã có người ngồi tại ghế thứ i.
seats[i] = 0 nghĩa là ghế thứ i đang trống.
Lưu ý: vị trí của ghế bắt đầu từ 0
Và trên dãy hàng ghế, luôn luôn tồn tại ít nhất một ghế trống. Alex muốn chọn ghế sao cho khoảng cách tới người gần nhất là lớn nhất có thể. Hãy tìm khoảng cách lớn nhất đó.
Ví dụ:
Input: seats = [1,0,0,0,1,0,1]
Output: 2
Với ghế ở vị trí 2, khoảng cách từ Alex đến người gần nhất là 2.
Với các vị trí khác ngoài 2, khoảng cách từ Alex đến người gần nhất là 1.
Vì vậy, khoảng cách lớn nhất tới người gần Alex nhất là "2".
Lời giải tuần trước: Divide Intervals Into Minimum Number of Groups
Để bạn đọc dễ hình dung, ta có thể mô tả lại bài toán bằng việc sắp xếp phòng họp, trong đó mỗi cặp số tự nhiên [left, right] đại diện cho thời gian bắt đầu và kết thúc buổi họp. Ta sẽ đi tìm số phòng họp tối thiểu để tất cả các buổi họp có thể diễn ra.
Giả sử cuộc họp [1, 5] đang diễn ra, cuộc họp tiếp theo là [3, 6], ta nhận thấy rằng cần ít nhất 2 phòng họp bởi [1, 5] và [3, 6] trùng nhau ở khoảng [3, 5].
Giả sử cuộc họp [1, 5] và [3, 6] đang diễn ra, cuộc họp tiếp theo là [6, 8], ta cũng chỉ cần ít nhất 2 phòng họp, bởi tại mốc thời gian 6, cuộc họp [1, 5] đã kết thúc.
Ý tưởng ở đây là mỗi khi ta sắp xếp phòng cho cuộc họp tiếp theo, ta kiểm tra cuộc họp trước đó với thời gian kết thúc nhỏ nhất, ta gọi đây là minEndInterval.
Nếu minEndInterval nhỏ hơn thời gian bắt đầu của cuộc họp tiếp theo, ta tái sử dụng lại phòng họp trước đó. Nếu không, ta cần một phòng họp mới.
Ý tưởng trên được thực hiện với giải thuật như sau:
class Solution {
public int minGroups(int[][] intervals) {
// Sort the interval by start time
Arrays.sort(intervals, Comparator.comparingInt(interval -> interval[0]));
PriorityQueue<Integer> endTimes = new PriorityQueue<>();
for (int[] interval : intervals) {
// Remove the ended interval
if (!endTimes.isEmpty() && endTimes.peek() < interval[0]) {
endTimes.poll();
}
endTimes.offer(interval[1]);
}
return endTimes.size();
}
}
Độ phức tạp về thời gian của giải thuật là O(nlogn), với n là độ dài của chuỗi đầu vào.
Quotes
“The best code is no code at all.” - Jeff Atwood