<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[zujs]]></title><description><![CDATA[zujs]]></description><link>https://blog.chonhanh24h.com</link><image><url>https://cdn.hashnode.com/res/hashnode/image/upload/v1623891020725/KgikDq1qD.png</url><title>zujs</title><link>https://blog.chonhanh24h.com</link></image><generator>RSS for Node</generator><lastBuildDate>Fri, 01 May 2026 06:16:57 GMT</lastBuildDate><atom:link href="https://blog.chonhanh24h.com/rss.xml" rel="self" type="application/rss+xml"/><language><![CDATA[en]]></language><ttl>60</ttl><item><title><![CDATA[Day 1: JSON & BSON]]></title><description><![CDATA[1. JSON (Javascript Object Notation)
Json được xây dựng dựa trên 2 cấu trúc:

Một bộ sưu tập của các cặp key: value
Một danh sách giá trị theo thứ tự (như array)

Json support các kiểu dữ liệu:

String
Number
Boolean
Object
Array
Null

Link tham khảo...]]></description><link>https://blog.chonhanh24h.com/day-1-json-bson</link><guid isPermaLink="true">https://blog.chonhanh24h.com/day-1-json-bson</guid><category><![CDATA[MongoDB]]></category><dc:creator><![CDATA[Zu.Doan]]></dc:creator><pubDate>Fri, 22 Jul 2022 10:02:05 GMT</pubDate><content:encoded><![CDATA[<h1 id="heading-1-json-javascript-object-notation">1. JSON (Javascript Object Notation)</h1>
<p>Json được xây dựng dựa trên 2 cấu trúc:</p>
<ul>
<li>Một bộ sưu tập của các cặp <code>key: value</code></li>
<li>Một danh sách giá trị theo thứ tự (như <code>array</code>)</li>
</ul>
<p>Json support các kiểu dữ liệu:</p>
<ul>
<li>String</li>
<li>Number</li>
<li>Boolean</li>
<li>Object</li>
<li>Array</li>
<li>Null</li>
</ul>
<p><a target="_blank" href="https://www.json.org/json-en.html">Link tham khảo JSON</a></p>
<h1 id="heading-2-bson-binary-json">2. BSON (Binary JSON)</h1>
<h4 id="heading-bson-la-mot-dinh-dang-kieu-du-lieu-noi-ma-luu-tru-cac-cap-keyvalue-theo-thu-tu-duoc-bieu-dien-nhu-mot-thuc-the-thuc-the-o-day-dang-noi-toi-chinh-la-document">BSON là một định dạng kiểu dữ liệu, nơi mà lưu trữ các cặp key/value theo thứ tự được biểu diễn như một thực thể (thực thể ở đây đang nói tới chính là document)</h4>
<h4 id="heading-advantages-bson">Advantages BSON</h4>
<ul>
<li><p>Lightweight (Nhẹ) &amp; Traversable (khả năng di chuyển): Khả năng lưu trữ một lượng dữ liệu lớn trong BSON file (Lightweight), giúp dễ dàng cho việc  lưu trữ hoặc truyền BSON file trong network (Traversable).</p>
</li>
<li><p>Efficent (có hiệu quả): BSON sử dụng không gian nhiều hơn JSON vì nó định nghĩa những tiền tố độ dài (length prefixes) và chỉ số mảng (array indices) rõ ràng. Chính điều này mang lại sự hiệu quả cho việc truy vấn (query) và quét (scan) nhanh hơn.</p>
</li>
</ul>
<h4 id="heading-bson-types">BSON types</h4>
<ul>
<li><p>ObjectId</p>
</li>
<li><p>String</p>
</li>
<li>Boolean</li>
<li>Object</li>
<li>Array</li>
<li>Null</li>
<li><p>Date</p>
</li>
<li><p>Int32</p>
</li>
<li>Int64</li>
<li>Double</li>
<li><p>Decimal128 (New in version 3.4.)</p>
</li>
<li><p>min</p>
</li>
<li><p>max</p>
</li>
<li><p>Binary</p>
</li>
<li>Undefined (Deprecated)</li>
<li>Timestamp</li>
<li><p>Code</p>
</li>
<li><p>BSONRegex</p>
</li>
<li>BSONSymbol (Deprecated)</li>
<li>BSONMap</li>
</ul>
<p><a target="_blank" href="https://www.mongodb.com/docs/manual/reference/bson-types/">Link tham khảo BSON</a></p>
<h4 id="heading-convert-bson-to-json-via-mongodb-tools">Convert BSON to JSON via MongoDB tools</h4>
<p>Sử dụng <code>bsondump</code> để convert BSON file to JSON file</p>
<pre><code>bsondump <span class="hljs-operator">-</span><span class="hljs-operator">-</span>outFile<span class="hljs-operator">=</span>collection.json collection.bson
</code></pre><h4 id="heading-import-andamp-export-bson-file">Import &amp; Export BSON file</h4>
<p>Export a collection</p>
<pre><code>mongodump  <span class="hljs-operator">-</span><span class="hljs-operator">-</span>db<span class="hljs-operator">=</span>test <span class="hljs-operator">-</span><span class="hljs-operator">-</span>collection<span class="hljs-operator">=</span>records
</code></pre><p>Import a collection</p>
<pre><code>mongorestore <span class="hljs-operator">-</span><span class="hljs-operator">-</span>db<span class="hljs-operator">=</span>test <span class="hljs-operator">-</span><span class="hljs-operator">-</span>collection<span class="hljs-operator">=</span>records dump<span class="hljs-operator">/</span>test<span class="hljs-operator">/</span>records.bson
</code></pre><p>Export a database</p>
<pre><code>mongodump  <span class="hljs-operator">-</span><span class="hljs-operator">-</span>db<span class="hljs-operator">=</span>test
</code></pre><p>Import a database</p>
<pre><code>mongorestore <span class="hljs-operator">-</span><span class="hljs-operator">-</span>nsInclude<span class="hljs-operator">=</span><span class="hljs-string">'test.*'</span> <span class="hljs-operator">/</span>dump
</code></pre><p>** Lưu ý: Export file data sẽ được save mặc định vào dump folder, nếu muốn thay đổi nơi export file thì sử dụng thuộc tính <a target="_blank" href="https://www.mongodb.com/docs/database-tools/mongodump/#std-option-mongodump.--out">--out</a></p>
<h4 id="heading-import-andamp-export-jsoncsv-file">Import &amp; Export JSON/CSV/ file</h4>
<p>Export a collection (must specify <code>collection</code> to export)
mặc định mongoexport sẽ xuất file dưới định dạng <code>.json</code></p>
<pre><code>mongoexport <span class="hljs-operator">-</span><span class="hljs-operator">-</span>db<span class="hljs-operator">=</span>test <span class="hljs-operator">-</span><span class="hljs-operator">-</span>collection<span class="hljs-operator">=</span>records <span class="hljs-operator">-</span><span class="hljs-operator">-</span>out<span class="hljs-operator">=</span>records.json
</code></pre><p>Để xuất file dưới định dạng <code>.csv</code> ta sẽ cần cung cấp thêm các thuộc tính </p>
<ul>
<li><code>--type=csv</code></li>
<li><code>fields=fieldName1,fieldName2,...</code> hoặc <code>--fieldFile=fieldName.txt</code>
cho câu lệnh.</li>
</ul>
<pre><code>mongoexport <span class="hljs-operator">-</span><span class="hljs-operator">-</span>db<span class="hljs-operator">=</span>test <span class="hljs-operator">-</span><span class="hljs-operator">-</span>collection<span class="hljs-operator">=</span>records <span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-keyword">type</span><span class="hljs-operator">=</span>csv <span class="hljs-operator">-</span><span class="hljs-operator">-</span>fields<span class="hljs-operator">=</span>_id,name <span class="hljs-operator">-</span><span class="hljs-operator">-</span>out<span class="hljs-operator">=</span>records.json
</code></pre><p>Có thể export data theo điều kiện</p>
<pre><code>mongoexport <span class="hljs-operator">-</span><span class="hljs-operator">-</span>db<span class="hljs-operator">=</span>sales <span class="hljs-operator">-</span><span class="hljs-operator">-</span>collection<span class="hljs-operator">=</span>contacts <span class="hljs-operator">-</span><span class="hljs-operator">-</span>query<span class="hljs-operator">=</span><span class="hljs-string">'{"dept": "ABC", date: { $gte: { "$date": "2018-01-01T00:00:00.000Z" } }}'</span>
</code></pre><p>Import a collection</p>
<pre><code>mongoimport <span class="hljs-operator">-</span><span class="hljs-operator">-</span>db<span class="hljs-operator">=</span>test <span class="hljs-operator">-</span><span class="hljs-operator">-</span>collection<span class="hljs-operator">=</span>records <span class="hljs-operator">-</span><span class="hljs-operator">-</span>file<span class="hljs-operator">=</span>records.json
</code></pre><p>Application giao tiếp với MongoDB thông qua driver (tùy ngôn ngữ sẽ có các driver riêng).</p>
<p><img src="https://allenlili.me/images/posts/mongodb-for-node-js-developers/bson.png" alt="Alt text of image" /></p>
<p><img src="https://allenlili.me/images/posts/mongodb-for-node-js-developers/mongodb-nodedriver.png" alt="Alt text of image" /></p>
]]></content:encoded></item><item><title><![CDATA[Tip: Download private video saved on Google driver]]></title><description><![CDATA[Since the permission to download is not given by the owner, you can grab the View-Only video file and download the same using Chrome Browser Inspect Dev Tool. The step-by-step guide is given below:

Open Chrome Browser
Copy-Paste the Google Drive sha...]]></description><link>https://blog.chonhanh24h.com/tip-download-private-video-saved-on-google-driver</link><guid isPermaLink="true">https://blog.chonhanh24h.com/tip-download-private-video-saved-on-google-driver</guid><dc:creator><![CDATA[Zu.Doan]]></dc:creator><pubDate>Thu, 17 Feb 2022 08:40:46 GMT</pubDate><content:encoded><![CDATA[<p>Since the permission to download is not given by the owner, you can grab the View-Only video file and download the same using Chrome Browser Inspect Dev Tool. The step-by-step guide is given below:</p>
<ol>
<li>Open Chrome Browser</li>
<li>Copy-Paste the Google Drive sharing URL and let the page load</li>
<li>F12 to open Developer Console</li>
<li>Click on the video file to play once the Dev Tools are opened</li>
<li>Click on Networks Tab</li>
<li>Type <code>videoplayback</code> in the filter search box to filter the video URL</li>
<li>Double click on the URL shown under the name section</li>
<li>A new tab will open</li>
<li>Click on the three vertical dots</li>
<li>Press the Download button to Save the File</li>
</ol>
]]></content:encoded></item><item><title><![CDATA[CTN 12. Object.entries, Object.values & Truthy, Falsy value, bind this]]></title><description><![CDATA[Hello! I'm Zu.Doan
Series này mình muốn rèn luyện khả năng suy nghĩ và giải bài tập, qua đó để hiểu rõ hơn các khái niệm của Javascript.
Bài 1
class MySort {
  constructor(object) {
    this.object = object;
  }

  getSort() {
    return Object.entri...]]></description><link>https://blog.chonhanh24h.com/ctn-12-objectentries-objectvalues-and-truthy-falsy-value-bind-this</link><guid isPermaLink="true">https://blog.chonhanh24h.com/ctn-12-objectentries-objectvalues-and-truthy-falsy-value-bind-this</guid><category><![CDATA[JavaScript]]></category><dc:creator><![CDATA[Zu.Doan]]></dc:creator><pubDate>Thu, 23 Sep 2021 09:26:58 GMT</pubDate><content:encoded><![CDATA[<p>Hello! I'm Zu.Doan</p>
<p>Series này mình muốn rèn luyện khả năng suy nghĩ và giải bài tập, qua đó để hiểu rõ hơn các khái niệm của Javascript.</p>
<h3 id="bai-1">Bài 1</h3>
<pre><code><span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">MySort</span> </span>{
  <span class="hljs-keyword">constructor</span>(<span class="hljs-keyword">object</span>) {
    <span class="hljs-keyword">this</span>.<span class="hljs-keyword">object</span> = <span class="hljs-keyword">object</span>;
  }

  getSort() {
    <span class="hljs-keyword">return</span> Object.entries(<span class="hljs-keyword">this</span>.<span class="hljs-keyword">object</span>)[<span class="hljs-number">0</span>][<span class="hljs-number">1</span>].sort()[
      Object.values(<span class="hljs-keyword">this</span>.<span class="hljs-keyword">object</span>).length
    ];
  }
}

<span class="hljs-keyword">const</span> <span class="hljs-keyword">object</span> = {
  month: [<span class="hljs-string">"July"</span>, <span class="hljs-string">"September"</span>, <span class="hljs-string">"January"</span>, <span class="hljs-string">"December"</span>],
};

<span class="hljs-keyword">const</span> sortMe = new MySort(<span class="hljs-keyword">object</span>);

console.log(sortMe.getSort());
</code></pre><h4 id="loi-giai">Lời giải:</h4>
<pre><code><span class="hljs-keyword">class</span> MySort {
  constructor(<span class="hljs-keyword">object</span>) {
    this.<span class="hljs-keyword">object</span> = <span class="hljs-keyword">object</span>;
  }

  getSort() {
    <span class="hljs-keyword">return</span> <span class="hljs-keyword">Object</span>.entries(this.<span class="hljs-keyword">object</span>)[<span class="hljs-number">0</span>][<span class="hljs-number">1</span>].sort()[
      // <span class="hljs-keyword">Object</span>.entries(<span class="hljs-keyword">object</span>) sẽ trả về một mảng chứa các mảng con 
      // (mà mỗi mảng con đó chứa <span class="hljs-number">2</span> phần tử [key <span class="hljs-keyword">of</span> phần tử x, <span class="hljs-keyword">value</span> <span class="hljs-keyword">of</span> phần tử x])
      // với x lần lượt từ phần tử đầu tiên tới phần tử cuối cùng của <span class="hljs-keyword">object</span>
      // =&gt; <span class="hljs-keyword">Object</span>.entries(this.<span class="hljs-keyword">object</span>) = [[<span class="hljs-string">'month'</span>, ["July", "September", "January", "December"]]]
      // =&gt; <span class="hljs-keyword">Object</span>.entries(this.<span class="hljs-keyword">object</span>)[<span class="hljs-number">0</span>][<span class="hljs-number">1</span>] = ["July", "September", "January", "December"]
      // =&gt; sort() = ["December", "January", "July", "September"]

      <span class="hljs-keyword">Object</span>.<span class="hljs-keyword">values</span>(this.<span class="hljs-keyword">object</span>).length
      // <span class="hljs-keyword">Object</span>.<span class="hljs-keyword">values</span>(<span class="hljs-keyword">object</span>) trả về một mảng các <span class="hljs-keyword">values</span> trong <span class="hljs-keyword">object</span>
      // =&gt; [["July", "September", "January", "December"]]
      // =&gt; length = <span class="hljs-number">1</span>
    ];
  }
}

const <span class="hljs-keyword">object</span> = {
  month: ["July", "September", "January", "December"],
};

const sortMe = <span class="hljs-built_in">new</span> MySort(<span class="hljs-keyword">object</span>);

console.log(sortMe.getSort());
// sortMe.getSort() = ["December", "January", "July", "September"][<span class="hljs-number">1</span>] = "January"
</code></pre><p>Kiến thức liên quan:</p>
<ul>
<li>Object.entries</li>
<li>Object.values</li>
</ul>
<h3 id="bai-2">Bài 2</h3>
<pre><code>const flag = [] !== !!!!![];

let f = <span class="hljs-function"><span class="hljs-params">()</span> =&gt;</span> {};

<span class="hljs-regexp">//</span> <span class="hljs-built_in">console</span>.log((<span class="hljs-keyword">typeof</span> f()).length + flag.toString().length);
</code></pre><h4 id="loi-giai">Lời giải</h4>
<pre><code>const flag = [] !== !!!!![];
<span class="hljs-regexp">//</span> [] là truthy =&gt; !!!!![] = <span class="hljs-literal">false</span>
<span class="hljs-regexp">//</span> [] !== <span class="hljs-literal">false</span> =&gt; flag = <span class="hljs-literal">true</span>

let f = <span class="hljs-function"><span class="hljs-params">()</span> =&gt;</span> {};

<span class="hljs-regexp">//</span> <span class="hljs-built_in">console</span>.log((<span class="hljs-keyword">typeof</span> f()).length + flag.toString().length);
<span class="hljs-regexp">//</span> Chú ý là đang lấy <span class="hljs-keyword">typeof</span> của giá trị trả về khi thực thi function f
<span class="hljs-regexp">//</span> chứ không phải là (<span class="hljs-keyword">typeof</span> f)
<span class="hljs-regexp">//</span> =&gt; (<span class="hljs-keyword">typeof</span> f()) = <span class="hljs-literal">undefined</span> <span class="hljs-regexp">//</span> <span class="hljs-keyword">do</span> hàm f không trả về giá trị nào
<span class="hljs-regexp">//</span> <span class="hljs-string">'undefined'</span>.length + <span class="hljs-string">'true'</span>.length = <span class="hljs-number">9</span> + <span class="hljs-number">4</span> = <span class="hljs-number">12</span>
</code></pre><p>Kiến thức liên quan:</p>
<ul>
<li>Falsy value: <code>false / 0 / -0 / 0n (BigInt) / '' "" `` (empty string) / NaN / null / undefined / document.all (in browser)</code></li>
<li>Truthy value: là những giá trị khác với Falsy value</li>
<li>type of variable</li>
</ul>
<h3 id="bai-3">Bài 3</h3>
<pre><code>(<span class="hljs-function"><span class="hljs-keyword">function</span> (<span class="hljs-params">a, b, c</span>) </span>{
  <span class="hljs-built_in">arguments</span>[<span class="hljs-number">2</span>] = (<span class="hljs-keyword">typeof</span> <span class="hljs-built_in">arguments</span>).length;

  c &gt; <span class="hljs-number">10</span> ? <span class="hljs-built_in">console</span>.log(c) : <span class="hljs-built_in">console</span>.log(++c);
})(<span class="hljs-number">1</span>, <span class="hljs-number">2</span>, <span class="hljs-number">3</span>);
</code></pre><h4 id="loi-giai">Lời giải:</h4>
<pre><code>(<span class="hljs-function"><span class="hljs-keyword">function</span> (<span class="hljs-params">a, b, c</span>) </span>{
  <span class="hljs-comment">// arguments = [a, b, c] = [1, 2, 3]</span>
  <span class="hljs-built_in">arguments</span>[<span class="hljs-number">2</span>] = (<span class="hljs-keyword">typeof</span> <span class="hljs-built_in">arguments</span>).length;
  <span class="hljs-comment">// (typeof arguments) = 'object'.length = 6</span>
  <span class="hljs-comment">// =&gt; arguments = [1, 2, 6]</span>

  <span class="hljs-comment">// c = arguments[2] = 6</span>
  <span class="hljs-comment">// =&gt; console.log(++6) =&gt; in ra 7</span>
  c &gt; <span class="hljs-number">10</span> ? <span class="hljs-built_in">console</span>.log(c) : <span class="hljs-built_in">console</span>.log(++c);
})(<span class="hljs-number">1</span>, <span class="hljs-number">2</span>, <span class="hljs-number">3</span>);
</code></pre><p>Kiến thức liên quan:</p>
<ul>
<li>arguments in function</li>
</ul>
<h3 id="bai-4">Bài 4</h3>
<pre><code><span class="hljs-keyword">var</span> name = <span class="hljs-string">"Auckland"</span>;

<span class="hljs-keyword">const</span> nz = {
  <span class="hljs-attr">name</span>: <span class="hljs-string">"Kiwi"</span>,

  <span class="hljs-attr">callMe</span>: <span class="hljs-function"><span class="hljs-keyword">function</span> (<span class="hljs-params"></span>) </span>{
    <span class="hljs-keyword">return</span> <span class="hljs-built_in">this</span>.name;
  },
};

<span class="hljs-keyword">let</span> me = nz.callMe;

<span class="hljs-keyword">let</span> she = nz.callMe.bind(nz);

<span class="hljs-keyword">let</span> result = me() === nz.callMe() ? she() : <span class="hljs-string">`<span class="hljs-subst">${me()}</span> <span class="hljs-subst">${she()}</span>`</span>;

<span class="hljs-built_in">console</span>.log(result);
</code></pre><h4 id="loi-giai">Lời giải</h4>
<pre><code><span class="hljs-keyword">var</span> name = <span class="hljs-string">"Auckland"</span>;

<span class="hljs-keyword">const</span> nz = {
  <span class="hljs-attr">name</span>: <span class="hljs-string">"Kiwi"</span>,

  <span class="hljs-attr">callMe</span>: <span class="hljs-function"><span class="hljs-keyword">function</span> (<span class="hljs-params"></span>) </span>{
    <span class="hljs-keyword">return</span> <span class="hljs-built_in">this</span>.name;
  },
};

<span class="hljs-keyword">let</span> me = nz.callMe;
<span class="hljs-comment">// khi gọi me() thì this trong hàm callMe sẽ trỏ đến biến toàn cục global</span>
<span class="hljs-comment">// =&gt; this.name = "Auckland"</span>

<span class="hljs-keyword">let</span> she = nz.callMe.bind(nz);
<span class="hljs-comment">// khi gọi she() tương tự như me() this sẽ trỏ tới biến global</span>
<span class="hljs-comment">// tuy nhiên ta lại sử dụng bind(nz) =&gt; this trỏ tới nz object</span>
<span class="hljs-comment">// =&gt; this.name = "Kiwi"</span>

<span class="hljs-keyword">let</span> result = me() === nz.callMe() ? she() : <span class="hljs-string">`<span class="hljs-subst">${me()}</span> <span class="hljs-subst">${she()}</span>`</span>;
<span class="hljs-comment">// me() === nz.callMe() =&gt; false</span>
<span class="hljs-comment">// `${me()} ${she()}` = "Auckland Kiwi"</span>

<span class="hljs-built_in">console</span>.log(result); <span class="hljs-comment">// "Auckland Kiwi"</span>
</code></pre><p>Kiến thức liên quan:</p>
<ul>
<li>this</li>
<li>bind (bind this)</li>
</ul>
]]></content:encoded></item><item><title><![CDATA[CTN 11. Promise and Event loop]]></title><description><![CDATA[Hello! I'm Zu.Doan
Series này mình muốn rèn luyện khả năng suy nghĩ và giải bài tập, qua đó để hiểu rõ hơn các khái niệm của Javascript.
Bài 1
let promise = new Promise((rs, rj) => {
  setTimeout(() => rs(4), 0);
  // Nhớ lại kiến thức về Event loop,...]]></description><link>https://blog.chonhanh24h.com/ctn-11-promise-and-event-loop</link><guid isPermaLink="true">https://blog.chonhanh24h.com/ctn-11-promise-and-event-loop</guid><category><![CDATA[JavaScript]]></category><dc:creator><![CDATA[Zu.Doan]]></dc:creator><pubDate>Sat, 18 Sep 2021 13:02:25 GMT</pubDate><content:encoded><![CDATA[<p>Hello! I'm Zu.Doan</p>
<p>Series này mình muốn rèn luyện khả năng suy nghĩ và giải bài tập, qua đó để hiểu rõ hơn các khái niệm của Javascript.</p>
<h3 id="bai-1">Bài 1</h3>
<pre><code>let promise = <span class="hljs-keyword">new</span> <span class="hljs-built_in">Promise</span>(<span class="hljs-function"><span class="hljs-params">(rs, rj)</span> =&gt;</span> {
  <span class="hljs-built_in">setTimeout</span>(<span class="hljs-function"><span class="hljs-params">()</span> =&gt;</span> rs(<span class="hljs-number">4</span>), <span class="hljs-number">0</span>);
  <span class="hljs-regexp">//</span> Nhớ lại kiến thức về Event <span class="hljs-keyword">loop</span>, <span class="hljs-built_in">setTimeout</span> là một hàm xử lý bất đồng bộ
  <span class="hljs-regexp">//</span> <span class="hljs-keyword">do</span> đó callback function của nó sẽ được đưa sang API xử lý và đẩy về callback queue để chờ được đẩy lên call stack
  <span class="hljs-regexp">//</span> =&gt; trong trường hợp này nó sẽ được xử lý sau <span class="hljs-number">2</span> lệnh ở dưới

  <span class="hljs-built_in">Promise</span>.resolve(<span class="hljs-built_in">console</span>.log(<span class="hljs-number">3</span>)); <span class="hljs-regexp">//</span> <span class="hljs-keyword">in</span> ra giá trị <span class="hljs-string">"3"</span> và <span class="hljs-keyword">in</span> ra trước lệnh <span class="hljs-built_in">console</span>.log(<span class="hljs-number">2</span>)

  <span class="hljs-built_in">console</span>.log(<span class="hljs-number">2</span>); <span class="hljs-regexp">//</span> <span class="hljs-keyword">in</span> ra giá trị <span class="hljs-string">"2"</span>
});

promise
  .<span class="hljs-keyword">then</span>(<span class="hljs-function"><span class="hljs-params">(rs)</span> =&gt;</span> { <span class="hljs-regexp">//</span> rs = <span class="hljs-number">4</span>
    <span class="hljs-built_in">console</span>.log(rs ? rs ** rs : rs); <span class="hljs-regexp">//</span> = <span class="hljs-built_in">console</span>.log(<span class="hljs-number">4</span>**<span class="hljs-number">4</span>) = <span class="hljs-number">256</span>
    <span class="hljs-keyword">return</span> rs; <span class="hljs-regexp">//</span> <span class="hljs-keyword">return</span> <span class="hljs-number">4</span>
  })
  .<span class="hljs-keyword">then</span>(<span class="hljs-function"><span class="hljs-params">(rs)</span> =&gt;</span> <span class="hljs-built_in">console</span>.log(rs == <span class="hljs-number">256</span> ? rs : rs * rs)); <span class="hljs-regexp">//</span> = <span class="hljs-built_in">console</span>.log(<span class="hljs-number">4</span>*<span class="hljs-number">4</span>) = <span class="hljs-number">16</span>
</code></pre><h4 id="loi-giai">Lời giải:</h4>
<pre><code>let promise = <span class="hljs-keyword">new</span> <span class="hljs-built_in">Promise</span>(<span class="hljs-function"><span class="hljs-params">(rs, rj)</span> =&gt;</span> {
  <span class="hljs-built_in">setTimeout</span>(<span class="hljs-function"><span class="hljs-params">()</span> =&gt;</span> rs(<span class="hljs-number">4</span>), <span class="hljs-number">0</span>);
  <span class="hljs-regexp">//</span> Nhớ lại kiến thức về Event <span class="hljs-keyword">loop</span>, <span class="hljs-built_in">setTimeout</span> là một hàm xử lý bất đồng bộ
  <span class="hljs-regexp">//</span> <span class="hljs-keyword">do</span> đó callback function của nó sẽ được đưa sang API xử lý và đẩy về callback queue để chờ được đẩy lên call stack
  <span class="hljs-regexp">//</span> =&gt; trong trường hợp này nó sẽ được xử lý sau <span class="hljs-number">2</span> lệnh ở dưới

  <span class="hljs-built_in">Promise</span>.resolve(<span class="hljs-built_in">console</span>.log(<span class="hljs-number">3</span>)); <span class="hljs-regexp">//</span> <span class="hljs-keyword">in</span> ra giá trị <span class="hljs-string">"3"</span> và <span class="hljs-keyword">in</span> ra trước lệnh <span class="hljs-built_in">console</span>.log(<span class="hljs-number">2</span>)

  <span class="hljs-built_in">console</span>.log(<span class="hljs-number">2</span>); <span class="hljs-regexp">//</span> <span class="hljs-keyword">in</span> ra giá trị <span class="hljs-string">"2"</span>
});

promise
  .<span class="hljs-keyword">then</span>(<span class="hljs-function"><span class="hljs-params">(rs)</span> =&gt;</span> { <span class="hljs-regexp">//</span> rs = <span class="hljs-number">4</span>
    <span class="hljs-built_in">console</span>.log(rs ? rs ** rs : rs); <span class="hljs-regexp">//</span> = <span class="hljs-built_in">console</span>.log(<span class="hljs-number">4</span>**<span class="hljs-number">4</span>) = <span class="hljs-number">256</span>
    <span class="hljs-keyword">return</span> rs; <span class="hljs-regexp">//</span> <span class="hljs-keyword">return</span> <span class="hljs-number">4</span>
  })
  .<span class="hljs-keyword">then</span>(<span class="hljs-function"><span class="hljs-params">(rs)</span> =&gt;</span> <span class="hljs-built_in">console</span>.log(rs == <span class="hljs-number">256</span> ? rs : rs * rs)); <span class="hljs-regexp">//</span> = <span class="hljs-built_in">console</span>.log(<span class="hljs-number">4</span>*<span class="hljs-number">4</span>) = <span class="hljs-number">16</span>
</code></pre><p>Kiến thức liên quan:</p>
<ul>
<li>Event loop</li>
<li>setTimeout</li>
</ul>
<h3 id="bai-2">Bài 2</h3>
<pre><code><span class="hljs-keyword">async</span> function f() {
  let promise = <span class="hljs-keyword">new</span> <span class="hljs-built_in">Promise</span>(<span class="hljs-function"><span class="hljs-params">(resolve, reject)</span> =&gt;</span> {
    <span class="hljs-built_in">setTimeout</span>(<span class="hljs-function"><span class="hljs-params">()</span> =&gt;</span> resolve(<span class="hljs-string">"done!"</span>), <span class="hljs-number">0</span>);
  });

  <span class="hljs-built_in">setTimeout</span>(<span class="hljs-function"><span class="hljs-params">()</span> =&gt;</span> <span class="hljs-built_in">console</span>.log(<span class="hljs-string">"world"</span>), <span class="hljs-number">0</span>);

  <span class="hljs-built_in">console</span>.log(<span class="hljs-keyword">await</span> promise);

  <span class="hljs-built_in">console</span>.log(<span class="hljs-string">"hello"</span>);
}

f(<span class="hljs-built_in">setTimeout</span>(<span class="hljs-function"><span class="hljs-params">()</span> =&gt;</span> <span class="hljs-built_in">console</span>.log(<span class="hljs-string">"kiora"</span>), <span class="hljs-number">0</span>));
</code></pre><h4 id="loi-giai">Lời giải:</h4>
<pre><code><span class="hljs-keyword">async</span> function f() {
  <span class="hljs-regexp">//</span> Khai báo một <span class="hljs-built_in">Promise</span>
  let promise = <span class="hljs-keyword">new</span> <span class="hljs-built_in">Promise</span>(<span class="hljs-function"><span class="hljs-params">(resolve, reject)</span> =&gt;</span> {
    <span class="hljs-built_in">setTimeout</span>(<span class="hljs-function"><span class="hljs-params">()</span> =&gt;</span> resolve(<span class="hljs-string">"done!"</span>), <span class="hljs-number">0</span>); <span class="hljs-regexp">//</span> Tương tự giải thích như (P1)
  });

  <span class="hljs-built_in">setTimeout</span>(<span class="hljs-function"><span class="hljs-params">()</span> =&gt;</span> <span class="hljs-built_in">console</span>.log(<span class="hljs-string">"world"</span>), <span class="hljs-number">0</span>); <span class="hljs-regexp">//</span> Tương tự giải thích như (P1)

  <span class="hljs-regexp">//</span> Phần thú vị nằm ở đoạn này
  <span class="hljs-regexp">//</span> Do sử dụng <span class="hljs-keyword">await</span> ở đây =&gt; lệnh <span class="hljs-built_in">console</span>.log(<span class="hljs-string">"hello"</span>) ở dưới bị block lại cho đến khi promise trả về giá trị
  <span class="hljs-regexp">//</span> Mà trong promise được khai báo ở trên, nội dung trong nó lại là một hàm <span class="hljs-built_in">setTimeout</span> 
  <span class="hljs-regexp">//</span> =&gt; các <span class="hljs-built_in">setTimeout</span> được khai báo trước đó phải được run xong thì mới run đến <span class="hljs-string">"setTimeout - done!"</span>
  <span class="hljs-regexp">//</span> =&gt; <span class="hljs-keyword">in</span> ra <span class="hljs-string">"kiora"</span>
  <span class="hljs-regexp">//</span> =&gt; <span class="hljs-keyword">in</span> ra <span class="hljs-string">"done!"</span>
  <span class="hljs-built_in">console</span>.log(<span class="hljs-keyword">await</span> promise);

  <span class="hljs-regexp">//</span> Sau khi đợi promise trả về kết quả, thì sẽ thực thi <span class="hljs-built_in">console</span>.log(<span class="hljs-string">"hello"</span>)
  <span class="hljs-regexp">//</span> Và cuối cùng là <span class="hljs-keyword">in</span> ra <span class="hljs-string">"world"</span>, <span class="hljs-keyword">do</span> <span class="hljs-built_in">console</span>.log(<span class="hljs-string">"world"</span>) nằm trong <span class="hljs-built_in">setTimeout</span>
  <span class="hljs-built_in">console</span>.log(<span class="hljs-string">"hello"</span>);
}

f(<span class="hljs-built_in">setTimeout</span>(<span class="hljs-function"><span class="hljs-params">()</span> =&gt;</span> <span class="hljs-built_in">console</span>.log(<span class="hljs-string">"kiora"</span>), <span class="hljs-number">0</span>));
<span class="hljs-regexp">//</span> (P1) Đầu tiên chương trình sẽ thực thi đoạn code <span class="hljs-built_in">setTimeout</span>(<span class="hljs-function"><span class="hljs-params">()</span> =&gt;</span> <span class="hljs-built_in">console</span>.log(<span class="hljs-string">"kiora"</span>), <span class="hljs-number">0</span>) nằm trong phần tham số đầu vào của hàm f()
<span class="hljs-regexp">//</span> <span class="hljs-keyword">do</span> sử dụng <span class="hljs-built_in">setTimeout</span> =&gt; đoạn code này sẽ được đưa sang webApi để xử lý hàm <span class="hljs-built_in">setTimeout</span>
<span class="hljs-regexp">//</span> Sau đó callback của hàm <span class="hljs-built_in">setTimeout</span> được đưa vào callback queue để chờ event <span class="hljs-keyword">loop</span> đưa lên callstack để xử lý nội dung của callback đó

<span class="hljs-regexp">//</span> Tiếp theo sẽ thực thi hàm f()


<span class="hljs-regexp">//</span> Kết quả:
<span class="hljs-regexp">//</span> kiora
<span class="hljs-regexp">//</span> done!
<span class="hljs-regexp">//</span> hello
<span class="hljs-regexp">//</span> world
</code></pre><p>Kiến thức liên quan:</p>
<ul>
<li>Promise</li>
<li>Hiểu về event loop</li>
</ul>
<h3 id="bai-3">Bài 3</h3>
<pre><code><span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">name</span>(<span class="hljs-params"></span>) </span>{
  <span class="hljs-keyword">return</span> <span class="hljs-keyword">new</span> <span class="hljs-built_in">Promise</span>(<span class="hljs-function">(<span class="hljs-params">resolve</span>) =&gt;</span> {
    <span class="hljs-built_in">setTimeout</span>(<span class="hljs-function">() =&gt;</span> {
      resolve(<span class="hljs-string">"New Zealand"</span>);
    }, <span class="hljs-number">10</span>);
  });
}

<span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">fruit</span>(<span class="hljs-params"></span>) </span>{
  <span class="hljs-keyword">return</span> <span class="hljs-keyword">new</span> <span class="hljs-built_in">Promise</span>(<span class="hljs-function">(<span class="hljs-params">resolve</span>) =&gt;</span> {
    <span class="hljs-built_in">setTimeout</span>(<span class="hljs-function">() =&gt;</span> {
      resolve(<span class="hljs-string">"Kiwi"</span>);
    }, <span class="hljs-number">20</span>);
  });
}

(<span class="hljs-keyword">async</span> <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">countryandfruit</span>(<span class="hljs-params"></span>) </span>{
  <span class="hljs-keyword">const</span> getName = <span class="hljs-keyword">await</span> name();
  <span class="hljs-keyword">const</span> getFruit = <span class="hljs-keyword">await</span> fruit();

  <span class="hljs-built_in">console</span>.log(<span class="hljs-string">`Kiora: <span class="hljs-subst">${getName}</span> <span class="hljs-subst">${getFruit}</span>`</span>);
})();

(<span class="hljs-keyword">async</span> <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">fruitandcountry</span>(<span class="hljs-params"></span>) </span>{
  <span class="hljs-keyword">const</span> [getName, getFruit] = <span class="hljs-keyword">await</span> <span class="hljs-built_in">Promise</span>.all([name(), fruit()]);

  <span class="hljs-built_in">console</span>.log(<span class="hljs-string">`Hello: <span class="hljs-subst">${getName}</span> <span class="hljs-subst">${getFruit}</span>`</span>);
})();
</code></pre><h4 id="loi-giai">Lời giải:</h4>
<pre><code><span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">name</span>(<span class="hljs-params"></span>) </span>{
  <span class="hljs-keyword">return</span> <span class="hljs-keyword">new</span> <span class="hljs-built_in">Promise</span>(<span class="hljs-function">(<span class="hljs-params">resolve</span>) =&gt;</span> {
    <span class="hljs-built_in">setTimeout</span>(<span class="hljs-function">() =&gt;</span> {
      resolve(<span class="hljs-string">"New Zealand"</span>);
    }, <span class="hljs-number">10</span>);
  });
}

