<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Kaka Notes</title><link>https://kaka-notes.netlify.app/</link><description>Recent content on Kaka Notes</description><generator>Hugo</generator><language>en-us</language><lastBuildDate>Tue, 02 Dec 2025 06:01:28 +0700</lastBuildDate><atom:link href="https://kaka-notes.netlify.app/index.xml" rel="self" type="application/rss+xml"/><item><title>Nest Tip Cac Cach Su Dung Middleware Trong Nest</title><link>https://kaka-notes.netlify.app/posts/nest-tip-cac-cach-su-dung-middleware-trong-nest/</link><pubDate>Tue, 02 Dec 2025 06:01:28 +0700</pubDate><guid>https://kaka-notes.netlify.app/posts/nest-tip-cac-cach-su-dung-middleware-trong-nest/</guid><description>&lt;hr>
&lt;h2 id="1-middleware-là-gì">1. Middleware là gì?&lt;/h2>
&lt;p>Middleware là một hàm được gọi &lt;strong>trước&lt;/strong> route handler. Nó có quyền truy cập vào đối tượng &lt;code>Request&lt;/code>, &lt;code>Response&lt;/code> và hàm &lt;code>next()&lt;/code>.&lt;/p>
&lt;p>&lt;strong>Nhiệm vụ chính:&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>Thay đổi request/response object (ví dụ: gắn thêm user vào request).&lt;/li>
&lt;li>Kết thúc request sớm (trả về response ngay lập tức mà không vào Controller).&lt;/li>
&lt;li>Ghi log, nén data, bảo mật (Helmet, CORS&amp;hellip;).&lt;/li>
&lt;/ul>
&lt;hr>
&lt;h2 id="2-cách-1-class-middleware-khuyên-dùng">2. Cách 1: Class Middleware (Khuyên dùng)&lt;/h2>
&lt;p>Cách này chuẩn NestJS, hỗ trợ &lt;strong>Dependency Injection (DI)&lt;/strong> (tức là có thể Inject Service khác vào trong Middleware để dùng).&lt;/p></description></item><item><title>[NestJS Tips] Đừng "nhét" tất cả vào main.ts nếu muốn Scale hệ thống!</title><link>https://kaka-notes.netlify.app/posts/nest-tip-dung-xu-ly-tai-main-trong-nest-hay-lam-trong-module/</link><pubDate>Mon, 01 Dec 2025 22:22:56 +0700</pubDate><guid>https://kaka-notes.netlify.app/posts/nest-tip-dung-xu-ly-tai-main-trong-nest-hay-lam-trong-module/</guid><description>&lt;p>Khi mới học NestJS, chúng ta thường thấy các tutorial hướng dẫn đăng ký Global Pipes, Interceptors hay Filters ngay trong file &lt;code>main.ts&lt;/code> như thế này:&lt;/p>



&lt;div class="code-block-wrapper" data-code="// main.ts - Cách làm thường thấy (nhưng chưa tối ưu)
async function bootstrap() {
 const app = await NestFactory.create(AppModule);

 // Đăng ký thủ công
 app.useGlobalPipes(new ValidationPipe());
 app.useGlobalInterceptors(new TransformInterceptor(new Reflector())); // Phải new tay

 await app.listen(3000);
}">
 
 &lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-typescript" data-lang="typescript">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">// main.ts - Cách làm thường thấy (nhưng chưa tối ưu)
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">&lt;/span>&lt;span style="color:#66d9ef">async&lt;/span> &lt;span style="color:#66d9ef">function&lt;/span> &lt;span style="color:#a6e22e">bootstrap() {&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">const&lt;/span> &lt;span style="color:#a6e22e">app&lt;/span> &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#66d9ef">await&lt;/span> &lt;span style="color:#a6e22e">NestFactory&lt;/span>.&lt;span style="color:#a6e22e">create&lt;/span>(&lt;span style="color:#a6e22e">AppModule&lt;/span>);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#75715e">// Đăng ký thủ công
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">&lt;/span> &lt;span style="color:#a6e22e">app&lt;/span>.&lt;span style="color:#a6e22e">useGlobalPipes&lt;/span>(&lt;span style="color:#66d9ef">new&lt;/span> &lt;span style="color:#a6e22e">ValidationPipe&lt;/span>());
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#a6e22e">app&lt;/span>.&lt;span style="color:#a6e22e">useGlobalInterceptors&lt;/span>(&lt;span style="color:#66d9ef">new&lt;/span> &lt;span style="color:#a6e22e">TransformInterceptor&lt;/span>(&lt;span style="color:#66d9ef">new&lt;/span> &lt;span style="color:#a6e22e">Reflector&lt;/span>())); &lt;span style="color:#75715e">// Phải new tay
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">await&lt;/span> &lt;span style="color:#a6e22e">app&lt;/span>.&lt;span style="color:#a6e22e">listen&lt;/span>(&lt;span style="color:#ae81ff">3000&lt;/span>);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>}&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>
&lt;/div>
&lt;p>Cách này chạy ổn với dự án nhỏ (pet project). Nhưng khi hệ thống cần mở rộng (Scale) hoặc cần logic phức tạp hơn, cách làm này sẽ bộc lộ điểm yếu chết người.&lt;/p></description></item><item><title>TÀI LIỆU TOÀN TẬP VỀ NESTJS CLI</title><link>https://kaka-notes.netlify.app/posts/huong-dan-bat-dau-voi-nestjs-cli/</link><pubDate>Mon, 01 Dec 2025 20:15:09 +0700</pubDate><guid>https://kaka-notes.netlify.app/posts/huong-dan-bat-dau-voi-nestjs-cli/</guid><description>&lt;h2 id="1-cài-đặt-và-kiểm-tra">1. Cài đặt và Kiểm tra&lt;/h2>
&lt;p>Trước khi bắt đầu, bạn cần cài đặt CLI ở phạm vi toàn cầu (global).&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Cài đặt:&lt;/strong>



&lt;div class="code-block-wrapper" data-code="npm install -g @nestjs/cli">
 
 &lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>npm install -g @nestjs/cli&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>
&lt;/div>
&lt;/li>
&lt;li>&lt;strong>Kiểm tra version:&lt;/strong>



&lt;div class="code-block-wrapper" data-code="nest --version">
 
 &lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>nest --version&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>
&lt;/div>
&lt;/li>
&lt;li>&lt;strong>Xem trợ giúp tổng quát:&lt;/strong>



&lt;div class="code-block-wrapper" data-code="nest --help">
 
 &lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>nest --help&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>
&lt;/div>
&lt;/li>
&lt;/ul>
&lt;hr>
&lt;h2 id="2-tạo-dự-án-scaffolding">2. Tạo Dự án (Scaffolding)&lt;/h2>
&lt;p>Lệnh &lt;code>new&lt;/code> dùng để khởi tạo một dự án mới hoàn toàn.&lt;/p>
&lt;h3 id="cú-pháp-cơ-bản">Cú pháp cơ bản&lt;/h3>



&lt;div class="code-block-wrapper" data-code="nest new &amp;lt;project-name&amp;gt;">
 
 &lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>nest new &amp;lt;project-name&amp;gt;&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>
&lt;/div>
&lt;h3 id="các-tùy-chọn-options-thường-dùng">Các tùy chọn (Options) thường dùng&lt;/h3>
&lt;table>
 &lt;thead>
 &lt;tr>
 &lt;th style="text-align: left">Cờ (Flag)&lt;/th>
 &lt;th style="text-align: left">Mô tả&lt;/th>
 &lt;/tr>
 &lt;/thead>
 &lt;tbody>
 &lt;tr>
 &lt;td style="text-align: left">&lt;code>--strict&lt;/code>&lt;/td>
 &lt;td style="text-align: left">Bật chế độ strict mode của TypeScript ngay từ đầu.&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td style="text-align: left">&lt;code>--skip-git&lt;/code>&lt;/td>
 &lt;td style="text-align: left">Không khởi tạo Git repository (&lt;code>.git&lt;/code>).&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td style="text-align: left">&lt;code>--package-manager npm&lt;/code>&lt;/td>
 &lt;td style="text-align: left">Chỉ định dùng &lt;code>npm&lt;/code>, &lt;code>yarn&lt;/code> hoặc &lt;code>pnpm&lt;/code> (bỏ qua bước hỏi).&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td style="text-align: left">&lt;code>--language js&lt;/code>&lt;/td>
 &lt;td style="text-align: left">Tạo dự án bằng JavaScript thuần (mặc định là TypeScript).&lt;/td>
 &lt;/tr>
 &lt;/tbody>
