<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: meotism</title>
    <description>The latest articles on DEV Community by meotism (@meotism).</description>
    <link>https://dev.to/meotism</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F868539%2F7b0bee2e-5b64-45ca-b4f2-40f37e3b8d2a.png</url>
      <title>DEV Community: meotism</title>
      <link>https://dev.to/meotism</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/meotism"/>
    <language>en</language>
    <item>
      <title>Consistency Thinking</title>
      <dc:creator>meotism</dc:creator>
      <pubDate>Mon, 23 Mar 2026 03:03:11 +0000</pubDate>
      <link>https://dev.to/meotism/consistency-thinking-ndf</link>
      <guid>https://dev.to/meotism/consistency-thinking-ndf</guid>
      <description>&lt;p&gt;Nay chúng ta sẽ bàn luận về vấn đề dữ liệu, liệu dữ liệu phải luôn luôn chính xác 100% ngay lập tức?&lt;/p&gt;

&lt;p&gt;Hầu hết mọi người sẽ nói là có chứ, dữ liệu phải chính xác mới đúng. Nhưng trong hệ thống phân tán quy mô lớn câu hỏi ấy sẽ là một cái bẫy. Bây giờ chúng ta sẽ mổ xẻ phân tích tại sao?&lt;/p&gt;

&lt;h2&gt;
  
  
  1. Lầm tưởng dữ liệu
&lt;/h2&gt;

&lt;p&gt;Statement: "Dữ liệu phải luôn cập nhật real-time cho tất cả mọi người"&lt;/p&gt;

&lt;p&gt;Trong hệ thống lớn, đó là một thảm hoạ chính vì sẽ làm chậm hiệu suất hệ thống, chi phí cao và khó mở rộng&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2vl42k756ahr3y3uj3o2.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2vl42k756ahr3y3uj3o2.png" alt=" " width="800" height="559"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Vì vậy consistency(tính nhất quán) không cần là giá trị tuyệt đối, là 1 sự đánh đổi chi phí vận hành, tốc độ, trải nghiệm người dùng, độ tin cậy của dữ liệu&lt;/p&gt;

&lt;h2&gt;
  
  
  2. Định nghĩa lại tư duy về Consistency
&lt;/h2&gt;

&lt;p&gt;Consistency là mức độ đồng bộ dữ liệu giữa các nơi trong hệ thống tại một thời điểm cụ thể. Thay vì hỏi dữ liệu đúng không sẽ hỏi các câu hỏi khác như là:&lt;br&gt;
Ai cần thấy dữ liệu đúng? Cần thấy dữ liệu đúng trong bao lâu? Đúng ngay hay độ trễ vài giây là chấp nhận được?&lt;br&gt;
Từ những câu trả lời chúng ta sẽ chọn ra mô hình phát triển phù hợp&lt;/p&gt;

&lt;h2&gt;
  
  
  3. 4 Mô hình Consistency
&lt;/h2&gt;

&lt;p&gt;-- Strong Consistency&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Mọi lượt đọc luôn thấy dữ liệu mới nhất. Dùng cho: Payment, Banking, Stock, Inventory&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;-- Read after write&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Người dùng thấy ngay dữ liệu họ vừa cập nhật. Dùng cho: Profile update, Post bài, Setting cá nhân.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;-- Monotonic Reads&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Không bao giờ thấy dữ liệu quay ngược thời gian, tức là không bao giờ thấy tin nhắn trong quá khứ hiển thị r biến mất sau đó xuất hiện lại. Dùng cho: Chat, notification, timeline&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;-- Eventual Consistency&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Mọi nơi sẽ đồng bộ nhưng từ từ. Dùng cho: Search, Feed, Analytics, Cache, Recommendation.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  4. Ví dụ thực tế
&lt;/h2&gt;

&lt;p&gt;Cập nhật tên profile:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F45unwmu882l20svma33v.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F45unwmu882l20svma33v.png" alt=" " width="800" height="268"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Phân tách 1 hành động thành nhiều lớp yêu cầu nhất quán khác nhau - tư duy đúng.&lt;br&gt;
"Consistency là trade-off giữa tốc độ, chi phí, UX và độ chính xác"&lt;br&gt;
Dựa trên các yếu tố:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fk6ti6xui7of760txyru4.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fk6ti6xui7of760txyru4.png" alt=" " width="800" height="393"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;That's it, Happy reading and happy coding!&lt;/p&gt;

&lt;p&gt;Hints:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fo4tu2o8geyvby7na1v9g.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fo4tu2o8geyvby7na1v9g.png" alt=" " width="800" height="436"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8yn4adr2g2x09d22nfaf.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8yn4adr2g2x09d22nfaf.png" alt=" " width="800" height="403"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>vietnameseblogs</category>
      <category>programming</category>
    </item>
    <item>
      <title>Claude code best Practices</title>
      <dc:creator>meotism</dc:creator>
      <pubDate>Tue, 23 Dec 2025 06:42:06 +0000</pubDate>
      <link>https://dev.to/meotism/claude-code-best-practices-llm</link>
      <guid>https://dev.to/meotism/claude-code-best-practices-llm</guid>
      <description>&lt;h2&gt;
  
  
  Fundamental
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Essential commands: Bash mode (cmd)

&lt;ul&gt;
&lt;li&gt;Make documentation&lt;/li&gt;
&lt;li&gt; create todo list&lt;/li&gt;
&lt;li&gt;shift+tab or /model: change model&lt;/li&gt;
&lt;li&gt;Check memory: /memory&lt;/li&gt;
&lt;li&gt;space key or esc: press one to interrupt, press twice to go back previous prompt in your session&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;Debugging:

&lt;ul&gt;
&lt;li&gt;Screenshot&lt;/li&gt;
&lt;li&gt;Write test for flow or feature&lt;/li&gt;
&lt;li&gt;Using TDD by Claude&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;Make Claude.md:

&lt;ul&gt;
&lt;li&gt;Project Overview: Appname, platform, tech stack, architecture, …&lt;/li&gt;
&lt;li&gt;Getting current Date:(notes for tech stack,…)&lt;/li&gt;
&lt;li&gt;Todo list&lt;/li&gt;
&lt;li&gt;Development Environment&lt;/li&gt;
&lt;li&gt;Common build issues &amp;amp; Solutions&lt;/li&gt;
&lt;li&gt;Testing &amp;amp; debugging&lt;/li&gt;
&lt;li&gt;Common mistake to avoid&lt;/li&gt;
&lt;li&gt;Feature Development workflow&lt;/li&gt;
&lt;li&gt;Documentation Structure&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;Message queue: mean you prompt and agent processing and you typing new prompt, they push in queue and process later but can affect previous prompt.&lt;/li&gt;

&lt;li&gt;Long prompt: should push it to prompt.md stage markdown file&lt;/li&gt;

&lt;/ul&gt;

&lt;h2&gt;
  
  
  Intermediate
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Using GitHub workflows:

&lt;ul&gt;
&lt;li&gt;Planning and thinking features&lt;/li&gt;
&lt;li&gt;Use Planning mode: choose model by cmd: /mode&lt;/li&gt;
&lt;li&gt;Thinking modes: “think” &amp;lt; “think hard” &amp;lt; think harder &amp;lt; ultra think&lt;/li&gt;
&lt;li&gt;Using research: Read link docs and research how to build api … or read pdf to implement…&lt;/li&gt;
&lt;li&gt;Create PRDs: features, user experience guides API, documentation and technical design docs.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;Automatic change tracking: /changelog day&lt;/li&gt;

&lt;li&gt;Github action Integration:

&lt;ul&gt;
&lt;li&gt;/install-github-app: you can action using by comment at push request&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;Think like product manager:

