• Decoded World

    The Mysteries of Humanity: Leonardo da Vinci

  • Decoded World

    The Unsung Hero: Nikola Tesla

  • Decoded World

    The Wizard of Light: Thomas Edison

  • Decoded World

    Adolf Hitler: The Master Manipulator

31 October 2026

Cách chế tạo mạch điều khiển nhiệt độ NTC chính xác cho máy ấp trứng tự chế

Cách chế tạo mạch điều khiển nhiệt độ NTC chính xác cho máy ấp trứng tự chế

Việc tự làm một chiếc máy ấp trứng tự động là một trong những dự án điện tử DIY thú vị nhất, dù bạn dùng để ấp trứng gà, trứng cút, hay thậm chí ứng dụng vào việc kiểm soát nhiệt độ chính xác cho thiết bị thí nghiệm hoặc làm sữa chua tại nhà.

Trái tim của bất kỳ chiếc máy ấp trứng thành công nào cũng là một bộ điều nhiệt (thermostat) đáng tin cậy và chính xác. Trong bài viết này, chúng ta sẽ cùng khám phá cách chế tạo một mạch điều khiển nhiệt độ cảm biến NTC với chi phí tối ưu nhưng mang lại độ chính xác cao bằng các vi mạch khuếch đại thuật toán thông dụng.


Tại sao nên dùng cảm biến nhiệt điện trở NTC?

Khi làm máy ấp trứng, độ chính xác của cảm biến là yếu tố quyết định. Lệch một phần nhỏ của độ C cũng có thể ảnh hưởng lớn đến tỷ lệ nở của trứng.

Mặc dù một số người có sở thích mày mò từng thử dùng các diode thông thường làm cảm biến nhiệt độ, chúng thường không ổn định và dễ gặp sai số do biến động điện áp. Cảm biến nhiệt điện trở NTC (Negative Temperature Coefficient - Hệ số nhiệt âm) mang lại độ chính xác và độ nhạy vượt trội hơn hẳn.

  • Thông số khuyên dùng: Tìm cảm biến NTC có điện trở 10K ohm ở 25°C, sai số từ 1% đến 5%.

  • Mẹo nhỏ: Bạn hoàn toàn có thể tận dụng các cảm biến NTC 8K–10K chất lượng cao, độ chính xác tốt từ các bo mạch chủ máy tính cũ (như mainboard Pentium II hoặc III đời cũ). Chúng có độ ổn định tuyệt vời so với các linh kiện giá rẻ thông thường.

Sơ đồ mạch & Các linh kiện cốt lõi

Mạch điều khiển này sử dụng một IC khuếch đại thuật toán (op-amp) được cấu hình làm mạch so sánh điện áp. Mặc dù thiết kế gốc sử dụng IC MC4558, bạn hoàn toàn có thể dùng LM358 vì chúng hoạt động cực kỳ hiệu quả và có chung sơ đồ chân (pinout).


Các linh kiện chính cần chuẩn bị:

  1. Op-Amp: LM358 (hoặc MC4558).

  2. Cảm biến: Cảm biến NTC 10K (RT1).

  3. Điện trở: R1, R2, R3, và một điện trở biến đổi / chiết áp (R4) dùng để căn chỉnh nhiệt độ thủ công.

  4. Rơ-le & Linh kiện bảo vệ (Tùy chọn nhưng nên có):

    • Một rơ-le tiêu chuẩn để đóng ngắt thiết bị gia nhiệt.

    • Nếu rơ-le của bạn bị kêu lạch cạch liên tục (nhấp nháy bật/tắt liên tục khi chạm ngưỡng), hãy thêm mạch lọc giảm chấn gồm một điện trở (RX = 560 ohm) và một tụ điện (CX = 10µF, 10V).

    • Một điện trở 1MΩ mắc giữa chân 1 và chân 3 có thể giúp triệt tiêu hiện tượng rơ-le đóng ngắt quá nhạy gây nhiễu.



Mẹo căn chỉnh nhiệt độ (Calibration) từng bước

Để căn chỉnh bộ điều khiển của bạn một cách chính xác nhất:

  • Sử dụng một nhiệt kế đáng tin cậy (nhiệt kế thủy ngân hoặc nhiệt kế điện tử chuyên dụng cho bể cá hoạt động rất tốt).

  • Điều chỉnh chiết áp R4 từ từ cho đến khi rơ-le ngắt chính xác tại nhiệt độ mục tiêu của bạn.

  • Hãy nhớ rằng nhiệt độ cần có thời gian để truyền thấu vào bên trong quả trứng do khối lượng nhiệt của nó, vì vậy hãy luôn căn chỉnh dựa trên một chuẩn tham chiếu ổn định.

Các thông số ấp trứng thiết yếu cho máy tự chế

Việc làm ra bo mạch chỉ là một nửa chặng đường; duy trì các điều kiện môi trường phù hợp bên trong thùng máy là chìa khóa mang lại tỷ lệ nở cao.

