Các cờ (flag) liên quan đến các phép tính toán học trong bộ xử lý x86

Thanh ghi cờ là một thanh ghi đặc biệt trong bộ xử lý, nó chứa nhiều bit phản ánh kết quả của các phép tính, cũng như trạng thái của bộ xử lý. Trong đó có 5 cờ liên quan đến các phép toán số học, chúng sẽ được bật hoặc tắt dựa trên kết quả của lệnh tính toán trước đó. Các cờ đó là:

  1. Carry flag (CF): bằng 1 nếu phép tính có mượn. Hay nói cách khác, CF bằng 1 nếu (A + B) có kết quả lớn hơn số bit có thể chứa, hoặc nếu A < B nếu là phép trừ.
  2. Parity flag (PF): bằng 1 nếu tổng số bit 1 trong byte thấp nhất của kết quả là chẵn. Ví dụ kết quả là 0b_00001111 thì PF = 1 (số bit 1 là 4).
  3. Auxiliary Carry flag (AF): Bằng 1 nếu có xảy ra “nhớ” với 4 bit thấp nhất (Tương tự CF nhưng chỉ áp dụng cho 4 bit thấp nhất).
  4. Zero flag (ZF): Bằng 1 nếu kết quả bằng 0.
  5. Sign flag (SF): bằng 1 khi bit dấu (bit lớn nhất) của kết quả là 1, biểu thị đây là một kết quả âm.

Các cờ được sử dụng trong các phép nhảy có điều kiện, các lệnh kiểu như JZ (Jump if Zero), JNZ (Jump if Not Zero), JC (Jump if Carry), JG (Jump if Greater), JE (Jump if Equal)… đều dựa trên các cờ tương ứng để quyết định.

Note: mỗi nhóm 4 bit (biểu thị bằng một số hệ 16) còn được gọi là 1 nibble (Mỗi byte có 2 nibble).

Domain Event và Integration Event

Event là gì?

Một event là một sự kiện gì đó đã xảy ra trong quá khứ.

Khi bạn viết một phần mềm, chung quy lại tất cả mọi thứ chỉ để phục vụ cho mục đích cuối cùng là quản lý các đối tượng có trong hệ thống. Một phần mềm quản lý nhân sự sẽ quản lý danh sách và trạng thái của các nhân sự, một hệ cơ sở dữ liệu quản lý danh mục các bảng và dữ liệu bên trong chúng, một hệ điều hành quản lý các tiến trình và các thiết bị ngoại vi…

Lưu ý là “trạng thái” biểu thị giá trị hiện tại của tất cả các thuộc tính, ví dụ tên hay địa chỉ của nhân sự, giá trị của các dòng trong một bảng hay ID của một tiến trình…

Mỗi một sự thay đổi trạng thái sẽ dẫn đến một sự kiện, hay nói cách khác mỗi một sự kiện đại diện cho một sự thay đổi trạng thái nào đó. Vì sự kiện luôn là một thứ đã diễn ra trong quá khứ nên giá trị của nó không thể thay đổi và được đặt tên ở thì quá khứ, ví dụ như PersonNameChanged, RowAdded hay OrderDelivered. Tất nhiên chúng ta sẽ thấy rằng trong một phần mềm sẽ có rất nhiều sự kiện xảy ra, việc mô hình hóa hay viết ra tất cả các event là không thể, và thực ra là không cần thiết, chúng ta chỉ cần định nghĩa các sự kiện có ảnh hưởng đến bài toán cần giải quyết.

Continue reading “Domain Event và Integration Event”

Sự khác nhau giữa file .h và file .cpp

Câu hỏi:

Trả lời:

Ai cũng biết là ta có thể viết code trong nhiều file .c/.cpp khác nhau, các trình biên dịch cho phép điều này nhằm giúp ta tổ chức mã nguồn dễ hơn, hãy thử tưởng tượng những khó khăn nếu mỗi chương trình phải viết trong một file, chưa kể đến quá trình merge code, team tầm 5 người thì có lẽ thời gian merge còn lâu hơn thời gian code nữa.