&lt;ul&gt;
&lt;li&gt;Clear, relevant context and constraints base on md file&lt;/li&gt;
&lt;li&gt;Review code and understand everything has implemented and working to verify output at higher levels of abstraction&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;h2&gt;
  
  
  Master
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Using multiple agent: Use parallel subagent to brainstorm …(and choose once)&lt;/li&gt;
&lt;li&gt;Collaborate git work tree: git worktree add {address location} and prompt to created features

&lt;ul&gt;
&lt;li&gt;When done, ask agent to merge each of work trees in one folder and fix conflict if exist&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;Custom slash commands: 2 custom cmd

&lt;ul&gt;
&lt;li&gt;/changelog&lt;/li&gt;
&lt;li&gt;/create-command&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;Subagents: cmd /agents to create sub agent delegate task handle&lt;/li&gt;

&lt;li&gt;MCP server: database MCP - ex: mongoldb-mcp, postgres mcp, supabase

&lt;ul&gt;
&lt;li&gt;Interactive with browser:click on UI&lt;/li&gt;
&lt;li&gt;Figma MCP&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;p&gt;Read more on: &lt;a href="https://code.claude.com/docs/en/cli-reference" rel="noopener noreferrer"&gt;https://code.claude.com/docs/en/cli-reference&lt;/a&gt;&lt;br&gt;
That's it! Happy reading and happy coding!&lt;/p&gt;

</description>
      <category>ai</category>
      <category>agents</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>Optimize performance APIs</title>
      <dc:creator>meotism</dc:creator>
      <pubDate>Wed, 04 Jun 2025 01:57:13 +0000</pubDate>
      <link>https://dev.to/meotism/optimize-performance-apis-246n</link>
      <guid>https://dev.to/meotism/optimize-performance-apis-246n</guid>
      <description>&lt;p&gt;Hi there! Hôm nay chúng ta cùng thảo luận về chủ đề làm sao để cải thiện hiệu suất APIs hiệu quả.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. Ghi Log&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Là một trong những chức năng cốt lõi của một ứng dụng, ghi lại thông tin hỗ trợ tối ưu hiệu suất và khắc phục sự cố.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. Cached&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Phương án dễ nhất là sử dụng cache qua: Redis vs Memcached&lt;br&gt;
Client -&amp;gt; data -&amp;gt; cache(if not) -&amp;gt; dbs&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. Lập trình không đồng bộ&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Sử dụng nhiều tác vụ xử lý trong 1 process.&lt;br&gt;
Client -&amp;gt; server -&amp;gt; task chính -&amp;gt; nhiều task phụ&lt;br&gt;
Thường được triển khai thông qua thread, message queue, event pub sub,...&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;4. N+1&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Xử lý các trường hợp N+1 query trong database, sử dụng in hoặc join để tối ưu gọi xuống db nhiều trong 1 tiến trình hoặc tạo các temporary table(views) xử lý trước (đánh đổi giữa thời gian và không gian)&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;5. Pool connection&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Tùy theo framework/package để thiết lập 1 pool connection nhiều process sử dụng chung pool connection truy cập đến database&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;6. Payload JSON&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Giảm bớt payload request đến server(bớt số lượng tham số càng ít càng tốt, định dạng file có thể nén lại gửi đến server)&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;7. Pagination&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Thêm các param để lấy data phân trang cho các API trả kết quả dạng list data như:(page, per_page) hoặc (offset, limit),...&lt;/p&gt;

&lt;p&gt;That's it! Happy reading and happy coding!&lt;/p&gt;

</description>
      <category>vietnameseblogs</category>
      <category>programming</category>
    </item>
    <item>
      <title>CATALOG OF DESIGN PATTERNS</title>
      <dc:creator>meotism</dc:creator>
      <pubDate>Thu, 27 Mar 2025 07:46:13 +0000</pubDate>
      <link>https://dev.to/meotism/catalog-of-design-patterns-3jn5</link>
      <guid>https://dev.to/meotism/catalog-of-design-patterns-3jn5</guid>
      <description>&lt;p&gt;Khi lập trình bạn đã bao giờ gặp các lỗi như: code khó đọc, code trùng lặp, import bị vòng lặp, lỗi cú pháp,... thì các bạn nên thử áp dụng các mẫu design patterns trong source code của mình.&lt;br&gt;
Thường thì một lập trình viên sẽ chủ yếu viết code đáp ứng giải quyết được  các nghiệp vụ và tối ưu code sau khi hoàn thành. Trong các trường hợp ấy đôi khi có sử dụng qua một số phương pháp tối ưu giống mẫu design patterns tuy nhiên lại không biết đó là gì và phương pháp đó thế nào giống như mình vậy. :D Nên hôm nay mình sẽ hỗ trợ các bạn tìm hiểu và triển khai các mẫu design patterns thường được sử dụng.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. Định nghĩa design pattern
&lt;/h2&gt;

&lt;p&gt;Design pattern là các mẫu thiết kế giải quyết các vấn đề theo từng loại và mục đích sử dụng trong quá trình phát triển phần mềm.&lt;br&gt;
Sử dụng design pattern khi dự án cần maintain về lâu dài, giải quyết chung một vấn đề, tái sử dụng các function, làm chung giữa nhiều members trong team,...&lt;/p&gt;

&lt;h2&gt;
  
  
  2. Phân loại mẫu design patterns
&lt;/h2&gt;

&lt;p&gt;Design patterns chia làm 3 nhóm chính:&lt;/p&gt;

&lt;h3&gt;
  
  
  1- Creational design patterns:
&lt;/h3&gt;

&lt;p&gt;Cung cấp các cơ chế đối tượng khởi tạo, giúp tăng độ linh hoạt và tái sử dụng mã nguồn đã tồn tại. Một số mẫu: Factory method, Abstract factory, builder, prototype, singleton&lt;/p&gt;

&lt;h3&gt;
  
  
  2- Structural design patterns:
&lt;/h3&gt;

&lt;p&gt;Trình bày cách lắp ráp các đối tượng và classes vào trong cấu trúc lớp hơn, trong khi vẫn giữ được cấu trúc flexible và hiệu quả. Một số mẫu: Adapter, Bridge, Composite, Decorator, Facade, Flyweight, Proxy&lt;/p&gt;

&lt;h3&gt;
  
  
  3- Behavioral design pattern:
&lt;/h3&gt;

&lt;p&gt;Liên quan đến các thuật toán và việc phân công trách nhiệm giữa các đối tượng. Một số mẫu: command, iterator, mediator, memento, observer, state, strategy, template method, visitor&lt;/p&gt;

&lt;h2&gt;
  
  
  3. Một số mẫu design patterns
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1- Factory Method (aka: Virtual Constructor)
&lt;/h3&gt;

