<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Anuchit Prasertsang</title>
    <description>The latest articles on DEV Community by Anuchit Prasertsang (@anuchito).</description>
    <link>https://dev.to/anuchito</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F309969%2F6461a6bd-361d-4d59-84e2-e4499b98aae9.png</url>
      <title>DEV Community: Anuchit Prasertsang</title>
      <link>https://dev.to/anuchito</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/anuchito"/>
    <language>en</language>
    <item>
      <title>แก้ปัญหาภาษาไทยใน Git Log | Git Diff</title>
      <dc:creator>Anuchit Prasertsang</dc:creator>
      <pubDate>Mon, 06 Oct 2025 15:03:06 +0000</pubDate>
      <link>https://dev.to/anuchito/aekpayhaaphaasaaaithyain-git-log-git-diff-4d14</link>
      <guid>https://dev.to/anuchito/aekpayhaaphaasaaaithyain-git-log-git-diff-4d14</guid>
      <description>&lt;p&gt;เคยเจอไหม &lt;strong&gt;&lt;code&gt;git log&lt;/code&gt;&lt;/strong&gt; แล้วเจอ &lt;strong&gt;สระภาษาไทยลอย&lt;/strong&gt; หรือตัวอักษรเพี้ยน ๆ? ปัญหานี้เกิดจาก &lt;strong&gt;Git&lt;/strong&gt; ใช้โปรแกรมดูไฟล์ชื่อ &lt;strong&gt;&lt;code&gt;less&lt;/code&gt;&lt;/strong&gt; เป็นตัวแสดงผล (Pager) แต่เจ้า &lt;strong&gt;&lt;code&gt;less&lt;/code&gt;&lt;/strong&gt; ดันไม่รู้ว่าต้องแสดงผลด้วยการเข้ารหัสแบบ &lt;strong&gt;UTF-8&lt;/strong&gt; ที่รองรับภาษาไทยนั่นเองครับ!&lt;/p&gt;

&lt;h3&gt;
  
  
  คำสั่งสั้นๆ ที่แก้ไขได้ทันที:
&lt;/h3&gt;

&lt;p&gt;ใช้คำสั่งนี้เพียงครั้งเดียว ตั้งค่าแบบ &lt;strong&gt;Global&lt;/strong&gt; ใช้ได้ทุกโปรเจกต์:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git config &lt;span class="nt"&gt;--global&lt;/span&gt; core.pager &lt;span class="s2"&gt;"LESSCHARSET=utf-8 less"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  คำสั่งนี้ช่วยอะไร? ✨
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;LESSCHARSET=utf-8&lt;/code&gt;&lt;/strong&gt;: เป็นการบอกกับโปรแกรม &lt;strong&gt;&lt;code&gt;less&lt;/code&gt;&lt;/strong&gt; ให้ &lt;strong&gt;บังคับ&lt;/strong&gt; ใช้การเข้ารหัสแบบ &lt;strong&gt;UTF-8&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;ผลที่ได้คือ: &lt;strong&gt;&lt;code&gt;less&lt;/code&gt;&lt;/strong&gt; จะสามารถตีความตัวอักษรภาษาไทยได้อย่างถูกต้อง ทำให้สระและวรรณยุกต์กลับไปอยู่ถูกที่ &lt;strong&gt;ไม่ลอย&lt;/strong&gt; อีกต่อไป!&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;ลองดู &lt;code&gt;git log&lt;/code&gt; อีกครั้ง&lt;/strong&gt; ข้อความภาษาไทยชัดเจนสวยงามทันที!&lt;/p&gt;

</description>
      <category>git</category>
      <category>thai</category>
    </item>
    <item>
      <title>การใช้ `netcat` เปิดพอร์ตรับข้อความแบบง่ายๆ</title>
      <dc:creator>Anuchit Prasertsang</dc:creator>
      <pubDate>Tue, 23 Sep 2025 06:03:38 +0000</pubDate>
      <link>https://dev.to/anuchito/kaaraich-netcat-epidphrtrabkhkhwaamaebbngaay-4bmo</link>
      <guid>https://dev.to/anuchito/kaaraich-netcat-epidphrtrabkhkhwaamaebbngaay-4bmo</guid>
      <description>&lt;p&gt;เวลาทำงานกับระบบเครือข่าย บางครั้งเราแค่อยากทดสอบการส่งข้อความผ่านพอร์ตแบบเร็วๆ ไม่ต้องเขียนโปรแกรมอะไรให้วุ่นวาย &lt;code&gt;netcat&lt;/code&gt; หรือ &lt;code&gt;nc&lt;/code&gt; คือเครื่องมือที่เหมาะมากสำหรับงานแบบนี้&lt;/p&gt;

&lt;h2&gt;
  
  
  เปิดฝั่ง Server
&lt;/h2&gt;

&lt;p&gt;เริ่มจากเปิด Terminal ขึ้นมา แล้วพิมพ์คำสั่งนี้:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;nc &lt;span class="nt"&gt;-l&lt;/span&gt; 5555
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;-l&lt;/code&gt; คือรอรับการเชื่อมต่อ (listen)&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;5555&lt;/code&gt; คือหมายเลขพอร์ตที่เราจะเปิดไว้&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;หลังจากรันแล้วมันจะค้างไว้ รอให้มีคนมาเชื่อมต่อและส่งข้อความมา&lt;/p&gt;




&lt;h2&gt;
  
  
  ทดสอบฝั่ง Client
&lt;/h2&gt;