&lt;/table>
&lt;p>&lt;strong>Ví dụ:&lt;/strong>&lt;/p></description></item><item><title>Nguyên Tắc Cơ Bản Trong Việc Tập Sàn Chậu Trong Phục Hồi Chức Năng</title><link>https://kaka-notes.netlify.app/posts/nguyen-tac-co-ban-trong-viec-tap-san-chau-cua-phuc-hoi-chuc-nang/</link><pubDate>Sun, 30 Nov 2025 14:42:30 +0700</pubDate><guid>https://kaka-notes.netlify.app/posts/nguyen-tac-co-ban-trong-viec-tap-san-chau-cua-phuc-hoi-chuc-nang/</guid><description>&lt;h2 id="nguyên-tắc-vàng-khi-tập-cơ-sàn-chậu-thở-ra-co-vào--hít-vào-thả-lỏng">&lt;strong>Nguyên Tắc Vàng Khi Tập Cơ Sàn Chậu: “Thở Ra Co Vào – Hít Vào Thả Lỏng”&lt;/strong>&lt;/h2>
&lt;p>&lt;em>(Dành cho người mất kiểm soát tiểu tiện sau sinh, sau tai biến hoặc yếu sàn chậu)&lt;/em>&lt;/p>
&lt;p>Tập cơ sàn chậu (pelvic floor) là nền tảng quan trọng giúp cải thiện tiểu són, tiểu gấp, sa tạng chậu và nhiều vấn đề hậu sản hoặc sau chấn thương thần kinh. Tuy nhiên, &lt;strong>hầu hết người mới tập đều làm sai cách&lt;/strong>, dẫn đến tập mãi không hiệu quả.&lt;/p></description></item><item><title>Lộ Trình Học Linux CLI</title><link>https://kaka-notes.netlify.app/posts/251005-cach-de-tiep-can-voi-terminal-linux/</link><pubDate>Sun, 05 Oct 2025 00:00:00 +0000</pubDate><guid>https://kaka-notes.netlify.app/posts/251005-cach-de-tiep-can-voi-terminal-linux/</guid><description>&lt;p>Việc ưu tiên học Linux qua giao diện dòng lệnh (CLI) trên Terminal là một định hướng rất đúng đắn và hiệu quả để có thể hiểu sâu và làm chủ hệ điều hành này. Dưới đây là lộ trình học chi tiết từ cơ bản đến nâng cao, giúp bạn xây dựng nền tảng vững chắc.&lt;/p>
&lt;h3 id="giai-đoạn-1-nhập-môn-và-những-lệnh-cơ-bản-nhất">Giai đoạn 1: Nhập môn và những lệnh cơ bản nhất&lt;/h3>
&lt;p>Ở giai đoạn này, mục tiêu là làm quen với Terminal và thực hiện các thao tác cơ bản nhất trên hệ thống tệp tin.&lt;/p></description></item><item><title>Huong Dan Tao Key Pair Ssh</title><link>https://kaka-notes.netlify.app/posts/huong-dan-tao-key-pair-ssh/</link><pubDate>Sat, 05 Jul 2025 14:02:17 +0700</pubDate><guid>https://kaka-notes.netlify.app/posts/huong-dan-tao-key-pair-ssh/</guid><description>&lt;h2 id="đây-là-hướng-dẫn-chi-tiết-từng-bước-để-tạo-và-sử-dụng-cặp-khóa-ssh-ssh-key-pair-cho-việc-kết-nối-an-toàn-giữa-máy-client-máy-tính-của-bạn-và-server-áp-dụng-cho-cả-trường-hợp-chung-như-đăng-nhập-vps-và-trường-hợp-riêng-cho-git-github-gitlab-bitbucket">Đây là hướng dẫn chi tiết từng bước để tạo và sử dụng cặp khóa SSH (SSH key pair) cho việc kết nối an toàn giữa máy client (máy tính của bạn) và server, áp dụng cho cả trường hợp chung (như đăng nhập VPS) và trường hợp riêng cho Git (GitHub, GitLab, Bitbucket).&lt;/h2>
&lt;h3 id="phần-a-hiểu-về-ssh-key">Phần A: Hiểu về SSH Key&lt;/h3>
&lt;p>SSH Key là một phương thức xác thực an toàn hơn nhiều so với mật khẩu. Nó bao gồm một cặp khóa:&lt;/p></description></item><item><title>Hướng dẫn thay đổi DNS bằng cli trên linux.</title><link>https://kaka-notes.netlify.app/posts/huong-dan-thay-doi-dns-tren-linux/</link><pubDate>Mon, 14 Apr 2025 00:00:00 +0000</pubDate><guid>https://kaka-notes.netlify.app/posts/huong-dan-thay-doi-dns-tren-linux/</guid><description>&lt;p>Dưới đây là hướng dẫn chi tiết để cấu hình DNS tùy chỉnh trên Arch Linux, áp dụng cho cả &lt;strong>systemd-resolved&lt;/strong>, &lt;strong>NetworkManager&lt;/strong>, và &lt;strong>static DNS&lt;/strong>:&lt;/p></description></item><item><title>Cấu trúc và Kiến trúc Dự án Nodejs</title><link>https://kaka-notes.netlify.app/posts/nodejs-folder-structure-3-layer/</link><pubDate>Thu, 06 Feb 2025 00:00:00 +0000</pubDate><guid>https://kaka-notes.netlify.app/posts/nodejs-folder-structure-3-layer/</guid><description>&lt;p>Dưới đây là bản dịch tiếng Việt cho phụ đề video:&lt;/p>
&lt;hr>
&lt;p>**03. Cấu trúc và Kiến trúc Dự án Node.js **&lt;/p>
&lt;p>&lt;strong>0:00&lt;/strong>&lt;br>
Nếu bạn đã nắm vững kiến thức cơ bản về Node.js và từng xây dựng các ứng dụng nhỏ như API, đây là lúc bạn cần học cách thiết kế kiến trúc và tổ chức dự án một cách chuyên nghiệp.&lt;/p>
&lt;hr>
&lt;h3 id="three-layer-approach-kiến-trúc-3-tầng">&lt;strong>Three-Layer Approach (Kiến trúc 3 tầng)&lt;/strong>&lt;/h3>
&lt;p>&lt;strong>0:12&lt;/strong>&lt;/p></description></item><item><title>Cách sử dụng Đa luồng với "worker threads" trong Node.js</title><link>https://kaka-notes.netlify.app/posts/cach-su-dung-da-luong-trong-nodejs-voi-worker-threads/</link><pubDate>Mon, 06 Jan 2025 00:00:00 +0000</pubDate><guid>https://kaka-notes.netlify.app/posts/cach-su-dung-da-luong-trong-nodejs-voi-worker-threads/</guid><description>&lt;p>Dưới đây là bản dịch tiếng Việt cho phụ đề video:&lt;/p>
&lt;hr>
&lt;p>&lt;strong>Cách sử dụng Đa luồng với &amp;ldquo;worker threads&amp;rdquo; trong Node.js?&lt;/strong>&lt;/p>
&lt;p>&lt;strong>0:00&lt;/strong>&lt;br>
Trong bài viết này, chúng ta sẽ xây dựng một ứng dụng Node.js với một tác vụ ngốn CPU làm tắc nghẽn luồng chính.&lt;/p>
&lt;p>&lt;strong>0:05&lt;/strong>&lt;br>
Sau đó, nhờ khả năng đa luồng của Node và &amp;ldquo;worker threads&amp;rdquo;, chúng ta sẽ chuyển bớt phần tính toán nặng sang các luồng khác để tăng tốc ứng dụng.&lt;/p></description></item><item><title>Hướng dẫn cài đặt Syncthing trên Ubuntu</title><link>https://kaka-notes.netlify.app/posts/huong-dan-cai-dat-syncthing-tren-ubuntu/</link><pubDate>Sun, 05 Jan 2025 00:00:00 +0000</pubDate><guid>https://kaka-notes.netlify.app/posts/huong-dan-cai-dat-syncthing-tren-ubuntu/</guid><description>&lt;p>Hướng dẫn cài đặt Syncthing trên Ubuntu:&lt;/p>
&lt;h3 id="bước-1-cập-nhật-hệ-thống">Bước 1: Cập nhật hệ thống&lt;/h3>
&lt;p>Mở terminal và chạy lệnh sau để cập nhật danh sách gói:&lt;/p>



&lt;div class="code-block-wrapper" data-code="sudo apt update
sudo apt upgrade">
 
 &lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>sudo apt update
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>sudo apt upgrade&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>
&lt;/div>
&lt;h3 id="bước-2-cài-đặt-syncthing">Bước 2: Cài đặt Syncthing&lt;/h3>
&lt;ol>
&lt;li>
&lt;p>&lt;strong>Cài đặt gói cần thiết&lt;/strong>:&lt;/p>



&lt;div class="code-block-wrapper" data-code="sudo apt install -y apt-transport-https curl">
 
 &lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>sudo apt install -y apt-transport-https curl&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>
&lt;/div>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>Thêm kho lưu trữ của Syncthing&lt;/strong>:&lt;/p>



&lt;div class="code-block-wrapper" data-code="echo &amp;#34;deb https://apt.syncthing.net/ syncthing stable&amp;#34; | sudo tee /etc/apt/sources.list.d/syncthing.list">
 
 &lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>echo &lt;span style="color:#e6db74">&amp;#34;deb https://apt.syncthing.net/ syncthing stable&amp;#34;&lt;/span> | sudo tee /etc/apt/sources.list.d/syncthing.list&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>