&lt;p&gt;Factory Method thuộc nhóm creational design pattern, cung cấp interface cho creating objects trong 1 superclass, cho phép các subclasses để thay đổi loại đối tượng vừa được khởi tạo.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Problem:&lt;br&gt;
Ứng dụng quản lý logistics phiên bản đầu tiên chỉ quản lý vận chuyển bằng xe tải, nên phần lớn code sẽ nằm trong Truck class.&lt;br&gt;
Sau một thời gian, ứng dụng của bạn trở nên phổ biến hơn. Vào một ngày công ty nhận một chục yêu cầu từ các công ty vận tải biển vào trong hệ thống của bạn. Hiện tại, hầu hết code của bạn được ghép nối với class &lt;strong&gt;Truck&lt;/strong&gt;. Việc thêm &lt;strong&gt;Ships&lt;/strong&gt; vào&lt;br&gt;
ứng dụng sẽ yêu cầu thực hiện thay đổi đối với toàn bộ codebase. Bạn sẽ nhận ra phải thay đổi với các điều kiện chuyển đổi hành vi của ứng dụng tùy thuộc vào class vận chuyển&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Solution:&lt;br&gt;
Factory method pattern sẽ hỗ trợ thay thế các đối tượng construction và gọi tới các phương thức factory đặc biệt. Đối tượng trả về là thường sẽ refer đến các "product"&lt;br&gt;
Trong ví dụ này mình sẽ khởi tạo 1 interface &lt;strong&gt;Transport&lt;/strong&gt; có phương thức deliver() tuy nhiên deliver() trong &lt;strong&gt;Transport&lt;/strong&gt; không được implement thay vào đó sẽ return về các class kế thừa từ interface trên. Cả &lt;strong&gt;Truck&lt;/strong&gt; và &lt;strong&gt;Ship&lt;/strong&gt; class nên được implement &lt;strong&gt;Transport&lt;/strong&gt; interface, sẽ khai báo phương thức deliver. Tương ứng với từng class khơi tạo sẽ có các phương thức khác nhau: &lt;strong&gt;Truck&lt;/strong&gt; sẽ vận chuyển trên đất liền trong thùng còn &lt;strong&gt;Ship&lt;/strong&gt; sẽ vận chuyển trên biển và trong container.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Pros:&lt;br&gt;
Bạn tránh được sự kết hợp chặt chẽ giữa người tạo và các sản phẩm cụ thể.&lt;br&gt;
Nguyên tắc trách nhiệm đơn lẻ. Bạn có thể di chuyển mã tạo sản phẩm vào một nơi trong chương trình, giúp mã dễ hỗ trợ hơn.&lt;br&gt;
Nguyên tắc mở/đóng. Bạn có thể giới thiệu các loại sản phẩm mới vào chương trình mà không làm hỏng mã máy khách hiện có.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Cons:&lt;br&gt;
Mã có thể trở nên phức tạp hơn vì bạn cần giới thiệu nhiều lớp con mới để triển khai mẫu.&lt;br&gt;
Kịch bản tốt nhất là khi bạn giới thiệu mẫu vào hệ thống phân cấp hiện có của các lớp người tạo.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F4odfyboxe6tmdtbelvx9.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F4odfyboxe6tmdtbelvx9.png" alt="Image description" width="610" height="379"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  2- Singleton
&lt;/h3&gt;

&lt;p&gt;Singleton thuộc nhóm creational design pattern cho phép chắc chắn 1 class chỉ có 1 instance và cung các điểm kết nối đến instance.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Problem:&lt;br&gt;
Singleton pattern giải quyết được 2 vấn đề cùng lúc, tuy nhiên vi phạm tính single responsibility principle&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Đảm bảo class chỉ có 1 khởi tạo: Cho các trường hợp Clients có thể không nhận ra họ đang làm việc với các đối tượng giống nhau trong cùng một thời điểm&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Cung cấp điểm truy cập đến khởi tạo đó: Giống như biến toàn cục, Singleton pattern dẫn bạn kết nối đến đối tượng từ bất cứ đâu trong chương trình. Tuy nhiên, nó cũng bảo vệ khởi tạo từ việc ghi đè bởi các code khác.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Solution:&lt;br&gt;
Triển khai Singleton có 2 bước thông thường:&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Tạo mặc định constructor private, tránh các đối tượng khác sử dụng toán tử &lt;strong&gt;new&lt;/strong&gt; với Singleton class&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Tạo một phương thức creation tĩnh hoạt động như là một constructor. Trong phương thức này sẽ gọi private constructor và lưu nó trong giá trị tĩnh. Các lệnh gọi vào phương thức nào đều trả về đối tượng đã lưu trong cached.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Pros:&lt;br&gt;
Bạn có thể chắc chắn 1 class chỉ có 1 instance.&lt;br&gt;
Bạn có điểm kết nối đến instance đó.&lt;br&gt;
Đối tượng Singleton chỉ khởi tạo khi có yêu cầu lần đầu tiên truy cập.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Cons:&lt;br&gt;
Vi phạm tính single responsibility principle.&lt;br&gt;
Singleton có thể làm xấu design và tăng sự phụ thuộc giữa các components.&lt;br&gt;
Một số môi trường đa luồng cần xử lý Singleton đặc biệt.&lt;br&gt;
Khó tạo các unit test vì test framework dựa vào kế thừa và không thể tạo các data ghi đè các phương thức tĩnh.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Furageiq189wd7t6w4plw.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Furageiq189wd7t6w4plw.png" alt="Image description" width="612" height="445"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  3- Adapter
&lt;/h3&gt;

&lt;p&gt;Adapter thuộc structural design pattern cho phép các đối tượng và các interface không tương thích cộng tác với nhau&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Problem:&lt;br&gt;
Khi truyền tải dữ liệu từ nhà cung cấp data chứng khoán sang Core hệ thống máy để đưa vào thư viện phân tích thì truyền tải các kiểu dữ liệu khác nhau, tuy nhiên mình(Core hệ thống máy) không thể can thiệp chuyển đổi dữ liệu của các kênh khác (thư viện phân tích, nhà cung cấp)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Solution:&lt;br&gt;
Tại Core hệ thống máy mình sẽ tạo đối tượng đặc biệt là adapter để chuyển đổi các interface của một đối đối tượng thành 1 đối tượng khác mà các kênh (thư viện phân tích, nhà cung cấp) có thể hiểu được&lt;br&gt;
Ví dụ:&lt;br&gt;
XML -&amp;gt; XML -&amp;gt; JSON =&amp;gt; XML -&amp;gt; XML và Adapter(convert XML-&amp;gt;JSON) -&amp;gt; JSON&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Pros:&lt;br&gt;
Nguyên tắc trách nhiệm đơn lẻ. Bạn có thể di chuyển mã tạo sản phẩm vào một nơi trong chương trình, giúp mã dễ hỗ trợ hơn.&lt;br&gt;
Nguyên tắc mở/đóng. Bạn có thể giới thiệu các loại sản phẩm mới vào chương trình mà không làm hỏng mã máy khách hiện có.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Cons:&lt;br&gt;
Độ phức tạp của code tăng. Đôi khi chỉ cần thay đổi lớp dịch vụ sao cho phù hợp với phần còn lại của mã của bạn là đơn giản hơn.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fxr8lzimrlvk7yyzr1j8p.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fxr8lzimrlvk7yyzr1j8p.png" alt="Image description" width="560" height="331"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  4- Decorator
&lt;/h3&gt;

&lt;p&gt;Decorator thuộc structural design pattern cho phép thêm các hành vi mới của đối tượng bằng cách cho đối tượng vào trong đối tượng đặc biệt wrapper chứa các hành vi mới&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Problem:&lt;br&gt;
Giả sử có Notifier class có các class con: SMS Notifier, Facebook Notifier và Slack Notifier. Một số người muốn sử dụng kết hợp gửi thông báo giữa SMS và Facebook, một số lại muốn gửi Slack và SMS, một số gửi thông báo Facebook và Slack,... Bạn phải tìm cách khác về cấu trúc class thông báo để phù hợp hơn&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Solution:&lt;br&gt;
Tạo một đối tượng &lt;strong&gt;wrapper&lt;/strong&gt; liên kết với &lt;strong&gt;Notifier&lt;/strong&gt;. Wrapper chứa các phương thức giống với &lt;strong&gt;Notifier&lt;/strong&gt; và ủy thác cho Wrapper tất cả các yêu cầu nhận được. Tuy nhiên, &lt;strong&gt;Wrapper&lt;/strong&gt; nhỏ hơn có thể thay thế kết quả trước hoặc sau khi nó được chuyển đến &lt;strong&gt;Wrapper&lt;/strong&gt; chính&lt;br&gt;
Theo ví dụ, Notifier sẽ có class BaseDecorator và trong phương thức construction sẽ chứa tham số Notifier(wrapper: notifier) và phương thức send(message). Class BaseDecorator sẽ có các class con khác như: SMS Decorator, Facebook Decorator, Slack Decorator với phương thức send(message) khác nhau tương ứng&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Pros:&lt;br&gt;
Có thể mở rộng hành vi của đối tượng mà không cần tạo mới một subclass.&lt;br&gt;
Bạn có thể thêm hoặc bớt nhiệm vụ của đối tượng trong thời điểm đang hoạt động.&lt;br&gt;
Bạn có thể kết hợp chung bởi wrapping một đối tượng vào trong nhiều decorators khác nhau.&lt;br&gt;
Bạn có thể chia nhỏ một class lớn thành nhiều biến thể hành vi của các class nhỏ hơn.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Cons:&lt;br&gt;
Rất khó khi xóa 1 wrapper cụ thể từ một ngăn xếp wrappers.&lt;br&gt;
Khó khi khởi tạo một decorator khi hành vi không phụ thuộc vào trật tự của ngăn xếp wrappers.&lt;br&gt;
Khởi tạo ban đầu của các đối tượng trông rất xấu.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fdjz5eie8x8mnpvb1tlar.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fdjz5eie8x8mnpvb1tlar.png" alt="Image description" width="723" height="598"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  5- Observer
&lt;/h3&gt;