1. Đối với trứng gà (Chu kỳ tiêu chuẩn 21 ngày)

  • Từ ngày 1 đến ngày 19.5:

    • Nhiệt độ: Duy trì trung bình ổn định ở 37.8°C (99.75°F). (Khoảng lý tưởng bên trong phôi là 37.5°C – 37.8°C).

    • Độ ẩm tương đối: Giữ trong khoảng 50% đến 65%.

    • Thao tác: Đảo trứng vài lần mỗi ngày.

  • Giai đoạn nở (Ngày 19.5 đến 21):

    • Nhiệt độ: Giảm nhẹ xuống mức trung bình 36.8°C (khoảng 36°C – 37.5°C).

    • Độ ẩm tương đối: Tăng lên 65% – 75%.

    • Thao tác: Ngừng đảo trứng.

2. Đối với trứng cút (Chu kỳ tiêu chuẩn 17 ngày)

  • Từ ngày 1 đến ngày 15:

    • Nhiệt độ: 37.7°C.

    • Độ ẩm tương đối: Khoảng 65%.

  • Giai đoạn nở (Ngày 15 đến 17):

    • Nhiệt độ: 37.7°C.

    • Độ ẩm tương đối: Tăng lên đến 80%.


Các chân của MC4558 và LM358:

Các chân của MC4558 và LM358



Trên mạch in và sơ đồ bên dưới, ta có thể thấy chân 1 được nối với chân 5, cũng như chân 6 và 7. Điều này nhằm tránh để bất kỳ chân nào không được kết nối và không làm thay đổi hoạt động của mạch.


Hãy nhớ rằng có thể cần một điện trở 1 MΩ Ry giữa chân 1 và 3. (màu nâu, đen, xanh lá cây, vàng) Hiện tại tôi luôn sử dụng nó.

Mẹo thực tế khi chế tạo thùng ấp

  • Bộ phận tạo nhiệt (Nguồn nhiệt): Hãy chọn nguồn nhiệt phù hợp. Sử dụng các bóng đèn công suất nhỏ (như nhiều bóng đèn sợi đốt công suất thấp mắc nối tiếp nhau) sẽ giúp tránh tình trạng nhiệt độ tăng vọt quá đà. Nếu bộ phận sưởi quá mạnh, nhiệt độ sẽ tiếp tục tăng vượt ngưỡng ngắt của bộ điều nhiệt ngay cả khi đã tắt điện.

  • Cách nhiệt thùng máy: Nếu bạn làm vỏ máy ấp từ các vật dụng tận dụng (như vỏ lò vi sóng cũ), hãy bọc cách nhiệt thật kỹ. Đảm bảo gioăng cửa kín khít—việc thất thoát độ ẩm chính là "sát thủ thầm lặng" số một khiến tỷ lệ nở thất bại.


07 July 2024

Marquise de Brinvilliers Castle

🏰 Marquise de Brinvilliers Castle

Hidden deep inside Lorraine, this abandoned castle has been swallowed by nature. Thick vegetation, broken walls, and silence surround the ruins.

The castle was destroyed after a violent fire in 1969. Since then, it has remained abandoned like a forgotten ghost from the past.

Before the tragedy, wealthy industrialists lived here. Esther and Théodore seemed to have a perfect life — fortune, status, and a castle.

But behind the luxurious walls was pain. Esther desperately wanted a child, while Théodore struggled with sterility.

Their relationship slowly turned cold and toxic. The castle became filled with silence, resentment, and emotional suffering.

After years of failed treatments, desperation pushed them toward dark decisions. Their obsession with having a child slowly destroyed their sanity.

Eventually Esther became pregnant, bringing hope back into the castle. For a brief moment, happiness returned.

But tragedy struck during the pregnancy. Esther suffered a devastating miscarriage that shattered both their lives forever.

Consumed by grief, Esther slowly lost touch with reality. The castle transformed into a place of madness and horror.

One terrible night, violence erupted inside the castle walls. Fire consumed the estate, ending the tragic story forever.

Today, only ruins remain — silent witnesses to one of the castle’s darkest legends.

Source: urbexsession.com

12 September 2023

Luồng phê duyệt đơn

1. Người tạo đơn: Tạo đơn phê duyệt mới và cung cấp thông tin chi tiết về đơn như tiêu đề, mô tả và người được phê duyệt.

2. Người phê duyệt: Nhận thông báo về đơn phê duyệt và xem thông tin chi tiết. Có thể chọn phê duyệt hoặc từ chối đơn. 3. Approver: Nếu người phê duyệt chấp nhận đơn, quá trình phê duyệt được hoàn thành và đơn được chuyển đến bước tiếp theo. 4. Reject: Nếu người phê duyệt từ chối đơn, quá trình phê duyệt kết thúc và đơn bị từ chối. 5. Return: Nếu người phê duyệt muốn yêu cầu chỉnh sửa hoặc bổ sung thông tin, họ có thể chọn trả lại đơn để yêu cầu người tạo đơn thực hiện các thay đổi. 6. Người tạo đơn: Nhận thông báo về việc đơn bị từ chối hoặc yêu cầu chỉnh sửa. Có thể chỉnh sửa đơn và gửi lại để tiếp tục quá trình phê duyệt.  