<span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">fruit</span>(<span class="hljs-params"></span>) </span>{
  <span class="hljs-keyword">return</span> <span class="hljs-keyword">new</span> <span class="hljs-built_in">Promise</span>(<span class="hljs-function">(<span class="hljs-params">resolve</span>) =&gt;</span> {
    <span class="hljs-built_in">setTimeout</span>(<span class="hljs-function">() =&gt;</span> {
      resolve(<span class="hljs-string">"Kiwi"</span>);
    }, <span class="hljs-number">20</span>);
  });
}

(<span class="hljs-keyword">async</span> <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">countryandfruit</span>(<span class="hljs-params"></span>) </span>{
  <span class="hljs-keyword">const</span> getName = <span class="hljs-keyword">await</span> name();
  <span class="hljs-keyword">const</span> getFruit = <span class="hljs-keyword">await</span> fruit();

  <span class="hljs-built_in">console</span>.log(<span class="hljs-string">`Kiora: <span class="hljs-subst">${getName}</span> <span class="hljs-subst">${getFruit}</span>`</span>);
})();

(<span class="hljs-keyword">async</span> <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">fruitandcountry</span>(<span class="hljs-params"></span>) </span>{
  <span class="hljs-keyword">const</span> [getName, getFruit] = <span class="hljs-keyword">await</span> <span class="hljs-built_in">Promise</span>.all([name(), fruit()]);

  <span class="hljs-built_in">console</span>.log(<span class="hljs-string">`Hello: <span class="hljs-subst">${getName}</span> <span class="hljs-subst">${getFruit}</span>`</span>);
})();

