<?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>Forem: BlackMan</title>
    <description>The latest articles on Forem by BlackMan (@chungleba).</description>
    <link>https://forem.com/chungleba</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%2F1102582%2F80dd721a-9461-4e78-8975-ea3cc66cc5b3.jpg</url>
      <title>Forem: BlackMan</title>
      <link>https://forem.com/chungleba</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/chungleba"/>
    <language>en</language>
    <item>
      <title>Tính năng Tạo công việc mới với remindwork</title>
      <dc:creator>BlackMan</dc:creator>
      <pubDate>Tue, 14 Nov 2023 09:14:49 +0000</pubDate>
      <link>https://forem.com/remindwork/tinh-nang-tao-cong-viec-moi-voi-remindwork-1424</link>
      <guid>https://forem.com/remindwork/tinh-nang-tao-cong-viec-moi-voi-remindwork-1424</guid>
      <description>&lt;p&gt;RemindWork giúp người dùng phân công công việc cho các nhân viên một cách dễ dàng và rõ ràng. Người dùng có thể phân công công việc cho từng cá nhân, nhóm hoặc phòng ban.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--7bNXDxkA--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/a492stquwk94opqjk4d2.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--7bNXDxkA--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/a492stquwk94opqjk4d2.png" alt="Image description" width="800" height="359"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Bước 1: Mô tả ngắn yêu cầu công việc&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--RtdnBp-d--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/p78h20fiumzls6fjdoh7.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--RtdnBp-d--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/p78h20fiumzls6fjdoh7.png" alt="Image description" width="800" height="110"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Bước 2: Chọn thời hạn công việc&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--DIZipqAi--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/l0c1kbbi410v9ls1vyou.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--DIZipqAi--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/l0c1kbbi410v9ls1vyou.png" alt="Image description" width="500" height="137"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Bước 3: Chọn người thực hiện công việc&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--L6w2RmzB--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/3t96gie20r93lstvamgb.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--L6w2RmzB--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/3t96gie20r93lstvamgb.png" alt="Image description" width="509" height="390"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Bước 4: Nhấn Thêm công việc&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s---YUlMhaH--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/uay0mn2lln3wl6ofkubh.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s---YUlMhaH--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/uay0mn2lln3wl6ofkubh.png" alt="Image description" width="498" height="80"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Giao diện sau khi phân công việc thành công&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--G5bqc683--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/bbdplyz9j7hi1003dt5p.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--G5bqc683--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/bbdplyz9j7hi1003dt5p.png" alt="Image description" width="800" height="384"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Bước tiếp theo: Phân công đầu việc cho từng thành viên&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--VvY4hfc6--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/5tt0tgh8c0dkfn5zqsdi.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--VvY4hfc6--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/5tt0tgh8c0dkfn5zqsdi.png" alt="Image description" width="800" height="471"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>taocongviec</category>
      <category>phancongviec</category>
    </item>
    <item>
      <title>Quản lý công việc với RemindWork</title>
      <dc:creator>BlackMan</dc:creator>
      <pubDate>Tue, 14 Nov 2023 08:31:52 +0000</pubDate>
      <link>https://forem.com/remindwork/quan-ly-cong-viec-voi-remindwork-17lg</link>
      <guid>https://forem.com/remindwork/quan-ly-cong-viec-voi-remindwork-17lg</guid>
      <description>&lt;p&gt;Trong thời đại công nghệ số phát triển như hiện nay, việc sử dụng các ứng dụng quản lý công việc trở nên ngày càng phổ biến. Một trong những ứng dụng quản lý công việc được nhiều người sử dụng hiện nay là RemindWork. Vậy RemindWork là gì và cách sử dụng RemindWork để quản lý công việc hiệu quả như thế nào?&lt;/p&gt;

&lt;h2&gt;
  
  
  RemindWork là gì?
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--0gizH1Q0--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/g57hu3x5yzu85speme8l.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--0gizH1Q0--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/g57hu3x5yzu85speme8l.png" alt="Image description" width="750" height="465"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;RemindWork là một ứng dụng quản lý công việc đa nền tảng (Web, iOS, Android) được phát triển bởi công ty cổ phần phần mềm Satime. Ứng dụng này giúp người dùng quản lý công việc một cách hiệu quả, bao gồm các chức năng chính sau:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Phân công công việc&lt;/strong&gt;: RemindWork giúp người dùng phân công công việc cho các nhân viên một cách dễ dàng và rõ ràng. Người dùng có thể phân công công việc cho từng cá nhân, nhóm hoặc phòng ban.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Theo dõi tiến độ công việc&lt;/strong&gt;: RemindWork giúp người dùng theo dõi tiến độ công việc của từng nhân viên, nhóm hoặc phòng ban. Người dùng có thể cập nhật tiến độ công việc theo thời gian thực.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Thông báo nhắc việc&lt;/strong&gt;: RemindWork sẽ tự động nhắc việc cho người dùng khi đến hạn hoàn thành công việc. Điều này giúp người dùng tránh bị quên công việc.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Trao đổi thông tin công việc&lt;/strong&gt;: RemindWork cung cấp tính năng trao đổi thông tin công việc giữa các nhân viên, nhóm hoặc phòng ban. Điều này giúp việc phối hợp công việc được hiệu quả hơn.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Cách sử dụng RemindWork để quản lý công việc hiệu quả
&lt;/h2&gt;