Quy trình trên có thể được tùy chỉnh và điều chỉnh theo nhu cầu và quy trình công việc của tổ chức. 

Mô tả luồng qua lại giữa người tạo đơn và người phê duyệt. Người tạo đơn gửi đơn đến người phê duyệt. Người phê duyệt có thể phê duyệt, từ chối hoặc yêu cầu chỉnh sửa đơn. Nếu đơn bị từ chối, quá trình kết thúc. Nếu người phê duyệt yêu cầu chỉnh sửa, người tạo đơn sẽ chỉnh sửa và gửi lại đơn để tiếp tục quá trình phê duyệt.






Đề nghị thanh toán

Đề xuất mua hàng


Luồng phê duyệt gửi tiền có takeback

Quy trình công việc phê duyệt

Người gửi và người phê duyệt có các hành động riêng để thay đổi trạng thái của số tiền, cho biết số tiền đã gửi nằm ở đâu trong quy trình phê duyệt. Mỗi trạng thái có thể được lọc trong Tab Hoạt động (trước đây là Tab Ngân sách) trong Allocadia hoặc trong Thông tin chi tiết  (trước đây là Analytics). Một ví dụ về quy trình làm việc tổng thể như sau:


  1. Người gửi nhập giá trị vào Kế hoạch hoặc Dự báo tương ứng. Theo mặc định, tất cả các giá trị mới được nhập đều có trạng thái lập kế hoạch.
  2. Người nộp gửi số tiền Kế hoạch hoặc Dự báo để phê duyệt. Khi điều này xảy ra, giá trị ô sẽ chuyển sang trạng thái chỉ đọc và chuyển sang trạng thái chờ xử lý.
  3. Một số tùy chọn có sẵn khi số tiền đang chờ xử lý:
    • 3a. Người nộp có thể lấy lại số tiền trước khi người phê duyệt đưa ra quyết định hoặc nếu số tiền được yêu cầu đã bị người phê duyệt từ chối. Trong trường hợp này, trạng thái của số tiền sẽ trở lại trạng thái lập kế hoạch.
    • 3b. Người phê duyệt có thể gửi lại yêu cầu đang chờ xử lý kèm theo các nhận xét để sửa đổi. Trạng thái sau đó sẽ trở lại quy hoạch.
    • 3c. Người phê duyệt có thể chấp nhận yêu cầu và trạng thái sẽ trở thành được phê duyệt. Ô sẽ vẫn ở chế độ chỉ đọc.
    • 3d. Người phê duyệt có thể từ chối số tiền được yêu cầu và trạng thái của trường sẽ bị từ chối. Ô vẫn ở chế độ chỉ đọc.
  4. Đối với số tiền được phê duyệt, người gửi có thể gửi yêu cầu thay đổi. Allocadia sẽ tiếp tục hiển thị số tiền đã được phê duyệt với trạng thái thay đổi đang chờ xử lý. Giá trị hiển thị sẽ chỉ cập nhật nếu yêu cầu thay đổi được chấp thuận.

21 July 2023

Mô phỏng luồng stack và heap javascript?

 


Trong Javascript, có hai loại bộ nhớ chính: stack và heap. Chúng hoạt động khác nhau trong việc lưu trữ và quản lý dữ liệu. 

 

1. Stack: 

- Stack được sử dụng để lưu trữ các biến cục bộ, tham số và các giá trị trung gian khi hàm được gọi. 

- Mỗi khi một hàm được gọi, một khung dữ liệu mới được tạo trên stack để lưu trữ các biến cục bộ và thông tin về hàm. 

- Khi hàm kết thúc, khung dữ liệu đó sẽ được xóa khỏi stack, giải phóng không gian bộ nhớ. 

 

2. Heap: 

- Heap được sử dụng để lưu trữ các đối tượng động và dữ liệu có kích thước không xác định trước. 

- Đối tượng trên heap tồn tại cho đến khi không còn bất kỳ tham chiếu nào đến chúng. 

- Trong Javascript, việc quản lý heap được thực hiện tự động thông qua thu thập rác (garbage collection), nghĩa là các đối tượng không còn được sử dụng sẽ được tự động thu hồi bộ nhớ. 

 Ví dụ mô phỏng luồng stack và heap trong Javascript:

function foo() {
    let a = 1; // Biến a được lưu trữ trên stack
    let b = { value: 2 }; // Đối tượng b được lưu trữ trên heap, và tham chiếu đến nó được lưu trữ trên stack
    bar(a, b);
}
function bar(x, y) {
    let c = x + y.value; // Biến c được lưu trữ trên stack
    console.log(c);
}
foo();