<span class="hljs-comment">// In ra "Hello New Zealand Kiwi" trước</span>
<span class="hljs-comment">// In ra "Kiora New Zealand Kiwi" sau</span>

<span class="hljs-comment">// Bản chất là phân biệt được Promise.all là dùng để thực hiện đồng thời nhiều promise</span>
<span class="hljs-comment">// Ở đây ta chú ý tới tổng thời gian thực thi promise trước khi trả về kết quả thông qua console.log()</span>
<span class="hljs-comment">// fruitandcountry function có tổng thời gian chờ = 20 ms</span>
<span class="hljs-comment">// countryandfruit function có tổng thời gian chờ = 10 + 20 ms</span>
</code></pre><p>Kiến thức liên quan:</p>
<ul>
<li>Promise.all</li>
</ul>
]]></content:encoded></item><item><title><![CDATA[Công nghệ sử dụng cho dự án MSEC]]></title><description><![CDATA[1. Phát triển app
Mô hình microservices
1.1 Services
Các services sẽ được xây dựng dựa trên NestJS (base trên nền ExpressJS - một NodeJS framework)
1. Basic setup

Triển khai một service theo doc cơ bản của NestJS
Sử dụng MongoDB làm database (setup ...]]></description><link>https://blog.chonhanh24h.com/cong-nghe-su-dung-cho-du-an-msec</link><guid isPermaLink="true">https://blog.chonhanh24h.com/cong-nghe-su-dung-cho-du-an-msec</guid><category><![CDATA[js]]></category><dc:creator><![CDATA[Zu.Doan]]></dc:creator><pubDate>Sun, 12 Sep 2021 08:14:44 GMT</pubDate><content:encoded><![CDATA[<h2 id="1-phat-trien-app">1. Phát triển app</h2>
<p>Mô hình microservices</p>
<h3 id="11-services">1.1 Services</h3>
<p>Các services sẽ được xây dựng dựa trên NestJS (base trên nền ExpressJS - một NodeJS framework)</p>
<h4 id="1-basic-setup">1. Basic setup</h4>
<ul>
<li>Triển khai một service theo doc cơ bản của NestJS</li>
<li>Sử dụng MongoDB làm database (setup theo mongo doc của NestJS)</li>
<li>Sử dụng Swagger làm api documentation (setup theo swagger doc của NestJS)</li>
<li>Sau khi setup Swagger thì mình dùng thêm <a target="_blank" href="https://www.npmjs.com/package/express-basic-auth">express-basic-auth npm</a> để security cho swagger doc link (xem thêm ở  <a target="_blank" href="https://blog.chonhanh24h.com/thiet-lap-private-cho-swagger-api-doc">bài viết</a>  này)</li>
<li>Sử dụng <a target="_blank" href="https://www.npmjs.com/package/config">config npm</a> để quản lý các configs trong service thay vì hướng dẫn trong NestJS (lý do tại sao thì mình sẽ cập nhật thêm sau, do hiện tại chỉ thấy rằng các project trong dự án mình tham gia sử dụng theo cách này)</li>
<li>Setup validation theo NestJS doc (xem thêm ở bài viết này)</li>
</ul>
<h4 id="2-security">2. Security</h4>
<ul>
<li>Sử dụng <code>helmet</code> để bảo vệ ứng dụng khỏi một số lỗ hổng web bảo mật (xem thêm tại  <a target="_blank" href="https://docs.nestjs.com/security/helmet">NestJS doc helmet</a> ) </li>
</ul>
<h4 id="3-heath-check">3. Heath check</h4>
<ul>
<li>Sử dụng <code>@nestjs/terminus</code> trong NestJS để kiểm tra tình trạng sức khỏe của ứng dụng, có 2 bước cần thực hiện ở đây:<ul>
<li><strong>Step 1</strong>: Kiểm tra sức khỏe của các thành phần liên quan (ví dụ: database ( <a target="_blank" href="https://github.com/nestjs/terminus/tree/master/sample/001-mongoose-app">mongodb</a> ), microservices, memory, disk,...)</li>
<li><strong>Step 2</strong>: Cung cấp một url cho các dịch vụ của cơ sở hạ tầng (ví dụ: kubenetes) dùng để ping tới liên tục để kiểm tra sức khỏe hệ thống và xử lý các bước tiếp theo tùy vào trạng thái trả về là <code>healthy</code> or <code>unhealthy</code>.</li>
</ul>
</li>
</ul>
<h4 id="4-hybrid-app-http-microservice">4. Hybrid app (http + microservice)</h4>
<p>Đối với mỗi một services chúng ta có thể thiết lập nó chỉ để phục vụ:</p>
<ul>
<li>http(s) request / response</li>
<li>microservice app (sử dụng TCP / MQTT hoặc Topic,...)</li>
<li>hybrid (http + microservice)</li>
</ul>
<p>Thì đối với hệ thống của chúng ta, chúng ta sẽ phải kết hợp cả 2 loại dịch vụ nên sẽ lựa chọn loại app là hybrid</p>
<p>Để thiết lập hybrid app trong NestJS ta làm như hướng dẫn trong  <a target="_blank" href="https://docs.nestjs.com/faq/hybrid-application">doc của NestJS</a></p>
<ul>
<li><h3 id="12-web-ui">1.2 Web UI</h3>
</li>
</ul>
<p>Giao diện web sẽ được xây dựng dựa trên ReactJS library</p>
<h2 id="2-trien-khai-app">2. Triển khai app</h2>
<p>Các services sẽ triển khai dưới dạng Docker container và được quản lý bởi Kubenetes</p>
<h2 id="3-co-so-ha-tang-de-run-app">3. Cơ sở hạ tầng để run app</h2>
<p>Sử dụng các dịch vụ của AWS</p>
<h2 id="4-repository-image-registry">4. Repository / Image registry</h2>
<p>Sử dụng Gitlab để lưu trữ source code, Docker images</p>
]]></content:encoded></item><item><title><![CDATA[CTN 10. Function hoisting, closure, Object.create()]]></title><description><![CDATA[Hello! I'm Zu.Doan 
Series này mình muốn rèn luyện khả năng suy nghĩ và giải bài tập, qua đó để hiểu rõ hơn các khái niệm của Javascript.
Bài 1
const id = 10;

const getID = (...id) => {
  id(id);

  function id(id) {
    console.log(typeof id);
  }
...]]></description><link>https://blog.chonhanh24h.com/ctn-10-function-hoisting-closure-objectcreate</link><guid isPermaLink="true">https://blog.chonhanh24h.com/ctn-10-function-hoisting-closure-objectcreate</guid><category><![CDATA[JavaScript]]></category><dc:creator><![CDATA[Zu.Doan]]></dc:creator><pubDate>Sun, 12 Sep 2021 02:11:13 GMT</pubDate><content:encoded><![CDATA[<p>Hello! I'm Zu.Doan </p>
<p>Series này mình muốn rèn luyện khả năng suy nghĩ và giải bài tập, qua đó để hiểu rõ hơn các khái niệm của Javascript.</p>
<h3 id="bai-1">Bài 1</h3>
<pre><code><span class="hljs-keyword">const</span> <span class="hljs-keyword">id</span> = <span class="hljs-number">10</span>;

<span class="hljs-keyword">const</span> getID = (...id) =&gt; {
  <span class="hljs-keyword">id</span>(<span class="hljs-keyword">id</span>);

  function <span class="hljs-keyword">id</span>(<span class="hljs-keyword">id</span>) {
    console.log(<span class="hljs-keyword">typeof</span> <span class="hljs-keyword">id</span>);
  }
};

getID(<span class="hljs-keyword">id</span>);
</code></pre><h4 id="loi-giai">Lời giải</h4>
<pre><code><span class="hljs-keyword">const</span> <span class="hljs-keyword">id</span> = <span class="hljs-number">10</span>;

<span class="hljs-keyword">const</span> getID = (<span class="hljs-keyword">id</span>) =&gt; {
  <span class="hljs-keyword">id</span>(<span class="hljs-keyword">id</span>);

  function <span class="hljs-keyword">id</span>(<span class="hljs-keyword">id</span>) {
    console.log(<span class="hljs-keyword">typeof</span> <span class="hljs-keyword">id</span>);
  }
  <span class="hljs-comment">// function được khai báo trong function, tức là chúng ta đang làm việc với closure</span>
  <span class="hljs-comment">// function id được hoisting</span>
};

getID(<span class="hljs-keyword">id</span>);
<span class="hljs-comment">// gọi hàm id(id) // tính chất closure thể hiện là hàm id(id) vẫn nhớ được scope thực thi của nó trong getId function</span>
<span class="hljs-comment">// trong hàm id, in ra type của id (ở đây id chính là function id, do đã được hoisting)</span>
<span class="hljs-comment">// =&gt; kết quả: function</span>
</code></pre><p>Kiến thức liên quan:</p>
<ul>
<li>Closure</li>
<li>Hoisting</li>
</ul>
<h3 id="bai-2">Bài 2</h3>
<pre><code>var book1 = {
  <span class="hljs-type">name</span>: "Name of the rose",
  getName: <span class="hljs-keyword">function</span> () {
    console.log(this.name);
  },
};

var book2 = {
  <span class="hljs-type">name</span>: { <span class="hljs-keyword">value</span>: "Harry Potter" },
};

var bookCollection = <span class="hljs-keyword">Object</span>.<span class="hljs-keyword">create</span>(book2);
// Cú pháp <span class="hljs-keyword">Object</span>.<span class="hljs-keyword">create</span>(proto) | <span class="hljs-keyword">Object</span>.<span class="hljs-keyword">create</span>(proto, propertiesObject)
// =&gt; ở đây book2 chỉ là "propertiesObject", tức là nó được sử dụng để định nghĩa thuộc tính trong book1
// =&gt; thuộc tính <span class="hljs-type">name</span> của book1 sẽ được khai báo với <span class="hljs-keyword">value</span> = "Harry Potter"

bookCollection.getName();
// =&gt; console.log(this.name) = "Harry Potter"
</code></pre><h4 id="loi-giai">Lời giải:</h4>
<pre><code>var book1 = {
  <span class="hljs-type">name</span>: "Name of the rose",
  getName: <span class="hljs-keyword">function</span> () {
    console.log(this.name);
  },
};

var book2 = {
  <span class="hljs-type">name</span>: { <span class="hljs-keyword">value</span>: "Harry Potter" },
};

var bookCollection = <span class="hljs-keyword">Object</span>.<span class="hljs-keyword">create</span>(book2);
// Cú pháp <span class="hljs-keyword">Object</span>.<span class="hljs-keyword">create</span>(proto) | <span class="hljs-keyword">Object</span>.<span class="hljs-keyword">create</span>(proto, propertiesObject)
// =&gt; ở đây book2 chỉ là "propertiesObject", tức là nó được sử dụng để định nghĩa thuộc tính trong book1
// =&gt; thuộc tính <span class="hljs-type">name</span> của book1 sẽ được khai báo với <span class="hljs-keyword">value</span> = "Harry Potter"

bookCollection.getName();
// =&gt; console.log(this.name) = "Harry Potter"
</code></pre><p>Kiến thức liên quan:</p>
<ul>
<li>Object.create(proto) hoặc Object.create(proto, propertiesObject)</li>
</ul>
<h3 id="bai-3">Bài 3</h3>
<pre><code>(<span class="hljs-function">() =&gt;</span> {
  <span class="hljs-keyword">const</span> a = <span class="hljs-built_in">Object</span>.create({});
  <span class="hljs-keyword">const</span> b = <span class="hljs-built_in">Object</span>.create(<span class="hljs-literal">null</span>);

  <span class="hljs-keyword">let</span> f1 = a.hasOwnProperty(<span class="hljs-string">"toString"</span>); 

  <span class="hljs-keyword">let</span> f2 = <span class="hljs-string">"toString"</span> <span class="hljs-keyword">in</span> b;

  <span class="hljs-keyword">let</span> result =
    f1 === <span class="hljs-literal">false</span> &amp;&amp; f2 === <span class="hljs-literal">false</span>
      ? <span class="hljs-built_in">console</span>.log((<span class="hljs-keyword">typeof</span> a.toString()).length)
      : <span class="hljs-built_in">console</span>.log(b.toString());
})();
</code></pre><h4 id="loi-giai">Lời giải:</h4>
<pre><code>(<span class="hljs-function">() =&gt;</span> {
  <span class="hljs-keyword">const</span> a = <span class="hljs-built_in">Object</span>.create({}); <span class="hljs-comment">// a sẽ là một object rỗng (vẫn bao gồm các thuộc tính build-in của object)</span>
  <span class="hljs-keyword">const</span> b = <span class="hljs-built_in">Object</span>.create(<span class="hljs-literal">null</span>); <span class="hljs-comment">// b sẽ là một object rỗng (KHÔNG bao gồm các thuộc tính build-in của object)</span>

  <span class="hljs-keyword">let</span> f1 = a.hasOwnProperty(<span class="hljs-string">"toString"</span>); 
  <span class="hljs-comment">// hasOwnProperty là một method của object để lấy ra các thuộc tính (KHÔNG bao gồm các thuộc tính build-in)</span>
  <span class="hljs-comment">// nằm trong object đó</span>
  <span class="hljs-comment">// toString là một build-in method của object</span>
  <span class="hljs-comment">// =&gt; kết quả: false</span>

  <span class="hljs-keyword">let</span> f2 = <span class="hljs-string">"toString"</span> <span class="hljs-keyword">in</span> b;
  <span class="hljs-comment">// =&gt; kết quả: false</span>

  <span class="hljs-keyword">let</span> result =
    f1 === <span class="hljs-literal">false</span> &amp;&amp; f2 === <span class="hljs-literal">false</span>
      ? <span class="hljs-built_in">console</span>.log((<span class="hljs-keyword">typeof</span> a.toString()).length) <span class="hljs-comment">// =&gt; kết quả: 6</span>
      : <span class="hljs-built_in">console</span>.log(b.toString());
})();
</code></pre><p>Kiến thức liên quan:</p>
<ul>
<li>Object.create(null)</li>
<li>Object.prototype.toString()</li>
</ul>
]]></content:encoded></item><item><title><![CDATA[CTN 09. x++ và ++x, bind method (Function constructor) và Object.defineProperties, Object.getOwnPropertyNames]]></title><description><![CDATA[Hello! I'm Zu.Doan
Series này mình muốn rèn luyện khả năng suy nghĩ và giải bài tập, qua đó để hiểu rõ hơn các khái niệm của Javascript.
Bài 1
var ronaldo = { age: 34 };

var messi = { age: 32 };

function score(year, tr, t) {
  if (typeof tr === "fu...]]></description><link>https://blog.chonhanh24h.com/ctn-09-x-va-x-bind-method-function-constructor-va-objectdefineproperties-objectgetownpropertynames</link><guid isPermaLink="true">https://blog.chonhanh24h.com/ctn-09-x-va-x-bind-method-function-constructor-va-objectdefineproperties-objectgetownpropertynames</guid><dc:creator><![CDATA[Zu.Doan]]></dc:creator><pubDate>Sat, 11 Sep 2021 13:33:05 GMT</pubDate><content:encoded><![CDATA[<p>Hello! I'm Zu.Doan</p>
<p>Series này mình muốn rèn luyện khả năng suy nghĩ và giải bài tập, qua đó để hiểu rõ hơn các khái niệm của Javascript.</p>
<h3 id="bai-1">Bài 1</h3>
<pre><code><span class="hljs-keyword">var</span> ronaldo = { <span class="hljs-attr">age</span>: <span class="hljs-number">34</span> };

<span class="hljs-keyword">var</span> messi = { <span class="hljs-attr">age</span>: <span class="hljs-number">32</span> };

<span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">score</span>(<span class="hljs-params">year, tr, t</span>) </span>{
  <span class="hljs-keyword">if</span> (<span class="hljs-keyword">typeof</span> tr === <span class="hljs-string">"function"</span> &amp;&amp; <span class="hljs-keyword">typeof</span> t === <span class="hljs-string">"function"</span>) {
    <span class="hljs-built_in">console</span>.log(<span class="hljs-string">`You score <span class="hljs-subst">${tr(year, t(<span class="hljs-built_in">this</span>.age))}</span> times`</span>);
  }
}

<span class="hljs-keyword">const</span> transform = <span class="hljs-function">(<span class="hljs-params">x, y</span>) =&gt;</span> x - y;

<span class="hljs-keyword">const</span> title = <span class="hljs-function">(<span class="hljs-params">x</span>) =&gt;</span> ++x + x++;

<span class="hljs-keyword">const</span> helloRonaldo = score.bind(ronaldo, <span class="hljs-number">2029</span>, transform, title);

helloRonaldo();

<span class="hljs-keyword">const</span> helloMessi = score.bind(messi, <span class="hljs-number">2029</span>, transform, title);

helloMessi();
</code></pre><h4 id="loi-giai">Lời giải:</h4>
<pre><code><span class="hljs-string">var</span> <span class="hljs-string">ronaldo</span> <span class="hljs-string">=</span> { <span class="hljs-attr">age:</span> <span class="hljs-number">34</span> }<span class="hljs-string">;</span>

<span class="hljs-string">var</span> <span class="hljs-string">messi</span> <span class="hljs-string">=</span> { <span class="hljs-attr">age:</span> <span class="hljs-number">32</span> }<span class="hljs-string">;</span>

<span class="hljs-string">function</span> <span class="hljs-string">score(year,</span> <span class="hljs-string">tr,</span> <span class="hljs-string">t)</span> {
  <span class="hljs-string">if</span> <span class="hljs-string">(typeof</span> <span class="hljs-string">tr</span> <span class="hljs-string">===</span> <span class="hljs-string">"function"</span> <span class="hljs-string">&amp;&amp;</span> <span class="hljs-string">typeof</span> <span class="hljs-string">t</span> <span class="hljs-string">===</span> <span class="hljs-string">"function"</span><span class="hljs-string">)</span> {
    <span class="hljs-string">console.log(`You</span> <span class="hljs-string">score</span> <span class="hljs-string">$</span>{<span class="hljs-string">tr(year</span>, <span class="hljs-string">t(this.age))</span>} <span class="hljs-string">times`);</span>
  }
}

<span class="hljs-string">const</span> <span class="hljs-string">transform</span> <span class="hljs-string">=</span> <span class="hljs-string">(x,</span> <span class="hljs-string">y)</span> <span class="hljs-string">=&gt;</span> <span class="hljs-string">x</span> <span class="hljs-bullet">-</span> <span class="hljs-string">y;</span>

<span class="hljs-string">const</span> <span class="hljs-string">title</span> <span class="hljs-string">=</span> <span class="hljs-string">(x)</span> <span class="hljs-string">=&gt;</span> <span class="hljs-string">++x</span> <span class="hljs-string">+</span> <span class="hljs-string">x++;</span>
<span class="hljs-string">//</span> <span class="hljs-string">giả</span> <span class="hljs-string">sử:</span> <span class="hljs-string">x</span> <span class="hljs-string">=</span> <span class="hljs-number">1</span>
<span class="hljs-string">//</span> <span class="hljs-string">biểu</span> <span class="hljs-string">thức</span> <span class="hljs-attr">1:</span> <span class="hljs-string">++x</span> <span class="hljs-string">&lt;=&gt;</span> <span class="hljs-string">trả</span> <span class="hljs-string">về</span> <span class="hljs-string">giá</span> <span class="hljs-string">trị</span> <span class="hljs-string">x</span> <span class="hljs-string">+</span> <span class="hljs-number">1</span> <span class="hljs-string">và</span> <span class="hljs-string">x</span> <span class="hljs-string">=</span> <span class="hljs-string">x</span> <span class="hljs-string">+</span> <span class="hljs-number">1</span> <span class="hljs-string">=&gt;</span> <span class="hljs-string">result</span> <span class="hljs-string">=</span> <span class="hljs-number">2</span>
<span class="hljs-string">//</span> <span class="hljs-string">biểu</span> <span class="hljs-string">thức</span> <span class="hljs-attr">2:</span> <span class="hljs-string">x++</span> <span class="hljs-string">&lt;=&gt;</span> <span class="hljs-string">trả</span> <span class="hljs-string">về</span> <span class="hljs-string">giá</span> <span class="hljs-string">trị</span> <span class="hljs-string">x</span> <span class="hljs-string">và</span> <span class="hljs-string">x</span> <span class="hljs-string">=</span> <span class="hljs-string">x</span> <span class="hljs-string">+</span> <span class="hljs-number">1</span> <span class="hljs-string">=&gt;</span> <span class="hljs-string">result</span> <span class="hljs-string">=</span> <span class="hljs-number">2</span> <span class="hljs-string">(do</span> <span class="hljs-string">x</span> <span class="hljs-string">=</span> <span class="hljs-number">2</span> <span class="hljs-string">sau</span> <span class="hljs-string">khi</span> <span class="hljs-string">biểu</span> <span class="hljs-string">thức</span> <span class="hljs-number">1</span> <span class="hljs-string">được</span> <span class="hljs-string">thực</span> <span class="hljs-string">thi)</span>
<span class="hljs-string">//</span> <span class="hljs-string">biểu</span> <span class="hljs-string">thức</span> <span class="hljs-attr">3:</span> <span class="hljs-string">++x</span> <span class="hljs-string">+</span> <span class="hljs-string">x++</span> <span class="hljs-string">=</span> <span class="hljs-number">2</span> <span class="hljs-string">+</span> <span class="hljs-number">2</span> <span class="hljs-string">=</span> <span class="hljs-number">4</span>

<span class="hljs-string">const</span> <span class="hljs-string">helloRonaldo</span> <span class="hljs-string">=</span> <span class="hljs-string">score.bind(ronaldo,</span> <span class="hljs-number">2029</span><span class="hljs-string">,</span> <span class="hljs-string">transform,</span> <span class="hljs-string">title);</span>

<span class="hljs-string">helloRonaldo();</span>
<span class="hljs-string">//</span> <span class="hljs-string">t(this.age)</span> <span class="hljs-string">=</span> <span class="hljs-string">t(34)</span> <span class="hljs-string">=</span> <span class="hljs-number">35</span> <span class="hljs-string">+</span> <span class="hljs-number">35</span> <span class="hljs-string">=</span> <span class="hljs-number">70</span>
<span class="hljs-string">//</span> <span class="hljs-string">tr(year,</span> <span class="hljs-string">t(this.age))</span> <span class="hljs-string">=</span> <span class="hljs-string">year</span> <span class="hljs-bullet">-</span> <span class="hljs-number">70</span> <span class="hljs-string">=</span> <span class="hljs-number">2029</span> <span class="hljs-bullet">-</span> <span class="hljs-number">70</span> <span class="hljs-string">=</span> <span class="hljs-number">1959</span>
<span class="hljs-string">//</span> <span class="hljs-string">=&gt;</span> <span class="hljs-string">`You</span> <span class="hljs-string">score</span> <span class="hljs-number">1959 </span><span class="hljs-string">times`</span>

<span class="hljs-string">const</span> <span class="hljs-string">helloMessi</span> <span class="hljs-string">=</span> <span class="hljs-string">score.bind(messi,</span> <span class="hljs-number">2029</span><span class="hljs-string">,</span> <span class="hljs-string">transform,</span> <span class="hljs-string">title);</span>

<span class="hljs-string">helloMessi();</span>
<span class="hljs-string">//</span> <span class="hljs-string">t(this.age)</span> <span class="hljs-string">=</span> <span class="hljs-string">t(32)</span> <span class="hljs-string">=</span> <span class="hljs-number">33</span> <span class="hljs-string">+</span> <span class="hljs-number">33</span> <span class="hljs-string">=</span> <span class="hljs-number">66</span>
<span class="hljs-string">//</span> <span class="hljs-string">tr(year,</span> <span class="hljs-string">t(this.age))</span> <span class="hljs-string">=</span> <span class="hljs-string">year</span> <span class="hljs-bullet">-</span> <span class="hljs-number">66</span> <span class="hljs-string">=</span> <span class="hljs-number">2029</span> <span class="hljs-bullet">-</span> <span class="hljs-number">66</span> <span class="hljs-string">=</span> <span class="hljs-number">1963</span>
<span class="hljs-string">//</span> <span class="hljs-string">=&gt;</span> <span class="hljs-string">`You</span> <span class="hljs-string">score</span> <span class="hljs-number">1963 </span><span class="hljs-string">times</span>
</code></pre><p>Kiến thức liên quan:</p>
<ul>
<li>x++ và ++x</li>
<li>Function contructor method: bind</li>
</ul>
<h3 id="bai-2">Bài 2</h3>
<pre><code>var person = {};

<span class="hljs-keyword">Object</span>.defineProperties(person, {
  <span class="hljs-type">name</span>: {
    <span class="hljs-keyword">value</span>: "Vuong",
    enumerable: <span class="hljs-keyword">true</span>,
  },
  job: {
    <span class="hljs-keyword">value</span>: "developer",
    enumerable: <span class="hljs-keyword">true</span>,
  },
  studying: {
    <span class="hljs-keyword">value</span>: "PhD",
    enumerable: <span class="hljs-keyword">true</span>,
  },
  <span class="hljs-type">money</span>: {
    <span class="hljs-keyword">value</span>: "NZD",
    enumerable: <span class="hljs-keyword">false</span>,
  },
});

<span class="hljs-keyword">class</span> Evaluate {
  static checkFlag(obj) {
    <span class="hljs-keyword">return</span> <span class="hljs-keyword">Object</span>.getOwnPropertyNames(obj) &gt; <span class="hljs-keyword">Object</span>.keys(obj)
      ? <span class="hljs-keyword">Object</span>.getOwnPropertyNames(obj)
      : <span class="hljs-keyword">Object</span>.keys(obj);
  }
}

const flag = Evaluate.checkFlag(person);

console.log(flag.length);
</code></pre><h4 id="loi-giai">Lời giải:</h4>
<pre><code>var person = {};

<span class="hljs-keyword">Object</span>.defineProperties(person, {
  <span class="hljs-type">name</span>: {
    <span class="hljs-keyword">value</span>: "Vuong",
    enumerable: <span class="hljs-keyword">true</span>,
  },
  job: {
    <span class="hljs-keyword">value</span>: "developer",
    enumerable: <span class="hljs-keyword">true</span>,
  },
  studying: {
    <span class="hljs-keyword">value</span>: "PhD",
    enumerable: <span class="hljs-keyword">true</span>, // Mặc định khi tạo <span class="hljs-keyword">object</span> thì thuộc tính enumerable = <span class="hljs-keyword">true</span>
  },
  <span class="hljs-type">money</span>: {
    <span class="hljs-keyword">value</span>: "NZD",
    enumerable: <span class="hljs-keyword">false</span>, // <span class="hljs-keyword">Object</span>.keys sẽ không lấy ra được key này (<span class="hljs-type">money</span>)
  },
});

<span class="hljs-keyword">class</span> Evaluate {
  static checkFlag(obj) {
    <span class="hljs-keyword">return</span> <span class="hljs-keyword">Object</span>.getOwnPropertyNames(obj) &gt; <span class="hljs-keyword">Object</span>.keys(obj) 
      // <span class="hljs-keyword">Object</span>.getOwnPropertyNames(obj) = [<span class="hljs-string">'name'</span>, <span class="hljs-string">'job'</span>, <span class="hljs-string">'stydying'</span>, <span class="hljs-string">'money'</span>]
      // <span class="hljs-keyword">Object</span>.keys(obj) = [<span class="hljs-string">'name'</span>, <span class="hljs-string">'job'</span>, <span class="hljs-string">'stydying'</span>], <span class="hljs-keyword">do</span> <span class="hljs-type">money</span> được defined với thuộc tính "enumerable: false"
      // Để thực hiện phép so sánh trong JS, dữ liệu sẽ được convert sang dạng string hoặc number trước khi so sánh
      // =&gt; <span class="hljs-keyword">Object</span>.getOwnPropertyNames(obj) &gt; <span class="hljs-keyword">Object</span>.keys(obj) = <span class="hljs-keyword">true</span>
      ? <span class="hljs-keyword">Object</span>.getOwnPropertyNames(obj)
      : <span class="hljs-keyword">Object</span>.keys(obj);
  }
}

const flag = Evaluate.checkFlag(person);
// Có thể gọi trực tiếp Evaluate.checkFlag bởi vì checkFlag là static <span class="hljs-keyword">function</span>
// =&gt; kết quả = [<span class="hljs-string">'name'</span>, <span class="hljs-string">'job'</span>, <span class="hljs-string">'stydying'</span>, <span class="hljs-string">'money'</span>]

console.log(flag.length); // = <span class="hljs-number">4</span>
</code></pre><p>Kiến thức liên quan:</p>
<ul>
<li>Object.defineProperties</li>
<li>Object.getOwnPropertyNames</li>
</ul>
]]></content:encoded></item><item><title><![CDATA[CTN 08. Left shift (<<) operator, Object.getOwnPropertyNames and window object (browser), Function contructor (bind / call / apply)]]></title><description><![CDATA[Hello! I'm Zu.Doan
Series này mình muốn rèn luyện khả năng suy nghĩ và giải bài tập, qua đó để hiểu rõ hơn các khái niệm của Javascript.
Bài 1
var languages = {
  name: ["elixir", "golang", "js", "php", { name: "feature" }],
  feature: "awesome",
};
...]]></description><link>https://blog.chonhanh24h.com/ctn-08-left-shift-lessless-operator-objectgetownpropertynames-and-window-object-browser-function-contructor-bind-call-apply</link><guid isPermaLink="true">https://blog.chonhanh24h.com/ctn-08-left-shift-lessless-operator-objectgetownpropertynames-and-window-object-browser-function-contructor-bind-call-apply</guid><category><![CDATA[JavaScript]]></category><dc:creator><![CDATA[Zu.Doan]]></dc:creator><pubDate>Wed, 01 Sep 2021 10:52:38 GMT</pubDate><content:encoded><![CDATA[<p>Hello! I'm Zu.Doan</p>
<p>Series này mình muốn rèn luyện khả năng suy nghĩ và giải bài tập, qua đó để hiểu rõ hơn các khái niệm của Javascript.</p>
<h3 id="bai-1">Bài 1</h3>
<pre><code>var languages = {
  <span class="hljs-type">name</span>: ["elixir", "golang", "js", "php", { <span class="hljs-type">name</span>: "feature" }],
  feature: "awesome",
};

let flag = languages.hasOwnProperty(<span class="hljs-keyword">Object</span>.<span class="hljs-keyword">values</span>(languages)[<span class="hljs-number">0</span>][<span class="hljs-number">4</span>].name);

(() =&gt; {
  <span class="hljs-keyword">if</span> (flag !== <span class="hljs-keyword">false</span>) {
    console.log(
      <span class="hljs-keyword">Object</span>.getOwnPropertyNames(languages)[<span class="hljs-number">0</span>].length &lt;&lt;
        <span class="hljs-keyword">Object</span>.keys(languages)[<span class="hljs-number">0</span>].length
    );
  } <span class="hljs-keyword">else</span> {
    console.log(
      <span class="hljs-keyword">Object</span>.getOwnPropertyNames(languages)[<span class="hljs-number">1</span>].length &lt;&lt;
        <span class="hljs-keyword">Object</span>.keys(languages)[<span class="hljs-number">1</span>].length
    );
  }
})();
</code></pre><h4 id="loi-giai">Lời giải:</h4>
<pre><code>var languages = {
  <span class="hljs-type">name</span>: ["elixir", "golang", "js", "php", { <span class="hljs-type">name</span>: "feature" }],
  feature: "awesome",
};

let flag = languages.hasOwnProperty(<span class="hljs-keyword">Object</span>.<span class="hljs-keyword">values</span>(languages)[<span class="hljs-number">0</span>][<span class="hljs-number">4</span>].name);
// <span class="hljs-keyword">Object</span>.<span class="hljs-keyword">values</span>(languages) = <span class="hljs-keyword">Array</span>(
//    ["elixir", "golang", "js", "php", { <span class="hljs-type">name</span>: "feature" }],
//    "awesome"
// )

// =&gt; flag = <span class="hljs-keyword">true</span>

(() =&gt; {
  <span class="hljs-keyword">if</span> (flag !== <span class="hljs-keyword">false</span>) { // matching this <span class="hljs-keyword">case</span>
    console.log(
      <span class="hljs-keyword">Object</span>.getOwnPropertyNames(languages)[<span class="hljs-number">0</span>].length &lt;&lt;
        <span class="hljs-keyword">Object</span>.keys(languages)[<span class="hljs-number">0</span>].length
    );

    // <span class="hljs-keyword">Object</span>.getOwnPropertyNames(languages) = [<span class="hljs-string">'name'</span>, <span class="hljs-string">'feature'</span>]
    // =&gt; <span class="hljs-keyword">Object</span>.getOwnPropertyNames(languages)[<span class="hljs-number">0</span>].length = <span class="hljs-number">4</span>

    // <span class="hljs-keyword">Object</span>.keys(languages) = [<span class="hljs-string">'name'</span>, <span class="hljs-string">'feature'</span>]
    // =&gt; <span class="hljs-keyword">Object</span>.keys(languages)[<span class="hljs-number">0</span>].length = <span class="hljs-number">4</span>

    // kết qủa = <span class="hljs-number">4</span> * <span class="hljs-number">2</span>^<span class="hljs-number">4</span> = <span class="hljs-number">64</span>
  } <span class="hljs-keyword">else</span> {
    console.log(
      <span class="hljs-keyword">Object</span>.getOwnPropertyNames(languages)[<span class="hljs-number">1</span>].length &lt;&lt;
        <span class="hljs-keyword">Object</span>.keys(languages)[<span class="hljs-number">1</span>].length
    );
  }
})();
</code></pre><p>Kiến thức liên quan:</p>
<ul>
<li>Left shift (&lt;&lt;) operator</li>
<li>Object.getOwnPropertyNames</li>
</ul>
<h3 id="bai-2">Bài 2</h3>
<pre><code><span class="hljs-keyword">var</span> player = {
  <span class="hljs-attr">name</span>: <span class="hljs-string">"Ronaldo"</span>,
  <span class="hljs-attr">age</span>: <span class="hljs-number">34</span>,
  <span class="hljs-attr">getAge</span>: <span class="hljs-function"><span class="hljs-keyword">function</span> (<span class="hljs-params"></span>) </span>{
    <span class="hljs-keyword">return</span> ++<span class="hljs-built_in">this</span>.age - <span class="hljs-built_in">this</span>.name.length;
  },
};

<span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">score</span>(<span class="hljs-params">greeting, year</span>) </span>{
  <span class="hljs-built_in">console</span>.log(
    greeting + <span class="hljs-string">" "</span> + <span class="hljs-built_in">this</span>.name + <span class="hljs-string">`! You were born in  <span class="hljs-subst">${year - <span class="hljs-built_in">this</span>.getAge()}</span>`</span>
  );
}