&lt;/div>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>Thêm khóa GPG&lt;/strong>:&lt;/p></description></item><item><title>Những tùy chọn Tsconfig.json Essential bạn nên sử dụng</title><link>https://kaka-notes.netlify.app/posts/nhung-tuy-chon-tsconfig_json/</link><pubDate>Sun, 05 Jan 2025 00:00:00 +0000</pubDate><guid>https://kaka-notes.netlify.app/posts/nhung-tuy-chon-tsconfig_json/</guid><description>&lt;p>&lt;strong>tsconfig.json là gì và tại sao nó quan trọng?&lt;/strong>&lt;br>
Tệp &lt;strong>tsconfig.json&lt;/strong> là một phần quan trọng trong bất kỳ dự án TypeScript nào. Nó hướng dẫn trình biên dịch cách chuyển đổi mã TypeScript của bạn thành JavaScript. Bằng cách thiết lập tệp này, bạn có thể kiểm soát các yếu tố như mức độ nghiêm ngặt của kiểm tra lỗi và định dạng đầu ra. Điều này rất quan trọng để quản lý hiệu quả các vấn đề trong môi trường production thực tế.&lt;/p></description></item><item><title>Cảm xúc sợ hãi.</title><link>https://kaka-notes.netlify.app/posts/cam-xuc-so-hai/</link><pubDate>Sat, 04 Jan 2025 00:00:00 +0000</pubDate><guid>https://kaka-notes.netlify.app/posts/cam-xuc-so-hai/</guid><description>&lt;h3 id="cảm-xúc-sợ-hãi">Cảm Xúc Sợ Hãi&lt;/h3>
&lt;p>&lt;strong>Cảm xúc sợ hãi&lt;/strong> là một phản ứng tự nhiên của cơ thể đối với những tình huống mà chúng ta cho là nguy hiểm hoặc đe dọa. Đây là một cảm xúc mạnh mẽ, có thể giúp con người bảo vệ bản thân khỏi nguy hiểm.&lt;/p>
&lt;h4 id="nguyên-nhân-dẫn-đến-cảm-xúc-sợ-hãi">Nguyên Nhân Dẫn Đến Cảm Xúc Sợ Hãi&lt;/h4>
&lt;ol>
&lt;li>&lt;strong>Nguy cơ Thực Tế&lt;/strong>: Khi đối mặt với nguy hiểm cụ thể, như gặp một con thú dữ hoặc đứng trước một tình huống nguy hiểm.&lt;/li>
&lt;li>&lt;strong>Kinh nghiệm Quá Khứ&lt;/strong>: Những trải nghiệm tiêu cực trong quá khứ có thể khiến người ta cảm thấy sợ hãi trong các tình huống tương tự trong tương lai.&lt;/li>
&lt;li>&lt;strong>Sự Không Biết&lt;/strong>: Thiếu thông tin hoặc kiến thức về một tình huống có thể tạo ra cảm giác lo lắng và sợ hãi.&lt;/li>
&lt;li>&lt;strong>Mô Hình Học Tập&lt;/strong>: Quan sát người khác phản ứng với một tình huống có thể khiến trẻ em hoặc người lớn cũng cảm thấy sợ hãi.&lt;/li>
&lt;/ol>
&lt;h4 id="tiến-trình-xảy-ra-cảm-xúc-sợ-hãi">Tiến Trình Xảy Ra Cảm Xúc Sợ Hãi&lt;/h4>
&lt;ol>
&lt;li>&lt;strong>Nhận Diện Nguy Cơ&lt;/strong>: Cảm giác sợ hãi thường bắt đầu khi một người nhận thấy một mối đe dọa hoặc nguy cơ.&lt;/li>
&lt;li>&lt;strong>Phản Ứng Cơ Thể&lt;/strong>: Cơ thể sẽ kích hoạt hệ thống &amp;ldquo;chiến đấu hay bỏ chạy&amp;rdquo; (fight or flight), giải phóng hormone như adrenaline, làm tăng nhịp tim, huyết áp và năng lượng.&lt;/li>
&lt;li>&lt;strong>Cảm Nhận Tâm Lý&lt;/strong>: Người trải nghiệm sẽ cảm thấy lo lắng, hồi hộp, và có thể xuất hiện các triệu chứng như đổ mồ hôi hoặc run rẩy.&lt;/li>
&lt;li>&lt;strong>Hành Động&lt;/strong>: Cuối cùng, người đó có thể phản ứng bằng cách tránh xa tình huống gây sợ hãi hoặc tìm kiếm sự an toàn.&lt;/li>
&lt;/ol>
&lt;h4 id="cách-giảm-sợ-hãi-và-cân-bằng-cảm-xúc">Cách Giảm Sợ Hãi và Cân Bằng Cảm Xúc&lt;/h4>
&lt;ol>
&lt;li>&lt;strong>Nhận Diện Cảm Xúc&lt;/strong>: Dạy trẻ nhận diện cảm xúc sợ hãi và chấp nhận nó là phản ứng tự nhiên.&lt;/li>
&lt;li>&lt;strong>Thảo Luận Về Sợ Hãi&lt;/strong>: Khuyến khích trẻ nói về những gì làm chúng sợ và giải thích lý do vì sao những điều đó không phải lúc nào cũng nguy hiểm.&lt;/li>
&lt;li>&lt;strong>Kỹ Thuật Thở Sâu&lt;/strong>: Dạy trẻ cách thở sâu để giúp bình tĩnh lại khi cảm thấy sợ hãi.&lt;/li>
&lt;li>&lt;strong>Tạo Môi Trường An Toàn&lt;/strong>: Xây dựng một môi trường nơi trẻ cảm thấy an toàn để giảm bớt cảm giác lo lắng.&lt;/li>
&lt;li>&lt;strong>Thực Hành Giải Quyết Vấn Đề&lt;/strong>: Hướng dẫn trẻ cách đối phó với những tình huống mà chúng sợ hãi thông qua việc giải quyết vấn đề cụ thể.&lt;/li>
&lt;li>&lt;strong>Tiếp Cận Từng Bước&lt;/strong>: Dẫn dắt trẻ tiếp cận những điều khiến chúng sợ hãi một cách từ từ, giúp chúng quen dần với tình huống.&lt;/li>
&lt;li>&lt;strong>Hỗ Trợ Tích Cực&lt;/strong>: Khuyến khích trẻ tự tin và tìm kiếm sự hỗ trợ từ người lớn khi cần.&lt;/li>
&lt;/ol>
&lt;h3 id="kết-luận">Kết Luận&lt;/h3>
&lt;p>Cảm xúc sợ hãi là một phần tự nhiên của cuộc sống, và việc dạy trẻ nhận diện và quản lý cảm xúc này sẽ giúp chúng phát triển khả năng đối phó tốt hơn trong tương lai.&lt;/p></description></item><item><title>Cách tạo nhanh dự án python và quản lý dependencies.</title><link>https://kaka-notes.netlify.app/posts/cach-tao-nhanh-du-an-python-va-dependencies/</link><pubDate>Wed, 01 Jan 2025 00:00:00 +0000</pubDate><guid>https://kaka-notes.netlify.app/posts/cach-tao-nhanh-du-an-python-va-dependencies/</guid><description>&lt;ul>
&lt;li>Có rất nhiều công cụ để tạo và quản lý 1 dự án python khác nhau như: poetry, pipenv, conda, &amp;hellip;&lt;/li>
&lt;li>Nhưng việc cài đặt các công cụ đó thì mất thời gian, đặc biệt là cho những người dùng nhiều máy tính cũng như dùng chung cho 1 team.&lt;/li>
&lt;li>Vì vậy tôi sẽ thực hiện việc trên nhưng không cần cài đặt bất kỳ công cụ nào mà tận dụng các package có sẵn của python để thực hiện.&lt;/li>
&lt;li>Dùng pip + venv&lt;/li>
&lt;/ul>
&lt;h3 id="option-phần-này-là-bổ-sung-cho-cách-dùng-pip--venv">Option: phần này là bổ sung cho cách dùng pip + venv:&lt;/h3>
&lt;ul>
&lt;li>Vì cách này ta không thể set up python version nên ta có thể pyenv để quản lý version cho hệ thống&lt;/li>
&lt;li>điều này đã phá vỡ nguyên tắc không cài bất cứ công cụ nào trên máy tính.&lt;/li>
&lt;li>Vì vậy cách này thường áp dụng cho dự án nhỏ và ít phụ thuộc python version.&lt;/li>
&lt;/ul>
&lt;h3 id="cách-triển-khai">Cách triển khai&lt;/h3>
&lt;h4 id="b1-cài-python-nếu-chưa-cài-yêu-cầu-tối-thiểu-để-chạy-python-có-thể-cài-pyenv---rồi-dùng-pyenv-cài-python">B1: Cài python nếu chưa cài (yêu cầu tối thiểu để chạy python, có thể cài pyenv -&amp;gt; rồi dùng pyenv cài python)&lt;/h4>
&lt;h4 id="b2-cài-môi-trường-ảo-dung-venv">B2: cài môi trường ảo dung venv:&lt;/h4>



&lt;div class="code-block-wrapper" data-code="python -m venv my_venv">
 
 &lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-sh" data-lang="sh">&lt;span style="display:flex;">&lt;span>python -m venv my_venv&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>
&lt;/div>
&lt;h4 id="b3-activate-môi-trường-lưu-ý-trỏ-đúng-thư-mục">B3: Activate môi trường: (lưu ý trỏ đúng thư mục)&lt;/h4>



&lt;div class="code-block-wrapper" data-code="source my_venv/bin/activate">
 
 &lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-sh" data-lang="sh">&lt;span style="display:flex;">&lt;span>source my_venv/bin/activate&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>
&lt;/div>
&lt;ul>
&lt;li>có thể kiểm tra version python (python sẽ luôn nằm trong thư mục ảo và cô lập với python hệ thống)&lt;/li>
&lt;/ul>



&lt;div class="code-block-wrapper" data-code="which python
/Users/user/my_project/my_venv/bin/python">
 
 &lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-sh" data-lang="sh">&lt;span style="display:flex;">&lt;span>which python
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>/Users/user/my_project/my_venv/bin/python&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>
&lt;/div>
&lt;ul>
&lt;li>Deactivate khi không dùng:&lt;/li>
&lt;/ul>



&lt;div class="code-block-wrapper" data-code="deactivate">
 
 &lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-sh" data-lang="sh">&lt;span style="display:flex;">&lt;span>deactivate&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>
&lt;/div>
&lt;h4 id="b4-cài-đặt-các-dependencies-bằng-pip">B4: cài đặt các dependencies bằng pip:&lt;/h4>



&lt;div class="code-block-wrapper" data-code="pip install fastapi uvicorn">
 
 &lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-sh" data-lang="sh">&lt;span style="display:flex;">&lt;span>pip install fastapi uvicorn&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>
&lt;/div>
&lt;h4 id="b5-có-thể-xuất-ra-file-requirementtxt-để-chia-sẻ-trong-team">B5: có thể xuất ra file requirement.txt để chia sẻ trong team&lt;/h4>