Continue reading “Sự khác nhau giữa file .h và file .cpp”

Viết một OpenIdConnect server

Hôm trước làm 2 clip về Authentication và Authorization xong nhưng vẫn cứ thấy thiếu thiếu, vì phần OAuth2 và OpenIdConnect (OIDC) mình nói hơi sơ sài, nghe lại cứ có cảm giác như nói cho xong bài hay chạy KPI vậy.

Làm cái gì mà không tới nơi tới chốn cảm giác nó rất bực mình, vậy nên nay lại ngồi cặm cụi viết một OpenIdConnect server, “from scratch” luôn, hi vọng khi nào xong mình sẽ làm một clip riêng về OAuth2, OIDC, sử dụng chương trình này làm demo, để mọi người thấy từng bước nó chạy, và id_token, access_token, refresh_token được tạo ra và quản lý như thế nào.

Continue reading “Viết một OpenIdConnect server”

Implementing claim-based support in Mini Web Server

(Bài này được viết dưới dạng các ghi chú, được dùng để lưu lại thông tin khi viết các middleware Authentication và Authorization trong Mini Web Server).

  • Việc định danh người dùng trong Mini dựa trên các mô hình Claim-based Identity: Authentication middleware giúp tạo ra Identity và claims dựa trên cookie hoặc JWT.
  • Authentication middleware không làm những công việc như xác nhận email, kiểm tra user name/password… mà chỉ định danh người dùng dựa trên cookie đã lưu trước đó hoặc JWT được gửi bởi một Security Token Service (STS).
  • Nếu người dùng (web developer) muốn quản lý user họ sẽ tự implement giải pháp riêng (tương tự như ASP.NET Identity), độc lập với việc xác thực thông qua Authentication middleware.
  • Authentication middleware cookie được tạo ra và quản lý tự động bởi Authentication middleware khi người dùng khởi tạo (UseCookieAuthentication).
  • Mini cũng hỗ trợ xác thực qua Json Web Token (JWT), dựa trên Header Authentication: Bearer…
  • Authorization middleware hỗ trợ xác thực các request dựa trên claim được tạo ra bởi Authentication middleware, các quy tắc sẽ được đăng ký bởi web developer khi dùng các hàm Map* hoặc dựa trên các hàm riêng (for example: Authorize(string path, string[] claims)…)
  • Các middleware được viết trong thư mục Middleware (https://github.com/daohainam/mini-web-server/tree/master/Middleware)

MÔ HÌNH 3 LỚP

Có lẽ trong quá trình học và đi làm, bạn đã từng nghe qua chữ 3 lớp (3-layer), hoặc 3 tầng (3-tier), vậy nó là gì?

ℹ️ Mô hình 3 lớp là một dạng kiến trúc ứng dụng, trong đó các phần của chương trình được gom vào 3 lớp khác nhau (xem hình minh họa). Thực chất mô hình 3-layer chỉ là một trường hợp đặc biệt của mô hình tổng quát hơn là n-layer, với số lớp có thể từ 2 đến n, các lớp này sẽ nằm lên nhau, và mỗi lớp sẽ chỉ gọi và nhận kết quả xử lý từ lớp ngay bên dưới nó.

Continue reading “MÔ HÌNH 3 LỚP”

Chuyên mục trả lời câu hỏi

Trả lời:

Ta có thể hiểu thế này, một tiến trình (process) được tạo ra khi bạn tải và chạy một chương trình từ đĩa, nó sẽ có một không gian địa chỉ riêng, độc lập hoàn toàn với các tiến trình khác. Hai tiến trình sẽ nằm ở hai dải địa chỉ khác nhau, nếu muốn nói chuyện thì phải thông qua một cơ chế giao tiếp IPC nào đó (inter-process communication), như TCP/IP, namepipes… Một thread là một luồng xử lý của CPU, là một dãy lệnh mà CPU sẽ thực thi, dãy lệnh đó hiển nhiên sẽ được nạp vào và nằm bên trong một tiến trình.

Có thể hiểu nôm na, mỗi process là một nhà máy, còn các thread là các công nhân. Hai công nhân làm cùng nhà máy thì có thể truy cập vào các tài nguyên chung, còn khác nhà máy thì buộc phải dùng dịch vụ chuyển phát thì mới trao đổi thông tin được. Một nhà máy thì có ít nhất một công nhân – single thread (nhưng cũng có thể có nhiều hơn – multi thread).

Continue reading “Chuyên mục trả lời câu hỏi”

LÀM VIỆC Ở NAUY

Có nhiều bạn còn đi học vẫn thắc mắc không biết khi đi làm thì thế nào, vậy để tôi kể cho các bạn nghe về một ngày của tôi nhé 🙂.

Như đã từng kể trước đây, tôi hiện đang làm trong một nhóm phát triển phần mềm về quản lý vận tải, một mảng trong logistics. Bạn tưởng tượng đang làm chủ một công ty có 20 xe container, 40 tài xế, chuyên chở hàng hóa theo hợp đồng cho các siêu thị, các công ty bán lẻ, cửa hàng trực tuyến, công ty xây dựng… Bạn muốn quản lý các đơn hàng, hợp đồng, muốn biết chính xác xe nào đang ở đâu, trạng thái hàng hóa thế nào. Bạn cũng muốn cho phép khách hàng biết được chính xác từng món đã đi tới đâu, khi nào có thể nhận được… Vậy là bạn đang cần đến một phần mềm như chúng tôi cung cấp. Chúng tôi có các ứng dụng cho trung tâm điều hành, web app, các ứng dụng trên iOS và Android cho tài xế, khách hàng, thậm chí có cả ứng dụng tích hợp trên các xe tải.

Continue reading “LÀM VIỆC Ở NAUY”

BẠN ĐANG CẦN BÍ KÍP HỌC TIẾNG ANH CHUYÊN NGÀNH?

May be an image of 1 person

Lang thang trên web tìm thấy cuốn “Data Structures and Algorithms” này, xem sơ qua thấy khá hay.https://www.cs.bham.ac.uk/~jxb/DSA/dsa.pdf

Những bạn nào muốn vừa học thuật toán vừa học tiếng Anh chuyên ngành có thể bắt đầu với cuốn này. Các bạn đừng sợ không đọc được, chúng ta nói tiếng Việt nên chẳng ai sinh ra mà đã đọc được cả.Nếu muốn bắt đầu học tiếng Anh chuyên ngành, các bạn nên đặt ra một mục tiêu, như đọc hết toàn bộ sau 2 tháng, từ đó hãy lập mục tiêu một ngày đọc bao nhiêu trang, đọc hết không có nghĩa là bạn hiểu hết những gì nó viết, nếu thấy khó quá thì bạn có thể tham khảo thêm một quyển sách tiếng Việt về cùng nội dung. Điều này cũng tương tự như khi bạn đọc một cuốn sách chuyên ngành bằng tiếng Việt: Bạn đọc được hết nhưng không chắc sẽ làm được tất cả những gì viết trong đó.

Continue reading “BẠN ĐANG CẦN BÍ KÍP HỌC TIẾNG ANH CHUYÊN NGÀNH?”

Tiếng Anh có cần cho người lập trình không?

Hỏi nhanh đáp gọn luôn là có!

👉 Vì sao?

– Các tài liệu chuyên ngành hầu hết là viết bằng tiếng Anh, tất nhiên vẫn có tài liệu tiếng Việt, nhưng hoặc viết về những chủ đề cơ bản, hoặc khá chậm cập nhật, và theo cá nhân mình thì đa phần khá í ẹ sau khi dịch xong. Không phải vì người dịch không có kiến thức, mà vì dịch các tài liệu chuyên ngành rất khó.

– Bạn không thể đọc được các bài hỏi đáp trên google, stackoverflow, trong khi đó lại là một nguồn quan trọng giúp giải quyết nhanh các trục trặc phát sinh. Đôi khi tôi tin là nhờ có stackoverflow mà công việc của tôi có thể tiến triển nhanh gấp đôi.

Continue reading “Tiếng Anh có cần cho người lập trình không?”