&lt;p&gt;Để sử dụng RemindWork để quản lý công việc hiệu quả, người dùng cần thực hiện theo các bước sau:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Tạo tài khoản RemindWork&lt;/strong&gt;: Người dùng có thể tạo tài khoản RemindWork miễn phí bằng cách truy cập website &lt;a href="https://remindwork.com/"&gt;https://remindwork.com/&lt;/a&gt;.&lt;br&gt;
Thêm thành viên vào tổ chức: Sau khi tạo tài khoản, người dùng cần thêm thành viên vào tổ chức. Người dùng có thể thêm thành viên theo cách thủ công hoặc nhập danh sách thành viên.&lt;br&gt;
&lt;strong&gt;Tạo công việc&lt;/strong&gt;: Người dùng có thể tạo dự án và công việc để quản lý công việc. Khi tạo công việc, người dùng cần cung cấp các thông tin sau:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Tên công việc&lt;/li&gt;
&lt;li&gt;Mô tả công việc&lt;/li&gt;
&lt;li&gt;Người phụ trách&lt;/li&gt;
&lt;li&gt;Thời hạn hoàn thành&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Phân công công việc&lt;/strong&gt;: Sau khi tạo công việc, người dùng có thể phân công công việc cho các nhân viên. Người dùng có thể phân công công việc cho từng cá nhân, nhóm hoặc phòng ban.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Theo dõi tiến độ công việc&lt;/strong&gt;: Người dùng có thể theo dõi tiến độ công việc của từng nhân viên, nhóm hoặc phòng ban. Người dùng có thể cập nhật tiến độ công việc theo thời gian thực.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Trao đổi thông tin công việc&lt;/strong&gt;: Người dùng có thể trao đổi thông tin công việc giữa các nhân viên, nhóm hoặc phòng ban. Người dùng có thể tạo các cuộc trò chuyện, chia sẻ tệp tin hoặc tạo các nhiệm vụ phụ.&lt;/p&gt;

&lt;h2&gt;
  
  
  Một số lưu ý khi sử dụng RemindWork để quản lý công việc
&lt;/h2&gt;

&lt;p&gt;Để sử dụng RemindWork để quản lý công việc hiệu quả, người dùng cần lưu ý một số vấn đề sau:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Lập kế hoạch công việc rõ ràng&lt;/strong&gt;: Trước khi bắt đầu thực hiện công việc, người dùng cần lập kế hoạch công việc rõ ràng. Điều này giúp người dùng xác định được các công việc cần thực hiện, thời hạn hoàn thành và mức độ ưu tiên của từng công việc.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Phân chia công việc hợp lý&lt;/strong&gt;: Người dùng cần phân chia công việc hợp lý cho từng nhân viên. Điều này giúp đảm bảo rằng các công việc được thực hiện một cách hiệu quả và đúng thời hạn.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Theo dõi tiến độ công việc thường xuyên&lt;/strong&gt;: Người dùng cần theo dõi tiến độ công việc thường xuyên. Điều này giúp người dùng kịp thời nắm bắt tình hình công việc và đưa ra các giải pháp phù hợp.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Kết nối và phối hợp công việc hiệu quả&lt;/strong&gt;: Người dùng cần kết nối và phối hợp công việc hiệu quả giữa các nhân viên, nhóm hoặc phòng ban. Điều này giúp đảm bảo rằng các công việc được thực hiện một cách đồng bộ và hiệu quả.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;RemindWork là một ứng dụng quản lý công việc hiệu quả và dễ sử dụng. Với các tính năng và ưu điểm vượt trội, RemindWork có thể giúp người dùng quản lý công việc một cách hiệu quả, nâng cao năng suất làm việc và đạt được mục tiêu của tổ chức.&lt;/p&gt;

</description>
      <category>remindwork</category>
    </item>
    <item>
      <title>Multiple RDP Sessions on Windows 11</title>
      <dc:creator>BlackMan</dc:creator>
      <pubDate>Tue, 14 Nov 2023 07:56:35 +0000</pubDate>
      <link>https://forem.com/chungleba/multiple-rdp-sessions-on-windows-11-4jm1</link>
      <guid>https://forem.com/chungleba/multiple-rdp-sessions-on-windows-11-4jm1</guid>
      <description>&lt;p&gt;Download RDP Wrapper Library at &lt;a href="https://github.com/stascorp/rdpwrap/releases"&gt;Link&lt;/a&gt; and run install.bat&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--1MZ4JY4X--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/65uj9hponz88tb4eev56.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--1MZ4JY4X--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/65uj9hponz88tb4eev56.png" alt="Image description" width="800" height="269"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Stop termservice with windows PowerShell (administrator)&lt;br&gt;
&lt;code&gt;net stop termservice&lt;/code&gt;&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--ZwAk2-CW--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/xzn4mo4c2u9lc6p39gy1.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--ZwAk2-CW--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/xzn4mo4c2u9lc6p39gy1.png" alt="Image description" width="726" height="287"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Save rdpwrap.ini at &lt;a href="https://raw.githubusercontent.com/sebaxakerhtc/rdpwrap.ini/master/rdpwrap.ini"&gt;Link&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Remove dpwrap.ini at &lt;br&gt;
&lt;code&gt;C:\Program Files\RDP Wrapper\rdpwrap.ini&lt;/code&gt;&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--7fRspV1b--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/w9bkxnw3kre43lk3anrb.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--7fRspV1b--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/w9bkxnw3kre43lk3anrb.png" alt="Image description" width="800" height="618"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Pate rdpwrap.ini download at Step 3 at C:\Program Files\RDP Wrapper\&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;start termservice with windows PowerShell (administrator)&lt;br&gt;
&lt;code&gt;net start termservice&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Check Fully Support to complete&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--aqh3jOic--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/43gkzqqz84fgup220283.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--aqh3jOic--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/43gkzqqz84fgup220283.png" alt="Image description" width="561" height="488"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