&lt;div class="code-block-wrapper" data-code="(my_venv)$ pip freeze &amp;gt; requirements.txt
(my_venv)$ cat requirements.txt">
 
 &lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-sh" data-lang="sh">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f92672">(&lt;/span>my_venv&lt;span style="color:#f92672">)&lt;/span>$ pip freeze &amp;gt; requirements.txt
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f92672">(&lt;/span>my_venv&lt;span style="color:#f92672">)&lt;/span>$ cat requirements.txt&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>
&lt;/div>
&lt;h4 id="b6-sử-dụng-lệnh-sau-để-cài-lại-dependencies-khi-chuyển-máy">B6: Sử dụng lệnh sau để cài lại dependencies khi chuyển máy:&lt;/h4>



&lt;div class="code-block-wrapper" data-code="pip install -r requirements.txt">
 
 &lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-sh" data-lang="sh">&lt;span style="display:flex;">&lt;span>pip install -r requirements.txt&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>
&lt;/div></description></item><item><title>Những github cli thường sử dụng.</title><link>https://kaka-notes.netlify.app/posts/nhung-cli-thuong-dung-voi-github/</link><pubDate>Thu, 26 Dec 2024 00:00:00 +0000</pubDate><guid>https://kaka-notes.netlify.app/posts/nhung-cli-thuong-dung-voi-github/</guid><description>&lt;h3 id="xem-danh-sách-10-repo-làm-việc-gần-đây">Xem danh sách 10 repo làm việc gần đây:&lt;/h3>



&lt;div class="code-block-wrapper" data-code="gh repo list --limit 10">
 
 &lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-sh" data-lang="sh">&lt;span style="display:flex;">&lt;span>gh repo list --limit &lt;span style="color:#ae81ff">10&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>
&lt;/div>
&lt;h3 id="xem-repo-cụ-thể">Xem repo cụ thể:&lt;/h3>



&lt;div class="code-block-wrapper" data-code="gh repo view &amp;lt;repository-name&amp;gt;">
 
 &lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-sh" data-lang="sh">&lt;span style="display:flex;">&lt;span>gh repo view &amp;lt;repository-name&amp;gt;&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>
&lt;/div></description></item><item><title>Tổng hợp 7 bước để thiết kế mối quan hệ một-nhiều trong SQL.</title><link>https://kaka-notes.netlify.app/posts/bay-buoc-thiet-ke-moi-quan-he-mot-nhieu/</link><pubDate>Mon, 02 Dec 2024 00:00:00 +0000</pubDate><guid>https://kaka-notes.netlify.app/posts/bay-buoc-thiet-ke-moi-quan-he-mot-nhieu/</guid><description>&lt;p>Dưới đây là tổng hợp 7 bước để thiết kế mối quan hệ một-nhiều cùng với các ví dụ mô hình hóa thông qua sơ đồ:&lt;/p>
&lt;h3 id="bảy-bước-thiết-kế-mối-quan-hệ-một-nhiều">Bảy Bước Thiết Kế Mối Quan Hệ Một-Nhiều&lt;/h3>
&lt;h4 id="1-hiểu-định-nghĩa-mối-quan-hệ-một-nhiều">1. &lt;strong>Hiểu Định Nghĩa Mối Quan Hệ Một-Nhiều&lt;/strong>&lt;/h4>
&lt;ul>
&lt;li>Mối quan hệ một-nhiều xảy ra khi một bản ghi trong bảng đầu tiên có thể liên quan đến nhiều bản ghi trong bảng thứ hai, nhưng một bản ghi trong bảng thứ hai chỉ liên quan đến một bản ghi trong bảng đầu tiên.&lt;/li>
&lt;/ul>
&lt;h4 id="2-viết-ra-những-gì-bạn-muốn-lưu-trữ">2. &lt;strong>Viết Ra Những Gì Bạn Muốn Lưu Trữ&lt;/strong>&lt;/h4>
&lt;ul>
&lt;li>Ví dụ: Lưu trữ thông tin khách hàng và các đơn hàng mà họ đã thực hiện.&lt;/li>
&lt;/ul>
&lt;h4 id="3-xác-định-các-đối-tượng">3. &lt;strong>Xác Định Các Đối Tượng&lt;/strong>&lt;/h4>
&lt;ul>
&lt;li>Ví dụ:
&lt;ul>
&lt;li>Bảng Khách Hàng và Bảng Đơn Hàng.&lt;/li>
&lt;li>Bảng Xe và Bảng Showroom.&lt;/li>
&lt;li>Bảng Sinh Viên và Bảng Khóa Học.&lt;/li>
&lt;/ul>
&lt;/li>
&lt;/ul>
&lt;h4 id="4-xác-định-mối-quan-hệ">4. &lt;strong>Xác Định Mối Quan Hệ&lt;/strong>&lt;/h4>
&lt;ul>
&lt;li>Đặt câu hỏi: &amp;ldquo;Liệu đối tượng một có nhiều đối tượng hai không, hay đối tượng hai có nhiều đối tượng một?&amp;rdquo;&lt;/li>
&lt;li>Ví dụ: Một khách hàng có nhiều đơn hàng, nhưng một đơn hàng chỉ có một khách hàng.&lt;/li>
&lt;/ul>
&lt;h4 id="5-vẽ-sơ-đồ">5. &lt;strong>Vẽ Sơ Đồ&lt;/strong>&lt;/h4>
&lt;ul>
&lt;li>Sử dụng bút và giấy hoặc công cụ vẽ sơ đồ như Lucidchart để vẽ hai bảng mà không cần cột.&lt;/li>
&lt;/ul>
&lt;h4 id="6-vẽ-đường-liên-kết-giữa-hai-bảng">6. &lt;strong>Vẽ Đường Liên Kết Giữa Hai Bảng&lt;/strong>&lt;/h4>
&lt;ul>
&lt;li>Vẽ một đường thẳng giữa hai bảng để chỉ ra mối quan hệ giữa chúng.&lt;/li>
&lt;/ul>
&lt;h4 id="7-thêm-ký-hiệu-để-chỉ-ra-mối-quan-hệ-một-nhiều">7. &lt;strong>Thêm Ký Hiệu Để Chỉ Ra Mối Quan Hệ Một-Nhiều&lt;/strong>&lt;/h4>
&lt;ul>
&lt;li>Sử dụng ký hiệu chân quạ để chỉ ra bên &amp;ldquo;nhiều&amp;rdquo; của mối quan hệ.&lt;/li>
&lt;/ul>
&lt;h3 id="ví-dụ-mô-hình-hóa-qua-sơ-đồ">Ví dụ Mô Hình Hóa Qua Sơ Đồ&lt;/h3>
&lt;ul>
&lt;li>
&lt;p>&lt;strong>Sơ đồ mối quan hệ giữa Khách Hàng và Đơn Hàng:&lt;/strong>&lt;/p></description></item><item><title>Worker trong Nodejs - Các tham số trong options khi khởi tạo Worker.</title><link>https://kaka-notes.netlify.app/posts/worker-trong-nodejs__cac-tham-so-trong-options-khi-khoi-tao-worker/</link><pubDate>Sun, 24 Nov 2024 00:00:00 +0000</pubDate><guid>https://kaka-notes.netlify.app/posts/worker-trong-nodejs__cac-tham-so-trong-options-khi-khoi-tao-worker/</guid><description>&lt;p>Khi sử dụng &lt;code>worker_threads&lt;/code> trong Node.js, bạn có thể khởi tạo một Worker mới với một số tùy chọn. Dưới đây là danh sách các tham số chính mà bạn có thể sử dụng khi tạo một Worker, cùng với mô tả chi tiết cho từng tham số.&lt;/p>
&lt;h3 id="khởi-tạo-worker">Khởi Tạo Worker&lt;/h3>
&lt;p>Để khởi tạo một Worker, bạn sẽ sử dụng mã như sau:&lt;/p>



&lt;div class="code-block-wrapper" data-code="const { Worker } = require(&amp;#39;worker_threads&amp;#39;);