&lt;p&gt;Observer thuộc nhóm behavioral design pattern cho phép bạn định nghĩa các cơ chế đăng ký thông báo cho nhiều đối tượng về các events xảy ra mà đối tượng đang quan sát.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Problem:&lt;br&gt;
Ví dụ khách hàng có thể ghé cửa hàng mỗi ngày và kiểm tra sản phẩm mới ra mắt có hàng không. Tuy nhiên khi sản phẩm đang trong quá trình vận chuyển thì hầu hết lần ghé đều vô nghĩa. Mặt khác, cửa hàng có thể gửi email(spam) đến tất cả khách hàng đồng thời về 1 sản phẩm sắp ra mắt. Điều này sẽ giúp một số khách hàng không phải đi đến cửa hàng liên tục. Đồng thời, nó sẽ làm phiền những khách hàng khác không quan tâm đến sản phẩm mới.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Solution:&lt;br&gt;
Khởi tạo các trạng thái đối tượng pub-sub.&lt;br&gt;
Observer pattern hỗ trợ bạn thêm các cơ chế đăng ký cho các pub để các sub đăng ký hoặc hủy đăng ký các luồng event từ pud đó.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Pros:&lt;br&gt;
Nguyên tắc mở/đóng. Bạn có thể giới thiệu các loại sản phẩm mới vào chương trình mà không làm hỏng mã máy khách hiện có.&lt;br&gt;
Bạn có thể thành lập mối quan hệ giữa các đối tượng ngay lập tức&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Cons:&lt;br&gt;
Người đăng ký(sub) nhận thông báo theo thứ tự ngẫu nhiên&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fjw42inkb1ekzk451a6bi.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fjw42inkb1ekzk451a6bi.png" alt="Image description" width="593" height="355"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  6- Template Method
&lt;/h3&gt;

&lt;p&gt;Template method thuộc nhóm behavioral design pattern được định nghĩa là bộ khung thuật toán của lớp cha tuy nhiên cho phép các lớp con ghi đè lên các bước thuật toán mà không thay đổi cấu trúc của nó.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Problem:&lt;br&gt;
Giả sử khi bạn xử lý data nhiều file khác nhau(doc, csv, pdf) nhưng sẽ có các bước chung trong quá trình xử lý.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Solution:&lt;br&gt;
Template Method pattern giúp chia nhỏ thuật toán thành loạt các bước, chuyển đổi các bước thành các phương thức và đưa một loạt lệnh gọi phương thức vào trong 1 "template method". Các bước có thể là trừu tượng hoặc là định nghĩa mặc định. Như ví dụ trên ta sẽ tạo một class DataMiner trong đó có các phướng thức là các bước ví dụ như: 1,2,3,4,... thì sẽ có class PDFMiner có các phương thức(2,3), DocMiner(1,2,3), .... và có thể thay đổi khởi tạo các phương thức nhưng không thay đổi các đặc tính của class DataMiner.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Pros:&lt;br&gt;
Bạn có thể cho phép class con ghi đè chỉ một số phần nhất định của thuật toán lớn, khiến chúng ít bị ảnh hưởng bởi những thay đổi xảy ra với các phần khác của thuật toán. &lt;br&gt;
Bạn có thể lấy code trùng lặp vào class cha để không phải khởi tạo trong các class con.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Cons:&lt;br&gt;
Một số class con có thể bị giới hạn bởi khung thuật toán.&lt;br&gt;
Bạn có thể vi phạm nguyên tắc thay thế Liskov bằng cách ngăn chặn triển khai mặc định thông qua class con.&lt;br&gt;
Các phương thức ban đầu khó bảo trì hơn vì có nhiều bước hơn.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fhhfjv3oykg284uny9j0z.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fhhfjv3oykg284uny9j0z.png" alt="Image description" width="537" height="455"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  7- Strategy
&lt;/h3&gt;

&lt;p&gt;Strategy thuộc nhóm behavioral design pattern được định nghĩa là một gia đình của thuật toán, đẩy từng phương thức vào trong một class mở rộng, và làm các đối tượng có thể hoán đổi được cho nhau&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Problem:&lt;br&gt;
Giả sử bạn cần di chuyển ra sân bay thì sẽ có các chiến lược(strategy) khác nhau: Đi xe đạp (0 phí, 30 phút); Đi xe buýt(tốn 2 đồng, 20 phút); Đi xe ô tô(3 đồng, 10 phút)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Solution:&lt;br&gt;
Tạo một interface Strategy là bối cảnh(context) và có các lớp khác nhau tùy theo các chiến lược. Theo cách này, bối cảnh trở nên độc lập với các chiến lược cụ thể, do đó bạn có thể thêm các thuật toán mới hoặc sửa đổi các thuật toán hiện có mà không cần thay đổi code của bối cảnh hoặc các chiến lược khác.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Pros:&lt;br&gt;
Bạn có thể cô lập các chi tiết triển khai của một thuật toán khỏi mã sử dụng thuật toán đó.&lt;br&gt;
Bạn có thể thay thế kế thừa bằng thành phần.&lt;br&gt;
Nguyên tắc Mở/Đóng. Bạn có thể giới thiệu các chiến lược mới mà không cần phải thay đổi ngữ cảnh.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Cons:&lt;br&gt;
Nếu bạn chỉ có một vài thuật toán và chúng hiếm khi thay đổi, thì không có lý do thực sự nào để làm phức tạp chương trình bằng các lớp và interface mới đi kèm với mẫu.&lt;br&gt;
Người dùng phải nhận thức được sự khác biệt giữa các chiến lược để có thể chọn một chiến lược phù hợp.&lt;br&gt;
Rất nhiều ngôn ngữ lập trình hiện đại có hỗ trợ kiểu chức năng cho phép bạn triển khai các phiên bản khác nhau của một thuật toán bên trong một tập hợp các hàm ẩn danh. Sau đó, bạn có thể sử dụng các hàm này chính xác như cách bạn sử dụng các đối tượng chiến lược, nhưng không làm tăng số lượng dòng code của bạn bằng các lớp và giao diện bổ sung.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fs80op1t0abu96dmewjdp.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fs80op1t0abu96dmewjdp.png" alt="Image description" width="614" height="545"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Happy reading and happy coding!&lt;br&gt;
&lt;strong&gt;Nguồn tham khảo:&lt;/strong&gt;&lt;br&gt;
&lt;a href="https://refactoring.guru/design-patterns/creational-patterns" rel="noopener noreferrer"&gt;https://refactoring.guru/design-patterns/creational-patterns&lt;/a&gt;&lt;br&gt;
&lt;a href="https://lptech.asia/kien-thuc/design-pattern-la-gi-cac-loai-design-pattern-thong-dung" rel="noopener noreferrer"&gt;https://lptech.asia/kien-thuc/design-pattern-la-gi-cac-loai-design-pattern-thong-dung&lt;/a&gt;&lt;br&gt;
dive-into-design-patterns&lt;/p&gt;