</description>
      <category>windows</category>
      <category>rdp</category>
      <category>mstsc</category>
    </item>
    <item>
      <title>Nextjs useContext to change language html in layout.tsx from child component</title>
      <dc:creator>BlackMan</dc:creator>
      <pubDate>Tue, 26 Sep 2023 06:29:24 +0000</pubDate>
      <link>https://forem.com/chungleba/nextjs-usecontext-to-change-language-html-in-layouttsx-from-child-component-3id8</link>
      <guid>https://forem.com/chungleba/nextjs-usecontext-to-change-language-html-in-layouttsx-from-child-component-3id8</guid>
      <description>&lt;p&gt;The useContext() hook in React allows function components to access the context value for a context object. It takes the context object as the only argument and returns the current context value as given by the nearest context provider.&lt;/p&gt;

&lt;p&gt;This way to useContext change html lang='vi' to lang='en' in layout.tsx&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Firts please see structure:&lt;/strong&gt;&lt;br&gt;
&lt;a href="https://media.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%2F9yfz0e9padt096rp9qq0.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.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%2F9yfz0e9padt096rp9qq0.png" alt="Image description"&gt;&lt;/a&gt;&lt;br&gt;
&lt;strong&gt;I has created 2 file: context.tsx, child.tsx&lt;/strong&gt;&lt;br&gt;
Make a context.tsx:&lt;br&gt;
&lt;a href="https://media.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%2Fgmu37whwxq628pnx8rhx.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.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%2Fgmu37whwxq628pnx8rhx.png" alt="Image description"&gt;&lt;/a&gt;&lt;br&gt;
import { Context } to child.tsx&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.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%2Fmef7mhl8e2rl2dc8j3bb.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.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%2Fmef7mhl8e2rl2dc8j3bb.png" alt="Image description"&gt;&lt;/a&gt;&lt;br&gt;
Please see a page.tsx&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.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%2Fef9uj4a7fjecmr16wc7l.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.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%2Fef9uj4a7fjecmr16wc7l.png" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;import { Context } and wrap Context.Provider to child.tsx&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.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%2Fvx7o7xhpfuue2ujj5psy.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.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%2Fvx7o7xhpfuue2ujj5psy.png" alt="Image description"&gt;&lt;/a&gt;&lt;br&gt;
&lt;strong&gt;This is result when onclick button to change lang in layout&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.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%2Fanfrppdd0nofly38k0so.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.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%2Fanfrppdd0nofly38k0so.png" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.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%2Fbe3xnyskzwbmjv6tz9df.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.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%2Fbe3xnyskzwbmjv6tz9df.png" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Fullcode:&lt;br&gt;
context.tsx&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;

"use client"
import { createContext } from 'react'

export const Context = createContext({
  language: "vi",
  setLanguage: function (value:any) {
    return value
  }
})


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;child.tsx&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;

"use client"
import { useContext } from 'react'
import { Context } from "./context";
export default function Child() {
    const { language, setLanguage } = useContext(Context)
    return (
        &amp;lt;&amp;gt;
            &amp;lt;h2 className=' text-xl'&amp;gt;From child {language}&amp;lt;/h2&amp;gt;
            &amp;lt;div className=' flex flex-row space-x-2'&amp;gt;
                &amp;lt;button onClick={() =&amp;gt; { setLanguage('En') }}&amp;gt;Change EN&amp;lt;/button&amp;gt;
                &amp;lt;button onClick={() =&amp;gt; { setLanguage('Vi') }}&amp;gt;Change VI&amp;lt;/button&amp;gt;
            &amp;lt;/div&amp;gt;
        &amp;lt;/&amp;gt;
    )

}


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;page.tsx&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;

"use client"
import Image from 'next/image'
import Child from './child'
import { Context } from "./context";
import { useContext } from 'react'

export default function Home() {
  const { language, setLanguage } = useContext(Context)
  return (
    &amp;lt;main className="flex min-h-screen flex-col items-center justify-between p-24"&amp;gt;
      &amp;lt;h1 className=' text-2xl'&amp;gt;From Home: {language}&amp;lt;/h1&amp;gt;
        &amp;lt;Child&amp;gt;&amp;lt;/Child&amp;gt;
    &amp;lt;/main&amp;gt;
  )
}



&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;layout.tsx&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;

"use client"
import './globals.css'
import type { Metadata } from 'next'
import { Inter } from 'next/font/google'
import { Context } from "./context";
import { useState } from 'react'
const inter = Inter({ subsets: ['latin'] })


export default function RootLayout({
  children,
}: {
  children: React.ReactNode
}) {
  const [language, setLanguage] = useState('vi')
  const value = {
    language, setLanguage
  }
  return (
    &amp;lt;Context.Provider value={value}&amp;gt;
    &amp;lt;html lang={language}&amp;gt;
      &amp;lt;body className={inter.className}&amp;gt;{children}&amp;lt;/body&amp;gt;
    &amp;lt;/html&amp;gt;
    &amp;lt;/Context.Provider&amp;gt;


  )
}