Trong ví dụ trên, khi hàm  foo  được gọi, một khung dữ liệu mới được tạo trên stack để lưu trữ biến  a  và tham chiếu đến đối tượng  b . Sau đó, khi hàm  bar  được gọi, một khung dữ liệu mới khác được tạo trên stack để lưu trữ biến  x  và  y , trong đó  y  là một tham chiếu đến đối tượng  b  trên heap. Cuối cùng, giá trị của  x  và  y.value  được tính toán trên stack và kết quả được in ra màn hình. Khi hàm  bar  kết thúc, khung dữ liệu của nó được xóa khỏi stack, giải phóng không gian bộ nhớ.

12 July 2023

Session và Cookie ?



Session và Cookie là hai khái niệm quan trọng trong lập trình web để lưu trữ thông tin và duy trì trạng thái của người dùng trên trang web. 

 

Session (Phiên làm việc) là một cơ chế lưu trữ thông tin trên máy chủ. Khi một người dùng truy cập vào trang web, máy chủ sẽ tạo ra một phiên làm việc duy nhất và gán một ID phiên cho người dùng đó. Thông tin của người dùng, như tên, địa chỉ, giỏ hàng, sẽ được lưu trữ trong phiên làm việc này. Phiên làm việc thường được lưu trữ trên máy chủ và chỉ có thể truy cập thông qua ID phiên. Khi người dùng đăng xuất hoặc đóng trình duyệt, phiên làm việc sẽ bị hủy và thông tin của người dùng sẽ bị xóa. 

 

Cookie (Bánh quy) là một tệp nhỏ chứa thông tin được lưu trữ trên máy tính của người dùng. Khi người dùng truy cập vào một trang web, máy chủ có thể gửi một hoặc nhiều cookie đến trình duyệt của người dùng. Cookie chứa thông tin như tên người dùng, tuổi, sở thích, v.v. Trình duyệt sẽ lưu trữ cookie này và gửi nó lại cho máy chủ mỗi khi người dùng truy cập vào trang web đó. Cookie thường được sử dụng để duy trì trạng thái đăng nhập, theo dõi hoạt động của người dùng và cung cấp trải nghiệm cá nhân hóa trên trang web. 

 

Tóm lại, Session được lưu trữ trên máy chủ và Cookie được lưu trữ trên máy tính của người dùng. Cả hai đều giúp duy trì trạng thái và lưu trữ thông tin của người dùng trên trang web.

Sự khác nhau giữa function declaration và expression trong Javascript


Trong JavaScript, có hai cách khai báo hàm là function declaration (khai báo hàm) và function expression (biểu thức hàm). Dưới đây là sự khác nhau giữa hai cách này: 

 

1. Function Declaration (Khai báo hàm): 

   - Cú pháp: function functionName() { } 

   - Được khai báo trên cùng của phạm vi (hoisting), tức là bạn có thể gọi hàm trước khi khai báo nó trong mã. 

   - Có thể gọi hàm từ bất kỳ đâu trong phạm vi hiện tại. 

   - Thường được sử dụng cho các hàm lớn, phức tạp. 

 

Ví dụ:

function myFunction() {
  console.log('Hello!');
};
myFunction(); // Output: Hello!


2. Function Expression (Biểu thức hàm): 

   - Cú pháp: var functionName = function() { } 

   - Khai báo hàm bằng gán giá trị cho một biến. 

   - Không được hoisting, nghĩa là bạn chỉ có thể gọi hàm sau khi nó được khai báo trong mã. 

   - Phạm vi của hàm được giới hạn bởi phạm vi của biến mà nó được gán vào. 

   - Thường được sử dụng cho các hàm nhỏ, đơn giản hoặc trong các biểu thức khác. 

 

Ví dụ:

var myFunction = function() {
  console.log('Hello!');
};
myFunction(); // Output: Hello!

Tóm lại, function declaration và function expression đều cho phép bạn khai báo và sử dụng hàm trong JavaScript. Việc sử dụng loại nào phụ thuộc vào ngữ cảnh và yêu cầu của mã của bạn.

JS runtime cách xử lý bất đồng bộ và đồng bộ

 


JS runtime (thời gian chạy của JavaScript) xử lý bất đồng bộ (asynchronous) và đồng bộ (synchronous) theo cách khác nhau.


Khi JavaScript chạy trên trình duyệt, runtime sử dụng mô hình sự kiện (event-driven) để xử lý các sự kiện và tương tác người dùng. Khi có một sự kiện xảy ra, runtime sẽ đưa sự kiện đó vào hàng đợi sự kiện (event queue) và tiếp tục thực hiện các công việc khác. Khi runtime hoàn thành các công việc hiện tại, nó sẽ lấy sự kiện đầu tiên từ hàng đợi sự kiện và xử lý nó.