&lt;p&gt;เปิด Terminal อีกหน้าต่าง (หรือจะใช้เครื่องอื่นก็ได้ถ้าอยู่ในวงแลนเดียวกัน) แล้วพิมพ์แบบนี้:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"สวัสดีจาก client"&lt;/span&gt; | nc 127.0.0.1 5555
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;หรือถ้าอยากพิมพ์สดๆ ก็ต่อแบบนี้:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;nc 127.0.0.1 5555
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;แล้วพิมพ์อะไรก็ได้ เช่น:&lt;br&gt;
&lt;/p&gt;

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

&lt;/div&gt;



&lt;p&gt;จากนั้นกด Enter ข้อความจะไปโผล่ที่หน้าจอฝั่ง server&lt;/p&gt;




&lt;h2&gt;
  
  
  เพิ่มเติม
&lt;/h2&gt;

&lt;p&gt;ถ้าอยากให้รับการเชื่อมต่อได้หลายครั้ง (ไม่หลุดหลัง client ส่งเสร็จ):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;nc &lt;span class="nt"&gt;-lk&lt;/span&gt; 5555
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;-k Forces nc to stay listening for another connection after its current connection is completed.&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"สวัสดีจาก client"&lt;/span&gt; | nc 127.0.0.1 5555
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



</description>
      <category>netcat</category>
      <category>tcp</category>
    </item>
    <item>
      <title>Get Your Go Package on pkg.go.dev: A Simple Guide</title>
      <dc:creator>Anuchit Prasertsang</dc:creator>
      <pubDate>Thu, 04 Sep 2025 10:07:23 +0000</pubDate>
      <link>https://dev.to/anuchito/get-your-go-package-on-pkggodev-a-simple-guide-3k5d</link>
      <guid>https://dev.to/anuchito/get-your-go-package-on-pkggodev-a-simple-guide-3k5d</guid>
      <description>&lt;h2&gt;
  
  
  Get Your Go Package on pkg.go.dev: A Simple Guide
&lt;/h2&gt;

&lt;p&gt;To get your Go package on &lt;code&gt;pkg.go.dev&lt;/code&gt;, you need to publish your code, create a &lt;code&gt;go.mod&lt;/code&gt; file, and tag a version.&lt;/p&gt;




&lt;h3&gt;
  
  
  1. Publish Your Code Publicly
&lt;/h3&gt;

&lt;p&gt;Host your package on a public repository like &lt;strong&gt;GitHub, GitLab, or Bitbucket&lt;/strong&gt;. &lt;code&gt;pkg.go.dev&lt;/code&gt; can only access public code.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Create a Go Module
&lt;/h3&gt;

&lt;p&gt;Ensure your project's root directory has a &lt;code&gt;go.mod&lt;/code&gt; file. If not, run this command, replacing the placeholder with your repository URL:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;go mod init github.com/your-username/your-repo-name
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  3. Tag and Push a Version
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;pkg.go.dev&lt;/code&gt; indexes stable versions, which are marked by a Git tag. The tag must start with a "v".&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Create the tag&lt;/span&gt;
git tag v1.0.0

&lt;span class="c"&gt;# Push the tag to your remote repository&lt;/span&gt;
git push origin v1.0.0
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  4. Manually Request Indexing
&lt;/h3&gt;

&lt;p&gt;Finally, ask &lt;code&gt;pkg.go.dev&lt;/code&gt; to crawl your repository by visiting this URL:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;https://pkg.go.dev/github.com/your-username/your-repo-name@v1.0.0
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then click "Request button" on the screen&lt;br&gt;
It may take a few minutes for your page to appear.&lt;/p&gt;