</description>
      <category>programming</category>
      <category>vietnameseblogs</category>
    </item>
    <item>
      <title>Data protection for API of Backend</title>
      <dc:creator>meotism</dc:creator>
      <pubDate>Mon, 24 Feb 2025 04:41:37 +0000</pubDate>
      <link>https://dev.to/meotism/data-protection-for-api-of-backend-4068</link>
      <guid>https://dev.to/meotism/data-protection-for-api-of-backend-4068</guid>
      <description>&lt;p&gt;Hi, mình là Meotism và hôm nay mình chia sẻ các cách bảo vệ dữ liệu API với tư cách Backend Developer.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Authentication và authorization&lt;br&gt;
Dùng để xác thực người dùng và kiểm tra quyền truy cập người dùng, sử dụng thông qua token&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Cơ chế signature&lt;br&gt;
Generation signature để kiểm tra sự thay đổi trong quá trình gửi request, chống thay đổi payload khi truyền tải.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Time mechanism&lt;br&gt;
Cơ chế này dùng để xác thực thời gian request có còn hợp lệ không. Ví dụ tạo một short link tồn tại sau 1 phút thì khi truy cập vào link client sẽ gửi thêm thời gian request đến API để kiểm tra hợp lệ thời điểm truy cập&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Rate limits&lt;br&gt;
Cơ chế dùng để hạn chế số lượng requests tới server trong khoảng thời gian cụ thể. Ví dụ: 1000 requests/1 phút&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;IP access limit&lt;br&gt;
Cơ chế cho phép những clients có IP truy cập đến API server thông qua blacklist và whitelist&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;encrypt data&lt;br&gt;
Mã hoá dữ liệu khi truyền dữ liệu&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;That's it! Hi vọng bài viết giúp ít được cho mọi người. &lt;/p&gt;

&lt;p&gt;Happy reading and happy coding!&lt;/p&gt;

</description>
      <category>vietnameseblogs</category>
      <category>programming</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>Day before an interview how I prepare</title>
      <dc:creator>meotism</dc:creator>
      <pubDate>Sat, 21 Dec 2024 08:35:22 +0000</pubDate>
      <link>https://dev.to/meotism/day-before-an-interview-how-i-prepare-40mi</link>
      <guid>https://dev.to/meotism/day-before-an-interview-how-i-prepare-40mi</guid>
      <description>&lt;p&gt;Chào các bạn, lâu rồi mình không lên bài viết mới. :D Trong thời buổi layoff ngành IT cao,  mình xem được một video hay về chuyện chuẩn bị cho buổi phỏng vấn. Video này của tác giả "kproductmanager" mình sẽ take notes lại để các bạn nắm thông tin và lưu lại để mình sử dụng về sau. :D Nội dung như sau:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Nên dành ít nhất 1 tiếng để hiểu những kinh nghiệm mà nhà tuyển dụng đang tìm kiếm, công ty đang xin việc đang làm về mảng gì, giá trị gì cho xã hội và những câu hỏi mà nhà tuyển dụng đã hỏi các ứng viên trước.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Tìm kiếm các thông tin công ty trên blind, glassdoor, exponent, medium, ... Bạn có thể tìm thấy 1 danh sách các câu hỏi của các ứng viên trước và bạn có thể chuẩn bị gây ấn tượng với nhà tuyển dụng.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Sau đó hay xem mô tả chi tiết công việc, xem kỹ các yêu cầu bằng cấp hoặc phần nhiệm vụ công việc để so sánh với khả năng bản thân thì điều gì mình nổi bật hãy cố gắng thuyết trình trong buổi phỏng vấn.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Tìm kiếm các nguyên tắc, văn hoá hoặc giá trị công ty. Các thông tin giúp bạn hiểu công ty đang quan tâm nhân viên thế nào và bạn cố gắng nên đưa những văn hoá, nguyên tắc đó vào trong buổi phỏng vấn nếu có thể.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Cuối cùng, bạn nên viết ra các câu trả lời cho tất cả các câu hỏi dự kiến trong buổi phỏng vấn đồng thời bao gồm các giá trị của công ty và kinh nghiệm làm việc liên quan của bạn.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Và đó là toàn bộ nội dung mà tác giả chia sẻ. Bạn có thể follow tại: &lt;a href="https://www.instagram.com/kproductmanager" rel="noopener noreferrer"&gt;https://www.instagram.com/kproductmanager&lt;/a&gt; để xem các nội dung khác của anh ấy.&lt;/p&gt;

&lt;p&gt;Happy reading and happy coding!&lt;/p&gt;

</description>
      <category>motivation</category>
      <category>learning</category>
      <category>vietnameseblogs</category>
    </item>
    <item>
      <title>Cơ bản Service Mesh</title>
      <dc:creator>meotism</dc:creator>
      <pubDate>Tue, 24 Sep 2024 04:49:25 +0000</pubDate>
      <link>https://dev.to/meotism/co-ban-service-mesh-219h</link>
      <guid>https://dev.to/meotism/co-ban-service-mesh-219h</guid>
      <description>&lt;p&gt;Hi, mình là Meotism. Bài viết này sẽ hỗ trợ các bạn hiểu sơ lược về Service Mesh để triển khai mô hình Microservices.&lt;br&gt;
Nội dung bài viết sẽ có 3 phần chính:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Khái niệm&lt;/li&gt;
&lt;li&gt;Thành phần trong Service Mesh&lt;/li&gt;
&lt;li&gt;Đánh giá Service Mesh&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;1. Khái niệm Service Mesh&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Service Mesh là một layer hạ tầng trung gian trong mô hình Microservices, được sử dụng điều khiển và giám sát toàn bộ các luồng packets (network traffic) được gửi nhận giữa các services (service-to-service)thông qua các APIs bằng các giao thức(HTTP/1.1, HTTP/2, TCP TLS/mTLS).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. Thành phần trong Service Mesh&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Có 2 thành phần chính trong Service Mesh:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Data Plane&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Control Plane&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Data Plane là vùng triển khai mô hình network là tập hợp các Sidecar Proxy với các Sidecar giám sát các luồng packets gửi nhận của từng instance services. Các ứng dụng Data Plane như: Service Discovery, Load Balancing, Authentication and Authorization, Request Tracing, Traffic Management, Fault Injection, Rate Limiting, Data Observability. Một số Data Plane phổ biến là NGINX, HAProxy,...&lt;/p&gt;

&lt;p&gt;Control Plane là trung tâm điều khiển mọi hoạt động của của service-mesh, để thiết lập cấu hình của Sidecar Proxy và thu thập, cung cấp dữ liệu giám sát và phân tích network trong nội bộ Microservices. Một số Control Plane phổ biến như Istio, Consult,...&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. Đánh giá Service Mesh&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;***** Ưu điểm:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Quản lý và kiểm soát giao tiếp mạng vào/ra giữa các services hiệu quả.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Dễ dàng quan sát, phân tích lỗi liên quan đến network tại các services.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Đinh danh và xác thực các kết nối mạng giữa các instance service.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Triển khai và kiểm thử rất tiện và hiệu quả, chỉ cần config một lần sẽ không cần config những lần sau và không quan tâm đến vấn đề network và giao tiếp giữa các services.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;*****  Nhược điểm:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Phức tạp hơn khi triển khai ứng dụng theo mô hình Microservices.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Làm tăng độ trễ cho thời gian thực thi ứng dụng &amp;amp; giao tiếp, do request phải đi qua những Sidecar Proxy kiểm tra.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Không định danh được các third-party tích hợp với các services hoặc hệ thống bên ngoài như: routing type — loại định tuyến (static routing, dynamic routing) , transformation mapping — ánh xạ chuyển đổi giữa các giao thức kết nối (HTTP rest &amp;lt;-&amp;gt; gRPC)&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Happy Reading and happy Coding!&lt;/p&gt;