Đối với các tác vụ bất đồng bộ như gọi API, tải tệp tin, hoặc thực hiện các tác vụ mạng, JavaScript sử dụng các hàm bất đồng bộ như setTimeout, setInterval, fetch, XMLHttpRequest, hoặc Promise

. Khi gọi các hàm bất đồng bộ này, runtime sẽ không chờ đợi kết quả trả về mà tiếp tục thực hiện các công việc khác. Khi kết quả trả về, runtime sẽ đưa nó vào hàng đợi sự kiện và xử lý sau.


Đối với các tác vụ đồng bộ, JavaScript sử dụng cơ chế gọi lại (callback) hoặc 

async/await

 để xử lý. Khi gọi một hàm đồng bộ, runtime sẽ chờ đợi hàm đó hoàn thành trước khi tiếp tục thực hiện các công việc khác. Điều này có thể gây trì hoãn (blocking) trong quá trình thực thi.


Tuy nhiên, để tránh trì hoãn quá lâu và đảm bảo ứng dụng vẫn phản hồi, JavaScript runtime sử dụng mô hình bất đồng bộ và sự kiện để xử lý các tác vụ dài hạn. Bằng cách này, runtime có thể tiếp tục thực hiện các công việc khác trong khi đợi kết quả trả về từ các tác vụ bất đồng bộ.

10 July 2023

viewProvider vs provider khác nhau như thế nào Angular?


Trong Angular, "viewProvider" và "provider" là hai thuộc tính khác nhau được sử dụng để cung cấp dữ liệu và các đối tượng trong ứng dụng.


ViewProvider: Đây là một thuộc tính được sử dụng để cung cấp dữ liệu hoặc đối tượng cho một view cụ thể trong Angular. ViewProvider được khai báo trong phạm vi của một thành phần (component) và chỉ có hiệu lực trong view của thành phần đó. Nó được sử dụng để cung cấp dữ liệu hoặc đối tượng cho các thành phần con hoặc các directive trong view của thành phần chứa nó.
ViewProvider không hoạt động với ng-content (cần chú ý)


Provider: Đây là một thuộc tính được sử dụng để cung cấp dữ liệu hoặc đối tượng cho toàn bộ ứng dụng Angular. Provider được khai báo trong phạm vi của một module và có thể được sử dụng trong toàn bộ ứng dụng. Nó được sử dụng để cung cấp dữ liệu hoặc đối tượng cho các thành phần, directive, hoặc service trong ứng dụng.


Tóm lại, viewProvider được sử dụng để cung cấp dữ liệu hoặc đối tượng cho một view cụ thể trong Angular, trong khi provider được sử dụng để cung cấp dữ liệu hoặc đối tượng cho toàn bộ ứng dụng.

Các cách tăng performance cho ứng dụng angular?

 


Có nhiều cách để tăng hiệu suất cho ứng dụng Angular. Dưới đây là một số gợi ý:


Sử dụng AOT (Ahead-of-Time) Compilation: AOT Compilation giúp giảm thời gian tải ứng dụng và tăng tốc độ khởi chạy bằng cách biên dịch mã nguồn Angular thành mã máy trước khi chạy ứng dụng.


Lazy Loading: Sử dụng Lazy Loading để tải các module và component chỉ khi cần thiết, giúp giảm thời gian tải trang và tăng tốc độ chuyển đổi giữa các trang.


Sử dụng ChangeDetectionStrategy.OnPush: Đặt ChangeDetectionStrategy.OnPush cho các component để chỉ chạy kiểm tra thay đổi khi có sự thay đổi đầu vào từ phía component cha hoặc khi sự thay đổi được kích hoạt bằng cách sử dụng @Input hoặc async pipe. Điều này giúp giảm số lần kiểm tra thay đổi và tăng hiệu suất.


Sử dụng TrackBy trong vòng lặp *ngFor: Khi sử dụng vòng lặp *ngFor để hiển thị danh sách, hãy sử dụng trackBy để chỉ định một hàm xác định duy nhất cho mỗi mục trong danh sách. Điều này giúp Angular xác định các mục đã thay đổi và chỉ cập nhật các mục thay đổi thực sự, giúp tăng hiệu suất.


Sử dụng OnPush và Immutable Data: Sử dụng cơ chế OnPush và sử dụng dữ liệu bất biến (immutable data) để giảm số lần kiểm tra thay đổi và tăng hiệu suất.


Tối ưu hóa CSS: Loại bỏ CSS không sử dụng, sử dụng CSS minification và sử dụng các kỹ thuật như CSS Sprites để tối ưu hóa tải trang.


Sử dụng Web Workers: Sử dụng Web Workers để chạy các tác vụ nặng như tính toán phức tạp hoặc xử lý dữ liệu lớn trong một luồng riêng biệt, giúp tránh làm đóng băng giao diện người dùng.


Sử dụng Lazy Loading Images: Sử dụng kỹ thuật lazy loading để tải ảnh chỉ khi cần thiết, giúp giảm thời gian tải trang ban đầu.