<span class="hljs-built_in">window</span>.window.window.score.call(<span class="hljs-built_in">window</span>.window.window.player, <span class="hljs-string">"Kiora"</span>, <span class="hljs-number">2019</span>);

score.apply(player, [<span class="hljs-string">"Kiora"</span>, <span class="hljs-number">2009</span>]);

<span class="hljs-keyword">const</span> helloRonaldo = <span class="hljs-built_in">window</span>.score.bind(<span class="hljs-built_in">window</span>.player, <span class="hljs-string">"Kiora"</span>, <span class="hljs-number">2029</span>);

helloRonaldo()
</code></pre><h4 id="loi-giai">Lời giải:</h4>
<pre><code>var player = {
  <span class="hljs-type">name</span>: "Ronaldo",
  age: <span class="hljs-number">34</span>,
  getAge: <span class="hljs-keyword">function</span> () {
    <span class="hljs-keyword">return</span> ++this.age - this.name.length;
  },
};

<span class="hljs-keyword">function</span> score(greeting, year) {
  console.log(
    greeting + " " + this.name + `! You were born <span class="hljs-keyword">in</span> ${year - this.getAge()}`
  );
}

// bản chất đối tượng <span class="hljs-keyword">window</span> có chứa một thuộc tính cũng tên là <span class="hljs-keyword">window</span> và trỏ tới <span class="hljs-keyword">window</span> <span class="hljs-keyword">global</span> (chính nó)
// <span class="hljs-keyword">do</span> vậy <span class="hljs-keyword">window</span> === <span class="hljs-keyword">window</span>.<span class="hljs-keyword">window</span> === <span class="hljs-keyword">window</span>.<span class="hljs-keyword">window</span>.<span class="hljs-keyword">window</span>