</description>
      <category>go</category>
      <category>godoc</category>
      <category>github</category>
    </item>
    <item>
      <title>Kubernetes YAMLs Demystified: What’s the Difference?</title>
      <dc:creator>Anuchit Prasertsang</dc:creator>
      <pubDate>Sat, 30 Aug 2025 04:36:53 +0000</pubDate>
      <link>https://dev.to/anuchito/kubernetes-yamls-demystified-whats-the-difference-hdd</link>
      <guid>https://dev.to/anuchito/kubernetes-yamls-demystified-whats-the-difference-hdd</guid>
      <description>&lt;p&gt;In Kubernetes, a &lt;strong&gt;manifest&lt;/strong&gt; is a YAML (or JSON) file that declares a &lt;strong&gt;resource&lt;/strong&gt; you want to create or manage in the cluster. There are &lt;strong&gt;dozens&lt;/strong&gt; of resource types, but they all fall into a few &lt;strong&gt;broad categories&lt;/strong&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  ✅ Common Categories of Kubernetes Manifests
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. &lt;strong&gt;Workload Resources&lt;/strong&gt; (define &lt;em&gt;what runs&lt;/em&gt;)
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Kind&lt;/th&gt;
&lt;th&gt;Purpose&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;Pod&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;The smallest deployable unit&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;Deployment&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Declarative updates for Pods&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;ReplicaSet&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Maintains a stable set of Pods&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;StatefulSet&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Pods with stable identity/storage&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;DaemonSet&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;One Pod per node&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;Job&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;One-off task&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;CronJob&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Scheduled Jobs&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h3&gt;
  
  
  2. &lt;strong&gt;Service &amp;amp; Networking&lt;/strong&gt; (define &lt;em&gt;how things connect&lt;/em&gt;)
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Kind&lt;/th&gt;
&lt;th&gt;Purpose&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;Service&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Stable access to Pods&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;Ingress&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;HTTP routing to Services&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;IngressClass&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Ingress controller config&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;EndpointSlice&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Tracks Service endpoints&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;NetworkPolicy&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Controls traffic rules&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h3&gt;
  
  
  3. &lt;strong&gt;Configuration &amp;amp; Secrets&lt;/strong&gt; (define &lt;em&gt;app config&lt;/em&gt;)
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Kind&lt;/th&gt;
&lt;th&gt;Purpose&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;ConfigMap&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Key-value config&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;Secret&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Encrypted key-value config&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;ServiceAccount&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Identity for Pods&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;ResourceQuota&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Limit resource usage per namespace&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;LimitRange&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Default/limit CPU/mem per Pod&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h3&gt;
  
  
  4. &lt;strong&gt;Storage Resources&lt;/strong&gt;
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Kind&lt;/th&gt;
&lt;th&gt;Purpose&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;PersistentVolume&lt;/code&gt; (PV)&lt;/td&gt;
&lt;td&gt;Cluster-managed storage unit&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;PersistentVolumeClaim&lt;/code&gt; (PVC)&lt;/td&gt;
&lt;td&gt;Request for a PV&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;StorageClass&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Defines dynamic volume provisioning&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;VolumeAttachment&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;CSI plugin volume tracking&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h3&gt;
  
  
  5. &lt;strong&gt;Cluster-Level Resources&lt;/strong&gt;
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Kind&lt;/th&gt;
&lt;th&gt;Purpose&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;Namespace&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Isolate resources into groups&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;Node&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Represents a worker machine&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;Role&lt;/code&gt; / &lt;code&gt;ClusterRole&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;Permissions (RBAC)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;RoleBinding&lt;/code&gt; / &lt;code&gt;ClusterRoleBinding&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;RBAC assignment&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;CustomResourceDefinition (CRD)&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Add new resource types&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h3&gt;
  
  
  6. &lt;strong&gt;Custom Resources&lt;/strong&gt; (via CRDs)
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;These are &lt;strong&gt;user-defined kinds&lt;/strong&gt; created via &lt;code&gt;CustomResourceDefinition&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Examples:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;KafkaTopic&lt;/code&gt; (via Strimzi)&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;CertManager&lt;/code&gt; resources&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;ArgoCD&lt;/code&gt; CRDs&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;PrometheusRule&lt;/code&gt;, etc.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;




&lt;h2&gt;
  
  
  🧾 Summary Table of Core Kubernetes Manifest Kinds
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Category&lt;/th&gt;
&lt;th&gt;Example Kinds&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Workloads&lt;/td&gt;
&lt;td&gt;Deployment, Pod, Job, CronJob&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Networking&lt;/td&gt;
&lt;td&gt;Service, Ingress, NetworkPolicy&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Configuration&lt;/td&gt;
&lt;td&gt;ConfigMap, Secret, ServiceAccount&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Storage&lt;/td&gt;
&lt;td&gt;PV, PVC, StorageClass&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Cluster Management&lt;/td&gt;
&lt;td&gt;Node, Namespace, Role, CRD&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Custom Resources&lt;/td&gt;
&lt;td&gt;Anything from a CRD&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

</description>
      <category>kubernetes</category>
      <category>manifest</category>
      <category>kubectl</category>
    </item>
    <item>
      <title>What is the Chrome `--app` Flag?</title>
      <dc:creator>Anuchit Prasertsang</dc:creator>
      <pubDate>Mon, 25 Aug 2025 05:47:58 +0000</pubDate>
      <link>https://dev.to/anuchito/what-is-the-chrome-app-flag-9i6</link>
      <guid>https://dev.to/anuchito/what-is-the-chrome-app-flag-9i6</guid>
      <description>&lt;p&gt;The &lt;code&gt;--app&lt;/code&gt; flag in Google Chrome lets you open any website in a clean, minimal window—no address bar, tabs, or browser buttons. It’s a great way to run web apps as if they were standalone desktop applications.&lt;/p&gt;

&lt;h2&gt;
  
  
  Example
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;/Applications/Google\ Chrome.app/Contents/MacOS/Google\ Chrome --app="https://www.example.com"
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This command launches &lt;em&gt;example.com&lt;/em&gt; in its own simplified window.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why It’s Useful
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Gets rid of the usual browser interface&lt;/li&gt;
&lt;li&gt;Makes web apps feel more like native apps&lt;/li&gt;
&lt;li&gt;Keeps things tidy by opening the site in a separate window&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Keep in mind: This is a Chrome-specific feature and doesn’t work the same way in browsers like Firefox.&lt;/p&gt;

</description>
      <category>chrome</category>
      <category>web</category>
      <category>app</category>
    </item>
    <item>
      <title>Kubernetes คืออะไร? แบบ Dev เห็นภาพ</title>
      <dc:creator>Anuchit Prasertsang</dc:creator>
      <pubDate>Sun, 08 Dec 2024 03:04:28 +0000</pubDate>
      <link>https://dev.to/anuchito/aairkhuue-kubernetes-samhrab-dev-1b43</link>
      <guid>https://dev.to/anuchito/aairkhuue-kubernetes-samhrab-dev-1b43</guid>
      <description>&lt;p&gt;ลองนึกถึงชีวิตจริงของเรา เมื่อเราต้องการส่งของขวัญให้ใครสักคน สิ่งที่เราต้องมีคือระบบไปรษณีย์ ไปรษณีย์จะบอกเราว่า “เราสามารถส่งของให้คุณได้ แต่ว่าคุณต้องเตรียมบรรจุภัณฑ์ที่ได้มาตรฐาน” นั่นหมายความว่า ถ้าคุณจะส่งทุเรียน ก็ต้องห่อให้เรียบร้อย ไม่ใช่แค่เอาทุเรียนลูกใหญ่ไปส่งเลย ต้องมีการเตรียมพร้อมในการจัดส่งเพื่อให้มันถึงปลายทางได้อย่างปลอดภัย&lt;/p&gt;