&lt;p&gt;*&lt;em&gt;References: *&lt;/em&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://www.nginx.com/blog/what-is-a-service-mesh/" rel="noopener noreferrer"&gt;https://www.nginx.com/blog/what-is-a-service-mesh/&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://blog.envoyproxy.io/the-universal-data-plane-api-d15cec7a" rel="noopener noreferrer"&gt;https://blog.envoyproxy.io/the-universal-data-plane-api-d15cec7a&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://medium.com/vinid/c%C6%A1-b%E1%BA%A3n-service-mesh-istio-cho-ng%C6%B0%E1%BB%9Di-m%E1%BB%9Bi-b%E1%BA%AFt-%C4%91%E1%BA%A7u-3563b582ed51" rel="noopener noreferrer"&gt;https://medium.com/vinid/c%C6%A1-b%E1%BA%A3n-service-mesh-istio-cho-ng%C6%B0%E1%BB%9Di-m%E1%BB%9Bi-b%E1%BA%AFt-%C4%91%E1%BA%A7u-3563b582ed51&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

</description>
      <category>microservices</category>
      <category>backend</category>
      <category>vietnameseblogs</category>
    </item>
    <item>
      <title>Backend example tutorial</title>
      <dc:creator>meotism</dc:creator>
      <pubDate>Fri, 17 Mar 2023 02:06:50 +0000</pubDate>
      <link>https://dev.to/meotism/backend-example-tutorial-15pi</link>
      <guid>https://dev.to/meotism/backend-example-tutorial-15pi</guid>
      <description>&lt;h2&gt;
  
  
  I.   Python tutorial example:
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt; Tạo môi trường ảo (virtual environment)&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Step 1: CMD: pip install virtualenv&lt;br&gt;
Step 2: Truy cập vào folder project, CMD: python -m venv env&lt;br&gt;
Step 3: Kích hoạt môi trường ảo, CMD: env\Scripts\activate (Đối với Win), source env/bin/activate (Đối với linux)&lt;br&gt;
Step 4: Cài đặt các thư viện cần thiết cho project &amp;lt;2&amp;gt;&lt;br&gt;
Step 5: Để out môi trường ảo sử dụng CMD: Deactivate&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt; Cài đặt các thư viện cần thiết cho project&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Step 1: Tạo tệp txt chứa tên các thư viện cần thiết cho project (thường tên file là requirements.txt)&lt;br&gt;
Step 2: pip install –r requirements.txt&lt;br&gt;
Một số câu lệnh cần thiết: &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  pip freeze: liệt kê tất cả thư viện đã được cài đặt tại môi trường ảo&lt;/li&gt;
&lt;li&gt;  pip uninstall –r requirements.txt: xóa tất cả thư viện đã cài được viết trong txt.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  II.  Flask tutorial example:
&lt;/h2&gt;

&lt;p&gt;Flask là framework chứa nhiều thư viện để triển khai project website hoàn chỉnh. &lt;br&gt;
Sử dụng thư viện flask_restful để tạo ra các apis xử lý và tương tác CRUD dưới DB.&lt;br&gt;
Input các API: Query parameters, Path parameters, Request Body, HTTP methods&lt;br&gt;
Notes: HTTP methods có 4 loại chính GET(lấy dữ liệu), POST(tạo dữ liệu), PUT(sửa dữ liệu), DELETE(xóa dữ liệu). Với method GET thì không nên có Request Body&lt;br&gt;
Ví dụ về Path và Query parameters:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  GET/users?limit=5 (trả về 5 giá trị đầu khi query select user)&lt;/li&gt;
&lt;li&gt;  GET/users/{id} =&amp;gt; GET/users/3 (trả về kết quả query select user where id =3)
Output các API: JSON, XML, CSV, HTML, text&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  III. Common Python ORM (SQLalchemy)
&lt;/h2&gt;

&lt;p&gt;ORM là object relational mapping dùng để dễ dàng kết nối giữa đối tượng class map với bảng trong database. Thông qua ORM sẽ hỗ trợ các hàm tương ứng với các câu lệnh query dưới DB.&lt;br&gt;
Đọc thêm tại: ORM Mapped Class Overview — SQLAlchemy 2.0 Documentation&lt;/p&gt;

&lt;h2&gt;
  
  
  IV.  Redis – Cache (Flask queue)
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Redis – cache dùng để lưu các dữ liệu tạm thời trong bộ nhớ đệm, ngoài ra còn dùng để xử lý các logic làm tăng hiệu suất và khả năng mở rộng.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Flask queue&lt;br&gt;
Đọc thêm tại: Asynchronous Tasks with Flask and Redis Queue | TestDriven.io&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  V.   APIs Gateway, Service Discovery (Library Kong)
&lt;/h2&gt;

&lt;p&gt;APIs Gateway, service Discovery dùng cho các kiến trúc phần mềm Microservice. Một hệ thống có nhiều servers nên để có thể kết nối truyền dẫn input và output giữa các server nên phải dùng Service Discovery. APIs Gateway dùng để khi apps gọi API sẽ được điều hướng đúng đến API của server chứa API đó thông qua prefix url. Ngoài ra APIs Gateway dùng để authen xác thực khi gọi các APIs. &lt;br&gt;
Đọc thêm tại: Building a geocoding plugin for the Kong Gateway using Python | Kong Inc. (konghq.com)&lt;/p&gt;

&lt;h2&gt;
  
  
  VI.  Docker
&lt;/h2&gt;

&lt;p&gt;Đọc thêm tại: DevOps with Docker | DevOps with Docker&lt;br&gt;
Happy Reading and happy Coding!&lt;/p&gt;

</description>
      <category>tutorial</category>
      <category>python</category>
      <category>vietnameseblogs</category>
    </item>
    <item>
      <title>ACID Property in Database</title>
      <dc:creator>meotism</dc:creator>
      <pubDate>Fri, 10 Feb 2023 05:50:27 +0000</pubDate>
      <link>https://dev.to/meotism/acid-property-in-database-a5h</link>
      <guid>https://dev.to/meotism/acid-property-in-database-a5h</guid>
      <description>&lt;p&gt;Hầu hết các bạn lập trình viên làm việc với cơ sở dữ liệu đều đã nghe qua các tính chất ACID trong cơ sở dữ liệu. Tại bài viết này mình sẽ giới thiệu lại cho các bạn các tính chất của transaction trong cơ sở dữ liệu quan hệ.&lt;br&gt;