<span class="hljs-keyword">window</span>.<span class="hljs-keyword">window</span>.<span class="hljs-keyword">window</span>.score.<span class="hljs-keyword">call</span>(<span class="hljs-keyword">window</span>.<span class="hljs-keyword">window</span>.<span class="hljs-keyword">window</span>.player, "Kiora", <span class="hljs-number">2019</span>);
// <span class="hljs-keyword">call</span> là một phương thức của <span class="hljs-keyword">Function</span> contructor
// <span class="hljs-keyword">call</span> = bind + thực thi hàm + truyền tham số dưới dạng param1, param2 vào hàm đó
// =&gt; kết quả = "Kiora Ronaldo! You were born in 1991"

score.apply(player, ["Kiora", <span class="hljs-number">2009</span>]);
// apply là một phương thức của <span class="hljs-keyword">Function</span> contructor
// apply = bind + thực thi hàm + truyền tham số dưới dạng [param1, param2] vào hàm đó
// <span class="hljs-keyword">Do</span> score <span class="hljs-keyword">function</span> đã được thực thi <span class="hljs-number">1</span> lần khi sử dụng <span class="hljs-keyword">call</span> <span class="hljs-keyword">method</span> ở trên =&gt; ++this.age ở player đã thực thi =&gt; lúc này age = <span class="hljs-number">35</span>
// =&gt; kết quả = "Kiora Ronaldo! You were born in 1980"

const helloRonaldo = <span class="hljs-keyword">window</span>.score.bind(<span class="hljs-keyword">window</span>.player, "Kiora", <span class="hljs-number">2029</span>);
// bind là một phương thức của <span class="hljs-keyword">Function</span> contructor
// bind ràng buộc đối tượng this bằng cách truyền vào this argument (hay chính là đối tượng mà chúng ta muốn rằng buộc this của nó vào hàm của chúng ta)
// + truyền tham số dưới dạng param1, param2 vào hàm đó (tham số được sử dụng trong bind sẽ có độ ưu tiên cao hơn)

helloRonaldo()
// <span class="hljs-keyword">Do</span> score <span class="hljs-keyword">function</span> đã được thực thi <span class="hljs-number">2</span> lần khi sử dụng <span class="hljs-keyword">call</span> &amp; apply <span class="hljs-keyword">method</span> ở trên =&gt; ++this.age ở player đã thực thi <span class="hljs-number">2</span> lần =&gt; lúc này age = <span class="hljs-number">36</span>
// =&gt; kết quả = "Kiora Ronaldo! You were born in 1999"
</code></pre><p>Kiến thức liên quan:</p>
<ul>
<li>Đối tượng window (trong trình duyệt)</li>
<li>Function contructor: bind / call / apply</li>
</ul>
]]></content:encoded></item><item><title><![CDATA[Thiết lập configuration trong NestJs]]></title><description><![CDATA[Trong mỗi một project chúng ta đều cần thiết lập các configuration cho từng môi trường làm việc khác nhau test/dev/staging/prod.
Trong NestJS cũng đã cho chúng ta một hướng dẫn về việc setup configuration, tuy nhiên dự án công ty mình lại chọn cách s...]]></description><link>https://blog.chonhanh24h.com/thiet-lap-configuration-trong-nestjs</link><guid isPermaLink="true">https://blog.chonhanh24h.com/thiet-lap-configuration-trong-nestjs</guid><category><![CDATA[nest]]></category><dc:creator><![CDATA[Zu.Doan]]></dc:creator><pubDate>Sat, 28 Aug 2021 10:44:15 GMT</pubDate><content:encoded><![CDATA[<p>Trong mỗi một project chúng ta đều cần thiết lập các configuration cho từng môi trường làm việc khác nhau <code>test/dev/staging/prod</code>.</p>
<p>Trong NestJS cũng đã cho chúng ta một hướng dẫn về việc setup configuration, tuy nhiên dự án công ty mình lại chọn cách sử dụng <code>config module</code> (thực sự mình cũng chưa tìm hiểu được lý do dùng config module thay vì sử dụng config default như NestJS hướng dẫn - sẽ update thêm sau)</p>
<p>Đầu tiên chúng ta cần install package cần thiết</p>
<pre><code>npm i config dotenv <span class="hljs-comment">--save</span>
</code></pre><p>Tiếp theo, trong <strong>project root folder</strong> ta tạo ra một <strong>config folder</strong> để chứa các <strong>config file</strong> (ở đây mình chọn <strong>.yaml</strong> làm định dạng config file - chúng ta có thể sử dụng các định dạng khác như <strong>.json, .js</strong> đều được)</p>
<pre><code>/config
  <span class="hljs-keyword">default</span>.yaml
  prod.yaml
  staging.yaml
  dev.yaml
  test.yaml
</code></pre><p>Ví dụ nội dung của <code>test.yaml</code></p>
<pre><code><span class="hljs-comment"># NODE_ENV=test</span>
<span class="hljs-attr">server:</span>
  <span class="hljs-attr">port:</span> <span class="hljs-number">5000</span>

<span class="hljs-attr">mongodb:</span>
  <span class="hljs-attr">uri:</span> <span class="hljs-string">mongodb://localhost:27017/db-name</span>
</code></pre><p>Tiếp theo để ứng dụng có thể nhận biết được môi trường đang thực thi là môi trường nào để từ đó sẽ lấy config tương ứng thì ta cần tạo một file <code>.env</code> nằm trong <strong>project root folder</strong> với nội dung</p>
<pre><code>NODE_ENV=test // thay thế test bằng dev/staging/prod cho các file config tương ứng khác
// Thực ra khi triển khai <span class="hljs-keyword">tr</span>ên các <span class="hljs-keyword">m</span>ôi <span class="hljs-keyword">tr</span>ường thật thì chúng ta không cần file .env nà<span class="hljs-keyword">y</span>
// <span class="hljs-keyword">m</span>à chúng ta <span class="hljs-keyword">s</span>ẽ phải setup biến <span class="hljs-keyword">m</span>ôi <span class="hljs-keyword">tr</span>ường ở trong chính <span class="hljs-keyword">m</span>ôi <span class="hljs-keyword">tr</span>ường đó
</code></pre><p>** Lưu ý:</p>
<ul>
<li>Các config sẽ được lấy tương ứng với nội dung config file</li>
<li>Nhưng nếu config cần lấy không có trong config file tương ứng thì nó sẽ tìm trong <code>defaul.yaml</code></li>
</ul>
<p>Tiếp theo chúng ta phải làm cho ứng dụng hiểu được file <code>.env</code> là file chứa biến môi trường bằng cách thêm đoạn code sau vào trên cùng file<code>main.ts</code></p>
<pre><code><span class="hljs-selector-tag">require</span>(<span class="hljs-string">'dotenv'</span>)<span class="hljs-selector-class">.config</span>();
</code></pre><p>Cuối cùng để sử dụng các biến config ta sẽ phải import config module và sử dụng nó như ví dụ dưới đây</p>
<pre><code><span class="hljs-keyword">import</span> * <span class="hljs-keyword">as</span> config <span class="hljs-keyword">from</span> <span class="hljs-string">'config'</span>;

const port = config.<span class="hljs-keyword">get</span>(<span class="hljs-string">'server.port'</span>);
</code></pre>]]></content:encoded></item><item><title><![CDATA[CTN 07. Toán tử delete,  Array.property.slice() và so sánh 2 object]]></title><description><![CDATA[Hello! I'm Zu.Doan
Series này mình muốn rèn luyện khả năng suy nghĩ và giải bài tập, qua đó để hiểu rõ hơn các khái niệm của Javascript.
Bài 1
const array = (a) => {
  let length = a.length;
  delete a[length - 1];
  return a.length;
};

console.log(...]]></description><link>https://blog.chonhanh24h.com/ctn-07-toan-tu-delete-arraypropertyslice-va-so-sanh-2-object</link><guid isPermaLink="true">https://blog.chonhanh24h.com/ctn-07-toan-tu-delete-arraypropertyslice-va-so-sanh-2-object</guid><category><![CDATA[JavaScript]]></category><dc:creator><![CDATA[Zu.Doan]]></dc:creator><pubDate>Thu, 26 Aug 2021 02:59:24 GMT</pubDate><content:encoded><![CDATA[<p>Hello! I'm Zu.Doan</p>
<p>Series này mình muốn rèn luyện khả năng suy nghĩ và giải bài tập, qua đó để hiểu rõ hơn các khái niệm của Javascript.</p>
<h3 id="bai-1">Bài 1</h3>
<pre><code><span class="hljs-keyword">const</span> array = <span class="hljs-function">(<span class="hljs-params">a</span>) =&gt;</span> {
  <span class="hljs-keyword">let</span> length = a.length;
  <span class="hljs-keyword">delete</span> a[length - <span class="hljs-number">1</span>];
  <span class="hljs-keyword">return</span> a.length;
};

<span class="hljs-built_in">console</span>.log(array([<span class="hljs-number">1</span>, <span class="hljs-number">2</span>, <span class="hljs-number">3</span>, <span class="hljs-number">4</span>]));

<span class="hljs-keyword">const</span> <span class="hljs-built_in">object</span> = <span class="hljs-function">(<span class="hljs-params">obj</span>) =&gt;</span> {
  <span class="hljs-keyword">let</span> key = <span class="hljs-built_in">Object</span>.keys(obj);
  <span class="hljs-keyword">let</span> length = key.length;
  <span class="hljs-keyword">delete</span> obj[key[length - <span class="hljs-number">1</span>]];

  <span class="hljs-keyword">return</span> <span class="hljs-built_in">Object</span>.keys(obj).length;
};

<span class="hljs-built_in">console</span>.log(<span class="hljs-built_in">object</span>({ <span class="hljs-number">1</span>: <span class="hljs-number">2</span>, <span class="hljs-number">2</span>: <span class="hljs-number">3</span>, <span class="hljs-number">3</span>: <span class="hljs-number">4</span>, <span class="hljs-number">4</span>: <span class="hljs-number">5</span> }));

<span class="hljs-keyword">const</span> setPropNull = <span class="hljs-function">(<span class="hljs-params">obj</span>) =&gt;</span> {
  <span class="hljs-keyword">let</span> key = <span class="hljs-built_in">Object</span>.keys(obj);
  <span class="hljs-keyword">let</span> length = key.length;
  obj[key[length - <span class="hljs-number">1</span>]] = <span class="hljs-literal">null</span>;

  <span class="hljs-keyword">return</span> <span class="hljs-built_in">Object</span>.keys(obj).length;
};

<span class="hljs-built_in">console</span>.log(setPropNull({ <span class="hljs-number">1</span>: <span class="hljs-number">2</span>, <span class="hljs-number">2</span>: <span class="hljs-number">3</span>, <span class="hljs-number">3</span>: <span class="hljs-number">4</span>, <span class="hljs-number">4</span>: <span class="hljs-number">5</span> }));
</code></pre><h4 id="loi-giai">Lời giải:</h4>
<pre><code><span class="hljs-keyword">const</span> array = <span class="hljs-function">(<span class="hljs-params">a</span>) =&gt;</span> {
  <span class="hljs-keyword">let</span> length = a.length; <span class="hljs-comment">// lấy độ dài của mảng a</span>
  <span class="hljs-keyword">delete</span> a[length - <span class="hljs-number">1</span>]; <span class="hljs-comment">// mong muốn xóa phần tử cuối cùng trong mảng a</span>
  <span class="hljs-comment">// tuy nhiên toán tử delete chỉ cho phép xóa chỉ định một thuộc tính của một object</span>
  <span class="hljs-comment">// eg: delete obj.name</span>
  <span class="hljs-comment">// chứ delete operator không có khả năng xóa mảng/object/hay phần tử trong mảng</span>

  <span class="hljs-keyword">return</span> a.length; <span class="hljs-comment">// trả về độ dài của mảng a</span>
};

<span class="hljs-built_in">console</span>.log(array([<span class="hljs-number">1</span>, <span class="hljs-number">2</span>, <span class="hljs-number">3</span>, <span class="hljs-number">4</span>])); <span class="hljs-comment">// return =&gt; 4</span>

<span class="hljs-keyword">const</span> <span class="hljs-built_in">object</span> = <span class="hljs-function">(<span class="hljs-params">obj</span>) =&gt;</span> {
  <span class="hljs-keyword">let</span> key = <span class="hljs-built_in">Object</span>.keys(obj); <span class="hljs-comment">// trả về 1 mảng chứa key của object obj</span>
  <span class="hljs-keyword">let</span> length = key.length; <span class="hljs-comment">// trả về độ dài của mảng key</span>
  <span class="hljs-keyword">delete</span> obj[key[length - <span class="hljs-number">1</span>]]; <span class="hljs-comment">// xóa phần tử cuối cùng trong object obj</span>

  <span class="hljs-keyword">return</span> <span class="hljs-built_in">Object</span>.keys(obj).length; <span class="hljs-comment">// trả về độ dài của mảng chứa key của object obj</span>
};

<span class="hljs-built_in">console</span>.log(<span class="hljs-built_in">object</span>({ <span class="hljs-number">1</span>: <span class="hljs-number">2</span>, <span class="hljs-number">2</span>: <span class="hljs-number">3</span>, <span class="hljs-number">3</span>: <span class="hljs-number">4</span>, <span class="hljs-number">4</span>: <span class="hljs-number">5</span> })); <span class="hljs-comment">// return =&gt; 3</span>

<span class="hljs-keyword">const</span> setPropNull = <span class="hljs-function">(<span class="hljs-params">obj</span>) =&gt;</span> {
  <span class="hljs-keyword">let</span> key = <span class="hljs-built_in">Object</span>.keys(obj); <span class="hljs-comment">// trả về 1 mảng chứa key của object obj</span>
  <span class="hljs-keyword">let</span> length = key.length; <span class="hljs-comment">// trả về độ dài của mảng key</span>
  obj[key[length - <span class="hljs-number">1</span>]] = <span class="hljs-literal">null</span>; <span class="hljs-comment">// gán giá trị null cho phần tử cuối cùng trong object obj</span>

  <span class="hljs-keyword">return</span> <span class="hljs-built_in">Object</span>.keys(obj).length; <span class="hljs-comment">// trả về độ dài của mảng chứa key của object obj</span>
};

<span class="hljs-built_in">console</span>.log(setPropNull({ <span class="hljs-number">1</span>: <span class="hljs-number">2</span>, <span class="hljs-number">2</span>: <span class="hljs-number">3</span>, <span class="hljs-number">3</span>: <span class="hljs-number">4</span>, <span class="hljs-number">4</span>: <span class="hljs-number">5</span> })); <span class="hljs-comment">// return =&gt; 4</span>
</code></pre><p>Kiến thức liên quan:</p>
<ul>
<li>Toán tử delete</li>
</ul>
<h3 id="bai-2">Bài 2</h3>
<pre><code><span class="hljs-string">var</span> <span class="hljs-string">a</span> <span class="hljs-string">=</span> [<span class="hljs-number">1</span>, <span class="hljs-number">2</span>, <span class="hljs-number">3</span>]<span class="hljs-string">;</span>
<span class="hljs-string">var</span> <span class="hljs-string">b</span> <span class="hljs-string">=</span> [<span class="hljs-number">1</span>, <span class="hljs-number">2</span>, <span class="hljs-number">3</span>]<span class="hljs-string">;</span>

<span class="hljs-string">var</span> <span class="hljs-string">c</span> <span class="hljs-string">=</span> [<span class="hljs-number">1</span>, <span class="hljs-number">2</span>, <span class="hljs-number">3</span>]<span class="hljs-string">;</span>
<span class="hljs-string">var</span> <span class="hljs-string">d</span> <span class="hljs-string">=</span> <span class="hljs-string">c;</span>

<span class="hljs-string">var</span> <span class="hljs-string">e</span> <span class="hljs-string">=</span> [<span class="hljs-number">1</span>, <span class="hljs-number">2</span>, <span class="hljs-number">3</span>]<span class="hljs-string">;</span>
<span class="hljs-string">var</span> <span class="hljs-string">f</span> <span class="hljs-string">=</span> <span class="hljs-string">e.slice();</span>

<span class="hljs-string">console.log(a</span> <span class="hljs-string">===</span> <span class="hljs-string">b);</span>
<span class="hljs-string">console.log(c</span> <span class="hljs-string">===</span> <span class="hljs-string">d);</span>
<span class="hljs-string">console.log(e</span> <span class="hljs-string">===</span> <span class="hljs-string">f);</span>
</code></pre><h4 id="loi-giai">Lời giải:</h4>
<pre><code><span class="hljs-keyword">var</span> a = [<span class="hljs-number">1</span>, <span class="hljs-number">2</span>, <span class="hljs-number">3</span>];
<span class="hljs-keyword">var</span> b = [<span class="hljs-number">1</span>, <span class="hljs-number">2</span>, <span class="hljs-number">3</span>];

<span class="hljs-keyword">var</span> <span class="hljs-built_in">c</span> = [<span class="hljs-number">1</span>, <span class="hljs-number">2</span>, <span class="hljs-number">3</span>];
<span class="hljs-keyword">var</span> d = <span class="hljs-built_in">c</span>;

<span class="hljs-keyword">var</span> e = [<span class="hljs-number">1</span>, <span class="hljs-number">2</span>, <span class="hljs-number">3</span>];
<span class="hljs-keyword">var</span> f = e.slice(); <span class="hljs-comment">// Array.property.slice() dùng để sao chép một phần của mảng ra một mảng mới</span>
<span class="hljs-comment">// Đồng thời không làm ảnh hưởng đến dữ liệu của mảng gốc (mảng e)</span>

console.log(a === b); <span class="hljs-comment">// bản chất array là một loại object đặc biện trong JS</span>
<span class="hljs-comment">// Liên hệ lại kiến thức so sánh object thì 2 object luôn luôn không bằng nhau</span>
<span class="hljs-comment">// trừ trường hợp 2 object cùng tham chiếu tới cùng một vùng nhớ</span>
<span class="hljs-comment">// =&gt; false</span>
console.log(<span class="hljs-built_in">c</span> === d); <span class="hljs-comment">// biến d được gán bằng c, do đó d,c cùng trỏ tới một ô nhớ</span>
<span class="hljs-comment">// =&gt; true</span>
console.log(e === f); <span class="hljs-comment">// Theo định nghĩa thì f sẽ là một mảng mới được sao chép ra từ mảng e</span>
<span class="hljs-comment">//  do đó 2 mảng này vẫn tham chiếu tới 2 vùng nhớ khác nhau</span>
<span class="hljs-comment">// =&gt; false</span>
</code></pre><p>Kiến thức liên quan:</p>
<ul>
<li>Array.property.slice()</li>
<li>So sánh 2 object:<ul>
<li>chỉ cần nhớ rằng 2 object luôn KHÔNG bằng nhau</li>
<li>trừ 1 trường hợp duy nhất là 2 object đó cùng tham chiếu tới một vùng nhớ</li>
</ul>
</li>
</ul>
]]></content:encoded></item><item><title><![CDATA[CTN 06. Toán tử delete và __proto__ trong object]]></title><description><![CDATA[Hello! I'm Zu.Doan
Series này mình muốn rèn luyện khả năng suy nghĩ và giải bài tập, qua đó để hiểu rõ hơn các khái niệm của Javascript.
Bài 1
String.prototype.lengthy = () => {
  console.log("hello");
};

let x = { name: "Vuong" };

delete x;

x.nam...]]></description><link>https://blog.chonhanh24h.com/ctn-06-toan-tu-delete-va-proto-trong-object</link><guid isPermaLink="true">https://blog.chonhanh24h.com/ctn-06-toan-tu-delete-va-proto-trong-object</guid><category><![CDATA[JavaScript]]></category><dc:creator><![CDATA[Zu.Doan]]></dc:creator><pubDate>Sat, 21 Aug 2021 15:49:45 GMT</pubDate><content:encoded><![CDATA[<p>Hello! I'm Zu.Doan</p>
<p>Series này mình muốn rèn luyện khả năng suy nghĩ và giải bài tập, qua đó để hiểu rõ hơn các khái niệm của Javascript.</p>
<h3 id="bai-1">Bài 1</h3>
<pre><code><span class="hljs-built_in">String</span>.prototype.lengthy = <span class="hljs-function"><span class="hljs-params">()</span> =&gt;</span> {
  <span class="hljs-built_in">console</span>.log(<span class="hljs-string">"hello"</span>);
};