&lt;p&gt;หรือถ้าคุณจะส่งหนังสือ ก็ต้องใส่ซองจดหมายให้เรียบร้อย ในกรณีนี้ก็จะมีค่าใช้จ่ายในการจัดส่ง ค่าใช้จ่ายนี้จะขึ้นอยู่กับระยะทางและน้ำหนักของพัสดุ ซึ่งเราสามารถจ่ายเป็นสแตมป์ได้ตามที่เห็นสมควร&lt;/p&gt;

&lt;p&gt;แต่สิ่งที่สำคัญคือ ไม่ว่าจะใส่อะไรลงไปในพัสดุ ขอแค่บรรจุภัณฑ์มันสามารถรองรับได้ตามมาตรฐาน ระบบไปรษณีย์ก็จะทำหน้าที่ส่งถึงปลายทางให้ได้&lt;/p&gt;

&lt;p&gt;ทีนี้ ลองนำหลักการนี้มาคิดในแง่ของ Kubernetes ถ้าเราต้องการให้ Kubernetes มีประสิทธิภาพเหมือนระบบขนส่งไปรษณีย์ เราต้องอธิบายว่าเราจะส่งอะไร ไปที่ไหน (ที่อยู่ปลายทาง) และมันจะไปรันที่ไหน? ใครจะรันมัน? เรารอได้นานแค่ไหน? การตอบคำถามเหล่านี้เหมือนกับการที่เราเตรียมพัสดุให้พร้อมก่อนส่งให้ไปรษณีย์&lt;/p&gt;

&lt;p&gt;Kubernetes ทำงานเหมือนกับระบบไปรษณีย์ที่ซ่อนความซับซ้อนต่างๆ ไว้เบื้องหลัง เราไม่จำเป็นต้องรู้ว่าในกระบวนการขนส่งเกิดอะไรขึ้นบ้าง เพียงแค่เราติดสแตมป์ ใส่ที่อยู่ปลายทาง แล้วระบบไปรษณีย์จะรับประกันว่าในที่สุดพัสดุของเราจะถึงมือผู้รับภายในระยะเวลาที่กำหนด แม้ว่าเครื่องบินอาจจะพังหรือรถบรรทุกอาจจะเสีย ระบบไปรษณีย์ก็ไม่โทรหาเราเพื่อแจ้งเหตุการณ์เหล่านั้น มันเป็นสิ่งที่เราไม่จำเป็นต้องรู้และไม่ต้องกังวล เพราะเขาได้สัญญากับเราว่าจะจัดส่งพัสดุถึงที่ให้ได้&lt;/p&gt;

&lt;p&gt;ในลักษณะเดียวกัน Kubernetes ก็ใช้หลักการที่เรียกว่า Promise Theory ระบบของ Kubernetes จะมีโหนดหรือเครื่องในคลัสเตอร์จำนวนมาก ซึ่งบางเครื่องอาจจะพังไปบ้าง แต่ Kubernetes รับประกันว่าแอปพลิเคชันของเราจะต้องรันอยู่เสมอ ระบบจะทำให้เรามั่นใจว่าแอปจะทำงานต่อไปไม่ว่าคลัสเตอร์จะเกิดปัญหาหรือไม่&lt;/p&gt;

&lt;p&gt;เปรียบเทียบกับไปรษณีย์ Kubernetes ซ่อนรายละเอียดทางเทคนิคทั้งหมดไว้เบื้องหลัง และอนุญาตให้นักพัฒนาแค่ใส่แอปพลิเคชันลงไปในกล่อง พิมพ์ที่อยู่ปลายทาง แล้วจ่ายสแตมป์ (หรือบอกว่าจะให้ Kubernetes ดูแลการรันแอป) ทุกอย่างที่เหลือ Kubernetes จะจัดการให้&lt;/p&gt;

&lt;p&gt;&lt;a href="https://youtu.be/BE77h7dmoQU?t=472" rel="noopener noreferrer"&gt;https://youtu.be/BE77h7dmoQU?t=472&lt;/a&gt;&lt;/p&gt;

</description>
      <category>kubernetes</category>
      <category>container</category>
    </item>
    <item>
      <title>ปัญหาของการจัดการเวลาในระบบกระจาย: Lamport Clock</title>
      <dc:creator>Anuchit Prasertsang</dc:creator>
      <pubDate>Tue, 26 Nov 2024 08:49:26 +0000</pubDate>
      <link>https://dev.to/anuchito/payhaakhngkaarcchadkaarewlaaainrabbkracchaay-lamport-clock-43o0</link>
      <guid>https://dev.to/anuchito/payhaakhngkaarcchadkaarewlaaainrabbkracchaay-lamport-clock-43o0</guid>
      <description>&lt;p&gt;ในระบบกระจาย (Distributed Systems) ปัญหาหนึ่งที่มักพบคือการประสานเวลาระหว่างเครื่องต่างๆ ที่ไม่มีการเชื่อมต่อกันโดยตรง ซึ่งเป็นเรื่องยากที่ทุกเครื่องในระบบจะเห็นเวลาเดียวกัน หรือสามารถจัดลำดับเหตุการณ์ที่เกิดขึ้นในแต่ละเครื่องได้อย่างถูกต้อง&lt;/p&gt;

&lt;h3&gt;
  
  
  ปัญหาคืออะไร?
&lt;/h3&gt;