const worker = new Worker(&amp;#39;./worker.js&amp;#39;, {
 workerData: { /* dữ liệu gửi vào worker */ },
 stdout: true,
 stderr: true,
 // Các tùy chọn khác...
});">
 
 &lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-javascript" data-lang="javascript">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">const&lt;/span> { &lt;span style="color:#a6e22e">Worker&lt;/span> } &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#a6e22e">require&lt;/span>(&lt;span style="color:#e6db74">&amp;#39;worker_threads&amp;#39;&lt;/span>);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">const&lt;/span> &lt;span style="color:#a6e22e">worker&lt;/span> &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#66d9ef">new&lt;/span> &lt;span style="color:#a6e22e">Worker&lt;/span>(&lt;span style="color:#e6db74">&amp;#39;./worker.js&amp;#39;&lt;/span>, {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#a6e22e">workerData&lt;/span>&lt;span style="color:#f92672">:&lt;/span> { &lt;span style="color:#75715e">/* dữ liệu gửi vào worker */&lt;/span> },
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#a6e22e">stdout&lt;/span>&lt;span style="color:#f92672">:&lt;/span> &lt;span style="color:#66d9ef">true&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#a6e22e">stderr&lt;/span>&lt;span style="color:#f92672">:&lt;/span> &lt;span style="color:#66d9ef">true&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#75715e">// Các tùy chọn khác...
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">&lt;/span>});&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>
&lt;/div>
&lt;h3 id="các-tham-số-tùy-chọn">Các Tham Số Tùy Chọn&lt;/h3>
&lt;ol>
&lt;li>
&lt;p>&lt;strong>&lt;code>workerData&lt;/code>&lt;/strong>:&lt;/p></description></item><item><title>Worker trong Nodejs - Cách xử lý những request api có tải lớn - Tính toán phức tạp và tính đồng thời cao.</title><link>https://kaka-notes.netlify.app/posts/cach-xu-ly-tai-lon-trong-express/</link><pubDate>Sun, 24 Nov 2024 00:00:00 +0000</pubDate><guid>https://kaka-notes.netlify.app/posts/cach-xu-ly-tai-lon-trong-express/</guid><description>&lt;p>Dưới đây là tóm tắt các kiến thức chính mà chúng ta đã thảo luận về việc sử dụng &lt;code>Bull&lt;/code> và &lt;code>Piscina&lt;/code> trong một ứng dụng Node.js, cũng như giám sát hiệu suất và khả năng mở rộng worker.&lt;/p>
&lt;h3 id="tóm-tắt-kiến-thức">Tóm Tắt Kiến Thức&lt;/h3>
&lt;h4 id="1-cấu-trúc-ứng-dụng">1. &lt;strong>Cấu Trúc Ứng Dụng&lt;/strong>&lt;/h4>
&lt;ul>
&lt;li>&lt;strong>Express&lt;/strong>: Sử dụng để xây dựng API, tiếp nhận yêu cầu từ client.&lt;/li>
&lt;li>&lt;strong>Bull&lt;/strong>: Quản lý hàng đợi các job, cho phép thêm job vào hàng đợi và theo dõi trạng thái của chúng.&lt;/li>
&lt;li>&lt;strong>Piscina&lt;/strong>: Cung cấp khả năng xử lý các job nặng nề trong các worker threads, giúp giảm tải cho main thread.&lt;/li>
&lt;/ul>
&lt;h4 id="2-quy-trình-hoạt-động">2. &lt;strong>Quy Trình Hoạt Động&lt;/strong>&lt;/h4>
&lt;ul>
&lt;li>Khi client gửi yêu cầu đến API, ứng dụng Express sẽ thêm job vào hàng đợi Bull.&lt;/li>
&lt;li>Bull sẽ quản lý các job và phân phối chúng cho các worker, sử dụng Piscina để xử lý.&lt;/li>
&lt;li>Kết quả sẽ được gửi lại cho client khi job hoàn thành, hoặc client có thể truy vấn trạng thái job bằng ID.&lt;/li>
&lt;/ul>
&lt;h4 id="3-tốc-độ-xử-lý">3. &lt;strong>Tốc Độ Xử Lý&lt;/strong>&lt;/h4>
&lt;ul>
&lt;li>Trong điều kiện bình thường, việc sử dụng hàng đợi có thể chậm hơn so với các yêu cầu API thông thường do độ trễ trong việc thêm job vào hàng đợi và xử lý.&lt;/li>
&lt;li>Khi tải cao, mô hình này có thể xử lý tốt hơn nhờ khả năng phân phối job cho nhiều worker, giúp tối ưu hóa tài nguyên.&lt;/li>
&lt;/ul>
&lt;h4 id="4-giám-sát-hiệu-suất">4. &lt;strong>Giám Sát Hiệu Suất&lt;/strong>&lt;/h4>
&lt;ul>
&lt;li>&lt;strong>Công Cụ Giám Sát&lt;/strong>: Sử dụng Prometheus, Grafana, New Relic, hoặc Datadog để theo dõi hiệu suất ứng dụng.&lt;/li>
&lt;li>&lt;strong>Middleware&lt;/strong>: Sử dụng &lt;code>morgan&lt;/code> để ghi lại log của các yêu cầu HTTP.&lt;/li>
&lt;li>&lt;strong>Bull Dashboard&lt;/strong>: Sử dụng các công cụ như Bull Board để theo dõi trạng thái và hiệu suất của job trong hàng đợi.&lt;/li>
&lt;li>&lt;strong>Ghi Log&lt;/strong>: Sử dụng Winston hoặc ELK Stack để thu thập và phân tích log từ ứng dụng.&lt;/li>
&lt;/ul>
&lt;h4 id="5-khả-năng-mở-rộng-worker">5. &lt;strong>Khả Năng Mở Rộng Worker&lt;/strong>&lt;/h4>
&lt;ul>
&lt;li>&lt;strong>Số Lượng Worker&lt;/strong>: Bạn có thể cấu hình số lượng worker tối đa trong Piscina để xử lý job đồng thời.&lt;/li>
&lt;li>&lt;strong>Giám Sát Tải&lt;/strong>: Xây dựng cơ chế giám sát để theo dõi tình trạng job và tự động tạo thêm worker khi cần.&lt;/li>
&lt;li>&lt;strong>Docker và Kubernetes&lt;/strong>: Sử dụng Docker Swarm hoặc Kubernetes để tự động mở rộng quy mô ứng dụng và worker dựa trên tải.&lt;/li>
&lt;/ul>
&lt;h3 id="kết-luận">Kết Luận&lt;/h3>
&lt;p>Việc sử dụng &lt;code>Bull&lt;/code> và &lt;code>Piscina&lt;/code> trong ứng dụng Node.js cho phép bạn quản lý và xử lý các tác vụ nặng một cách hiệu quả. Tuy nhiên, cần theo dõi và tối ưu hóa hiệu suất để đảm bảo rằng ứng dụng hoạt động tốt trong cả điều kiện bình thường và tải cao. Nếu bạn cần thêm thông tin hoặc có câu hỏi nào khác, hãy cho tôi biết!&lt;/p></description></item><item><title>Những câu hỏi cần thiết để giúp bạn xác định cách tiếp cận Con trỏ hay không</title><link>https://kaka-notes.netlify.app/posts/suy-nghi-viec-nen-dung-con-tro-trong-golang/</link><pubDate>Fri, 22 Nov 2024 00:00:00 +0000</pubDate><guid>https://kaka-notes.netlify.app/posts/suy-nghi-viec-nen-dung-con-tro-trong-golang/</guid><description>&lt;p>Khi quyết định xem có nên sử dụng con trỏ hay không trong Go, bạn có thể đặt ra một số câu hỏi cần thiết để giúp bạn xác định cách tiếp cận tốt nhất cho tình huống cụ thể của mình. Dưới đây là những câu hỏi quan trọng:&lt;/p>
&lt;h3 id="1-cấu-trúc-có-lớn-không">1. &lt;strong>Cấu Trúc Có Lớn Không?&lt;/strong>&lt;/h3>
&lt;ul>
&lt;li>&lt;strong>Câu hỏi&lt;/strong>: Cấu trúc (struct) mà tôi đang xử lý có kích thước lớn không?&lt;/li>
&lt;li>&lt;strong>Lý do&lt;/strong>: Nếu cấu trúc lớn, việc truyền nó như một con trỏ sẽ giúp tiết kiệm bộ nhớ và tăng hiệu suất.&lt;/li>
&lt;/ul>
&lt;h3 id="2-có-cần-thay-đổi-trạng-thái-không">2. &lt;strong>Có Cần Thay Đổi Trạng Thái Không?&lt;/strong>&lt;/h3>
&lt;ul>
&lt;li>&lt;strong>Câu hỏi&lt;/strong>: Tôi có cần thay đổi trạng thái của đối tượng đó không?&lt;/li>
&lt;li>&lt;strong>Lý do&lt;/strong>: Nếu bạn cần thay đổi nội dung của đối tượng trong một hàm, bạn nên sử dụng con trỏ. Nếu chỉ cần đọc giá trị mà không thay đổi, có thể sử dụng giá trị.&lt;/li>
&lt;/ul>
&lt;h3 id="3-thao-tác-với-nhiều-goroutines">3. &lt;strong>Thao Tác Với Nhiều Goroutines?&lt;/strong>&lt;/h3>
&lt;ul>
&lt;li>&lt;strong>Câu hỏi&lt;/strong>: Tôi có đang làm việc với nhiều goroutines không?&lt;/li>
&lt;li>&lt;strong>Lý do&lt;/strong>: Nếu bạn cần chia sẻ trạng thái giữa các goroutines, việc sử dụng con trỏ có thể giúp tránh việc sao chép không cần thiết và giữ cho các goroutines cùng tham chiếu đến cùng một đối tượng.&lt;/li>
&lt;/ul>
&lt;h3 id="4-có-cần-quản-lý-bộ-nhớ-không">4. &lt;strong>Có Cần Quản Lý Bộ Nhớ Không?&lt;/strong>&lt;/h3>
&lt;ul>
&lt;li>&lt;strong>Câu hỏi&lt;/strong>: Tôi có cần quản lý bộ nhớ một cách cụ thể (ví dụ: sử dụng &lt;code>nil&lt;/code>) không?&lt;/li>
&lt;li>&lt;strong>Lý do&lt;/strong>: Con trỏ cho phép bạn dễ dàng kiểm soát việc cấp phát và giải phóng bộ nhớ, cũng như quản lý các trường hợp &lt;code>nil&lt;/code> một cách hiệu quả.&lt;/li>
&lt;/ul>
&lt;h3 id="5-tính-toán-chi-phí-sao-chép">5. &lt;strong>Tính Toán Chi Phí Sao Chép?&lt;/strong>&lt;/h3>
&lt;ul>
&lt;li>&lt;strong>Câu hỏi&lt;/strong>: Có tốn kém khi sao chép đối tượng này không?&lt;/li>
&lt;li>&lt;strong>Lý do&lt;/strong>: Nếu việc sao chép đối tượng tốn nhiều tài nguyên (thời gian hoặc bộ nhớ), sử dụng con trỏ có thể hiệu quả hơn.&lt;/li>
&lt;/ul>
&lt;h3 id="6-có-cần-tính-trạng-thái-bên-ngoài-không">6. &lt;strong>Có Cần Tính Trạng Thái Bên Ngoài Không?&lt;/strong>&lt;/h3>
&lt;ul>
&lt;li>&lt;strong>Câu hỏi&lt;/strong>: Có cần giữ cho trạng thái của đối tượng đồng bộ với các thay đổi bên ngoài không?&lt;/li>
&lt;li>&lt;strong>Lý do&lt;/strong>: Sử dụng con trỏ giúp đảm bảo rằng mọi thay đổi đối với đối tượng đều có thể được phản ánh ngay lập tức.&lt;/li>
&lt;/ul>
&lt;h3 id="7-độ-an-toàn-và-khó-khăn-trong-việc-thao-tác">7. &lt;strong>Độ An Toàn và Khó Khăn Trong Việc Thao Tác?&lt;/strong>&lt;/h3>
&lt;ul>
&lt;li>&lt;strong>Câu hỏi&lt;/strong>: Sử dụng con trỏ có làm mã nguồn phức tạp hơn không?&lt;/li>
&lt;li>&lt;strong>Lý do&lt;/strong>: Đôi khi, việc sử dụng con trỏ có thể khiến mã khó đọc và dễ gây lỗi. Nếu sự đơn giản là ưu tiên hàng đầu, bạn có thể chọn không sử dụng con trỏ.&lt;/li>
&lt;/ul>
&lt;h3 id="8-thay-đổi-trong-các-hàm">8. &lt;strong>Thay Đổi Trong Các Hàm?&lt;/strong>&lt;/h3>
&lt;ul>
&lt;li>&lt;strong>Câu hỏi&lt;/strong>: Có cần truyền đối tượng vào các hàm mà sẽ thay đổi nó không?&lt;/li>
&lt;li>&lt;strong>Lý do&lt;/strong>: Nếu một hàm cần thay đổi đối tượng, bạn nên truyền nó dưới dạng con trỏ.&lt;/li>
&lt;/ul>
&lt;h3 id="kết-luận">Kết Luận&lt;/h3>
&lt;p>Khi đưa ra quyết định về việc sử dụng con trỏ hay không trong Go, những câu hỏi trên có thể giúp bạn đánh giá các yếu tố liên quan đến hiệu suất, quản lý bộ nhớ và khả năng bảo trì mã. Nếu bạn có thêm câu hỏi hoặc cần giải thích sâu hơn về một vấn đề cụ thể, hãy cho tôi biết!&lt;/p></description></item><item><title>Giảm thiểu Side Effect trong Nodejs.</title><link>https://kaka-notes.netlify.app/posts/giam-thieu-side-effect-trong-nodejs/</link><pubDate>Fri, 15 Nov 2024 00:00:00 +0000</pubDate><guid>https://kaka-notes.netlify.app/posts/giam-thieu-side-effect-trong-nodejs/</guid><description>&lt;p>Giảm thiểu side effect là một cách quan trọng để viết code JavaScript sạch hơn, dễ dự đoán hơn, và dễ kiểm thử hơn. Dưới đây là một số cách để giảm thiểu side effect trong JavaScript:&lt;/p>
&lt;p>&lt;strong>1. Sử dụng Pure Functions (Hàm thuần)&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Định nghĩa:&lt;/strong> Một pure function luôn trả về cùng một kết quả với cùng một tập hợp các tham số đầu vào và không gây ra bất kỳ side effect nào.&lt;/li>
&lt;li>&lt;strong>Lợi ích:&lt;/strong> Dễ dự đoán, dễ kiểm thử, và dễ dàng lý luận về code.&lt;/li>
&lt;li>&lt;strong>Ví dụ:&lt;/strong>&lt;/li>
&lt;/ul>