let x = { name: <span class="hljs-string">"Vuong"</span> };

<span class="hljs-keyword">delete</span> x;

x.name.lengthy();
</code></pre><h4 id="loi-giai">Lời giải:</h4>
<pre><code>String.prototype.lengthy = () =&gt; {
  console.log("hello");
}; // đây là cách thêm prototype vào một đối tượng

let x = { <span class="hljs-type">name</span>: "Vuong" };

<span class="hljs-keyword">delete</span> x; // =&gt; <span class="hljs-keyword">return</span> <span class="hljs-keyword">false</span>
// <span class="hljs-keyword">delete</span> <span class="hljs-keyword">operator</span> là <span class="hljs-keyword">to</span>án tử xóa phần tử của <span class="hljs-keyword">object</span>, ko phải để xóa <span class="hljs-keyword">object</span>
// <span class="hljs-number">1</span> trường hợp ngoại lệ <span class="hljs-keyword">delete</span> có thể xóa cả <span class="hljs-keyword">object</span> đó là khi <span class="hljs-keyword">object</span> đó: 
// - nằm ở <span class="hljs-keyword">global</span> scope
// - và KHÔNG được khai báo bằng từ khóa let, const hay var

x.name.lengthy(); // =&gt; <span class="hljs-keyword">return</span> "hello"
</code></pre><p>Kiến thức liên quan:</p>
<ul>
<li>Toán tử <code>delete</code></li>
</ul>
<h3 id="bai-2">Bài 2</h3>
<pre><code><span class="hljs-keyword">let</span> x = {};

x.__proto__.hi = <span class="hljs-number">10</span>;

<span class="hljs-built_in">Object</span>.prototype.hi = ++x.hi;

<span class="hljs-built_in">console</span>.log(x.hi + <span class="hljs-built_in">Object</span>.keys(x).length);
</code></pre><h4 id="loi-giai">Lời giải:</h4>
<pre><code><span class="hljs-keyword">let</span> x = {};

x.__proto__.hi = <span class="hljs-number">10</span>; <span class="hljs-comment">// &lt;=&gt; Object.prototype.hi = 10</span>
<span class="hljs-comment">// bởi vì __proto__ sử dụng để objectA trỏ tới prototype của objectB (ở đây objectA là x và objectB là Object build-in trong JS)</span>

<span class="hljs-built_in">Object</span>.prototype.hi = ++x.hi; <span class="hljs-comment">// Thiết lập prototype của Object = ++x.hi = 11</span>

<span class="hljs-built_in">console</span>.log(x.hi + <span class="hljs-built_in">Object</span>.keys(x).length);
<span class="hljs-comment">// x.hi = 11 </span>
<span class="hljs-comment">// Object.keys(x) = ["hi"] =&gt; length = 1</span>
<span class="hljs-comment">// kết quả = 11 + 1 = 12</span>
</code></pre><p>Kiến thức liên quan:</p>
<ul>
<li><strong>proto</strong> (deprecated)</li>
</ul>
]]></content:encoded></item><item><title><![CDATA[CTN 05. So sánh 2 object]]></title><description><![CDATA[Hello! I'm Zu.Doan
Series này mình muốn rèn luyện khả năng suy nghĩ và giải bài tập, qua đó để hiểu rõ hơn các khái niệm của Javascript.
Bài 1
let x = {};
let y = {};
let z = x;

console.log(x == y);
console.log(x === y);
console.log(x == z);
console...]]></description><link>https://blog.chonhanh24h.com/ctn-05-so-sanh-2-object</link><guid isPermaLink="true">https://blog.chonhanh24h.com/ctn-05-so-sanh-2-object</guid><category><![CDATA[JavaScript]]></category><dc:creator><![CDATA[Zu.Doan]]></dc:creator><pubDate>Fri, 20 Aug 2021 15:51:10 GMT</pubDate><content:encoded><![CDATA[<p>Hello! I'm Zu.Doan</p>
<p>Series này mình muốn rèn luyện khả năng suy nghĩ và giải bài tập, qua đó để hiểu rõ hơn các khái niệm của Javascript.</p>
<h3 id="bai-1">Bài 1</h3>
<pre><code><span class="hljs-keyword">let</span> x = {};
<span class="hljs-keyword">let</span> y = {};
<span class="hljs-keyword">let</span> z = x;

<span class="hljs-built_in">console</span>.log(x == y);
<span class="hljs-built_in">console</span>.log(x === y);
<span class="hljs-built_in">console</span>.log(x == z);
<span class="hljs-built_in">console</span>.log(x === z);
</code></pre><h4 id="loi-giai">Lời giải:</h4>
<pre><code><span class="hljs-keyword">let</span> x = {};
<span class="hljs-keyword">let</span> y = {};
<span class="hljs-keyword">let</span> z = x;

<span class="hljs-built_in">console</span>.log(x == y); <span class="hljs-comment">// x và y đều là object rỗng, tuy nhiên JS không so sánh được giá trị của object =&gt; false</span>
<span class="hljs-built_in">console</span>.log(x === y); <span class="hljs-comment">// tương tự như trên =&gt; false</span>
<span class="hljs-built_in">console</span>.log(x == z); <span class="hljs-comment">// x,z cũng là 2 object rỗng, tuy nhiên 2 biến này cùng trỏ tới một vị trí ô nhớ =&gt; true</span>
<span class="hljs-built_in">console</span>.log(x === z); <span class="hljs-comment">// tương tự như trên =&gt; true</span>
</code></pre><p>Kiến thức liên quan:</p>
<ul>
<li>Để so sánh 2 object (có cùng thứ tự các phần tử trong object) thì có thể sử dụng phương pháp: JSON.stringify(obj1) === JSON.stringify(obj2)</li>
<li>Để so sánh 2 object (mà không quan tâm đến thứ tự phần tử trong object) thì có thể sử dụng lodash (isEqual)</li>
</ul>
<h3 id="bai-2">Bài 2</h3>
<pre><code><span class="hljs-built_in">console</span>.log(<span class="hljs-string">"hello"</span>);

<span class="hljs-built_in">setTimeout</span>(<span class="hljs-function"><span class="hljs-params">()</span> =&gt;</span> <span class="hljs-built_in">console</span>.log(<span class="hljs-string">"world"</span>), <span class="hljs-number">0</span>);

<span class="hljs-built_in">console</span>.log(<span class="hljs-string">"hi"</span>);
</code></pre><h4 id="loi-giai">Lời giải:</h4>
<pre><code><span class="hljs-built_in">console</span>.log(<span class="hljs-string">"hello"</span>); <span class="hljs-regexp">//</span> <span class="hljs-keyword">in</span> ra ngay <span class="hljs-string">"hello"</span>

<span class="hljs-built_in">setTimeout</span>(<span class="hljs-function"><span class="hljs-params">()</span> =&gt;</span> <span class="hljs-built_in">console</span>.log(<span class="hljs-string">"world"</span>), <span class="hljs-number">0</span>); 
<span class="hljs-regexp">//</span> <span class="hljs-keyword">do</span> nằm trong <span class="hljs-built_in">setTimeout</span> nên hàm này sẽ là bất đồng bộ
<span class="hljs-regexp">//</span> <span class="hljs-keyword">do</span> đó khi chương trình này sẽ được đưa vào Web/Node API để thực thi và trả về callback cho event <span class="hljs-keyword">loop</span> và sau đó đưa vào call stack =&gt; chạy sau <span class="hljs-built_in">console</span>.log(<span class="hljs-string">"hi"</span>)

<span class="hljs-built_in">console</span>.log(<span class="hljs-string">"hi"</span>); <span class="hljs-regexp">//</span> <span class="hljs-keyword">in</span> ra ngay <span class="hljs-string">"hi"</span>

<span class="hljs-regexp">//</span> =&gt; Kết quả: <span class="hljs-string">"hello"</span> =&gt; <span class="hljs-string">"hi"</span> =&gt; <span class="hljs-string">"world"</span>
</code></pre><p>Kiến thức liên quan:</p>
<ul>
<li>Hiểu về Event loop trong JS</li>
</ul>
]]></content:encoded></item><item><title><![CDATA[CTN 04. Spread operator, Object.keys và static trong Class]]></title><description><![CDATA[Hello! I'm Zu.Doan
Series này mình muốn rèn luyện khả năng suy nghĩ và giải bài tập, qua đó để hiểu rõ hơn các khái niệm của Javascript.
Bài 1
const js = { language: "loosely type", label: "difficult" };

const edu = { ...js, level: "PhD" };

const n...]]></description><link>https://blog.chonhanh24h.com/ctn-04-spread-operator-objectkeys-va-static-trong-class</link><guid isPermaLink="true">https://blog.chonhanh24h.com/ctn-04-spread-operator-objectkeys-va-static-trong-class</guid><category><![CDATA[JavaScript]]></category><dc:creator><![CDATA[Zu.Doan]]></dc:creator><pubDate>Tue, 17 Aug 2021 15:27:05 GMT</pubDate><content:encoded><![CDATA[<p>Hello! I'm Zu.Doan</p>
<p>Series này mình muốn rèn luyện khả năng suy nghĩ và giải bài tập, qua đó để hiểu rõ hơn các khái niệm của Javascript.</p>
<h3 id="bai-1">Bài 1</h3>
<pre><code><span class="hljs-keyword">const</span> js = { <span class="hljs-attr">language</span>: <span class="hljs-string">"loosely type"</span>, <span class="hljs-attr">label</span>: <span class="hljs-string">"difficult"</span> };

<span class="hljs-keyword">const</span> edu = { ...js, <span class="hljs-attr">level</span>: <span class="hljs-string">"PhD"</span> };

<span class="hljs-keyword">const</span> newbie = edu;

<span class="hljs-keyword">delete</span> edu.language;

<span class="hljs-built_in">console</span>.log(<span class="hljs-built_in">Object</span>.keys(newbie).length);
</code></pre><h4 id="loi-giai">Lời giải:</h4>
<pre><code>const js = { language: <span class="hljs-string">"loosely type"</span>, label: <span class="hljs-string">"difficult"</span> };

const edu = { ...js, level: <span class="hljs-string">"PhD"</span> }; <span class="hljs-regexp">//</span> edu = { language: <span class="hljs-string">"loosely type"</span>, label: <span class="hljs-string">"difficult"</span>, level: <span class="hljs-string">"PhD"</span> };

const newbie = edu; <span class="hljs-regexp">//</span> edu = { language: <span class="hljs-string">"loosely type"</span>, label: <span class="hljs-string">"difficult"</span>, level: <span class="hljs-string">"PhD"</span> };

<span class="hljs-keyword">delete</span> edu.language; <span class="hljs-regexp">//</span> edu = { label: <span class="hljs-string">"difficult"</span>, level: <span class="hljs-string">"PhD"</span> };

<span class="hljs-built_in">console</span>.log(<span class="hljs-built_in">Object</span>.keys(newbie).length);
<span class="hljs-regexp">//</span> <span class="hljs-built_in">Object</span>.keys(newbie) = [<span class="hljs-string">'label'</span>, <span class="hljs-string">'level'</span>] =&gt; <span class="hljs-built_in">Object</span>.keys(newbie).length = <span class="hljs-number">2</span>
</code></pre><p>Kiến thức liên quan:</p>
<ul>
<li>Spread operator</li>
<li>Object.keys trả về một mảng với thành phần là các key của object truyền vào</li>
</ul>
<h3 id="bai-2">Bài 2</h3>
<pre><code><span class="hljs-keyword">var</span> candidate = {
  name: <span class="hljs-string">"Vuong"</span>,
  age: <span class="hljs-number">30</span>,
};

<span class="hljs-keyword">var</span> job = {
  frontend: <span class="hljs-string">"Vuejs or Reactjs"</span>,
  backend: <span class="hljs-string">"PHP and Laravel"</span>,
  city: <span class="hljs-string">"Auckland"</span>,
};

<span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">Combine</span> </span>{
  <span class="hljs-keyword">static</span> <span class="hljs-keyword">get</span>() {
    <span class="hljs-keyword">return</span> <span class="hljs-built_in">Object</span>.assign(candidate, job);
  }

  <span class="hljs-keyword">static</span> count() {
    <span class="hljs-keyword">return</span> <span class="hljs-built_in">Object</span>.keys(<span class="hljs-keyword">this</span>.<span class="hljs-keyword">get</span>()).length;
  }
}

console.log(Combine.count());
</code></pre><h4 id="loi-giai">Lời giải:</h4>
<pre><code>var candidate = {
  <span class="hljs-type">name</span>: "Vuong",
  age: <span class="hljs-number">30</span>,
};

var job = {
  frontend: "Vuejs or Reactjs",
  backend: "PHP and Laravel",
  city: "Auckland",
};

<span class="hljs-keyword">class</span> Combine {
  static <span class="hljs-keyword">get</span>() {
    <span class="hljs-keyword">return</span> <span class="hljs-keyword">Object</span>.assign(candidate, job); // gộp <span class="hljs-number">2</span> <span class="hljs-keyword">object</span>: candidate và job thành một
  }

  static count() {
    <span class="hljs-keyword">return</span> <span class="hljs-keyword">Object</span>.keys(this.<span class="hljs-keyword">get</span>()).length;
    // this.<span class="hljs-keyword">get</span>() = <span class="hljs-keyword">object</span> gộp từ <span class="hljs-number">2</span> <span class="hljs-keyword">object</span> candidate và job
    // <span class="hljs-keyword">Object</span>.keys(this.<span class="hljs-keyword">get</span>()) = mảng chứa keys của <span class="hljs-keyword">object</span> trả về từ this.<span class="hljs-keyword">get</span>()
    // <span class="hljs-keyword">Object</span>.keys(this.<span class="hljs-keyword">get</span>()).length = <span class="hljs-number">5</span>
  }
}

console.log(Combine.count());
</code></pre><p>Kiến thức liên quan:</p>
<ul>
<li>Từ khóa static trong class sẽ cho phép truy cập tới phương thức (hoặc thuộc tính) của lớp ở bên ngoài theo cú pháp <code>Class.staticMethod()</code></li>
</ul>
]]></content:encoded></item><item><title><![CDATA[CTN 03. Hoisting và từ khóa var]]></title><description><![CDATA[Hello! I'm Zu.Doan
Series này mình muốn rèn luyện khả năng suy nghĩ và giải bài tập, qua đó để hiểu rõ hơn các khái niệm của Javascript. Mình tham khảo các bài tập từ link này.
Bài 1
var tip = 100;

(function () {
  console.log("I have $" + husband()...]]></description><link>https://blog.chonhanh24h.com/ctn-03-hoisting-va-tu-khoa-var</link><guid isPermaLink="true">https://blog.chonhanh24h.com/ctn-03-hoisting-va-tu-khoa-var</guid><category><![CDATA[JavaScript]]></category><dc:creator><![CDATA[Zu.Doan]]></dc:creator><pubDate>Sun, 15 Aug 2021 15:11:35 GMT</pubDate><content:encoded><![CDATA[<p>Hello! I'm Zu.Doan</p>
<p>Series này mình muốn rèn luyện khả năng suy nghĩ và giải bài tập, qua đó để hiểu rõ hơn các khái niệm của Javascript. Mình tham khảo các bài tập từ link này.</p>
<h3 id="bai-1">Bài 1</h3>
<pre><code><span class="hljs-keyword">var</span> tip = <span class="hljs-number">100</span>;

(<span class="hljs-function"><span class="hljs-keyword">function</span> (<span class="hljs-params"></span>) </span>{
  <span class="hljs-built_in">console</span>.log(<span class="hljs-string">"I have $"</span> + husband());

  <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">wife</span>(<span class="hljs-params"></span>) </span>{
    <span class="hljs-keyword">return</span> tip * <span class="hljs-number">2</span>;
  }

  <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">husband</span>(<span class="hljs-params"></span>) </span>{
    <span class="hljs-keyword">return</span> wife() / <span class="hljs-number">2</span>;
  }

  <span class="hljs-keyword">var</span> tip = <span class="hljs-number">10</span>;
})();
</code></pre><h4 id="loi-giai">Lời giải:</h4>
<pre><code><span class="hljs-keyword">var</span> tip = <span class="hljs-number">100</span>;

(<span class="hljs-function"><span class="hljs-keyword">function</span> (<span class="hljs-params"></span>) </span>{
  <span class="hljs-comment">// ở đây các hàm wife &amp; husband cũng như biến tip đã được hoisting</span>
  <span class="hljs-comment">// do đó tip = undefined</span>
  <span class="hljs-comment">// =&gt; tip * 2 = NaN</span>
  <span class="hljs-comment">// =&gt; wife() / 2 = NaN</span>

  <span class="hljs-built_in">console</span>.log(<span class="hljs-string">"I have $"</span> + husband()); <span class="hljs-comment">// =&gt; kết quả của console log = I have $NaN</span>

  <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">wife</span>(<span class="hljs-params"></span>) </span>{ <span class="hljs-comment">// hàm được hoisting</span>
    <span class="hljs-keyword">return</span> tip * <span class="hljs-number">2</span>;
  }

  <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">husband</span>(<span class="hljs-params"></span>) </span>{ <span class="hljs-comment">// hàm được hoisting</span>
    <span class="hljs-keyword">return</span> wife() / <span class="hljs-number">2</span>;
  }

  <span class="hljs-keyword">var</span> tip = <span class="hljs-number">10</span>; <span class="hljs-comment">// biến tip ở đây sẽ được sử dụng trong phạm vi của IIFE function</span>
  <span class="hljs-comment">// và biết tip này cũng sẽ được khai báo đè biến tip ở phạm vi global</span>
  <span class="hljs-comment">// biết tip được hoisting nên sẽ được đưa khai báo lên đầu phạm vi của IIFE function và do là sử dụng var để khai báo nên biến tip sẽ nhận giá trị ban đầu là undefined</span>
})(); <span class="hljs-comment">// Đây là IIFE function - hiểu đơn giản là hàm thực thi ngay sau khi được khai báo</span>
</code></pre><p>Kiến thức liên quan:</p>
<ul>
<li>Hoisting biến và function</li>
<li>Biến sử dụng từ khóa <code>var</code> để khai báo thì sẽ được gán giá trị mặc định là <code>undefined</code> khi được hoisting</li>
<li>Biến sử dụng từ khóa <code>var</code> có thể khai báo lại</li>
</ul>
<h3 id="bai-2">Bài 2</h3>
<pre><code>var x = <span class="hljs-number">1</span>;