&lt;p&gt;ในระบบกระจาย เมื่อเครื่องหลายเครื่องทำงานพร้อมกัน มักจะมีการดำเนินการต่างๆ เช่น การส่งข้อความจากเครื่องหนึ่งไปยังอีกเครื่องหนึ่ง ซึ่งการจะทำให้เครื่องแต่ละเครื่องสามารถเข้าใจลำดับเหตุการณ์เหล่านั้นได้เป็นสิ่งที่ท้าทาย เพราะแต่ละเครื่องอาจจะมีการตั้งเวลา (Clock) ที่ไม่ตรงกันหรือแตกต่างกัน และอาจจะไม่ได้อยู่ในสภาพแวดล้อมที่สามารถซิงโครไนซ์เวลาได้ตลอดเวลา&lt;/p&gt;

&lt;p&gt;ยกตัวอย่างเช่น หากเครื่องหนึ่งส่งข้อความไปยังเครื่องอื่น เราจะรู้ได้อย่างไรว่าเหตุการณ์นี้เกิดขึ้นก่อนหรือหลังจากเหตุการณ์อื่นในเครื่องที่ต่างกัน?&lt;/p&gt;

&lt;h3&gt;
  
  
  Solving the Problem: Lamport Clock
&lt;/h3&gt;

&lt;p&gt;Lamport Clock เป็นกลไกที่ถูกพัฒนาขึ้นมาเพื่อแก้ไขปัญหานี้ โดยไม่จำเป็นต้องมีการซิงโครไนซ์เวลาในระบบทั้งหมด แต่ให้ทุกเครื่องสามารถรักษาลำดับเหตุการณ์ได้ด้วยการใช้ตัวนับเหตุการณ์ (logical clock) ที่ถูกปรับปรุงเมื่อมีการส่งหรือรับข้อความระหว่างเครื่องต่างๆ&lt;/p&gt;

&lt;h4&gt;
  
  
  หลักการของ Lamport Clock:
&lt;/h4&gt;

&lt;ol&gt;
&lt;li&gt;ทุกเครื่องในระบบจะมีการตั้งตัวนับเหตุการณ์ (logical clock) ของตนเอง&lt;/li&gt;
&lt;li&gt;เมื่อเครื่องทำการส่งข้อความไปยังเครื่องอื่น ตัวนับของเครื่องต้นทางจะเพิ่มขึ้นก่อนส่งข้อความ&lt;/li&gt;
&lt;li&gt;เมื่อเครื่องรับข้อความจากเครื่องต้นทาง ตัวนับของเครื่องรับจะถูกปรับขึ้นให้สูงกว่า (max) ระหว่างตัวนับของเครื่องตัวเองและตัวนับที่ส่งมาจากเครื่องต้นทาง&lt;/li&gt;
&lt;li&gt;ด้วยวิธีนี้ ทุกเครื่องจะสามารถติดตามลำดับเหตุการณ์ในระบบกระจายได้โดยไม่จำเป็นต้องใช้เวลาจริง (real clock) ที่ซิงโครไนซ์กัน&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  ข้อดีและข้อจำกัดของ Lamport Clock
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;ข้อดี:&lt;/strong&gt; ระบบสามารถทำงานได้แม้เครื่องต่างๆ จะไม่ซิงโครไนซ์เวลา เนื่องจากใช้ตัวนับเหตุการณ์ในการจัดการลำดับเหตุการณ์&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;ข้อจำกัด:&lt;/strong&gt; Lamport Clock สามารถช่วยได้เพียงแค่การจัดลำดับเหตุการณ์เท่านั้น และไม่สามารถบอกได้ว่าเหตุการณ์ใดเกิดขึ้นก่อนหรือหลังอย่างแน่ชัด เนื่องจากมันไม่ใช่การจับเวลาในเชิงปริมาณ (absolute time)&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  สรุป
&lt;/h3&gt;

&lt;p&gt;Lamport Clock เป็นแนวทางที่มีประโยชน์ในการจัดการเวลาในระบบกระจายโดยไม่ต้องพึ่งพาการซิงโครไนซ์เวลาจริงระหว่างเครื่อง แต่ยังคงสามารถรักษาลำดับเหตุการณ์ได้ในระดับที่เพียงพอสำหรับการประสานงานในระบบที่กระจายทั่วกัน&lt;/p&gt;

&lt;p&gt;&lt;a href="https://martinfowler.com/articles/patterns-of-distributed-systems/lamport-clock.html" rel="noopener noreferrer"&gt;https://martinfowler.com/articles/patterns-of-distributed-systems/lamport-clock.html&lt;/a&gt;&lt;/p&gt;

</description>
    </item>
    <item>
      <title>คำสั่ง tr สำหรับแปลงหรือลบตัวอักษร</title>
      <dc:creator>Anuchit Prasertsang</dc:creator>
      <pubDate>Fri, 08 Nov 2024 11:24:17 +0000</pubDate>
      <link>https://dev.to/anuchito/khamsang-tr-samhrabaeplnghruuelbtawaksr-204j</link>
      <guid>https://dev.to/anuchito/khamsang-tr-samhrabaeplnghruuelbtawaksr-204j</guid>
      <description>&lt;p&gt;โครงสร้างพื้นฐาน&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;tr [OPTIONS]  STRING1 [STRING2]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;STRING1&lt;/code&gt;: ชุดตัวอักษรที่ต้องการแปลงหรือลบ&lt;br&gt;