&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

</description>
      <category>nextjs</category>
      <category>usecontext</category>
      <category>react</category>
      <category>language</category>
    </item>
    <item>
      <title>Các khái niệm chính trong nestjs</title>
      <dc:creator>BlackMan</dc:creator>
      <pubDate>Wed, 06 Sep 2023 07:13:51 +0000</pubDate>
      <link>https://forem.com/chungleba/cac-khai-niem-chinh-trong-nestjs-and</link>
      <guid>https://forem.com/chungleba/cac-khai-niem-chinh-trong-nestjs-and</guid>
      <description>&lt;p&gt;NestJS là một framework Node.js mã nguồn mở, có thể mở rộng, linh hoạt, tiến bộ để xây dựng ứng dụng phía server. Nó sử dụng TypeScript và rất linh hoạt để xây dựng các hệ thống phụ trợ hấp dẫn và đòi hỏi nhiều yêu cầu.&lt;/p&gt;

&lt;p&gt;Dưới đây là một số khái niệm chính trong NestJS:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Module: Module là một cách để tổ chức ứng dụng của bạn. Mỗi module có thể chứa các bộ điều khiển, dịch vụ, pipe và các thành phần khác.&lt;/li&gt;
&lt;li&gt;Controller: Controller là một lớp chịu trách nhiệm xử lý các yêu cầu HTTP.&lt;/li&gt;
&lt;li&gt;Service: Service là một lớp cung cấp dữ liệu và chức năng cho các bộ điều khiển.&lt;/li&gt;
&lt;li&gt;Pipe: Pipe là một công cụ mạnh mẽ có thể được sử dụng để chuyển đổi hoặc xác thực dữ liệu.&lt;/li&gt;
&lt;li&gt;Dependency injection: Dependency injection là một kỹ thuật lập trình trong đó các phụ thuộc của một thành phần được cung cấp cho nó bởi một bên thứ ba.&lt;/li&gt;
&lt;li&gt;Routing: Routing là quá trình định tuyến các yêu cầu HTTP đến các bộ điều khiển.&lt;/li&gt;
&lt;li&gt;Middleware: Middleware là các lớp được thực thi trước hoặc sau khi một yêu cầu HTTP được xử lý bởi một bộ điều khiển.&lt;/li&gt;
&lt;li&gt;Microservices: Microservices là một kiến trúc ứng dụng trong đó ứng dụng được chia thành các dịch vụ nhỏ, độc lập.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Dưới đây là một số khái niệm chính khác trong NestJS:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;ORM: ORM là một công cụ giúp bạn truy cập cơ sở dữ liệu bằng cách sử dụng các đối tượng.&lt;/li&gt;
&lt;li&gt;Security: NestJS cung cấp một số tính năng và công cụ để giúp bạn bảo mật ứng dụng của mình.&lt;/li&gt;
&lt;li&gt;Testing: NestJS cung cấp một số tính năng và công cụ để giúp bạn kiểm tra ứng dụng của mình.&lt;/li&gt;
&lt;li&gt;Deployment: NestJS cung cấp một số hướng dẫn và tài nguyên để giúp bạn triển khai ứng dụng của mình.&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>nestjs</category>
    </item>
    <item>
      <title>Giao tiếp trong kiến trúc microservice</title>
      <dc:creator>BlackMan</dc:creator>
      <pubDate>Thu, 31 Aug 2023 06:30:37 +0000</pubDate>
      <link>https://forem.com/chungleba/giao-tiep-trong-kien-truc-microservice-2a3g</link>
      <guid>https://forem.com/chungleba/giao-tiep-trong-kien-truc-microservice-2a3g</guid>
      <description>&lt;p&gt;Trong kiến trúc microservice, các microservice giao tiếp với nhau thông qua các API. Có nhiều chuẩn giao tiếp API khác nhau có thể được sử dụng cho microservice, bao gồm:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;REST (Representational State Transfer): REST là một kiến trúc giao tiếp API dựa trên HTTP. REST sử dụng các phương thức HTTP để thực hiện các yêu cầu đối với các microservice, chẳng hạn như GET, POST, PUT và DELETE. REST là một chuẩn giao tiếp API phổ biến và được sử dụng rộng rãi trong các ứng dụng web.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;gRPC (Google Remote Procedure Calls): gRPC là một giao thức RPC dựa trên HTTP/2. gRPC sử dụng các bản tin nhị phân để truyền dữ liệu, giúp nó hiệu quả hơn so với REST. gRPC cũng hỗ trợ nhiều tính năng nâng cao, chẳng hạn như xác thực, bảo mật và quản lý trạng thái.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;AMQP (Advanced Message Queuing Protocol): AMQP là một giao thức nhắn tin được sử dụng để giao tiếp giữa các ứng dụng. AMQP sử dụng các hộp thư để lưu trữ các tin nhắn giữa các ứng dụng, giúp nó linh hoạt hơn so với REST và gRPC.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Lựa chọn chuẩn giao tiếp API nào sẽ phụ thuộc vào các yếu tố sau:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Yêu cầu hiệu suất: REST có thể không hiệu quả cho các ứng dụng cần hiệu suất cao. gRPC và AMQP có thể hiệu quả hơn cho các ứng dụng này.&lt;/li&gt;
