<?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" xmlns:media="http://search.yahoo.com/mrss/"><channel><title><![CDATA[Thanh Nguyen]]></title><description><![CDATA[It is better to travel well than to arrive]]></description><link>https://nguyendinhthanh.net/</link><image><url>https://nguyendinhthanh.net/favicon.png</url><title>Thanh Nguyen</title><link>https://nguyendinhthanh.net/</link></image><generator>Ghost 5.22</generator><lastBuildDate>Wed, 29 Nov 2023 03:20:37 GMT</lastBuildDate><atom:link href="https://nguyendinhthanh.net/rss/" rel="self" type="application/rss+xml"/><ttl>60</ttl><item><title><![CDATA[Lập trình Node.js - Tạo Web Server với Express]]></title><description><![CDATA[<p>Trong b&#xE0;i n&#xE0;y ch&#xFA;ng ta s&#x1EED; d&#x1EE5;ng:</p><!--kg-card-begin: markdown--><ul>
<li>Express: web application framework cho Node.js h&#x1ED7; tr&#x1EE3; ng&#x1B0;&#x1EDD;i d&#xF9;ng c&#xF3; th&#x1EC3; t&#x1EA1;o m&#x1ED9;t WEB server ho&#x1EB7;c API</li></ul>]]></description><link>https://nguyendinhthanh.net/lap-trinh-expressjs/</link><guid isPermaLink="false">655eabcd670a6804bbbd7f0e</guid><dc:creator><![CDATA[Nguyen Dinh Thanh]]></dc:creator><pubDate>Thu, 23 Nov 2023 03:02:12 GMT</pubDate><content:encoded><![CDATA[<p>Trong b&#xE0;i n&#xE0;y ch&#xFA;ng ta s&#x1EED; d&#x1EE5;ng:</p><!--kg-card-begin: markdown--><ul>
<li>Express: web application framework cho Node.js h&#x1ED7; tr&#x1EE3; ng&#x1B0;&#x1EDD;i d&#xF9;ng c&#xF3; th&#x1EC3; t&#x1EA1;o m&#x1ED9;t WEB server ho&#x1EB7;c API server m&#x1ED9;t c&#xE1;ch d&#x1EC5; d&#xE0;ng, nhanh ch&#xF3;ng.</li>
<li>Node v21.1.0</li>
<li>Npm v10.2.0</li>
</ul>
<!--kg-card-end: markdown--><p><u>Ph&#x1EA7;n 1:</u> Chu&#x1EA9;n b&#x1ECB;</p><p>&#x110;&#x1EA7;u ti&#xEA;n, m&#x1EDF; terminal v&#xE0; t&#x1EA1;o m&#x1ED9;t th&#x1B0; m&#x1EE5;c d&#x1EF1; &#xE1;n m&#x1EDB;i:</p><pre><code class="language-bash">mkdir express-server</code></pre><p>Sau &#x111;&#xF3;, &#x111;i&#x1EC1;u h&#x1B0;&#x1EDB;ng &#x111;&#x1EBF;n th&#x1B0; m&#x1EE5;c v&#x1EEB;a t&#x1EA1;o:</p><pre><code class="language-bash">cd express-server</code></pre><p>Kh&#x1EDF;i t&#x1EA1;o m&#x1ED9;t d&#x1EF1; &#xE1;n npm m&#x1EDB;i:</p><pre><code class="language-bash">npm init -y</code></pre><p>Ti&#x1EBF;p theo, c&#xE0;i &#x111;&#x1EB7;t g&#xF3;i express:</p><pre><code class="language-bash">npm install express --save</code></pre><p>T&#x1EA1;i th&#x1EDD;i &#x111;i&#x1EC3;m n&#xE0;y, m&#x1ED9;t d&#x1EF1; &#xE1;n m&#x1EDB;i s&#x1EB5;n s&#xE0;ng s&#x1EED; d&#x1EE5;ng Express.</p><p><u>Ph&#x1EA7;n 2: </u>T&#x1EA1;o Web server</p><p>B&#xE2;y gi&#x1EDD; Express &#x111;&#xE3; &#x111;&#x1B0;&#x1EE3;c c&#xE0;i &#x111;&#x1EB7;t, h&#xE3;y t&#x1EA1;o file index.js m&#x1EDB;i v&#xE0; m&#x1EDF; file. Sau &#x111;&#xF3;, th&#xEA;m c&#xE1;c d&#xF2;ng m&#xE3; sau:</p><pre><code class="language-javascript">const express = require(&apos;express&apos;);
const app = express();</code></pre><p>D&#xF2;ng &#x111;&#x1EA7;u ti&#xEA;n &#x1EDF; &#x111;&#xE2;y l&#xE0; l&#x1EA5;y module Express ch&#xED;nh t&#x1EEB; g&#xF3;i Express &#x111;&#xE3; c&#xE0;i &#x111;&#x1EB7;t tr&#x1B0;&#x1EDB;c &#x111;&#xF3;. Module n&#xE0;y l&#xE0; m&#x1ED9;t h&#xE0;m; d&#xF2;ng th&#x1EE9; hai &#x111;&#x1EC3; t&#x1EA1;o bi&#x1EBF;n &#x1EE9;ng d&#x1EE5;ng. C&#xF3; th&#x1EC3; t&#x1EA1;o nhi&#x1EC1;u &#x1EE9;ng d&#x1EE5;ng theo c&#xE1;ch n&#xE0;y, m&#x1ED7;i &#x1EE9;ng d&#x1EE5;ng c&#xF3; y&#xEA;u c&#x1EA7;u v&#xE0; ph&#x1EA3;n h&#x1ED3;i ri&#xEA;ng.</p><pre><code class="language-javascript">const express = require(&apos;express&apos;);
const app = express();
app.get(&apos;/&apos;, (req, res) =&gt; {res.send(&apos;Successful response.&apos;);});</code></pre><p>Nh&#x1EEF;ng d&#xF2;ng m&#xE3; n&#xE0;y l&#xE0; n&#x1A1;i th&#xF4;ng b&#xE1;o cho m&#xE1;y ch&#x1EE7; Express c&#xE1;ch x&#x1EED; l&#xFD; y&#xEA;u c&#x1EA7;u GET t&#x1EDB;i m&#xE1;y ch&#x1EE7;. Express bao g&#x1ED3;m c&#xE1;c ch&#x1EE9;c n&#x103;ng t&#x1B0;&#x1A1;ng t&#x1EF1; cho POST, PUT, v.v. b&#x1EB1;ng c&#xE1;ch s&#x1EED; d&#x1EE5;ng app.post(...), app.put(...), v.v. </p><p>C&#xE1;c h&#xE0;m n&#xE0;y c&#xF3; hai tham s&#x1ED1; ch&#xED;nh. &#x110;&#x1EA7;u ti&#xEA;n l&#xE0; URL; trong tr&#x1B0;&#x1EDD;ng h&#x1EE3;p n&#xE0;y l&#xE0; &apos;/&apos;, l&#xE0; th&#x1B0; m&#x1EE5;c g&#x1ED1;c c&#x1EE7;a trang web trong tr&#x1B0;&#x1EDD;ng h&#x1EE3;p n&#xE0;y l&#xE0; localhost:3000. Tham s&#x1ED1; th&#x1EE9; hai l&#xE0; m&#x1ED9;t h&#xE0;m c&#xF3; hai &#x111;&#x1ED1;i s&#x1ED1;: req v&#xE0; res.</p><p>req &#x111;&#x1EA1;i di&#x1EC7;n cho y&#xEA;u c&#x1EA7;u &#x111;&#x1B0;&#x1EE3;c g&#x1EED;i &#x111;&#x1EBF;n m&#xE1;y ch&#x1EE7;; c&#xF3; th&#x1EC3; s&#x1EED; d&#x1EE5;ng &#x111;&#x1ED1;i t&#x1B0;&#x1EE3;ng n&#xE0;y &#x111;&#x1EC3; &#x111;&#x1ECD;c d&#x1EEF; li&#x1EC7;u v&#x1EC1; nh&#x1EEF;ng g&#xEC; kh&#xE1;ch h&#xE0;ng y&#xEA;u c&#x1EA7;u th&#x1EF1;c hi&#x1EC7;n. </p><p>res &#x111;&#x1EA1;i di&#x1EC7;n cho ph&#x1EA3;n h&#x1ED3;i m&#xE0; s&#x1EBD; g&#x1EED;i l&#x1EA1;i cho kh&#xE1;ch h&#xE0;ng. &#x1EDE; &#x111;&#xE2;y &#x111;ang g&#x1ECD;i m&#x1ED9;t h&#xE0;m tr&#xEA;n res &#x111;&#x1EC3; g&#x1EED;i l&#x1EA1;i ph&#x1EA3;n h&#x1ED3;i: &apos;Successful response.&apos;.</p><pre><code class="language-javascript">const express = require(&apos;express&apos;);
const app = express();
app.get(&apos;/&apos;, (req, res) =&gt; {res.send(&apos;Successful response.&apos;);});
app.listen(3000, () =&gt; console.log(&apos;Example app is listening on port 3000.&apos;));
</code></pre><p>Cu&#x1ED1;i c&#xF9;ng, sau khi thi&#x1EBF;t l&#x1EAD;p xong c&#xE1;c y&#xEA;u c&#x1EA7;u, ng&#x1B0;&#x1EDD;i d&#xF9;ng ph&#x1EA3;i kh&#x1EDF;i &#x111;&#x1ED9;ng m&#xE1;y ch&#x1EE7; c&#x1EE7;a m&#xEC;nh! m&#xE1;y ch&#x1EE7; &#x111;ang l&#x1EAF;ng nghe &#x1EDF; c&#x1ED5;ng 3000. </p><p>H&#xE0;m &#x111;&#x1B0;&#x1EE3;c truy&#x1EC1;n v&#xE0;o d&#x1B0;&#x1EDB;i d&#x1EA1;ng tham s&#x1ED1; th&#x1EE9; hai l&#xE0; t&#xF9;y ch&#x1ECD;n v&#xE0; ch&#x1EA1;y khi m&#xE1;y ch&#x1EE7; kh&#x1EDF;i &#x111;&#x1ED9;ng. &#x110;i&#x1EC1;u n&#xE0;y cung c&#x1EA5;p cho ng&#x1B0;&#x1EDD;i d&#xF9;ng m&#x1ED9;t s&#x1ED1; ph&#x1EA3;n h&#x1ED3;i trong b&#x1EA3;ng &#x111;i&#x1EC1;u khi&#x1EC3;n &#x111;&#x1EC3; bi&#x1EBF;t r&#x1EB1;ng &#x1EE9;ng d&#x1EE5;ng c&#x1EE7;a ch&#xFA;ng t&#xF4;i &#x111;ang ch&#x1EA1;y. </p><p>M&#x1EDF; terminal v&#xE0; ch&#x1EA1;y &#x1EE9;ng d&#x1EE5;ng theo c&#xE2;u l&#x1EC7;nh sau:</p><pre><code class="language-bash">node index.js
</code></pre><p>Sau &#x111;&#xF3;, m&#x1EDF; Web browser v&#xE0; truy c&#x1EAD;p localhost:3000. </p><p>C&#x1EED;a s&#x1ED5; tr&#xEC;nh duy&#x1EC7;t c&#x1EE7;a b&#x1EA1;n s&#x1EBD; hi&#x1EC3;n th&#x1ECB;: &#x201C;Successful response.&#x201D;. </p><p>C&#x1EED;a s&#x1ED5; terminal s&#x1EBD; hi&#x1EC3;n th&#x1ECB;: &apos;Example app is listening on port 3000.&apos;. V&#xE0; ch&#xFA;ng ta &#x111;&#xE3; c&#xF3; n&#xF3;, m&#x1ED9;t m&#xE1;y ch&#x1EE7; web!</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://nguyendinhthanh.net/content/images/2023/11/Screenshot-2023-11-23-at-09.50.21.png" class="kg-image" alt loading="lazy" width="1870" height="1174" srcset="https://nguyendinhthanh.net/content/images/size/w600/2023/11/Screenshot-2023-11-23-at-09.50.21.png 600w, https://nguyendinhthanh.net/content/images/size/w1000/2023/11/Screenshot-2023-11-23-at-09.50.21.png 1000w, https://nguyendinhthanh.net/content/images/size/w1600/2023/11/Screenshot-2023-11-23-at-09.50.21.png 1600w, https://nguyendinhthanh.net/content/images/2023/11/Screenshot-2023-11-23-at-09.50.21.png 1870w" sizes="(min-width: 720px) 720px"><figcaption>Th&#xF4;ng b&#xE1;o c&#x1EE7;a Web server</figcaption></figure><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://nguyendinhthanh.net/content/images/2023/11/Screenshot-2023-11-23-at-09.50.38.png" class="kg-image" alt loading="lazy" width="1052" height="294" srcset="https://nguyendinhthanh.net/content/images/size/w600/2023/11/Screenshot-2023-11-23-at-09.50.38.png 600w, https://nguyendinhthanh.net/content/images/size/w1000/2023/11/Screenshot-2023-11-23-at-09.50.38.png 1000w, https://nguyendinhthanh.net/content/images/2023/11/Screenshot-2023-11-23-at-09.50.38.png 1052w" sizes="(min-width: 720px) 720px"><figcaption>C&#x1EED;a s&#x1ED5; tr&#xEC;nh duy&#x1EC7;t ng&#x1B0;&#x1EDD;i d&#xF9;ng</figcaption></figure><p>Enjoy it!</p><p></p>]]></content:encoded></item><item><title><![CDATA[Oracle Cheat Sheet]]></title><description><![CDATA[<!--kg-card-begin: markdown--><h2 id="phi%C3%AAn-b%E1%BA%A3n">Phi&#xEA;n b&#x1EA3;n</h2>
<pre><code>SELECT banner FROM v$version WHERE banner LIKE &apos;Oracle%&apos;;
SELECT banner FROM v$version WHERE banner LIKE &apos;TNS%&apos;;
SELECT version FROM v$instance;
</code></pre>
<h2 id="ch%C3%BA-th%C3%ADch">Ch&#xFA; th&#xED;ch</h2>
<pre><code>SELECT 1 FROM dual --comment in line;
SELECT 1
/*
comment in block</code></pre>]]></description><link>https://nguyendinhthanh.net/oracle-cheat-code/</link><guid isPermaLink="false">6539ca25670a6804bbbd7e6e</guid><category><![CDATA[Oracle]]></category><category><![CDATA[Oracle Database]]></category><category><![CDATA[Oracle Cheat sheet]]></category><category><![CDATA[DBMS]]></category><dc:creator><![CDATA[Nguyen Dinh Thanh]]></dc:creator><pubDate>Wed, 25 Oct 2023 02:37:00 GMT</pubDate><content:encoded><![CDATA[<!--kg-card-begin: markdown--><h2 id="phi%C3%AAn-b%E1%BA%A3n">Phi&#xEA;n b&#x1EA3;n</h2>
<pre><code>SELECT banner FROM v$version WHERE banner LIKE &apos;Oracle%&apos;;
SELECT banner FROM v$version WHERE banner LIKE &apos;TNS%&apos;;
SELECT version FROM v$instance;
</code></pre>
<h2 id="ch%C3%BA-th%C3%ADch">Ch&#xFA; th&#xED;ch</h2>
<pre><code>SELECT 1 FROM dual --comment in line;
SELECT 1
/*
comment in block
line 1
line 2...
*/
FROM dual;
</code></pre>
<h2 id="ng%C6%B0%E1%BB%9Di-d%C3%B9ng-hi%E1%BB%87n-t%E1%BA%A1i">Ng&#x1B0;&#x1EDD;i d&#xF9;ng hi&#x1EC7;n t&#x1EA1;i</h2>
<pre><code>SELECT user FROM dual;
SHOW user;
</code></pre>
<h2 id="danh-s%C3%A1ch-ng%C6%B0%E1%BB%9Di-d%C3%B9ng">Danh s&#xE1;ch ng&#x1B0;&#x1EDD;i d&#xF9;ng</h2>
<pre><code>SELECT username FROM all_users ORDER BY username;
SELECT name FROM sys.user$;
</code></pre>
<h2 id="danh-s%C3%A1ch-m%E1%BA%ADt-kh%E1%BA%A9u-%C4%91%C3%A3-b%C4%83m">Danh s&#xE1;ch m&#x1EAD;t kh&#x1EA9;u &#x111;&#xE3; b&#x103;m</h2>
<pre><code>SELECT name, password, astatus FROM sys.user$;
SELECT name,spare4 FROM sys.user$;
</code></pre>
<h2 id="danh-s%C3%A1ch-quy%E1%BB%81n">Danh s&#xE1;ch quy&#x1EC1;n</h2>
<pre><code>SELECT * FROM session_privs; &#x2014; current privs
SELECT * FROM dba_sys_privs WHERE grantee = &apos;DBSNMP&apos;; &#x2014; priv, list a user&apos;s privs
SELECT grantee FROM dba_sys_privs WHERE privilege = &apos;SELECT ANY DICTIONARY&apos;; &#x2014; priv, find users with a particular priv
SELECT GRANTEE, GRANTED_ROLE FROM DBA_ROLE_PRIVS;
</code></pre>
<h2 id="danh-s%C3%A1ch-t%C3%A0i-kho%E1%BA%A3n-dba">Danh s&#xE1;ch t&#xE0;i kho&#x1EA3;n DBA</h2>
<pre><code>SELECT DISTINCT grantee FROM dba_sys_privs WHERE ADMIN_OPTION = &apos;YES&apos;; &#x2014; priv, list DBAs, DBA roles
</code></pre>
<h2 id="csdl-hi%E1%BB%87n-t%E1%BA%A1i">CSDL hi&#x1EC7;n t&#x1EA1;i</h2>
<pre><code>SELECT global_name FROM global_name;
SELECT name FROM v$database;
SELECT instance_name FROM v$instance;
SELECT SYS.DATABASE_NAME FROM DUAL;
</code></pre>
<h2 id="danh-s%C3%A1ch-csdl">Danh s&#xE1;ch CSDL</h2>
<pre><code>SELECT DISTINCT owner FROM all_tables; &#x2014; list schemas (one per user)
&#x2013; Also query TNS listener for other databases.  See tnscmd (services | status).
</code></pre>
<h2 id="danh-s%C3%A1ch-c%E1%BB%99t-thu%E1%BB%99c-t%C3%ADnh">Danh s&#xE1;ch c&#x1ED9;t thu&#x1ED9;c t&#xED;nh</h2>
<pre><code>SELECT column_name FROM all_tab_columns WHERE table_name = &apos;blah&apos;;
SELECT column_name FROM all_tab_columns WHERE table_name = &apos;blah&apos; and owner = &apos;foo&apos;;
</code></pre>
<h2 id="danh-s%C3%A1ch-b%E1%BA%A3ng">Danh s&#xE1;ch b&#x1EA3;ng</h2>
<pre><code>SELECT table_name FROM all_tables;
SELECT owner, table_name FROM all_tables;
</code></pre>
<h2 id="t%C3%ACm-t%E1%BA%A5t-c%E1%BA%A3-c%C3%A1c-b%E1%BA%A3ng-theo-t%C3%AAn-thu%E1%BB%99c-t%C3%ADnh">T&#xEC;m t&#x1EA5;t c&#x1EA3; c&#xE1;c b&#x1EA3;ng theo t&#xEA;n thu&#x1ED9;c t&#xED;nh</h2>
<pre><code>SELECT owner, table_name FROM all_tab_columns WHERE column_name LIKE &apos;%PASS%&apos;; &#x2014; NB: table names are upper case
</code></pre>
<h2 id="l%E1%BA%A5y-d%C3%B2ng-th%E1%BB%A9-n">L&#x1EA5;y d&#xF2;ng th&#x1EE9; N</h2>
<pre><code>SELECT username FROM (SELECT ROWNUM r, username FROM all_users ORDER BY username) WHERE r=9; &#x2014; l&#x1EA5;y d&#xF2;ng th&#x1EE9; 9 (c&#xE1;c d&#xF2;ng &#x111;&#x1B0;&#x1EE3;c &#x111;&#xE1;nh th&#x1EE9; t&#x1EF1; t&#x1EEB; 1)
</code></pre>
<h2 id="l%E1%BA%A5y-k%C3%BD-t%E1%BB%B1-th%E1%BB%A9-n">L&#x1EA5;y k&#xFD; t&#x1EF1; th&#x1EE9; N</h2>
<pre><code>SELECT substr(&apos;abcd&apos;, 3, 1) FROM dual; &#x2014; l&#x1EA5;y k&#xED; t&#x1EF1; th&#x1EE9; 3, &apos;c&apos;
</code></pre>
<h2 id="chuy%E1%BB%83n-s%E1%BB%91-th%C3%A0nh-k%C3%AD-t%E1%BB%B1">Chuy&#x1EC3;n s&#x1ED1; th&#xE0;nh k&#xED; t&#x1EF1;</h2>
<pre><code>SELECT chr(65) FROM dual; &#x2014; returns A
</code></pre>
<h2 id="chuy%E1%BB%83n-k%C3%AD-t%E1%BB%B1-th%C3%A0nh-s%E1%BB%91">Chuy&#x1EC3;n k&#xED; t&#x1EF1; th&#xE0;nh s&#x1ED1;</h2>
<pre><code>SELECT ascii(&apos;A&apos;) FROM dual; &#x2014; returns 65
</code></pre>
<h2 id="%C3%A9p-ki%E1%BB%83u">&#xC9;p ki&#x1EC3;u</h2>
<pre><code>SELECT CAST(1 AS char) FROM dual;
SELECT CAST(&apos;1&apos; AS int) FROM dual;
</code></pre>
<h2 id="n%E1%BB%91i-chu%E1%BB%97i">N&#x1ED1;i chu&#x1ED7;i</h2>
<pre><code>SELECT &apos;A&apos; || &apos;B&apos; FROM dual; &#x2014; returns AB
</code></pre>
<h2 id="l%E1%BB%87nh-if">L&#x1EC7;nh If</h2>
<pre><code>BEGIN IF 1=1 THEN dbms_lock.sleep(3); ELSE dbms_lock.sleep(0); END IF; END; &#x2014; doesn&apos;t play well with SELECT statements
</code></pre>
<h2 id="l%E1%BB%87nh-case">L&#x1EC7;nh case</h2>
<pre><code>SELECT CASE WHEN 1=1 THEN 1 ELSE 2 END FROM dual; &#x2014; returns 1
SELECT CASE WHEN 1=2 THEN 1 ELSE 2 END FROM dual; &#x2014; returns 2
</code></pre>
<h2 id="%C4%91%C6%B0%E1%BB%9Dng-d%E1%BA%ABn-ch%E1%BB%A9a-c%C3%A1c-t%E1%BA%ADp-tin-csdl">&#x110;&#x1B0;&#x1EDD;ng d&#x1EAB;n ch&#x1EE9;a c&#xE1;c t&#x1EAD;p tin CSDL</h2>
<pre><code>SELECT name FROM V$DATAFILE;
</code></pre>
<h2 id="t%C3%AAn-c%E1%BB%A7a-container-hi%E1%BB%87n-t%E1%BA%A1i">T&#xEA;n c&#x1EE7;a container hi&#x1EC7;n t&#x1EA1;i</h2>
<pre><code>SHOW con_name;
</code></pre>
<h2 id="danh-s%C3%A1ch-c%C3%A1c-pluggable-db">Danh s&#xE1;ch c&#xE1;c pluggable DB</h2>
<pre><code>show pdbs;
</code></pre>
<h2 id="t%C3%AAn-c%E1%BB%A7a-instance-sid-hi%E1%BB%87n-t%E1%BA%A1i">T&#xEA;n c&#x1EE7;a instance-SID hi&#x1EC7;n t&#x1EA1;i</h2>
<pre><code>select instance_name from v$instance;
</code></pre>
<!--kg-card-end: markdown--><p></p>]]></content:encoded></item><item><title><![CDATA[Lập trình Node.js - kết nối, truy xuất cơ sở dữ liệu]]></title><description><![CDATA[<p>Trong ph&#x1EA7;n n&#xE0;y ch&#xFA;ng ta s&#x1EBD; s&#x1EED; d&#x1EE5;ng:</p><!--kg-card-begin: markdown--><ul>
<li>OS: Linux &#x2013; Ubuntu</li>
<li>DBMS: PostgreSQL</li>
<li>Programming Language: Node.js</li>
<li>Code Editor: Visual Studio Code (VS Code)</li>
</ul>
<!--kg-card-end: markdown--><p>Ch&#xFA;ng ta s&#x1EBD; s&#x1EED; d&#x1EE5;ng <em>&apos;node-postgres</em>&apos; nh&</p>]]></description><link>https://nguyendinhthanh.net/ket-noi-he-co-so-du-lieu/</link><guid isPermaLink="false">63f9bf8beaf401466ecd6e48</guid><dc:creator><![CDATA[Nguyen Dinh Thanh]]></dc:creator><pubDate>Mon, 20 Feb 2023 08:23:00 GMT</pubDate><content:encoded><![CDATA[<p>Trong ph&#x1EA7;n n&#xE0;y ch&#xFA;ng ta s&#x1EBD; s&#x1EED; d&#x1EE5;ng:</p><!--kg-card-begin: markdown--><ul>
<li>OS: Linux &#x2013; Ubuntu</li>
<li>DBMS: PostgreSQL</li>
<li>Programming Language: Node.js</li>
<li>Code Editor: Visual Studio Code (VS Code)</li>
</ul>
<!--kg-card-end: markdown--><p>Ch&#xFA;ng ta s&#x1EBD; s&#x1EED; d&#x1EE5;ng <em>&apos;node-postgres</em>&apos; nh&#x1B0; l&#xE0; m&#x1ED9;t l&#x1EDB;p giao ti&#x1EBF;p v&#x1EDB;i c&#x1A1; s&#x1EDF; d&#x1EEF; li&#x1EC7;u PostgreSQL. Th&#xF4;ng qua <em>node-postgres</em> ch&#xFA;ng ta c&#xF3; th&#x1EC3; vi&#x1EBF;t ch&#x1B0;&#x1A1;ng tr&#xEC;nh trong NodeJs &#x111;&#x1EC3; truy xu&#x1EA5;t v&#xE0; l&#x1B0;u tr&#x1EEF; d&#x1EEF; li&#x1EC7;u th&#xF4;ng qua PostgreSQL.</p><p>&#x110;&#x1EA7;u ti&#xEA;n, ch&#xFA;ng ta t&#x1EA1;o m&#x1ED9;t &#x1EE9;ng d&#x1EE5;ng Node.js &#x111;&#x1A1;n gi&#x1EA3;n nh&#x1B0;: <em>&#x201C;NODE-POSTGRES&#x201D;</em> </p><p>T&#x1EA1;o m&#x1ED9;t th&#x1B0; m&#x1EE5;c <em>NODE-POSTGRES</em>, di chuy&#x1EC3;n v&#xE0;o th&#x1B0; m&#x1EE5;c <em>NODE-POSTGRES</em> v&#xE0; m&#x1EDF; VS Code &#x111;&#x1EC3; ti&#x1EBF;n h&#xE0;nh l&#x1EAD;p tr&#xEC;nh &#x1EE9;ng d&#x1EE5;ng.</p><!--kg-card-begin: markdown--><blockquote>
<p>mkdir NODE-POSTGRES<br>
cd NODE-POSTGRES<br>
code .</p>
</blockquote>
<!--kg-card-end: markdown--><p>T&#x1EEB; thanh c&#xF4;ng c&#x1EE5; File Explorer, nh&#x1EA5;n n&#xFA;t New File... &#x111;&#x1EC3; t&#x1EA1;o t&#x1EAD;p tin &#x201C;index.js&#x201D;.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://nguyendinhthanh.net/content/images/2023/02/image-5.png" class="kg-image" alt loading="lazy" width="894" height="393" srcset="https://nguyendinhthanh.net/content/images/size/w600/2023/02/image-5.png 600w, https://nguyendinhthanh.net/content/images/2023/02/image-5.png 894w" sizes="(min-width: 720px) 720px"><figcaption>C&#x1EA5;u tr&#xFA;c th&#x1B0; m&#x1EE5;c l&#x1EDB;p &#x1EE9;ng d&#x1EE5;ng</figcaption></figure><p>Trong file index.js, ch&#xFA;ng ta tr&#xED;ch xu&#x1EA5;t l&#x1EDB;p Pool t&#x1EEB; node-postgres</p><p>const { Pool } = require(&apos;pg&apos;)</p><p>K&#x1EBF; ti&#x1EBF;p t&#x1EA1;o th&#x1EF1;c th&#x1EC3; &#x201C;Pool&#x201D; &#x111;&#x1EC3; t&#x1EA1;o k&#x1EBF;t n&#x1ED1;i t&#x1EDB;i c&#x1A1; s&#x1EDF; d&#x1EEF; li&#x1EC7;u</p><!--kg-card-begin: markdown--><blockquote>
<p>const pool = new Pool({<br>
user: USER_NAME,<br>
database: DATABASE_NAME,<br>
password: PASSWORD,<br>
port: PORT,<br>
host: HOST_NAME,<br>
})</p>
</blockquote>
<!--kg-card-end: markdown--><!--kg-card-begin: markdown--><ul>
<li><strong>USER_NAME</strong>: t&#xEA;n ng&#x1B0;&#x1EDD;i d&#xF9;ng &#x111;&#x1B0;&#x1EE3;c t&#x1EA1;o trong Postgres</li>
<li><strong>DATABASE_NAME</strong>: t&#xEA;n c&#x1A1; s&#x1EDF; d&#x1EEF; li&#x1EC7;u &#x111;&#x1B0;&#x1EE3;c t&#x1EA1;o trong Postgres</li>
<li><strong>PASSWORD</strong>: m&#x1EAD;t kh&#x1EA9;u c&#x1EE7;a ng&#x1B0;&#x1EDD;i d&#xF9;ng trong Postgres</li>
<li><strong>PORT</strong>: c&#x1ED5;ng Postgres server &#x111;ang l&#x1EAF;ng nghe. C&#x1ED5;ng m&#x1EB7;c &#x111;&#x1ECB;nh th&#x1B0;&#x1EDD;ng l&#xE0; 5432</li>
<li><strong>HOST_NAME</strong>: t&#xEA;n m&#xE1;y ch&#x1EE7; ho&#x1EB7;c &#x111;&#x1ECB;a ch&#x1EC9; IP c&#x1EE7;a Postgres server</li>
</ul>
<!--kg-card-end: markdown--><p>&#x110;&#x1EC3; minh h&#x1ECD;a vi&#x1EC7;c k&#x1EBF;t n&#x1ED1;i t&#x1EDB;i c&#x1A1; s&#x1EDF; d&#x1EEF; li&#x1EC7;u, &#x111;&#x1EA7;u ti&#xEA;n ch&#xFA;ng ta s&#x1EBD; t&#x1EA1;o c&#x1A1; s&#x1EDF; d&#x1EEF; li&#x1EC7;u m&#x1EAB;u &#x201C;congty&#x201D;</p><p>&#x110;&#x1EA7;u ti&#xEA;n &#x111;&#x103;ng nh&#x1EAD;p v&#xE0;o h&#x1EC7; qu&#x1EA3;n tr&#x1ECB; c&#x1A1; s&#x1EDF; d&#x1EEF; li&#x1EC7;u Postgres v&#x1EDB;i quy&#x1EC1;n sudo</p><blockquote>sudo -u postgres psql</blockquote><p>Sau khi &#x111;&#x103;ng nh&#x1EAD;p v&#xE0;o Postgres shell th&#xE0;nh c&#xF4;ng, m&#xE0;n h&#xEC;nh s&#x1EBD; nh&#x1B0; sau:</p><blockquote>postgres=#</blockquote><p>T&#x1EA1;o ng&#x1B0;&#x1EDD;i d&#xF9;ng m&#x1EDB;i trong Postgres</p><blockquote>CREATE USER test WITH PASSWORD &#x2018;test123&#x2019;;</blockquote><p>T&#x1EA1;o c&#x1A1; s&#x1EDF; d&#x1EEF; li&#x1EC7;u m&#x1EAB;u v&#xE0; g&#xE1;n quy&#x1EC1;n s&#x1EDF; h&#x1EEF;u v&#x1EDB;i ng&#x1B0;&#x1EDD;i d&#xF9;ng &#x201C;test&#x201D;</p><blockquote>CREATE DATABASE congty OWNER test;</blockquote><p>Th&#xEA;m ng&#x1B0;&#x1EDD;i d&#xF9;ng &#x201C;test&#x201D; trong Ubuntu</p><blockquote>sudo adduser fish_user</blockquote><p>&#x110;&#x1EC3; &#x111;&#x103;ng nh&#x1EAD;p v&#xE0;o Postgres v&#x1EDB;i ng&#x1B0;&#x1EDD;i d&#xF9;ng &#x201C;test&#x201D; trong c&#x1A1; s&#x1EDF; d&#x1EEF; li&#x1EC7;u &#x201C;congty&#x201D;, ch&#xFA;ng ta s&#x1EED; d&#x1EE5;ng c&#xFA; ph&#xE1;p l&#x1EC7;nh sau:</p><blockquote>sudo -u test psql -d congty</blockquote><p>S&#x1EED; d&#x1EE5;ng SQL t&#x1EA1;o table nhanvien nh&#x1B0; sau:</p><!--kg-card-begin: markdown--><blockquote>
<p>congty=&gt; CREATE TABLE nhanvien(<br>
congty=&gt; fname character varying(15) NOT NULL,<br>
congty=&gt; minit character(1) ,<br>
congty=&gt; lname character varying(15) NOT NULL,<br>
congty=&gt; ssn character(9)  NOT NULL,<br>
congty=&gt; bdate date,<br>
congty=&gt; address character varying(35),<br>
congty=&gt; sex character(1),<br>
congty=&gt; salary numeric(10,2),<br>
congty=&gt; dno integer DEFAULT 1);</p>
</blockquote>
<!--kg-card-end: markdown--><p>Ki&#x1EC3;m tra l&#x1EA1;i b&#x1EA3;ng nhanvien &#x111;&#xE3; &#x111;&#x1B0;&#x1EE3;c t&#x1EA1;o b&#x1EB1;ng c&#xFA; ph&#xE1;p l&#x1EC7;nh sau:</p><blockquote>congty=&gt; \dt</blockquote><p>H&#xEC;nh &#x1EA3;nh d&#x1B0;&#x1EDB;i li&#x1EC7;t k&#xEA; c&#xE1;c quan h&#x1EC7; trong c&#x1A1; s&#x1EDF; d&#x1EEF; li&#x1EC7;u &#x201C;congty&#x201D;</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://nguyendinhthanh.net/content/images/2023/02/image-6.png" class="kg-image" alt loading="lazy" width="926" height="266" srcset="https://nguyendinhthanh.net/content/images/size/w600/2023/02/image-6.png 600w, https://nguyendinhthanh.net/content/images/2023/02/image-6.png 926w" sizes="(min-width: 720px) 720px"><figcaption>B&#x1EA3;ng nh&#xE2;n vi&#xEA;n</figcaption></figure><p>Th&#xEA;m m&#x1ED9;t d&#xF2;ng d&#x1EEF; li&#x1EC7;u nh&#xE2;n vi&#xEA;n, b&#x1EB1;ng c&#xE1;ch s&#x1EED; d&#x1EE5;ng &#x111;&#x1ED1;i t&#x1B0;&#x1EE3;ng &#x201C;pool&#x201D; (m&#x1ED9;t &#x111;&#x1ED1;i t&#x1B0;&#x1EE3;ng &#x111;&#x1EA1;i di&#x1EC7;n m&#x1ED9;t k&#x1EBF;t n&#x1ED1;i c&#x1EE7;a ng&#x1B0;&#x1EDD;i d&#xF9;ng t&#x1EDB;i c&#x1A1; s&#x1EDF; d&#x1EEF; li&#x1EC7;u &#x201C;congty&#x201D;) trong ph&#x1EA7;n tr&#xEA;n nh&#x1B0; sau:</p><blockquote>Pool.query(&#x2018;INSERT INTO nhanvien (fname, minit, lname, ssn, bdate, address, sex, salary) VALUES ($1, $2, $3, $4, $5, $6, $7, $8)&#x2019;, [fname, minit, lname, ssn, bdate, address, sex, salary]);</blockquote><p>H&#xEC;nh d&#x1B0;&#x1EDB;i m&#xF4; t&#x1EA3; chi ti&#x1EBF;t m&#xE3; ngu&#x1ED3;n c&#xE1;c th&#xEA;m m&#x1ED9;t d&#x1EEF; li&#x1EC7;u nh&#xE2;n vi&#xEA;n v&#xE0;o c&#x1A1; s&#x1EDF; d&#x1EEF; li&#x1EC7;u &#x201C;<em>congty</em>&#x201D; do ng&#x1B0;&#x1EDD;i d&#xF9;ng cung c&#x1EA5;p</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://nguyendinhthanh.net/content/images/2023/02/image-7.png" class="kg-image" alt loading="lazy" width="984" height="371" srcset="https://nguyendinhthanh.net/content/images/size/w600/2023/02/image-7.png 600w, https://nguyendinhthanh.net/content/images/2023/02/image-7.png 984w" sizes="(min-width: 720px) 720px"><figcaption>Th&#xEA;m th&#xF4;ng tin nh&#xE2;n vi&#xEA;n</figcaption></figure><p>K&#x1EBF;t qu&#x1EA3; sau khi l&#x1B0;u d&#x1EEF; li&#x1EC7;u nh&#xE2;n vi&#xEA;n &#x201C;<em>Franklin</em>&#x201D;, m&#xE0;n h&#xEC;nh s&#x1EBD; xu&#x1EA5;t ra t&#xEA;n nh&#xE2;n vi&#xEA;n &#x111;&#xF3;.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://nguyendinhthanh.net/content/images/2023/02/image-8.png" class="kg-image" alt loading="lazy" width="985" height="57" srcset="https://nguyendinhthanh.net/content/images/size/w600/2023/02/image-8.png 600w, https://nguyendinhthanh.net/content/images/2023/02/image-8.png 985w" sizes="(min-width: 720px) 720px"><figcaption>K&#x1EBF;t qu&#x1EA3; c&#x1EE7;a thao t&#xE1;c th&#xEA;m th&#xF4;ng tin nh&#xE2;n vi&#xEA;n</figcaption></figure><p>Truy xu&#x1EA5;t danh s&#xE1;ch nh&#xE2;n vi&#xEA;n, b&#x1EB1;ng c&#xE1;ch d&#xF9;ng h&#xE0;m &#x201C;query&#x201D; nh&#x1B0; sau:</p><blockquote>Pool.query(&#x201C;SELECT * FROM nhanvien&#x201D;);</blockquote><p>Chi ti&#x1EBF;t m&#xE3; ngu&#x1ED3;n c&#xE1;ch &#x111;&#x1ECD;c d&#x1EEF; li&#x1EC7;u c&#x1EE7;a quan h&#x1EC7; &#x201C;<em>nhanvien</em>&#x201D; trong CSDL &quot;<em>congty</em>&quot;</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://nguyendinhthanh.net/content/images/2023/02/image-9.png" class="kg-image" alt loading="lazy" width="976" height="376" srcset="https://nguyendinhthanh.net/content/images/size/w600/2023/02/image-9.png 600w, https://nguyendinhthanh.net/content/images/2023/02/image-9.png 976w" sizes="(min-width: 720px) 720px"><figcaption>Truy xu&#x1EA5;t danh s&#xE1;ch nh&#xE2;n vi&#xEA;n</figcaption></figure><p>K&#x1EBF;t qu&#x1EA3; c&#x1EE7;a truy v&#x1EA5;n quan h&#x1EC7; &#x201D;<em>nhanvien</em>&#x201D;</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://nguyendinhthanh.net/content/images/2023/02/image-11.png" class="kg-image" alt loading="lazy" width="876" height="509" srcset="https://nguyendinhthanh.net/content/images/size/w600/2023/02/image-11.png 600w, https://nguyendinhthanh.net/content/images/2023/02/image-11.png 876w" sizes="(min-width: 720px) 720px"><figcaption>Th&#xF4;ng tin m&#x1ED9;t nh&#xE2;n vi&#xEA;n</figcaption></figure><p>Ch&#x1EC9;nh s&#x1EED;a l&#x1B0;&#x1A1;ng c&#x1EE7;a nh&#xE2;n vi&#xEA;n theo m&#xE3; s&#x1ED1; nh&#xE2;n vi&#xEA;n (hai th&#xF4;ng tin m&#xE3; s&#x1ED1; nh&#xE2;n vi&#xEA;n &#x201C;ssn&#x201D; v&#xE0; l&#x1B0;&#x1A1;ng nh&#xE2;n vi&#xEA;n &#x201C;salary&#x201D; &#x111;&#x1B0;&#x1EE3;c ng&#x1B0;&#x1EDD;i d&#xF9;ng cung c&#x1EA5;p) nh&#x1B0; sau:</p><blockquote>Pool.query(&#x201C;UPDATE nhanvien SET salary =$1 WHERE ssn=$2&#x201D;,[salary, ssn]);</blockquote><p>M&#xF4; t&#x1EA3; chi ti&#x1EBF;t m&#xE3; ngu&#x1ED3;n c&#xE1;ch ch&#x1EC9;nh s&#x1EED;a d&#x1EEF; li&#x1EC7;u &#x201C;<em>salary</em>&#x201D; c&#x1EE7;a quan h&#x1EC7; &#x201C;<em>nhanvien</em>&#x201D; trong c&#x1A1; s&#x1EDF; d&#x1EEF; li&#x1EC7;u &quot;<em>congty</em>&quot; theo th&#xF4;ng tin &#x201C;<em>ssn</em>&#x201D;.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://nguyendinhthanh.net/content/images/2023/02/image-12.png" class="kg-image" alt loading="lazy" width="910" height="341" srcset="https://nguyendinhthanh.net/content/images/size/w600/2023/02/image-12.png 600w, https://nguyendinhthanh.net/content/images/2023/02/image-12.png 910w" sizes="(min-width: 720px) 720px"><figcaption>C&#x1EAD;p nh&#x1EAD;t l&#x1B0;&#x1A1;ng theo m&#xE3; nh&#xE2;n vi&#xEA;n</figcaption></figure><p>K&#x1EBF;t qu&#x1EA3;:</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://nguyendinhthanh.net/content/images/2023/02/image-13.png" class="kg-image" alt loading="lazy" width="910" height="57" srcset="https://nguyendinhthanh.net/content/images/size/w600/2023/02/image-13.png 600w, https://nguyendinhthanh.net/content/images/2023/02/image-13.png 910w" sizes="(min-width: 720px) 720px"><figcaption>K&#x1EBF;t qu&#x1EA3; c&#x1EE7;a t&#xE1;c v&#x1EE5; c&#x1EAD;p nh&#x1EAD;t l&#x1B0;&#x1A1;ng nh&#xE2;n vi&#xEA;n</figcaption></figure><p>X&#xF3;a d&#x1EEF; li&#x1EC7;u nh&#xE2;n vi&#xEA;n theo m&#xE3; s&#x1ED1; nh&#xE2;n vi&#xEA;n &#x201C;<em>ssn</em>&#x201D; nh&#x1B0; sau:</p><blockquote>Pool.query(&#x201C;DELETE from nhanvien WHERE ssn=$2&#x201D;,[ssn]);</blockquote><p>H&#xEC;nh d&#x1B0;&#x1EDB;i m&#xF4; t&#x1EA3; chi ti&#x1EBF;t m&#xE3; ngu&#x1ED3;n c&#xE1;ch x&#xF3;a m&#x1ED9;t nh&#xE2;n vi&#xEA;n c&#x1EE7;a quan h&#x1EC7; &#x201C;<em>nhanvien</em>&#x201D; trong c&#x1A1; s&#x1EDF; d&#x1EEF; li&#x1EC7;u &quot;<em>congty</em>&quot; theo th&#xF4;ng tin m&#xE3; nh&#xE2;n vi&#xEA;n &#x201C;<em>ssn</em>&#x201D;</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://nguyendinhthanh.net/content/images/2023/02/image-14.png" class="kg-image" alt loading="lazy" width="939" height="409" srcset="https://nguyendinhthanh.net/content/images/size/w600/2023/02/image-14.png 600w, https://nguyendinhthanh.net/content/images/2023/02/image-14.png 939w" sizes="(min-width: 720px) 720px"><figcaption>X&#xF3;a nh&#xE2;n vi&#xEA;n theo m&#xE3; s&#x1ED1; ssn</figcaption></figure><p>K&#x1EBF;t qu&#x1EA3; c&#x1EE7;a thao t&#xE1;c x&#xF3;a d&#x1EEF; li&#x1EC7;u nh&#xE2;n vi&#xEA;n</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://nguyendinhthanh.net/content/images/2023/02/image-15.png" class="kg-image" alt loading="lazy" width="951" height="100" srcset="https://nguyendinhthanh.net/content/images/size/w600/2023/02/image-15.png 600w, https://nguyendinhthanh.net/content/images/2023/02/image-15.png 951w" sizes="(min-width: 720px) 720px"><figcaption>K&#x1EBF;t qu&#x1EA3; c&#x1EE7;a t&#xE1;c v&#x1EE5; x&#xF3;a nh&#xE2;n vi&#xEA;n theo m&#xE3; ssn</figcaption></figure><p>Enjoy it!</p>]]></content:encoded></item><item><title><![CDATA[Tạo Website bằng Ghost CMS]]></title><description><![CDATA[<p><a href="https://ghost.org">Ghost CMS</a> l&#xE0; c&#xF4;ng c&#x1EE5; qu&#x1EA3;n l&#xFD; n&#x1ED9;i dung website m&#xE3; ngu&#x1ED3;n m&#x1EDF;, &#x111;&#x1B0;&#x1EE3;c vi&#x1EBF;t d&#x1EF1;a tr&#xEA;n NodeJS v&#xE0; c&#xE1;c c&#xF4;ng ngh&#x1EC7;</p>]]></description><link>https://nguyendinhthanh.net/website-ghost-cms/</link><guid isPermaLink="false">636d0e29eaf401466ecd6b43</guid><category><![CDATA[ghost cms]]></category><dc:creator><![CDATA[Nguyen Dinh Thanh]]></dc:creator><pubDate>Wed, 01 Jun 2022 14:44:00 GMT</pubDate><content:encoded><![CDATA[<p><a href="https://ghost.org">Ghost CMS</a> l&#xE0; c&#xF4;ng c&#x1EE5; qu&#x1EA3;n l&#xFD; n&#x1ED9;i dung website m&#xE3; ngu&#x1ED3;n m&#x1EDF;, &#x111;&#x1B0;&#x1EE3;c vi&#x1EBF;t d&#x1EF1;a tr&#xEA;n NodeJS v&#xE0; c&#xE1;c c&#xF4;ng ngh&#x1EC7; li&#xEA;n quan.</p><p>Trang blog c&#xE1; nh&#xE2;n c&#x1EE7;a t&#xE1;c g&#x1EC9;a &#x111;&#x1B0;&#x1EE3;c tri&#x1EC3;n khai d&#x1EF1;a tr&#xEA;n Ghost CMS. Sau &#x111;&#xE2;y l&#xE0; c&#xE1;c b&#x1B0;&#x1EDB;c &#x111;&#x1EC3; tri&#x1EC3;n khai m&#x1ED9;t website tr&#xEA;n Cloud server.</p><ul><li><strong>D&#x1ECB;ch v&#x1EE5; Cloud Server</strong>: DigitalOcean.</li><li><strong>OS</strong>: Ubuntu 20.04</li><li><strong>NodeJS</strong>: 16.18.1</li><li><strong>Web Server</strong>: NGINX: 1.14.0</li></ul><p>&#x110;&#x1EA7;u ti&#xEA;n, &#x111;&#x1EC3; c&#xF3; th&#x1EC3; tri&#x1EC3;n khai c&#xE0;i &#x111;&#x1EB7;t Ghost, c&#x1EA7;n &#x111;&#x1EA3;m b&#x1EA3;o Cloud Server v&#x1EDB;i &#xED;t nh&#x1EA5;t 1GB RAM, v&#xE0; m&#x1ED9;t t&#xEA;n mi&#x1EC1;n &#x111;&#xE3; &#x111;&#x1B0;&#x1EE3;c &#x111;&#x103;ng k&#xFD; cho webiste (vd: <em>nguyendinhthanh.net</em>).</p><p><strong>B&#x1B0;&#x1EDB;c 1</strong>: c&#xE0;i &#x111;&#x1EB7;t c&#xF4;ng c&#x1EE5; <u><strong>Ghost-CLI</strong></u> - c&#xF4;ng c&#x1EE5; d&#xF2;ng l&#x1EC7;nh d&#xF9;ng &#x111;&#x1EC3; c&#xE0;i &#x111;&#x1EB7;t v&#xE0; c&#x1EA5;u h&#xEC;nh m&#x1ED9;t c&#xE1;ch d&#x1EC5; d&#xE0;ng.</p><pre><code class="language-bash">sudo npm install ghost-cli@latest -g</code></pre><p><strong>B&#x1B0;&#x1EDB;c 2:</strong> T&#x1EA1;o th&#x1B0; m&#x1EE5;c v&#xE0; thi&#x1EBF;t l&#x1EAD;p ch&#x1EE7; quy&#x1EC1;n c&#x1EE7;a th&#x1B0; m&#x1EE5;c cho m&#x1ED9;t user (trong v&#xED; d&#x1EE5; n&#xE0;y ch&#xFA;ng ta d&#xF9;ng user hi&#x1EC7;n t&#x1EA1;i &#x111;ang &#x111;&#x103;ng nh&#x1EAD;p v&#xE0;o Ubuntu Server) </p><pre><code class="language-bash"># t&#x1EA1;o th&#x1B0; m&#x1EE5;c: thay &#x111;&#x1ED5;i `nguyendinhthanh.net` to t&#xEA;n mi&#x1EC1;n &#x111;&#xE3; &#x111;&#x103;ng k&#xFD;

sudo mkdir -p /var/www/nguyendinhthanh.net

# Thi&#x1EBF;t l&#x1EAD;p ch&#x1EE7; th&#x1EC3; cho cho th&#x1B0; m&#x1EE5;c v&#x1EEB;a t&#x1EA1;o
sudo chown $USER:$USER /var/www/nguyendinhthanh.net

# Thi&#x1EBF;t l&#x1EAD;p quy&#x1EC1;n cho th&#x1B0; m&#x1EE5;c v&#x1EEB;a t&#x1EA1;o
sudo chmod 775 /var/www/nguyendinhthanh.net

# chuy&#x1EC3;n t&#x1EDB;i th&#x1B0; m&#x1EE5;c `nguyendinhthanh.net`
cd /var/www/nguyendinhthanh.net</code></pre><p><strong>B&#x1B0;&#x1EDB;c 3: </strong>C&#xE0;i &#x111;&#x1EB7;t Ghost b&#x1EB1;ng c&#xE2;u l&#x1EC7;nh sau:</p><pre><code class="language-bash">ghost install --db sqlite3</code></pre><p>&#x1EDE; &#x111;&#xE2;y do website l&#xE0; blog c&#xE1; nh&#xE2;n, n&#xEA;n t&#xE1;c g&#x1EC9;a s&#x1EED; d&#x1EE5;ng sqlite3. N&#x1EBF;u mu&#x1ED1;n x&#xE2;y d&#x1EF1;ng webiste v&#x1EDB;i l&#x1B0;&#x1EE3;ng ng&#x1B0;&#x1EDD;i d&#xF9;ng l&#x1EDB;n, high traffic th&#xEC; s&#x1EED; d&#x1EE5;ng l&#x1EC7;nh sau: <code>ghost install</code> C&#xE2;u l&#x1EC7;nh n&#xE0;y &#x111;&#xF2;i h&#x1ECF;i b&#x1EA1;n ph&#x1EA3;i c&#xE0;i <em>MySQL</em></p><p>Trong q&#xFA;a tr&#xEC;nh c&#xE0;i &#x111;&#x1EB7;t, <strong>Ghost-CLI</strong> s&#x1EBD; h&#x1ECF;i m&#x1ED9;t s&#x1ED1; c&#xE2;u h&#x1ECF;i sau nh&#x1EB1;m m&#x1EE5;c &#x111;&#xED;ch c&#x1EA5;u h&#xEC;nh site; qua &#x111;&#xF3; gi&#xFA;p ng&#x1B0;&#x1EDD;i d&#xF9;ng d&#x1EC5; d&#xE0;ng xu&#x1EA5;t b&#x1EA3;n website.</p><ul><li><strong>Blog URL:</strong> nh&#x1EAD;p ch&#xED;nh x&#xE1;c t&#xEA;n mi&#x1EC1;n webiste &#x111;&#xE3; &#x111;&#x103;ng k&#xFD;, bao g&#x1ED3;m c&#x1EA3; giao th&#x1EE9;c htpp ho&#x1EB7;c https; vd: https://nguyendinhthanh.net. Trong tr&#x1B0;&#x1EDD;ng h&#x1EE3;p s&#x1EED; d&#x1EE5;ng HTTPS, Ghost s&#x1EBD; gi&#xFA;p b&#x1EA1;n c&#x1EA5;u h&#xEC;nh SSL</li><li><strong>Set up NGINX?</strong>: Ch&#x1ECD;n Yes, Ghost s&#x1EBD; h&#x1ED7; tr&#x1EE3; c&#x1EA5;u h&#xEC;nh &#x111;&#x1EC3; site c&#xF3; th&#x1EC3; xu&#x1EA5;t b&#x1EA3;n b&#xEA;n ngo&#xE0;i</li><li><strong>Set up SSL?</strong>: Ch&#x1ECD;n Yes, nh&#x1EAD;p email c&#x1EE7;a b&#x1EA1;n, Ghost s&#x1EBD; c&#x1EA5;u h&#xEC;nh SSL gi&#xFA;p b&#x1EA1;n</li><li><strong>Set up systemd?:</strong> Ch&#x1ECD;n Yes, <code>systemd</code> (c&#xF4;ng c&#x1EE5; qu&#x1EA3;n l&#xFD; process Unix/Linux) &#x111;&#x1B0;&#x1EE3;c ch&#x1ECD;n &#x111;&#x1EC3; qu&#x1EA3;n l&#xFD; Ghost ch&#x1EA1;y m&#x1B0;&#x1EE3;t (khi server kh&#x1EDF;i &#x111;&#x1ED9;ng th&#xEC; ghost t&#x1EF1; &#x111;&#x1ED9;ng &#x111;&#x1B0;&#x1EE3;c kh&#x1EDF;i &#x111;&#x1ED9;ng th&#xF4;ng qua systemd)</li><li><strong>Start Ghost?:</strong> Ch&#x1ECD;n Yes, Ghost s&#x1EBD; kh&#x1EDF;i &#x111;&#x1ED9;ng, v&#xE0; webiste s&#x1EBD; &#x111;&#x1B0;&#x1EE3;c xu&#x1EA5;t b&#x1EA3;n, tri&#x1EC3;n khai. Enjoy it! </li></ul><blockquote><strong>https://yoursite</strong>: &#x111;&#x1B0;&#x1EE3;c xu&#x1EA5;t b&#x1EA3;n </blockquote><blockquote><strong>https://yoursite/ghost</strong>: qu&#x1EA3;n l&#xFD; n&#x1ED9;i dung webiste, t&#xE0;i kho&#x1EA3;n admin &#x111;&#x103;ng nh&#x1EAD;p &#x111;&#x1EC3; qu&#x1EA3;n l&#xFD;.</blockquote>]]></content:encoded></item></channel></rss>