&lt;div class="code-block-wrapper" data-code="// Pure function
function add(a, b) {
 return a &amp;#43; b;
}

// Impure function (có side effect)
let total = 0;
function addToTotal(a) {
 total &amp;#43;= a; // Thay đổi biến bên ngoài hàm
 return total;
}">
 
 &lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-javascript" data-lang="javascript">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">// Pure function
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">&lt;/span>&lt;span style="color:#66d9ef">function&lt;/span> &lt;span style="color:#a6e22e">add&lt;/span>(&lt;span style="color:#a6e22e">a&lt;/span>, &lt;span style="color:#a6e22e">b&lt;/span>) {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">return&lt;/span> &lt;span style="color:#a6e22e">a&lt;/span> &lt;span style="color:#f92672">+&lt;/span> &lt;span style="color:#a6e22e">b&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>}
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">// Impure function (có side effect)
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">&lt;/span>&lt;span style="color:#66d9ef">let&lt;/span> &lt;span style="color:#a6e22e">total&lt;/span> &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#ae81ff">0&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">function&lt;/span> &lt;span style="color:#a6e22e">addToTotal&lt;/span>(&lt;span style="color:#a6e22e">a&lt;/span>) {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#a6e22e">total&lt;/span> &lt;span style="color:#f92672">+=&lt;/span> &lt;span style="color:#a6e22e">a&lt;/span>; &lt;span style="color:#75715e">// Thay đổi biến bên ngoài hàm
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">&lt;/span> &lt;span style="color:#66d9ef">return&lt;/span> &lt;span style="color:#a6e22e">total&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>}&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>
&lt;/div>
&lt;p>&lt;strong>2. Hạn chế Biến Toàn Cục (Global Variables)&lt;/strong>&lt;/p></description></item><item><title>Event trong Nodejs</title><link>https://kaka-notes.netlify.app/posts/events-trong-nodejs/</link><pubDate>Thu, 14 Nov 2024 00:00:00 +0000</pubDate><guid>https://kaka-notes.netlify.app/posts/events-trong-nodejs/</guid><description>&lt;h3 id="đặt-vấn-đề">Đặt vấn đề:&lt;/h3>
&lt;ul>
&lt;li>Trong nodejs có nhiều tác vụ liên quan với nhau.&lt;/li>
&lt;li>
&lt;blockquote>
&lt;p>điều kiện thực thi task này thì cần kết quả của task khác (thực thi đồng bộ được yêu cầu)&lt;/p>&lt;/blockquote>
&lt;/li>
&lt;li>
&lt;blockquote>
&lt;p>các task vụ có thể là 1 dạng của &lt;a href="https://kaka-notes.netlify.app/posts/side-effect-la-gi">Side Effect&lt;/a>&lt;/p>&lt;/blockquote>
&lt;/li>
&lt;li>
&lt;blockquote>
&lt;p>Việc dùng &lt;code>callback&lt;/code> lồng nhau nhiều có thể sẽ xảy ra &lt;code>callback hell&lt;/code>
module events có thể giải quyết vấn đề trên.&lt;/p>&lt;/blockquote>
&lt;/li>
&lt;/ul></description></item><item><title>Side Effect là gì?</title><link>https://kaka-notes.netlify.app/posts/side-effect-la-gi/</link><pubDate>Thu, 14 Nov 2024 00:00:00 +0000</pubDate><guid>https://kaka-notes.netlify.app/posts/side-effect-la-gi/</guid><description>&lt;h3 id="hàm-có-side-effecttác-dụng-phụ-là-1-hàm-có-thể-cho-ra-kết-quả-không-như-mong-muốn">Hàm có side effect(tác dụng phụ) Là 1 hàm có thể cho ra kết quả không như mong muốn.&lt;/h3>
&lt;ul>
&lt;li>Để làm rõ khái niệm trên ta sẽ đưa ra khái niệm ngược lại với nó là hàm pure function.
&lt;blockquote>
&lt;p>Luôn cho ra duy nhất 1 kết quả giống nhau khi có cùng tham số đầu vào.&lt;/p>&lt;/blockquote>