&lt;li&gt;Yêu cầu tính năng: REST là một chuẩn giao tiếp API đơn giản và dễ triển khai. gRPC và AMQP cung cấp nhiều tính năng nâng cao, chẳng hạn như xác thực, bảo mật và quản lý trạng thái.&lt;/li&gt;
&lt;li&gt;Yêu cầu khả năng mở rộng: AMQP có thể mở rộng hơn so với REST và gRPC.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Dưới đây là một số ví dụ về cách các chuẩn giao tiếp API khác nhau có thể được sử dụng trong kiến trúc microservice:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Một ứng dụng web có thể sử dụng REST để giao tiếp với một microservice lưu trữ dữ liệu.&lt;/li&gt;
&lt;li&gt;Một microservice có thể sử dụng gRPC để giao tiếp với một microservice khác để xử lý một tác vụ phức tạp.&lt;/li&gt;
&lt;li&gt;Một microservice có thể sử dụng AMQP để giao tiếp với một microservice khác để gửi thông báo cho người dùng.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Nhìn chung, việc lựa chọn chuẩn giao tiếp API nào cho microservice sẽ phụ thuộc vào các yêu cầu cụ thể của ứng dụng.&lt;/p&gt;

</description>
      <category>microservices</category>
    </item>
    <item>
      <title>Các giao thức kết nối microsevice</title>
      <dc:creator>BlackMan</dc:creator>
      <pubDate>Wed, 30 Aug 2023 06:37:40 +0000</pubDate>
      <link>https://forem.com/chungleba/cac-giao-thuc-ket-noi-microsevice-2754</link>
      <guid>https://forem.com/chungleba/cac-giao-thuc-ket-noi-microsevice-2754</guid>
      <description>&lt;p&gt;Trong kiến trúc microservices, các microservices tương tác với nhau thông qua các giao thức. Giao thức kết nối microservices xác định cách các microservices trao đổi thông tin và dữ liệu.&lt;/p&gt;

&lt;p&gt;Có hai loại giao thức kết nối microservices chính:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Giao thức đồng bộ: Giao thức đồng bộ là kiểu giao tiếp trong đó một microservice gửi một yêu cầu đến một microservice khác và chờ phản hồi. Giao thức này phù hợp cho các tác vụ cần phản hồi nhanh, chẳng hạn như xác thực người dùng hoặc truy vấn dữ liệu.&lt;/li&gt;
&lt;li&gt;Giao thức bất đồng bộ: Giao thức bất đồng bộ là kiểu giao tiếp trong đó một microservice gửi một thông báo đến một microservice khác và không chờ phản hồi. Giao thức này phù hợp cho các tác vụ không cần phản hồi nhanh hoặc có thể thực hiện đồng thời, chẳng hạn như xử lý sự kiện hoặc gửi thông báo.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Dưới đây là một số giao thức kết nối microservices phổ biến:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;HTTP/HTTPS: Giao thức HTTP/HTTPS là giao thức phổ biến nhất được sử dụng để kết nối microservices. Giao thức này được thiết kế để trao đổi dữ liệu theo kiểu request/response.&lt;/li&gt;
&lt;li&gt;gRPC: Giao thức gRPC là giao thức RPC (Remote Procedure Call) dựa trên HTTP/2. Giao thức này cung cấp hiệu suất cao và tính bảo mật tốt.&lt;/li&gt;
&lt;li&gt;AMQP: Giao thức AMQP (Advanced Message Queuing Protocol) là giao thức nhắn tin hỗ trợ giao tiếp bất đồng bộ. Giao thức này được sử dụng để truyền thông tin giữa các microservices trong một hệ thống phân tán.&lt;/li&gt;
&lt;li&gt;MQTT: Giao thức MQTT (Message Queuing Telemetry Transport) là giao thức nhắn tin nhẹ, được thiết kế cho các thiết bị IoT (Internet of Things). Giao thức này được sử dụng để truyền thông tin giữa các microservices và các thiết bị IoT.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Lựa chọn giao thức kết nối microservices phù hợp phụ thuộc vào các yếu tố sau:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Yêu cầu về hiệu suất: Giao thức đồng bộ sẽ cung cấp hiệu suất tốt hơn cho các tác vụ cần phản hồi nhanh.&lt;/li&gt;
&lt;li&gt;Yêu cầu về tính bảo mật: Giao thức gRPC cung cấp tính bảo mật tốt hơn cho các tác vụ cần lưu trữ dữ liệu nhạy cảm.&lt;/li&gt;
&lt;li&gt;Yêu cầu về khả năng mở rộng: Giao thức AMQP hoặc MQTT cung cấp khả năng mở rộng tốt hơn cho các hệ thống microservices lớn.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Khi thiết kế kiến trúc microservices, cần cân nhắc kỹ lưỡng các yếu tố trên để lựa chọn giao thức kết nối microservices phù hợp.&lt;/p&gt;

</description>
      <category>microsevice</category>
    </item>
    <item>
      <title>Giao tiếp giữa các microservice như thế nào</title>
      <dc:creator>BlackMan</dc:creator>
      <pubDate>Wed, 30 Aug 2023 04:17:08 +0000</pubDate>
      <link>https://forem.com/chungleba/giao-tiep-giua-cac-microservice-nhu-the-nao-3kmh</link>
      <guid>https://forem.com/chungleba/giao-tiep-giua-cac-microservice-nhu-the-nao-3kmh</guid>
      <description>&lt;p&gt;Giao tiếp giữa các microservice là một thách thức quan trọng trong kiến trúc microservice. Các microservice thường được triển khai trên các máy chủ khác nhau hoặc thậm chí trong các đám mây khác nhau. Điều này làm cho việc giao tiếp giữa chúng trở nên phức tạp hơn.&lt;/p&gt;

