• 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

22 June 2023

Non-blocking và Blocking

Non-blockingblocking 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 height được đo chỉ bao gồm content chứ không bao gồm padding, border hoặc margin.

paddingborder 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 height bao gồm padding 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.

18 May 2023

Ng-Content Switch Case - Angular

08 April 2023

Javascript Basic

08 January 2023

Draw and Fill a polygon and triangle in HTML5

Draw Polygon <Vẽ hình đa giác>
2023
<!DOCTYPE HTML>
<html>
<head>
<title>An example to draw an polygon</title>
<script type="text/javascript">
    function drawPolygon() {
        var canvas = document.getElementById('canvasbox');
        if (canvas.getContext) {
            var objctx = canvas.getContext('2d');
 
            objctx.beginPath();
            objctx.moveTo(75, 50);
            objctx.lineTo(175, 50);
            objctx.lineTo(200, 75);
            objctx.lineTo(175, 100);
            objctx.lineTo(75, 100);
            objctx.lineTo(50, 75);
            objctx.closePath();
            objctx.fillStyle = "rgb(200,0,0)";
            objctx.fill();
 
 
        } else {
            alert('You need HTML5 compatible browser to see this demo.');
        }
    }
</script>
</head>
<body onload="drawPolygon();">
   <canvas id="canvasbox"></canvas>