Đầu tiên ACID là viết tắt các chữ cái đầu của Atomicity, Consistency, Isolation, Durability. Để CSDL đúng chuẩn và có độ tin cậy cao thì phải có đủ 4 tính chất này.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ftcf7ytto3f60l9cw1wda.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ftcf7ytto3f60l9cw1wda.png" alt="Image description" width="800" height="453"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Ta đi vào chi tiết từng tính chất:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Atomicity: giao dịch xử lý tất cả hoặc không có gì. Tính chất này đảm bảo có nhiều hơn 1 giao dịch xử lý thì tất cả giao dịch đều được thực hiện hoặc không có giao dịch nào thành công.&lt;/li&gt;
&lt;li&gt;Consistency: Tính chất đảm bảo rằng trong phiên giao dịch phải được thực hiện hoàn toàn thì mới ghi nhận xuống CSDL, nếu trong quá trình chạy gặp sự cố thì giao dịch sẽ rollback lại trả về trạng thái ban đầu.&lt;/li&gt;
&lt;li&gt;Isolation: Tính chất này đảm bảo các giao dịch sẽ được cô lập không cho cùng truy cập chung vùng nhớ.(Tránh dữ liệu bị ghi đè hoặc tạo dữ liệu không chính xác).&lt;/li&gt;
&lt;li&gt;Durability: Tính chất đảm bảo trường hợp CSDL bản mới bị lỗi không thể mở hay sử dụng sẽ khởi động lại các dữ liệu có sẵn trước khi bị lỗi.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Happy Reading and happy Coding!&lt;br&gt;
Nguồn tham khảo: &lt;a href="https://blog.sqlauthority.com/2016/04/10/acid-properties-database-interview-question-week-066/" rel="noopener noreferrer"&gt;https://blog.sqlauthority.com/2016/04/10/acid-properties-database-interview-question-week-066/&lt;/a&gt;&lt;/p&gt;

</description>
      <category>database</category>
      <category>vietnameseblogs</category>
    </item>
    <item>
      <title>CI / CD pipeline</title>
      <dc:creator>meotism</dc:creator>
      <pubDate>Fri, 03 Feb 2023 03:47:24 +0000</pubDate>
      <link>https://dev.to/meotism/ci-cd-pipeline-15p6</link>
      <guid>https://dev.to/meotism/ci-cd-pipeline-15p6</guid>
      <description>&lt;p&gt;CI/CD pipeline là tập hợp các quy trình xây dựng và triển khai sản phẩm ứng dụng.&lt;br&gt;
CI/CD là viết tắt của Continuous Integration(tích hợp liên tục) và Continuous Delivery(triển khai liên tục).&lt;br&gt;
Một số công cụ hỗ trợ CI/CD:&lt;br&gt;
AWS CodePipeline, Github Action, GitLab CI/CD, Jenkins, ...&lt;/p&gt;

&lt;p&gt;Trong tích hợp liên tục có các quy trình sau:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Plan, Code, Build, Test
Continuous delivery bao gồm các quy trình:&lt;/li&gt;
&lt;li&gt;Release, Deploy, Operate
Trong đó:&lt;/li&gt;
&lt;li&gt;Plan stage: Lên kế hoạch và triển khai bắt đầu dự án.&lt;/li&gt;
&lt;li&gt;Code stage: Lập trình viên sẽ code và thay đổi code liên tục
trên source code.&lt;/li&gt;
&lt;li&gt;Build stage: Code được build và triển khai qua Docker. Nếu xảy ra lỗi thì các lập trình viên phải sửa trước khi qua bước tiếp theo&lt;/li&gt;
&lt;li&gt;Test stage: sẽ có unit test và integration test. Việc test thực hiện để đảm bảo chương trình chạy được và đúng với thiết kế ban đầu.&lt;/li&gt;
&lt;li&gt;Release stage: Phần code đó đã có thể triển khai cho thành sản phẩm việc chạy thử(release môi trường staging) để các bạn testers kiểm tra các flow chính của chương trình. Nếu có feedback thì các lập trình viên điều chỉnh code phù hợp với nghiệp vụ.&lt;/li&gt;
&lt;li&gt;Deploy stage: Sau khi testers kiểm tra xong thì triển khai sản phẩm trên môi trường production cho người dùng cuối sử dụng.&lt;/li&gt;
&lt;li&gt;Operate stage: Bảo trì và phát triển hệ thống phần mềm.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Happy Reading and happy Coding!&lt;/p&gt;

</description>
      <category>security</category>
      <category>productivity</category>
      <category>discuss</category>
    </item>
    <item>
      <title>Web's working principles</title>
      <dc:creator>meotism</dc:creator>
      <pubDate>Sat, 27 Aug 2022 03:02:00 +0000</pubDate>
      <link>https://dev.to/meotism/webs-working-principles-2a7o</link>
      <guid>https://dev.to/meotism/webs-working-principles-2a7o</guid>
      <description>&lt;p&gt;*Web's working principles theo 4 bước:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Client sử dụng giao thức TCP/IP để connect server.&lt;/li&gt;
&lt;li&gt;Client gửi package HTTP request đến server.&lt;/li&gt;
&lt;li&gt;Server trả về package HTTP response đến client. Nếu trong package request có chứa dynamic scripts, server sẽ chạy scripts trước.&lt;/li&gt;
&lt;li&gt;Client nhận package HTTP response và mất kết nối từ server, bắt đầu rendering HTML.
URLs: truy cập web pages.
DNS: domain name server sẽ lấy địa chỉ IP của host.
Các thông báo đến client:&lt;/li&gt;
&lt;/ul&gt;

&lt;ol&gt;
&lt;li&gt;1xx Informational&lt;/li&gt;
&lt;li&gt;2xx Success&lt;/li&gt;
&lt;li&gt;3xx Redirection&lt;/li&gt;
&lt;li&gt;4xx Client Error&lt;/li&gt;
&lt;li&gt;5xx Server Error&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;REST là các phương thức của truyền tải http:&lt;br&gt;
GET - display &amp;lt;=&amp;gt; Read&lt;br&gt;
POST - create &amp;lt;=&amp;gt; Create&lt;br&gt;
PUT - update  &amp;lt;=&amp;gt; Update&lt;br&gt;
DELETE - delete &amp;lt;=&amp;gt; Delete&lt;/p&gt;




&lt;p&gt;*Policy CORS&lt;br&gt;
Cors là cơ chế hỗ trợ bảo mật cho các đường truyền request-origin và chuyển dữ liệu giữa client và servers. Nó cho phép truy cập across domain khác.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Lỗi CORS policy:
Khi bạn call API tới server mà không có header Access-Control-Allow-Origin hoặc giá trị không hợp lệ thì phát sinh lỗi không lấy dữ liệu từ API. &lt;/li&gt;
&lt;li&gt;Cách khắc phục:
Enable CORS tại server
Tại nginx:
add_header Access-Control-Allow-Origin *;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Tại web application(ví dụ go):&lt;br&gt;
 func enableCors(w &lt;em&gt;http.ResponseWriter) {&lt;br&gt;
(*w).Header().Set("Access-Control-Allow-Origin", "&lt;/em&gt;")&lt;br&gt;
}&lt;br&gt;
và thêm enableCors(&amp;amp;w) tại các hàm handler&lt;/p&gt;




</description>
      <category>beginners</category>
      <category>vietnameseblogs</category>
    </item>
    <item>
      <title>Docker basic</title>
      <dc:creator>meotism</dc:creator>
      <pubDate>Fri, 26 Aug 2022 10:28:15 +0000</pubDate>
      <link>https://dev.to/meotism/docker-basic-5e5e</link>
      <guid>https://dev.to/meotism/docker-basic-5e5e</guid>
      <description>&lt;p&gt;------link: &lt;a href="https://devopswithdocker.com/part-1/6-docker-hub" rel="noopener noreferrer"&gt;https://devopswithdocker.com/part-1/6-docker-hub&lt;/a&gt;&lt;br&gt;
-- install docker using the reposity:&lt;br&gt;
Set up the reposity:&lt;br&gt;
 sudo apt-get update&lt;br&gt;
 sudo apt-get install \&lt;br&gt;
    ca-certificates \&lt;br&gt;
    curl \&lt;br&gt;
    gnupg \&lt;br&gt;
    lsb-release&lt;br&gt;
