19 Mar 2025Programming

Giới thiệu

Một trong những khái niệm quan trọng nhất của lập trình JavaScript là Promise. Người ta thường dùng nó khi làm việc với các tác vụ cần có sự chờ đợi, chẳng hạn như gửi một request về máy chủ và phải chờ câu trả lời, hay một hàm tính toán mất rất nhiều thời gian. Khái niệm này tuy được sử dụng rộng rãi, nhất là trong lập trình Web, nhưng lại thường gây hiểu lầm và rất dễ sinh ra bug nếu bạn không nắm vững các chi tiết kỹ thuật. Trong bài viết này, chúng ta sẽ tìm hiểu kỹ hơn về Promise nói riêng và lập trình asynchronous nói chung nhé.

Promise là gì?

Promise trong tiếng Anh là lời hứa, giống như kiểu bạn đòi ai đó trả tiền cho bạn, nhưng người đó chưa có tiền, nên chỉ cho bạn một lời hứa là họ sẽ trả bạn. Họ trả bao nhiêu thì phải đến lúc đó mới biết được. Lập trình cũng giống vậy, bạn yêu cầu máy chủ cung cấp thông tin gì đó cho bạn, nhưng cũng phải mất chút thời gian. Trong lúc này, máy tính của bạn có thể chuyển sang làm những công chuyện khác, cho tới khi nhận được câu trả lời thì mới quay sang xử lý nó khi rảnh. Và cũng giống như ngoài đời thực, khi người ta đã mang tiền tới nhà bạn, bạn cũng phải làm nốt công chuyện bạn đang làm dở, rồi mới sắp xếp chạy ra mở cửa cho người ta được.
Quá trình này còn được gọi là lập trình không đồng bộ (asynchronous programming). JavaScript khi chạy trên trình duyệt chỉ có duy nhất một thread (giống như bạn chỉ có một cơ thể), nên nó phải liên tục chuyển giữa các tác vụ. Một tác vụ đồng bộ (synchronous process) sẽ được thực thi liên tục từ đầu đến đích mà không ngừng nghỉ, nhưng một tác vụ không đồng bộ (asynchronous process) thì có thể sẽ được "tạm ngưng" ở một thời điểm nào đó (thời điểm này có quy tắc chứ cũng không phải tùy tiện muốn ngưng lúc nào cũng được), rồi trở lại tiếp tục sau. Thường thì một hàm không đồng bộ có thể được tạm ngưng khi nó đang chờ một hàm không đồng bộ khác.
13 Dec 2024Math

Câu chuyện

Hơn 10 năm trước, năm 2013, khi mình ôn luyện để đi thi tin học trẻ quốc gia, thầy đã cho mình làm thử đề thi của những năm trước, trong đó có một bài toán lăn xúc xắc mà cả thầy và trò đều phải bó tay. Mình nhớ, ngay cả bạn giỏi nhất trong đội tuyển cũng đã phải rất trăn trở với bài này. Mình không biết cuối cùng bạn ấy có giải ra không, nhưng về phần mình thì mình đã phải đầu hàng bỏ cuộc. Kể từ đó, cứ khoảng vài năm mình lại nhìn lại bài toán này, nhưng cũng không giải được. Mình quên nó hẳn đi khi mình vào đại học. Năm nay mình đã đào lại bài toán xưa với hi vọng là mình đã thông minh hơn hồi trước để giải nó. Và cuối cùng là mình đã giải được!
Mời bạn đọc đề bài đầy đủ tại đây.

Tóm tắt bài toán

Cho một bàn cờ kích thước ô vuông và một con xúc xắc nằm ở ô góc trên bên trái. Lần lượt lăn xúc xắc theo hình trôn ốc theo chiều kim đồng hồ cho đến khi tất cả các ô được bao phủ. Tại mỗi ô, xúc xắc để lại giá trị đúng bằng giá trị mặt dưới của xúc xắc tại thời điểm nó tới. Tính tổng giá trị của tất cả các ô trên bàn cờ.
12 Apr 2023Math
Hello guys, I just uploaded my Bachelor Thesis to arXiv. I completed the thesis back in 2021, it was the first time that I proved a new theorem, putting something new out there to the world. My advisor wanted me to find more results to submit to a journal, but I was lazy. Besides, I was caught into working for capitalism. Anyway, enjoy:
06 Mar 2021Math
Greetings, folks. Yes, I'm still alive and I still love writing blogs. Last year (2020) has been a very rough year for me, you know, depression and stuff, but I finally got myself together. I'll be doing a bachelor thesis on pattern-avoid permutations, particularly trying to prove some equidistributions of some pairs of statistics on two set of PAP. I'm using this blog to take notes of my progress. On the off chance that someone would steal my ideas, I have two things to tell you: 1. I would be very flattered, 2. please don't do so.
Anyway, when we study Math, it's important to ask questions and verify what we study. We're often taught to prove a theorem before going with it. I'm doing the same today: As I was reading Amini's paper [1], I encountered a very beautiful distribution formula of the inversion statistic, and Dr. Huong Tran, my advisor, told me to prove it. I will present some introductory terminologies first, then present the proof. My proof isn't very elegant and formal, but it's pretty intuitive, visual, and intelligible. Hope you'll like it. :)
15 Aug 2020Programming
I'm reading the book "Probability and Statistics for Engineering and the Sciences" by Jay L. Devore.

Dotplot

Dot plot is a great way to display frequency of values.
Suppose that we have an array of float called data. We will first round all numbers to its nearest integer (round_half_up). This rounding step is to make the graph easy to look.
#%%
data = Utilities.readArray("soundnoise.dat", float)
vround = np.vectorize(Utilities.round_half_up)
data = vround(data)

#%%
def generate_frequency(data):
    result = np.zeros(data.shape, dtype=int)
    cnt = {}
    for i in range(len(data)):
        tmp = cnt.get(data[i])
        if (not tmp):
            tmp = 0
        tmp += 1
        cnt[data[i]] = tmp
        result[i] = tmp
    return result

#%%
y = generate_frequency(data)
fig = plt.figure(figsize=(15,3))
plt.yticks([])
plt.plot(data, y, 'o', color='black')
plt.xlabel("Value")
plt.title("Figure 1.6 A dotplot of the data from Example 1.8")
plt.show()