</body>
</html>
Draw Triangle <Vẽ hình tam giác>
2023
<!DOCTYPE HTML>
<html>
<head>
<title>An example to draw an polygon</title>
<script type="text/javascript">
    function drawPolygon() {
        var canvas = document.getElementById('canvasbox');
        if (canvas.getContext) {
            var objctx = canvas.getContext('2d');
            objctx.beginPath();
            // polygon [x,y, x,y, x,y.....];
objctx.moveTo(50, 50); //x,y objctx.lineTo(50, 125); objctx.lineTo(150, 125); objctx.closePath(); objctx.stroke(); } else { alert('You need HTML5 compatible browser to see this demo.'); } } </script> </head> <body onload="drawPolygon();"> <canvas id="canvasbox"></canvas> </body> </html>

beginPath() Mỗi khi phương thức này được gọi, danh sách sẽ được đặt lại và chúng ta có thể bắt đầu vẽ các hình mới.

moveTo(x, y) điều này sẽ đặt vị trí khởi động của đường dẫn. Trong ví dụ trên, chúng ta đang vẽ đường đi từ (75,50) điểm.

lineTo(x, y) sẽ vẽ đường thẳng trong đó x và y sẽ là điểm cuối. Phương thức này có hai đối số – x và y, – là tọa độ của điểm cuối và điểm bắt đầu của đường phụ thuộc vào điểm cuối của đường dẫn được vẽ trước đó hoặc tọa độ di chuyển tới(x,y). Ví dụ objctx.lineTo(175, 50) sẽ vẽ đường thẳng từ điểm đầu (75,50) đến điểm cuối (175,50).

closePath() sẽ đóng hình bằng cách vẽ một đường thẳng từ điểm hiện tại đến điểm bắt đầu. Nếu hình đã được đóng hoặc chỉ có một điểm trong danh sách, chức năng này sẽ không làm gì.

fillStyle sẽ đặt thuộc tính nền nhưng sẽ không lấp đầy.

fill() sẽ tô hình dạng theo fillStyle. Nếu không có kiểu tô màu thì nó sẽ tô màu đen.

Ví dụ ta có toạ độ của qrcode sau khi quét camera -> Ta cần vẽ đa giác
2023
// Draw the barcodes area.
scanner.onFrameRead = results => {
  // Reset the width and height and empty the canvas
  canvas.width = video.videoWidth;
  canvas.height = video.videoHeight;
  let ctx = canvas.getContext('2d');
  // Set color
  ctx.fillStyle = 'rgba(254,180,32,0.3)';
  for(var result of results){
    // Get localization 
    // polygon [x,y, x,y, x,y.....];
    let x1 = result.LocalizationResult.X1;
    let x2 = result.LocalizationResult.X2;
    let x3 = result.LocalizationResult.X3;
    let x4 = result.LocalizationResult.X4;
    let y1 = result.LocalizationResult.Y1;
    let y2 = result.LocalizationResult.Y2;
    let y3 = result.LocalizationResult.Y3;
    let y4 = result.LocalizationResult.Y4;
    // Draw
    ctx.beginPath();
    ctx.moveTo(x1, y1);
    ctx.lineTo(x2, y2);
    ctx.lineTo(x3, y3);
    ctx.lineTo(x4, y4);
    ctx.fill();
  }
};
DEMO nhanh 
2023
<!DOCTYPE html>
<html>
  <body>
  
    <canvas id="canvas" width="1116" height="837" style="border:3px solid #000;">
    Your browser does not support the HTML canvas tag.</canvas>
    
    <script>
        var canvas = document.getElementById('canvas');
        var ctx = canvas.getContext('2d');
        
        // polygon [x,y, x,y, x,y.....];
        var poly = [0, 294.69374999999997, 0, 294, 256, 0, 256.33124999999995, 0] ;
        
        // copy array
        var shape = poly.slice(0);
        
        ctx.fillStyle = '#f00'
        ctx.beginPath();
        ctx.moveTo(shape.shift(), shape.shift());
        while(shape.length) {
          ctx.lineTo(shape.shift(), shape.shift());
        }
        ctx.closePath();
        ctx.fill();
        ctx.stroke();
    </script>
  
  </body>
</html>


22 December 2022

sudo: apt: command not found



Advanced Package Tool (APT) là một công cụ dòng lệnh được sử dụng để tương tác dễ dàng với hệ thống đóng gói dpkg. APT là phương pháp lý tưởng được sử dụng để quản lý phần mềm trong các bản phân phối Linux dựa trên Debian, chẳng hạn như Ubuntu. Nó quản lý các phần phụ thuộc một cách hiệu quả, duy trì các tệp cấu hình lớn và xử lý đúng cách các nâng cấp và hạ cấp để đảm bảo tính ổn định của hệ thống. Về bản thân, dpkg không xử lý các phụ thuộc đúng cách.

Trong các bản phân phối dựa trên Debian/Ubuntu, việc quản lý phần mềm được thực hiện thông qua tiện ích apt, đây là sự thay thế gần đây cho các tiện ích apt-get và apt-cache. Các lệnh được sử dụng nhiều nhất bao gồm:

CommandDescription
apt listList packages
apt searchSearch in descriptions
apt installInstall a package
apt showShow package details
apt removeRemove a package
apt updateUpdate catalog of available packages
apt upgradeUpgrade the installed software
apt edit-sourcesEdit the repository configuration

Nếu bạn gặp phải lỗi dưới đây khi chạy lệnh apt:

apt: command not found

bạn có thể thử cài đặt gói apt theo lựa chọn phân phối của mình.

DistributionCommand
Debianapt-get install apt
Ubuntuapt-get install apt
Arch Linuxpacman -S apt
Kali Linuxapt-get install apt
CentOSyum install apt
Fedoradnf install apt
Raspbianapt-get install apt

Ví dụ về lệnh apt

1. Cập nhật danh sách các gói và phiên bản có sẵn (bạn nên chạy phần này trước các lệnh `apt` khác):

$ sudo apt update

2. Tìm kiếm một gói nhất định:

$ apt search package

3. Hiển thị thông tin cho một gói:

$ apt show package

4. Cài đặt gói hoặc cập nhật gói lên phiên bản mới nhất hiện có:

$ sudo apt install package

5. Xóa một gói (thay vào đó, sử dụng `purge` cũng xóa các tệp cấu hình của nó):

$ sudo apt remove package

6. Nâng cấp tất cả các gói đã cài đặt lên phiên bản mới nhất hiện có của chúng:

$ sudo apt upgrade

7. Liệt kê tất cả các gói:

$ apt list

8. Liệt kê các gói đã cài đặt: 

$ apt list --installed

 

BACK TO TOP

Xuống cuối trang