&lt;p&gt;Có một số cách khác nhau để các microservice giao tiếp với nhau. Một cách phổ biến là sử dụng API. API là một giao diện lập trình ứng dụng cho phép các ứng dụng giao tiếp với nhau. Các API có thể được sử dụng để gửi yêu cầu và nhận phản hồi giữa các microservice.&lt;/p&gt;

&lt;p&gt;Một cách khác để các microservice giao tiếp với nhau là sử dụng messaging. Messaging là một cách để gửi thông điệp giữa các ứng dụng. Các microservice có thể sử dụng messaging để gửi thông tin cho nhau mà không cần biết microservice khác đang làm gì.&lt;/p&gt;

&lt;p&gt;Một số cách khác để các microservice giao tiếp với nhau bao gồm:&lt;/p&gt;

&lt;p&gt;RPC (Remote Procedure Call): RPC là một cách để gọi một thủ tục từ một microservice khác.&lt;br&gt;
Event-driven architecture: Event-driven architecture là một cách để các microservice giao tiếp với nhau bằng cách gửi sự kiện.&lt;br&gt;
Shared data: Các microservice có thể chia sẻ dữ liệu để giao tiếp với nhau.&lt;br&gt;
Cách bạn chọn để các microservice giao tiếp với nhau sẽ phụ thuộc vào nhu cầu cụ thể của ứng dụng của bạn. Nếu bạn cần giao tiếp đồng bộ giữa các microservice, API hoặc RPC là những lựa chọn tốt. Nếu bạn cần giao tiếp không đồng bộ giữa các microservice, messaging là một lựa chọn tốt.&lt;/p&gt;

&lt;p&gt;Khi chọn cách để các microservice giao tiếp với nhau, bạn cần cân nhắc các yếu tố sau:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Nhu cầu hiệu suất: Bạn cần giao tiếp đồng bộ hay không đồng bộ?&lt;/li&gt;
&lt;li&gt;Nhu cầu khả năng mở rộng: Bạn có cần giao tiếp linh hoạt hay không?&lt;/li&gt;
&lt;li&gt;Nhu cầu bảo mật: Bạn cần bảo vệ dữ liệu được truyền đi như thế nào?
Dưới đây là một số mẹo để giúp bạn giao tiếp hiệu quả giữa các microservice:&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Sử dụng các API rõ ràng và dễ sử dụng. Các API nên dễ hiểu và sử dụng cho các microservice khác.&lt;br&gt;
Tuân thủ các tiêu chuẩn. Sử dụng các tiêu chuẩn có sẵn để giúp bạn giao tiếp giữa các microservice.&lt;br&gt;
Sử dụng các công cụ và framework. Các công cụ và framework có thể giúp bạn giao tiếp giữa các microservice dễ dàng hơn.&lt;br&gt;
Giao tiếp giữa các microservice là một phần quan trọng của kiến trúc microservice. Bằng cách chọn cách giao tiếp phù hợp và sử dụng các mẹo ở trên, bạn có thể giúp đảm bảo rằng các microservice của mình giao tiếp với nhau một cách hiệu quả.&lt;/p&gt;

</description>
      <category>microservices</category>
    </item>
    <item>
      <title>Các thành phần cơ bản của microservice</title>
      <dc:creator>BlackMan</dc:creator>
      <pubDate>Wed, 30 Aug 2023 04:13:48 +0000</pubDate>
      <link>https://forem.com/chungleba/cac-thanh-phan-co-ban-cua-microservice-406f</link>
      <guid>https://forem.com/chungleba/cac-thanh-phan-co-ban-cua-microservice-406f</guid>
      <description>&lt;p&gt;Kiến trúc microservice là một cách tiếp cận để xây dựng các ứng dụng phần mềm theo cách mà chúng được chia thành các dịch vụ nhỏ, độc lập. Mỗi dịch vụ chịu trách nhiệm cho một chức năng hoặc nhiệm vụ cụ thể.&lt;/p&gt;

&lt;p&gt;Dưới đây là các thành phần cơ bản của microservice:&lt;/p&gt;

&lt;p&gt;Microservice: Một dịch vụ nhỏ, độc lập chịu trách nhiệm cho một chức năng hoặc nhiệm vụ cụ thể. Microservice nên nhỏ gọn và dễ hiểu, để chúng có thể được quản lý và bảo trì hiệu quả.&lt;br&gt;
API: Một giao diện lập trình ứng dụng cho phép các microservice giao tiếp với nhau. API nên được thiết kế rõ ràng và dễ sử dụng, để chúng có thể được sử dụng bởi các microservice khác nhau.&lt;br&gt;
Container: Một cách để đóng gói và triển khai ứng dụng phần mềm. Container giúp dễ dàng triển khai và quản lý các microservice.&lt;br&gt;
Orchestration: Một phương pháp để quản lý và điều phối các microservice. Orchestration giúp đảm bảo rằng các microservice hoạt động cùng nhau một cách hiệu quả.&lt;br&gt;
Các thành phần này thường được triển khai trong các đám mây, nơi chúng có thể được mở rộng quy mô và quản lý dễ dàng.&lt;/p&gt;

&lt;p&gt;Dưới đây là một số ví dụ về các microservice:&lt;/p&gt;