Tối ưu hóa HTTP Requests: Sử dụng HTTP Interceptors để tối ưu hóa các yêu cầu HTTP bằng cách thêm caching, nén dữ liệu hoặc sử dụng HTTP/2.


Sử dụng Production Build: Sử dụng production build để tạo ra phiên bản tối ưu hóa của ứng dụng Angular, bao gồm việc loại bỏ mã không sử dụng và tối ưu hóa kích thước tệp tin.


Nhớ rằng, việc tăng hiệu suất không chỉ dừng lại ở việc áp dụng các kỹ thuật tối ưu hóa, mà còn phụ thuộc vào cấu trúc và thiết kế của ứng dụng.

06 July 2023

Có bao nhiêu Scopes trong Javascript

Scope Levels

1 - Global Scope
2 - Module Scope
3 - Block Scope
4 - Function Scope




Global Scope

<script src="script.js"></script>

<script>
  // script.js
  const a = 1
  console.log(a)
  // Prints: 1
</script>

<script src="script-1.js"></script>
<script src="script-2.js"></script>

<script>
  // script-1.js

  const a = 1
  // script-2.js

  console.log(a)
  // Prints: 1
</script>

Module Scope

<script src="script-1.js" type="module"></script>
<script src="script-2.js" type="module"></script>

<script>
  // script-1.js

  const a = 1
  console.log(a)
  // Prints: 1

  // script-2.js

  console.log(a)
  // Throws Uncaught Reference Error: a is not defined
</script>

Block Scope

function test() {
  const funcVar = "Func"

  if (true) {
    const ifVar = "If"
    console.log(funcVar, ifVar)
    // Prints: "Func", "If"
  }

  console.log(funVar, ifVar)
  // Throws Uncaught Reference Error: ifVar is not defined
}

{
  const a = 10
}

console.log(a)
// Throws Uncaught Reference Error: a is not defined

Function Scope

function test() {
  var funcVar = "Func"

  if (true) {
    var ifVar = "If"
    console.log(funcVar, ifVar)
    // Prints: "Func", "If"
  }

  console.log(funVar, ifVar)
  // Prints: "Func", "If"
}

22 June 2023

Non-blocking và Blocking

Non-blocking và blocking là hai khái niệm quan trọng trong lập trình hướng đồng bộ.


Non-blocking là một thuật ngữ được sử dụng để chỉ việc thực hiện một tác vụ mà không cần chờ đợi kết quả từ tác vụ đó. Trong một non-blocking hàm, chương trình sẽ tiếp tục thực hiện các tác vụ khác mà không bị gián đoạn, cho phép chương trình tiếp tục thực hiện các tác vụ khác mà không cần chờ đợi kết quả từ tác vụ đó. Khi tác vụ đã hoàn thành, chương trình sẽ thông báo cho chương trình gọi nó về.


Ví dụ, trong một hệ thống đặt hàng, khi khách hàng đặt hàng, hệ thống sẽ gửi yêu cầu đặt hàng đến cửa hàng để xác nhận. Trong trường hợp này, hệ thống sẽ chạy một non-blocking hàm để gửi yêu cầu đặt hàng đến cửa hàng và tiếp tục thực hiện các tác vụ khác mà không bị gián đoạn. Khi yêu cầu đặt hàng được xác nhận, hệ thống sẽ thông báo cho khách hàng về kết quả của yêu cầu đặt hàng.


Blocking là một thuật ngữ được sử dụng để chỉ việc thực hiện một tác vụ mà cần chờ đợi kết quả từ tác vụ đó. Trong một blocking hàm, chương trình sẽ chờ đợi kết quả từ tác vụ đó trước khi tiếp tục thực hiện các tác vụ khác. Khi tác vụ đã hoàn thành, chương trình sẽ tiếp tục thực hiện các tác vụ khác.


Ví dụ, trong một hệ thống đăng nhập, khi người dùng nhập tên đăng nhập và mật khẩu, hệ thống sẽ gửi yêu cầu đăng nhập đến cơ sở dữ liệu để xác nhận. Trong trường hợp này, hệ thống sẽ chạy một blocking hàm để gửi yêu cầu đăng nhập đến cơ sở dữ liệu và chờ đợi kết quả của yêu cầu đăng nhập trước khi tiếp tục thực hiện các tác vụ khác. Khi yêu cầu đăng nhập được xác nhận, hệ thống sẽ cho phép người dùng truy cập vào hệ thống.




clientY vs pageY

 Đưa ra một điểm trong trang clientY và pageY là khoảng cách tính bằng pixel từ điểm đến đầu chế độ xem và trang.

Ở đây, trang là toàn bộ trang được hiển thị có thể có thanh cuộn, trong khi chế độ xem là phần hiển thị của trang.