&lt;code&gt;[STRING2]&lt;/code&gt;: ตัวอักษรที่ใช้แทน (optional)&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;แทนที่ตัวอักษร &lt;code&gt;:&lt;/code&gt; แทนด้วยบรรทัดใหม่ &lt;code&gt;\n&lt;/code&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"path1:path2:path3"&lt;/span&gt; | &lt;span class="nb"&gt;tr&lt;/span&gt; &lt;span class="s1"&gt;':'&lt;/span&gt; &lt;span class="s1"&gt;'\n'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;ผลลัพธ์:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;path1
path2
path3
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;ลบตัวอักษร &lt;code&gt;o&lt;/code&gt; จากข้อความ
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"hello world"&lt;/span&gt; | &lt;span class="nb"&gt;tr&lt;/span&gt; &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="s1"&gt;'o'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;ผลลัพธ์: &lt;code&gt;hell wrld&lt;/code&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;ลดตัวอักษรที่ซ้ำ ลดช่องว่างซ้ำให้เหลือช่องเดียว
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"hello     world"&lt;/span&gt; | &lt;span class="nb"&gt;tr&lt;/span&gt; &lt;span class="nt"&gt;-s&lt;/span&gt; &lt;span class="s1"&gt;' '&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;ผลลัพธ์: &lt;code&gt;hello world&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;ลองไปใช้กันดู&lt;/p&gt;

</description>
      <category>linux</category>
      <category>cli</category>
    </item>
    <item>
      <title>อัพเดทเวอร์ชั่น Container runtime Colima</title>
      <dc:creator>Anuchit Prasertsang</dc:creator>
      <pubDate>Fri, 01 Nov 2024 15:04:05 +0000</pubDate>
      <link>https://dev.to/anuchito/aphedthewrchan-container-runtime-colima-46e0</link>
      <guid>https://dev.to/anuchito/aphedthewrchan-container-runtime-colima-46e0</guid>
      <description>&lt;p&gt;วิธีการอัพเดท container runtime สำหรับ Colima ใช้ &lt;br&gt;
คำสั่ง &lt;br&gt;
&lt;code&gt;colima update&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;ตรวจสอบเวอร์ชั่นปัจจุบันได้ด้วย &lt;code&gt;colima version&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;colima version

colima version 0.7.6
git commit: 3ab92f54210503770223a8c9bb61662725e23004

runtime: docker
&lt;span class="nb"&gt;arch&lt;/span&gt;: aarch64
client: v27.2.0
server: v24.0.9
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;ทำการรัน &lt;code&gt;colima update&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;colima version

colima version 0.7.6
git commit: 3ab92f54210503770223a8c9bb61662725e23004

runtime: docker
&lt;span class="nb"&gt;arch&lt;/span&gt;: aarch64
client: v27.2.0
server: v27.1.1
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;สังเกตว่า server version จะปรับจาก v24.0.9 ไปเป็น v27.1.1 เรียบร้อย&lt;/p&gt;

</description>
      <category>colima</category>
      <category>docker</category>
      <category>upgrade</category>
      <category>macos</category>
    </item>
    <item>
      <title>การใช้ GitLab สำหรับแชร์ Configuration ให้คนในทีม โดยไม่ใช้แชท</title>
      <dc:creator>Anuchit Prasertsang</dc:creator>
      <pubDate>Thu, 31 Oct 2024 14:54:11 +0000</pubDate>
      <link>https://dev.to/anuchito/kaaraich-gitlab-samhrabaechr-configuration-aihkhnainthiim-odyaimaichaechth-4c21</link>
      <guid>https://dev.to/anuchito/kaaraich-gitlab-samhrabaechr-configuration-aihkhnainthiim-odyaimaichaechth-4c21</guid>
      <description>&lt;h3&gt;
  
  
  ปัญหา
&lt;/h3&gt;

&lt;p&gt;เมื่อเราทำงานในทีมที่มีคนหลายคน การแชร์ configuration หรือรหัสต่างๆของโปรเจคสำหรับ ระหว่างนักพัฒนานั้น&lt;br&gt;
เป็นหนึ่งปัญหาที่อยากลำบาก ถ้าไม่มี Vault ส่วนใหญ่ก็จะส่งกันผ่านทางแชท ซึ่งไม่ค่อยปลอดภัยเท่าไหร่&lt;/p&gt;
&lt;h2&gt;
  
  
  ใช้ GitLab Secure files ในการแชร์ Configuration