&lt;p&gt;Một microservice có thể chịu trách nhiệm xử lý đăng nhập người dùng.&lt;br&gt;
Một microservice khác có thể chịu trách nhiệm lưu trữ dữ liệu người dùng.&lt;br&gt;
Một microservice thứ ba có thể chịu trách nhiệm cung cấp dịch vụ khách hàng.&lt;br&gt;
Các microservice này có thể được triển khai trên các máy chủ khác nhau hoặc thậm chí trong các đám mây khác nhau. Điều này làm cho chúng có khả năng mở rộng và khả năng chịu lỗi cao hơn.&lt;/p&gt;

&lt;p&gt;Kiến trúc microservice có một số lợi ích so với kiến trúc monolithic, bao gồm:&lt;/p&gt;

&lt;p&gt;Tăng khả năng mở rộng: Các microservice có thể được mở rộng quy mô độc lập, điều này giúp bạn đáp ứng nhu cầu thay đổi của ứng dụng.&lt;br&gt;
Tăng độ tin cậy: Nếu một microservice gặp sự cố, các microservice khác vẫn có thể hoạt động bình thường.&lt;br&gt;
Tăng khả năng bảo trì: Microservice nhỏ và độc lập có thể dễ dàng quản lý và bảo trì hơn.&lt;br&gt;
Tăng khả năng thử nghiệm: Microservice có thể được thử nghiệm độc lập, điều này giúp bạn giảm thiểu thời gian và nỗ lực thử nghiệm.&lt;br&gt;
Tuy nhiên, kiến trúc microservice cũng có một số thách thức cần được xem xét, bao gồm:&lt;/p&gt;

&lt;p&gt;Phức tạp hơn: Kiến trúc microservice phức tạp hơn so với kiến trúc monolithic.&lt;br&gt;
Yêu cầu quản lý nhiều microservice: Bạn cần có một quy trình quản lý mạnh mẽ để quản lý nhiều microservice.&lt;br&gt;
Yêu cầu giao tiếp giữa các microservice: Bạn cần thiết lập một cách để các microservice giao tiếp với nhau một cách hiệu quả.&lt;br&gt;
Nếu bạn đang xem xét sử dụng kiến trúc microservice, hãy cân nhắc những lợi ích và thách thức tiềm ẩn trước khi đưa ra quyết định.&lt;/p&gt;

</description>
      <category>microservices</category>
    </item>
    <item>
      <title>Webhook vs Socketio</title>
      <dc:creator>BlackMan</dc:creator>
      <pubDate>Tue, 20 Jun 2023 02:04:32 +0000</pubDate>
      <link>https://forem.com/chungleba/webhook-vs-socketio-6e3</link>
      <guid>https://forem.com/chungleba/webhook-vs-socketio-6e3</guid>
      <description>&lt;p&gt;Webhooks and WebSockets are both web technologies that allow for real-time communication between applications. However, they have different strengths and weaknesses, and are best suited for different use cases.&lt;/p&gt;

&lt;p&gt;Webhooks are one-way connections that allow an application to send data to another application. When an event occurs in the first application, a webhook is triggered and sends data to the second application. Webhooks are typically used for event-driven communication, such as when a user signs up for a newsletter or makes a purchase.&lt;/p&gt;

&lt;p&gt;WebSockets are two-way connections that allow applications to communicate with each other in real time. WebSockets are typically used for applications that require constant communication, such as chat applications or multiplayer games.&lt;/p&gt;

&lt;p&gt;Here is a table summarizing the key differences between webhooks and WebSockets:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--vRPDCisR--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/qutntiac3p68wfsx2mn7.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--vRPDCisR--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/qutntiac3p68wfsx2mn7.jpg" alt="Image description" width="709" height="393"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;When to use webhooks:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;When you need to send data from one application to another in a one-way fashion.&lt;/li&gt;
&lt;li&gt;When you need to ensure that the data is delivered reliably.&lt;/li&gt;
&lt;li&gt;When you need to scale the communication easily.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;When to use WebSockets:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;When you need to communicate with another application in real time.&lt;/li&gt;
&lt;li&gt;When you need to send a lot of data between applications.&lt;/li&gt;
&lt;li&gt;When you need to ensure that the communication is secure.&lt;/li&gt;
&lt;li&gt;In general, webhooks are a good choice for applications that need to send data from one application to another in a reliable and scalable way.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;WebSockets are a good choice for applications that need to communicate with another application in real time and send a lot of data.&lt;/p&gt;

&lt;p&gt;Here are some examples of applications that use webhooks:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Email marketing applications: When a user signs up for an email list, the email marketing application can send a webhook to a CRM application to create a new contact record.&lt;/li&gt;
&lt;li&gt;Payment processing applications: When a user makes a purchase, the payment processing application can send a webhook to an inventory management application to update the product stock levels.&lt;/li&gt;
&lt;li&gt;Chat applications: When a user sends a message in a chat application, the chat application can send a webhook to a notification service to send a notification to the recipient.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Here are some examples of applications that use WebSockets:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Chat applications: Chat applications use WebSockets to allow users to communicate with each other in real time.&lt;/li&gt;
&lt;li&gt;Multiplayer games: Multiplayer games use WebSockets to allow players to interact with each other in real time.&lt;/li&gt;
&lt;li&gt;Stock trading applications: Stock trading applications use WebSockets to get real-time updates on stock prices.&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>webhook</category>
      <category>socketio</category>
    </item>
    <item>
      <title>Middleware trong expressjs là gì?</title>
      <dc:creator>BlackMan</dc:creator>
      <pubDate>Fri, 16 Jun 2023 10:01:29 +0000</pubDate>
      <link>https://forem.com/chungleba/middleware-trong-expressjs-la-gi-1he1</link>
      <guid>https://forem.com/chungleba/middleware-trong-expressjs-la-gi-1he1</guid>
      <description>&lt;p&gt;Trong Express.js, middleware là các hàm xử lý trung gian được thực thi tuần tự trong quá trình xử lý yêu cầu HTTP. Middleware có thể thực hiện các tác vụ như kiểm tra xác thực, ghi log, xử lý lỗi, xử lý yêu cầu và phản hồi, và nhiều chức năng bổ sung khác.&lt;/p&gt;