&lt;div class="code-block-wrapper" data-code="function add(a, b) {
 return a &amp;#43; b
}">
 
 &lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-js" data-lang="js">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">function&lt;/span> &lt;span style="color:#a6e22e">add&lt;/span>(&lt;span style="color:#a6e22e">a&lt;/span>, &lt;span style="color:#a6e22e">b&lt;/span>) {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">return&lt;/span> &lt;span style="color:#a6e22e">a&lt;/span> &lt;span style="color:#f92672">+&lt;/span> &lt;span style="color:#a6e22e">b&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>}&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>
&lt;/div>
&lt;blockquote>
&lt;p>Dựa vào ví dụ trên ta có thể kết luận thêm cho hàm side effect: cùng 1 tham số đầu vào có thể có những kết quả khác nhau.&lt;/p></description></item><item><title>AI Engineering Chap 01</title><link>https://kaka-notes.netlify.app/posts/ai-engineering-chuong-01/</link><pubDate>Tue, 12 Nov 2024 00:00:00 +0000</pubDate><guid>https://kaka-notes.netlify.app/posts/ai-engineering-chuong-01/</guid><description>&lt;h1 id="chương-1-giới-thiệu-về-xây-dựng-ứng-dụng-ai-với-các-mô-hình-nền-tảng">Chương 1: Giới thiệu về Xây dựng Ứng dụng AI với các Mô hình Nền tảng&lt;/h1>
&lt;p>Nếu phải dùng một từ duy nhất để mô tả về Trí tuệ Nhân tạo (AI) trong giai đoạn sau năm 2020, thì đó chính là từ &amp;ldquo;quy mô&amp;rdquo;. Các mô hình AI đứng sau những ứng dụng đình đám như ChatGPT, Gemini của Google, hay Midjourney đã đạt đến một quy mô khổng lồ. Chúng lớn đến mức đang tiêu thụ một phần không hề nhỏ sản lượng điện của toàn thế giới. Hơn nữa, chúng ta còn đang đứng trước nguy cơ cạn kiệt nguồn dữ liệu công khai trên Internet để có thể tiếp tục huấn luyện cho chúng.&lt;/p></description></item><item><title>Bắt đầu với tư duy phản biện</title><link>https://kaka-notes.netlify.app/posts/bat-dau-tu-duy-phan-bien/</link><pubDate>Tue, 12 Nov 2024 00:00:00 +0000</pubDate><guid>https://kaka-notes.netlify.app/posts/bat-dau-tu-duy-phan-bien/</guid><description>&lt;h2 id="đặt-vấn-đề">Đặt vấn đề:&lt;/h2>
&lt;ul>
&lt;li>&lt;a href="https://kaka-notes.netlify.app/posts/the-nao-la-tu-duy-phan-bien">Thế nào là tư duy phản biện?&lt;/a>&lt;/li>
&lt;li>Khi nào ta sử dụng tư duy phản biện?&lt;/li>
&lt;li>Tại sao chúng ta cần tư duy phản biện?&lt;/li>
&lt;li>Chúng ta tư duy phản biện như thế nào?&lt;/li>
&lt;/ul></description></item><item><title>Hướng dẫn về Aggregation Pipeline trong mongo</title><link>https://kaka-notes.netlify.app/posts/huong-dan-aggregation-pipeline-stages/</link><pubDate>Tue, 12 Nov 2024 00:00:00 +0000</pubDate><guid>https://kaka-notes.netlify.app/posts/huong-dan-aggregation-pipeline-stages/</guid><description>&lt;p>&lt;strong>Aggregation Pipeline&lt;/strong> trong MongoDB là một công cụ mạnh mẽ để xử lý và phân tích dữ liệu. Nó cho phép bạn thực hiện nhiều thao tác khác nhau trên dữ liệu thông qua một chuỗi các giai đoạn (stages). Dưới đây là hướng dẫn về các giai đoạn chính trong Aggregation Pipeline.&lt;/p>
&lt;h3 id="các-giai-đoạn-cơ-bản-trong-aggregation-pipeline">Các Giai Đoạn Cơ Bản Trong Aggregation Pipeline&lt;/h3>
&lt;ol>
&lt;li>
&lt;p>&lt;strong>&lt;code>$match&lt;/code>&lt;/strong>:&lt;/p>
&lt;ul>
&lt;li>Sử dụng để lọc tài liệu dựa trên điều kiện.&lt;/li>
&lt;li>Tương tự như &lt;code>find()&lt;/code>, nhưng có thể sử dụng các toán tử phức tạp hơn.&lt;/li>
&lt;li>&lt;strong>Ví dụ&lt;/strong>:



&lt;div class="code-block-wrapper" data-code="db.collection.aggregate([
 { $match: { status: &amp;#34;active&amp;#34; } }
]);">
 
 &lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-javascript" data-lang="javascript">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#a6e22e">db&lt;/span>.&lt;span style="color:#a6e22e">collection&lt;/span>.&lt;span style="color:#a6e22e">aggregate&lt;/span>([
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> { &lt;span style="color:#a6e22e">$match&lt;/span>&lt;span style="color:#f92672">:&lt;/span> { &lt;span style="color:#a6e22e">status&lt;/span>&lt;span style="color:#f92672">:&lt;/span> &lt;span style="color:#e6db74">&amp;#34;active&amp;#34;&lt;/span> } }
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>]);&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>
&lt;/div>
&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>&lt;code>$group&lt;/code>&lt;/strong>:&lt;/p></description></item><item><title>Thế nào là tư duy phản biện?</title><link>https://kaka-notes.netlify.app/posts/the-nao-la-tu-duy-phan-bien/</link><pubDate>Tue, 12 Nov 2024 00:00:00 +0000</pubDate><guid>https://kaka-notes.netlify.app/posts/the-nao-la-tu-duy-phan-bien/</guid><description>&lt;h2 id="câu-trả-lời-">Câu trả lời &amp;hellip;&lt;/h2>
&lt;h3 id="h111">h111&lt;/h3></description></item><item><title>Xử lý một trường ref trong Mongoose cho nhiều Model khác nhau</title><link>https://kaka-notes.netlify.app/posts/xu-ly-ref-trong-mongoose-cho-nhieu-model-khac-nhau/</link><pubDate>Tue, 12 Nov 2024 00:00:00 +0000</pubDate><guid>https://kaka-notes.netlify.app/posts/xu-ly-ref-trong-mongoose-cho-nhieu-model-khac-nhau/</guid><description>&lt;h2 id="bài-toán-đưa-ra-như-sau">bài toán đưa ra như sau&lt;/h2>
&lt;ul>
&lt;li>Ta muốn tách model user thành các model {&amp;lsquo;User&amp;rsquo;, &amp;lsquo;Manager&amp;rsquo;, &amp;lsquo;Admin&amp;rsquo;, &amp;hellip;} để tăng thêm mức độ bảo mật.&lt;/li>
&lt;li>Từ vấn đề này phát sinh ra việc tạo 1 tài khoản user không biết ref như thế nào trong ví dụ dưới đây:&lt;/li>
&lt;/ul>



&lt;div class="code-block-wrapper" data-code="const mongoose = require(&amp;#39;mongoose&amp;#39;);

const userSchema = new mongoose.Schema({
 createdBy: {
 type: mongoose.Schema.Types.ObjectId,
 required: true,
 // Thêm trường này để xác định loại người tạo
 ref: &amp;#39;User&amp;#39;, // Có thể là User, có thể là Admin hoặc Manager
 },
 // Các trường khác...
});

// Ví dụ về cách tạo một instance
const User = mongoose.model(&amp;#39;User&amp;#39;, userSchema);">
 
 &lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-js" data-lang="js">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">const&lt;/span> &lt;span style="color:#a6e22e">mongoose&lt;/span> &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#a6e22e">require&lt;/span>(&lt;span style="color:#e6db74">&amp;#39;mongoose&amp;#39;&lt;/span>);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">const&lt;/span> &lt;span style="color:#a6e22e">userSchema&lt;/span> &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#66d9ef">new&lt;/span> &lt;span style="color:#a6e22e">mongoose&lt;/span>.&lt;span style="color:#a6e22e">Schema&lt;/span>({
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#a6e22e">createdBy&lt;/span>&lt;span style="color:#f92672">:&lt;/span> {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#a6e22e">type&lt;/span>&lt;span style="color:#f92672">:&lt;/span> &lt;span style="color:#a6e22e">mongoose&lt;/span>.&lt;span style="color:#a6e22e">Schema&lt;/span>.&lt;span style="color:#a6e22e">Types&lt;/span>.&lt;span style="color:#a6e22e">ObjectId&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#a6e22e">required&lt;/span>&lt;span style="color:#f92672">:&lt;/span> &lt;span style="color:#66d9ef">true&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#75715e">// Thêm trường này để xác định loại người tạo
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">&lt;/span> &lt;span style="color:#a6e22e">ref&lt;/span>&lt;span style="color:#f92672">:&lt;/span> &lt;span style="color:#e6db74">&amp;#39;User&amp;#39;&lt;/span>, &lt;span style="color:#75715e">// Có thể là User, có thể là Admin hoặc Manager
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">&lt;/span> },
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#75715e">// Các trường khác...
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">&lt;/span>});
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">// Ví dụ về cách tạo một instance
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">&lt;/span>&lt;span style="color:#66d9ef">const&lt;/span> &lt;span style="color:#a6e22e">User&lt;/span> &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#a6e22e">mongoose&lt;/span>.&lt;span style="color:#a6e22e">model&lt;/span>(&lt;span style="color:#e6db74">&amp;#39;User&amp;#39;&lt;/span>, &lt;span style="color:#a6e22e">userSchema&lt;/span>);&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>
&lt;/div>
&lt;p>[*] Hạn chế: Mongoose không hỗ trợ trực tiếp việc tham chiếu đến nhiều mô hình khác nhau trong cùng một trường.
&amp;mdash;&amp;gt; Hướng giải quyết: ta bổ sung thêm trường type(cụ thể createdByType) với &lt;code>required: true&lt;/code> cho model. Để khi tạo User thì tương ứng với mỗi type ta ref để đúng collection chứa Document cần ref&lt;/p></description></item><item><title>Các loại tài nguyên trong Kubernetes</title><link>https://kaka-notes.netlify.app/posts/cac-loai-tai-nguyen-trong-kubernetes/</link><pubDate>Mon, 11 Nov 2024 00:00:00 +0000</pubDate><guid>https://kaka-notes.netlify.app/posts/cac-loai-tai-nguyen-trong-kubernetes/</guid><description>&lt;p>Trong Kubernetes, có nhiều loại &lt;code>kind&lt;/code> (loại tài nguyên) khác nhau, mỗi loại phục vụ cho các mục đích khác nhau trong việc quản lý ứng dụng và hạ tầng. Dưới đây là một số loại &lt;code>kind&lt;/code> phổ biến:&lt;/p>
&lt;h3 id="1-pod">1. &lt;strong>Pod&lt;/strong>&lt;/h3>
&lt;ul>
&lt;li>&lt;strong>Mô tả&lt;/strong>: Là đơn vị cơ bản nhất trong Kubernetes, chứa một hoặc nhiều container.&lt;/li>
&lt;/ul>
&lt;h3 id="2-deployment">2. &lt;strong>Deployment&lt;/strong>&lt;/h3>
&lt;ul>
&lt;li>&lt;strong>Mô tả&lt;/strong>: Quản lý việc triển khai và cập nhật các bản sao của pod, tự động thực hiện các bản cập nhật và rollback.&lt;/li>
&lt;/ul>
&lt;h3 id="3-service">3. &lt;strong>Service&lt;/strong>&lt;/h3>
&lt;ul>
&lt;li>&lt;strong>Mô tả&lt;/strong>: Cung cấp một phương thức để truy cập vào các pod. Có nhiều loại service như ClusterIP, NodePort, LoadBalancer.&lt;/li>
&lt;/ul>
&lt;h3 id="4-statefulset">4. &lt;strong>StatefulSet&lt;/strong>&lt;/h3>
&lt;ul>
&lt;li>&lt;strong>Mô tả&lt;/strong>: Quản lý các ứng dụng có trạng thái (stateful applications), đảm bảo rằng mỗi pod có một danh tính cố định và bền vững.&lt;/li>
&lt;/ul>
&lt;h3 id="5-daemonset">5. &lt;strong>DaemonSet&lt;/strong>&lt;/h3>
&lt;ul>
&lt;li>&lt;strong>Mô tả&lt;/strong>: Đảm bảo rằng một bản sao của pod chạy trên tất cả (hoặc một số) nút trong cluster.&lt;/li>
&lt;/ul>
&lt;h3 id="6-replicaset">6. &lt;strong>ReplicaSet&lt;/strong>&lt;/h3>
&lt;ul>
&lt;li>&lt;strong>Mô tả&lt;/strong>: Đảm bảo rằng một số lượng bản sao của pod đang chạy tại bất kỳ thời điểm nào. Thường được sử dụng bởi Deployment.&lt;/li>
&lt;/ul>
&lt;h3 id="7-job">7. &lt;strong>Job&lt;/strong>&lt;/h3>
&lt;ul>
&lt;li>&lt;strong>Mô tả&lt;/strong>: Thực hiện một tác vụ một lần và hoàn thành, đảm bảo rằng một hoặc nhiều pod hoàn thành thành công.&lt;/li>
&lt;/ul>
&lt;h3 id="8-cronjob">8. &lt;strong>CronJob&lt;/strong>&lt;/h3>
&lt;ul>
&lt;li>&lt;strong>Mô tả&lt;/strong>: Tạo Job theo lịch trình, cho phép bạn thực hiện tác vụ định kỳ.&lt;/li>
&lt;/ul>
&lt;h3 id="9-configmap">9. &lt;strong>ConfigMap&lt;/strong>&lt;/h3>
&lt;ul>
&lt;li>&lt;strong>Mô tả&lt;/strong>: Lưu trữ các cấu hình không nhạy cảm dưới dạng cặp key-value, cho phép inject vào container.&lt;/li>
&lt;/ul>
&lt;h3 id="10-secret">10. &lt;strong>Secret&lt;/strong>&lt;/h3>
&lt;ul>
&lt;li>&lt;strong>Mô tả&lt;/strong>: Tương tự như ConfigMap, nhưng dùng để lưu trữ dữ liệu nhạy cảm (như mật khẩu, token).&lt;/li>
&lt;/ul>
&lt;h3 id="11-namespace">11. &lt;strong>Namespace&lt;/strong>&lt;/h3>
&lt;ul>
&lt;li>&lt;strong>Mô tả&lt;/strong>: Cung cấp cách để phân chia tài nguyên trong cluster thành các không gian tên khác nhau, giúp quản lý và tổ chức tài nguyên.&lt;/li>
&lt;/ul>
&lt;h3 id="12-persistentvolume-pv">12. &lt;strong>PersistentVolume (PV)&lt;/strong>&lt;/h3>
&lt;ul>
&lt;li>&lt;strong>Mô tả&lt;/strong>: Tài nguyên lưu trữ trong cluster, có thể được sử dụng bởi pod.&lt;/li>
&lt;/ul>
&lt;h3 id="13-persistentvolumeclaim-pvc">13. &lt;strong>PersistentVolumeClaim (PVC)&lt;/strong>&lt;/h3>
&lt;ul>
&lt;li>&lt;strong>Mô tả&lt;/strong>: Yêu cầu sử dụng một PersistentVolume, cho phép pod yêu cầu lưu trữ theo cách động.&lt;/li>
&lt;/ul>
&lt;h3 id="14-ingress">14. &lt;strong>Ingress&lt;/strong>&lt;/h3>
&lt;ul>
&lt;li>&lt;strong>Mô tả&lt;/strong>: Quản lý lưu lượng truy cập HTTP đến các service trong cluster, cho phép định tuyến và cân bằng tải.&lt;/li>
&lt;/ul>
&lt;h3 id="15-networkpolicy">15. &lt;strong>NetworkPolicy&lt;/strong>&lt;/h3>
&lt;ul>
&lt;li>&lt;strong>Mô tả&lt;/strong>: Quản lý lưu lượng mạng đến và từ các pod, xác định các quy tắc bảo mật mạng.&lt;/li>
&lt;/ul>
&lt;h3 id="kết-luận">Kết luận&lt;/h3>
&lt;p>Kubernetes cung cấp một loạt các loại tài nguyên để giúp quản lý và triển khai ứng dụng một cách hiệu quả. Tùy thuộc vào nhu cầu của ứng dụng, bạn có thể sử dụng các loại &lt;code>kind&lt;/code> khác nhau để đáp ứng các yêu cầu cụ thể. Nếu bạn có thêm câu hỏi hoặc muốn tìm hiểu về một loại tài nguyên cụ thể, hãy cho tôi biết!&lt;/p></description></item><item><title>Đã có Docker vì sao lại cần đến Kubernetes</title><link>https://kaka-notes.netlify.app/posts/da-co-docker-vi-sao-can-den-kubernetes/</link><pubDate>Mon, 11 Nov 2024 00:00:00 +0000</pubDate><guid>https://kaka-notes.netlify.app/posts/da-co-docker-vi-sao-can-den-kubernetes/</guid><description>&lt;blockquote>
&lt;p>Docker là một công cụ tuyệt vời để &lt;strong>tạo&lt;/strong> và &lt;strong>chạy&lt;/strong> container, trong khi Kubernetes là một hệ thống mạnh mẽ để &lt;strong>quản lý&lt;/strong> và &lt;strong>điều phối&lt;/strong> các container đó trên quy mô lớn. Sử dụng cùng nhau, Docker và Kubernetes cung cấp một giải pháp toàn diện cho việc triển khai và quản lý ứng dụng container.&lt;/p>&lt;/blockquote></description></item><item><title>Hiệu ứng Telomere - Nghiên cứu đoạt giải Nobel 2009</title><link>https://kaka-notes.netlify.app/posts/hieu-ung-telomere/</link><pubDate>Fri, 01 Nov 2024 00:00:00 +0000</pubDate><guid>https://kaka-notes.netlify.app/posts/hieu-ung-telomere/</guid><description>&lt;ul>
&lt;li>Telomere là các cấu trúc bảo vệ ở đầu nhiễm sắc thể, có vai trò quan trọng trong việc duy trì tính toàn vẹn của DNA.&lt;/li>
&lt;li>Khi tế bào phân chia, telomere ngắn lại, và khi chúng trở nên quá ngắn, tế bào sẽ không còn khả năng phân chia, dẫn đến lão hóa và cái chết tế bào.&lt;/li>
&lt;/ul></description></item><item><title>Using Mongoose</title><link>https://kaka-notes.netlify.app/posts/using-mongoose/</link><pubDate>Sat, 28 Sep 2024 00:00:00 +0000</pubDate><guid>https://kaka-notes.netlify.app/posts/using-mongoose/</guid><description>Tìm kiếm: find, findOne, findById, countDocuments Thêm mới: create, save Cập nhật: updateOne, updateMany, findOneAndUpdate, findByIdAndUpdate Xóa: deleteOne, deleteMany, findOneAndDelete, findByIdAndDelete Tổng hợp: aggregate Bộ đếm: countDocuments, estimatedDocumentCount Khác: lean, populate</description></item><item><title>Sync Notes</title><link>https://kaka-notes.netlify.app/posts/notes/</link><pubDate>Sun, 04 Aug 2024 00:00:00 +0000</pubDate><guid>https://kaka-notes.netlify.app/posts/notes/</guid><description>&lt;h3 id="source">Source&lt;/h3>



&lt;div class="code-block-wrapper" data-code="/home/ka/Documents/00-notes/zettelkasten/Publish">
 
 &lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-sh" data-lang="sh">&lt;span style="display:flex;">&lt;span>/home/ka/Documents/00-notes/zettelkasten/Publish&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>
&lt;/div>
&lt;h3 id="destination">Destination&lt;/h3>



&lt;div class="code-block-wrapper" data-code="/home/ka/github.com/trongnghiango/notes-site/content/posts">
 
 &lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-sh" data-lang="sh">&lt;span style="display:flex;">&lt;span>/home/ka/github.com/trongnghiango/notes-site/content/posts&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>
&lt;/div>



&lt;div class="code-block-wrapper" data-code="#!/bin/sh

SOURCE=&amp;#34;/home/ka/Documents/00-notes/zettelkasten/Publish&amp;#34;
DESTINATION=&amp;#34;/home/ka/github.com/trongnghiango/notes-site/content/posts&amp;#34;
rsync -avu --delete &amp;#34;$SOURCE&amp;#34; &amp;#34;$DESTINATION&amp;#34;">
 
 &lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-sh" data-lang="sh">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">#!/bin/sh
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>SOURCE&lt;span style="color:#f92672">=&lt;/span>&lt;span style="color:#e6db74">&amp;#34;/home/ka/Documents/00-notes/zettelkasten/Publish&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>DESTINATION&lt;span style="color:#f92672">=&lt;/span>&lt;span style="color:#e6db74">&amp;#34;/home/ka/github.com/trongnghiango/notes-site/content/posts&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>rsync -avu --delete &lt;span style="color:#e6db74">&amp;#34;&lt;/span>$SOURCE&lt;span style="color:#e6db74">&amp;#34;&lt;/span> &lt;span style="color:#e6db74">&amp;#34;&lt;/span>$DESTINATION&lt;span style="color:#e6db74">&amp;#34;&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>
&lt;/div></description></item><item><title>About</title><link>https://kaka-notes.netlify.app/about/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://kaka-notes.netlify.app/about/</guid><description>&lt;p>Xin chào, tôi là một người mê lập trình và thích vọc vạch công nghệ. Tôi đã từng thử sức với nhiều ngôn ngữ khác nhau, từ &lt;strong>Java, JavaScript/TypeScript, Python, Golang&lt;/strong> cho đến cả &lt;strong>Bash shell&lt;/strong>. Tôi bắt đầu bằng việc viết ứng dụng Android, rồi dần dần tìm đến React Native, ReactJS, và cuối cùng là tự mình xây dựng cả backend lẫn frontend cho những dự án cá nhân.&lt;/p></description></item></channel></rss>