Add Docker's GPG key:&lt;br&gt;
sudo mkdir -p /etc/apt/keyrings&lt;br&gt;
 curl -fsSL &lt;a href="https://download.docker.com/linux/ubuntu/gpg" rel="noopener noreferrer"&gt;https://download.docker.com/linux/ubuntu/gpg&lt;/a&gt; | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg&lt;br&gt;
 Set up the repository:&lt;br&gt;
 echo \&lt;br&gt;
  "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] &lt;a href="https://download.docker.com/linux/ubuntu" rel="noopener noreferrer"&gt;https://download.docker.com/linux/ubuntu&lt;/a&gt; \&lt;br&gt;
  $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list &amp;gt; /dev/null&lt;br&gt;
 Test installed by running hello-world image:&lt;br&gt;
 docker run hello-world&lt;br&gt;
 -- About docker image and container:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Docker image chứa source code, thư viện,... và các file cần thiết để chạy 1 ứng dụng.&lt;/li&gt;
&lt;li&gt;Docker image chỉ có tính chất read-only nên hay được gọi là snapshots(không thể start hay run image).&lt;/li&gt;
&lt;li&gt;Docker container là runtime environment. Mỗi container hoạt động độc lập, 1 container lỗi không làm ảnh hưởng đến container khác và không làm ảnh hưởng đến server.&lt;/li&gt;
&lt;li&gt;Image có thể tồn tại mà không cần container, container chạy cần có image trong container đó.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;--- From dockerfile to image to container:&lt;br&gt;
 =&amp;gt; 3 useful flags. -i (interactive), -t (tty) and -d (detached).&lt;br&gt;
 -it allows you to interact with the container by using the command line.&lt;br&gt;
 Dockerfile như là bản vẽ thiết kế, trong này hướng dẫn các step cụ thể để docker dựa vào và build ra image.&lt;br&gt;
Để tạo image từ dockerfile dùng câu lệnh docker build, để tạo container từ image sử dụng câu lệnh docker create. Để chạy ứng dụng bạn start các service trong container đó.&lt;br&gt;
-- Some cmd about docker:&lt;br&gt;
Attach container&lt;br&gt;
Ý nghĩa: Attach một màn hình cho phép nhập input và hiển thị output &lt;br&gt;
List images: docker images -a&lt;br&gt;
build image: docker build&lt;br&gt;
run container:docker run &lt;br&gt;
-- Bắt đầu test container:&lt;br&gt;
Để sử dụng docker exec, bắt buộc phải run docker container.&lt;br&gt;
Để run docker container:&lt;br&gt;
cmd: docker run -d --name container-name alpine watch "date &amp;gt;&amp;gt; /var/log/date.log". Câu lệnh sẽ tạo mới 1 docker container. -d để tách container từ cmd để chạy trên nền docker. alpine là image được dùng trong container đó. watch "date&amp;gt;&amp;gt;/var/log/date.log" là cmd muốn chạy trong container đó. đoạn lệnh này sẽ chạy 2 phút/lần và in ra thời gian hiện tại.&lt;br&gt;
-- Tìm tên docker container:&lt;br&gt;
cmd: docker ps -a&lt;br&gt;
-- execute bash command in docker container:&lt;br&gt;
docker run -it  /bin/bash(PATH có thể xem qua docker container ls -a)&lt;br&gt;
-- Docker Exec Multiple Commands:&lt;br&gt;
docker exec  bash -c "command1 ; command2 ; command3"&lt;/p&gt;

&lt;p&gt;--- Docker-compose:&lt;br&gt;
dùng để chạy multi-container cho docker. Sử dụng file YAML để config các service của phần mềm. Cách làm qua 3 bước:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Khai báo app's environment trong Dockerfile.&lt;/li&gt;
&lt;li&gt;Khai báo các services cần thiết để chạy application trong file docker-compose.yml&lt;/li&gt;
&lt;li&gt;Chạy docker-compose up để start và run app.
(Notes: Nếu muốn dừng:
# Stop services only
docker-compose stop
# Stop and remove containers, networks..
docker-compose down 
# Down and remove volumes
docker-compose down --volumes 
# Down and remove images
docker-compose down --rmi )
#Theo dõi Logs từ các dịch vụ
docker-compose logs [SERVICES]&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;-- Volume:&lt;br&gt;
Volume chỉ đơn giản là folder có thể chia sẻ giữa các container hay các máy chủ, và nó đồng bộ với nhau. Ví dụ mình muốn sửa code ở ngoài mà vẫn muốn nó thay đổi trong container, ta phải volume để mount nó.&lt;br&gt;
câu lệnh:&lt;br&gt;
docker volume create [volume_name]&lt;br&gt;
docker volume ls&lt;br&gt;
docker volume inspect &lt;a href="https://dev.toinformation%20volume"&gt;volume_name&lt;/a&gt;&lt;br&gt;
docker volume rm [volume_name][volume_name1]...(remove)&lt;br&gt;
docker volume prune(remove all)&lt;br&gt;
(ngoài ra còn có backup and restore container sử dụng volume)&lt;br&gt;
-- env (FROM, RUN, ENV, CMD, ENTRYPOINT, ARG)&lt;br&gt;
*FROM ImageName:&lt;br&gt;
*RUN : thực thi các lệnh command line, thường được sử dụng để cài đặt các gói phần mềm.&lt;br&gt;
*CMD : thực hiện lệnh mặc định khi khởi tạo container từ image(có thể ghi đè dòng lệnh)&lt;br&gt;
*ENTRYPOINT : Khá giống CMD đều dùng để thực hiện lệnh khi khởi tạo container nhưng không ghi đè dòng lệnh cũ. &lt;br&gt;
*ARG : chỉ khả dụng trong quá trình build docker image (như trong câu lệnh RUN), không khả dụng sau khi image được tạo ra và các container được khởi động từ nó (ENTRYPOINT, CMD). Bạn cũng có thể sử dụng giá trị ARG để set giá trị ENV để làm việc trong đó.&lt;br&gt;
*ENV : là các giá trị ENV có sẵn trong container, nhưng cũng có các lệnh RUN được chạy trong quá trình Docker build, bắt đầu xuất hiện và khả dùng từ dòng lệnh mà chúng được khai báo.&lt;br&gt;
*COPY : sao chép dữ liệu&lt;br&gt;
*ENV : thiết lập biến môi trường. Ví dụ: PATH&lt;br&gt;
*VOLUME : thêm ổ đĩa, thư mục là volume chia sẻ giữa các container&lt;br&gt;
*USER : tên user&lt;br&gt;
*WORKDIR : thư mục làm việc&lt;br&gt;
*EXPOSE : thiết lập cổng mà container lắng nghe(EXPOSE port 3210)&lt;/p&gt;

&lt;p&gt;-- &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;env Dockerfile: sử dụng file .env&lt;br&gt;
Dùng để thiết lập môi trường sẽ được dùng trong quá trình docker build image. VD env Dockerfile sau câu lệnh build:&lt;br&gt;
"FROM ubuntu&lt;br&gt;
ARG BUILD_TIME =abc&lt;br&gt;
ENV RUN_TIME=123&lt;br&gt;
RUN touch /env.txt&lt;br&gt;
RUN printenv &amp;gt; /env.txt"&lt;br&gt;
Có thể override env Dockerfile qua câu lệnh docker build -t temp --build-arg BUILD_TIME=def . và file docker sẽ có dạng như sau: &lt;br&gt;
"docker run temp cat /env.txt&lt;br&gt;
HOSTNAME=b18b9cafe0e0&lt;br&gt;&lt;br&gt;
RUN_TIME=123&lt;br&gt;&lt;br&gt;
HOME=/root&lt;br&gt;&lt;br&gt;
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin&lt;br&gt;
BUILD_TIME=def&lt;br&gt;
PWD=/"&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;env Docker-compose: sử dụng file docker-compose.yml&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;-- Different between env Dockerfile and env Docker-compose&lt;/p&gt;

</description>
      <category>docker</category>
      <category>beginners</category>
      <category>tutorial</category>
      <category>vietnameseblogs</category>
    </item>
  </channel>
</rss>