(<span class="hljs-function"><span class="hljs-params">()</span> =&gt;</span> {
  x += <span class="hljs-number">1</span>;
  ++x;
})();
(<span class="hljs-function"><span class="hljs-params">(y)</span> =&gt;</span> {
  x += y;
  x = x % y;
})(<span class="hljs-number">2</span>);
(<span class="hljs-function"><span class="hljs-params">()</span> =&gt;</span> (x += x))();
(<span class="hljs-function"><span class="hljs-params">()</span> =&gt;</span> (x *= x))();

<span class="hljs-built_in">console</span>.log(x);
</code></pre><h4 id="loi-giai">Lời giải:</h4>
<pre><code><span class="hljs-keyword">var</span> x = <span class="hljs-number">1</span>;

(<span class="hljs-function">() =&gt;</span> {
  x += <span class="hljs-number">1</span>; <span class="hljs-comment">// =&gt; x = 2</span>
  ++x; <span class="hljs-comment">// =&gt; x = 3</span>
})();

(<span class="hljs-function">(<span class="hljs-params">y</span>) =&gt;</span> {
  x += y; <span class="hljs-comment">// x = x + 2 = 5</span>
  x = x % y; <span class="hljs-comment">// x = 5%2 = 1</span>
})(<span class="hljs-number">2</span>);

(<span class="hljs-function">() =&gt;</span> (x += x))(); <span class="hljs-comment">// x = 2</span>

(<span class="hljs-function">() =&gt;</span> (x *= x))(); <span class="hljs-comment">// x = 2 * 2 = 4</span>

<span class="hljs-built_in">console</span>.log(x); <span class="hljs-comment">// 4</span>
</code></pre><p>Kiến thức liên quan:</p>
]]></content:encoded></item><item><title><![CDATA[Thiết lập Private cho Swagger API doc]]></title><description><![CDATA[Hello! I'm Zu.Doan
Trong quá trình setup Swagger cho dự án, thì mình cũng chỉ cần follow theo  docs của NestJs  là setup thành công Swagger API doc cho service của mình.
Tuy nhiên Swagger API doc link này lại là public, ai cũng có thể truy cập được v...]]></description><link>https://blog.chonhanh24h.com/thiet-lap-private-cho-swagger-api-doc</link><guid isPermaLink="true">https://blog.chonhanh24h.com/thiet-lap-private-cho-swagger-api-doc</guid><dc:creator><![CDATA[Zu.Doan]]></dc:creator><pubDate>Tue, 10 Aug 2021 15:16:10 GMT</pubDate><content:encoded><![CDATA[<p>Hello! I'm Zu.Doan</p>
<p>Trong quá trình setup Swagger cho dự án, thì mình cũng chỉ cần follow theo  <a target="_blank" href="https://docs.nestjs.com/openapi/introduction">docs của NestJs</a>  là setup thành công Swagger API doc cho service của mình.</p>
<p>Tuy nhiên Swagger API doc link này lại là public, ai cũng có thể truy cập được và điều đó không tốt một chút nào phải không.</p>
<p>Sau một thời gian ngắn gg search, mình tìm thấy một giải pháp đơn giản như sau:</p>
<ul>
<li>Sử dụng module <code>express-basic-auth</code></li>
<li>Setup basic auth (sử dụng user name &amp; password) cho những route đang truy cập tới Swagger API doc của mình</li>
</ul>
<pre><code><span class="hljs-keyword">import</span> { NestFactory } <span class="hljs-keyword">from</span> <span class="hljs-string">'@nestjs/core'</span>;
<span class="hljs-keyword">import</span> { SwaggerModule, DocumentBuilder } <span class="hljs-keyword">from</span> <span class="hljs-string">'@nestjs/swagger'</span>;
<span class="hljs-keyword">import</span> { AppModule } <span class="hljs-keyword">from</span> <span class="hljs-string">'./modules/app.module'</span>;
<span class="hljs-keyword">import</span> * <span class="hljs-keyword">as</span> basicAuth <span class="hljs-keyword">from</span> <span class="hljs-string">'express-basic-auth'</span>;
<span class="hljs-built_in">require</span>(<span class="hljs-string">'dotenv'</span>).config();

<span class="hljs-keyword">async</span> <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">bootstrap</span>(<span class="hljs-params"></span>) </span>{
  <span class="hljs-keyword">const</span> app = <span class="hljs-keyword">await</span> NestFactory.create(AppModule);

  <span class="hljs-comment">// Setup Swagger</span>
  app.use([<span class="hljs-string">'/api'</span>], basicAuth({
    <span class="hljs-attr">challenge</span>: <span class="hljs-literal">true</span>,
    <span class="hljs-attr">users</span>: {
      [process.env.SWAGGER_USER]: process.env.SWAGGER_PASS,
    },
  }));

  <span class="hljs-keyword">const</span> config = <span class="hljs-keyword">new</span> DocumentBuilder()
  .setTitle(<span class="hljs-string">'Swagger'</span>)
  .setDescription(<span class="hljs-string">'The api-shops API description'</span>)
  .setVersion(<span class="hljs-string">'1.0'</span>)
  .build();
  <span class="hljs-keyword">const</span> <span class="hljs-built_in">document</span> = SwaggerModule.createDocument(app, config);
  SwaggerModule.setup(<span class="hljs-string">'api'</span>, app, <span class="hljs-built_in">document</span>);

  <span class="hljs-comment">// App listen</span>
  <span class="hljs-keyword">await</span> app.listen(<span class="hljs-number">3000</span>);
}
bootstrap();
</code></pre><p>Và kết quả là</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1628608054380/bLy4du_Xg.png" alt="Screenshot from 2021-08-10 22-07-08.png" /></p>
]]></content:encoded></item><item><title><![CDATA[JS 01. Var - Let - Const]]></title><description><![CDATA[Hello! I'm Zu.Doan
Series này mình muốn note lại những kiến thức về Javascript (JS)
var dùng như thế nào?
Từ khóa var được sử dụng để khai báo một biến trong JS
Biến được khai báo bằng var có một số đặc điểm như sau:

(1) Biến đó sẽ có phạm vi toàn c...]]></description><link>https://blog.chonhanh24h.com/js-01-var-let-const</link><guid isPermaLink="true">https://blog.chonhanh24h.com/js-01-var-let-const</guid><category><![CDATA[JavaScript]]></category><dc:creator><![CDATA[Zu.Doan]]></dc:creator><pubDate>Mon, 09 Aug 2021 16:03:13 GMT</pubDate><content:encoded><![CDATA[<p>Hello! I'm Zu.Doan</p>
<p>Series này mình muốn note lại những kiến thức về Javascript (JS)</p>
<h3 id="var-dung-nhu-the-nao">var dùng như thế nào?</h3>
<p>Từ khóa <code>var</code> được sử dụng để khai báo một biến trong JS</p>
<p>Biến được khai báo bằng <code>var</code> có một số đặc điểm như sau:</p>
<ul>
<li>(1) Biến đó sẽ có phạm vi toàn cục.</li>
<li>(2) Biến đó sẽ có phạm vi cục bộ khi nằm trong hàm.</li>
<li>(3) Biến đó có thể được khai báo lại hoặc ghi đè giá trị.</li>
<li>(4) Biến đó sẽ được hoisting đồng thời được gán giá trị mặc định là <code>undefined</code></li>
</ul>
<pre><code>console.log(k); // <span class="hljs-keyword">In</span> ra undefined - <span class="hljs-keyword">do</span> k có được đặc tính (<span class="hljs-number">1</span>) &amp; (<span class="hljs-number">4</span>) 
{
  console.log(k); // <span class="hljs-keyword">In</span> ra undefined - <span class="hljs-keyword">do</span> k có được đặc tính (<span class="hljs-number">1</span>) &amp; (<span class="hljs-number">4</span>) 
  {
    {
      const l = <span class="hljs-number">2</span>;
      <span class="hljs-keyword">if</span>(l == <span class="hljs-number">2</span>) {
        var k = <span class="hljs-number">1</span>; // <span class="hljs-keyword">Do</span> k đã được hoisting nên trên đầu của scope nên đoạn này tương đương việc khai báo lại và gán giá trị cho k - <span class="hljs-keyword">do</span> k có được đặc tính (<span class="hljs-number">3</span>)
      }
    }

    console.log(k);
  }

  <span class="hljs-keyword">function</span> sayHello() {
    var <span class="hljs-type">name</span> = <span class="hljs-string">'zu'</span>;
  }

  console.log(<span class="hljs-type">name</span>); // <span class="hljs-keyword">Do</span> ta gọi biến <span class="hljs-type">name</span> ở ngoài <span class="hljs-keyword">function</span> nên sẽ trả về lỗi ReferenceError: <span class="hljs-type">name</span> <span class="hljs-keyword">is</span> <span class="hljs-keyword">not</span> defined - <span class="hljs-keyword">do</span> k có đặc tính (<span class="hljs-number">2</span>)
}
</code></pre><h3 id="let-dung-nhu-the-nao">let dùng như thế nào?</h3>
<p>Từ khóa <code>let</code> được sử dụng để khai báo một biến trong JS</p>
<p>Biến được khai báo bằng <code>let</code> có một số đặc điểm như sau:</p>
<ul>
<li>(1) Biến đó sẽ có phạm vi block scope.</li>
<li>(2) Biến đó có thể ghi đè giá trị.</li>
<li>(3) Biến đó sẽ được hoisting, nhưng KHÔNG được gán giá trị mặc định là <code>undefined</code> (chỉ được khởi tạo nhưng không được gán giá trị =&gt; lỗi Reference error)</li>
</ul>
<pre><code>{
  console.log(k); // ReferenceError: k <span class="hljs-keyword">is</span> <span class="hljs-keyword">not</span> defined - <span class="hljs-keyword">do</span> k có đặc tính (<span class="hljs-number">1</span>) + (<span class="hljs-number">3</span>)
    {
      const l = <span class="hljs-number">2</span>;
      <span class="hljs-keyword">if</span>(l == <span class="hljs-number">2</span>) {
        let k = <span class="hljs-number">1</span>;
        k = <span class="hljs-number">2</span>; // Có thể ghi đè giá trị của k
        let k = <span class="hljs-number">3</span>; // Uncaught SyntaxError: Identifier <span class="hljs-string">'k'</span> has already been declared
      }
    }

    console.log(k); // ReferenceError: k <span class="hljs-keyword">is</span> <span class="hljs-keyword">not</span> defined - <span class="hljs-keyword">do</span> k có đặc tính (<span class="hljs-number">1</span>) + (<span class="hljs-number">3</span>)
  }

  <span class="hljs-keyword">function</span> sayHello() {
    var <span class="hljs-type">name</span> = <span class="hljs-string">'zu'</span>;
  }

  console.log(<span class="hljs-type">name</span>); // <span class="hljs-keyword">Do</span> ta gọi biến <span class="hljs-type">name</span> ở ngoài <span class="hljs-keyword">function</span> nên sẽ trả về lỗi ReferenceError: <span class="hljs-type">name</span> <span class="hljs-keyword">is</span> <span class="hljs-keyword">not</span> defined - <span class="hljs-keyword">do</span> k có đặc tính (<span class="hljs-number">2</span>)
}
</code></pre><h3 id="const-dung-nhu-the-nao">const dùng như thế nào?</h3>
<p>Từ khóa <code>const</code> được sử dụng để khai báo một biến trong JS</p>
<p>Biến được khai báo bằng <code>const</code> có một số đặc điểm như sau:</p>
<ul>
<li>(1) Biến đó sẽ có phạm vi block scope.</li>
<li>(2) Biến đó KHÔNG thể ghi đè giá trị.</li>
<li>(3) Biến đó sẽ được hoisting, nhưng KHÔNG được gán giá trị mặc định là <code>undefined</code> (chỉ được khởi tạo nhưng không được gán giá trị =&gt; lỗi Reference error)</li>
</ul>
]]></content:encoded></item><item><title><![CDATA[CTN 02. Hoisting và Rest parameters]]></title><description><![CDATA[Hello! I'm Zu.Doan
Series này mình muốn rèn luyện khả năng suy nghĩ và giải bài tập, qua đó để hiểu rõ hơn các khái niệm của Javascript. Mình tham khảo các bài tập từ link này.
Bài 1. Xác định kết quả
(function js(x) {
  const y = (j) => j * x;

  co...]]></description><link>https://blog.chonhanh24h.com/ctn-02-hoisting-va-rest-parameters</link><guid isPermaLink="true">https://blog.chonhanh24h.com/ctn-02-hoisting-va-rest-parameters</guid><category><![CDATA[JavaScript]]></category><category><![CDATA[js]]></category><dc:creator><![CDATA[Zu.Doan]]></dc:creator><pubDate>Mon, 09 Aug 2021 15:10:40 GMT</pubDate><content:encoded><![CDATA[<p>Hello! I'm Zu.Doan</p>
<p>Series này mình muốn rèn luyện khả năng suy nghĩ và giải bài tập, qua đó để hiểu rõ hơn các khái niệm của Javascript. Mình tham khảo các bài tập từ link này.</p>
<h3 id="bai-1-xac-dinh-ket-qua">Bài 1. Xác định kết quả</h3>
<pre><code>(<span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">js</span>(<span class="hljs-params">x</span>) </span>{
  <span class="hljs-keyword">const</span> y = <span class="hljs-function">(<span class="hljs-params">j</span>) =&gt;</span> j * x;

  <span class="hljs-built_in">console</span>.log(y(s()));

  <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">s</span>(<span class="hljs-params"></span>) </span>{
    <span class="hljs-keyword">return</span> j();
  }

  <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">j</span>(<span class="hljs-params"></span>) </span>{
    <span class="hljs-keyword">return</span> x ** x;
  }
})(<span class="hljs-number">3</span>);
</code></pre><h4 id="loi-giai">Lời giải:</h4>
<pre><code>(<span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">js</span>(<span class="hljs-params">x</span>) </span>{
  <span class="hljs-keyword">const</span> y = <span class="hljs-function">(<span class="hljs-params">j</span>) =&gt;</span> j * x; <span class="hljs-comment">// j = x^x =&gt; j * x = x^(x+1)</span>

  <span class="hljs-built_in">console</span>.log(y(s())); <span class="hljs-comment">// In ra kết quả trả về của hàm y(x^x)</span>

  <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">s</span>(<span class="hljs-params"></span>) </span>{
    <span class="hljs-keyword">return</span> j(); <span class="hljs-comment">// Trả về kết quả của hàm j() =&gt; trả về x^x</span>
  }

  <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">j</span>(<span class="hljs-params"></span>) </span>{
    <span class="hljs-keyword">return</span> x ** x; <span class="hljs-comment">// Trả về x^x</span>
  }
})(<span class="hljs-number">3</span>); <span class="hljs-comment">// x = 3 =&gt; kết quả = 3^4 = 81</span>
</code></pre><p>Kiến thức liên quan:</p>
<ul>
<li>Hoisting sẽ ưu tiên theo thứ tự <code>declare function</code> &gt; <code>variable</code> do đó
ta có thể thấy là các fn <code>j(), s()</code> được viết ở phía dưới <code>const y</code> nhưng chương trình vẫn nhận biết được và giá trị trả về của các fn đó.</li>
</ul>
<h3 id="bai-2">Bài 2</h3>
<pre><code><span class="hljs-keyword">const</span> x = <span class="hljs-function"><span class="hljs-keyword">function</span> (<span class="hljs-params">...x</span>) </span>{
  <span class="hljs-keyword">let</span> k = (<span class="hljs-keyword">typeof</span> x).length;
  <span class="hljs-keyword">let</span> y = <span class="hljs-function">() =&gt;</span> <span class="hljs-string">"freetut"</span>.length;
  <span class="hljs-keyword">let</span> z = { <span class="hljs-attr">y</span>: y };

  <span class="hljs-keyword">return</span> k - z.y();
};

<span class="hljs-built_in">console</span>.log(<span class="hljs-built_in">Boolean</span>(x()));
</code></pre><h4 id="loi-giai">Lời giải:</h4>
<pre><code>const x = function (...x) {
  let k = (<span class="hljs-keyword">typeof</span> x).length;
  let y = <span class="hljs-function"><span class="hljs-params">()</span> =&gt;</span> <span class="hljs-string">"freetut"</span>.length;
  let z = { y: y };

  <span class="hljs-keyword">return</span> k - z.y();
};

<span class="hljs-built_in">console</span>.log(<span class="hljs-built_in">Boolean</span>(x()));