┌─────────────────────────────┬─┐◀︎─── Web page      ▲
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | pageY
| | | |
├=============================┼─┤ ▲ | ▲
| | | | | |
| | | | | |
| Scroll bar──────────▶︎ | | | | clientY
| | | Browser | |
| | | window | |
| ● Point | | | ▼ ▼
| | | |
| | | |
├=============================┼─┤ ▼
| | |
| | |
| | |
└─────────────────────────────┴─┘

19 June 2023

Box sizing - css

box-sizing: content-box; /* default */
box-sizing: border-box; /* với đường viền và lề */
box-sizing: inherit; /* lấy giá trị từ cha của nó */


Content-box
Các thuộc tính width và height được đo chỉ bao gồm content chứ không bao gồm padding, border hoặc margin.

padding, border và margin sẽ nằm ngoài hộp => width, height không tính padding, margin, border

// Content box
◀︎──── 200px ────▶︎

┌───────────────────────────────────────────────────────┐
| |
| ┌───────────────────────────────────────┐ |
| | | |
| | ┌───────────────┐ | |
| Border| Padding | Content | | |
| | | | | |
| 5px | 10px | 200px | 10px | 5px |
|◀︎─────▶︎|◀︎─────────▶︎|◀︎─────────────▶︎|◀︎─────────▶︎|◀︎─────▶︎|
| | | | | |
| | └───────────────┘ | |
| | | |
| └───────────────────────────────────────┘ |
| |
└───────────────────────────────────────────────────────┘


border-box
Các thuộc tính width và height bao gồm padding và border, nhưng không bao gồm margin.


padding và border sẽ ở bên trong hộp => width, height tính cả padding + border

// Border box
◀︎──────────────────────── 200px ────────────────────────▶︎

┌───────────────────────────────────────────────────────┐
| |
| ┌───────────────────────────────────────┐ |
| | | |
| | ┌───────────────┐ | |
| Border| Padding | Content | | |
| | | | | |
| 5px | 10px | 170px | 10px | 5px |
|◀︎─────▶︎|◀︎─────────▶︎|◀︎─────────────▶︎|◀︎─────────▶︎|◀︎─────▶︎|
| | | | | |
| | └───────────────┘ | |
| | | |
| └───────────────────────────────────────┘ |
| |
└───────────────────────────────────────────────────────┘

12 June 2023

Agile Scrum và Waterfal là gì?


Agile, Scrum, và Waterfall là ba phương pháp quản lý dự án khác nhau được sử dụng trong quá trình phát triển phần mềm.


Agile là một phương pháp quản lý dự án phù hợp với nhu cầu của thị trường thay vì sử dụng các quy trình và quy định nhất định. Agile tập trung vào việc cải thiện hiệu suất và sự phản hồi từ khách hàng, thay vì chỉ tập trung vào quy trình và quy định. Agile thường được sử dụng trong các dự án phần mềm, phần mềm dự án thiết kế, phần mềm dự án quản lý dự án, và các dự án khác.



Scrum là một phương pháp quản lý dự án Scrum được phát triển bởi Eric Ray và Michael Scrum. Scrum là một phương pháp quản lý dự án Scrum thường được sử dụng trong các dự án phần mềm, phần mềm dự án thiết kế, phần mềm dự án quản lý dự án, và các dự án khác. Scrum tập trung vào việc cải thiện hiệu suất và sự phản hồi từ khách hàng bằng cách sử dụng các nghệ thuật Scrum như sprint, daily Scrum meeting, sprint review và sprint retrospective.


Waterfall là một phương pháp quản lý dự án Waterfall được phát triển bởi Michael Fowler. Waterfall là một phương pháp quản lý dự án Waterfall thường được sử dụng trong các dự án phần mềm, phần mềm dự án thiết kế, phần mềm dự án quản lý dự án, và các dự án khác. Waterfall tập trung vào việc thiết kế và phát triển một ứng dụng từ đầu đến cuối, với từng bước được xác định trước và các quy trình và quy định cụ thể được thiết kế và thực hiện.


Tóm lại, Agile, Scrum và Waterfall là ba phương pháp quản lý dự án khác nhau được sử dụng trong quá trình phát triển phần mềm. Agile tập trung vào việc cải thiện hiệu suất và sự phản hồi từ khách hàng, Scrum tập trung vào việc cải thiện hiệu suất và sự phản hồi từ khách hàng bằng cách sử dụng các nghệ thuật Scrum, và Waterfall tập trung vào việc thiết kế và phát triển một ứng dụng từ đầu đến cuối.

Scrum với Kanban là gì?


Scrum và Kanban là hai khái niệm quan trọng trong quản lý dự án. Scrum là một phương pháp thiết kế phần mềm, được sử dụng để quản lý dự án trong quá trình phát triển phần mềm. Scrum bao gồm các quy trình và nguyên tắc để giải quyết các vấn đề liên quan đến quản lý dự án, bao gồm sprint, sprint review, sprint retrospective và daily Scrum meeting.