&lt;/h2&gt;
&lt;h3&gt;
  
  
  สร้างไฟล์ที่จะแชร์ นำไปไว้ที่ GitLab Repository
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;สร้างไฟล์ที่จะเก็บ configuration ขึ้นมาในโปรเจคของเรา กรณีนี้เราจะสร้างไฟล์ชื่อ &lt;code&gt;env.backend&lt;/code&gt; ขึ้นมา ซึ่งเป็น key-value ของ environment ของ backend
ตัวอย่างเช่น
&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;ENV_BACKEND=production
DATABASE_URL=postgres://user:password@host:port/dbname
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;ol&gt;
&lt;li&gt;ไปที่ GitLab โปรเจคของเรา แล้วไปที่ &lt;code&gt;Settings&lt;/code&gt; &amp;gt; &lt;code&gt;CI/CD&lt;/code&gt; &amp;gt; &lt;code&gt;Secure files&lt;/code&gt; แล้วอัพโหลดไฟล์ &lt;code&gt;env.backend&lt;/code&gt; ขึ้นไป&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;
  
  
  ใช้ Secure Files API ในการดึงไฟล์จาก GitLab ลงมาที่เครื่องของเรา
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;สร้าง Personal Access Token ใน GitLab โดยไปที่ &lt;a href="https://gitlab.com/-/user_settings/personal_access_tokens" rel="noopener noreferrer"&gt;&lt;code&gt;User Settings&lt;/code&gt; &amp;gt; &lt;code&gt;Access Tokens&lt;/code&gt;&lt;/a&gt; แล้วสร้าง Token ขึ้นมา&lt;/li&gt;
&lt;li&gt;ใช้ Token ที่สร้างขึ้นมาในการดึงไฟล์จาก GitLab โดยใช้ Secure Files API โดยใช้คำสั่ง
&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;    curl &lt;span class="nt"&gt;--header&lt;/span&gt; &lt;span class="s2"&gt;"PRIVATE-TOKEN: &amp;lt;GITLAB_ACCESS_TOKEN&amp;gt;"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
        &lt;span class="s2"&gt;"https://gitlab.com/api/v4/projects/&amp;lt;PROJECT_ID&amp;gt;/secure_files/&amp;lt;FILE_ID&amp;gt;/download"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
        &lt;span class="nt"&gt;--output&lt;/span&gt; &amp;lt;OUTPUT_FILE_NAME&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;โดยที่&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;&amp;lt;GITLAB_ACCESS_TOKEN&amp;gt;&lt;/code&gt; คือ &lt;a href="https://gitlab.com/-/user_settings/personal_access_tokens" rel="noopener noreferrer"&gt;Personal Access Token&lt;/a&gt; ที่สร้างขึ้นมา&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;&amp;lt;PROJECT_ID&amp;gt;&lt;/code&gt; คือ ID ของโปรเจคที่เรา (อยู่ใกล้ปุ่ม Fork ของโปรเจค หรือไปที่ &lt;code&gt;Settings&lt;/code&gt; &amp;gt; &lt;code&gt;General&lt;/code&gt; แล้วดูที่ &lt;code&gt;Project ID&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;&amp;lt;FILE_ID&amp;gt;&lt;/code&gt; คือ ID ของไฟล์ที่เราอยากดาวน์โหลด เราสามารถใช้ Secure Files API ในการดูรายละเอียดของไฟล์ทั้งหมดได้
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;&amp;lt;OUTPUT_FILE_NAME&amp;gt;&lt;/code&gt; คือ ชื่อไฟล์ที่เราอยากจะบันทึกไฟล์ที่ดาวน์โหลดลงมาในเครื่องของเรา&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;
  
  
  ดูรายละเอียดของ Secure Files ทั้งหมด
&lt;/h3&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;--header&lt;/span&gt; &lt;span class="s2"&gt;"PRIVATE-TOKEN: &amp;lt;GITLAB_ACCESS_TOKEN&amp;gt;"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
    &lt;span class="s2"&gt;"https://gitlab.com/api/v4/projects/&amp;lt;PROJECT_ID&amp;gt;/secure_files"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;ตัวอย่างผลลัพธ์&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
                &lt;/span&gt;&lt;span class="nl"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;2233783&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;//&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;FILE_ID&lt;/span&gt;&lt;span class="w"&gt;
                &lt;/span&gt;&lt;span class="nl"&gt;"filename"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"env.backend"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;//&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;FILE_NAME&lt;/span&gt;&lt;span class="w"&gt;
                &lt;/span&gt;&lt;span class="nl"&gt;"filesize"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;30&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
                &lt;/span&gt;&lt;span class="nl"&gt;"filetype"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"text/plain"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
                &lt;/span&gt;&lt;span class="err"&gt;...&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;//&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;รายละเอียดอื่นๆ&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;เพียงเท่านี้เราก็สามารถแชร์ configuration ระหว่างนักพัฒนาได้โดยไม่ต้องส่งผ่านทางแชทอีกต่อไป&lt;/p&gt;

&lt;h3&gt;
  
  
  อ้างอิง
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://docs.gitlab.com/ee/api/secure_files.html#download-secure-file" rel="noopener noreferrer"&gt;Secure File API&lt;/a&gt;&lt;/p&gt;

</description>
      <category>gitlab</category>
      <category>env</category>
      <category>password</category>
      <category>securefile</category>
    </item>
    <item>
      <title>สร้าง Kubernetes Secret manifest file สำหรับ Private Image Registry</title>
      <dc:creator>Anuchit Prasertsang</dc:creator>
      <pubDate>Thu, 03 Oct 2024 08:23:38 +0000</pubDate>
      <link>https://dev.to/anuchito/sraang-kubernetes-secret-manifest-file-samhrab-private-image-registry-o4e</link>
      <guid>https://dev.to/anuchito/sraang-kubernetes-secret-manifest-file-samhrab-private-image-registry-o4e</guid>
      <description>&lt;p&gt;ความเดิมตอนที่แล้ว &lt;/p&gt;

&lt;p&gt;เราสามารถสร้าง &lt;/p&gt;

&lt;h2&gt;
  
  
  เราสามารถไฟล์ file secrete manifest เอาไว้ใช้งานได้ดังนี้
&lt;/h2&gt;

&lt;p&gt;&lt;em&gt;gitlab-registry-secret.yaml&lt;/em&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;apiVersion&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;v1&lt;/span&gt;
&lt;span class="na"&gt;kind&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Secret&lt;/span&gt;
&lt;span class="na"&gt;metadata&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;regcred&lt;/span&gt;
  &lt;span class="na"&gt;namespace&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;default&lt;/span&gt;  &lt;span class="c1"&gt;# Change this if you want to use a different namespace&lt;/span&gt;
&lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;kubernetes.io/dockerconfigjson&lt;/span&gt;
&lt;span class="na"&gt;data&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;.dockerconfigjson&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;&amp;lt;base64-encoded-docker-config&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;&amp;lt;base64-encoded-docker-config&amp;gt;&lt;/code&gt; นำมาจากการ encode ไฟล์ config.json&lt;/p&gt;

&lt;p&gt;โดยใช้คำสั่ง &lt;code&gt;cat config.json | base64&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;ลักษณะของไฟล์ docker/config.json&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"auths"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"&amp;lt;REGISTRY_UR&amp;gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"username"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"&amp;lt;REGISTRY_USERNAME&amp;gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"password"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"&amp;lt;REGISTRY_PASSWORD&amp;gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"email"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"&amp;lt;REGISTRY_EMAIL&amp;gt;"&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;ตัวอย่างเช่น&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"auths"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"https://registry.gitlab.com"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"username"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"mygitlab"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"password"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"glpat-xk......E5"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"email"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"hello@gmail.com"&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;จากนั้นทำการ &lt;br&gt;
&lt;code&gt;kubectl apply -f gitlab-registry-secret.yaml&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;ก็เป็นอันเรียบร้อย&lt;/p&gt;

</description>
      <category>kubernetes</category>
      <category>docker</category>
      <category>gitlab</category>
      <category>container</category>
    </item>
    <item>
      <title>ดึง Images จาก Private Registry - Kubernetes</title>
      <dc:creator>Anuchit Prasertsang</dc:creator>
      <pubDate>Thu, 03 Oct 2024 04:44:54 +0000</pubDate>
      <link>https://dev.to/anuchito/dueng-images-cchaak-private-registry-kubernetes-49bg</link>
      <guid>https://dev.to/anuchito/dueng-images-cchaak-private-registry-kubernetes-49bg</guid>
      <description>&lt;h2&gt;
  
  
  ดึง Image จาก Private Registry สำหรับ Kubernetes
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;สร้าง docker-registry secret ใน Kubernetes
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;kubectl create secret docker-registry SECRET_NAME &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--docker-server&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;REGISTRY_URL &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--docker-username&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;REGISTRY_USERNAME &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--docker-password&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;REGISTRY_PASSWORD &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--docker-email&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;REGISTRY_EMAIL
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;SECRET_NAME&lt;/code&gt; ชื่อของ secret ตั้งเป็นอะไรก็ได้ &lt;/li&gt;
&lt;li&gt;
&lt;code&gt;REGISTRY_URL&lt;/code&gt; แทนที่ด้วย registry server เช่น  &lt;code&gt;https://registry.gitlab.com&lt;/code&gt; หรือ &lt;code&gt;https://ghcr.io&lt;/code&gt; หรือ &lt;code&gt;https://index.docker.io/v1/&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;REGISTRY_USERNAME&lt;/code&gt; แทนที่ด้วย username ที่คุณใช้กับ Registry นั้น&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;REGISTRY_PASSWORD&lt;/code&gt; แทนที่ด้วยรหัสผ่าน ถ้าเป็น GitLab, GitHub ให้ใช้ Access Token&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;REGISTRY_EMAIL&lt;/code&gt;แทนที่ด้วยอีเมล์ของคุณที่ใช้กับ Registry นั้น&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;ตัวอย่าง GitLab Registry&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;kubectl create secret docker-registry gitlab-registry-secret &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--docker-server&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;https://registry.gitlab.com &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--docker-username&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;mygitlab &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--docker-password&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;glpat-xk......E5 &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--docker-email&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;hello@gmail.com 
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;เพิ่ม &lt;code&gt;imagePullSecrets&lt;/code&gt; ใน ไฟล์ deployment manifest หรือ ใน pod
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;spec&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;imagePullSecrets&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;gitlab-registry-secret&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;ตัวอย่างเช่น&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;apiVersion&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;v1&lt;/span&gt;
&lt;span class="na"&gt;kind&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Pod&lt;/span&gt;
&lt;span class="na"&gt;metadata&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;api-service&lt;/span&gt;
&lt;span class="na"&gt;spec&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;hostNetwork&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;
  &lt;span class="na"&gt;containers&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;api-service&lt;/span&gt;
    &lt;span class="na"&gt;image&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;registry.gitlab.com/&amp;lt;mygitlab&amp;gt;/&amp;lt;repo&amp;gt;/&amp;lt;images&amp;gt;:v1.0.0&lt;/span&gt;

  &lt;span class="na"&gt;imagePullSecrets&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; 
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;gitlab-registry-secret&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;จากนั้นก็สั่ง apply ได้เลย &lt;code&gt;kubectl apply -f pod.yaml&lt;/code&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;หมายเหตุ: ถ้าจะใช้ image pull secrets กับ Pod (หรือ Deployment หรืออื่น ๆ ที่มี pod template) ต้องตรวจสอบให้แน่ใจว่า Secret ที่เราต้องการมีอยู่ใน namespace ที่ถูกต้อง ซึ่ง namespace นั้นต้องเป็น namespace เดียวกับที่เรากำหนด Pod ไว้ด้วยนะ&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h4&gt;
  
  
  Reference:
&lt;/h4&gt;

&lt;p&gt;&lt;a href="https://kubernetes.io/docs/tasks/configure-pod-container/pull-image-private-registry/" rel="noopener noreferrer"&gt;https://kubernetes.io/docs/tasks/configure-pod-container/pull-image-private-registry/&lt;/a&gt;&lt;/p&gt;

</description>
      <category>kubernetes</category>
      <category>docker</category>
      <category>gitlab</category>
      <category>github</category>
    </item>
  </channel>
</rss>