<span class="hljs-regexp">//</span> gọi hàm x() 
<span class="hljs-regexp">//</span> function (...x){} =&gt; x = []; <span class="hljs-regexp">//</span> Rest parameters: x là biến bên trong hàm x()
<span class="hljs-regexp">//</span> <span class="hljs-keyword">typeof</span> x = <span class="hljs-string">'object'</span> : lưu ý ở đây là <span class="hljs-built_in">Array</span> là một dạng <span class="hljs-built_in">Object</span> trong JS
<span class="hljs-regexp">//</span> k = (<span class="hljs-keyword">typeof</span> x).length = <span class="hljs-string">'object'</span>.length = <span class="hljs-number">6</span>
// y = <span class="hljs-function"><span class="hljs-params">()</span> =&gt;</span> <span class="hljs-string">"freetut"</span>.length; &lt;=&gt; y = <span class="hljs-function"><span class="hljs-params">()</span> =&gt;</span> <span class="hljs-number">7</span>
// z = {y: y} &lt;=&gt; z = {y: <span class="hljs-function"><span class="hljs-params">()</span> =&gt;</span> <span class="hljs-number">7</span>} =&gt; z.y() = <span class="hljs-number">7</span>
// k - z.y() = <span class="hljs-number">6</span> - <span class="hljs-number">7</span> = <span class="hljs-number">-1</span>
// <span class="hljs-built_in">Boolean</span>(x()) &lt;=&gt; <span class="hljs-built_in">Boolean</span>(<span class="hljs-number">-1</span>) =&gt; <span class="hljs-literal">true</span>
<span class="hljs-regexp">//</span> lưu ý: <span class="hljs-built_in">Boolean</span>(a) = <span class="hljs-literal">false</span> khi a = <span class="hljs-number">0</span>/<span class="hljs-string">''</span>/<span class="hljs-literal">null</span>/<span class="hljs-literal">undefined</span>/<span class="hljs-literal">false</span> &amp; = <span class="hljs-literal">true</span> cho tất cả trường hợp còn lại
</code></pre><p>Kiến thức liên quan:</p>
<ul>
<li>Rest parameters (...x) - là một trong 2 cách sử dụng của <code>three dots</code> trong javascript. (sử dụng trong tham số khai báo của hàm - để tập hợp các phần tử còn lại vào trong một array)</li>
<li>Một cách khác để sử dụng <code>three dots</code> là <code>spread operator</code> (sử dụng trong việc để mở rộng một array/object thành một danh sách)</li>
</ul>
]]></content:encoded></item><item><title><![CDATA[Lỗi khi setup Swagger cho NestJS project]]></title><description><![CDATA[Hello! I'm Zu.Doan
Khi cần setup Swagger cho một NestJs project mình cần phải install dependencies
npm install --save @nestjs/swagger swagger-ui-express
Tuy nhiên mình gặp phải lỗi khi các package phụ thuộc khác lại yêu cầu các version mới hơn.

Do đ...]]></description><link>https://blog.chonhanh24h.com/loi-khi-setup-swagger-cho-nestjs-project</link><guid isPermaLink="true">https://blog.chonhanh24h.com/loi-khi-setup-swagger-cho-nestjs-project</guid><category><![CDATA[nest]]></category><dc:creator><![CDATA[Zu.Doan]]></dc:creator><pubDate>Sun, 08 Aug 2021 15:36:38 GMT</pubDate><content:encoded><![CDATA[<p>Hello! I'm Zu.Doan</p>
<p>Khi cần setup Swagger cho một NestJs project mình cần phải install dependencies</p>
<p><code>npm install --save @nestjs/swagger swagger-ui-express</code></p>
<p>Tuy nhiên mình gặp phải lỗi khi các package phụ thuộc khác lại yêu cầu các version mới hơn.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1628436365098/OTzBWOtnx.png" alt="Screenshot from 2021-08-08 22-25-31.png" /></p>
<p>Do đó mình phải cài module <code>npm-check-updates</code>,  để check và update lại package.json</p>
<p><code>npm install -g npm-check-updates</code></p>
<p>Sử dụng cli <code>ncu -u</code> để thực hiện update đó</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1628436588887/4IVKVgRrw.png" alt="Screenshot from 2021-08-08 22-29-40.png" /></p>
<p>Sau đó ta chạy lệnh </p>
<p><code>npm install</code> cho trường hợp chưa có node_modules folder</p>
<p><code>npm update</code> cho trường hợp đã có node_modules folder</p>
<p>Cuối cùng hãy chạy lại lệnh để install các dependencies cho Swagger</p>
<p><code>npm install --save @nestjs/swagger swagger-ui-express</code></p>
]]></content:encoded></item><item><title><![CDATA[GitLab CI/CD và kiểm định chất lượng code với SonarCloud (P.2)]]></title><description><![CDATA[Hello! I'm Zu.Doan
Sau khi đọc xong phần 1 về Gitlab CI/CD chắc hẳn các bạn đã tạo được một CI/CD job đơn giản để áp dụng cho dự án của mình rồi đúng không.
Tiếp tục sang phần 2 này mình sẽ hướng dẫn các bạn tích hợp SonarCloud để kiểm tra chất lượng...]]></description><link>https://blog.chonhanh24h.com/gitlab-cicd-va-kiem-dinh-chat-luong-code-voi-sonarcloud-p2</link><guid isPermaLink="true">https://blog.chonhanh24h.com/gitlab-cicd-va-kiem-dinh-chat-luong-code-voi-sonarcloud-p2</guid><category><![CDATA[GitLab]]></category><category><![CDATA[ci-cd]]></category><dc:creator><![CDATA[Zu.Doan]]></dc:creator><pubDate>Sat, 07 Aug 2021 02:30:35 GMT</pubDate><content:encoded><![CDATA[<p>Hello! I'm Zu.Doan</p>
<p>Sau khi đọc xong <a target="_blank" href="https://blog.chonhanh24h.com/gitlab-cicd-va-kiem-dinh-chat-luong-code-voi-sonarcloud-p1">phần 1 về Gitlab CI/CD</a> chắc hẳn các bạn đã tạo được một CI/CD job đơn giản để áp dụng cho dự án của mình rồi đúng không.</p>
<p>Tiếp tục sang phần 2 này mình sẽ hướng dẫn các bạn tích hợp SonarCloud để kiểm tra chất lượng code.</p>
<p>Trong file <code>gitlab-ci.yaml</code> chúng ta sẽ chỉnh sửa như sau</p>
<ul>
<li>Ở khu phần <code>stages</code> chúng ta sẽ thêm một step nữa tên là <code>review</code></li>
</ul>
<pre><code>stages:
<span class="hljs-bullet">  -</span> build
<span class="hljs-bullet">  -</span> test
<span class="hljs-bullet">  -</span> review // <span class="xml"><span class="hljs-tag">&lt;<span class="hljs-name">=</span> <span class="hljs-attr">th</span>ê<span class="hljs-attr">m</span> <span class="hljs-attr">m</span>ớ<span class="hljs-attr">i</span> <span class="hljs-attr">d</span>ò<span class="hljs-attr">ng</span> <span class="hljs-attr">n</span>à<span class="hljs-attr">y</span></span></span>
</code></pre><ul>
<li>Tiếp theo tương ứng với step <code>review</code> đó, ta sẽ viết các script tương ứng như sau</li>
</ul>
<pre><code><span class="hljs-attr">review:</span>
  <span class="hljs-attr">stage:</span> <span class="hljs-string">review</span>
  <span class="hljs-attr">variables:</span>
    <span class="hljs-attr">SONAR_USER_HOME:</span> <span class="hljs-string">'${CI_PROJECT_DIR}/.sonar'</span> <span class="hljs-comment"># Defines the location of the analysis task cache</span>
    <span class="hljs-attr">GIT_DEPTH:</span> <span class="hljs-string">'0'</span> <span class="hljs-comment"># Tells git to fetch all the branches of the project, required by the analysis task</span>
  <span class="hljs-attr">image:</span>
    <span class="hljs-attr">name:</span> <span class="hljs-string">sonarsource/sonar-scanner-cli:latest</span>
    <span class="hljs-attr">entrypoint:</span> [<span class="hljs-string">''</span>]
  <span class="hljs-attr">cache:</span>
    <span class="hljs-attr">key:</span> <span class="hljs-string">'${CI_JOB_NAME}'</span>
    <span class="hljs-attr">paths:</span>
    <span class="hljs-bullet">-</span> <span class="hljs-string">.sonar/cache</span>
  <span class="hljs-attr">script:</span>
    <span class="hljs-bullet">-</span> <span class="hljs-string">sonar-scanner</span>
</code></pre><p>Để biết làm sao chúng ta có đoạn code cho <code>review</code> step, các bạn vui lòng tham khảo bài viết  <a target="_blank" href="https://blog.chonhanh24h.com/cach-thiet-lap-sonarcloud-cho-mot-gitlab-repository">Cách thiết lập SonarCloud cho một Gitlab repository.</a> </p>
<p>Kết quả cuối cùng ta sẽ được file gitlab-ci.yaml như sau:</p>
<pre><code><span class="hljs-attribute">image</span>: docker/compose:alpine-1.27.4

<span class="bash">services:
  - docker:dind

stages:
  - build
  - <span class="hljs-built_in">test</span>
  - review

build:
  stage: build
  before_script:
    - docker login -u <span class="hljs-variable">$CI_REGISTRY_USER</span> -p <span class="hljs-variable">$CI_REGISTRY_PASSWORD</span> <span class="hljs-variable">$CI_REGISTRY</span>
  script:
    - docker pull <span class="hljs-variable">$CI_REGISTRY_IMAGE</span>:latest || <span class="hljs-literal">true</span>
    - docker build --cache-from <span class="hljs-variable">$CI_REGISTRY_IMAGE</span>:latest --tag <span class="hljs-variable">$CI_REGISTRY_IMAGE</span>:<span class="hljs-variable">$CI_COMMIT_SHA</span> .
    - docker push <span class="hljs-variable">$CI_REGISTRY_IMAGE</span>:<span class="hljs-variable">$CI_COMMIT_SHA</span>

<span class="hljs-built_in">test</span>:
  stage: <span class="hljs-built_in">test</span>
  before_script:
    - docker login -u <span class="hljs-variable">$CI_REGISTRY_USER</span> -p <span class="hljs-variable">$CI_REGISTRY_PASSWORD</span> <span class="hljs-variable">$CI_REGISTRY</span>
    - docker pull <span class="hljs-variable">$CI_REGISTRY_IMAGE</span>:<span class="hljs-variable">$CI_COMMIT_SHA</span>
    - docker tag <span class="hljs-variable">$CI_REGISTRY_IMAGE</span>:<span class="hljs-variable">$CI_COMMIT_SHA</span> <span class="hljs-variable">$CI_REGISTRY_IMAGE</span>:latest
  script:
    - docker run -d --name api-shops <span class="hljs-variable">$CI_REGISTRY_IMAGE</span>:<span class="hljs-variable">$CI_COMMIT_SHA</span>
    - sleep 15
    - docker <span class="hljs-built_in">exec</span> api-shops sh -c <span class="hljs-string">"npm run test"</span>
  coverage: /All files[^|]*\|[^|]*\s+([\d\.]+)/I

review:
  stage: review
  variables:
    SONAR_USER_HOME: <span class="hljs-string">'${CI_PROJECT_DIR}/.sonar'</span> <span class="hljs-comment"># Defines the location of the analysis task cache</span>
    GIT_DEPTH: <span class="hljs-string">'0'</span> <span class="hljs-comment"># Tells git to fetch all the branches of the project, required by the analysis task</span>
  image:
    name: sonarsource/sonar-scanner-cli:latest
    entrypoint: [<span class="hljs-string">''</span>]
  cache:
    key: <span class="hljs-string">'${CI_JOB_NAME}'</span>
    paths:
    - .sonar/cache
  script:
    - sonar-scanner</span>
</code></pre><p>Sau đó các bạn có thể push commit lên repository để kiểm tra xem pipeline đã chạy chưa nhé.</p>
<p>Trong phần tiếp theo, mình sẽ viết về cách push docker image mới tương ứng với code mới lên registry container thông qua quá trình CI/CD.</p>
<p>Hi vọng bài viết này hữu ích với các bạn.</p>
<p>Thank everyone! Bye2 :D</p>
]]></content:encoded></item><item><title><![CDATA[Cách thiết lập SonarCloud cho một Gitlab repository]]></title><description><![CDATA[Hello! I'm Zu.Doan
Series này mình muốn note lại những nội dung xoay quanh việc thiết lập, sử dụng SonarCloud để kiểm tra chất lượng code trong các dự án.
Important: 

Do mình làm demo và sử dụng SonarClound free để làm ví dụ do đó các Group, reposit...]]></description><link>https://blog.chonhanh24h.com/cach-thiet-lap-sonarcloud-cho-mot-gitlab-repository</link><guid isPermaLink="true">https://blog.chonhanh24h.com/cach-thiet-lap-sonarcloud-cho-mot-gitlab-repository</guid><category><![CDATA[GitLab]]></category><dc:creator><![CDATA[Zu.Doan]]></dc:creator><pubDate>Sat, 07 Aug 2021 02:26:23 GMT</pubDate><content:encoded><![CDATA[<p>Hello! I'm Zu.Doan</p>
<p>Series này mình muốn note lại những nội dung xoay quanh việc thiết lập, sử dụng SonarCloud để kiểm tra chất lượng code trong các dự án.</p>
<p><strong>Important:</strong> </p>
<ul>
<li>Do mình làm demo và sử dụng SonarClound free để làm ví dụ do đó các Group, repository trên Gitlab mình sẽ để là <strong>public</strong></li>
<li>Trong thực tế các bạn nên sử dụng SonarCloud (Analyze private project) và make sure Gitlab group, repository là <strong>private</strong> nhé.</li>
</ul>
<h3 id="1-tao-mot-group-chua-cac-project-trong-du-an-cua-ban-tren-gitlab">1. Tạo một Group chứa các project trong dự án của bạn trên Gitlab</h3>
<p>Chúng ta làm theo các bước sau:</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1628305027540/dzf0QQG9i.jpeg" alt="gl1.jpg" /></p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1628305049394/b2PNITPrR.png" alt="gl2.png" /></p>
<p>Sau đó các bạn tạo Project nằm trong Group vừa tạo ở trên, và nhớ là chúng ta vẫn để Project là <strong>public</strong> nhé.</p>
<h3 id="2-tao-personal-access-token-de-thiet-lap-cho-sonarcloud-co-quyen-truy-cap-vao-gitlab-cua-chung-ta">2. Tạo Personal access token để thiết lập cho SonarCloud có quyền truy cập vào Gitlab của chúng ta</h3>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1628305060539/2W2oa_AQl.jpeg" alt="gl3.jpg" /></p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1628305099503/0hE9hPlDZ.jpeg" alt="gl4.jpg" /></p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1628305106323/vNYTPONduQ.png" alt="gl5.png" /></p>
<h3 id="3-tao-mot-to-chuc-organization-trong-sonarcloud-de-lien-ket-toi-gitlab">3. Tạo một tổ chức (organization) trong SonarCloud để liên kết tới Gitlab</h3>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1628305113290/jQJySN4Ny.png" alt="gl6.png" /></p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1628305120568/W_ZprfqQS.png" alt="gl7.png" /></p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1628305130054/g9uMa9q3c.png" alt="gl8.png" /></p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1628305137766/_gegURCxY.png" alt="gl9.png" /></p>
<h3 id="4-thiet-lap-lien-ket-giua-sonarcloud-va-gitlab-repository">4. Thiết lập liên kết giữa SonarCloud và Gitlab repository</h3>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1628305144050/T6OfBLFoC.png" alt="gl10.png" /></p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1628305149821/9Vyu-J6ia.png" alt="gl11.png" /></p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1628305156788/U4WJDPG6M.png" alt="gl12.png" /></p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1628305163807/ZKRD_ihsw.png" alt="gl13.png" /></p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1628305169203/zD--S61Ow.png" alt="gl14.png" /></p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1628305176942/O8hDn91Ic.png" alt="gl15.png" /></p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1628305195205/DegqjAlWb.png" alt="gl16.png" /></p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1628305187626/fhHQcfjxh.png" alt="gl17.png" /></p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1628305201630/497lfAWRm.png" alt="gl18.png" /></p>
<p>Có 2 việc chính trong phần này:</p>
<ul>
<li>Tạo file <code>sonar-project.properties</code> nằm trong root project</li>
<li>Đưa được nội dung sau vào file <code>.gitlab-ci.yaml</code> nằm trong root project</li>
</ul>
<pre><code><span class="hljs-attr">variables:</span>
  <span class="hljs-attr">SONAR_USER_HOME:</span> <span class="hljs-string">"${CI_PROJECT_DIR}/.sonar"</span>  <span class="hljs-comment"># Defines the location of the analysis task cache</span>
  <span class="hljs-attr">GIT_DEPTH:</span> <span class="hljs-string">"0"</span>  <span class="hljs-comment"># Tells git to fetch all the branches of the project, required by the analysis task</span>
<span class="hljs-attr">sonarcloud-check:</span>
  <span class="hljs-attr">image:</span>
    <span class="hljs-attr">name:</span> <span class="hljs-string">sonarsource/sonar-scanner-cli:latest</span>
    <span class="hljs-attr">entrypoint:</span> [<span class="hljs-string">""</span>]
  <span class="hljs-attr">cache:</span>
    <span class="hljs-attr">key:</span> <span class="hljs-string">"${CI_JOB_NAME}"</span>
    <span class="hljs-attr">paths:</span>
      <span class="hljs-bullet">-</span> <span class="hljs-string">.sonar/cache</span>
  <span class="hljs-attr">script:</span>
    <span class="hljs-bullet">-</span> <span class="hljs-string">sonar-scanner</span>
  <span class="hljs-attr">only:</span>
    <span class="hljs-bullet">-</span> <span class="hljs-string">merge_requests</span>
    <span class="hljs-bullet">-</span> <span class="hljs-string">master</span>
    <span class="hljs-bullet">-</span> <span class="hljs-string">develop</span>
</code></pre><p>Để biết làm sao cho đoạn code trên hoạt động, các bạn hãy tham khảo series về cách tích hợp SonarCloud vào quá trình CI/CD của Gitlab nhé:</p>
<ul>
<li><a target="_blank" href="https://blog.chonhanh24h.com/gitlab-cicd-va-kiem-dinh-chat-luong-code-voi-sonarcloud-p1">GitLab CI/CD và kiểm định chất lượng code với SonarCloud (P.1)</a> </li>
<li><a target="_blank" href="https://blog.chonhanh24h.com/gitlab-cicd-va-kiem-dinh-chat-luong-code-voi-sonarcloud-p2">GitLab CI/CD và kiểm định chất lượng code với SonarCloud (P.2)</a> </li>
</ul>
<p>Hi vọng bài viết này hữu ích với các bạn.</p>
<p>Thank everyone! Bye2 :D</p>
]]></content:encoded></item></channel></rss>