Kanban là một phương pháp quản lý dự án, được sử dụng để giám sát và quản lý quá trình thực hiện các công việc trong một dự án. Kanban bao gồm các quy trình và nguyên tắc để giải quyết các vấn đề liên quan đến quản lý dự án, bao gồm sơ đồ xử lý, bảng quản lý công việc và các bước trong quá trình thực hiện công việc.




Scrum và Kanban đều có mục đích giúp quản lý dự án hiệu quả hơn. Scrum giúp quản lý dự án bằng cách sử dụng các quy trình và nguyên tắc để giải quyết các vấn đề liên quan đến quản lý dự án, giúp cho các thành viên trong dự án có thể hoàn thành công việc một cách nhanh chóng và chính xác. Kanban giúp giám sát và quản lý quá trình thực hiện các công việc trong một dự án, giúp cho các thành viên trong dự án có thể hiểu rõ hơn về quá trình thực hiện công việc và đảm bảo rằng công việc được thực hiện đúng cách và trong thời gian hợp lý.

Tóm lại, Scrum và Kanban là hai khái niệm quan trọng trong quản lý dự án, giúp cho việc quản lý dự án hiệu quả hơn và giúp các thành viên trong dự án có thể hoàn thành công việc một cách nhanh chóng và chính xác.


21 May 2023

Ivy trong Angular là gì?

Rendering engine

Công cụ kết xuất (Rendering engine) là một phần mềm hoặc chương trình bên trong trình duyệt phân tích cú pháp và biến đổi mã HTML và CSS để trình duyệt có thể hiển thị.


Công cụ trình duyệt biến đổi CSS và JS và hiển thị kết quả ra màn hình

Tuy nhiên, các trình duyệt không thể hiển thị mã HTML và CSS đến từ Angular hoặc bất kỳ khung nào khác vì HTML và CSS không thuần túy (chúng có thể nằm trong các mẫu hoặc thành phần tùy chỉnh). Do đó, cần có thứ gì đó để chuyển đổi các thành phần này thành thứ mà trình duyệt có thể hiển thị. Đây là nơi công cụ kết xuất Angular xuất hiện.

Ivy rendering engine

Ivy là công cụ kết xuất biến mã Angular (mẫu HTML + TS) thành HTML và JavaScript thuần túy mà trình duyệt hiểu được. Khi quá trình chuyển đổi này hoàn tất, trình duyệt có thể hiểu và hiển thị HTML và JavaScript kết quả để hiển thị nội dung, như được minh họa trong hình trên.

Ivy là bản viết lại hoàn chỉnh của View Engine—công cụ mặc định để xây dựng các ứng dụng Angular từ Angular 4 cho đến khi nó ngừng hoạt động trong Angular 8. Đây là công cụ thứ ba kể từ khi tạo ra Angular vào năm 2016 và Angular đã xuất xưởng cùng với Ivy kể từ khi giới thiệu của Angular 9 cho đến ngày nay.


Tóm tắt về cách thức hoạt động của Ivy

Ivy Lợi ích khi sử dụng Ivy

Ivy đi kèm với nhiều cải tiến, bao gồm:

Biên dịch AOT: Ahead of Time (AOT) biên dịch một ứng dụng trước khi chuyển sang môi trường thời gian chạy như trình duyệt. AOT giảm tải cho trình duyệt vì nó biên dịch trước ứng dụng trước khi đến trình duyệt.

Kích thước gói nhỏ hơn: Kích thước gói là lượng mã mà trình duyệt sẽ phải tải xuống để tải ứng dụng của bạn. Ivy giảm kích thước gói thông qua AOT và tree-shaking.

Cải thiện tốc độ: Các ứng dụng góc cạnh tải nhanh hơn trước nhờ kích thước gói nhỏ hơn và khả năng rung cây của Ivy.

Ivy nhanh hơn nhiều so với người tiền nhiệm của nó bởi vì nó hiện được cung cấp với trình biên dịch trước thời hạn (AOT) theo mặc định. AOT cho phép trình duyệt tải ứng dụng nhanh chóng mà không cần tải xuống trình biên dịch và tự xây dựng ứng dụng.

Biên dịch Just-in-time (JIT) là cơ chế biên dịch mặc định trong các phiên bản trước của Angular , qua đó trình duyệt sẽ tải xuống trình biên dịch và xây dựng ứng dụng. Tuy nhiên, quá trình này không hiệu quả vì nó chậm và gây gánh nặng cho trình duyệt.

Lưu ý: Angular chỉ có một trình biên dịch. AOT và JIT chỉ đề cập đến cách thức và thời điểm bạn sử dụng trình biên dịch.

  • Với AOT, trình biên dịch sẽ chạy khi xây dựng Build.
  • Với JIT, trình biên dịch chạy trong thời gian chạy Runtime.

Công cụ Ivy là một phần quan trọng của Angular. Do đó, có một ý tưởng cơ bản về những gì nó làm là quan trọng.

 

BACK TO TOP

Xuống cuối trang