&lt;p&gt;Middleware trong Express.js có hai loại chính: middleware ứng dụng (application-level middleware) và middleware định tuyến (router-level middleware).&lt;/p&gt;

&lt;p&gt;Middleware ứng dụng (Application-level middleware): Đây là những middleware được áp dụng cho toàn bộ ứng dụng Express.js. Bạn có thể sử dụng phương thức app.use() để đăng ký middleware ứng dụng. Ví dụ:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;var cookieParser = require('cookie-parser');
app.use(cookieParser());

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Middleware định tuyến (Router-level middleware): Đây là những middleware được áp dụng cho một nhóm tuyến đường (routes) cụ thể. Bạn có thể sử dụng phương thức router.use() để đăng ký middleware định tuyến.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;const checkloginPartner = function (req, res, next) {
  if (req.cookies.Sbaytoken) {
    var decoded = jwt.verify(req.cookies.Sbaytoken, process.env.CookiesSecretKey);
    //console.log(decoded);
    if (decoded.userID) {
      req.decoded = decoded
      next()
    }
  } else {
    res.redirect('/dang-nhap')
  }
}
router.get('/', checkloginPartner, async function (req, res, next) {
res.end('next page')
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Middleware có thể được định nghĩa dưới dạng hàm đơn giản hoặc là một chuỗi các middleware tuần tự. Các middleware có thể gọi next() để chuyển tiếp yêu cầu tới middleware tiếp theo trong chuỗi.&lt;/p&gt;

&lt;p&gt;Express.js cung cấp một số middleware tích hợp sẵn như body-parser để xử lý dữ liệu từ yêu cầu, cors để xử lý vấn đề chính sách chia sẻ nguồn tài nguyên xác định bởi cơ chế Same-Origin Policy (SOP), và morgan để ghi log yêu cầu. Ngoài ra, bạn cũng có thể tạo middleware tùy chỉnh theo nhu cầu của ứng dụng của mình.&lt;/p&gt;

</description>
      <category>middleware</category>
      <category>express</category>
      <category>vietnamcode</category>
      <category>backend</category>
    </item>
    <item>
      <title>So sánh rest api và restful api</title>
      <dc:creator>BlackMan</dc:creator>
      <pubDate>Fri, 16 Jun 2023 09:51:43 +0000</pubDate>
      <link>https://forem.com/chungleba/so-sanh-rest-api-va-restful-api-6fb</link>
      <guid>https://forem.com/chungleba/so-sanh-rest-api-va-restful-api-6fb</guid>
      <description>&lt;p&gt;REST API và RESTful API thường được sử dụng lẫn nhau và có ý nghĩa tương tự, tuy nhiên có một số khác biệt nhỏ về ý nghĩa và cách sử dụng. Dưới đây là một so sánh giữa REST API và RESTful API:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;REST API (Representational State Transfer Application Programming Interface):&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;REST API tập trung vào việc xây dựng một giao thức truyền tải dữ liệu giữa các hệ thống phân tán.&lt;/li&gt;
&lt;li&gt;Nó không đặt ra bất kỳ giới hạn hoặc quy tắc nghiêm ngặt nào về cách triển khai cụ thể của API.&lt;/li&gt;
&lt;li&gt;Có thể có những hạn chế hoặc không tuân thủ một số nguyên tắc của REST, như không sử dụng cache hoặc không tuân thủ nguyên tắc không trạng thái (stateless).&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;RESTful API (RESTful Web Services):&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;RESTful API là một cách triển khai cụ thể của REST API, tuân thủ các nguyên tắc và quy tắc mà REST đề ra.&lt;/li&gt;
&lt;li&gt;RESTful API đặt nhiều hơn về kiến trúc và các quy tắc thiết kế, giúp đảm bảo tính nhất quán và dễ sử dụng.&lt;/li&gt;
&lt;li&gt;Nó đảm bảo tuân thủ nguyên tắc không trạng thái, sử dụng các phương thức HTTP đúng cách và áp dụng các định dạng dữ liệu chuẩn (ví dụ: JSON hoặc XML).&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Tóm lại, REST API là một thuật ngữ chung để chỉ một kiến trúc giao thức truyền tải dữ liệu, trong khi RESTful API là một cách triển khai cụ thể tuân thủ các nguyên tắc và quy tắc của REST. RESTful API thường được coi là một tiêu chuẩn tốt hơn trong việc phát triển các dịch vụ web có khả năng tương tác và truyền thông tin giữa các ứng dụng.&lt;/p&gt;

</description>
      <category>restapi</category>
      <category>restfulapi</category>
      <category>backend</category>
      <category>vietnamcode</category>
    </item>
  </channel>
</rss>
