<?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[honglm - ARROW Technologies Blog]]></title><description><![CDATA[Trang tổng hợp các kiến thức về lập trình]]></description><link>https://blog.arrow-tech.vn/</link><image><url>https://blog.arrow-tech.vn/favicon.png</url><title>honglm - ARROW Technologies Blog</title><link>https://blog.arrow-tech.vn/</link></image><generator>Ghost 5.81</generator><lastBuildDate>Wed, 15 Apr 2026 00:22:13 GMT</lastBuildDate><atom:link href="https://blog.arrow-tech.vn/author/honglm/rss/" rel="self" type="application/rss+xml"/><ttl>60</ttl><item><title><![CDATA[Hot deploy wildfly 's project với intelij]]></title><description><![CDATA[<!--kg-card-begin: markdown--><h1 id="1importproject">1. Import project</h1>
<p><img src="https://blog.arrow-tech.vn/content/images/2018/11/import_project.png" alt="import_project" loading="lazy"><br>
Ch&#x1ECD;n maven v&#xE0; next ...</p>
<h1 id="2configrunserver">2. Config run server</h1>
<p>Sau khi project import xong ch&#x1ECD;n <code>Edit Configuaration</code><br>
<img src="https://blog.arrow-tech.vn/content/images/2018/11/chon_config.png" alt="chon_config" loading="lazy"></p>
<p>T&#x1EA1;o m&#x1EDB;i v&#x1EDB;i t&#x1EEB; kh&#xF3;a <code>jboss server</code> v&#xE0; c&#x1EAD;p nh&#x1EAD;t c&#xE1;</p>]]></description><link>https://blog.arrow-tech.vn/hot-deploy-wildfly-s-project-voi-intelij/</link><guid isPermaLink="false">63915acd7a2f410001205dbc</guid><dc:creator><![CDATA[honglm]]></dc:creator><pubDate>Wed, 21 Nov 2018 11:14:14 GMT</pubDate><media:content url="https://blog.arrow-tech.vn/content/images/2018/12/wildfly_img-1-1.jpeg" medium="image"/><content:encoded><![CDATA[<!--kg-card-begin: markdown--><h1 id="1importproject">1. Import project</h1>
<img src="https://blog.arrow-tech.vn/content/images/2018/12/wildfly_img-1-1.jpeg" alt="Hot deploy wildfly &apos;s project v&#x1EDB;i intelij"><p><img src="https://blog.arrow-tech.vn/content/images/2018/11/import_project.png" alt="Hot deploy wildfly &apos;s project v&#x1EDB;i intelij" loading="lazy"><br>
Ch&#x1ECD;n maven v&#xE0; next ...</p>
<h1 id="2configrunserver">2. Config run server</h1>
<p>Sau khi project import xong ch&#x1ECD;n <code>Edit Configuaration</code><br>
<img src="https://blog.arrow-tech.vn/content/images/2018/11/chon_config.png" alt="Hot deploy wildfly &apos;s project v&#x1EDB;i intelij" loading="lazy"></p>
<p>T&#x1EA1;o m&#x1EDB;i v&#x1EDB;i t&#x1EEB; kh&#xF3;a <code>jboss server</code> v&#xE0; c&#x1EAD;p nh&#x1EAD;t c&#xE1;c th&#xF4;ng s&#x1ED1; theo h&#xEC;nh b&#xEA;n d&#x1B0;&#x1EDB;i<br>
<img src="https://blog.arrow-tech.vn/content/images/2018/11/config_wildly.png" alt="Hot deploy wildfly &apos;s project v&#x1EDB;i intelij" loading="lazy"><br>
Ch&#x1EC9; &#x111;&#x1ECB;nh file war &#x111;&#x1EC3; deploy<br>
<img src="https://blog.arrow-tech.vn/content/images/2018/11/config_filewar.png" alt="Hot deploy wildfly &apos;s project v&#x1EDB;i intelij" loading="lazy"></p>
<p>Click &apos;Ok&apos; &#x111;&#x1EC3; c&#x1EAD;p nh&#x1EAD;t<br>
<img src="https://blog.arrow-tech.vn/content/images/2018/11/app_server-1.png" alt="Hot deploy wildfly &apos;s project v&#x1EDB;i intelij" loading="lazy"></p>
<blockquote>
<p>Ch&#xFA; &#xFD;: tr&#x1B0;&#x1EDB;c khi test code c&#x1EA7;n build l&#x1EA1;i project (Ctr+f9) or (cmd+f9)</p>
</blockquote>
<h1 id="3tngtcintelij">3. T&#x103;ng t&#x1ED1;c intelij</h1>
<p>git clone&#xA0;<a href="https://github.com/thoeni/inetTester?ref=blog.arrow-tech.vn">https://github.com/thoeni/inetTester</a><br>
<code>java -jar ./bin/inetTester.jar</code><br>
Sau khi run file jar copy hostName r&#x1ED3;i th&#xEA;m 2 d&#xF2;ng b&#xEA;n d&#x1B0;&#x1EDB;i v&#xE0;o file host <code>sudo nano /etc/hosts</code></p>
<pre><code>127.0.0.1 &lt;output-host-name&gt;.local
::1 &lt;output-host-name&gt;.local
</code></pre>
<!--kg-card-end: markdown-->]]></content:encoded></item><item><title><![CDATA[Continuous Integration với Jenkins & Docker (P1)]]></title><description><![CDATA[<!--kg-card-begin: markdown--><p>B&#xE0;i vi&#x1EBF;t n&#xE0;y gi&#x1EDB;i thi&#x1EC7;u m&#xF4; h&#xEC;nh t&#x1EF1; &#x111;&#x1ED9;ng ho&#xE1; trong vi&#x1EC7;c ph&#xE1;t tri&#x1EC3;n ph&#x1EA7;n m&#x1EC1;m b&#x1EB1;ng c&#xE1;ch s&</p>]]></description><link>https://blog.arrow-tech.vn/continuous-integration-voi-jenkins-docker/</link><guid isPermaLink="false">63915acd7a2f410001205db3</guid><dc:creator><![CDATA[honglm]]></dc:creator><pubDate>Mon, 20 Aug 2018 04:14:44 GMT</pubDate><content:encoded><![CDATA[<!--kg-card-begin: markdown--><p>B&#xE0;i vi&#x1EBF;t n&#xE0;y gi&#x1EDB;i thi&#x1EC7;u m&#xF4; h&#xEC;nh t&#x1EF1; &#x111;&#x1ED9;ng ho&#xE1; trong vi&#x1EC7;c ph&#xE1;t tri&#x1EC3;n ph&#x1EA7;n m&#x1EC1;m b&#x1EB1;ng c&#xE1;ch s&#x1EED; d&#x1EE5;ng Jenkins v&#xE0; Docker</p>
<h1 id="igiithiuchung">I. Gi&#x1EDB;i thi&#x1EC7;u chung</h1>
<h2 id="11tchhplintccontinuousintegration">1.1. T&#xED;ch h&#x1EE3;p li&#xEA;n t&#x1EE5;c (Continuous Integration)</h2>
<p><em>Continuous Integration l&#xE0; ph&#x1B0;&#x1A1;ng ph&#xE1;p ph&#xE1;t tri&#x1EC3;n ph&#x1EA7;n m&#x1EC1;m y&#xEA;u c&#x1EA7;u c&#xE1;c th&#xE0;nh vi&#xEA;n c&#x1EE7;a team t&#xED;ch h&#x1EE3;p c&#xF4;ng vi&#x1EC7;c c&#x1EE7;a h&#x1ECD; th&#x1B0;&#x1EDD;ng xuy&#xEA;n, m&#x1ED7;i ng&#xE0;y &#xED;t nh&#x1EA5;t m&#x1ED9;t l&#x1EA7;n. M&#x1ED7;i t&#xED;ch h&#x1EE3;p &#x111;&#x1B0;&#x1EE3;c &quot;build&quot; t&#x1EF1; &#x111;&#x1ED9;ng (bao g&#x1ED3;m c&#x1EA3; test) nh&#x1EB1;m ph&#xE1;t hi&#x1EC7;n l&#x1ED7;i nhanh nh&#x1EA5;t c&#xF3; th&#x1EC3;. C&#x1EA3; team nh&#x1EAD;n th&#x1EA5;y r&#x1EB1;ng c&#xE1;ch ti&#x1EBF;p c&#x1EAD;n n&#xE0;y gi&#x1EA3;m thi&#x1EC3;u v&#x1EA5;n &#x111;&#x1EC1; t&#xED;ch h&#x1EE3;p v&#xE0; cho ph&#xE9;p ph&#xE1;t tri&#x1EC3;n ph&#x1EA7;n m&#x1EC1;m nhanh h&#x1A1;n.</em></p>
<p>M&#x1ED9;t k&#x1ECB;ch b&#x1EA3;n CI b&#x1EAF;t &#x111;&#x1EA7;u b&#x1EB1;ng vi&#x1EC7;c developer commit code l&#xEA;n repository (github ch&#x1EB3;ng h&#x1EA1;n). B&#x1EA5;t k&#x1EF3; thay &#x111;&#x1ED5;i n&#xE0;o c&#x169;ng s&#x1EBD; trigger m&#x1ED9;t v&#xF2;ng &#x111;&#x1EDD;i CI. C&#xE1;c b&#x1B0;&#x1EDB;c trong m&#x1ED9;t k&#x1ECB;ch b&#x1EA3;n CI th&#x1B0;&#x1EDD;ng nh&#x1B0; sau:</p>
<ul>
<li>&#x110;&#x1EA7;u ti&#xEA;n, developer commit code l&#xEA;n repo.</li>
<li>CI server gi&#xE1;m s&#xE1;t repo v&#xE0; ki&#x1EC3;m tra xem li&#x1EC7;u c&#xF3; thay &#x111;&#x1ED5;i n&#xE0;o tr&#xEA;n repo hay kh&#xF4;ng (li&#xEA;n t&#x1EE5;c, ch&#x1EB3;ng h&#x1EA1;n m&#x1ED7;i ph&#xFA;t 1 l&#x1EA7;n)</li>
<li>Ngay khi commit x&#x1EA3;y ra, CI server ph&#xE1;t hi&#x1EC7;n repo c&#xF3; thay &#x111;&#x1ED5;i, n&#xEA;n n&#xF3; nh&#x1EAD;n code m&#x1EDB;i nh&#x1EA5;t t&#x1EEB; repo v&#xE0; sau &#x111;&#xF3; build, ch&#x1EA1;y unit v&#xE0; integration test</li>
<li>CI server s&#x1EBD; sinh ra c&#xE1;c feedback v&#xE0; g&#x1EED;i &#x111;&#x1EBF;n c&#xE1;c member c&#x1EE7;a project</li>
<li>CI server ti&#x1EBF;p t&#x1EE5;c ch&#x1EDD; thay &#x111;&#x1ED5;i &#x1EDF; repo<br>
<img src="https://blog.arrow-tech.vn/content/images/2018/08/ci.png" alt="ci" loading="lazy"></li>
</ul>
<p>M&#x1ED7;i l&#x1EA7;n developer l&#xE0;m xong task, h&#x1ECD; ph&#x1EA3;i ch&#x1EA1;y m&#x1ED9;t private build (t&#x1EE9;c l&#xE0; ch&#x1EA1;y ph&#x1EA7;n m&#x1EC1;m tr&#xEA;n local tr&#x1B0;&#x1EDB;c), check c&#x1EA9;n th&#x1EAD;n v&#xE0; commit code l&#xEA;n repo khi &#x111;&#xE3; th&#x1EA5;y &#x1ED5;n. B&#x1B0;&#x1EDB;c n&#xE0;y x&#x1EA3;y ra th&#x1B0;&#x1EDD;ng xuy&#xEA;n v&#xE0; &#x1EDF; b&#x1EA5;t k&#x1EF3; th&#x1EDD;i &#x111;i&#x1EC3;m n&#xE0;o trong ng&#xE0;y. Vi&#x1EC7;c build t&#xED;ch h&#x1EE3;p s&#x1EBD; kh&#xF4;ng x&#x1EA3;y ra khi nh&#x1EEF;ng thay &#x111;&#x1ED5;i n&#xE0;y ch&#x1B0;a &#x1EA3;nh h&#x1B0;&#x1EDF;ng &#x111;&#x1EBF;n repo.</p>
<p>L&#x1EE3;i &#xED;ch c&#x1EE7;a vi&#x1EC7;c s&#x1EED; d&#x1EE5;ng CI l&#xE0;:</p>
<ul>
<li><strong>Gi&#x1EA3;m thi&#x1EC3;u r&#x1EE7;i ro</strong> nh&#x1EDD; vi&#x1EC7;c ph&#xE1;t hi&#x1EC7;n l&#x1ED7;i v&#xE0; fix s&#x1EDB;m, t&#x103;ng ch&#x1EA5;t l&#x1B0;&#x1EE3;ng ph&#x1EA7;n m&#x1EC1;m nh&#x1EDD; vi&#x1EC7;c t&#x1EF1; &#x111;&#x1ED9;ng test v&#xE0; inspect (&#x111;&#xE2;y c&#x169;ng l&#xE0; m&#x1ED9;t trong nh&#x1EEF;ng l&#x1EE3;i &#xED;ch c&#x1EE7;a CI, code &#x111;&#x1B0;&#x1EE3;c inspect t&#x1EF1; &#x111;&#x1ED9;ng d&#x1EF1;a theo config &#x111;&#xE3; c&#xE0;i &#x111;&#x1EB7;t, &#x111;&#x1EA3;m b&#x1EA3;o coding style, ch&#x1EB3;ng h&#x1EA1;n m&#x1ED9;t function ch&#x1EC9; &#x111;&#x1B0;&#x1EE3;c d&#xE0;i kh&#xF4;ng qu&#xE1; 10 d&#xF2;ng code ...)</li>
<li><strong>Gi&#x1EA3;m thi&#x1EC3;u nh&#x1EEF;ng quy tr&#xEC;nh th&#x1EE7; c&#xF4;ng</strong> l&#x1EB7;p &#x111;i l&#x1EB7;p l&#x1EA1;i (build css, js, migrate, test...), thay v&#xEC; &#x111;&#xF3; l&#xE0; build t&#x1EF1; &#x111;&#x1ED9;ng, ch&#x1EA1;y test t&#x1EF1; &#x111;&#x1ED9;ng</li>
<li>Sinh ra ph&#x1EA7;n m&#x1EC1;m c&#xF3; th&#x1EC3; <strong>deploy &#x1EDF; b&#x1EA5;t k&#xEC; th&#x1EDD;i gian</strong>, &#x111;&#x1ECB;a &#x111;i&#x1EC3;m</li>
</ul>
<h2 id="12jenkins">1.2. Jenkins</h2>
<p><img src="https://blog.arrow-tech.vn/content/images/2018/08/jenkin.png" alt="jenkin" loading="lazy"></p>
<p><em>Jenkins l&#xE0; m&#x1ED9;t ph&#x1EA7;n m&#x1EC1;m t&#x1EF1; &#x111;&#x1ED9;ng h&#xF3;a, m&#xE3; ngu&#x1ED3;n m&#x1EDF; v&#xE0; vi&#x1EBF;t b&#x1EB1;ng Java. Jenkins gi&#xFA;p t&#x1EF1; &#x111;&#x1ED9;ng h&#xF3;a c&#xE1;c quy tr&#xEC;nh trong ph&#xE1;t tri&#x1EC3;n ph&#x1EA7;n m&#x1EC1;m, hi&#x1EC7;n nay &#x111;&#x1B0;&#x1EE3;c d&#xF9;ng trong T&#xED;ch h&#x1EE3;p li&#xEA;n t&#x1EE5;c, v&#xE0; c&#xF2;n &#x111;&#x1B0;&#x1EE3;c d&#xF9;ng &#x111;&#x1EBF;n trong vi&#x1EC7;c Ph&#xE2;n ph&#x1ED1;i li&#xEA;n t&#x1EE5;c.</em></p>
<p>Jenkins h&#x1ED7; tr&#x1EE3; h&#x1EA7;u h&#x1EBF;t c&#xE1;c ph&#x1EA7;n m&#x1EC1;m qu&#x1EA3;n l&#xFD; m&#xE3; ngu&#x1ED3;n ph&#x1ED5; bi&#x1EBF;n hi&#x1EC7;n nay nh&#x1B0; Git, Subversion, Mercurial, ClearCase... Jenkins c&#x169;ng h&#x1ED7; tr&#x1EE3; c&#x1EA3; c&#xE1;c m&#xE3; l&#x1EC7;nh c&#x1EE7;a Shell v&#xE0; Windows Batch, &#x111;&#x1ED3;ng th&#x1EDD;i c&#xF2;n ch&#x1EA1;y &#x111;&#x1B0;&#x1EE3;c c&#xE1;c m&#xE3; l&#x1EC7;nh c&#x1EE7;a Apache Ant, Maven, Gradle... [wiki-site]</p>
<p>Plugin l&#xE0; c&#xE1;c ph&#x1EA7;n m&#x1EDF; r&#x1ED9;ng trong Jenkins, h&#x1ED7; tr&#x1EE3; c&#xE1;c d&#x1EF1; &#xE1;n kh&#xF4;ng d&#xF9;ng ng&#xF4;n ng&#x1EEF; Java. Plugin c&#xF3; th&#x1EC3; t&#xED;ch h&#x1EE3;p h&#x1EA7;u h&#x1EBF;t c&#xE1;c h&#x1EC7; th&#x1ED1;ng qu&#x1EA3;n l&#xFD; m&#xE3; ngu&#x1ED3;n v&#xE0; c&#x1A1; s&#x1EDF; d&#x1EEF; li&#x1EC7;u v&#xE0;o Jenkins. Nhi&#x1EC1;u c&#xF4;ng c&#x1EE5; build c&#xF3; plugin ri&#xEA;ng. Plugin c&#x169;ng c&#xF3; th&#x1EC3; thay &#x111;&#x1ED5;i giao di&#x1EC7;n ho&#x1EB7;c th&#xEA;m ch&#x1EE9;c n&#x103;ng m&#x1EDB;i cho Jenkins. Nhi&#x1EC1;u plugin d&#xE0;nh ri&#xEA;ng cho c&#xE1;c m&#x1EE5;c &#x111;&#xED;ch kh&#xE1;c nhau.</p>
<p><img src="https://blog.arrow-tech.vn/content/images/2018/08/jenkin_build.png" alt="jenkin_build" loading="lazy"></p>
<h2 id="13docker">1.3. Docker</h2>
<p><em>Docker l&#xE0; m&#x1ED9;t ph&#x1EA7;n m&#x1EC1;m cung c&#x1EA5;p m&#xF4;i tr&#x1B0;&#x1EDD;ng &#x1EA3;o h&#xF3;a ch&#x1EE9;a &#x111;&#x1EA7;y &#x111;&#x1EE7; c&#xE0;i &#x111;&#x1EB7;t c&#x1EA7;n thi&#x1EBF;t cho project. Docker gi&#xFA;p t&#x103;ng t&#x1ED1;c &#x111;&#x1ED9; x&#xE2;y d&#x1EF1;ng project v&#xE0; gi&#x1EA3;m thi&#x1EC3;u l&#x1ED7;i khi chuy&#x1EC3;n giao. Hi&#x1EC7;n nay docker &#x111;ang tr&#x1EDF; n&#xEA;n r&#x1EA5;t ph&#x1ED5; bi&#x1EBF;n.</em></p>
<p>C&#xE1;c v&#x1EA5;n &#x111;&#x1EC1; c&#x1EA7;n t&#xEC;m hi&#x1EC3;u:<br>
-Image<br>
-Container<br>
-Registry<br>
-Repository<br>
-Docker hub</p>
<h2 id="14mhnhcbn">1.4. M&#xF4; h&#xEC;nh c&#x1A1; b&#x1EA3;n</h2>
<p><img src="https://blog.arrow-tech.vn/content/images/2018/08/mohinhcoban.png" alt="mohinhcoban" loading="lazy"><br>
M&#xF4; t&#x1EA3;:</p>
<ul>
<li>Khi dev push code l&#xEA;n Gitlab, Gitlab s&#x1EBD; g&#x1ECD;i m&#x1ED9;t webhook th&#xF4;ng b&#xE1;o cho Jenkins bi&#x1EBF;t c&#xF3; s&#x1EF1; ki&#x1EC7;n push code.</li>
<li>Jenkins b&#x1EAF;t &#x111;&#x1B0;&#x1EE3;c s&#x1EF1; ki&#x1EC7;n n&#xE0;y v&#xE0; ch&#x1EA1;y pipeline. Pipeline &#x111;&#x1B0;&#x1EE3;c m&#xF4; t&#x1EA3; nh&#x1EEF;ng c&#xF4;ng vi&#x1EC7;c m&#xE0; Jenkins c&#x1EA7;n th&#x1EF1;c hi&#x1EC7;n &#x111;&#x1B0;&#x1EE3;c ch&#x1EC9; ra b&#x1EDF;i dev.</li>
<li>Trong m&#xF4; h&#xEC;nh n&#xE0;y, pipeline s&#x1EBD; th&#x1EF1;c hi&#x1EC7;n 4 c&#xF4;ng vi&#x1EC7;c sau:
<ul>
<li>Pull code t&#x1EEB; server</li>
<li>&#x110;&#xF3;ng g&#xF3;i project</li>
<li>Build Docker Image, g&#x1EAF;n tag</li>
<li>Publish Image l&#xEA;n 1 registry</li>
</ul>
</li>
<li>Sau khi ho&#xE0;n t&#x1EA5;t vi&#x1EC7;c publish image l&#xEA;n Docker registry th&#xEC; pipeline s&#x1EBD; k&#x1EBF;t th&#xFA;c. K&#x1EBF;t qu&#x1EA3; tr&#x1EA3; thu &#x111;&#x1B0;&#x1EE3;c l&#xE0;:
<ul>
<li>Image m&#x1EDB;i tr&#xEA;n Registry</li>
<li>Image tr&#xEA;n m&#xE1;y c&#xE0;i &#x111;&#x1EB7;t Docker</li>
</ul>
</li>
</ul>
<h1 id="iiccbccit">II. C&#xE1;c b&#x1B0;&#x1EDB;c c&#xE0;i &#x111;&#x1EB7;t</h1>
<p>Ph&#x1EA7;n n&#xE0;y m&#xEC;nh s&#x1EBD; gi&#x1EDB;i thi&#x1EC7;u &#x1EDF; b&#xE0;i ti&#x1EBF;p theo nh&#xE9;.</p>
<!--kg-card-end: markdown-->]]></content:encoded></item><item><title><![CDATA[Quản lý log với mô hình ELK]]></title><description><![CDATA[<!--kg-card-begin: markdown--><h1 id="elkstacklg">ELK stack l&#xE0; g&#xEC;</h1>
<p><em>&quot;ELK&quot; l&#xE0; vi&#x1EBF;t t&#x1EAF;t c&#x1EE7;a 3 m&#xE3; ngu&#x1ED3;n m&#x1EDF;: Elasticsearch, Logstash, and Kibana</em></p>
<p><strong>Elasticsearch</strong>: C&#x1A1; s&#x1EDF; d&#x1EEF; li&#x1EC7;u &#x111;&#x1EC3; l&#x1B0;u tr&#x1EEF;, t&</p>]]></description><link>https://blog.arrow-tech.vn/quan-ly-log-voi-mo-hinh-elk/</link><guid isPermaLink="false">63915acd7a2f410001205dad</guid><dc:creator><![CDATA[honglm]]></dc:creator><pubDate>Thu, 17 May 2018 09:11:41 GMT</pubDate><content:encoded><![CDATA[<!--kg-card-begin: markdown--><h1 id="elkstacklg">ELK stack l&#xE0; g&#xEC;</h1>
<p><em>&quot;ELK&quot; l&#xE0; vi&#x1EBF;t t&#x1EAF;t c&#x1EE7;a 3 m&#xE3; ngu&#x1ED3;n m&#x1EDF;: Elasticsearch, Logstash, and Kibana</em></p>
<p><strong>Elasticsearch</strong>: C&#x1A1; s&#x1EDF; d&#x1EEF; li&#x1EC7;u &#x111;&#x1EC3; l&#x1B0;u tr&#x1EEF;, t&#xEC;m ki&#x1EBF;m v&#xE0; query log<br>
<strong>Logstash</strong>: Ti&#x1EBF;p nh&#x1EAD;n log t&#x1EEB; nhi&#x1EC1;u ngu&#x1ED3;n, sau &#x111;&#xF3; x&#x1EED; l&#xFD; log v&#xE0; ghi d&#x1EEF; li&#x1EC7;u v&#xE0; Elasticsearch<br>
<strong>Kibana</strong>: Giao di&#x1EC7;n &#x111;&#x1EC3; qu&#x1EA3;n l&#xFD;, th&#x1ED1;ng k&#xEA; log. &#x110;&#x1ECD;c th&#xF4;ng tin t&#x1EEB; Elasticsearch</p>
<p>V&#x1EC1; c&#x1A1; ch&#x1EBF; ho&#x1EA1;t &#x111;&#x1ED9;ng b&#x1EA1;n c&#xF3; th&#x1EC3; xem h&#xEC;nh b&#xEA;n d&#x1B0;&#x1EDB;i<br>
<img src="https://blog.arrow-tech.vn/content/images/2018/05/elk1.jpeg" alt="elk1" loading="lazy"></p>
<ul>
<li>&#x110;&#x1EA7;u ti&#xEA;n th&#xEC; log s&#x1EBD; &#x111;&#x1B0;&#x1EE3;c &#x111;&#x1B0;a &#x111;&#x1EBF;n Logstash qua nhi&#x1EC1;u con &#x111;&#x1B0;&#x1EDD;ng, t&#x1EEB; file, t&#x1EEB; beat (C&#xF4;ng c&#x1EE5; &#x111;&#x1ECD;c file c&#x1EE7;a elastic.co)</li>
<li>Sau &#x111;&#xF3; Logstash s&#x1EBD; x&#x1EED; l&#xFD;, v&#xE0; ph&#xE2;n lo&#x1EA1;i log r&#x1ED3;i &#x111;&#x1B0;a &#x111;&#x1EBF;n Elastic Search &#x111;&#x1EC3; l&#x1B0;u tr&#x1EEF;</li>
<li>Kibana s&#x1EBD; &#x111;&#x1ECD;c nh&#x1EEF;ng d&#x1EEF; li&#x1EC7;u &#x111;&#x1B0;&#x1EE3;c l&#x1B0;u trong Elastic Search &#x111;&#x1EC3; hi&#x1EC7;n th&#x1ECB; log</li>
</ul>
<h1 id="buildelkstackvidocker">Build ELK stack v&#x1EDB;i docker</h1>
<ul>
<li>&#x110;&#x1EA7;u ti&#xEA;n pull 3 image elk v&#x1EC1; m&#xE1;y:<pre><code>docker pull docker.elastic.co/elasticsearch/elasticsearch:6.2.4
docker pull docker.elastic.co/kibana/kibana:6.2.4
docker pull docker.elastic.co/logstash/logstash:6.2.4
</code></pre>
</li>
<li>T&#x1EA1;o folder c&#xF3; c&#x1EA5;u tr&#xFA;c sau:<br>
<img src="https://blog.arrow-tech.vn/content/images/2018/05/docker_elk.png" alt="docker_elk" loading="lazy"></li>
</ul>
<p>docker-compose.yml</p>
<pre><code>version: &apos;2&apos;
services:
 elasticsearch:
 	container_name: elastic_624
   image: docker.elastic.co/elasticsearch/elasticsearch:6.2.4
   build: elasticsearch
   environment:
     ES_JAVA_OPTS: &quot;-Xms1g -Xmx1g&quot;
   ports:
     - &quot;9203:9200&quot;
     - &quot;9302:9300&quot;
   volumes:
     - ./elasticsearch/config/:/etc/elasticsearch/config/
 kibana:
   container_name: kibana_624
   image: docker.elastic.co/kibana/kibana:6.2.4
   build: kibana
   ports:
     - 5601:5601
   volumes:
     - ./kibana/config/:/opt/kibana/config/
   depends_on:
     - elasticsearch
 logstash:
 	container_name: logstash_624
 	image: docker.elastic.co/logstash/logstash:6.2.4
 	command: -f /etc/logstash/conf.d/
   build:logstash
   ports:
     - 5000:5000
   volumes:
     - ./logstash/config:/etc/logstash/conf.d
   depends_on:
     - elasticsearch
</code></pre>
<p>kibana.yml</p>
<pre><code>server.name: &quot;kibana&quot;
server.host: &quot;0.0.0.0&quot;
ops.interval: 5000
elasticsearch.url: &quot;[ip_server_here]:9203&quot;
xpack.security.enabled: false
</code></pre>
<p>my_config.conf</p>
<pre><code>input {
    file {
    	path =&gt; &quot;your file log&quot;
        type =&gt; &quot;Name of Log&quot;
    }
}
output {
    elasticsearch { 
    	hosts =&gt; [&quot;localhost:9200&quot;] 
    }
    if &quot;INFO&quot; in [message] {
	    email {
	        username =&gt; &quot;yourmail@gmail.com&quot;
	        address =&gt; &quot;smtp.gmail.com&quot;
	        password =&gt; &quot;yourpass&quot;
	        port =&gt; 587
	        use_tls =&gt; true
	        from =&gt; &quot;yourmail@gmail.com&quot;
	        subject =&gt; &quot;LOG alert&quot;
	        to =&gt; &quot;yourmail@gmail.com&quot;
	        via =&gt; &quot;smtp&quot;
	        body =&gt; &quot;Here is the event line that occured: %{message}&quot;
	    }
    }
    stdout { codec =&gt; rubydebug }
}
</code></pre>
<ul>
<li>Run:
<ul>
<li>Trong folder ch&#x1EE9;a file docker-compose.yml ch&#x1EA1;y l&#x1EC7;nh <code>docker-compose up</code></li>
<li>Ch&#x1EA1;y th&#xE0;nh c&#xF4;ng s&#x1EBD; c&#xF3; 3 container nh&#x1B0; h&#xEC;nh b&#xEA;n d&#x1B0;&#x1EDB;i<br>
<img src="https://blog.arrow-tech.vn/content/images/2018/05/docker_elk_running.png" alt="docker_elk_running" loading="lazy"></li>
<li>&#x110;&#x1ECB;a ch&#x1EC9; truy c&#x1EAD;p v&#xE0;o kibana: your_ip:5601</li>
</ul>
</li>
</ul>
<!--kg-card-end: markdown-->]]></content:encoded></item><item><title><![CDATA[Hướng dẫn cấu hình  thêm HDD -Ubuntu]]></title><description><![CDATA[<!--kg-card-begin: markdown--><h1 id="getuuidcacng">Get UUID c&#x1EE7;a &#x1ED5; c&#x1EE9;ng</h1>
<p>M&#x1ED7;i &#x1ED5; c&#x1EE9;ng &#x111;&#x1EC1;u &#x111;&#x1B0;&#x1EE3;c x&#xE1;c &#x111;&#x1ECB;nh b&#x1EDF;i m&#x1ED9;t con s&#x1ED1; duy nh&#x1EA5;t g&#x1ECD;i l&#xE0; UUID<br>
L&#x1EC7;</p>]]></description><link>https://blog.arrow-tech.vn/huong-dan/</link><guid isPermaLink="false">63915acd7a2f410001205daa</guid><dc:creator><![CDATA[honglm]]></dc:creator><pubDate>Tue, 10 Apr 2018 09:56:06 GMT</pubDate><content:encoded><![CDATA[<!--kg-card-begin: markdown--><h1 id="getuuidcacng">Get UUID c&#x1EE7;a &#x1ED5; c&#x1EE9;ng</h1>
<p>M&#x1ED7;i &#x1ED5; c&#x1EE9;ng &#x111;&#x1EC1;u &#x111;&#x1B0;&#x1EE3;c x&#xE1;c &#x111;&#x1ECB;nh b&#x1EDF;i m&#x1ED9;t con s&#x1ED1; duy nh&#x1EA5;t g&#x1ECD;i l&#xE0; UUID<br>
L&#x1EC7;nh <code>sudo blkid</code> d&#xF9;ng &#x111;&#x1EC3; get UUID<br>
<img src="https://blog.arrow-tech.vn/content/images/2018/04/add_hhd.png" alt="add_hhd" loading="lazy"></p>
<h1 id="configfstabthmcngmi">Config fstab &#x111;&#x1EC3; th&#xEA;m &#x1ED5; c&#x1EE9;ng m&#x1EDB;i</h1>
<p>&#x110;&#x1EA7;u ti&#xEA;n l&#xE0; t&#x1EA1;o 1 b&#x1EA3;n backup &#x111;&#x1EC3; c&#xF3; th&#x1EC3; revert khi thay &#x111;&#x1ED5;i<br>
<code>sudo cp /etc/fstab /etc/fstab.bak </code><br>
Sau &#x111;&#xF3; th&#xEA;m 1 ph&#xE2;n v&#xF9;ng m&#x1EDB;i b&#x1EB1;ng vi&#x1EC7;c edit file v&#x1EDB;i quy&#x1EC1;n root:<br>
<code>sudo vi /etc/fstab</code><br>
Th&#xEA;m &#x1EDF; cu&#x1ED1;i file v&#x1EDB;i n&#x1ED9;i dung<br>
<code>UUID=&lt;paste number copied from above&gt;   /data1    ext4    defaults    0    2</code><br>
Trong tr&#x1B0;&#x1EDD;ng h&#x1EE3;p c&#x1EE7;a m&#xEC;nh, c&#x1EA7;n mount &#x1ED5; c&#xF3; UUID <code>626A29AE3F9FDEEB</code> v&#xE0;o ph&#xE2;n v&#xF9;ng <code>/data_2tb</code> v&#x1EDB;i ki&#x1EC3;u ntfs c&#xF3; d&#x1EA1;ng nh&#x1B0; sau:</p>
<pre><code>UUID=626A29AE3F9FDEEB /data_2tb ntfs defaults    0    2
</code></pre>
<p>Cu&#xF4;i c&#xF9;ng ch&#x1EA1;y l&#x1EC7;nh <code>mount -a</code> &#x111;&#x1EC3; test</p>
<!--kg-card-end: markdown-->]]></content:encoded></item><item><title><![CDATA[Backup dữ liệu vào Nas]]></title><description><![CDATA[<!--kg-card-begin: markdown--><p>Trong qu&#xE1; tr&#xEC;nh c&#xE0;i c&#x1EAF;m, &#x111;&#xF4;i l&#xFA;c b&#x1EA1;n c&#x1EA7;n backup d&#x1EEF; li&#x1EC7;u &#x111;&#x1EC3; ph&#xF2;ng r&#x1EE7;i ro. Trong b&#xE0;i n&#xE0;y m&#xEC;nh s&</p>]]></description><link>https://blog.arrow-tech.vn/backup-du-lieu-vao-nas/</link><guid isPermaLink="false">63915acd7a2f410001205da8</guid><dc:creator><![CDATA[honglm]]></dc:creator><pubDate>Tue, 10 Apr 2018 08:34:22 GMT</pubDate><content:encoded><![CDATA[<!--kg-card-begin: markdown--><p>Trong qu&#xE1; tr&#xEC;nh c&#xE0;i c&#x1EAF;m, &#x111;&#xF4;i l&#xFA;c b&#x1EA1;n c&#x1EA7;n backup d&#x1EEF; li&#x1EC7;u &#x111;&#x1EC3; ph&#xF2;ng r&#x1EE7;i ro. Trong b&#xE0;i n&#xE0;y m&#xEC;nh s&#x1EBD; h&#x1B0;&#x1EDB;ng d&#x1EAB;n c&#xE1;ch th&#x1EF1;c hi&#x1EC7;n backup sang Nas.<br>
<em>C&#xE1;c b&#x1B0;&#x1EDB;c th&#x1EF1;c hi&#x1EC7;n</em></p>
<h1 id="1mountnasvoservercnbackup">1. Mount Nas v&#xE0;o server c&#x1EA7;n backup</h1>
<h2 id="kimtracng">Ki&#x1EC3;m tra &#x1ED5; c&#x1EE9;ng</h2>
<p>G&#xF5; l&#x1EC7;nh <code>df -sh</code> &#x111;&#x1EC3; ki&#x1EC3;m tra &#x1ED5; c&#x1EE9;ng<br>
<img src="https://blog.arrow-tech.vn/content/images/2018/04/da_mount-1.png" alt="da_mount-1" loading="lazy"><br>
Trong h&#xEC;nh v&#x1EBD; m&#xEC;nh &#x111;&#xE3; mount 2 th&#x1B0; m&#x1EE5;s <code>lpic_project</code> v&#xE0; <code>backup_it</code> t&#x1EEB; con Nas 192.168.xx.xx v&#xE0;o server m&#xEC;nh &#x111;ang th&#x1EF1;c hi&#x1EC7;n backup.<br>
N&#x1EBF;u ch&#x1B0;a &#x111;&#x1B0;&#x1EE3;c mount th&#xEC; connect v&#xE0;o ph&#x1EA7;n admin c&#x1EE7;a Nas &#x111;&#x1EC3; xem th&#x1B0; m&#x1EE5;c trong nas v&#xE0; user nh&#xE9;.</p>
<h2 id="kimtrauservfoldertrongnas">Ki&#x1EC3;m tra user v&#xE0; folder trong nas</h2>
<p><img src="https://blog.arrow-tech.vn/content/images/2018/04/config_nas-1.png" alt="config_nas-1" loading="lazy"><br>
Trong tr&#x1B0;&#x1EDD;ng h&#x1EE3;p n&#xE0;y m&#xEC;nh mount folder backup_it v&#xE0; s&#x1EED; d&#x1EE5;ng user backup_it. <code>L&#x1B0;u &#xFD; user c&#x1EA7;n c&#xF3; quy&#x1EC1;n w/r nh&#xE9; :D</code></p>
<h2 id="citcifs">C&#xE0;i &#x111;&#x1EB7;t CIFS</h2>
<p>sudo apt-get install cifs-utils</p>
<h2 id="thchinmount">Th&#x1EF1;c hi&#x1EC7;n mount</h2>
<p>C&#xE1;ch &#x111;&#x1A1;n gi&#x1EA3;n nh&#x1EA5;t &#x111;&#x1EC3; th&#x1EF1;c hi&#x1EC7;n l&#xE0; th&#xEA;m d&#xF2;ng b&#xEA;n d&#x1B0;&#x1EDB;i v&#xE0;o file &apos;/etc/fstab&apos;  <code>vi /etc/fstab file</code></p>
<blockquote>
<p>//servername/sharename  /media/windowsshare  cifs username=msusername,password=mspassword,iocharset=utf8,sec=ntlm  0  0</p>
</blockquote>
<p>Trong tr&#x1B0;&#x1EDD;ng h&#x1EE3;p c&#x1EE7;a m&#xEC;nh:<br>
<img src="https://blog.arrow-tech.vn/content/images/2018/04/fstab-1.png" alt="fstab-1" loading="lazy"></p>
<ul>
<li>192.168.xx.xxx/backup_it folder backup tr&#xEA;n Nas</li>
<li>/mnt/datastore/backup folder s&#x1EBD; mount tr&#xEA;n server hi&#x1EC7;n t&#x1EA1;i</li>
<li>file: <code>/home/arrow/keys/.backup_store_credent</code> ch&#x1EE9;a config username v&#xE0; password.</li>
</ul>
<blockquote>
<p>username=backup_it<br>
password=xxx</p>
</blockquote>
<p>Cu&#x1ED1;i c&#xF9;ng verify fstab b&#x1EB1;ng c&#xE2;u l&#x1EC7;nh <code>sudo mount -a</code><br>
Ki&#x1EC3;m tra l&#x1EA1;i folder &#x111;&#xE3; &#x111;&#x1B0;&#x1EE3;c mount ch&#x1B0;a b&#x1EB1;ng l&#x1EC7;nh <code>df -h</code></p>
<h1 id="2chylnhzipfoldercnbackup">2.Ch&#x1EA1;y l&#x1EC7;nh zip folder c&#x1EA7;n backup</h1>
<blockquote>
<p>cd /mnt/datastore/backup/<br>
tar -czvf backup_it.tar.gz  [folder_path]</p>
</blockquote>
<!--kg-card-end: markdown-->]]></content:encoded></item><item><title><![CDATA[Thêm thư viện .jar vào project Maven]]></title><description><![CDATA[<!--kg-card-begin: markdown--><p>Th&#x1EC9;nh tho&#x1EA3;ng b&#x1EA1;n s&#x1EBD; c&#x1EA7;n th&#xEA;m file jar v&#xE0;o local repository c&#x1EE7;a Maven m&#xE0; kh&#xF4;ng t&#xEC;m &#x111;&#x1B0;&#x1EE3;c tr&#xEA;n Maven center repository, hay mu&#x1ED1;n</p>]]></description><link>https://blog.arrow-tech.vn/them-thu-vien-jar-vao-project-maven/</link><guid isPermaLink="false">63915acd7a2f410001205da7</guid><dc:creator><![CDATA[honglm]]></dc:creator><pubDate>Mon, 02 Apr 2018 09:22:52 GMT</pubDate><content:encoded><![CDATA[<!--kg-card-begin: markdown--><p>Th&#x1EC9;nh tho&#x1EA3;ng b&#x1EA1;n s&#x1EBD; c&#x1EA7;n th&#xEA;m file jar v&#xE0;o local repository c&#x1EE7;a Maven m&#xE0; kh&#xF4;ng t&#xEC;m &#x111;&#x1B0;&#x1EE3;c tr&#xEA;n Maven center repository, hay mu&#x1ED1;n custom  l&#x1EA1;i th&#x1B0; vi&#x1EC7;n jar.<br>
Trong b&#xE0;i n&#xE0;y m&#xEC;nh s&#x1EBD; h&#x1B0;&#x1EDB;ng d&#x1EAB;n c&#xE1;ch th&#xEA;m 1 th&#x1B0; vi&#x1EC7;n v&#xE0;o project Maven.</p>
<p><strong>1. C&#xE1;ch 1 - S&#x1EED; d&#x1EE5;ng maven install</strong></p>
<ul>
<li>Ch&#x1EA1;y l&#x1EC7;nh install jar b&#x1EB1;ng l&#x1EC7;nh c&#x1EE7;a Maven plugin</li>
</ul>
<pre><code>mvn install:install-file -Dfile=&lt;path-to-file&gt;/xxx.jar -DgroupId=com.atv \
   -DartifactId=xxx -Dversion=1.0 -Dpackaging=&lt;packaging&gt;
</code></pre>
<ul>
<li>Sau &#x111;&#xF3; add v&#xE0;o file pom.xml</li>
</ul>
<pre><code>&lt;dependency&gt;
     &lt;groupId&gt;com.atv&lt;/groupId&gt;
     &lt;artifactId&gt;xxx&lt;/artifactId&gt;
     &lt;version&gt;1.0&lt;/version&gt;
&lt;/dependency&gt;
</code></pre>
<p><strong>2. C&#xE1;ch 2 - Load t&#x1EEB; local repository</strong></p>
<ul>
<li>Th&#xEA;m config n&#xE0;y v&#xE0;o file pom</li>
</ul>
<pre><code>&lt;repositories&gt;
 &lt;repository&gt;
   &lt;id&gt;in-project&lt;/id&gt;
   &lt;name&gt;In Project Repo&lt;/name&gt;
   &lt;url&gt;file://${project.basedir}/libs&lt;/url&gt;
 &lt;/repository&gt;
&lt;/repositories&gt;
</code></pre>
<ul>
<li>Th&#xEA;m dependency b&#x1EA1;n mu&#x1ED1;n</li>
</ul>
<pre><code>&lt;dependency&gt;
    &lt;groupId&gt;com.atv&lt;/groupId&gt;
    &lt;artifactId&gt;xxx-1.0&lt;/artifactId&gt;
    &lt;version&gt;1.0&lt;/version&gt;
&lt;/dependency&gt;
</code></pre>
<p>C&#xF3; &#x111;i&#x1EC3;m c&#x1EA7;n l&#x1B0;u &#xFD; &#x1EDF; b&#x1B0;&#x1EDB;c n&#xE0;y t&#xEA;n file jar &#x111;&#x1EB7;t theo d&#x1EA1;ng artifactId-version.jar (xxx-1.0.jar)</p>
<ul>
<li>Th&#xEA;m xxx-1.0.jar v&#xE0;o folder b&#xEA;n d&#x1B0;&#x1EDB;i<br>
<code>[prorject_dir]/libs/com/atv/xxx/1.0</code><br>
(repository-location/groupId/artifactId/version)</li>
<li>Trong th&#x1B0; m&#x1EE5;c tr&#xEA;n th&#xEA;m file xxx-1.0.pom</li>
</ul>
<pre><code>&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;
&lt;project xsi:schemaLocation=&quot;http://maven.apache.org/POM/4.0.0http://maven.apache.org/xsd/maven-4.0.0.xsd&quot; xmlns=&quot;http://maven.apache.org/POM/4.0.0&quot;
    xmlns:xsi=&quot;http://www.w3.org/2001/XMLSchema-instance&quot;&gt;
  &lt;modelVersion&gt;4.0.0&lt;/modelVersion&gt;
  &lt;groupId&gt;com.atv&lt;/groupId&gt;
  &lt;artifactId&gt;xxx&lt;/artifactId&gt;
  &lt;version&gt;1.0&lt;/version&gt;
  &lt;description&gt;POM was created from install:install-file&lt;/description&gt;
&lt;/project&gt;
</code></pre>
<ul>
<li>Cu&#x1ED1;i c&#xF9;ng test th&#xF4;i :D <code>mvn clean install -U</code></li>
</ul>
<!--kg-card-end: markdown-->]]></content:encoded></item><item><title><![CDATA[Hello Spring Boot - P1. Hello world]]></title><description><![CDATA[<!--kg-card-begin: markdown--><p>Trong b&#xE0;i vi&#x1EBF;t n&#xE0;y m&#xEC;nh s&#x1EBD; h&#x1B0;&#x1EDB;ng c&#xE1;ch vi&#x1EBF;t &#x1EE9;ng d&#x1EE5;ng Hello world trong Spring.<br>
C&#xE1;c c&#xF4;ng c&#x1EE5; m&#xEC;nh s&#x1EED; d&#x1EE5;ng</p>]]></description><link>https://blog.arrow-tech.vn/untitled/</link><guid isPermaLink="false">63915acd7a2f410001205da6</guid><dc:creator><![CDATA[honglm]]></dc:creator><pubDate>Tue, 06 Feb 2018 09:25:45 GMT</pubDate><content:encoded><![CDATA[<!--kg-card-begin: markdown--><p>Trong b&#xE0;i vi&#x1EBF;t n&#xE0;y m&#xEC;nh s&#x1EBD; h&#x1B0;&#x1EDB;ng c&#xE1;ch vi&#x1EBF;t &#x1EE9;ng d&#x1EE5;ng Hello world trong Spring.<br>
C&#xE1;c c&#xF4;ng c&#x1EE5; m&#xEC;nh s&#x1EED; d&#x1EE5;ng bao g&#x1ED3;m:</p>
<ul>
<li>IntelliJ IDEA</li>
<li>JDK 1.8</li>
</ul>
<h2 id="1khitodn">1. Kh&#x1EDF;i t&#x1EA1;o d&#x1EF1; &#xE1;n</h2>
<p>V&#x1EDB;i IntelliJ, ch&#x1EC9; trong v&#xE0;i click chu&#x1ED9;t b&#x1EA1;n &#x111;&#xE3; c&#xF3; th&#x1EC3; kh&#x1EDF;i t&#x1EA1;o d&#x1EF1; &#xE1;n Spring boot</p>
<ul>
<li>Ch&#x1ECD;n New Project &gt; Spring Initilaliz<br>
Click next -&gt; next s&#x1EBD; xu&#x1EA5;t hi&#x1EC7;n c&#x1EED;a s&#x1ED5; gi&#x1ED1;ng b&#xEA;n d&#x1B0;&#x1EDB;i<br>
<img src="https://blog.arrow-tech.vn/content/images/2018/02/spring_hello_1.png" alt="spring_hello_1" loading="lazy"></li>
</ul>
<p>C&#xF3; r&#x1EA5;t nhi&#x1EC1;u option kh&#xE1;c cho vi&#x1EC7;c kh&#x1A1;i t&#x1EA1;o spring boot, &#x1EDF; &#x111;&#xE2;y m&#xEC;nh ch&#x1ECD;n m&#x1EE5;c web. &#x1EDE; Template Engine th&#xEC; m&#xEC;nh s&#x1EED;a d&#x1EE5;ng Thymeleaf</p>
<h2 id="2cutrcthmc">2. C&#x1EA5;u tr&#xFA;c th&#x1B0; m&#x1EE5;c</h2>
<p><img src="https://blog.arrow-tech.vn/content/images/2018/02/Spring_Hello_2-1.png" alt="Spring_Hello_2-1" loading="lazy"></p>
<p>Sau khit&#x1EA1;o project th&#xEC; intelij s&#x1EBD; t&#x1EA1;o ra c&#x1EA5;u tr&#xFA;c th&#x1B0; m&#x1EE5;c nh&#x1B0; b&#xEA;n tr&#xEA;n.</p>
<ul>
<li>File pom.xml ch&#x1EE9;a c&#xE1;c c&#x1EA5;u h&#xEC;nh v&#x1EC1; th&#x1B0; vi&#xEA;n</li>
<li>File application.properties ch&#x1EE9;a c&#xE1;c c&#x1EA5;u h&#xEC;nh c&#x1EE7;a Spring boot, b&#x1EA1;n c&#xF3; th&#x1EC3; tham kh&#x1EA3;o t&#x1EA1;i <a href="https://docs.spring.io/spring-boot/docs/current/reference/html/common-application-properties.html?ref=blog.arrow-tech.vn">&#x111;&#xE2;y</a></li>
<li>Th&#x1B0; vi&#x1EC7;n javascript v&#xE0; css s&#x1EBD; &#x111;&#x1B0;&#x1EE3;c &#x111;&#x1EB7;t trong th&#x1B0; m&#x1EE5;c resources/static</li>
<li>View html &#x111;&#x1EB7;t trong th&#x1B0; m&#x1EE5;c template</li>
</ul>
<h2 id="3ngdnghello">3. &#x1EE8;ng d&#x1EE5;ng hello</h2>
<ul>
<li>HelloController<br>
package com.example.demo.controller;</li>
</ul>
<pre><code>import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;

@Controller
public class HelloWorldController {

    @RequestMapping({&quot;hello&quot;,&quot;/&quot;})
    public String hello(){
        return &quot;hello&quot;;
    }
}
</code></pre>
<ul>
<li>hello.html</li>
</ul>
<pre><code>&lt;!DOCTYPE html&gt;
&lt;html lang=&quot;en&quot;&gt;
&lt;head&gt;
    &lt;meta charset=&quot;UTF-8&quot;/&gt;
    &lt;title&gt;Title&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;
    Hello Word
&lt;/body&gt;
&lt;/html&gt;
</code></pre>
<p>@RequestMapping({&quot;hello&quot;,&quot;/&quot;}) h&#x1EE9;ng request v&#x1EC1; ph&#xED;a ng&#x1B0;&#x1EDD;i d&#xF9;ng (localhost:8080/hello or localhost:8080/hello  ). Sau &#x111;&#xF3; s&#x1EBD; &#x111;i&#x1EC1;u h&#x1B0;&#x1A1;ng v&#x1EC1; file hello.html</p>
<p>Run project v&#xE0; ch&#x1EDD; &#x111;&#x1EE3;i k&#x1EBF;t qu&#x1EA3;</p>
<p><img src="https://blog.arrow-tech.vn/content/images/2018/02/SpringHello3.png" alt="SpringHello3" loading="lazy"></p>
<p>&#x110;&#x1A1;n gi&#x1EA3;n ph&#x1EA3;i kh&#xF4;ng n&#xE0;o.</p>
<!--kg-card-end: markdown-->]]></content:encoded></item><item><title><![CDATA[MEANJS - Run SASS by GULP]]></title><description><![CDATA[Bạn đã từng code css bạn đã từng chán ngán với những thao tác lặp đi lặp lại. Bạn cần có 1 công cụ nào đó để hỗ trợ tốt hơn. Vâng Sass ra đời để đáp ứng điều đó.]]></description><link>https://blog.arrow-tech.vn/meanjs-run-sass-by-gulp/</link><guid isPermaLink="false">63915acd7a2f410001205d99</guid><category><![CDATA[Css]]></category><dc:creator><![CDATA[honglm]]></dc:creator><pubDate>Tue, 30 Aug 2016 08:07:48 GMT</pubDate><content:encoded><![CDATA[<!--kg-card-begin: markdown--><blockquote>
<p>B&#x1EA1;n &#x111;&#xE3; t&#x1EEB;ng code <strong>css</strong>, b&#x1EA1;n &#x111;&#xE3; t&#x1EEB;ng ch&#xE1;n ng&#xE1;n v&#x1EDB;i nh&#x1EEF;ng thao t&#xE1;c l&#x1EB7;p &#x111;i l&#x1EB7;p l&#x1EA1;i. B&#x1EA1;n c&#x1EA7;n c&#xF3; 1 c&#xF4;ng c&#x1EE5; n&#xE0;o &#x111;&#xF3; &#x111;&#x1EC3; h&#x1ED7; tr&#x1EE3; t&#x1ED1;t h&#x1A1;n. V&#xE2;ng Sass ra &#x111;&#x1EDD;i &#x111;&#x1EC3; &#x111;&#xE1;p &#x1EE9;ng &#x111;i&#x1EC1;u &#x111;&#xF3;. V&#x1EDB;i <strong>Sass</strong> b&#x1EA1;n c&#xF3; th&#x1EC3; c&#xF3; nh&#x1EEF;ng d&#xF2;ng <strong>code trong s&#xE1;ng</strong> h&#x1A1;n, b&#x1EA1;n c&#xF3; th&#x1EC3; <strong>qu&#x1EA3;n l&#xED;</strong> nh&#x1EEF;ng thu&#x1ED9;c t&#xED;nh d&#x1B0;&#x1EDB;i d&#x1EA1;ng <strong>bi&#x1EBF;n</strong> v&#xE0; ti t&#x1EC9; nh&#x1EEF;ng th&#x1EE9; kh&#xE1;c n&#x1EEF;a ...</p>
</blockquote>
<blockquote>
<p>V&#xE0; b&#x1EA1;n c&#xF3; th&#x1EC3; google th&#xEA;m &#x111;&#x1EC3; bi&#x1EBF;t th&#xEA;m chi ti&#x1EBF;t v&#x1EC1; s&#x1EE9;c m&#x1EA1;nh c&#x1EE7;a SASS :)).</p>
</blockquote>
<p>Trong b&#xE0;i vi&#x1EBF;t n&#xE0;y t&#xF4;i s&#x1EBD; gi&#x1EDB;i thi&#x1EC7;u c&#xE1;ch c&#xE0;i &#x111;&#x1EB7;t Sass cho MeanJs.</p>
<h3 id="1sasslg">1.SASS l&#xE0; g&#xEC;?</h3>
<ul>
<li>Theo c&#xE1;ch hi&#x1EC3;u c&#x1EE7;a t&#xF4;i, SASS &#x111;&#x1B0;&#x1EE3;c hi&#x1EC3;u n&#xF4;m na l&#xE0; 1 c&#xF4;ng c&#x1EE5; <strong>gen ra css</strong>. B&#x1EA1;n vi&#x1EBF;t css theo ki&#x1EC3;u c&#x1EE7;a SASS (s&#xE1;ng s&#x1EE7;a d&#x1EC5; &#x111;&#x1ECD;c h&#x1A1;n css th&#xF4;ng th&#x1B0;&#x1EDD;ng, c&#xF2;n h&#x1A1;n &#x111;i&#x1EC3;m n&#xE0;o b&#x1EA1;n c&#xF3; th&#x1EC3; v&#xE0;o &#x111;&#xE2;y tham kh&#x1EA3;o : <a href="http://sass-lang.com/?ref=blog.arrow-tech.vn">http://sass-lang.com/</a>), SASS gen ra css cho b&#x1EA1;n.</li>
<li>==&gt; <strong>Input</strong> = &quot;Sass code&quot;       <strong>Output</strong> = &quot;File css&quot;</li>
</ul>
<h3 id="2sassvmeanjs">2.SASS v&#xE0; MEANJS.</h3>
<ul>
<li>MEANJS l&#xE0; m&#x1ED9;t framework  t&#xED;ch h&#x1EE3;p  <strong>MONGODB</strong>, <strong>EXPRESSJS</strong>, <strong>ANGULARJS</strong>, <strong>NODEJS</strong></li>
<li>&#x110;&#x1EC3; run &#x1EE9;ng d&#x1EE5;ng MEANJS, theo nh&#x1B0; info &#x1EDF; trang ch&#x1EE7; <a href="http://meanjs.org/docs/0.4.x/?ref=blog.arrow-tech.vn">http://meanjs.org/docs/0.4.x/</a> ch&#xFA;ng ta d&#xF9;ng 1 trong 2 tash runner <strong>GULP</strong> v&#xE0; <strong>GRUNT</strong> . V&#xE0; c&#x169;ng d&#xF9;ng task runner &#x111;&#x1EC3; ch&#x1EA1;y sass build ra css. Trong b&#xE0;i vi&#x1EBF;t n&#xE0;y t&#xF4;i s&#x1EBD; gi&#x1EDB;i thi&#x1EC7;u c&#xE1;ch run SASS v&#x1EDB;i GULP.</li>
</ul>
<h3 id="3chysassvigulp">3.Ch&#x1EA1;y SASS v&#x1EDB;i GULP</h3>
<ul>
<li>Th&#x1B0; vi&#x1EC7;n c&#x1EA7;n d&#xF9;ng: Bootstrap-sass v&#xE0; gulp-sass
<ul>
<li>B&#x1EA1;n c&#xF3; th&#x1EC3; c&#xE0;i &#x111;&#x1EB7;t  2 g&#xF3;i th&#x1B0; vi&#x1EC7;n &#x111;&#xF3; vs l&#x1EC7;nh sau:<pre><code>bower install bootstrap-sass --save
npm install gulp-sass --save
</code></pre>
</li>
</ul>
</li>
</ul>
<pre><code>* Ti&#x1EBF;p theo ch&#xFA;ng ta c&#x1EA7;n c&#x1EA5;u h&#xEC;nh cho file ```gulpfile.js ``` 
 * &#x110;&#x1ECB;nh ngh&#x129;a th&#xEA;m bi&#x1EBF;n ```sass = require(&apos;gulp-sass&apos;)```
 * S&#x1EED;a l&#x1EA1;i &#x111;o&#x1EA1;n khai b&#xE1;o gulp task 

     ``` gulp.task(&apos;sass&apos;, function () {
       return gulp.src(defaultAssets.client.sass)
           .pipe(sass().on(&apos;error&apos;, sass.logError))
           .pipe(gulp.dest(&apos;public/lib&apos;));
       });```

  *     ```  defaultAssets.client.sass``` &#x111;&#xE2;y l&#xE0; src c&#x1EE7;a file .scss m&#xE0; b&#x1EA1;nb&#x1EA1;n &#x111;&#x1ECB;nh ngh&#x129;a.
   Gi&#xE1; tr&#x1ECB; n&#xE0;y &#x111;&#x1B0;&#x1EE3;c &#x111;&#x1ECB;nh ngh&#x129;a trong file ```config/assets/default.js``` .Trong tr&#x1B0;&#x1EDD;ng h&#x1EE3;p c&#x1EE7;a t&#xF4;i    ```sass: [&apos;modules/core/client/css/main.scss&apos;]```,
       Trong file main.scss t&#xF4;i s&#x1EBD; import nh&#x1EEF;ng file sass kh&#xE1;c c&#x1EA7;n thi&#x1EBF;t v&#xE0;o.
   *    &#x1EDE; &#x111;&#xE2;y t&#xF4;i import th&#x1B0; vi&#x1EC7;n bootstrap v&#x1EEB;a c&#xE0;i &#x111;&#x1EB7;t &#x1EDF; b&#xEA;n tr&#xEA;n :                 
      ``` @import &quot;public/lib/bootstrap-sass/assets/stylesheets/_bootstrap.scss&quot;;```
   *  ```public/lib``` &#x110;&#xE2;y l&#xE0; th&#x1B0; m&#x1EE5;c ch&#x1EE9;a file **css** &#x111;&#x1B0;&#x1EE3;c gen ra.
* &#x110;&#x103;ng k&#xFD; task gulp &#x111;&#x1EC3; ch&#x1EA1;y task &apos;SASS&apos;
  ```
      gulp.task(&apos;default&apos;, function (done) {
         runSequence(&apos;env:dev&apos;, [&apos;nodemon&apos;, &apos;sass&apos;, &apos;watch&apos;], done);
       });```
    L&#x1B0;u &#xFD; (T&#xF4;i &#x111;ang ch&#x1EA1;y gulp v&#x1EDB;i default l&#xE0; dev).
 * Cu&#x1ED1;i c&#xF9;ng run &#x1EE9;ng d&#x1EE5;ng  b&#x1EB1;ng l&#x1EC7;nh **gulp** , sau &#x111;&#xF3; trong th&#x1B0; m&#x1EE5;c ```public/lib``` s&#x1EBD; xu&#x1EA5;t hi&#x1EC7;n file css &#x111;&#x1B0;&#x1EE3;c gen t&#x1EEB; file scss khai b&#xE1;o ban &#x111;&#x1EA7;u
</code></pre>
<!--kg-card-end: markdown-->]]></content:encoded></item></channel></rss>