<?xml version="1.0" encoding="UTF-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
  <id>urn:uuid:44ee583a-38ad-5968-af34-ef0b7a33a378</id>
  <title>Thai — Feeds</title>
  <updated>2026-10-24T16:57:00.000Z</updated>
  <author>
    <name>Feeds</name>
  </author>
  <generator uri="https://github.com/llun/feeds">FeedsFetcher</generator>
  <link rel="self" type="application/atom+xml" href="https://feeds.llun.dev/feeds/categories/ad705ee19c048a9f50f95320e110b07cd3296c596c2fbdb8e3bd8971ef85efaf.xml"/>
  <link rel="alternate" type="text/html" href="https://feeds.llun.dev/"/>
  <subtitle>Distinct stored items belonging to Thai</subtitle>
  <icon>https://feeds.llun.dev/favicon.ico</icon>
  <entry>
    <id>urn:uuid:696d14c7-e94b-569f-a89f-88438d7368ae</id>
    <title>Muse ผู้ช่วย AI ของ Meta เริ่มให้บริการในญี่ปุ่นแล้ว รองรับทั้ง Mercari และ Ticket PIA</title>
    <updated>2026-10-24T16:57:00.000Z</updated>
    <author>
      <name>arjin</name>
    </author>
    <published>2026-10-24T16:57:00.000Z</published>
    <link rel="alternate" href="https://www.blognone.com/node/152007"/>
    <category term="Thai"/>
    <content type="html">&lt;p&gt;Meta ประกาศเริ่มให้บริการ&lt;a href="https://www.blognone.com/node/151584"&gt;ผู้ช่วย AI Muse&lt;/a&gt; ในประเทศญี่ปุ่นแล้ว เป็นประเทศแรกนอกทวีปอเมริกาเหนือ (ตอนนี้มีแค่สหรัฐอเมริกา กับแคนาดา) โดย Muse สามารถทำงานและจัดการสิ่งต่าง ๆ ตามคำสั่ง เช่น ส่งอีเมล กำหนดนัดหมาย โพสต์ขายสินค้า จองทริปเดินทาง ฯลฯ ผ่านแอปสมาร์ทโฟนและผ่านเว็บไซต์ meta.ai&lt;/p&gt;
&lt;p&gt;Meta บอกว่า Muse สำหรับผู้ใช้งานในญี่ปุ่น นอกจากรองรับบริการต่าง ๆ อย่าง Gmail, Google Calendar, Instagram, Stripe, Shopify, Trip.com, Agoda, Klook แล้ว ยังรองรับบริการออนไลน์ของประเทศญี่ปุ่นอย่าง Mercari (แพลตฟอร์มสินค้ามือสอง), Money Forward ME (บริการการเงิน), Ticket PIA (บริการซื้อบัตรกิจกรรม) โดยจะเพิ่มบริการในประเทศอีกในอนาคต&lt;/p&gt;
&lt;p&gt;Muse สามารถใช้งานได้ฟรี และสามารถจ่ายเงิน subscription เพื่อให้ได้ฟีเจอร์อื่นเพิ่มเติม&lt;/p&gt;
&lt;p&gt;ที่มา: &lt;a href="https://about.fb.com/ja/news/2026/10/muse-personal-ai-agent-launches-in-japan/"&gt;Meta&lt;/a&gt;&lt;/p&gt;</content>
    <source>
      <title>Blognone</title>
      <link rel="self" href="https://www.blognone.com/node/feed"/>
      <link rel="alternate" href="https://www.blognone.com/"/>
    </source>
  </entry>
  <entry>
    <id>urn:uuid:e2181e2d-cce9-5cca-b1c1-dd9924f90898</id>
    <title>Artificial Intelligence Endgame</title>
    <updated>2026-10-24T15:21:08.000Z</updated>
    <author>
      <name>Isriya Paireepairit</name>
    </author>
    <published>2026-10-24T15:21:08.000Z</published>
    <link rel="alternate" href="https://markpeak.net/artificial-intelligence-endgame/"/>
    <category term="Thai"/>
    <content type="html">&lt;p&gt;อ่าน&lt;a href="https://www.theinformation.com/articles/altman-describes-three-endgames-ai-including-one-single-firm-melts-everyone-elses-gpus"&gt;ข่าวจากเว็บ The Information&lt;/a&gt; ที่อ้างคำพูดของ Sam Altman พูดกับพนักงานของ OpenAI เป็นการภายใน ถึง “อนาคตที่เป็นไปได้” ว่าการแข่งขันในวงการ AI จะจบลงอย่างไร คิดว่าเป็นวิธีการเฟรมอนาคตที่น่าสนใจดี (&lt;a href="https://the-decoder.com/sam-altman-reportedly-pitched-three-endgames-for-ai-safety-one-involving-a-single-firm-melting-everyone-elses-gpus/"&gt;ข่าวเวอร์ชันที่ถอดความจาก The Information อีกที&lt;/a&gt;)&lt;/p&gt;
&lt;p&gt;ตามข่าวบอกว่า Sam Altman มองว่าอนาคตจะเป็นไปได้ 3 รูปแบบคือ&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;หน่วยกำกับดูแลระดับนานาชาติ&lt;/strong&gt; – ลักษณะเดียวกับ &lt;a href="https://en.wikipedia.org/wiki/International_Atomic_Energy_Agency"&gt;International Atomic Energy Agency (IAEA)&lt;/a&gt; ที่ก่อตั้งในปี 1957 ช่วงยุคที่อเมริกาแข่งขันพัฒนานิวเคลียร์กับโซเวียด การก่อตั้ง IAEA เกิดขึ้นภายใต้ UN ที่พยายามจำกัดการใช้งานยูเรเนียมไม่ให้แพร่กระจายไปจนประเทศอื่นๆ สร้างอาวุธนิวเคลียร์ของตัวเองได้ – &lt;a href="https://openai.com/index/governance-of-superintelligence/"&gt;OpenAI เคยเสนอแนวทางนี้ไว้ในปี 2023&lt;/a&gt; แต่ไม่ประสบความสำเร็จ&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;สหพันธ์วิจัยแบบ CERN&lt;/strong&gt; – &lt;a href="https://en.wikipedia.org/wiki/CERN"&gt;CERN&lt;/a&gt; เป็นหน่วยวิจัยนิวเคลียร์ของยุโรป ก่อตั้งปี 1954 โดยชาติยุโรปตะวันตก 12 ประเทศมาร่วมลงขันกันทำแล็บนิวเคลียร์ Sam บอกว่าคนเสนอไอเดียนี้คือ Demis Hassabis แห่ง DeepMind ที่เสนอไว้เมื่อ 10 ปีก่อน (ตอนนี้ Demis หลุดจากสารบบไปแล้ว) ส่วนมุมมองของ Sam คือมันจะเกิดการควบรวมห้องแล็บ AI รายใหญ่ๆ เข้าเป็นองค์กรแม่เดียวกัน แต่ละแล็บทำงานร่วมกัน ไม่แข่งขันกัน&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;ผู้ชนะกินรวบ&lt;/strong&gt; – แนวทางนี้คือมีผู้ชนะรายเดียวจากการแข่งขัน AI แล้วมีเงินมหาศาล ทุ่มซื้อจีพียูหรือพลังประมวลผลจนคู่แข่งรายอื่นไม่มีโอกาสใช้งาน Sam เรียกแนวทางนี้ว่า Eliezer Plan ตามชื่อของ Eliezer Yudkowsky นักทฤษฎีความปลอดภัย AI ที่มักออกมาเตือนเรื่องอันตรายจาก AI จะล้างโลก&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;ผมคิดว่าการเปรียบเทียบ Endgame ของ AI กับยุคนิวเคลียร์เป็นอะไรที่น่าสนใจดี เลยกลับไปค้นประวัติดูพบว่า UN เคยพยายามตั้งคณะกรรมการพลังงานนิวเคลียร์มารอบหนึ่งในปี 1946 (ตั้งแต่สงครามโลกจบใหม่ๆ) แต่ไม่สำเร็จเพราะโซเวียตไม่เอาด้วย จนกระทั่งมาพยายามอีกรอบในปี 1953 โดยประธานาธิบดี Eisenhower เสนอสปีช Atoms for Peace แล้วตั้ง IAEA สำเร็จในปี 1957&lt;/p&gt;
&lt;p&gt;ทำไมโซเวียตถึงยอมร่วมมือด้วยในตอนหลัง ค้นดูแล้วมาจากหลายปัจจัย เช่น&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Stalin ตายในปี 1953 และโซเวียตในยุคของ Nikita Khrushchev หันมาใช้นโยบายอยู่ร่วมกับอเมริกาอย่างสันติมากขึ้น&lt;/li&gt;
&lt;li&gt;การเข้าร่วม IAEA อย่างน้อยก็มีปากมีเสียงบ้าง ดีกว่าปล่อยให้อเมริกาและพวกตะวันตกคุมหมด&lt;/li&gt;
&lt;li&gt;กระแสของกลุ่มประเทศไม่ฝักใฝ่ฝ่ายใด (Non-Aligned Movement) ช่วงนั้นมาแรง การเข้าร่วม IAEA เป็นโอกาสของโซเวียตในการนำเสนอเทคโนโลยีนิวเคลียร์ของตัวเองให้ประเทศกลุ่มนี้&lt;/li&gt;
&lt;li&gt;ทั้งสหรัฐอเมริกาและโซเวียต เห็นตรงกันว่าไม่อยากให้ประเทศอื่นที่มีอาวุธนิวเคลียร์ ดังนั้นจึงเห็นตรงกันว่า IAEA เป็นวิธีการควบคุมนิวเคลียร์แบบหนึ่งที่สมประโยชน์ทั้งสองฝ่าย&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;กลับมาที่ยุคปัจจุบัน ผมคิดว่าโมเดล IAEA เป็นไปได้หากอเมริกาคุยกับจีนลงตัว แต่ยังไม่น่าจะเกิดขึ้นในเร็ววันเพราะการแข่งขันยังอยู่ในช่วงเข้มข้นอยู่ และผู้นำคนสำคัญอย่าง Donald Trump ยังไม่มีทีท่าจะกำกับดูแล AI อย่างน้อยก็ในช่วงนี้ (เพราะแกคิดว่าอเมริกายังนำ และควรใช้โอกาสนี้เร่งให้ทิ้งห่างจีน อย่าเพิ่งไปชะลอมัน) ดังนั้นถ้าอเมริกาจะริเริ่ม มันน่าจะเกิดขึ้นในยุค Democrats กลับมาเรืองอำนาจ ซึ่งคงต้องรอเลือกตั้งปี 2028 ให้เสร็จก่อน&lt;/p&gt;
&lt;p&gt;ส่วนโมเดลควบรวมกันเป็นสหพันธ์แบบ CERN นั้นผมคิดว่าเกิดขึ้นได้ยากในบริบททุนนิยมอเมริกัน ที่แต่ละบริษัทต้องแข่งกันเพื่อสร้างมูลค่าเศรษฐกิจตามระบบตลาดทุน แต่มันอาจเป็นไปได้ในบริบทของจีน ที่รัฐบาลจีนมีอำนาจ “สั่งได้” รวมพลังของบริษัท AI จีนหลายๆ แห่ง เช่น Moonshot, Z.ai, DeepSeek ให้ทำงานร่วมกันเพื่อเอาชนะอเมริกาให้จงได้&lt;/p&gt;
&lt;p&gt;Endgame แบบสุดท้ายคือผู้ชนะกินรวบ เป็นฉากทัศน์ที่จะเกิดขึ้นเองตามธรรมชาติอยู่แล้ว (หากไม่มีใครไปแทรกแซงมัน) เพียงแต่ก็ต้องใช้เวลาอีกสักระยะหนึ่งกว่าเราจะเห็นศึกนี้จบลง และรู้ผลแพ้ชนะกัน&lt;/p&gt;</content>
    <source>
      <title>markpeak.net</title>
      <link rel="self" href="https://markpeak.net/feed/"/>
      <link rel="alternate" href="https://markpeak.net"/>
    </source>
  </entry>
  <entry>
    <id>urn:uuid:996b9d61-4715-5bfe-a966-ad8332779f18</id>
    <title>Google Cloud จะเปิดบริการเครื่อง A5X ใช้ชิป Vera Rubin ในเดือนพฤศจิกายน 2026</title>
    <updated>2026-10-24T13:57:04.000Z</updated>
    <author>
      <name>mk</name>
    </author>
    <published>2026-10-24T13:57:04.000Z</published>
    <link rel="alternate" href="https://www.blognone.com/node/152008"/>
    <category term="Thai"/>
    <content type="html">&lt;p&gt;Google Cloud เป็นผู้ให้บริการคลาวด์กลุ่มแรกๆ ที่เตรียมนำชิป NVIDIA Vera Rubin (ตัวต่อจาก Grace Blackwell) มาให้บริการในเดือนหน้า (พฤศจิกายน 2026)&lt;/p&gt;
&lt;p&gt;Google Cloud จะออก instance ชนิดใหม่ชื่อ A5X (นับเลขต่อจาก A4 ที่เป็น Blackwell B200) มาให้เช่าใช้งานกัน (ตอนนี้ยังไม่ประกาศราคา) เบื้องหลังของมันเป็นเครื่อง Vera Rubin NVL72 ที่ประกอบด้วยซีพียู Vera 36 ตัว กับจีพียู Rubin 72 ตัว&lt;/p&gt;
&lt;p&gt;กูเกิลระบุว่าวางแผนจะจัดซื้อ Rubin รวม 960,000 ตัวกระจายตามจุดต่างๆ ทั่วโลก (ศูนย์ข้อมูลหนึ่งแห่งมีได้สูงสุด 80,000 ตัว) แล้วเชื่อมกันด้วยระบบเครือข่าย Virgo Network ที่กูเกิลออกแบบเอง&lt;/p&gt;
&lt;p&gt;ที่มา - &lt;a href="https://cloud.google.com/blog/topics/ai-infrastructure/google-cloud-infrastructure-at-nvidia-gtc-berlin-2026"&gt;Google&lt;/a&gt;, &lt;a href="https://blogs.nvidia.com/blog/google-cloud-vera-rubin-infrastructure/"&gt;NVIDIA&lt;/a&gt;&lt;/p&gt;</content>
    <source>
      <title>Blognone</title>
      <link rel="self" href="https://www.blognone.com/node/feed"/>
      <link rel="alternate" href="https://www.blognone.com/"/>
    </source>
  </entry>
  <entry>
    <id>urn:uuid:6080c867-2bb0-53b0-bc54-8fc225ce5e83</id>
    <title>รายงานเศรษฐกิจดิจิทัลเอเชียตะวันออกเฉียงใต้ 2026: AI เข้ามามีบทบาทในทุกส่วนของ คนเชื่อมั่นในการใช้งานมากกว่าปีก่อน</title>
    <updated>2026-10-24T13:10:00.000Z</updated>
    <author>
      <name>arjin</name>
    </author>
    <published>2026-10-24T13:10:00.000Z</published>
    <link rel="alternate" href="https://www.blognone.com/node/152005"/>
    <category term="Thai"/>
    <content type="html">&lt;p&gt;รายงานประจำปีเกี่ยวกับเศรษฐกิจดิจิทัลภูมิภาคเอเชียตะวันออกเฉียงใต้ e-Conomy SEA ประจำปี 2026 โดย Google, Temasek และ Bain &amp;amp; Company ได้เผยแพร่ออกมาแล้ว ประเด็นสำคัญในรายงานของปีนี้คือตลาดของ Generative AI ที่เข้ามามีบทบาทในเศรษฐกิจดิจิทัลทุกส่วนของภูมิภาคนี้ ซึ่งการจัดทำก็เพิ่มเติมถึงเศรษฐกิจที่เกี่ยวข้องกับ AI ด้วย&lt;/p&gt;
&lt;p&gt;มูลค่าสินค้ารวมหรือ GMV แบบคิดรวมทั้ง 10 ประเทศในอาเซียน ปีนี้คาดตัวเลขที่ 3.68 แสนล้านดอลลาร์ เพิ่มขึ้น 17% จาก&lt;a href="https://www.blognone.com/node/149067"&gt;ปี 2025&lt;/a&gt; รายงานยังประเมินแนวโน้มการเติบโตหากอยู่ในระดับ 13% ต่อปี มูลค่ารวมจะไปสู่ระดับ 1 ล้านล้านดอลลาร์ ภายในปี 2035&lt;/p&gt;
&lt;p&gt;&lt;img src="https://feeds.llun.dev/media/eaca8ec62bfa2a2a048bd9ee904d9cbea5ff791a2d8fa7dc3a2d5e1ec876a273.jpg" alt="" /&gt;&lt;/p&gt;
&lt;p&gt;รายงานพูดถึง AI ที่ส่งผลกระทบต่อเศรษฐกิจดิจิทัลในทุกกลุ่มให้มีการเติบโตสูงต่อเนื่อง อีคอมเมิร์ซ (+18%) นำ AI มาช่วยในระบบค้นหา-ค้นพบสินค้า, บริการท่องเที่ยว (+10%) GenAI เป็นเครื่องมือยอดนิยมในการวางแผนท่องเที่ยว จากเดิมไปค้นหาในโซเชียล, สื่อออนไลน์ (+22%) AI ช่วยให้คอนเทนต์ปรับแต่งเฉพาะผู้ใช้งานตรงจุดขึ้น Engagement เพิ่มระดับ 10-20%, เดลิเวอรี่ (+15%) นำ AI มาใช้ทั้งระบบจัดการเส้นทาง ค้นหาร้าน จนถึงออเดอร์รวมกลุ่ม, การเงิน (+16%) นำ AI มาใช้ทั้งการประเมินเครดิต ระบบแนะนำพอร์ตลงทุนบุคคล และอื่น ๆ&lt;/p&gt;
&lt;p&gt;ผู้ใช้งานในภูมิภาคยังมีทัศนคติที่ดีขึ้นกับการใช้งานผู้ช่วย AI โดย 62% ยอมรับว่าเชื่อมั่นใน AI มากกว่าปีที่แล้ว, 56% บอกว่า AI มีประวัติการทำงานและตัดสินใจที่ยอมรับได้, 62% บอกว่าคำตอบจาก AI มีความแม่นยำและมีคุณภาพมากขึ้น&lt;/p&gt;
&lt;p&gt;&lt;img src="https://feeds.llun.dev/media/398cfd1b73b3e21a147d71d51d588501bf397cd24daa283763b57ae068325453.jpg" alt="" /&gt;&lt;/p&gt;
&lt;p&gt;สุดท้ายรายงานยังพูดถึงการจัดการระบบนิเวศ AI ที่จำเป็นในภูมิภาคนี้ โดยมี 4 หัวข้อหลักคือ การนำ AI Agent มาประยุกต์ใช้ได้อย่างยั่งยืน, การขยาย Infrastructure รองรับ, การออกนโยบายกำกับดูแลการจัดการพลังงานที่ใช้ และการออกกรอบข้อตกลงการค้าดิจิทัลภายในภูมิภาคอาเซียน&lt;/p&gt;
&lt;p&gt;ตัวเลขอื่นที่น่าสนใจมีดังนี้&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;80% ของผู้ขายสินค้าออนไลน์ บอกจะใช้ AI มากขึ้นใน 12 เดือนข้างหน้า&lt;/li&gt;
&lt;li&gt;คนซื้อสินค้ากลุ่มของใช้สำหรับเด็ก 70% บอกใช้ AI ช่วยในการค้นหา-ซื้อของซึ่งมากที่สุด ส่วนกลุ่มสินค้าหรู-แบรนด์เนม น้อยที่สุด 35%&lt;/li&gt;
&lt;li&gt;มีการใช้ AI สร้างรูปภาพมากกว่า 5 พันล้านรูป, สร้างเพลงมากกว่า 1 ล้านเพลง, สร้างวิดีโอมากกว่า 25 ล้านคลิป ทั้งหมดเฉพาะ Google ค่ายเดียว&lt;/li&gt;
&lt;li&gt;Use Case ที่คนยินดีให้ AI Agent ทำแทนเลยคือการเทียบราคาและซื้อสินค้าให้ทันที (75%) รองลงมาคือกำหนดตารางนัดหมาย (59%)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;ที่มา: &lt;a href="https://blog.google/company-news/inside-google/around-the-globe/google-asia/e-conomy-sea-report-2026/"&gt;กูเกิล&lt;/a&gt;&lt;/p&gt;</content>
    <source>
      <title>Blognone</title>
      <link rel="self" href="https://www.blognone.com/node/feed"/>
      <link rel="alternate" href="https://www.blognone.com/"/>
    </source>
  </entry>
  <entry>
    <id>urn:uuid:c541993c-a852-54a2-9852-7cd0471f290a</id>
    <title>[ลือ] Instacart กำลังเจรจาขายกิจการ ผู้สนใจมีทั้ง Uber และ DoorDash</title>
    <updated>2026-10-24T10:59:00.000Z</updated>
    <author>
      <name>arjin</name>
    </author>
    <published>2026-10-24T10:59:00.000Z</published>
    <link rel="alternate" href="https://www.blognone.com/node/152006"/>
    <category term="Thai"/>
    <content type="html">&lt;p&gt;มีรายงานจาก &lt;a href="https://www.theinformation.com/articles/instacart-exploring-sale"&gt;The Information&lt;/a&gt; อ้างแหล่งข่าวที่เกี่ยวข้องบอกว่า &lt;a href="https://www.blognone.com/node/72545"&gt;Instacart&lt;/a&gt; แพลตฟอร์มเดลิเวอรี่สินค้าซูเปอร์มาร์เก็ตในสหรัฐอเมริกาและแคนาดา กำลังศึกษาแนวทางขายกิจการและเริ่มเจรจาเบื้องต้นกับผู้ที่สนใจแล้ว โดยสองบริษัทที่ระบุชื่อคือ Uber และ DoorDash ที่ต่างมีบริการเดลิเวอรี่อยู่แล้ว&lt;/p&gt;
&lt;p&gt;ปัจจุบันมูลค่ากิจการของ Instacart ตามราคาหุ้นอยู่ที่ 1.2 หมื่นล้านดอลลาร์ นั่นหมายความว่าหากมีการซื้อกิจการเกิดขึ้นมูลค่าของดีลก็น่าจะสูงกว่าตัวเลขนี้&lt;/p&gt;
&lt;p&gt;ทั้ง Instacart, Uber, DoorDash ปฏิเสธที่จะแสดงความเห็นต่อข่าวลือนี้&lt;/p&gt;
&lt;p&gt;ที่มา: &lt;a href="https://www.reuters.com/business/instacart-talks-sale-information-reports-2026-10-23/"&gt;Reuters&lt;/a&gt;&lt;/p&gt;</content>
    <source>
      <title>Blognone</title>
      <link rel="self" href="https://www.blognone.com/node/feed"/>
      <link rel="alternate" href="https://www.blognone.com/"/>
    </source>
  </entry>
  <entry>
    <id>urn:uuid:8e729ddd-b9be-5a58-a8da-dc12dfdd7e05</id>
    <title>Google อัปเดตนโยบายความเป็นส่วนตัว อาจใช้ข้อมูลใน Drive, Photos มาปรับแต่งโฆษณา หากเชื่อมต่อกับ Personal Intelligence ไว้</title>
    <updated>2026-10-24T09:13:03.000Z</updated>
    <author>
      <name>arjin</name>
    </author>
    <published>2026-10-24T09:13:03.000Z</published>
    <link rel="alternate" href="https://www.blognone.com/node/152004"/>
    <category term="Thai"/>
    <content type="html">&lt;p&gt;กูเกิลปรับปรุงนโยบายความเป็นส่วนตัว (Privacy Policy) โดยเน้นไปที่ &lt;a href="https://www.blognone.com/node/150269"&gt;Personal Intelligence&lt;/a&gt; ฟีเจอร์ที่ทำให้ Gemini เชื่อมต่อกับแอปต่าง ๆ ของกูเกิลของผู้ใช้งาน เช่น Drive, Photos, Gmail ทำให้คำตอบตรงกับความสนใจของผู้ใช้งานมากขึ้น ซึ่งกูเกิลใช้คำว่า "อาจ" ใช้ข้อมูลนี้แชร์ให้กับบริการอื่นของกูเกิลสำหรับการแสดงผลโฆษณาแบบปรับแต่งเฉพาะบุคคล ขึ้นอยู่กับสิทธิที่เปิดให้เข้าถึง&lt;/p&gt;
&lt;p&gt;กูเกิลอธิบายรายละเอียดเพิ่มเติมว่าไม่ได้แปลว่ามีการสแกนอีเมลหรือรูปภาพที่เก็บไว้แบบอัตโนมัติเพื่อใช้แสดงโฆษณา (ซึ่งที่ผ่านมากูเกิลก็บอกไม่ได้ทำ) แต่หากมีการแชร์ข้อมูลนี้กับบริการอื่นของกูเกิลที่เข้าเงื่อนไขนำไปแสดงโฆษณา ข้อมูลส่วนนี้ก็อาจถูกนำไปใช้งานได้ โดยกูเกิลบอกว่าผู้ลงโฆษณาและกูเกิลจะไม่เข้าถึงข้อมูลที่ระบุตัวบุคคลได้&lt;/p&gt;
&lt;p&gt;ผู้ใช้งานสามารถปิดการเข้าถึงนี้ได้หากเปิดการเชื่อมต่อไว้ โดยไปที่บัญชี Google ดูที่ส่วน Data &amp;amp; privacy &amp;gt; Personalization settings &amp;gt; Manage Personalized Recommendations in Search Services &amp;gt; Connected Content apps ซึ่งจะแสดงรายละเอียดแอปที่เปิดการเชื่อมต่อไว้กับ Personal Intelligence&lt;/p&gt;
&lt;p&gt;ที่มา: &lt;a href="https://www.androidauthority.com/google-personal-intelligence-privacy-3727111/"&gt;Android Authority&lt;/a&gt;&lt;/p&gt;</content>
    <source>
      <title>Blognone</title>
      <link rel="self" href="https://www.blognone.com/node/feed"/>
      <link rel="alternate" href="https://www.blognone.com/"/>
    </source>
  </entry>
  <entry>
    <id>urn:uuid:d07ec3a1-1793-5983-9e6b-1491f5e883bf</id>
    <title>Gemini เปิดใช้ฟีเจอร์ Personal Intelligence กับการใช้งานในรถยนต์แล้ว</title>
    <updated>2026-10-24T08:05:37.000Z</updated>
    <author>
      <name>mk</name>
    </author>
    <published>2026-10-24T08:05:37.000Z</published>
    <link rel="alternate" href="https://www.blognone.com/node/152003"/>
    <category term="Thai"/>
    <content type="html">&lt;p&gt;กูเกิลเริ่มปล่อย &lt;a href="https://www.blognone.com/node/150269"&gt;ฟีเจอร์ Personal Intelligence&lt;/a&gt; (ที่เปิดทางให้ Gemini รู้ข้อมูลส่วนบุคคลของเราจากบัญชี Google Account) ให้กับการใช้งานในรถยนต์ ทั้ง Android Auto และ Cars with Google built-in (Android Automotive)&lt;/p&gt;
&lt;p&gt;หากผู้ใช้เปิดใช้งาน Personal Intelligence ก็จะสามารถถามข้อมูลจาก Gemini ในรถยนต์ได้เลย เช่น ขับรถไปสนามบินก็ถามได้ว่าเที่ยวบินไหน ประตูหมายเลขเท่าไร, หาร้านอาหารตามสไตล์ที่เราชอบ บนเส้นทางขับรถ, ค้นหาข้อมูลจาก Gmail หรือ Google Calendar ได้ เป็นต้น&lt;/p&gt;
&lt;p&gt;ฟีเจอร์นี้เปิดใช้งานกับ Android Auto แล้ว ส่วน Cars with Google built-in ต้องรออีกหลายเดือน&lt;/p&gt;
&lt;p&gt;ที่มา - &lt;a href="https://blog.google/products-and-platforms/platforms/android/android-auto-cars-with-google-built-in-gemini-personal-intelligence/"&gt;Google&lt;/a&gt;&lt;/p&gt;</content>
    <source>
      <title>Blognone</title>
      <link rel="self" href="https://www.blognone.com/node/feed"/>
      <link rel="alternate" href="https://www.blognone.com/"/>
    </source>
  </entry>
  <entry>
    <id>urn:uuid:0bbbf3e5-8b9e-5aff-b0e5-1fb49a04dd1a</id>
    <title>OpenAI ปรับแนวทางฝึกฝนโมเดล AI ความปลอดภัยขั้นสูง สร้างโลกออฟไลน์ ป้องกันโมเดลแหกคุกไปเจาะระบบภายนอกอีก</title>
    <updated>2026-10-24T07:36:57.000Z</updated>
    <author>
      <name>arjin</name>
    </author>
    <published>2026-10-24T07:36:57.000Z</published>
    <link rel="alternate" href="https://www.blognone.com/node/152002"/>
    <category term="Thai"/>
    <content type="html">&lt;p&gt;OpenAI ประกาศแนวทางใหม่ในการฝึกฝนโมเดล AI ด้านความปลอดภัยไซเบอร์ หลังจากโมเดลฉลาดจนควบคุมไม่ได้ และไปเจาะระบบบนโลกอินเทอร์เน็ตจริงในช่วงที่ผ่านมา ซึ่งวิธีที่ OpenAI จะใช้ก็คือการฝึกฝนแบบ "ปราศจากอินเทอร์เน็ต"&lt;/p&gt;
&lt;p&gt;OpenAI บอกว่าวิธีการนี้จะบังคับใช้เป็นกฎในการพัฒนาโมเดล AI ขั้นสูงของบริษัท ไปจนกว่าจะสามารถพัฒนามาตรการควบคุมความปลอดภัย (safeguard) ที่ดีมากพอ จึงจะกลับมาทดสอบแบบมีอินเทอร์เน็ตอีกครั้ง จากเดิมที่วิธีการฝึกฝนโมเดลเหล่านี้ใช้การทำบน sandbox ที่ปิดการเข้าถึงอินเทอร์เน็ตอยู่แล้ว แต่โมเดลก็สามารถหาช่องโหว่จนเข้าไปแก้คอนฟิกให้ออกอินเทอร์เน็ตได้ ฉะนั้นแนวทางรับมือจึงต้องตัดให้ขาดไปเลย&lt;/p&gt;
&lt;p&gt;&lt;img src="https://feeds.llun.dev/media/e11881aaeda6f2201b1c863f47b0a5276ff27d49ca27ecb9ba5fa7f5000851c5.jpg" alt="" /&gt;&lt;/p&gt;
&lt;p&gt;เพื่อสร้างพื้นที่ทดสอบแบบไม่มีอินเทอร์เน็ตให้เหมือนจริง OpenAI จะสร้าง Offline World ซึ่งมีเนื้อหาเว็บไซต์จำนวนมากผ่านการจัดเก็บไว้ และโมเดล AI สามารถทดสอบโต้ตอบกับโลกเสมือนนี้ได้มากที่สุดสำหรับการฝึกฝน โดยเพื่อป้องกันโมเดลพยายามหาช่องโหว่ให้ได้เช่นกัน ระบบจะออกแบบมาตั้งแต่ให้ทดสอบใน Sandbox ที่เป็นสภาพแวดล้อมจำกัด เพิ่มการป้องกันหลายชั้นของทรัพยากรที่เรียกว่า microVM ย่อย ทำให้สามารถตรวจจับกิจกรรมที่ผิดปกติได้รวดเร็วขึ้น&lt;/p&gt;
&lt;p&gt;ที่มา: &lt;a href="https://openai.com/index/securing-our-frontier-model-training-environment/"&gt;OpenAI&lt;/a&gt;&lt;/p&gt;</content>
    <source>
      <title>Blognone</title>
      <link rel="self" href="https://www.blognone.com/node/feed"/>
      <link rel="alternate" href="https://www.blognone.com/"/>
    </source>
  </entry>
  <entry>
    <id>urn:uuid:2c12bf4d-d258-5210-8269-a984fc82fc27</id>
    <title>Microsoft Teams บนพีซีเพิ่ม Efficiency Mode สำหรับเครื่องสเปกต่ำ, ปรับปรุงประสิทธิภาพบน Android</title>
    <updated>2026-10-24T06:57:44.000Z</updated>
    <author>
      <name>mk</name>
    </author>
    <published>2026-10-24T06:57:44.000Z</published>
    <link rel="alternate" href="https://www.blognone.com/node/152001"/>
    <category term="Thai"/>
    <content type="html">&lt;p&gt;ทีมพัฒนา Microsoft Teams ออกมาเล่าเบื้องหลังการปรับปรุง Teams ให้ทำงานเร็วขึ้น กินทรัพยากรน้อยลง บนแพลตฟอร์มต่างๆ ดังนี้&lt;/p&gt;
&lt;p&gt;พีซี (Windows &amp;amp; macOS)&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;เพิ่ม Efficiency Mode สำหรับเครื่องทรัพยากรต่ำ ซีพียูรุ่นเก่า แรม 8GB หรือต่ำกว่า ปรับปรุงให้โหมดนี้ทำงานตอบสนองดีขึ้น 20% บนเครื่องทรัพยากรต่ำ, มีฟีเจอร์ปรับความละเอียดของวิดีโอลงอัตโนมัติเพื่อลดพลังซีพียู และรักษาการประมวลผลเสียงไม่ให้กระตุก&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Android&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;สร้างชุดทดสอบ  App Responsiveness Index (ARI) ตรวจสอบจากวิดีโอการใช้งานแอพว่ากระตุกตรงไหน เพื่อค้นหาสาเหตุของปัญหา และพบว่าส่วนใหญ่ 60–65% เกิดจากหน่วยความจำ&lt;/li&gt;
&lt;li&gt;หลังจากนั้นไมโครซอฟท์ลงมือแก้ปัญหาหน่วยความจำหลายอย่าง จนแก้ปัญหาเรื่องเฟรมทำงานช้าลงได้ 40%  จากปีก่อน, ลดปัญหา garbage-collection ทำงานจนแอพกระตุกลงได้ 23%&lt;/li&gt;
&lt;li&gt;แก้ปัญหาเรื่องภาพ thumbnail ในแชทโผล่ไม่ทันการเลื่อนจอ โดยปรับปรุงให้โหลดเร็วขึ้น 17%&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;บล็อกต้นทางอธิบายวิธีการตรวจสอบปัญหา การวัดผล และการหาวิธีแก้ไข แนะนำสำหรับคนทำงานสาย product/engineering ครับ&lt;/p&gt;
&lt;p&gt;ที่มา - &lt;a href="https://techcommunity.microsoft.com/blog/microsoftteamsblog/making-microsoft-teams-more-responsive-reliable-and-ready-for-work/4564205"&gt;Microsoft&lt;/a&gt;&lt;/p&gt;</content>
    <source>
      <title>Blognone</title>
      <link rel="self" href="https://www.blognone.com/node/feed"/>
      <link rel="alternate" href="https://www.blognone.com/"/>
    </source>
  </entry>
  <entry>
    <id>urn:uuid:2e209635-a259-5437-aa0d-d16defa6a400</id>
    <title>Moonshot AI เปิดตัว Kimi K3.1 Pro ผลทดสอบใกล้เคียง Opus 5.5 ราคาถูกกว่า K3 30%</title>
    <updated>2026-10-24T04:29:56.000Z</updated>
    <author>
      <name>lew</name>
    </author>
    <published>2026-10-24T04:29:56.000Z</published>
    <link rel="alternate" href="https://www.blognone.com/node/152000"/>
    <category term="Thai"/>
    <content type="html">&lt;p&gt;Moonshot AI ผู้สร้างโมเดลปัญญาประดิษฐ์ในตระกูล Kimi เปิดตัว Kimi K3.1 Pro โดยผลทดสอบหลายชุดแสดงให้เห็นว่าความสามารถของโมเดลใหม่นี้ใกล้เคียงหรือเอาชนะ Claude Opus 5.5 ได้เลยทีเดียว ขณะที่ต้นทุนการทำงานรวมถูกกว่ามาก&lt;/p&gt;
&lt;p&gt;ทาง Moonshot จะปล่อยค่า weights ของ Kimi K3.1 Pro ในวันที่ 4 พฤศจิกายนนี้ โดยตอนนี้ระบุเพียงว่าโมเดลมีขนาดรวม 3T โดยโมเดลรุ่นที่ปล่อยนี้จะไม่ได้ฝึกความสามารถการโจมตีไซเบอร์เอาไว้ ทำให้ความสามารถลดลงกว่าที่ทีมงานสามารถฝึกโมเดลได้จริง แต่ยังสามารถใช้งานฝั่งการป้องกันภัยไซเบอร์ได้&lt;/p&gt;
&lt;p&gt;โมเดลเริ่มปล่อยให้ใช้งานบนเว็บ Kimi.ai แล้ววันนี้ ค่า API อยู่ที่ 2/10 ดอลลาร์ต่อล้านโทเค็น ถูกกว่า Claude Opus 5.5 ประมาณครึ่งหนึ่ง และยังมีรุ่น Highspeed ที่ความเร็วเพิ่มขึ้น 2-3 เท่าตัว แต่ราคาแพงขึ้น 2 เท่าให้เลือก&lt;/p&gt;
&lt;p&gt;ที่มา - &lt;a href="https://www.kimi.ai/blog/kimi-k3-1-pro"&gt;Kimi.ai&lt;/a&gt;&lt;/p&gt;</content>
    <source>
      <title>Blognone</title>
      <link rel="self" href="https://www.blognone.com/node/feed"/>
      <link rel="alternate" href="https://www.blognone.com/"/>
    </source>
  </entry>
  <entry>
    <id>urn:uuid:2ee42d03-97b1-5eaa-82bb-69b080a323d3</id>
    <title>จดบันทึกการอ่านเรื่อง How the Claude Code team does code review</title>
    <updated>2026-10-23T16:00:40.000Z</updated>
    <author>
      <name>somkiat</name>
    </author>
    <published>2026-10-23T16:00:40.000Z</published>
    <link rel="alternate" href="https://www.somkiat.cc/note-how-the-claude-code-team-does-code-review/"/>
    <category term="Thai"/>
    <content type="html">&lt;p&gt;&lt;img width="150" height="150" src="https://feeds.llun.dev/media/8a8916694e5872899a5516bdbd023e68822aa6e69fd6268cfa60e97b63a4ec4a.webp" alt="" loading="lazy" srcset="https://feeds.llun.dev/media/8a8916694e5872899a5516bdbd023e68822aa6e69fd6268cfa60e97b63a4ec4a.webp 150w, https://feeds.llun.dev/media/5aa410701f4f0a012f7cd097d5c6c89953439e9d70932b8f2e23a522091d0055.webp 75w" /&gt;&lt;/p&gt;
&lt;figure&gt;&lt;a href="https://www.somkiat.cc/wp-content/uploads/2026/10/claude-review-code-01.webp.webp"&gt;&lt;img src="https://feeds.llun.dev/media/1a6d5c373cffc828633a90db86a5c13b475d254c8c1961c38b602b03b9751ebc.webp" alt="" /&gt;&lt;/a&gt;&lt;/figure&gt;



&lt;p&gt;จากบทความเรื่อง &lt;strong&gt;&lt;a href="https://claude.dev/blog/solving-code-review-at-anthropic/" target="_blank"&gt;How the Claude Code team does code review&lt;/a&gt;&lt;/strong&gt;&lt;br /&gt;อธิบายว่าทีมพัฒนา Claude code ของ Anthropic ทำการ review code อย่างไร&lt;br /&gt;มีแนวคิด และ ขั้นตอนการ review code ที่น่าสนใจอย่างไรบ้าง&lt;br /&gt;ในโลกของ code จำนวนมากที่ถูกสร้างหรือ generate มาจาก AI Agent&lt;br /&gt;ซึ่ง code จำนวน 90% ถูก generate ของมาจาก AI Agent&lt;br /&gt;โดยทีมมีเป้าหมายเพื่อลด effort ของคนในการ review ลงไป&lt;br /&gt;และลดความผิดพลาดต่าง ๆ ของ code ลงไปอีกด้วย&lt;br /&gt;มาดูกันว่าทำอย่างไรกัน ?&lt;/p&gt;



&lt;span&gt;&lt;/span&gt;



&lt;p&gt;&lt;strong&gt;เริ่มที่เป้าหมายของการทำ code review ก่อน&lt;/strong&gt;&lt;/p&gt;



&lt;p&gt;ซึ่งประกอบไปด้วย 2 เรื่องคือ&lt;/p&gt;



&lt;ul&gt;
&lt;li&gt;ทำการหาและแก้ไขปัญหาต่าง ๆ ก่อนส่งมอบ&lt;/li&gt;



&lt;li&gt;ทำการ share ความรู้ต่าง ๆ ให้กับคนในทีม (จะได้ไม่เกิดปัญหาเรื่อง strong ownership)&lt;/li&gt;
&lt;/ul&gt;



&lt;p&gt;จากบทความนี้จะเน้นที่ข้อแรกก่อน&lt;br /&gt;คือการหาและแก้ไขปัญหา&lt;/p&gt;



&lt;p&gt;&lt;strong&gt;&lt;em&gt;คำถามที่น่าสนใจคือ "did a human read the code ?"&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;



&lt;p&gt;ถ้าเกิดปัญหาขึ้นมาจะทำการตรวจสอบอย่างไร ?&lt;br /&gt;ใช้คน หรือ automation ?&lt;br /&gt;อะไรคือสิ่งที่เหมาะสมที่สุด ?&lt;/p&gt;



&lt;p&gt;จากคำถามและปัญหาเหล่านี้นั้น&lt;br /&gt;จากเป็นขั้นตอนการทำงานแบบเดิม การ review code จะเกิดขึ้นก็ต่อเมื่อ&lt;br /&gt;นักพัฒนาทำการ code เสร็จ&lt;br /&gt;จากนั้นทำการเปิด PR&lt;br /&gt;และรอเพื่อร่วมงานหรือคน review มาทำการ approve ต่อไป !!&lt;/p&gt;



&lt;p&gt;&lt;strong&gt;ในปัจจุบันมันไม่ได้ทำตามขั้นตอนแบบนี้แล้ว&lt;/strong&gt;&lt;br /&gt;แต่กลับเป็นการทำงานเหมือน spell checking หรือ check syntax ของ code เลย&lt;br /&gt;นั่นคือการทำงานแบบ near real time หรือ fast feedback&lt;br /&gt;โดย code จะถูกสร้าง review และ แก้ไขจาก Claude ไปเลย (AI Agent)&lt;br /&gt;ก่อนที่จะส่งมาให้คนทำการ review อีกที&lt;br /&gt;ส่งผลให้คนทำงาน ไม่ต้องมาดูปัญหาในระดับ low level อีกแล้ว&lt;br /&gt;ให้ไปดูในระดับ high level แทนได้เลย&lt;br /&gt;เช่นเรื่องของ business, architecture และ security เป็นต้น&lt;/p&gt;



&lt;p&gt;&lt;strong&gt;&lt;em&gt;ดังนั้นงานอะไรที่ automation ได้ก็ทำไป&lt;br /&gt;ส่วนที่เหลือค่อยส่งมาให้คนทำหรือแก้ไขนั่นเอง&lt;br /&gt;และคนในทีมก็ได้เจอปัญหาหรือความท้าทายใหม่ ๆ ในทุก ๆ วันอีกด้วย&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;



&lt;p&gt;&lt;strong&gt;ในการวัดผลว่าทำงานได้ดีหรือเทียบเท่าคนไหมนั้น&lt;/strong&gt;&lt;br /&gt;ใช้อัตราการ revert หรือยกเลิก PR นั้น ๆ  หรือ การ comment และ รอ approve&lt;br /&gt;มาใช้ในการวัดผลและตัดสินใจว่า ดีขึ้นหรือไม่ ?&lt;br /&gt;ถ้าอัตราหรือเวลาเหล่านี้มันเยอะขึ้น &lt;br /&gt;แสดงว่าเราแค่เปลี่ยนคนทำงานเท่านั้น ไม่ได้ปรับปรุงอะไรเลย&lt;br /&gt;ความเร็วต้องมาพร้อมกับคุณภาพที่สูงด้วยเช่นกัน&lt;/p&gt;



&lt;p&gt;&lt;strong&gt;สิ่งที่น่าสนใจมาก ๆ ในบทความนี้คือ The Life of Change&lt;/strong&gt;&lt;/p&gt;



&lt;p&gt;เริ่มตั้งแต่การแก้ไข code ในเครื่องของแต่ละคน&lt;br /&gt;ไปจนถึงการส่งมอบขึ้น production&lt;br /&gt;จะมีการทำงานเป็นขั้นตอนต่าง ๆ ดังนี้&lt;/p&gt;



&lt;ul&gt;
&lt;li&gt;ก่อนที่จะเปิด PR ได้ ต้องทำการ verify ก่อน เช่น Claude ทำการ run test, build และ linting ให้ผ่านก่อน จากนั้นจะมี Agent อีกตัวทำการ review code ในส่วนที่เปลี่ยนแปลง ซึ่งจะทำการกำหนด rule ต่าง ๆ ไว้ในไฟล์ CLAUDE.md และ REVIEW.md&lt;/li&gt;



&lt;li&gt;เมื่อทำการเปิด PR มาแล้ว ในแต่ละ PR จะถูกดึงมาเข้า CI pipeline เพื่อทำการ build, packaging, linting และ test ใน platform ต่าง ๆ&lt;/li&gt;



&lt;li&gt;เมื่อผ่านแล้ว จะใช้ Claude code review ซึ่งเป็น Agent หลาย ๆ ตัวทำงานพร้อม ๆ กัน เพื่อหา bug และ verify หรือ vote ว่า bug ที่เจอเป็นอย่างไร รวมทั้งจัดลำดับความร้ายแรงของ bug ด้วย (/code-review)&lt;/li&gt;



&lt;li&gt;ต่อมาก็ทำ security review !! (/security-review)&lt;/li&gt;



&lt;li&gt;ทำการ approve ซึ่งมีการแบ่งกลุ่มของงานเพื่อทำการ approve ต่างกันไปอีกด้วย ทั้งไม่ต้องใช้คน หรือ ใช้คน 1 หรือ 2 คน (low -&amp;gt; medium -&amp;gt; high)&lt;/li&gt;



&lt;li&gt;เมื่อผ่านมาแล้วก็ทำการโยนเข้า queue เพื่อ merge ต่อไป &lt;/li&gt;



&lt;li&gt;เมื่อทำการ merge เสร็จแล้ว จะมีการใช้งานภายใน หรือ internal use ของพนักงานทุก ๆ คนนั่นเอง (eat your own dog food) ซึ่งเป็นคนกลุ่มแรกที่ได้ใช้งาน (จะมีการทำ feature flag ไว้ใช้เปิดปิด feature ต่าง ๆ)&lt;/li&gt;



&lt;li&gt;สุดท้ายก็ทำการ release ต่อไป&lt;/li&gt;
&lt;/ul&gt;



&lt;p&gt;แสดงการทำงานดังรูป&lt;/p&gt;



&lt;figure&gt;&lt;a href="https://www.somkiat.cc/wp-content/uploads/2026/10/code-review-layers.png"&gt;&lt;img src="https://feeds.llun.dev/media/d5f30a09b1dded022eb24f91388c20334e9c95347d4338ef4888335509ea11c6.png" alt="" /&gt;&lt;/a&gt;&lt;/figure&gt;



&lt;p&gt;&lt;strong&gt;สิ่งที่น่าสนใจคือ การปรับปรุงกระบวนการ review อย่างต่อเนื่อง&lt;/strong&gt;&lt;/p&gt;



&lt;p&gt;&lt;strong&gt;&lt;em&gt;"Our code review process is constantly improving in a loop"&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;



&lt;p&gt;ตัวอย่างที่ยกมาคือ &lt;br /&gt;ทุก ๆ  incident หรือปัญหาบน production จะถูก eval เสมอ&lt;br /&gt;โดยจะนำข้อมูลของ PR ที่ผ่านมา มาใช้ในการตัดสินใจด้วยว่า&lt;br /&gt;incident เหล่านั้นจะต้องทำการแก้ไข หรือ ว่า revert ตาม PR ต่าง ๆ ไปเลย&lt;br /&gt;ดังนั้นทุก ๆ  incident มันคือการสร้างองค์ความรู้เพิ่มเติมอย่างต่อเนื่อง&lt;br /&gt;มีขั้นตอนการทำงานดังรูป&lt;/p&gt;



&lt;figure&gt;&lt;a href="https://www.somkiat.cc/wp-content/uploads/2026/10/code-review-incident-eval.png"&gt;&lt;img src="https://feeds.llun.dev/media/07cf6a0e8cd7d16a41ce30c844d07d07381f8724e423c81dc57c74afeeaaeea0.png" alt="" /&gt;&lt;/a&gt;&lt;/figure&gt;



&lt;p&gt;อีกทั้งยังมีการวัดข้อมูลที่เป็น noise เช่นการแจ้งเตือน bug ที่ไม่จำเป็น&lt;br /&gt;เพราะว่าจะทำให้เสียเวลาในการ review อย่างมาก&lt;br /&gt;เนื่องจากการหา bug นั้นง่ายมาก ๆ แต่มัน&lt;strong&gt;คือ bug จริง ๆ หรือไม่ ?&lt;/strong&gt;&lt;br /&gt;ตรงนี้เป็นสิ่งที่สำคัญมาก ๆ&lt;br /&gt;ดังนั้นจะมีการตรวจสอบเรื่องนี้เสมอ&lt;br /&gt;ยกตัวอย่าง ดูจากการ comment ของคน review ต่อ bug ต่าง ๆ ว่าเป็นอย่างไร&lt;br /&gt;เช่นต้องทำการแก้ไข&lt;br /&gt;เช่นมีการโต้แย้งว่าไม่ใช่ bug&lt;br /&gt;เช่นบอกว่าข้ามไปได้เลย&lt;br /&gt;จะช่วยลดการ review ลงไปอย่างมาก&lt;/p&gt;



&lt;p&gt;&lt;strong&gt;ขั้นตอนการทำงานยังคงมีคนในเสมอ (Human in the Loop)&lt;/strong&gt;&lt;/p&gt;



&lt;p&gt;โดยงานส่วนใหญ่จะเป็นแบบ automation ทั้งนั้น&lt;br /&gt;การจะให้คนมาแก้ไขสิ่งต่าง ๆ ที่ไม่จำเป็นหรือสำคัญ มันเปลืองมาก ๆ&lt;br /&gt;ดังนั้นควรใช้คนทำงานที่สำคัญ ๆ เท่านั้น ดังนี้&lt;/p&gt;



&lt;ul&gt;
&lt;li&gt;การตัดสินใจว่าจะสร้างอะไร ทั้ง direction, taste และ scope ของงาน&lt;/li&gt;



&lt;li&gt;ทำการ review code ที่มีความเสี่ยงสูง ๆ เช่นเรื่องของ billing, auto update และ pipeline ของระบบ CI เป็นต้น&lt;/li&gt;



&lt;li&gt;ทำการ review architecture ของระบบ&lt;/li&gt;



&lt;li&gt;การตรวจสอบผลต่าง ๆ อย่างละเอียด ต้องระบุให้ได้ว่า การ review นั้นผิดพลาดจากอะไรบ้าง ทำการ review อย่างไร ด้วยคำสั่งหรือเครื่องมืออะไร ผลเป็นอย่างไร ถ้าไม่รู้เรื่องเหล่านี้ จำเป็นต้องกลับมาก review จริง ๆ ด้วยคน&lt;/li&gt;



&lt;li&gt;คนต้องรับผิดชอบต่อผลลัพธ์ที่ออกมาเสมอ ไม่ว่าใครจะเป็นคนสร้างสิ่งนั้นขึ้นมาก็ตาม&lt;/li&gt;
&lt;/ul&gt;



&lt;p&gt;&lt;strong&gt;และยังมีคำแนะนำสำหรับการ change หรือการเปลี่ยนแปลงต่าง ๆ ดังนี้&lt;/strong&gt;&lt;/p&gt;



&lt;ul&gt;
&lt;li&gt;มีขนาดที่เล็ก ซึ่งทำให้ง่ายต่อการ review (เล็กอย่างไรต้องพูดคุยกัน)&lt;/li&gt;



&lt;li&gt;ทุก ๆ การเปลี่ยนแปลงต้องสามารถย้อนกลับ หรือ revert ได้เสมอ ได้ในไม่กี่นาที เช่นการใช้ flag หรือ feature flag นั่นเอง&lt;/li&gt;



&lt;li&gt;Code ที่มีความสำคัญหรือความเสี่ยงสูง จำเป้นต้องใช้คนเยอะขึ้นและมีขั้นตอนในการตรวจสอบมากยิ่งขึ้นเสมอ&lt;/li&gt;



&lt;li&gt;ระบบมี &lt;strong&gt;feedback loop ที่รวดเร็ว&lt;/strong&gt; เพื่อทำให้แก้ไขได้อย่างรวดเร็ว และลดความเสี่ยงต่าง ๆ ของผู้ใช้ลงไป เช่น internal use (ใช้งานภายในก่อน)&lt;/li&gt;



&lt;li&gt;&lt;strong&gt;"Ownership is also shared"&lt;/strong&gt; ตรงนี้สำคัญมาก ๆ มีช่องทางให้คนต่าง ๆ ทั้งในทีมและนอกทีม รู้ว่าแต่ละคนกำลังทำอะไร สร้างอะไร เพื่อ share knowledge และคุณภาพต่าง ๆ ของ code ในระบบงาน โดยที่ไม่ต้องมาตรวจสอบคุณภาพในช่วงท้ายที่ช้ามาก ๆ&lt;/li&gt;
&lt;/ul&gt;



&lt;p&gt;ลองอ่านในรายละเอียดเพิ่มเติมได้ครับ&lt;br /&gt;มีหลาย ๆ เรื่องที่น่าสนใจ ลองศึกษาและนำมาประยุกต์ใช้งานกันดู&lt;/p&gt;



&lt;p&gt;&lt;br /&gt;&lt;/p&gt;



&lt;p&gt;&lt;/p&gt;
</content>
    <source>
      <title>cc :: somkiat</title>
      <link rel="self" href="https://www.somkiat.cc/feed/"/>
      <link rel="alternate" href="https://www.somkiat.cc"/>
    </source>
  </entry>
  <entry>
    <id>urn:uuid:92fd8cc0-a026-5ebc-98c2-9a9127ff5f8e</id>
    <title>ไต้หวันไม่อนุมัติดีล Grab ซื้อกิจการ Foodpanda ในไต้หวัน หลังยื่นข้อเสนอ 600 ล้านดอลลาร์ ในเดือนมีนาคม</title>
    <updated>2026-10-23T13:50:55.000Z</updated>
    <author>
      <name>arjin</name>
    </author>
    <published>2026-10-23T13:50:55.000Z</published>
    <link rel="alternate" href="https://www.blognone.com/node/151999"/>
    <category term="Thai"/>
    <content type="html">&lt;p&gt;คณะกรรมการการค้าของไต้หวันออกคำสั่งขัดขวางไม่ให้ Grab ซื้อกิจการ Foodpanda ในไต้หวัน โดยให้เหตุผลเกี่ยวกับการแข่งขันในตลาด หลังจาก Grab &lt;a href="https://www.blognone.com/node/150094"&gt;ประกาศแผนซื้อกิจการเมื่อเดือนมีนาคม&lt;/a&gt; ด้วยมูลค่า 600 ล้านดอลลาร์&lt;/p&gt;
&lt;p&gt;คณะกรรมการฯ ให้เหตุผลว่าผลกระทบด้านการแข่งขันในตลาดหากดีลนี้เกิดขึ้น จะส่งผลเสียมากกว่าประโยชน์สำหรับภาพรวมของตลาด เรื่องนี้ต้อง&lt;a href="https://www.blognone.com/node/143831"&gt;ย้อนไปในปี 2024&lt;/a&gt; ที่ Uber เคยประกาศซื้อกิจการ Foodpanda ในไต้หวันเหมือนกัน และถูกคณะกรรมการฯ ออกคำสั่งขัดขวาง แต่กรณี Uber นั้นให้บริการในไต้หวันอยู่แล้ว หากรวมกิจการกันจะทำให้มีส่วนแบ่งตลาดมากกว่า 90% จึงมองเป็นเรื่องผูกขาดได้ ขณะที่ Grab ไม่ได้ให้บริการในไต้หวันมาก่อน&lt;/p&gt;
&lt;p&gt;Grab ออกแถลงการณ์แสดงความผิดหวังต่อการตัดสินดังกล่าว โดยบอกว่าธุรกิจหลักของบริษัทอยู่ในภูมิภาคเอเชียตะวันออกเฉียงใต้ โดยยังคงโฟกัสตลาดนี้ต่อไป ส่วน Delivery Hero ที่เป็นเจ้าของ Foodpanda บอกว่าถึงแม้ดีลจะไม่เกิดขึ้น บริษัทก็จะได้รับเงินตามข้อตกลงในส่วนที่เกี่ยวกับการซื้อขายกิจการไม่สำเร็จ (break fee)&lt;/p&gt;
&lt;p&gt;ข้อมูลเปิดเผย: LINE MAN Wongnai เป็นบริษัทแม่ของ Blognone&lt;/p&gt;
&lt;p&gt;ที่มา: &lt;a href="https://www.reuters.com/world/asia-pacific/taiwan-regulator-blocks-grabs-purchase-foodpanda-delivery-business-taiwan-2026-10-21/"&gt;Reuters&lt;/a&gt;&lt;/p&gt;</content>
    <source>
      <title>Blognone</title>
      <link rel="self" href="https://www.blognone.com/node/feed"/>
      <link rel="alternate" href="https://www.blognone.com/"/>
    </source>
  </entry>
  <entry>
    <id>urn:uuid:615f0ec0-a89c-5cbf-8c8e-291a938c66bf</id>
    <title>แนวทางการแก้ไขปัญหา PHP2Shell เบื้องต้น</title>
    <updated>2026-10-22T08:16:59.000Z</updated>
    <author>
      <name>somkiat</name>
    </author>
    <published>2026-10-22T08:16:59.000Z</published>
    <link rel="alternate" href="https://www.somkiat.cc/php2shell-mitigation/"/>
    <category term="Thai"/>
    <content type="html">&lt;p&gt;&lt;img width="150" height="150" src="https://feeds.llun.dev/media/b289d81238558f820ef55075ad4a5bba88b4822c8f6098f0685afad7b526d9ee.jpg" alt="" loading="lazy" srcset="https://feeds.llun.dev/media/b289d81238558f820ef55075ad4a5bba88b4822c8f6098f0685afad7b526d9ee.jpg 150w, https://feeds.llun.dev/media/b36322599acb86977f36c0ca50c2b9cb7172fa523ac98c7a630bfa2a0dad41af.jpg 75w" /&gt;&lt;/p&gt;
&lt;figure&gt;&lt;a href="https://www.somkiat.cc/wp-content/uploads/2026/10/php2shell-01.jpg"&gt;&lt;img src="https://feeds.llun.dev/media/0eec5d82946667f2bb96110ee68f0b1dad39585747723587cfebcd65d613c5b8.jpg" alt="" /&gt;&lt;/a&gt;&lt;/figure&gt;



&lt;p&gt;จากปัญหาเรื่อง &lt;strong&gt;&lt;a href="https://www.php2shell.com/" target="_blank"&gt;PHP2Shell&lt;/a&gt;&lt;/strong&gt; นั้น ซึ่งส่งผลกระทบต่อ web จำนวนมากนั้น&lt;br /&gt;มีคำแนะนำให้แก้ไขทั้งการ upgrade PHP ไปยัง version ที่ทำการแก้ไขแล้ว&lt;br /&gt;สามารถทำการ update ได้เลยจาก &lt;a href="https://www.php.net/archive/2026.php#2026-10-21-5" target="_blank"&gt;official website&lt;/a&gt;&lt;br /&gt;แต่ถ้าไม่สามารถ upgrade ได้นั้น&lt;br /&gt;สามารถ&lt;a href="https://www.php2shell.com/#upgrade-php" target="_blank"&gt;แก้ไข config&lt;/a&gt; เฉพาะหน้าได้ก่อน ดังนี้&lt;/p&gt;



&lt;span&gt;&lt;/span&gt;



&lt;p&gt;สิ่งที่ต้อง config เพื่อแก้ไขหรือลดปัญหาลงไป มีดังนี้&lt;/p&gt;



&lt;ul&gt;
&lt;li&gt;memory_limit สามารถทำการปิดได้เลย หรือกำหนดค่าเป็น memory_limit=-1 และอย่าใช้งาน &lt;strong&gt;&lt;code&gt;RLIMIT_AS&lt;/code&gt; หรือ &lt;code&gt;RLIMIT_DATA&lt;/code&gt;&lt;/strong&gt; และอย่าลืมปิด session.upload_progress.enabled = off หรือ 0 ด้วย และ post_max_size ให้ต่ำ ๆ&lt;/li&gt;



&lt;li&gt;แต่ถ้ามีพวก nginx server คั่น request ก่อนเข้าทำงานใน PHP สามารถทำการเปิกใช้งาน memory_limit ตามที่ต้องการ และกำหนด limit ของขนาด request ใน nginx server ได้ผ่านการ config เช่น client_max_body_size 2M; รวมทั้งการกำหนด buffer ต่าง ๆ ได้เลย เพื่อจัดการ chunk ต่าง ๆ เช่น client_body_buffer_size, client_header_buffer_size และ large_client_header_buffers เป็นต้น&lt;/li&gt;



&lt;li&gt;ถ้าใช้ PHP-FPM แล้วให้กำหนดค่า pm.max_requests  ให้ต่ำ ๆ เช่น 500 เป็นต้น เพื่อให้สร้าง worker ใหม่มารับ request ลดการ reuse worker นั่นเอง&lt;/li&gt;



&lt;li&gt;ทำการปิด PHP error display ด้วย display_errors=0 และ fatal_error_backtraces=0 เพื่อไม่เปิดเผยข้อมูลของ server&lt;/li&gt;



&lt;li&gt;ตั้ง policy ให้ worker ไม่ไป execute program อื่น ๆ &lt;/li&gt;
&lt;/ul&gt;



&lt;p&gt;เมื่อแก้ไข config แล้วอย่าลืมตรวจสอบว่าระบบงานทำงานได้และถูกต้องหรือไม่ด้วยเสมอ&lt;/p&gt;



&lt;p&gt;&lt;strong&gt;Reference websites&lt;/strong&gt;&lt;/p&gt;



&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.php2shell.com/"&gt;https://www.php2shell.com/&lt;/a&gt;&lt;/li&gt;



&lt;li&gt;&lt;a href="https://calif.io/php2shell/"&gt;https://calif.io/php2shell/&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;



&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
</content>
    <source>
      <title>cc :: somkiat</title>
      <link rel="self" href="https://www.somkiat.cc/feed/"/>
      <link rel="alternate" href="https://www.somkiat.cc"/>
    </source>
  </entry>
  <entry>
    <id>urn:uuid:d0a72f6d-3c80-5bd2-8e87-30d0b732ee41</id>
    <title>บันทึกรูปแบบของปัญหา context ที่ไม่ดี จากหนังสือ Context Engineering with DSPy</title>
    <updated>2026-10-19T17:07:12.000Z</updated>
    <author>
      <name>somkiat</name>
    </author>
    <published>2026-10-19T17:07:12.000Z</published>
    <link rel="alternate" href="https://www.somkiat.cc/problems-with-context-engineering/"/>
    <category term="Thai"/>
    <content type="html">&lt;p&gt;&lt;img width="150" height="150" src="https://feeds.llun.dev/media/be4462e832a97dec2093c2708b80ffa71d5900b681f97788040be244d4c04dfa.jpg" alt="" loading="lazy" srcset="https://feeds.llun.dev/media/be4462e832a97dec2093c2708b80ffa71d5900b681f97788040be244d4c04dfa.jpg 150w, https://feeds.llun.dev/media/51e4966daed4f6de2133df16ab11ae0c4957e06545520f84f2d3297cf1189740.jpg 75w" /&gt;&lt;/p&gt;
&lt;figure&gt;&lt;a href="https://www.somkiat.cc/wp-content/uploads/2026/10/context-engineering-fail-01.jpg"&gt;&lt;img src="https://feeds.llun.dev/media/3736425b1b2e56f5c693dbfe6c0e68900d33b38d48936c6261182923e86858ca.jpg" alt="" /&gt;&lt;/a&gt;&lt;/figure&gt;



&lt;p&gt;หลังจากอ่านหนังสือเรื่อง &lt;strong&gt;&lt;a href="https://learning.oreilly.com/library/view/context-engineering-with/0642572261603/" target="_blank"&gt;Context Engineering with DSPy&lt;/a&gt;&lt;/strong&gt; ไปนั้น&lt;br /&gt;มีส่วนที่อธิบายถึงปัญหาต่าง ๆ ของ context ซึ่งมาจากการจัดการที่ไม่ดี&lt;br /&gt;ส่งผลให้การทำงานของ AI Agent ไม่ดี&lt;br /&gt;ดังนั้นเราควรจัดการให้ดี ให้ถูกต้อง ในเวลาที่เหมาะสม&lt;/p&gt;



&lt;p&gt;มาดูกันว่าปัญหาของการจัดการ context ไม่ดีมีอะไรบ้าง ?&lt;br /&gt;และสามารถแก้ไขได้อย่างไร ?&lt;/p&gt;



&lt;span&gt;&lt;/span&gt;



&lt;p&gt;&lt;strong&gt;ปัญหาที่ 1 Context distraction&lt;/strong&gt;&lt;/p&gt;



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



&lt;ul&gt;
&lt;li&gt;ทำการ start session ใหม่ หรือ clear ทิ้งไป&lt;/li&gt;



&lt;li&gt;ทำการยกตัวอย่างที่ไม่ตีกรอบการทำงานแคบเกินไป เพื่อเปิดกว้างในการคิดแบบอื่น ๆ บ้าง&lt;/li&gt;
&lt;/ul&gt;



&lt;p&gt;&lt;strong&gt;ปัญหาที่ 2 Context confusion&lt;/strong&gt;&lt;/p&gt;



&lt;p&gt;ในการทำงานแบบยาว ๆ  หรือ long conversation&lt;br /&gt;มักจะมีข้อมูลเก่า ๆ หรือ ใน history ก่อนหน้า&lt;br /&gt;ส่งผลให้ model นำเอาข้อมูลเหล่านั้นมาใช้งานในการตอบสิ่งต่าง ๆ&lt;br /&gt;ทำให้ผลการทำงานแย่ลงเรื่อย ๆ&lt;br /&gt;ดังนั้นสิ่งที่ควรทำหรือแก้ไข เช่น&lt;/p&gt;



&lt;ul&gt;
&lt;li&gt;เขียน instruction ให้ทำการตอบ หรือ ข้อมูลมีเท่าที่จำเป็น หรือ ให้สั้นกระชับก็พอ&lt;/li&gt;



&lt;li&gt;หรือปิดระบบ memory ของการทำงาน&lt;/li&gt;
&lt;/ul&gt;



&lt;p&gt;&lt;strong&gt;ปัญหาที่ 3 Context neglect&lt;/strong&gt;&lt;/p&gt;



&lt;p&gt;ปัญหานี้จะเป็นการมองข้ามข้อมูลใน context บางส่วนไป&lt;br /&gt;ยกตัวอย่างเช่น &lt;a href="https://arxiv.org/abs/2307.03172" target="_blank"&gt;lost in the middle&lt;/a&gt; เป็นต้น&lt;br /&gt;ดังนั้นถ้าส่วนสำคัญอยู่ตรงกลางของ context&lt;br /&gt;จะส่งผลให้การผลลัพธ์เกิดข้อผิดพลาดได้ง่ายมาก ๆ&lt;br /&gt;ดังนั้นสิ่งที่ควรทำหรือแก้ไขเช่น&lt;/p&gt;



&lt;ul&gt;
&lt;li&gt;จัดการข้อมูลใน context ให้มีเท่าที่จำเป็นในงานนั้น ๆ เท่านั้น&lt;/li&gt;



&lt;li&gt;แยกการทำงานของแต่ละงานตาม session ไปเลย อย่ารวมกัน&lt;/li&gt;



&lt;li&gt;แก้ไขให้ข้อมูลสำคัญอยู่ในช่วงแรก หรือ ช่วงท้ายของ context&lt;/li&gt;
&lt;/ul&gt;



&lt;p&gt;&lt;strong&gt;ปัญหาที่ 4 Context drift&lt;/strong&gt;&lt;/p&gt;



&lt;p&gt;เมื่อการพูดคุยยาวขึ้นเรื่อง ทำให้เกิด context confusion ได้แล้ว&lt;br /&gt;ยังอาจจะทำให้ model ลืมเป้าหมายของการทำงานที่กำหนดไว้ตั้งแต่แรก ๆ ของการพูดคุยได้&lt;br /&gt;หรืออาจจะทำคล้าย ๆ เดิม แต่ละเลยการทำงานตามกฏต่าง ๆ &lt;br /&gt;แน่นอนว่าส่งผลต่อการทำงานอย่างมาก ต้องระวังสุด ๆ&lt;br /&gt;ดังนั้นสิ่งที่ควรทำหรือแก้ไขเช่น&lt;/p&gt;



&lt;ul&gt;
&lt;li&gt;กำหนดกฏต่าง ๆ ไว้ตั้งแต่เริ่ม หรือกำหนดไว้ใน system instruction ไปก็ดีมาก ๆ&lt;/li&gt;



&lt;li&gt;ถ้ามีปัญหาเรื่อง lost in the middle ให้จัดการข้อมูลของกฏไว้ช่วงแรกและท้าย ๆ เสมอ&lt;/li&gt;
&lt;/ul&gt;



&lt;p&gt;&lt;strong&gt;ปัญหาที่ 5 Context clash&lt;/strong&gt;&lt;/p&gt;



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



&lt;p&gt;&lt;strong&gt;ปัญหาที่ 6 Context underspecification&lt;/strong&gt;&lt;/p&gt;



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



&lt;ul&gt;
&lt;li&gt;ลดการเดาด้วยการให้ข้อมูลที่ชัดเจนมากยิ่งขึ้น&lt;/li&gt;



&lt;li&gt;ก่อนจบการทำงานให้ทำการสรุปสิ่งที่สำคัญและจำเป็น จากนั้นนำข้อมูลที่ได้ไปใช้ใน session ใหม่ เพื่อลดปัญหาการเดาลงไป&lt;/li&gt;
&lt;/ul&gt;



&lt;p&gt;จะพบว่าปัญหาที่เกิดจากการบริหารจัดการ context ที่ไม่ดี&lt;br /&gt;ส่งผลต่อการทำงานของ model มาก ๆ&lt;br /&gt;ลองปรับปรุงและดูผลครับ&lt;/p&gt;



&lt;p&gt;&lt;strong&gt;Reference websites&lt;/strong&gt;&lt;/p&gt;



&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.dbreunig.com/2025/06/22/how-contexts-fail-and-how-to-fix-them.html" target="_blank"&gt;How Long Contexts Fail&lt;/a&gt;&lt;/li&gt;



&lt;li&gt;&lt;a href="https://www.dbreunig.com/2025/06/26/how-to-fix-your-context.html" target="_blank"&gt;How to Fix Your Context&lt;/a&gt;&lt;/li&gt;



&lt;li&gt;&lt;a href="https://arxiv.org/abs/2307.03172" target="_blank"&gt;Lost in the Middle: How Language Models Use Long Contexts&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;



&lt;p&gt;&lt;/p&gt;
</content>
    <source>
      <title>cc :: somkiat</title>
      <link rel="self" href="https://www.somkiat.cc/feed/"/>
      <link rel="alternate" href="https://www.somkiat.cc"/>
    </source>
  </entry>
  <entry>
    <id>urn:uuid:30f92dde-1901-5302-813c-02e7365ce609</id>
    <title>anndoodle : draw a transparent doodle widget on your home screen</title>
    <updated>2026-10-16T17:58:42.000Z</updated>
    <author>
      <name>iannnnn</name>
    </author>
    <published>2026-10-16T17:58:42.000Z</published>
    <link rel="alternate" href="https://iannnnn.com/2026/3490"/>
    <category term="Thai"/>
    <content type="html">&lt;figure&gt;&lt;img width="1024" height="768" src="https://feeds.llun.dev/media/f3a464d663c6210ccd7c8321a41d095110aad2e4bbca2b954163815126696e6f.webp" alt="" srcset="https://feeds.llun.dev/media/f3a464d663c6210ccd7c8321a41d095110aad2e4bbca2b954163815126696e6f.webp 1024w, https://feeds.llun.dev/media/f654a6c3ccd5eee7a9a9b2ca3bbe43551c3cc67feb15abb93cbdd965f6a6e94c.webp 300w, https://feeds.llun.dev/media/8e35521a9f6bab90bcfb5d482538f25dd7c2fb05a087ada20efdcc4c3f059e28.webp 768w, https://feeds.llun.dev/media/9fecb659250ef740890801cbda37b06cfbc772c138871632c30bebc3ea8cf944.webp 1536w, https://feeds.llun.dev/media/14009a48fce2888880944db9d7e86a50b76afdcb89efa93c42f24010e60be0b1.webp 1600w" /&gt;&lt;/figure&gt;



&lt;p&gt;จาก&lt;a href="https://iannnnn.com/2026/3486"&gt;บล็อกก่อนหน้า &lt;/a&gt;ที่ผมทำแอปง่ายๆ ไว้วาด widget พื้นหลังใส ไว้โน้ตอะไรด่วนๆ บนหน้า home screen ของมือถือ (แน่นอนว่าของดีแบบนี้ต้องแอนดรอยด์เท่านั้น)&lt;/p&gt;



&lt;p&gt;พอดีทำเสร็จแล้วไปนอน นอนไปก็คิดไปว่าเอ๊ มันขาดอะไรน้าาาา&lt;/p&gt;



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



&lt;figure&gt;&lt;img width="1024" height="683" src="https://feeds.llun.dev/media/e60b8673d9ee467677672ecddd4c6c3bc4f3f1703dc588876e98aacef5e38227.webp" alt="" srcset="https://feeds.llun.dev/media/e60b8673d9ee467677672ecddd4c6c3bc4f3f1703dc588876e98aacef5e38227.webp 1024w, https://feeds.llun.dev/media/da83529c71c861e59d80e48deecccf0b40c914220f8ebc2fc3994f995ecbee91.webp 300w, https://feeds.llun.dev/media/abfefaade7a6022412ae7a55196bbf0979cde0da192fe66274c03668515328eb.webp 768w, https://feeds.llun.dev/media/66b54a2974a919b9ede03915e0a054a7d30c46d507a33352b03db70066aa13a0.webp 1536w, https://feeds.llun.dev/media/a7840b97e49b8caf15ddc4b123e64fb7d1b0ca22f0b7f19b282cfc7355f64ac1.webp 1600w" /&gt;&lt;/figure&gt;



&lt;p&gt;&lt;a href="https://iannnnn.github.io/anndoodle/" target="_blank"&gt;ดาวน์โหลดที่ iannnnn.github.io/anndoodle/&lt;/a&gt;&lt;/p&gt;



&lt;p&gt;ป.ล. (ก๊อปอันเดิมมา) เนื่องจากผมไม่ได้เป็นผู้พัฒนาแอปมืออาชีพ ใครโหลดไปกดติดตั้งแล้วมันไม่ให้ลง (ติด Android Auto Blocker) ก็มีวิธีแก้โดย&lt;a href="https://www.youtube.com/watch?v=FpJhFoXnPWk" target="_blank"&gt;ทำตามคลิปนี้&lt;/a&gt;ครับ&lt;/p&gt;</content>
    <source>
      <title>iannnnn.com</title>
      <link rel="self" href="https://iannnnn.com/feed"/>
      <link rel="alternate" href="https://iannnnn.com"/>
    </source>
  </entry>
  <entry>
    <id>urn:uuid:cdd29852-f93c-5e04-ae5b-e1cc33657aba</id>
    <title>0264 | run nemotron-3.5-bolt on dgx spark</title>
    <updated>2026-10-16T16:38:17.000Z</updated>
    <author>
      <name>icez</name>
    </author>
    <published>2026-10-16T16:38:17.000Z</published>
    <link rel="alternate" href="https://www.icez.net/blog/167578/0264-run-nemotron-3-5-bolt-on-dgx-spark"/>
    <category term="Thai"/>
    <content type="html">&lt;p&gt;Dockerfile&lt;/p&gt;



&lt;pre&gt;&lt;code&gt;# vLLM nightly pinned by the Nemotron 3.5 Bolt 24GB model card + b12x 2-bit kernels (Blackwell SM120/SM121)
FROM vllm/vllm-openai:nightly-77154ca6116ae34cbfe314beef1016bde9b63989
RUN pip install --no-cache-dir b12x &amp;amp;&amp;amp; (vllm download-kernels || echo "download-kernels deferred to runtime")
&lt;/code&gt;&lt;/pre&gt;



&lt;p&gt;&lt;/p&gt;



&lt;p&gt;docker-compose.yml&lt;/p&gt;



&lt;pre&gt;&lt;code&gt;# NVIDIA Nemotron 3.5 Bolt 74B-A9B 24GB (2-bit packed) on DGX Spark via vLLM
# Recipe from https://huggingface.co/nvidia/NVIDIA-Nemotron-3.5-Bolt-74B-A9B-24GB
#
# Build + run:  docker compose up -d --build
#
services:
  nemotron-bolt-vllm:
    build: .
    image: vllm-nemotron-bolt:latest
    container_name: nemotron-bolt-vllm
    restart: unless-stopped
    ports:
      - "8003:8000"
    volumes:
      - ${HOME}/models/nemotron-3.5-bolt-vllm:/models:ro
      - ${HOME}/.cache/vllm-nemotron-bolt:/root/.cache
    environment:
      VLLM_USE_V2_MODEL_RUNNER: "1"
    ipc: host
    ulimits:
      memlock: -1
      stack: 67108864
    deploy:
      resources:
        reservations:
          devices:
            - driver: nvidia
              count: all
              capabilities: [gpu]
    healthcheck:
      test: ["CMD", "curl", "-fs", "http://127.0.0.1:8000/health"]
      interval: 30s
      timeout: 5s
      start_period: 1200s
      retries: 3
    command:
      - /models/target
      - --served-model-name
      - nemotron-3.5-bolt
      - --host
      - 0.0.0.0
      - --port
      - "8000"
      - --trust-remote-code
      - --load-format
      - auto
      - --tensor-parallel-size
      - "1"
      # unified memory shared with gemma4 (vllm-gemma4.service, ~36GB)
      - --gpu-memory-utilization
      - "0.40"
      - --max-model-len
      - "262144"
      - --max-num-seqs
      - "1"
      - --enable-chunked-prefill
      - --kv-cache-dtype
      - fp8
      - --linear-backend
      - b12x
      - --moe-backend
      - b12x
      - --attention-backend
      - FLASHINFER
      - --mamba-backend
      - flashinfer
      - --mamba-ssm-cache-dtype
      - bfloat16
      - --mamba-cache-dtype
      - bfloat16
      - --mamba-cache-mode
      - align
      - --seed
      - "42"
      - --allowed-local-media-path
      - /media
      - --limit-mm-per-prompt
      - '{"video":1,"image":1}'
      - --video-pruning-rate
      - "0.5"
      - --media-io-kwargs
      - '{"video":{"fps":2,"num_frames":256}}'
      - --enable-auto-tool-choice
      - --tool-call-parser
      - qwen3_coder
      - --reasoning-parser-plugin
      - /models/target/ultra_v3_reasoning_parser.py
      - --reasoning-parser
      - ultra_v3
      - --speculative-config
      - '{"method":"dflash","model":"/models/drafter","num_speculative_tokens":7,"rejection_sample_method":"standard","attention_backend":"FLASHINFER","draft_load_config":{"load_format":"auto"}}'
&lt;/code&gt;&lt;/pre&gt;



&lt;p&gt;Download models first:&lt;/p&gt;



&lt;pre&gt;&lt;code&gt;hf download nvidia/NVIDIA-Nemotron-3.5-Bolt-74B-A9B-24GB --local-dir ~/models/nemotron-3.5-bolt-vllm/target
hf download nvidia/NVIDIA-Nemotron-3.5-Bolt-74B-A9B-24GB-LiLiCorr --local-dir ~/models/nemotron-3.5-bolt-vllm/drafter
&lt;/code&gt;&lt;/pre&gt;</content>
    <source>
      <title>icez network</title>
      <link rel="self" href="https://www.icez.net/blog/feed"/>
      <link rel="alternate" href="https://www.icez.net/blog"/>
    </source>
  </entry>
  <entry>
    <id>urn:uuid:13217573-2690-5726-99c6-7d00b75ece28</id>
    <title>ทำแอปวาดแปะบนหน้าจอมือถือง่ายๆ มาฝากครับ</title>
    <updated>2026-10-14T18:48:59.000Z</updated>
    <author>
      <name>iannnnn</name>
    </author>
    <published>2026-10-14T18:48:59.000Z</published>
    <link rel="alternate" href="https://iannnnn.com/2026/3486"/>
    <category term="Thai"/>
    <content type="html">&lt;figure&gt;&lt;img width="473" height="1024" src="https://feeds.llun.dev/media/d7d8277e32a506108e6d34b87126a7e63b17e2e35ada544b841a7e8c80ad7140.webp" alt="" srcset="https://feeds.llun.dev/media/d7d8277e32a506108e6d34b87126a7e63b17e2e35ada544b841a7e8c80ad7140.webp 473w, https://feeds.llun.dev/media/943debbde53301f6ad1f8b4c0984d4bb8078eed0ac3beaa696ce7d4b9dd63398.webp 138w, https://feeds.llun.dev/media/bf3dfdda94b1847bb9f1c423f95a66dc2e2d709d1d23f76906a1083d5eff0853.webp 768w, https://feeds.llun.dev/media/3c4359abb0047d357bd80289911990e0573df6ddbae44a23d6ee7df0763e5d32.webp 709w, https://feeds.llun.dev/media/a4dda8896e4f64e41d22681b493f0a6997e66ad84bdbbeba9bffe944558f4426.webp 945w, https://feeds.llun.dev/media/f9d9d5e39b7b12536d4b51b9162e09ef6d48f03e941b639eb759ae9351237cae.webp 1080w" /&gt;&lt;/figure&gt;



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



&lt;p&gt;ก็เลยทำเองครับ ตะกี้เลย ทำแม่งดึกๆ นี่แหละ&lt;/p&gt;



&lt;p&gt;ขอบคุณ เไ ที่ช่วยด้านเทคนิคโปรแกรมมิ่งที่เราเป็นศูนย์ ชี้นิ้วสั่งอย่างเดียวแบบเจ้านายนิสัยเลว&lt;/p&gt;



&lt;figure&gt;&lt;div&gt;

&lt;/div&gt;&lt;/figure&gt;



&lt;p&gt;ทั้งนี้ ตัวแอปไม่มีอะไรอื่นใดอีกเลยครับ เขียนไว้แค่เท่าที่อยากได้ ถ้าใครเห็นแล้วเกิดไอเดียเอาไปต่อยอด ก็บอก เไ แป๊บเดียวแหละ มันทำให้ได้เลย เดี๋ยวนี้ไม่มีอะไรเป็นไปไม่ได้อีกแล้ว นอกจากอีหนูต&lt;/p&gt;



&lt;p&gt;&lt;a href="https://iannnnn.github.io/anndoodle/" target="_blank"&gt;ดาวน์โหลดที่ iannnnn.github.io/anndoodle/&lt;/a&gt;&lt;/p&gt;



&lt;p&gt;ป.ล.เนื่องจากผมไม่ได้เป็นผู้พัฒนาแอปมืออาชีพ ใครโหลดไปกดติดตั้งแล้วมันไม่ให้ลง (ติด Android Auto Blocker) ก็มีวิธีแก้โดย&lt;a href="https://www.youtube.com/watch?v=FpJhFoXnPWk" target="_blank"&gt;ทำตามคลิปนี้&lt;/a&gt;ครับ&lt;/p&gt;</content>
    <source>
      <title>iannnnn.com</title>
      <link rel="self" href="https://iannnnn.com/feed"/>
      <link rel="alternate" href="https://iannnnn.com"/>
    </source>
  </entry>
  <entry>
    <id>urn:uuid:9867ff66-45b9-55bd-95f3-ba1d89b6d8b1</id>
    <title>มาลองใช้งาน Excalidraw CLI  กัน</title>
    <updated>2026-10-14T08:05:43.000Z</updated>
    <author>
      <name>somkiat</name>
    </author>
    <published>2026-10-14T08:05:43.000Z</published>
    <link rel="alternate" href="https://www.somkiat.cc/excalidraw-cli/"/>
    <category term="Thai"/>
    <content type="html">&lt;p&gt;&lt;img width="150" height="150" src="https://feeds.llun.dev/media/ed21174b74a75bbc0ec3c427a726ef439518fffdcd77ed1cbf27bff637ceef16.jpg" alt="" loading="lazy" srcset="https://feeds.llun.dev/media/ed21174b74a75bbc0ec3c427a726ef439518fffdcd77ed1cbf27bff637ceef16.jpg 150w, https://feeds.llun.dev/media/e4d4ac4522c0cbafa6b916aec3155dc4e1dd20c4fc49c237ea89f416b6b32a4f.jpg 75w" /&gt;&lt;/p&gt;
&lt;figure&gt;&lt;a href="https://www.somkiat.cc/wp-content/uploads/2026/10/excalidraw-cli.jpg"&gt;&lt;img src="https://feeds.llun.dev/media/5b8b7042cc66b76745f0e1e106aaee84dd70826a0488d40fe421469dc3207e9d.jpg" alt="" /&gt;&lt;/a&gt;&lt;/figure&gt;



&lt;p&gt;ทาง &lt;a href="https://excalidraw.com/" target="_blank"&gt;Excalidraw&lt;/a&gt; ซึ่งให้บริการ web สำหรับการสร้าง diagram ต่าง ๆ สำหรับระบบงาน&lt;br /&gt;โดยปกติผมจะใช้สร้างพวก architecture, flow chart และ sequence diagram เป็นหลัก&lt;br /&gt;แต่ยังไม่สามารถใช้งานกับ AI Agent ต่าง ๆ ได้ดีมากนัก&lt;br /&gt;ดังนั้นจึงได้ปล่อย &lt;strong&gt;&lt;a href="https://github.com/excalidraw/cli" target="_blank"&gt;Excalidraw CLI&lt;/a&gt;&lt;/strong&gt; ออกมา&lt;br /&gt;มีเป้าหมายหลัก ๆ คือ &lt;em&gt;&lt;strong&gt;"Official Excalidraw CLI for humans and agents"&lt;/strong&gt;&lt;/em&gt;&lt;br /&gt;นั่นคือสร้างมาสำหรับคนและ AI Agent ใช้งานนั่นเอง&lt;/p&gt;



&lt;span&gt;&lt;/span&gt;



&lt;p&gt;&lt;strong&gt;เริ่มด้วยการติดตั้งและใช้งานแบบง่าย ๆ และใช้งานแบบไม่เสียเงิน&lt;/strong&gt;&lt;/p&gt;



[gist id="8f7b901917d18735263e9e9a68d72115" file="1.txt"]



&lt;p&gt;เมื่อได้รูปมาแล้ว สามารถส่งให้ AI Agent และคนดูว่า diagram มีความผิดพลาดอย่างไรต่อไป&lt;br /&gt;ทำให้ workflow การทำงานสะดวกยิ่งขึ้น ไม่ต้องเปลี่ยนหน้าจอไปมา&lt;/p&gt;



&lt;p&gt;&lt;em&gt;แต่ถ้าใครจ่ายเงินหรือใช้งาน Excalidraw+ น่าจะทำงานสนุกกว่าเยอะ !!&lt;/em&gt;&lt;br /&gt;สามารถ login ได้ทั้งผ่าน API key และ OAuth(ในอนาคต)&lt;em&gt;&lt;br /&gt;ผมไม่ได้ใช้ เลยลองไม่ได้&lt;/em&gt;&lt;/p&gt;



&lt;p&gt;จะเห็นว่าหลาย ๆ ระบบงาน เริ่มสร้าง CLI ออกมาเยอะมาก&lt;br /&gt;เพื่อให้สามารถใช้งานได้ง่ายจากทั้งคนและ AI Agent&lt;br /&gt;ลองใช้งานกันดูครับ เป็นอีกทางเลือกที่น่าสนใจ&lt;/p&gt;



&lt;p&gt;&lt;/p&gt;
</content>
    <source>
      <title>cc :: somkiat</title>
      <link rel="self" href="https://www.somkiat.cc/feed/"/>
      <link rel="alternate" href="https://www.somkiat.cc"/>
    </source>
  </entry>
  <entry>
    <id>urn:uuid:59f5b278-6b6d-5d75-98e4-f4bc9fd2f243</id>
    <title>บันทึกเรื่อง Designing MCP Gateway จาก Uber</title>
    <updated>2026-10-12T08:36:31.000Z</updated>
    <author>
      <name>somkiat</name>
    </author>
    <published>2026-10-12T08:36:31.000Z</published>
    <link rel="alternate" href="https://www.somkiat.cc/designing-mcp-gateway-from-uber/"/>
    <category term="Thai"/>
    <content type="html">&lt;p&gt;&lt;img width="150" height="150" src="https://feeds.llun.dev/media/5a6d1218143687d0641795831a08f8ed9c12b1204fe0e0a91b9858c3334e13f2.webp" alt="" loading="lazy" srcset="https://feeds.llun.dev/media/5a6d1218143687d0641795831a08f8ed9c12b1204fe0e0a91b9858c3334e13f2.webp 150w, https://feeds.llun.dev/media/ce8aec8177b9f4d68f43a24615e95f6c10c53e6049bab97ce1cafb4a057dc59c.webp 75w" /&gt;&lt;/p&gt;
&lt;p&gt;จากบทความเรื่อง &lt;a href="https://www.uber.com/gb/en/blog/designing-mcp-gateway/" target="_blank"&gt;Designing MCP Gateway Uber's MCP Management Platform จาก Uber&lt;/a&gt;&lt;br /&gt;ในเรื่องของการสร้าง platform สำหรับการ integrate AI Agent เข้ากับส่วนต่าง ๆ ของระบบงาน&lt;br /&gt;รวมทั้งเพื่อให้สามารถทำการ scale ไปยังในทีมต่าง ๆ ในองค์กร&lt;br /&gt;ดังนั้นจึงเลือกแนวทางสร้าง platform กลางขึ้นมา&lt;br /&gt;โดยทำการเชื่อมต่อผ่าน MCP (Model Context Protocol) นั่นเอง&lt;br /&gt;มาดูในรายละเอียดกัน&lt;/p&gt;



&lt;span&gt;&lt;/span&gt;



&lt;p&gt;จากบทความนั้นได้อธิบายที่ไปที่มาของการสร้าง MCP gateway ไว้ดังนี้&lt;/p&gt;



&lt;p&gt;&lt;strong&gt;เรื่องแรกคือ ปัญหาและเป้าหมายที่ต้องการ&lt;/strong&gt;&lt;/p&gt;



&lt;p&gt;ทุกอย่างมักจะเริ่มจากปัญหา หลังจากที่ได้มีการนำ AI มาใช้งานในองค์กร&lt;br /&gt;ถ้าเริ่มแบบคนเดียว หรือ ทีมเดียว ก็ไม่มีปัญหามากนัก&lt;br /&gt;แต่เมื่อมีใช้งานกันทั้งองค์กรแล้ว จะมีปัญหาทั้งเรื่อง&lt;/p&gt;



&lt;ul&gt;
&lt;li&gt;การทำงานร่วมกัน&lt;/li&gt;



&lt;li&gt;การเข้าใช้งานส่วนต่าง ๆ ต้องสนใจเรื่อง network, security และ infrastructure ต่าง ๆ&lt;/li&gt;



&lt;li&gt;การทำงานต่าง ๆ ของแต่ละทีมมักจะเกิดการทำซ้ำ ลงแรงซ้ำ ๆ&lt;/li&gt;



&lt;li&gt;การหาระบบหรือของที่ต้องการยากมาก ๆ ต้องพูดคุย หรือ สอบถามเยอะ&lt;/li&gt;



&lt;li&gt;การจัดการเรื่อง security ที่ไม่แน่นอนแล้วแต่ระบบ หรือ ทีมไป (authentication, authorization และ audit ต่าง ๆ)&lt;/li&gt;



&lt;li&gt;การจัดการปัญหาเรื่อง context bloat และ ค่าใช้จ่ายของ token เช่นการ load tools ต่าง ๆ ขึ้นมา เป็นต้น&lt;/li&gt;



&lt;li&gt;ระบบต่าง ๆ มีการเข้าถึงที่หลากหลายทั้ง HTTP, gRPC, TChannel และ MCP ตรงนี้ทำให้ AI Agent ทำงานช้าลงไปอีก !!&lt;/li&gt;
&lt;/ul&gt;



&lt;p&gt;จากปัญหาต่าง ๆ เหล่านี้ที่พบเจอ&lt;br /&gt;จึงต้องการแนวทางในการแก้ไขปัญหา&lt;br /&gt;โดยแนวทางที่เลือกคือ การใช้งานทุกอย่างผ่าน &lt;strong&gt;MCP gateway และ Registry&lt;/strong&gt; ขึ้นมา&lt;br /&gt;แสดงดังรูป&lt;/p&gt;



&lt;figure&gt;&lt;a href="https://www.somkiat.cc/wp-content/uploads/2026/10/uber-mcp-01.webp.webp"&gt;&lt;img src="https://feeds.llun.dev/media/f2eeb35b9fcbbedafb3cc3e60f7c364ed9744b068d9444ff8495107e3c8b6938.webp" alt="" /&gt;&lt;/a&gt;&lt;/figure&gt;



&lt;p&gt;&lt;strong&gt;เรื่องที่สอง มาดูการทำงานของ MCP gateway และ Registry&lt;/strong&gt;&lt;/p&gt;



&lt;p&gt;ตามชื่อคือ เป็น layer ใหม่สำหรับการ integrate ระหว่าง AI Agent ต่าง ๆ กับ internal service &lt;br /&gt;โดยหน้าที่รับผิดชอบประกอบด้วย&lt;/p&gt;



&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Internal service&lt;/strong&gt; ต่าง ๆ ที่ใช้งานผ่าน &lt;strong&gt;MCP gateway&lt;/strong&gt; ได้นั้นต้องทำการ register ไปที่ &lt;strong&gt;MCP registry&lt;/strong&gt; ก่อน (คุ้น ๆ ไหมว่า มันคือ Service registry และ discovery นั่นเอง ไม่ใช่เรื่องใหม่) โดยการ register เข้าไปใหม่นั้น จะมี state เป็น disable-by-default คือใช้งานไม่ได้ จากนั้นเจ้าของ service ต่าง ๆ จะต้องทำการ review/approve เพื่อเปิดใช้งานเสมอ&lt;/li&gt;



&lt;li&gt;ในการค้นหานั้นจะทำงานผ่านส่วนงานที่เรียกกว่า &lt;strong&gt;AutoClawer&lt;/strong&gt;&lt;/li&gt;



&lt;li&gt;เรื่องของ security และ policy ต่าง ๆ จะถูก build-in เข้ามาใน MCP gateway ให้เลย เพื่อใช้ในการกำหนดสิทธิ์ในการเข้าถึง service ต่าง ๆ ผ่านจากคน, AI agent และ service อื่น ๆ รวมทั้งเรื่องของ observability และ rate limit ต่าง ๆ น่าจะคุ้น ๆ กับส่วนนี้ที่หลาย ๆ คนน่าจะเรียกว่า &lt;strong&gt;Middleware&lt;/strong&gt;&lt;/li&gt;



&lt;li&gt;มี layer ในการแปลง (transform) ข้อมูลจาก service ต่าง ๆ ที่มีหลากหลายรูปแบบ ให้มาเป็น MCP JSON หรือ (MCP-compatible JSON) ช่วยให้ไม่ต้องไปแก้ไขอะไรที่ service ต่าง ๆ หรือ downstream service&lt;/li&gt;
&lt;/ul&gt;



&lt;p&gt;แสดงส่วนการทำงานดังรูป&lt;/p&gt;



&lt;figure&gt;&lt;a href="https://www.somkiat.cc/wp-content/uploads/2026/10/uber-mcp-02.webp.webp"&gt;&lt;img src="https://feeds.llun.dev/media/5fe2f72770b67dfcd8792c1a68176e58a5e8be2314afda53dfb610d8952a5de1.webp" alt="" /&gt;&lt;/a&gt;&lt;/figure&gt;



&lt;p&gt;&lt;strong&gt;ส่วนที่สาม การ scale ระบบ MCP Gateway&lt;/strong&gt;&lt;/p&gt;



&lt;p&gt;เนื่องจากในระบบมี server และ service จำนวนเยอะมาก ๆ&lt;br /&gt;รวมทั้ง tool ต่าง ๆ ใน MCP ก็เพียบ&lt;br /&gt;ทำให้ปัญหาของ ขนาด context และค่าใช้จ่าย มันยังเยอะมาก ๆ&lt;br /&gt;จึงทำการสร้าง &lt;strong&gt;Runtime Discovery&lt;/strong&gt; ขึ้นมา ประกอบไปด้วย&lt;/p&gt;



&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Omni MCP&lt;/strong&gt; เป็น proxy server ทำการค้นหา server, tool, ดึง schema ของ tool และเรียกใช้งาน tool ต่าง ๆ ที่เกี่ยวข้องกับ context นั้น ๆ เท่านั้น&lt;/li&gt;



&lt;li&gt;&lt;strong&gt;Response Projection&lt;/strong&gt; ทำการแปลง response จาก service ต่าง ๆ กลับมาเป็น MCP JSON รวมทั้งการลบหรือ trim ข้อมูลต่าง ๆ ที่ไม่จำเป็นออกไป&lt;/li&gt;



&lt;li&gt;&lt;strong&gt;Code Mode&lt;/strong&gt; เป็น MCP กลางสำหรับ AI Agent เพื่อทำการเขียน output ต่าง ๆ จาก CLI ลงใน file แทนที่จะส่งไปยัง context ของ LLM เลย จากนั้นทำการหาสิ่งที่เกี่ยวข้องผ่าน grep เพื่อ load เข้า context ต่อไป  โดยเป็น default MCP ของ AI Agent for coding ทุกตัวขององค์กร&lt;/li&gt;
&lt;/ul&gt;



&lt;p&gt;แสดงดังรูป&lt;/p&gt;



&lt;figure&gt;&lt;a href="https://www.somkiat.cc/wp-content/uploads/2026/10/uber-mcp-03.webp.webp"&gt;&lt;img src="https://feeds.llun.dev/media/052d6850abcf890182a3b98bdb9ced38a1ab6116f31f4d850fd2acceb52883ed.webp" alt="" /&gt;&lt;/a&gt;&lt;/figure&gt;



&lt;p&gt;จากแนวทางต่าง ๆ เหล่านี้ ช่วยให้สามารถ scale การใช้ในองค์กรได้ดียิ่งขึ้น&lt;br /&gt;ช่วยให้การจัดการง่ายขึ้นจากระบบส่วนกลาง สร้างความน่าเชื่อถือและปลอดภัย (Build-in security)&lt;br /&gt;แต่ในส่วนของ ownership ยังคงกระจายออกไปยังแต่ละทีมเช่นเดิม &lt;br /&gt;นั่นคือ ทำงานในกรอบที่น่าเชื่อถือและไม่ขัดขวาง flow ของการทำงาน&lt;br /&gt;รวมทั้งยังเพิ่มประสิทธิภาพของการทำงานให้รวดเร็วขึ้น&lt;br /&gt;และลดจำนวน token ในการใช้งานลงไปอีก&lt;br /&gt;&lt;/p&gt;



&lt;p&gt;&lt;/p&gt;
</content>
    <source>
      <title>cc :: somkiat</title>
      <link rel="self" href="https://www.somkiat.cc/feed/"/>
      <link rel="alternate" href="https://www.somkiat.cc"/>
    </source>
  </entry>
  <entry>
    <id>urn:uuid:42017ab2-c3b4-5a12-8a54-0f5f170228a1</id>
    <title>ทำเว็บหั่นภาพเป็นชิ้นๆ ไว้โพสต์พาโนรามา มาฝากครับ</title>
    <updated>2026-10-10T20:37:30.000Z</updated>
    <author>
      <name>iannnnn</name>
    </author>
    <published>2026-10-10T20:37:30.000Z</published>
    <link rel="alternate" href="https://iannnnn.com/2026/3483"/>
    <category term="Thai"/>
    <content type="html">&lt;figure&gt;&lt;img loading="lazy" width="1024" height="768" src="https://feeds.llun.dev/media/9a7025a12153def45a679f96c5b7d088ee2f4d9c98f613f623b39cb98dc08f93.jpg" alt="" srcset="https://feeds.llun.dev/media/9a7025a12153def45a679f96c5b7d088ee2f4d9c98f613f623b39cb98dc08f93.jpg 1024w, https://feeds.llun.dev/media/b8a44f47783f35319507aaed0de530ff40e3fbf2974a0c8f7f2b08b2bc6bff04.jpg 300w, https://feeds.llun.dev/media/a463cc3e42da2b3b3990a677d7671e7c97ec5ae4fd3f3e62e5c245b32f5f12fa.jpg 768w, https://feeds.llun.dev/media/01dcda4e9a414a6d03b0d25ae5dfc60a89ecbcba2635caf509a10860c2d02814.jpg 1536w, https://feeds.llun.dev/media/b0505e8ee06ce1f84ba8669113c9cfafb02f646162ded3b781b3b5059db506c7.jpg 1920w" /&gt;&lt;/figure&gt;



&lt;p&gt;ทำเว็บแอปไว้หั่นภาพเดียว ให้ระเบิดออกเป็นหลายภาพ ไว้โพสต์บนอินสตาแกรม หรือทวิตเตอร์แบบ Carousel ครับ พอเลื่อนดูก็จะเห็นว่าภาพมันต่อกันยาวๆ&lt;/p&gt;



&lt;p&gt;ทุกภาพที่ทำ จะจบงานบนเบราว์เซอร์ในเครื่อง (หรือในมือถือ) ของเราเอง 100% ไม่มีการส่งขึ้นเซิร์ฟเวอร์ครับ&lt;/p&gt;



&lt;p&gt;แอปนี้อธิบายสั้นๆ เพราะมันไม่มีอะไร 55555 แต่อยากใช้เองไงเลยทำมาเผื่อคนอื่นด้วย&lt;/p&gt;



&lt;p&gt;ลองจิ้มเล่น / เซฟไว้เผื่อใช้ได้ที่ :&lt;/p&gt;



&lt;p&gt;&lt;strong&gt;Wide Photo Slicer&lt;br /&gt;&lt;/strong&gt;&lt;a href="https://anndo.com/w" target="_blank"&gt;anndo.com/w&lt;/a&gt;&lt;/p&gt;</content>
    <source>
      <title>iannnnn.com</title>
      <link rel="self" href="https://iannnnn.com/feed"/>
      <link rel="alternate" href="https://iannnnn.com"/>
    </source>
  </entry>
  <entry>
    <id>urn:uuid:e42a4338-53e6-5a9c-835e-e15a3b979159</id>
    <title>ทาง Microsoft ปล่อย Postgres MCP Server มาให้ใช้งาน</title>
    <updated>2026-10-08T05:13:46.000Z</updated>
    <author>
      <name>somkiat</name>
    </author>
    <published>2026-10-08T05:13:46.000Z</published>
    <link rel="alternate" href="https://www.somkiat.cc/microsoft-postgres-mcp/"/>
    <category term="Thai"/>
    <content type="html">&lt;p&gt;&lt;img width="150" height="150" src="https://feeds.llun.dev/media/f87c8455b2586e57e21818fa4ad2d2b18abb1d5cad0addb55c2632a026df2ed5.jpg" alt="" loading="lazy" srcset="https://feeds.llun.dev/media/f87c8455b2586e57e21818fa4ad2d2b18abb1d5cad0addb55c2632a026df2ed5.jpg 150w, https://feeds.llun.dev/media/b23d77c6d8ea1e635cde93d48a640e2271bbf14dd61fbaa211e3eed6e2ddcf36.jpg 75w" /&gt;&lt;/p&gt;
&lt;figure&gt;&lt;a href="https://www.somkiat.cc/wp-content/uploads/2026/10/microsoft-postgres-mcp.jpg"&gt;&lt;img src="https://feeds.llun.dev/media/bc712fa5567c1dbc0b19c73b94167bc39b1781ab37dc6d5e84e6848a5e42ca0b.jpg" alt="" /&gt;&lt;/a&gt;&lt;figcaption&gt;Screenshot&lt;/figcaption&gt;&lt;/figure&gt;



&lt;p&gt;ทาง &lt;a href="https://techcommunity.microsoft.com/blog/adforpostgresql/postgres-mcp-server-connect-ai-coding-agents-to-postgresql/4561273" target="_blank"&gt;Microsoft ปล่อย Postgres MCP Server&lt;/a&gt; มาให้ใช้งาน&lt;br /&gt;ยังไม่พอนะ มี &lt;a href="https://github.com/microsoft/postgres-skills" target="_blank"&gt;Postgres skills&lt;/a&gt; มาให้ใช้งานอีกด้วย&lt;br /&gt;ช่วยให้ AI Agent ต่าง ๆ เข้าถึง PostgreSQL database ได้แบบง่ายและสะดวกขึ้น&lt;br /&gt;ทั้งการเขียน query &lt;br /&gt;ทั้งการวิเคราะห์ query รวมถึงโครงสร้าง และการใช้งาน index&lt;br /&gt;เพื่อให้เราสามารถรู้ปัญหาได้รวดเร็วมากขึ้น&lt;br /&gt;รวมทั้งการจัดการ connection อีกด้วย&lt;/p&gt;



&lt;span&gt;&lt;/span&gt;



&lt;p&gt;&lt;strong&gt;ลองติดตั้งและใช้งานกัน&lt;/strong&gt;&lt;/p&gt;



[gist id="f8b6f65c8a95651a10ca6fcedb81e0c0" file="1.txt"]



&lt;p&gt;&lt;strong&gt;&lt;em&gt;ปล. ระวังเรื่องสิทธิ์ของ user การใช้งานต่าง ๆ ด้วยเสมอ !!&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;



&lt;p&gt;และยังมี Expert PostgreSQL Skills มาให้อีก&lt;br /&gt;ซึ่งมี guideline ต่าง ๆ สำหรับการทำงาน มากกว่า 30 skills&lt;br /&gt;เพื่อเป็นตัวช่วยในการจัดการและใช้งาน database&lt;br /&gt;ลองติดตั้งและใช้งานดูครับ&lt;/p&gt;



[gist id="f8b6f65c8a95651a10ca6fcedb81e0c0" file="2.txt"]
</content>
    <source>
      <title>cc :: somkiat</title>
      <link rel="self" href="https://www.somkiat.cc/feed/"/>
      <link rel="alternate" href="https://www.somkiat.cc"/>
    </source>
  </entry>
  <entry>
    <id>urn:uuid:b2d87180-901b-540d-8b0c-4eb720d53c76</id>
    <title>แนวทางเรื่องของการแก้ไขปัญหาทำซ้ำของระบบงาน (Prevent Duplication)</title>
    <updated>2026-10-04T06:44:23.000Z</updated>
    <author>
      <name>somkiat</name>
    </author>
    <published>2026-10-04T06:44:23.000Z</published>
    <link rel="alternate" href="https://www.somkiat.cc/preventing-duplicate-in-system/"/>
    <category term="Thai"/>
    <content type="html">&lt;p&gt;&lt;img width="150" height="150" src="https://feeds.llun.dev/media/2e9eba68f29a630bd0da2534edb9e47b36528d73bfcbfa02bc520c77d513b00a.webp" alt="" loading="lazy" srcset="https://feeds.llun.dev/media/2e9eba68f29a630bd0da2534edb9e47b36528d73bfcbfa02bc520c77d513b00a.webp 150w, https://feeds.llun.dev/media/4419009fcd180710ce69548e77d5b08b2f3b2727f7a4b0ae8297948d4659ea24.webp 75w" /&gt;&lt;/p&gt;
&lt;figure&gt;&lt;a href="https://www.somkiat.cc/wp-content/uploads/2026/10/duplicate-process.webp.webp"&gt;&lt;img src="https://feeds.llun.dev/media/3c496b272921b56401f89d9737c3a92431697f92e51d860e240bd3e23a1c62c1.webp" alt="" /&gt;&lt;/a&gt;&lt;/figure&gt;



&lt;p&gt;ในระบบงานทำงานต่าง ๆ ตั้งแต่เรียบง่ายไปจนถึงระบบแบบกระจาย (distributed system)&lt;br /&gt;มักจะเจอปัญหาปวดหัวเรื่องของ การทำงานซ้ำ ๆ  (duplication)&lt;br /&gt;ส่งผลให้ระบบงานทำงานผิดพลาด&lt;br /&gt;และส่งผลกระทบไปยังผู้ใช้งานอีก&lt;br /&gt;ซึ่งถ้าไม่ได้ออกแบบระบบงานเพื่อป้องกันปัญหานี้ไว้&lt;br /&gt;น่าจะมองโลกในแง่ดีเกินไปแน่ ๆ&lt;br /&gt;เรื่องจากระบบต่าง ๆ มันพร้อมพัง หรือ มีปัญหาเสมอ&lt;/p&gt;



&lt;span&gt;&lt;/span&gt;



&lt;p&gt;&lt;strong&gt;มาดูแนวทางในการป้องกันปัญหาการทำซ้ำบ้าง ว่ามีอะไรบ้าง ?&lt;/strong&gt;&lt;/p&gt;



&lt;p&gt;ถ้าเป็นการใช้ผ่าน web/mobile มักจะทำการ disable ปุ่มต่าง ๆ &lt;br /&gt;เพื่อไม่ให้ผู้ใช้งานกดซ้ำ ๆ เข้ามา&lt;br /&gt;แต่ถ้าผู้ใช้งานยังกดเรื่องเดิมซ้ำ ๆ มาอีกหลังจากทำงานเสร็จแล้ว&lt;br /&gt;จะด้วยความตั้งใจหรือไม่ตั้งใจ จะจัดการอย่างไร&lt;br /&gt;ต้องมีการทำ &lt;strong&gt;maker-checker&lt;/strong&gt; เพิ่มอีกไหม (ตรวจสอบซ้ำก่อนทำงานจริง ๆ)&lt;br /&gt;หรือระบบต้องมีการจัดการ &lt;strong&gt;policy&lt;/strong&gt; ขึ้นมา &lt;br /&gt;ว่าในแต่ละ operation เดิม ๆ คนเดิม ๆ เรื่องเดิม ๆ ห้ามทำงานซ้ำภายใน x นาที/ชั่วโมง เป็นต้น&lt;br /&gt;มันคือการกำหนด &lt;strong&gt;rate limit&lt;/strong&gt; ต่าง ๆ นั่นเอง&lt;br /&gt;ยิ่งถ้าการทำงานต้องไปเรียก 3-party API อีก ก็จำเป็นต้องจัดการเรื่อง &lt;strong&gt;&lt;a href="https://api-security.owasp.org/editions/2023/en/0xa4-unrestricted-resource-consumption/" target="_blank"&gt;resource consumption&lt;/a&gt;&lt;/strong&gt; อีกด้วย&lt;br /&gt;มิเช่นนั้นอาจจะทำให้เกิดปัญหาตามมา รวมทั้งค่าใช้จ่ายอาจจะสูงเกินความจำเป็น&lt;/p&gt;



&lt;p&gt;ยิ่งถ้าระบบการทำงานเป็น batching process หรือตั้งเวลาทำงาน&lt;br /&gt;ยิ่งต้องระมัดระวังอย่างมาก ในการทำซ้ำ ๆ&lt;br /&gt;ทั้งจากเรื่องของ network มีปัญหา&lt;br /&gt;ทั้งจาก retry policy ของการทำงาน&lt;/p&gt;



&lt;p&gt;&lt;strong&gt;แนวทางในมักจะใช้งานกันอีกคือ Idempotency Keys&lt;/strong&gt;&lt;/p&gt;



&lt;p&gt;โดยในทุก ๆ request หรือ process การทำงานจะส่ง unique Idempotency Key ไปด้วย&lt;br /&gt;ซึ่งมักจะเป็น &lt;strong&gt;UUID&lt;/strong&gt; (Universally unique identifier)&lt;br /&gt;จากนั้น service ที่รับ request/process มาทำงาน&lt;br /&gt;จะต้องทำการตรวจสอบก่อนว่า UUID นั้นทำงานไปแล้วหรือยัง&lt;br /&gt;ถ้ายังไม่ทำงาน ก็จะเริ่มทำงานนั่นเอง&lt;br /&gt;แต่ถ้าทำงานไปแล้ว ก็จะไม่ทำงาน (และส่งผลการทำงานก่อนหน้ากลับไปนั่นเอง)&lt;br /&gt;เพื่อไม่ให้เกิดการทำงานซ้ำ ๆ&lt;br /&gt;มักจะจัดเก็บ UUID ในพวก &lt;strong&gt;memory store&lt;/strong&gt;&lt;/p&gt;



&lt;figure&gt;&lt;a href="https://www.somkiat.cc/wp-content/uploads/2026/10/idempotent.png"&gt;&lt;img src="https://feeds.llun.dev/media/b7dae78aa52e45d47768141c8b94edce6f52c0bbb94716a37e56888c5ecdcdc1.png" alt="" /&gt;&lt;/a&gt;&lt;/figure&gt;



&lt;p&gt;&lt;br /&gt;หรืออาจจะใช้งาน &lt;strong&gt;Database constraint &lt;/strong&gt; เข้ามาจัดการเรื่องนี้ก็ได้เช่นกัน&lt;br /&gt;แต่ระวังเรื่องของการ scaling และ locking ของ database ด้วย&lt;br /&gt;หรืออาจจะใช้งาน &lt;strong&gt;Distributed lock&lt;/strong&gt; มาใช้งานก็ได้&lt;br /&gt;ความซับซ้อนเอาตามที่เชี่ยวชาญกันได้เลย&lt;/p&gt;



&lt;p&gt;สามารถเอา &lt;strong&gt;API gateway&lt;/strong&gt; เข้ามากั้นเพื่อจัดการสิ่งต่าง ๆ เหล่านี้ได้&lt;br /&gt;โดยไม่ต้องไปแก้ไขระบบเดิม ก็เป็นอีกทางเลือกที่น่าสนใจ&lt;/p&gt;



&lt;p&gt;&lt;strong&gt;บางระบบมีการทำงานแบบ fire-and-forgot &lt;/strong&gt;&lt;/p&gt;



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



&lt;figure&gt;&lt;a href="https://feeds.llun.dev/media/6f710e2aed1e9840008df57e389ebffd7b109b91da0a7d43b69037423798fc86.png"&gt;&lt;img src="https://feeds.llun.dev/media/6f710e2aed1e9840008df57e389ebffd7b109b91da0a7d43b69037423798fc86.png" alt="" /&gt;&lt;/a&gt;&lt;/figure&gt;



&lt;p&gt;แน่นอนว่า แต่ละวิธีการนั้น ก็ต้องดูทั้งความต้องการ ข้อจำกัดต่าง ๆ &lt;br /&gt;ซึ่งล้วนแตกต่างกันตามระบบนั้น&lt;br /&gt;ก็เลือกให้เหมาะสมครับ&lt;/p&gt;
</content>
    <source>
      <title>cc :: somkiat</title>
      <link rel="self" href="https://www.somkiat.cc/feed/"/>
      <link rel="alternate" href="https://www.somkiat.cc"/>
    </source>
  </entry>
  <entry>
    <id>urn:uuid:a9d8b511-a2ca-57f5-a44b-ec137c3cdf62</id>
    <title>มาลองใช้งาน Stitch CLI สำหรับการออกแบบ user interface กันดู</title>
    <updated>2026-10-03T15:44:18.000Z</updated>
    <author>
      <name>somkiat</name>
    </author>
    <published>2026-10-03T15:44:18.000Z</published>
    <link rel="alternate" href="https://www.somkiat.cc/try-stitch-cli/"/>
    <category term="Thai"/>
    <content type="html">&lt;p&gt;&lt;img width="150" height="150" src="https://feeds.llun.dev/media/69a204c90d36f3fe3d3794d235e97b6cabe38447a2cb7e208d70302a853f7803.webp" alt="" loading="lazy" srcset="https://feeds.llun.dev/media/69a204c90d36f3fe3d3794d235e97b6cabe38447a2cb7e208d70302a853f7803.webp 150w, https://feeds.llun.dev/media/c6c3825b3771075b59d5e45e9fab1977cb7b7fc5a1616eedf12282f1799773b8.webp 75w" /&gt;&lt;/p&gt;
&lt;figure&gt;&lt;a href="https://feeds.llun.dev/media/30a70c694054852cd98df6f48b25fd284068a21d120adc018108d36dfd54ba48.webp"&gt;&lt;img src="https://feeds.llun.dev/media/30a70c694054852cd98df6f48b25fd284068a21d120adc018108d36dfd54ba48.webp" alt="" /&gt;&lt;/a&gt;&lt;/figure&gt;



&lt;p&gt;ทาง Google ได้ปล่อย &lt;strong&gt;&lt;a href="https://stitch.google.com/docs/cli/overview" target="_blank"&gt;Stitch CLI&lt;/a&gt;&lt;/strong&gt; ออกมาให้ใช้งาน&lt;br /&gt;รวมทั้ง skill /stitch เพื่อใช้งานใน AI Agent for coding ได้แบบง่าย ๆ ได้เลย&lt;br /&gt;ทำให้ workflow การออกแบบและสร้าง user interface ของระบบงานสะดวกมากยิ่งขึ้น&lt;br /&gt;โดยการทำงาน ประกอบไปด้วย&lt;/p&gt;



&lt;ul&gt;
&lt;li&gt;ทำการ generate user interface ออกมาให้&lt;/li&gt;



&lt;li&gt;ทำการแก้ไข user interface และ upload asset หรือ รูปต่าง ๆ เข้ามาได้เลย&lt;/li&gt;



&lt;li&gt;ทำการจัดการเรื่องของ  design system ของ agent ผ่านไฟล์ DESIGN.md&lt;/li&gt;



&lt;li&gt;ทำการเชื่อมต่อกับ code ใน local repository ของเราได้เลย (ทั้งเริ่มใหม่ หรือ อ่านจากระบบเดิมใน code)&lt;/li&gt;
&lt;/ul&gt;



&lt;span&gt;&lt;/span&gt;



&lt;p&gt;&lt;strong&gt;ทำให้เราสามารถสร้าง prototype ต่าง ๆ ของระบบงานได้สะดวกมากยิ่งขึ้น&lt;/strong&gt;&lt;/p&gt;



&lt;p&gt;จากเดิมที่ต้องทำผ่าน web นั่นเอง&lt;br /&gt;ดังนั้นมาลองใช้งานกันดู ว่าเป็นอย่างไรบ้าง ?&lt;/p&gt;



[gist id="ce68115a01c6b7acf4392a320bda41bd" file="1.txt"]



&lt;p&gt;จากนั้น  Stitch จะแนะนำให้ติดตั้ง Agent Skills ใน AI Agent for coding&lt;br /&gt;ยกตัวอย่างเช่นใน Claude code&lt;/p&gt;



[gist id="ce68115a01c6b7acf4392a320bda41bd" file="2.txt"]



&lt;p&gt;โดยใน skill นี้จะทำการตรวจสอบว่า project ปัจจุบันมีหรือไม่&lt;br /&gt;ถ้ามี code อยู่จะทำการแปลงจาก code มาเป็น design (code-to-design)&lt;br /&gt;ด้วยการสร้างไฟล์ DESIGN.md ออกมาให้&lt;br /&gt;และทำการหา route ต่าง ๆ และ capture screen มาให้เลย&lt;br /&gt;จากนั้นทำการ sync และ validate ต่อไป&lt;br /&gt;และมีการทำ mapping design ต่าง ๆ ให้อีกด้วย&lt;/p&gt;



&lt;p&gt;&lt;strong&gt;มาลองใช้งานแบบไม่มีอะไรเลยดีกว่า&lt;/strong&gt;&lt;/p&gt;



&lt;p&gt;มีขั้นตอนการใช้งานดังนี้&lt;/p&gt;



&lt;ul&gt;
&lt;li&gt;สร้าง project&lt;/li&gt;



&lt;li&gt;ทำการสร้างหน้าจอ หรือ screen ด้วยการเขียน prompt และระบุ device (DESKTOP หรือ MOBILE)&lt;/li&gt;



&lt;li&gt;ทำการ start server และเปิดดูหน้าจอที่สร้างขึ้นมาทั้งใน localhost หรือผ่าน web ของ stitch&lt;/li&gt;
&lt;/ul&gt;



[gist id="ce68115a01c6b7acf4392a320bda41bd" file="3.txt"]



&lt;figure&gt;&lt;a href="https://www.somkiat.cc/wp-content/uploads/2026/10/stitch-cli-02-scaled.jpg"&gt;&lt;img src="https://feeds.llun.dev/media/24866d3d4a51b94493dd4126a0c6b06adb949bb96d8bb66f45c870fa0473e933.jpg" alt="" /&gt;&lt;/a&gt;&lt;/figure&gt;



&lt;p&gt;และเปิดดูตัวอย่างได้เลยบน localhost&lt;/p&gt;



&lt;figure&gt;&lt;a href="https://www.somkiat.cc/wp-content/uploads/2026/10/stitch-cli-03.jpg"&gt;&lt;img src="https://feeds.llun.dev/media/da5fb4736ec053003363029978799f8ff1b9bccfd34c20f67de7ee50ff744588.jpg" alt="" /&gt;&lt;/a&gt;&lt;/figure&gt;



&lt;p&gt;&lt;strong&gt;ในกรณีที่เราต้องการให้ stitch cli อ่านข้อมูลจาก url  หรือ route จาก project ของเรา&lt;/strong&gt;&lt;/p&gt;



&lt;p&gt;เช่นในระบบมี url ชื่อว่า &lt;a href="http://localhost:3000/checkout"&gt;http://localhost:3000/checkout&lt;/a&gt;&lt;br /&gt;สามารถให้ stitch cli อ่านมาเป็น HTML และ capture หน้าจอมาใช้งาน&lt;br /&gt;สามารถทำได้ดังนี้&lt;/p&gt;



[gist id="ce68115a01c6b7acf4392a320bda41bd" file="4.txt"]



&lt;p&gt;ลองใช้งานกันดูครับ&lt;br /&gt;เป็นอีกเครื่องมือที่น่าสนใจ&lt;br /&gt;อ่านเอกสารเพิ่มเติมได้ที่  &lt;strong&gt;&lt;a href="https://stitch.google.com/docs/cli/overview/" target="_blank"&gt;Stitch CLI Quickstart&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;



&lt;p&gt;&lt;strong&gt;เพิ่มเติมการ validate การเปรียบเทียบ และ export token จากไฟล์ DESIGN.md&lt;/strong&gt;&lt;br /&gt;ด้วยการใช้งาน @google/design.md&lt;/p&gt;



[gist id="ce68115a01c6b7acf4392a320bda41bd" file="5.txt"]



&lt;p&gt;&lt;strong&gt;Reference websites&lt;/strong&gt;&lt;/p&gt;



&lt;ul&gt;
&lt;li&gt;&lt;a href="https://kevindavila.dev/en/blog/stitch-cli" target="_blank"&gt;Stitch CLI: Google Brings UI Design to the Terminal (and to Your Agent)&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content>
    <source>
      <title>cc :: somkiat</title>
      <link rel="self" href="https://www.somkiat.cc/feed/"/>
      <link rel="alternate" href="https://www.somkiat.cc"/>
    </source>
  </entry>
  <entry>
    <id>urn:uuid:47ebc994-b375-5c2f-a382-f24e87f2c78a</id>
    <title>มาทำความรู้จักกับ WSL containers กัน</title>
    <updated>2026-10-02T06:57:04.000Z</updated>
    <author>
      <name>somkiat</name>
    </author>
    <published>2026-10-02T06:57:04.000Z</published>
    <link rel="alternate" href="https://www.somkiat.cc/wsl-containers/"/>
    <category term="Thai"/>
    <content type="html">&lt;p&gt;&lt;img width="150" height="150" src="https://feeds.llun.dev/media/bcccef81f24b9e26b9c4e3fb0fea4bff182e4825162f6a9b8fb9465b83f79138.jpg" alt="" loading="lazy" srcset="https://feeds.llun.dev/media/bcccef81f24b9e26b9c4e3fb0fea4bff182e4825162f6a9b8fb9465b83f79138.jpg 150w, https://feeds.llun.dev/media/de6e53471b399d69ec2b153c8d4cf04e3d13b5a9786217a74a5d1473f04e6b88.jpg 75w" /&gt;&lt;/p&gt;
&lt;figure&gt;&lt;a href="https://www.somkiat.cc/wp-content/uploads/2026/10/wsl-containers.jpg"&gt;&lt;img src="https://feeds.llun.dev/media/49950d16c8ec7f0be8e8a3a7b0ca931b5089fbd6ca29bb696bced4ee09be4ca2.jpg" alt="" /&gt;&lt;/a&gt;&lt;/figure&gt;



&lt;p&gt;ทาง Microsoft ได้ปล่อย &lt;strong&gt;&lt;a href="https://blogs.windows.com/windowsdeveloper/2026/09/29/wsl-containers-now-generally-available/" target="_blank"&gt;WSL containers (wslc)&lt;/a&gt;&lt;/strong&gt; ตัว final ออกมาแล้ว&lt;br /&gt;อธิบายสั้น ๆ คือ เราสามารถจัดการ container ใน WSL ได้เองเลย&lt;br /&gt;โดยไม่ต้องติดตั้ง container engine ใด ๆ ยกตัวอย่างเช่น Docker เป็นต้น&lt;br /&gt;การทำงานยังทำงานใน Linux VM เหมือนกับ WSL นั่นเอง&lt;br /&gt;แต่ถูก customize ให้ทำงานร่วมกับ Windows OS ได้อย่างดี&lt;/p&gt;



&lt;span&gt;&lt;/span&gt;



&lt;p&gt;&lt;strong&gt;สถาปัตยกรรมของ &lt;a href="https://devblogs.microsoft.com/commandline/wslc-architecture-deep-dive/" target="_blank"&gt;WSL containers&lt;/a&gt; เป็นดังนี้&lt;/strong&gt;&lt;/p&gt;



&lt;figure&gt;&lt;a href="https://www.somkiat.cc/wp-content/uploads/2026/10/wslc-arch.webp.webp"&gt;&lt;img src="https://feeds.llun.dev/media/656a044afb95984fedf7d81f3457b35d9d921435146e1e0ce49e629856fb943c.webp" alt="" /&gt;&lt;/a&gt;&lt;/figure&gt;



&lt;p&gt;&lt;strong&gt;ในส่วนของ &lt;a href="https://learn.microsoft.com/th-th/windows/wsl/tutorials/wsl-containers"&gt;CLI&lt;/a&gt; ใช้งานจะคล้ายกับ Docker CLI&lt;/strong&gt;&lt;/p&gt;



[gist id="fdb08f68194f8882b7ab2f5af6cfca53" file="1.txt"]



&lt;p&gt;แต่ตอนนี้ยังไม่สนับสนุนไฟล์ Docker compose&lt;br /&gt;ซึ่งเป็น feature ที่จะเพิ่มเข้ามาในอนาคต&lt;br /&gt;ผ่านคำสั่ง &lt;strong&gt;$wslc compose&lt;/strong&gt;&lt;/p&gt;



&lt;p&gt;สำหรับสาย Windows ลอง update และใช้งานกันดูครับ&lt;/p&gt;



&lt;p&gt;&lt;strong&gt;Reference websites&lt;/strong&gt;&lt;/p&gt;



&lt;ul&gt;
&lt;li&gt;&lt;a href="https://x.com/msdev/status/2105797241026056326" target="_blank"&gt;WSL containers is now generally available&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content>
    <source>
      <title>cc :: somkiat</title>
      <link rel="self" href="https://www.somkiat.cc/feed/"/>
      <link rel="alternate" href="https://www.somkiat.cc"/>
    </source>
  </entry>
  <entry>
    <id>urn:uuid:75eaf4ac-01cd-5e0a-bc57-858e3c01bf14</id>
    <title>ทำเว็บส่งลิงก์(หรือข้อความ)ข้ามเครื่องแบบด่วนสุดๆ มาฝากครับ</title>
    <updated>2026-10-01T19:00:53.000Z</updated>
    <author>
      <name>iannnnn</name>
    </author>
    <published>2026-10-01T19:00:53.000Z</published>
    <link rel="alternate" href="https://iannnnn.com/2026/3473"/>
    <category term="Thai"/>
    <content type="html">&lt;p&gt;โจทย์มันเริ่มต้นที่ว่า พอดีในรถผมมีเบราว์เซอร์อยู่ เวลาจะส่งไฟล์ภาพ หรือลิงก์โหลดนั่นนี่ หรือลิงก์คลิปยูทูบ ลิงก์แผนที่ Google Maps ฯลฯ เข้าไป มันยากจัง อยากเป็นแบบที่เปิดลิงก์แล้วเซฟได้เลย ไม่ต้องลีลาใดๆ ทั้งสิ้น เลยลองทำเว็บแอปของเล่นที่แก้ปัญหานี้ดู&lt;/p&gt;



&lt;p&gt;&lt;strong&gt;วิธีใช้&lt;/strong&gt; มีแค่นี้แหละ&lt;/p&gt;



&lt;ol&gt;
&lt;li&gt;ผู้รับ (เช่น จอรถยนต์) ให้เปิดลิงก์ &lt;a href="https://anndo.com/s" target="_blank"&gt;&lt;em&gt;&lt;mark&gt;anndo.com/s&lt;/mark&gt;&lt;/em&gt;&lt;/a&gt;&lt;/li&gt;



&lt;li&gt;เปิดปุ๊บ เว็บจะมี QRCode โผล่มาให้คนอื่น/เครื่องอื่นสแกน&lt;/li&gt;



&lt;li&gt;ส่วนฝั่งผู้ส่ง (มือถือ) ก็เตรียมก็อปปี้ link text รอไว้นะ พอฝั่งผู้รับแสดง QRCode ก็สแกนปุ้ง&lt;/li&gt;



&lt;li&gt;แล้วผู้รับ (จอรถ) ก็จะเปิดลิงก์ที่ส่งไป ไม่ว่าจะยาวแค่ไหน ถ้าเป็นยูทูบไรงี้มันก็จะเปิดเล่นได้ทันที&lt;/li&gt;
&lt;/ol&gt;



&lt;p&gt;นั่นแหละ ง่ายๆ แค่นั้น&lt;br /&gt;แต่พอทำไปทำมา จูนไปเรื่อยๆ มันกันใช้งานได้ประโยชน์มากกว่านั้นเยอะเลยแฮะ&lt;/p&gt;



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



&lt;p&gt;ลิงก์หรือข้อความที่ส่งไป ส่งเสร็จปุ๊บ มันจะลบทิ้งเลย ไม่มีการเก็บค้างไว้ ปลอดภัย ไว จบใน 1 นาที&lt;/p&gt;



&lt;p&gt;&lt;strong&gt;ข้อแม้ / ข้อจำกัด&lt;/strong&gt;มีเพียง&lt;/p&gt;



&lt;ul&gt;
&lt;li&gt;ผู้ส่งและผู้รับต้องต่อเน็ตได้&lt;/li&gt;



&lt;li&gt;ผู้ส่งต้องมีกล้องที่สามารถสแกน QRCode ได้ (ส่วนผู้รับไม่ต้องมีกล้องก็ได้)&lt;/li&gt;
&lt;/ul&gt;



&lt;p&gt;เพราะถ้ามีกล้องกันทั้งคู่ ก็เชิญไปเจน QRCode ส่งลิงก์ส่งไฟล์อะไรกันก็ว่าไป แต่เราจะทำเป็นไม่รู้ไม่เห็น&lt;/p&gt;



&lt;figure&gt;&lt;img loading="lazy" width="1024" height="683" src="https://feeds.llun.dev/media/7db5ffc38bc4cd332f1cd73904b1d71f65f3dfadc6fdda9d01159f5adcbe3ff8.webp" alt="" srcset="https://feeds.llun.dev/media/7db5ffc38bc4cd332f1cd73904b1d71f65f3dfadc6fdda9d01159f5adcbe3ff8.webp 1024w, https://feeds.llun.dev/media/e470c2b9ece5292308464e33bf5779cd01899ef05358ddcd91418377f8a903d2.webp 300w, https://feeds.llun.dev/media/1fd0f4e7dc796f434dd90872f7de8d2431d307fa2c660e0833a2cc735ece339f.webp 768w, https://feeds.llun.dev/media/62d828778c0e6299c6fcb6373d578774d2eed85db5f8f2f2cc1a9905e6e7a9b9.webp 1536w, https://feeds.llun.dev/media/6a2ddbd3ab4129df2dfeed390a0915a736abeb61073e886d63d7fc5b0c451c0b.webp 1600w" /&gt;&lt;/figure&gt;



&lt;p&gt;&lt;strong&gt;ตัวอย่างการใช้งานในโลกจริง&lt;/strong&gt;&lt;/p&gt;



&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;ใช้ในรถ&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;โยนพิกัด Google Maps เข้าจอรถ : เปิดมือถือ แชร์ลิงก์เข้าไปปุ๊บ จอบนรถเปิดแผนที่พร้อมนำทางทันที ไม่ต้องมานั่งพิมพ์หาชื่อร้านเอง&lt;/li&gt;



&lt;li&gt;โยนคลิปยูทูบ/เพลง ขึ้นจอ แล้วมันจะเด้งไปเปิดแอปเอง (เทสต์กับรถที่จอเป็นแอนดรอยด์)&lt;/li&gt;



&lt;li&gt;โยนลิงก์ Google Drive เพื่อโหลดไฟล์ หรือภาพที่ค้นเอาจากมือถือ (มันพิมพ์ง่ายกว่าไง) แล้วเปิดในรถ เซฟทำวอลเปเปอร์ หรือโหลดแอปติดตั้งเพิ่ม (เทสต์กับรถตัวเองที่ลงแอปได้)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;



&lt;li&gt;&lt;strong&gt;ใช้ข้ามแพลตฟอร์ม&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;โยนลิงก์โปรไฟล์โซเชียล อีเมล หรือข้อมูลที่เป็นลิงก์ หรือข้อความสั้นๆ (ยาวก็ได้) ให้คนนู้นคนนี้ที่เพิ่งเจอกันแป๊บๆ หรือเจอกันนานแล้ว แต่ใช้เทคโนโลยีไม่เป็น (นึกภาพว่าเมียเรา) ได้&lt;/li&gt;



&lt;li&gt;ไม่ว่าอีกฝ่ายจะใช้มือถือหรือแท็บเล็ตไอแพดใดๆ รุ่นไหนก็ได้ เปิดลิงก์เว็บนี้ปุ๊บ ก็ส่งข้ามกันได้แบบไม่ต้องห่วงกำแพงแล้ว &lt;em&gt;“ขอแค่อีกฝ่ายเปิดเว็บได้ก็พอ”&lt;/em&gt;&lt;/li&gt;



&lt;li&gt;เออ ไม่ต้องแอดไลน์กันด้วย อันนี้ส่วนตัวแล้วเกลียดจัดๆ เลย เวลาคุยงานกับเซลล์หรือใครไม่รู้ที่ชาตินี้คงจะเจอกันครั้งเดียว แล้วต้องมาแอดไลน์ เพื่อโยนอะไรให้กันน่ะ เลิก&lt;/li&gt;



&lt;li&gt;เหล่า dev มือใหม่มือเก่า ก็เอาไว้โยนโค้ดสั้นๆ ให้กันได้แบบไม่ผูกพัน หรือต้องมานั่งสะกด&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;



&lt;li&gt;&lt;strong&gt;ใช้กับคอมพ์สาธารณะ หรือคอมพ์คนอื่น&lt;/strong&gt; ที่ไม่ได้อยากผูกพันแม้แต่น้อย
&lt;ul&gt;
&lt;li&gt;ที่จริงมันก็ซ้ำๆ กับตัวอย่างในข้อที่แล้วแหละ แต่เขียนเพิ่มไว้ให้งงๆ จะได้รู้ว่าเขียนเอง ไม่ใช่ เไ&lt;/li&gt;



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



&lt;li&gt;&lt;strong&gt;ใช้บนจอโปรเจกเตอร์&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;เอาฟีเจอร์ที่มีนี้ไปประยุกต์ทำกิจกรรมเล่นได้สารพัด เช่น ครูเปิด QRCode บนจอ ใครที่สแกนและกดส่งคำตอบไวกว่า คนนั้นชนะ ได้ไปเลยห้าล้านเยน หรือประยุกต์ใช้เล่นปาร์ตี้เกม​ชิงรางวัลใดๆ&lt;/li&gt;



&lt;li&gt;ตั้งตนเป็นดีเจ เปิดจอ ขอเพลงได้ ใครเลือกเพลงเสร็จก็แชร์ลิงก์ยูทูบเข้าไป มันก็เปิดขึ้นจอทันที&lt;/li&gt;



&lt;li&gt;แข่งกันส่งข้อความบอกรักขึ้นจอ แหม วัยรุ่นจังเลยเราเนี่ย&lt;/li&gt;



&lt;li&gt;(จริงจังบ้าง) ส่งพรีเซนต์ขึ้นจอของใครไม่รู้แบบไม่ต้องแชร์หรือผูกโปรไฟล์ขึ้นจอใหญ่ พวก Google Slides / Google Sheets ก็เปิดได้เลย&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;



&lt;p&gt;ฯลฯ&lt;/p&gt;



&lt;p&gt;เนี่ยพอทำอันนี้ มันต่อยอดไปเป็นอะไรๆ ที่มีการโยน การรับ และการแสดงผลได้อีกเยอะเลย แก้ปัญหาของตัวเองแล้วก็เจอวิธีใช้สนุกๆ อีกเพียบ&lt;/p&gt;



&lt;p&gt;ลองจิ้มเล่น / bookmark เผื่อไว้ใช้ได้ที่:&lt;/p&gt;



&lt;p&gt;&lt;strong&gt;Send Text &amp;amp; Link&lt;br /&gt;&lt;/strong&gt;&lt;a href="https://anndo.com/s" target="_blank"&gt;anndo.com/s&lt;/a&gt;&lt;/p&gt;



&lt;p&gt;&amp;lt;anndo/&amp;gt; นี่ตอนนี้มีโฟลเดอร์ย่อยเต็มไปหมดแล้ว อันที่เปิดสาธารณะก็ใกล้จะครบ a-z แล้วง่ะ ตัยแร้ว&lt;/p&gt;</content>
    <source>
      <title>iannnnn.com</title>
      <link rel="self" href="https://iannnnn.com/feed"/>
      <link rel="alternate" href="https://iannnnn.com"/>
    </source>
  </entry>
  <entry>
    <id>urn:uuid:f9480686-1bc1-5a8e-be91-4b0da37a3808</id>
    <title>สรุปประเด็นที่น่าสนใจใน State of agent skills จาก Vercel</title>
    <updated>2026-10-01T12:23:17.000Z</updated>
    <author>
      <name>somkiat</name>
    </author>
    <published>2026-10-01T12:23:17.000Z</published>
    <link rel="alternate" href="https://www.somkiat.cc/state-of-agent-skills-from-vercel/"/>
    <category term="Thai"/>
    <content type="html">&lt;p&gt;&lt;img width="150" height="150" src="https://feeds.llun.dev/media/8f22e797cad60f830985f8c5d2f92ffb1b3bd7ac46cb2ab484ca521ba9b0f4fa.jpg" alt="" loading="lazy" srcset="https://feeds.llun.dev/media/8f22e797cad60f830985f8c5d2f92ffb1b3bd7ac46cb2ab484ca521ba9b0f4fa.jpg 150w, https://feeds.llun.dev/media/c83e60425f766dc96f9d5142aa4216eb5e59f642058a426eeaefa48347a95f72.jpg 75w" /&gt;&lt;/p&gt;
&lt;figure&gt;&lt;a href="https://www.somkiat.cc/wp-content/uploads/2026/10/agent-skill-01.jpg"&gt;&lt;img src="https://feeds.llun.dev/media/9cfc7043a68f2fb5972a96049f996674a24745d334eda06e1a3358f045d5d791.jpg" alt="" /&gt;&lt;/a&gt;&lt;/figure&gt;



&lt;p&gt;ทาง Vercel ได้ปล่อยบทความเรื่อง &lt;strong&gt;&lt;a href="https://vercel.com/blog/state-of-agent-skills" target="_blank"&gt;State of agent skills&lt;/a&gt;&lt;/strong&gt; ออกมา&lt;br /&gt;ว่าด้วยเรื่องของสถิตการสร้างและใช้งาน Agent Skills ในระบบ &lt;strong&gt;&lt;a href="https://www.skills.sh/" target="_blank"&gt;skills.sh&lt;/a&gt;&lt;/strong&gt; ออกมา&lt;br /&gt;ซึ่งพบว่าจำนวนของ skills เกิน 1 ล้านไปแล้วภายใน 7 เดือน&lt;br /&gt;และมีการใช้งานมากกว่า 280 ล้านครั้ง&lt;/p&gt;



&lt;span&gt;&lt;/span&gt;



&lt;p&gt;&lt;strong&gt;โดยที่ skills นั้นคือการสร้างความรู้ ขั้นตอนการทำงานต่าง ๆ ของระบบงาน&lt;/strong&gt;&lt;br /&gt;เพื่อเป็นข้อมูลให้ AI Agent ทำงานแบบเฉพาะเจาะจงตามที่เราต้องการ&lt;br /&gt;ด้วยภาษาคนทั่ว ๆ ไปนั่นเอง&lt;br /&gt;ทำให้การสร้าง skills นั้นง่าย และจำนวนเยอะจึงเยอะขึ้นอย่างมาก&lt;/p&gt;



&lt;p&gt;ปล. แถมมี skills เพื่อสร้าง skills อีกด้วย !!&lt;/p&gt;



&lt;p&gt;&lt;strong&gt;Skills ส่วนใหญ่ในระบบของ skills.sh นั้น 50% เป็นฝั่งของ technical&lt;/strong&gt;&lt;/p&gt;



&lt;p&gt;และ 25% เป็น skills เกี่ยวกับ software engineering ไปเลย&lt;br /&gt;น่าจะทำให้เห็นว่า คนใช้งานส่วนใหญ่ของระบบนั่นเอง !!&lt;/p&gt;



&lt;p&gt;&lt;strong&gt;แต่เมื่อไปดู skills ที่ถูกติดตั้งหรือ download&lt;/strong&gt;&lt;br /&gt;กลับพบว่าในแต่ละหมวดหมู่เป็นดังนี้&lt;/p&gt;



&lt;ul&gt;
&lt;li&gt;Software engineering 18%&lt;/li&gt;



&lt;li&gt;Agent workflow 15%&lt;/li&gt;



&lt;li&gt;Business operations 11%&lt;/li&gt;



&lt;li&gt;Writing and document 11%&lt;/li&gt;



&lt;li&gt;Cloud infrastructure &amp;lt;10%&lt;/li&gt;
&lt;/ul&gt;



&lt;p&gt;&lt;strong&gt;พบว่า skills ด้าน Business operation, Writing and document และ Cloud infrastructure  นั้น&lt;/strong&gt;&lt;br /&gt;มีจำนวนการใช้งานมากกว่าจำนวน skills ที่มีอีก&lt;br /&gt;นั่นหมายความว่า skills เหล่านี้มีความต้องการสูงแต่ยังขาดเยอะ&lt;br /&gt;แสดงดังรูป&lt;/p&gt;



&lt;figure&gt;&lt;a href="https://www.somkiat.cc/wp-content/uploads/2026/10/agent-skills-usage.jpg"&gt;&lt;img src="https://feeds.llun.dev/media/d7df5a26aa1ea599da4d900fa0660bd77f67d8a1343af8048d77bb7580f162e1.jpg" alt="" /&gt;&lt;/a&gt;&lt;/figure&gt;



&lt;p&gt;&lt;strong&gt;และพบว่ายอดการติดตั้ง skills ด้าน Agent Workflows &amp;amp; Automation จะเยอะมาก ๆ&lt;/strong&gt;&lt;br /&gt;ยกตัวอย่างเช่น &lt;/p&gt;



&lt;ul&gt;
&lt;li&gt;การวางแผนงาน &lt;/li&gt;



&lt;li&gt;การกระจายงาน &lt;/li&gt;



&lt;li&gt;การเลือกใช้เครื่องมือ&lt;/li&gt;



&lt;li&gt;การควบคุม web browser&lt;/li&gt;
&lt;/ul&gt;



&lt;p&gt;เพื่อความสามารถให้ Agent ทำงานได้ดียิ่งขึ้นนั่นเอง&lt;br /&gt;รวมทั้งการใช้ Agent เพื่อปรับปรุงการทำงานของ Agent !!&lt;/p&gt;



&lt;figure&gt;&lt;a href="https://www.somkiat.cc/wp-content/uploads/2026/10/agent-skills-download.jpg"&gt;&lt;img src="https://feeds.llun.dev/media/177f9a8bdfdfabdfa4778457c582bf8bb01ca120067b4bb6c2fd800e1a77dc3e.jpg" alt="" /&gt;&lt;/a&gt;&lt;/figure&gt;



&lt;p&gt;&lt;strong&gt;สิ่งที่น่าสนใจคือ มี skills เพียง 0.04% เท่านั้น หรือ 375 skills&lt;/strong&gt;&lt;br /&gt;ที่ถูก download ไปรวมกัน 62%&lt;br /&gt;ผู้ใช้งานจะเลือกใช้งานตัวที่ดีที่สุด และ ตัวที่เกี่ยวข้องเท่านั้น&lt;br /&gt;ส่วนตัวอื่น ๆ ก็ถูกทิ้งไป&lt;br /&gt;ส่วน skills ที่เป็นไปตามมาตรฐานกลางต่าง ๆ ของกลุ่มงานนั้น ๆ&lt;br /&gt;จะถูกใช้งานมากกว่าทำเฉพาะตัวหรือบริษัท&lt;br /&gt;ซึ่งมันก็เป็นเรื่องปกติของ skills ที่ share หรือ reuse นั่นเอง&lt;/p&gt;



&lt;p&gt;&lt;strong&gt;ในบทความยังได้สรุปเรื่องของ Skills ในอนาคตว่าจะเป็นอย่างไร ?&lt;/strong&gt;&lt;/p&gt;



&lt;p&gt;สิ่งที่น่าจะเกิดขึ้นคือ จาก public knowledge ที่เกิดขึ้น&lt;br /&gt;จะเปลี่ยนมาเป็น private knowledge หรือความรู้เฉพาะกับบริษัทหรือธุรกิจนั้น ๆ มากขึ้น&lt;br /&gt;ทั้งเงื่อนไขต่าง ๆ เชิง business&lt;br /&gt;และมาตรฐานของการทำงานและส่งมอบงาน&lt;/p&gt;



&lt;p&gt;รวมทั้งเริ่มมีการวัดผลของ skills มากกว่ายอดการ download&lt;br /&gt;แต่จะมีการ eval มากขึ้น&lt;br /&gt;และมีการทดสอบด้วยว่า การใช้และไม่ใช้ skills นั้น มันส่งผลต่อการทำงานของ Agent หรือไม่ ?&lt;br /&gt;แบบไหนที่ Agent ทำงานได้มีประสิทธิภาพกว่ากัน&lt;/p&gt;



&lt;p&gt;ลองดอ่านรายละเอียดเพิ่มเติอมจากบทความ &lt;strong&gt;&lt;a href="https://vercel.com/blog/state-of-agent-skills" target="_blank"&gt;State of agent skills&lt;/a&gt;&lt;/strong&gt;&lt;br /&gt;&lt;/p&gt;
</content>
    <source>
      <title>cc :: somkiat</title>
      <link rel="self" href="https://www.somkiat.cc/feed/"/>
      <link rel="alternate" href="https://www.somkiat.cc"/>
    </source>
  </entry>
  <entry>
    <id>urn:uuid:3b6863e1-deb6-5b06-be46-f4474d61b50a</id>
    <title>3-6-flexagon</title>
    <updated>2026-10-01T04:38:05.000Z</updated>
    <author>
      <name>neizod's speculation</name>
    </author>
    <published>2026-10-01T04:38:05.000Z</published>
    <link rel="alternate" href="https://neizod.dev/2026/10/01/trihexaflexagon.html"/>
    <category term="Thai"/>
    <content type="html">&lt;p&gt;สืบเนื่องจากเดือนที่ผ่านมามีโอกาสได้ไป すみだ水族館 (พิพิธภัณฑ์สัตว์น้ำซุมิดะ) ซึ่งมีฟรีเวิร์คช็อปให้เราประดิษฐ์ของเล่นเกี่ยวกับสัตว์น้ำ ตรงนี้แอบตกใจเล็กน้อยที่แม้ว่าของเล่นนั้นจะเกี่ยวข้องกับการพับกระดาษก็ตาม แต่มันก็ไม่ได้ถูกพับออกมาเป็นรูปทรงสัตว์น้ำเสียทีเดียว กลับกันว่ามันเป็นการพับรูปทรงพื้นฐานทางเรขาคณิตอย่างหกเหลี่ยมที่มีภาพวาดเป็นรูปสัตว์น้ำ แต่แฝงลูกเล่นที่สำคัญไว้ก็คือ เราสามารถจับเอาหกเหลี่ยมชิ้นนี้มา “หักงอ” ตรงกลางเพื่อกางหกเหลี่ยมที่มีภาพอื่นซ่อนอยู่ออกมาได้!&lt;/p&gt;

&lt;blockquote&gt;
  &lt;table&gt;
    &lt;tbody&gt;
      &lt;tr&gt;
        &lt;td&gt;&lt;img src="https://feeds.llun.dev/media/b7c32b751c6a527f94e8dbcfe3cd5836347adad3477dc8e7ce8545fdd3f31d5a.jpg" alt="" /&gt;&lt;/td&gt;
        &lt;td&gt;&lt;img src="https://feeds.llun.dev/media/50bdd9a67e0b0afe6de26d2902a6fe0d4d61a4129e8742d963467bb2d6bff4be.jpg" alt="" /&gt;&lt;/td&gt;
        &lt;td&gt;&lt;img src="https://feeds.llun.dev/media/73f05d27139b8c8528ffe987239e0e744f2d9be4bf97260d49199f04ff1fad36.jpg" alt="" /&gt;&lt;/td&gt;
      &lt;/tr&gt;
    &lt;/tbody&gt;
  &lt;/table&gt;

  &lt;p&gt;ของเล่นรูปหกเหลี่ยมที่สามารถกางออกมาเป็นภาพปลาทองได้สามมุมมอง&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;ตัวของเล่นสร้างมาจากแถบกระดาษยาวๆที่แบ่งย่อยเป็นสามเหลี่ยมด้านเท่าจำนวน 10 ชิ้นที่อยู่ติดกัน ซึ่งมองแว๊บแรกแล้วแอบรู้สึกว่ามันเป็นอะไรที่ดูญี่ปู๊นญี่ปุ่นมากๆ จนเราหลงทางไปค้นเกี่ยวกับ 折り紙 (โอริกามิ: การพับกระดาษแบบญี่ปุ่น) อยู่เสียนานแต่ก็ไม่พบผลลัพธ์อะไร จนกระทั่งกลับมาไทยแล้วเห็นว่า&lt;a href="https://facebook.com/warakkag"&gt;อ.สร้างสรรค์&lt;/a&gt;ก็จัดเวิร์คช๊อปที่เกี่ยวกับของเล่นชิ้นนี้พอดี พร้อมหย่อนคำสำคัญว่า “&lt;a href="https://en.wikipedia.org/wiki/Flexagon"&gt;trihexaflexagon&lt;/a&gt;” ทิ้งไว้ในโพสต์…&lt;/p&gt;

&lt;p&gt;ซึ่งพอเอาคำนี้ไปค้นต่อก็ถึงบางอ้อว่าที่ผ่านมาทำไมค้นเองไม่เจอ เพราะของเล่นชิ้นนี้ไม่ได้มีต้นกำเนิดมาจากญี่ปุ่น แต่กลับกลายเป็นว่ามันมีจุดเริ่มต้นจากฝั่งอังกฤษต่างหาก! และมันก็เพิ่งจะเกิดขึ้นมาไม่นานนี้เองด้วย นั่นคือเมื่อปี 1939 ที่ผ่านมานี้เอง โดยมีตัวตั้งตัวตีสำคัญคือ Arthur H. Stone และเหล่าผองเพื่อนสมัยยังเป็นนักศึกษามหาวิทยาลัยพรินซ์ตัน อันได้แก่ Bryant Tuckerman, John Tukey, และ Richard Feynman (ใช่แล้ว Feynman คนนั้นแหล่ะ!)&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;&lt;img src="https://feeds.llun.dev/media/5e5803fcc3f8f96ebca385fcb69786f20822fe18bc81e699b5f261c575f22028.jpg" alt="" /&gt;&lt;/p&gt;

  &lt;p&gt;พิพิธภัณฑ์ให้แถบกระดาษมาพับเล่นแค่ 1 ชิ้น เลยกลับมาสร้างเพิ่มเองซะเลย&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;ยอมรับโดยสัตย์จริงว่า ชื่อเต็มๆของมัน trihexaflexagon ก็แอบฟังดูน่ากลัวไม่ใช่น้อย แต่ถ้าแยกคำศัพท์ออกมาเป็นหน่วยย่อยๆแล้วจะได้ว่ามันคือ&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;tri-&lt;/strong&gt; สาม: ในที่นี้หมายถึง เราสามารถหักงอได้สามครั้ง&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;hex-&lt;/strong&gt; หก: ในที่นี้หมายถึง แต่ละหน้าเป็นรูปหกเหลี่ยม&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;flex&lt;/strong&gt; งอ: ในที่นี้หมายถึง เราสามารถหักงอรูปหกเหลี่ยมแล้วกางเอาหน้าที่ซ่อนไว้ข้างในออกมาได้&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;-gon&lt;/strong&gt; รูปเหลี่ยมๆ (เหมือนในคำว่า polygon)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;หรือถ้าจะเขียนให้&lt;em&gt;ดูน่ากลัวน้อยลง&lt;/em&gt;ซักนิดนึง ก็อาจเขียนว่า 3-6-flexagon แทนก็ได้&lt;/p&gt;

&lt;h2&gt;วิธีพับสร้างของเล่น&lt;/h2&gt;

&lt;p&gt;ความน่าสนใจก็คือ ถ้าเราไปตามหาอ่านงานต่างๆที่สอนวิธีพับเจ้า 3-6-flexagon จะเห็นว่าเค้าสอนด้วยวิธีที่&lt;em&gt;ไม่ง่าย&lt;/em&gt;ที่จะพับตามเท่าไหร่ ซึ่งอาจสรุปได้ประมาณนี้&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;ตัดกระดาษเป็นแถบที่ประกอบด้วยสามเหลี่ยมด้านเท่าเรียงสลับกัน 10 ชิ้น&lt;/li&gt;
  &lt;li&gt;จากฝั่งหัว นับสามเหลี่ยม 3 ชิ้น พับตามรอย (จะได้รูปร่างคล้ายไม้เท้า)&lt;/li&gt;
  &lt;li&gt;จากฝั่งหาง นับสามเหลี่ยม 4 ชิ้น พับตามรอย&lt;/li&gt;
  &lt;li&gt;ถึงตอนนี้เราจะได้หกเหลี่ยมที่มีแง่งยื่นออกมา พับแง่งนั้นเข้ามาแล้วทากาวประกบ&lt;/li&gt;
&lt;/ol&gt;

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

&lt;p&gt;วิธีการพับดังกล่าวอาจเรียกว่าเป็นวิธีการพับแบบ Gardner ก็ได้ เนื่องจากว่า Martin Gardner ได้นำเสนอเจ้า 3-6-flexagon นี้จนโด่งดังในปี 1956 ผ่านนิตยสาร Scientific American&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;&lt;img src="https://feeds.llun.dev/media/2023841cbc4d290c5a089080132a8384d37089614ec447bf4afa06c578e15447.jpg" alt="" /&gt;&lt;/p&gt;

  &lt;p&gt;วิธีการพับ 3-6-flexagon จากพิพิธภัณฑ์สัตว์น้ำ&lt;/p&gt;
&lt;/blockquote&gt;

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

&lt;p&gt;จุดมหัศจรรย์คือ วิธีการพับทั้งสองนั้นให้ผลลัพธ์ปลายทางเดียวกันเป๊ะ!&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;&lt;img src="https://feeds.llun.dev/media/60c0a1815fc03f44c27e06f9ad016b450235a0de92538ab7005c955851b680c0.png" alt="" /&gt;&lt;/p&gt;

  &lt;p&gt;ตัวอย่างกระดาษพิมพ์ลายสำหรับสร้าง 3-6-flexagon&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;ส่วนใครที่อยากสร้างของเล่นชิ้นนี้ขึ้นมาเองบ้าง สามารถ&lt;a href="https://neizod.dev/files/3-6-flexagon.pdf"&gt;ดาวน์โหลดไฟล์ PDF&lt;/a&gt; ที่ความละเอียด 300 DPI ไปพิมพ์+ตัด+พับ+ทากาวแล้วเล่นกับมันได้เลย โดยไฟล์ภาพที่เราทำให้ไว้นี้เป็นแบบสั่งพิมพ์หน้าเดียวพอ หลังจากนั้นจึงค่อยพับครึ่งตามแนวยาวเพื่อจำลองเป็นกระดาษที่พิมพ์สองหน้า&lt;sup&gt;&lt;a href="https://neizod.dev/2026/10/01/trihexaflexagon.html#fn:1"&gt;1&lt;/a&gt;&lt;/sup&gt; และหากไม่อยากให้กระดาษมีความหนาไม่สม่ำเสมอกัน ก็สามารถตัดหน้าสามเหลี่ยมที่มีสัญลักษณ์ทากาวทิ้งไปได้อีกด้วย&lt;/p&gt;

&lt;h2&gt;หน้าทั้งหมดที่แตกต่างกัน และทฤษฎีกรุ๊ป&lt;/h2&gt;

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

&lt;p&gt;แต่ถ้าเรา “กลับด้าน” รูปหกเหลี่ยมไปดูอีกฝั่ง จะเห็นว่าเราได้ผลลัพธ์ที่มีลวดลายไม่เหมือนกับที่เคยเห็นมาทั้งหมดเสียทีเดียว&lt;sup&gt;&lt;a href="https://neizod.dev/2026/10/01/trihexaflexagon.html#fn:2"&gt;2&lt;/a&gt;&lt;/sup&gt; ซึ่งจะเห็นได้ชัดสำหรับ 3-6-flexagon ที่วาดภาพปลาทองนั่นเอง&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;&lt;img src="https://feeds.llun.dev/media/6949617534ba740d71ca3a8d2781cd154361a88d9cda1f4f7e0f617fdd4d9b3d.jpg" alt="" /&gt;&lt;/p&gt;

  &lt;p&gt;ภาพข้างหน้าและข้างหลังของ 3-6-flexagon โดยฝั่งข้างหลังถูกสะท้อนผ่านกระจกเงา&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;ดังนั้นจริงๆแล้วรูป 3-6-flexagon จึงมีหน้าหกเหลี่ยมที่แตกต่างกันอยู่ทั้งหมดถึง $3\times2=6$ หน้า ที่หากเราดูให้ลึกลงไปในรายละเอียดแล้ว จะเห็นว่าหน้าหกเหลี่ยมแต่ละหน้าจะมี “คู่กลับ” ของมันอยู่ ซึ่งเกิดจากการเรียงตัวสามเหลี่ยมย่อยๆไปในทิศทางตรงข้ามกันนั่นเอง&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;&lt;img src="https://feeds.llun.dev/media/735b96f8ccc95129954ad8767621ea4921fa881fc6a4c2563e5d2b4b4b7c02fc.jpg" alt="" /&gt;&lt;/p&gt;

  &lt;p&gt;พับหน้ายิ้มให้กลายเป็นหน้าบึ้ง!&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;เราจะนิยามการดำเนินการบน 3-6-flexagon ให้ชัดเจน ดังนี้:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;&lt;strong&gt;งอ&lt;/strong&gt; ($f$: flex) การหักงอเอาหน้าหกเหลี่ยมที่ซ่อนอยู่ข้างในในออกมา&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;กลับ&lt;/strong&gt; ($t$: turn) การกลับด้านไปอีกฝั่ง โดยยึดแกนตั้งเป็นแกนหมุน&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;หมุน&lt;/strong&gt; ($r$: rotate) การหมุนในทิศตามเข็มนาฬิกาด้วยมุม 60 องศา&lt;/li&gt;
&lt;/ol&gt;

&lt;blockquote&gt;
  &lt;p&gt;&lt;img src="https://feeds.llun.dev/media/6420fd6b8294929e1cb6e1ca94575ba424693bb1a8af40600f1df8a816e65cee.jpg" alt="" /&gt;&lt;/p&gt;

  &lt;p&gt;สองการดำเนินการพื้นฐานบน 3-6-flexagon&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;ยิ่งไปกว่านั้น เราอาจนับจำนวนหน้าทั้งหมดโดยพิจารณาการหมุนเข้าไปด้วยก็ได้ ด้วยวิธีคิดเช่นนี้ จะทำให้เรามีหน้าที่แตกต่างกันทั้งหมด $6\times6=36$ หน้า&lt;/p&gt;

&lt;p&gt;เมื่อเราทดลองเล่นกับตัวดำเนินการเหล่านี้ไปเรื่อยๆ เราอาจวาดแผนภาพของการดำเนินการบนของเล่นชิ้นนี้ได้ออกมาเป็นหน้าตาประมาณนี้&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;&lt;img src="https://feeds.llun.dev/media/3965f7ab3268ae48c115be0bcaedd407c95cfaaa03549bf951226cea89f49d77.png" alt="" /&gt;&lt;/p&gt;

  &lt;p&gt;โครงสร้างกรุ๊ปของหน้าหกเหลี่ยมผ่านตัวดำเนินการต่างๆ&lt;/p&gt;
&lt;/blockquote&gt;

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

\[r = f^3\]

&lt;p&gt;หรือก็คือ การหมุนนั้นไม่จำเป็นสำหรับการดำเนินการพื้นฐานของกรุ๊ปนี้ เพราะเราสามารถจำลองมันได้โดยการงอติดกันสามครั้งนั่นเอง&lt;/p&gt;

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

&lt;ul&gt;
  &lt;li&gt;Hilton, P., &amp;amp; Pedersen, J. (2010). &lt;em&gt;A mathematical tapestry: demonstrating the beautiful unity of mathematics&lt;/em&gt;. Cambridge University Press.&lt;/li&gt;
  &lt;li&gt;&lt;a href="https://scientificamerican.com/article/flexagons/"&gt;Gardner, M. (1956). Flexagons. &lt;em&gt;Scientific American&lt;/em&gt;, &lt;em&gt;195&lt;/em&gt;(6), 162-168.&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;div&gt;
  &lt;ol&gt;
    &lt;li&gt;
      &lt;p&gt;เครื่องพิมพ์ตามบ้าน/สำนักงานโดยทั่วไปมักพิมพ์ลวดลายทั้งสองหน้าได้ทาบกันไม่สนิทพอดี จึงคิดว่าใช้วิธีพิมพ์เพียงหน้าเดียวแล้วค่อยพับครึ่งเอาดีกว่า &lt;a href="https://neizod.dev/2026/10/01/trihexaflexagon.html#fnref:1"&gt;↩&lt;/a&gt;&lt;/p&gt;
    &lt;/li&gt;
    &lt;li&gt;
      &lt;p&gt;ในไฟล์ PDF ที่ทำเป็นตัวอย่างให้ไว้ มีบางลวดลายที่เราจงใจออกแบบให้การลับด้านรูปหกเหลี่ยมแล้วยังคงได้ลวดลายที่ดูเหมือนเดิม &lt;a href="https://neizod.dev/2026/10/01/trihexaflexagon.html#fnref:2"&gt;↩&lt;/a&gt;&lt;/p&gt;
    &lt;/li&gt;
  &lt;/ol&gt;
&lt;/div&gt;</content>
    <source>
      <title>neizod's speculation</title>
      <link rel="self" href="https://neizod.github.io/feed.xml"/>
      <link rel="alternate" href="https://neizod.dev/"/>
    </source>
  </entry>
  <entry>
    <id>urn:uuid:3795cae1-2b9c-5ddd-8bb6-ad9399964448</id>
    <title>The Mandalorian and Grogu</title>
    <updated>2026-09-29T15:33:17.000Z</updated>
    <author>
      <name>Isriya Paireepairit</name>
    </author>
    <published>2026-09-29T15:33:17.000Z</published>
    <link rel="alternate" href="https://markpeak.net/the-mandalorian-and-grogu/"/>
    <category term="Thai"/>
    <content type="html">&lt;p&gt;ภาพยนตร์ในซีรีส์ The Mandalorian โดยนับเป็นภาค 4 ของ The Mandalorian ต่อจากเวอร์ชันซีรีส์ที่มี 3 ซีซั่น (เคยเขียนถึง &lt;a href="https://markpeak.net/the-mandalorian-season-1/"&gt;ซีซั่น 1&lt;/a&gt;, &lt;a href="https://markpeak.net/the-mandalorian-season-2/"&gt;ซีซั่น 2&lt;/a&gt;, ซีซั่น 3 ดูแล้วแต่ไม่ได้เขียน, &lt;a href="https://markpeak.net/the-book-of-boba-fett/"&gt;The Book of Boba Fett&lt;/a&gt;)&lt;/p&gt;
&lt;p&gt;เดิมทีเนื้อหาของภาคนี้ถูกออกแบบมาเป็นซีซั่น 4 แต่สุดท้ายถูกปรับมาเป็นหนังโรงแทน และใช้ชื่อว่า The Mandalorian and Grogu ที่หมายถึงสองตัวละครหลักของเรื่อง&lt;/p&gt;
&lt;p&gt;ประเด็นปัญหาของหนังน่าจะอยู่ตรงนี้เอง นั่นคือ เนื้อเรื่องเดิมทำเป็นซีรีส์ (คนดูต้องติดตามดูต่อกันถึงจะเข้าใจเรื่อง) แต่พอทำมาเป็นหนังโรงที่หวังกลุ่มคนดูกว้างขึ้น (คนที่ไม่เคยดูซีรีส์มาก่อน) มันเลยครึ่งๆ กลางๆ แล้วก็พินาศมาก&lt;/p&gt;
&lt;p&gt;สำหรับคนที่ไม่เคยดูซีรีส์มาก่อน มาเริ่มต้นดูเวอร์ชันหนังเลย ก็จะงงมากว่า The Mandalorian นี่คือใคร แล้วเจ้า Baby Yoda (ที่คนจำนวนมากไม่รู้ด้วยซ้ำว่าชื่อ Grogu) เกี่ยวข้องกันอย่างไร เพราะเริ่มหนังมา สองคนนี้ก็ออกตามล่าค่าหัวอาชญากรด้วยกันแล้ว ไม่มีที่มาที่ไปใดๆ ทั้งสิ้น&lt;/p&gt;
&lt;p&gt;ปมหลักของหนังที่ชูประเด็น “ซามูไรพ่อลูกอ่อน” หรือความสัมพันธ์ระหว่าง The Mandalorian กับ Grogu ในฐานะ “พ่อ-ลูก” ที่ไม่มีความสัมพันธ์ทางสายเลือด จึงไม่มีเวลาสร้างขึ้นเลย (ซึ่งในซีรีส์ใช้เวลาปูพื้นเรื่องนี้นานมากๆ) สิ่งที่เราเห็นในฉบับหนังคือ Grogu พยายามช่วย The Mandalorian แบบ (พยายาม) น่ารักๆ แต่ไม่มีที่มาที่ไปว่าทำไปเพื่ออะไร&lt;/p&gt;
&lt;p&gt;ส่วนปมรอง อย่างเรื่องธรรมเนียมปฏิบัติ (creed) ของพวก Mandalorian ที่ห้ามให้คนอื่นเห็นใบหน้าจริง ก็มีพูดถึงแบบผิวๆ สั้นๆ ทั้งที่เป็นอีกปมสำคัญมากๆ ในฉบับซีรีส์&lt;/p&gt;
&lt;p&gt;ดังนั้น สิ่งที่คนดูเวอร์ชันหนังแบบไม่ดูซีรีส์มาก่อนเห็น ก็จะเป็น อัศวินใส่เกราะวิบวับ บวกกับ Baby Yoda วิ่งไล่ล่าทำภารกิจจับคนร้าย ต่อสู้กับมอนสเตอร์ที่เปลี่ยนไปเรื่อยๆ (แบบค่อนข้างไร้ความหมาย ไม่เป็นที่น่าจดจำ) มีมุขตลกแบบไร้สาระบ้าง พยายามทำโทนหนังให้มันดูเบาขึ้นกว่าซีรีส์ (ซึ่งมันก็ไม่ค่อยตลก) แล้วก็จบเรื่องแบบงงๆ ว่าแล้วไงต่อ&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;ส่วนคนที่ดูฉบับซีรีส์มาแล้ว ก็เจอปัญหากลับกันคือ ดูหนังจบ 2 ชั่วโมงแล้วพบว่าเรื่องมันไม่ขยับไปไหนเลย เหมือนดู The Mandalorian ตอนพิเศษ (แนวๆ TV special) ที่มาตอบสนองแฟนๆ (ซึ่งก็ดันทำได้ไม่ดีอีก) แล้วจบไปแบบไม่ได้อะไรเลย&lt;/p&gt;
&lt;p&gt;ในซีรีส์บางตอนจะมีตอนลักษณะนี้คือ The Mandalorian ไปทำภารกิจอะไรบางอย่าง (ที่ไม่เกี่ยวกับเรื่องหลัก) ในดาวดวงใหม่ เจออุปสรรคบ้างเล็กน้อย เอาตัวรอดได้แล้วก็จบกันไป ซึ่งมันเป็นสิ่งที่ยอมรับได้สำหรับเวอร์ชันซีรีส์ (ช่วงแรกๆ ที่เป็นการปูพื้นภารกิจของ The Mandalorian ก่อนเข้าปมหลัก) แต่พอเอาพล็อตแบบเดียวกันมาทำเป็นหนังโรง (ซึ่งความคาดหวังสูงกว่าฉบับซีรีส์มาก แต่ดันทำได้แย่กว่าอีก) มันเลยยิ่งดูแบนๆ มั่วๆ เข้าไปใหญ่&lt;/p&gt;
&lt;p&gt;ในฐานะคนที่ดูซีรีส์มาแล้ว ผมดูไปได้ครึ่งเรื่องก็เบื่อแล้ว อยากเลิก แต่ดูมาแล้วก็อดทนเอาให้จบ&lt;/p&gt;
&lt;p&gt;หนังยังมีปัญหาเรื่อง CG ที่คุณภาพดร็อปลงมา ดูลอยมากๆ (ซึ่งไม่ได้คิดไปเอง เพราะรีวิวจำนวนมากก็เห็นตรงกัน) บวกกับการออกแบบมอนสเตอร์ไม่น่าจดจำเลยสักตัว (หนังพยายามขายมอนสเตอร์มากๆ มีตัวละครมนุษย์แค่ 2 คนคือ The Mandalorian กับคาแรกเตอร์ของ Sigourney Weaver ที่ออกมานิดเดียว ที่เหลือ CG ล้วนๆ)&lt;/p&gt;
&lt;p&gt;ภาพรวมของหนังจึงออกมาแย่ และเข้าใจได้ว่าทำไมรายได้ถึงต่ำ (เมื่อเทียบกับมาตรฐานหนัง Star Wars อื่น) และในฐานะแฟน Star Wars ก็รู้สึกว่าไม่ควรทำออกมาแต่แรก ถ้าเทียบกับมาตรฐานความลึกของ The Mandalorian ฉบับซีรีส์ทำเอาไว้ แล้วใช้ทีมงานชุดเดิม ผู้กำกับทีมเดิม ทำออกมาได้เท่านี้ถือเป็นความน่าอับอาย&lt;/p&gt;
&lt;p&gt;รีวิวที่อ่านแล้วด่าได้มันส์มาก &lt;a href="https://silverscreenriot.com/the-mandalorian-and-grogu-review/"&gt;Pointless, Bloated, and Cheap-Looking&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;ส่วนรีวิวอันนี้ด่าเป็นภาษา Mandalore ได้ดีเลย &lt;a href="https://www.looper.com/2175691/the-mandalorian-and-grogu-movie-review/"&gt;This is Not the Way&lt;/a&gt;&lt;/p&gt;</content>
    <source>
      <title>markpeak.net</title>
      <link rel="self" href="https://markpeak.net/feed/"/>
      <link rel="alternate" href="https://markpeak.net"/>
    </source>
  </entry>
  <entry>
    <id>urn:uuid:de920a2f-d50b-5d3e-bb78-3fc684f35141</id>
    <title>9KOMA : การ์ตูน 9 เรื่องที่ประกอบเป็นตัวฉัน</title>
    <updated>2026-09-27T08:25:09.000Z</updated>
    <author>
      <name>iannnnn</name>
    </author>
    <published>2026-09-27T08:25:09.000Z</published>
    <link rel="alternate" href="https://iannnnn.com/2026/3465"/>
    <category term="Thai"/>
    <content type="html">&lt;p&gt;เห็น&lt;a href="https://www.facebook.com/share/p/1cvJj4MEu6/"&gt;บัฟโฟ่&lt;/a&gt;แชร์เว็บ &lt;a href="https://9koma.com/en"&gt;9KOMA&lt;/a&gt; มา บอกว่าเล่นช้าไปหน่อย ในขณะที่เราเพิ่งว่าเขามีเล่นอันนี้กัน (ไม่เรียกว่าช้า เรียกว่าไม่เคยรู้มาก่อน) เลยกดเข้าไปดู&lt;/p&gt;



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



&lt;blockquote&gt;
&lt;p&gt;Choose 9 manga you love.&lt;br /&gt;Create a shareable 9-panel image in seconds.&lt;br /&gt;Post it and compare picks with your friends.&lt;/p&gt;
&lt;/blockquote&gt;



&lt;p&gt;เราไม่ค่อยได้เล่นพวกชาเลนจ์ หรือเว็บแนวๆ “ฮัลโหล ดูฉันสิ ดูฉันสิ” ไรงี้ แต่พอเป็นเรื่องการ์ตูน ในฐานะที่ยอมรับว่าตัวเองโตมากับการ์ตูนจริงๆ แหละ ก็เลยอยากจะขอมีส่วนร่วมบันทึกไว้สักหน่อย&lt;/p&gt;



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



&lt;p&gt;พอถึงรอบสุดท้าย เราก็เลยขอคัดจากเกณฑ์ที่ว่า “หยิบมาอ่านเท่าไหร่ก็ไม่เบื่อ”&lt;/p&gt;



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



&lt;p&gt;เริ่มนะ (ไม่ได้เรียงตามลำดับ)&lt;/p&gt;



&lt;figure&gt;&lt;img loading="lazy" width="1200" height="1852" src="https://feeds.llun.dev/media/e7fe2f1db047c90b63cfcfcb5fdbeddd7f7ddbb315962c1b5bcdedeaa690cc82.webp" alt="" srcset="https://feeds.llun.dev/media/e7fe2f1db047c90b63cfcfcb5fdbeddd7f7ddbb315962c1b5bcdedeaa690cc82.webp 1200w, https://feeds.llun.dev/media/fb526bec3b5ed4ddc8bc31c7c59b050dc8198106c5160db581119bdb97494ecf.webp 768w, https://feeds.llun.dev/media/af56e85a756d832872915fb2b4f153198a239126c275a51422e226b540cb583e.webp 194w, https://feeds.llun.dev/media/001208930648fd7fe8f41bd7bad361f90f1e816ea5f6b42a651287a3af179321.webp 663w, https://feeds.llun.dev/media/6fa7955d03db191bed39eb71113191fa087be9d0ee92523ebb9f00ffb9c19ff3.webp 995w" /&gt;&lt;/figure&gt;



&lt;p&gt;&lt;strong&gt;โดราเอมอน (Doraemon)&lt;/strong&gt;&lt;/p&gt;



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



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



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



&lt;p&gt;&lt;strong&gt;ดราก้อนบอล (Dragon Ball)&lt;/strong&gt;&lt;/p&gt;



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



&lt;p&gt;การที่ อ.โทริยามะแกเปิดเกม คิดนั่นคิดนี่มาได้เป็นคนแรก (โดยที่ก็เผางานเอาตัวรอดนี่แหละ) และเป็นบันไดให้ลูกหลานเหลนโหลนได้เดินตามเส้นทางที่บุกเบิกไว้ เราขอเชิดชูเรื่องนี้อย่างมาก ตลอดการอ่านเราจะพบว้าวแฟกเตอร์เต็มไปหมด มีวลี “คิดได้ยังไง” ผุดขึ้นมาเต็มไปหมดทุกครั้งที่ย้อนอ่านในวัยที่ไม่ใช่เด็กแล้ว&lt;/p&gt;



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



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



&lt;p&gt;&lt;strong&gt;ลัคกี้แมน จริงๆ นะ จะบอกให้ (Tottemo! Luckyman)&lt;/strong&gt;&lt;/p&gt;



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



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



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



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



&lt;p&gt;แต่นี่ ลัคกี้แมนได้&lt;a href="https://cont-reading.com/thinking/isres/"&gt;คุณอิศเรศ ทองปัสโณว์&lt;/a&gt; นักแปลในตำนานของการ์ตูนไทยมา&lt;a href="https://x.com/cont_reading/status/1690942608300994560?s=20"&gt;คุมบังเหียน&lt;/a&gt; พี่แกยัดมุกตลกโปกฮาแบบมีกลิ่นหมูกระทะส้มตำไก่ย่างข้าวเหนียวลงไปเต็มพิกัด เคยไหมล่ะที่อ่านการ์ตูนแล้วมันตลกไปยันสันปก ปกหน้าปกหลังพับนอกพับใน จนสุดท้ายต้องไปอ่านในหน้าเครดิต และจดจำชื่อชายผู้นี้ติดหัวมาตลอด&lt;/p&gt;



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



&lt;p&gt;&lt;strong&gt;ฮิโนโทริ วิหคเพลิง (Phoenix – 火の鳥)&lt;/strong&gt;&lt;/p&gt;



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



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



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



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



&lt;p&gt;&lt;strong&gt;ปรสิตเดรัจฉาน (Kiseijuu – Parasyte)&lt;/strong&gt;&lt;/p&gt;



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



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



&lt;p&gt;&lt;strong&gt;ไอ เจ้าหนูพลังจิต (Ai ga yuku – 愛がゆく)&lt;/strong&gt;&lt;/p&gt;



&lt;p&gt;เนื่องจากเรื่องนี้ (และการ์ตูนส่วนใหญ่ของอาจารย์โคยามะ ยู) ไม่มีลิขสิทธิ์ในไทย ครั้งแรกที่ได้อ่านคือยุคหมึกจีน จากตู้หนังสือของลูกพี่ลูกน้อง ในชื่อ “ไอ ผู้มาจากอวกาศ” แล้วก็ได้รู้ว่าเรายังไม่ถึงวัยที่ควรอ่านเรื่องนี้นี่หว่า มันออกจะติดเรตนิดๆ เกินเด็กไปหน่อย แต่โบนัสของการอ่านการ์ตูนที่โตเกินวัยหน่อยๆ ก็คือ มันจะได้เจออะไรที่ทำให้ทึ่ง แบบที่เด็กอย่างเราไม่เคยรู้ไม่เคยเห็นเต็มไปหมด อย่างเช่น ทฤษฎีการย้อนเวลา เส้นเวลา การสังหารหมู่ขนาดใหญ่ รวมถึงความวับๆ แวมๆ ที่แทรกเข้ามาแบบไม่ทันรู้ตัวก็เลือดลมเดินแล้วในวัยนั้น&lt;/p&gt;



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



&lt;p&gt;จนล่าสุดที่มาอ่าน (ก็ยังเป็นเวอร์ชันเถื่อน เพราะไม่มีลิขสิทธิ์ในไทย) มองจากสายตาของผู้ใหญ่ ที่ต่อมจินตนาการไม่ได้เฟื่องฟูเหมือนวัยเยาว์แล้วก็ยังรู้สึกว่ามันสุดยอดอยู่ดี&lt;/p&gt;



&lt;p&gt;&lt;strong&gt;คิวทอง (Break Shot)&lt;/strong&gt;&lt;/p&gt;



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



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



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



&lt;p&gt;&lt;strong&gt;ทาร์จังจ้าวป่า (Jungle no Ouja Tar-chan)&lt;/strong&gt;&lt;/p&gt;



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



&lt;p&gt;เรื่องนี้เรายกให้เป็นการ์ตูนจังไรเหี้ยๆ ที่สนุกชิบเป๋ง และอยากให้รีพรินต์อีกจังเลย อยากเก็บสะสมแบบดีๆ จะได้เป็นการ์ตูนเหี้ยที่ดี&lt;/p&gt;



&lt;p&gt;&lt;strong&gt;รันม่า ½ ไอ้หนุ่มกังฟู (Ranma ½)&lt;/strong&gt;&lt;/p&gt;



&lt;p&gt;เนื่องจากเรื่องนี้แมสอยู่แล้วเราเลยไม่ต้องสาธยายความดีของมันมาก แต่จะเล่าเรื่องความรักที่มีต่อเรื่องนี้แทน&lt;/p&gt;



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



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



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



&lt;p&gt;&lt;strong&gt;เรื่องอื่นๆ ที่คัดออกด้วยความเสียดาย&lt;/strong&gt;&lt;/p&gt;



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



&lt;ul&gt;
&lt;li&gt;คิ้วหนาซ่าสุดๆ&lt;/li&gt;



&lt;li&gt;City Hunter&lt;/li&gt;



&lt;li&gt;Cobra&lt;/li&gt;



&lt;li&gt;Frieren คำอธิษฐานในวันที่จากลา (เป็นการ์ตูนยุคใหม่น่าจะเรื่องเดียวที่ทะลุเข้ามาถึงนี่ได้)&lt;/li&gt;



&lt;li&gt;ไดตะลุยแดนเวทมนตร์&lt;/li&gt;



&lt;li&gt;คุโรมาตี้&lt;/li&gt;



&lt;li&gt;บากิจอมประจัญบาน&lt;/li&gt;



&lt;li&gt;แบล็กแจ็ก&lt;/li&gt;



&lt;li&gt;สามตาปาฏิหาริย์&lt;/li&gt;



&lt;li&gt;Berserk&lt;/li&gt;



&lt;li&gt;อนุญาตฆ่า&lt;/li&gt;



&lt;li&gt;COCO สลัดจอมลุย&lt;/li&gt;



&lt;li&gt;One Piece&lt;/li&gt;



&lt;li&gt;Bakuman&lt;/li&gt;



&lt;li&gt;Battle Royale&lt;/li&gt;



&lt;li&gt;Hunter x Hunter&lt;/li&gt;



&lt;li&gt;Blue Giant&lt;/li&gt;



&lt;li&gt;ชั่วโมงเรียนพิศวง&lt;/li&gt;



&lt;li&gt;คินดะอิจิกับคดีฆาตกรรมปริศนา&lt;/li&gt;



&lt;li&gt;อาสึมิ สวยประหาร&lt;/li&gt;



&lt;li&gt;Space Brother&lt;/li&gt;



&lt;li&gt;Bambino!&lt;/li&gt;



&lt;li&gt;F1 (รวมผลงานการ์ตูนไซไฟปรัชญาของ Fujiko F. Fujio)&lt;/li&gt;



&lt;li&gt;โอ้พระเจ้าจอร์จ มันยอดมาก!&lt;/li&gt;



&lt;li&gt;Dr.Slump&lt;/li&gt;



&lt;li&gt;เซียนตัดเซียน&lt;/li&gt;



&lt;li&gt;Death Note&lt;/li&gt;



&lt;li&gt;ZIPANG&lt;/li&gt;



&lt;li&gt;ไอ้เขี้ยวเงิน&lt;/li&gt;



&lt;li&gt;มังกรซ่อนลาย&lt;/li&gt;



&lt;li&gt;GON&lt;/li&gt;



&lt;li&gt;Wingman&lt;/li&gt;



&lt;li&gt;PSYCHOMETERER เอย์จิ&lt;/li&gt;



&lt;li&gt;ต๊องแน่ แต่อัจฉริยะเรียกพี่&lt;/li&gt;



&lt;li&gt;ถึงจะเห่ย แต่ก็สู้นะเฟ้ย&lt;/li&gt;



&lt;li&gt;น้ำตาเพชฌฆาต (Crying Freeman)&lt;/li&gt;



&lt;li&gt;20th Century Boys&lt;/li&gt;



&lt;li&gt;BECK (เรื่องนี้ตัดออกด้วยน้ำตา รักมาก ทำไมแพ้ทาร์จังวะ)&lt;/li&gt;



&lt;li&gt;มืออสูรล่าปีศาจ&lt;/li&gt;



&lt;li&gt;การ์ตูนขายหัวเราะ รวมถึงเรื่องสั้นต่างๆ จากสำนักพิมพ์นี้ในยุคที่โตมา&lt;/li&gt;
&lt;/ul&gt;</content>
    <source>
      <title>iannnnn.com</title>
      <link rel="self" href="https://iannnnn.com/feed"/>
      <link rel="alternate" href="https://iannnnn.com"/>
    </source>
  </entry>
  <entry>
    <id>urn:uuid:da53f628-6dc8-5c66-80d4-fcd993d10be7</id>
    <title>Atlas – Multimodal Autoregressive Diffusion Transformer</title>
    <updated>2026-09-21T14:49:08.000Z</updated>
    <author>
      <name>Isriya Paireepairit</name>
    </author>
    <published>2026-09-21T14:49:08.000Z</published>
    <link rel="alternate" href="https://markpeak.net/atlas-multimodal-autoregressive-diffusion-transformer/"/>
    <category term="Thai"/>
    <content type="html">&lt;p&gt;เพิ่ง &lt;a href="https://markpeak.net/progress-of-world-models/"&gt;เขียนเรื่อง World Models&lt;/a&gt; ไปไม่นาน ทางบริษัท World Labs ของ Fei-Fei Li ก็เปิดตัวโมเดลใหม่ชื่อ &lt;a href="https://www.worldlabs.ai/blog/atlas"&gt;Atlas&lt;/a&gt; ที่มีความสามารถสุดมหัศจรรย์ สามารถแปลงภาพถ่ายไม่กี่ภาพเป็นโลกที่เดินสำรวจได้ หมุนมุมกล้องได้ตามต้องการ เรียกว่าอลังการมากๆ&lt;/p&gt;
&lt;p&gt;อธิบายเป็นคำพูดลำบาก ดูคลิปง่ายกว่า&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;คำถามที่ตามมาคือ World Labs ทำได้อย่างไร&lt;/p&gt;
&lt;p&gt;ในบล็อก Atlas มีคำอธิบายทางเทคนิคอยู่นิดหน่อย บอกว่าสถาปัตยกรรมของโมเดลคือ &lt;strong&gt;“multimodal autoregressive diffusion transformer”&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;ถ้าอธิบายง่ายๆ มันคือการรวมร่างกันของโมเดลตระกูล transformer (LLM) และโมเดลตระกูล diffusion (พวกโมเดลสร้างภาพ) แต่รวมกันอย่างไร?&lt;/p&gt;
&lt;p&gt;4 คำตามชื่อโมเดลมีความสำคัญมาก เพราะแต่ละคำอธิบายว่าโมเดล Atlas เกิดจากอะไรบ้าง&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Multimodal&lt;/strong&gt; – แปลว่ารองรับข้อมูลหลายประเภท (data tyle) ทั้งข้อความ ภาพ ตำแหน่งและมุมกล้อง (camera pose) และแผนที่ความลึก 3D (depth map) ส่วนอินพุทแบบวิดีโอจะมองเป็นภาพที่เรียงต่อกัน โดยภาพและแผนที่ความลึกจะถูกแปลความเป็น camera pose เพื่อให้ข้อมูลเชิงมิติ (spatial context) ว่าโลกที่เราจะสร้างมีหน้าตาอย่างไรที่มุมมองตรงไหน&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Autoregressive หรือ AR&lt;/strong&gt; – ตามภาษาทางสถิติคือการพยากรณ์ลำดับ (sequence) โดยใช้อินพุทจาก sequence ก่อนหน้าไปคำนวณเป็นผลลัพธ์ใน sequence ถัดไป การนำ AR มาใช้งานในโมเดลสร้างโลก จะเป็นการมองเชิงลำดับเวลาว่าอินพุทแต่ละอย่างถูกป้อนเข้ามา แล้วสถานะของมันจะเป็นอย่างไรต่อ หรืออธิบายง่ายๆ ว่า AR เป็นเทคนิคที่ช่วยให้โลกที่สร้างโดยโมเดลมีมิติของลำดับเวลาและเหตุการณ์&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Diffusion&lt;/strong&gt; – เทคนิคจากโมเดลฝั่งสร้างภาพ หลักคิดสำคัญคือสร้างผลลัพธ์ด้วยวิธี denoising (ลดสัญญาณรบกวน) ซึ่งใช้กันแพร่หลายในวงการ computer vision อยู่แล้ว และเหมาะกับงานที่มีข้อมูลต่อเนื่องหลายมิติ เช่น ภาพหรือวิดีโอ แถมยังสามารถเลือกปรับได้ว่าจะเอาคุณภาพสูงหรือความเร็วสูง&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Transformer&lt;/strong&gt; – โมเดลหลักของการพยากรณ์คำ ในเนื้อแท้ของมันคือการคูณเมทริกซ์ขนาดใหญ่ (&lt;a href="https://markpeak.net/how-transformer-works/"&gt;เคยเขียนเรื่องนี้ไปแล้ว&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;ความแตกต่างสำคัญของ world model กับโมเดลสร้างวิดีโอ คือ โมเดลเข้าใจ spatial context รู้ตำแหน่งพิกัดด้วย ไม่ได้รู้แค่ข้อมูลภาพอย่างเดียวแล้วไปพยากรณ์ภาพถัดไป (ซึ่งอาจจะผิด เพราะไม่รู้บริบทเชิงตำแหน่ง)&lt;/p&gt;
&lt;p&gt;ส่วนรายละเอียดของการรวม Autoregressive Transformer (LLM) กับ Diffusion นั้นยังไม่เปิดเผย (อันนี้เข้าใจได้เพราะเป็นความลับการค้าของบริษัท) แต่เท่าที่เข้าใจคือใช้ Autoregressive Transformer คุมลำดับเวลา เป็นตัวกำหนด “ความทรงจำ” ของโลกที่สร้างขึ้น แล้วใช้ Diffusion ควบคุมรายละเอียดของภาพที่เป็นผลลัพธ์อีกที&lt;/p&gt;
&lt;p&gt;อีกประเด็นที่น่าสนใจคือ World Labs บอกเองว่าเมื่อ Atlas เป็นทั้ง Autoregressive Transformer กับ Diffusion มันจึงสามารถใช้เทคนิคเร่งความเร็วของทั้งฝั่ง LLM (เช่น KV-cache) และฝั่ง Diffusion (เช่น การทำ distillation) โดยฮาร์ดแวร์รุ่นใหม่ๆ รองรับเทคนิคเหล่านี้มาพร้อมอยู่แล้ว ทำให้ประสิทธิภาพของ Atlas ออกมาดีทั้งในแง่คุณภาพและความเร็วด้วย&lt;/p&gt;
&lt;p&gt;ส่วน World Labs ใช้ชิปจากบริษัทไหน คำตอบคงเดาไม่ยาก&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;รายละเอียดเพิ่มเติม&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.linkedin.com/posts/thesubhoghosh_world-labs-just-dropped-atlas-and-the-interesting-activity-7500798445193060352-7xpB/"&gt;Subho Ghosh LinkedIn&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://danijar.com/project/dreamer4/"&gt;Dreamer 4&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://arxiv.org/html/2511.21087v2"&gt;MIRA: Multimodal Iterative Reasoning Agent for Image Editing&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</content>
    <source>
      <title>markpeak.net</title>
      <link rel="self" href="https://markpeak.net/feed/"/>
      <link rel="alternate" href="https://markpeak.net"/>
    </source>
  </entry>
  <entry>
    <id>urn:uuid:0b6263db-b3d8-5073-9487-f17f4cd8f73a</id>
    <title>🖨️ ปริ้นใบปะหน้า Shopee ผ่าน Bluetooth XPrinter XP-80T ไม่ง้อ Driver</title>
    <updated>2026-09-19T15:33:03.000Z</updated>
    <author>
      <name>thanapon.tap</name>
    </author>
    <published>2026-09-19T15:33:03.000Z</published>
    <link rel="alternate" href="https://thanapon.info/react-xprinter-shopee-bluetooth/?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=react-xprinter-shopee-bluetooth"/>
    <category term="Thai"/>
    <content type="html">&lt;p&gt;เชื่อว่าพ่อค้าแม่ค้าออนไลน์หรือสาย Dev ที่ขายของบน Shopee หลายๆ คนคงจะเคยมีปัญหาในการจัดการปริ้นใบปะหน้าพัสดุกันไม่น้อยแน่ๆ เพราะปกติเวลาเราโหลดใบปะหน้าออกมาจากระบบ Shopee Seller Center มันจะชอบยัดเยียดมาเป็นไฟล์ PDF หน้าใหญ่ๆ ไซส์ A4 ซะงั้น! แต่พอดีว่าที่บ้านมี Thermal Printer XPrinter XP80-T อยู่แล้วอะดิ เลยต้องจัดสักหน่อย เพราะขี้เกียจไปตั้งค่า CUPS แล้วว&lt;/p&gt;



&lt;hr /&gt;



&lt;h3&gt;แค่ซื้อเครื่องปริ้นสติ๊กเกอร์แพงๆ ตัวละหลายพันก็จบ!&lt;/h3&gt;



&lt;p&gt;ใช่ครับ 5555 ถ้าเรายอมควักเงิน 3,000 – 5,000 บาท ไปซื้อเครื่องปริ้น Label เฉพาะทาง ปัญหานี้ก็คงไม่เกิดไงหล่ะ!&lt;br /&gt;แต่ประเด็นคือ เรามีเครื่อง XPrinter XP80-T อยู่แล้วไง &lt;strong&gt;&lt;em&gt;ราคาไม่เกิน 2 ใบเทา&lt;/em&gt;&lt;/strong&gt;! ซึ่งมันเป็นเครื่องพิมพ์ใบเสร็จความร้อน หน้ากว้าง 80mm ใช้กระดาษม้วนต่อเนื่อง คุยด้วย Protocol ESC/POS แถมมี Bluetooth มาให้ด้วย จะทิ้งไว้เฉยๆ ให้ฝุ่นเกาะทำไมล่ะ…&lt;/p&gt;



&lt;blockquote&gt;
&lt;p&gt;สุดท้ายเลยเป็นที่มา เขียน Web App สั่งงานตรงผ่าน Bluetooth เองซะเลย เปิด Chrome ลาก PDF วาง แล้วกดปริ้น จบๆ ไม่ต้องง้อ Driver ให้ปวดกบาล!&lt;/p&gt;



&lt;hr /&gt;
&lt;/blockquote&gt;



&lt;h3&gt;แล้วมันทำงานยังไงนะ?&lt;/h3&gt;



&lt;p&gt;หลักการง่ายมากครับ เราจะเปลี่ยน Browser ให้คุยตรงกับเครื่องปริ้นผ่าน Bluetooth โดยไม่ง้อ Driver ของระบบปฏิบัติการเลย:&lt;/p&gt;



&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;PDF Rendering: &lt;/strong&gt;ใช้ PDF.js เรนเดอร์ไฟล์ PDF ใบปะหน้าของ Shopee ออกมาเป็น Canvas บนหน้าเว็บแบบคมชัดสูง&lt;/li&gt;



&lt;li&gt;&lt;strong&gt;Auto-Crop ขอบขาว:&lt;/strong&gt; สแกนหาขอบเขตของเนื้อหาใบปะหน้า แล้วตัดพื้นที่สีขาวรอบๆ ออกอัตโนมัติ เพื่อขยายข้อมูลให้เต็มหน้ากว้างกระดาษ 80mm (ความกว้างพิมพ์จริงคือ 72mm หรือ 576 จุด)&lt;/li&gt;



&lt;li&gt;&lt;strong&gt;Binarization (แปลงเป็นขาวดำ 1-bit):&lt;/strong&gt; ใช้เทคนิค Thresholding คมชัดสูง ไม่ใช้ Dither แตกๆ เพื่อให้เส้นบาร์โค้ดและ QR Code ยิงสแกนติด 100%&lt;/li&gt;



&lt;li&gt;&lt;strong&gt;แปลงเป็นคำสั่ง ESC/POS (GS v 0):&lt;/strong&gt; แปลงจุดภาพเป็น Byte แล้วหั่นเป็นท่อนๆ ส่งผ่าน Bluetooth ไปให้เครื่องพิมพ์ เบิร์นความร้อนลงบนกระดาษ แล้วสั่งตัดกระดาษ Auto-cut ฉับ!&lt;/li&gt;
&lt;/ol&gt;



&lt;h3&gt;พระเอกของเราคือ Web Bluetooth + ESC/POS&lt;/h3&gt;



&lt;p&gt;เจ้า XPrinter XP80-T ตัวนี้ใช้คำสั่งควบคุมตระกูล ESC/POS แบบมาตรฐานเลย ซึ่งคำสั่งหลักๆ ที่เราใช้ควบคุมเครื่องพิมพ์ก็จะมีหน้าตาประมาณนี้ครับ:&lt;/p&gt;



&lt;div&gt;&lt;pre&gt;&lt;code&gt;const ESC = 0x1b
const GS = 0x1d
const LF = 0x0a

const CMD = {
  INIT: [ESC, 0x40],                    // สั่งรีเซ็ตเครื่องพิมพ์
  ALIGN_LEFT: [ESC, 0x61, 0x00],        // จัดชิดซ้าย
  ALIGN_CENTER: [ESC, 0x61, 0x01],      // จัดกึ่งกลาง
  ALIGN_RIGHT: [ESC, 0x61, 0x02],       // จัดชิดขวา
  BOLD_ON: [ESC, 0x45, 0x01],           // ตัวหนาเปิด
  BOLD_OFF: [ESC, 0x45, 0x00],          // ตัวหนาปิด
  FEED: (n: number) =&amp;gt; [ESC, 0x64, n],  // เลื่อนกระดาษ n บรรทัด
  CUT: [GS, 0x56, 0x41, 0x00]           // คำสั่งตัดกระดาษฉับบ!
}
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;h3&gt;วิธีการใช้งาน&lt;/h3&gt;



&lt;figure&gt;&lt;img width="1024" height="594" src="https://localhost:59016/wp-content/uploads/2026/09/thermal-label-printer-1024x594.png" alt="" srcset="https://feeds.llun.dev/media/068b549c1d1a3de895ad4ee4ab660d5a16d29d8da158462359ff387331b16ce5.png 1024w, https://feeds.llun.dev/media/9f31d13380c45b48244f6f572713bba836854df61fd7a46242ec55b35fa17ca3.png 300w, https://feeds.llun.dev/media/309883a898da7e75e684c613c94899e7ff571c06d72583dc66812e7ce90f8a41.png 767w, https://feeds.llun.dev/media/63f67eb48b9e357249231201363ff8c6a08a356cc8b1916e35b576445cdd2124.png 1536w, https://feeds.llun.dev/media/df17a6e66fde2de52f15de5cbf4694dafa78174a5fff988241b18e68c176c2eb.png 2048w, https://feeds.llun.dev/media/6dc378661f6dcc49e18e130b2cc889a8ffcbfd70cec6888a961f2deae1ad2f23.png 600w" /&gt;&lt;/figure&gt;



&lt;p&gt;&lt;/p&gt;



&lt;p&gt;&lt;strong&gt;1.สั่งเชื่อมต่อ Bluetooth โลดดด…&lt;br /&gt;&lt;/strong&gt;เราใช้ Web Bluetooth API (navigator.bluetooth) ในการสแกนหาเครื่องพิมพ์ XP80-T โดยค้นหาผ่าน Service UUID ยอดฮิตของเครื่องพิมพ์ เช่น 0xFFE0 หรือ Transparent Serial Service:&lt;/p&gt;



&lt;div&gt;&lt;pre&gt;&lt;code&gt;const device = await navigator.bluetooth.requestDevice({
  acceptAllDevices: true,
  optionalServices: ['0000ffe0-0000-1000-8000-00805f9b34fb']
});
const server = await device.gatt.connect();
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;2.ลากไฟล์ PDF ใบปะหน้า Shopee มาวาง&lt;br /&gt;&lt;/strong&gt;ตัวเว็บจะมี Dropzone ให้เราลากไฟล์ print-label.pdf มาวางปุ๊บ ระบบจะเรนเดอร์ภาพใบปะหน้าขึ้นมาให้ดูแบบเรียลไทม์ พร้อมจำลองกระดาษม้วน 80mm ให้เห็นเลยว่าเวลาพิมพ์ออกมาหน้าตาจะเป็นยังไง&lt;/p&gt;



&lt;p&gt;&lt;strong&gt;3.ปรับแต่งและหั่นภาพส่งพิมพ์&lt;br /&gt;&lt;/strong&gt;เนื่องจาก Buffer แรมของเครื่องพิมพ์ความร้อนตัวจิ๋วพวกนี้มันไม่ได้เยอะมาก ถ้าเราโยนรูปภาพยาวๆ ไปทีเดียวพรวด เครื่องจะเอ๋อหรือพิมพ์ขาดๆ หายๆ แน่นอนครับ!&lt;br /&gt;ทริคคือเราต้องหั่นภาพแนวตั้งออกเป็นก้อนๆ (Slice) ละประมาณ 256 จุด แล้วส่งด้วยคำสั่ง Raster Image GS v 0:&lt;/p&gt;



&lt;div&gt;&lt;pre&gt;&lt;code&gt;// สั่งพิมพ์ภาพกราฟิกความกว้าง 576 dots (72 bytes ต่อแถว)
// GS v 0 0 xL xH yL yH
chunks.push(GS, 0x76, 0x30, 0x00, 72, 0, sliceHeight &amp;amp; 0xff, (sliceHeight &amp;gt;&amp;gt; 8) &amp;amp; 0xff);
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;***ตอนส่งผ่าน Bluetooth เราต้องแบ่งส่งเป็นก้อนย่อยๆ (Chunk ละ ~100 bytes) พร้อมหน่วงเวลาประมาณ 15ms เพื่อไม่ให้ BLE Buffer สำลักด้วยนะเออ***&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;



&lt;h3&gt;หลังจากตั้งค่าเสร็จแล้วก็รอดูผลและทดสอบกันดู &lt;img src="https://feeds.llun.dev/media/84a5adc12584dc46f13d6a3f01bc4864951b168efe41305d7a93971d94259fc7.png" alt="🚀" /&gt;&lt;img src="https://feeds.llun.dev/media/84a5adc12584dc46f13d6a3f01bc4864951b168efe41305d7a93971d94259fc7.png" alt="🚀" /&gt;&lt;img src="https://feeds.llun.dev/media/84a5adc12584dc46f13d6a3f01bc4864951b168efe41305d7a93971d94259fc7.png" alt="🚀" /&gt;&lt;/h3&gt;



&lt;p&gt;มาลองกดปุ่มเขียว “Print Label (80mm)” ดูซิว่าจะรอดไหมมม…&lt;/p&gt;



&lt;figure&gt;&lt;img width="753" height="1024" src="https://localhost:59016/wp-content/uploads/2026/09/print-image-753x1024.png" alt="" srcset="https://feeds.llun.dev/media/fc74115ade6d31a188d78a6a07533090509ed54ef1192595ad21315bd44d4357.png 753w, https://feeds.llun.dev/media/217c7e7c457fc61f41b18809d4bd1b0880984423d3315f3f1ed0145cf38cfd6c.png 221w, https://feeds.llun.dev/media/63c4807bb7b57711f0f690bd4a1eb9c9318906fe2c32544dadbb692ee20f41c8.png 768w, https://feeds.llun.dev/media/afd180b56a579315ea518acb9148fcfa55054e7a121267516bb6d4b556597068.png 600w, https://feeds.llun.dev/media/d9eb2b0b878a99528268ea368782f3556e8e5b9c2a244bc58dbb48edb345cc58.png 1128w" /&gt;&lt;/figure&gt;



&lt;hr /&gt;



&lt;h2&gt;สรุปส่งท้าย &lt;img src="https://feeds.llun.dev/media/46e249146cede96b35241353495769e68df4d904f592f4fecb59e34f31d14ab4.png" alt="🎉" /&gt;&lt;img src="https://feeds.llun.dev/media/46e249146cede96b35241353495769e68df4d904f592f4fecb59e34f31d14ab4.png" alt="🎉" /&gt;&lt;img src="https://feeds.llun.dev/media/46e249146cede96b35241353495769e68df4d904f592f4fecb59e34f31d14ab4.png" alt="🎉" /&gt;&lt;/h2&gt;



&lt;p&gt;การใช้ Web Bluetooth ร่วมกับ ESC/POS ทำให้เราสร้างระบบปริ้นท์สลิป/ใบปะหน้า Shopee ที่ใช้งานผ่าน Browser ได้ทันที ไม่ต้องปวดหัวติดตั้ง Driver ไม่ต้องตั้ง Print Server ให้เปลืองเครื่อง&lt;/p&gt;



&lt;p&gt;ใครที่ใช้ XPrinter XP80-T หรือรุ่นเทียบเท่าที่มี Bluetooth ลองเอาวิธีนี้ไปเล่นดูได้นะครับ หรือหากใครมีเทคนิคการทำ Dithering คมๆ กว่านี้ หรือมีวิธีส่ง BLE ไวๆ โดยเครื่องไม่แฮงค์ มาคอมเมนต์แนะนำกันได้นะครับ!&lt;/p&gt;



&lt;p&gt;&lt;strong&gt;&lt;em&gt;วันนี้ขอบคุณและสวัสดีครับบ&lt;/em&gt;&lt;/strong&gt; &lt;img src="https://feeds.llun.dev/media/6a970797cd2954c6c92d84b334b259795d008386185ab8d1b12a39dd6c1a33cd.png" alt="✌🏻" /&gt;&lt;/p&gt;



&lt;h4&gt;References &amp;amp; Specs:&lt;/h4&gt;



&lt;p&gt;&lt;em&gt;Github Repository: &lt;a href="https://github.com/toygame/React-XPrinter-Themal-Label"&gt;https://github.com/toygame/React-XPrinter-Themal-Label&lt;/a&gt;&lt;br /&gt;Website: &lt;a href="https://x-printer-themal-label.vercel.app/"&gt;https://x-printer-themal-label.vercel.app/&lt;/a&gt;&lt;br /&gt;Web Bluetooth API: &lt;a href="https://developer.mozilla.org/en-US/docs/Web/API/Web_Bluetooth_API"&gt;https://developer.mozilla.org/en-US/docs/Web/API/Web_Bluetooth_API&lt;/a&gt;&lt;br /&gt;Web Serial API: &lt;a href="https://developer.mozilla.org/en-US/docs/Web/API/Web_Serial_API"&gt;https://developer.mozilla.org/en-US/docs/Web/API/Web_Serial_API&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;&lt;p&gt;The post &lt;a href="https://thanapon.info/react-xprinter-shopee-bluetooth/"&gt;🖨️ ปริ้นใบปะหน้า Shopee ผ่าน Bluetooth XPrinter XP-80T ไม่ง้อ Driver&lt;/a&gt; first appeared on &lt;a href="https://thanapon.info/"&gt;Thanapon&lt;/a&gt;.&lt;/p&gt;</content>
    <source>
      <title>Thanapon</title>
      <link rel="self" href="https://thanapon.info/feed/"/>
      <link rel="alternate" href="https://thanapon.info"/>
    </source>
  </entry>
  <entry>
    <id>urn:uuid:319b0787-cae5-5814-ac3b-8ed73026ef96</id>
    <title>ฟอนต์กอกอตอ (KorKorTor)</title>
    <updated>2026-09-14T16:36:01.000Z</updated>
    <author>
      <name>iannnnn</name>
    </author>
    <published>2026-09-14T16:36:01.000Z</published>
    <link rel="alternate" href="https://iannnnn.com/2026/3461"/>
    <category term="Thai"/>
    <content type="html">&lt;figure&gt;&lt;img loading="lazy" width="1024" height="1024" src="https://feeds.llun.dev/media/ac0f6be44762d364abfe64b710c3ce02f7839c507d15f14ac715464a161639ac.webp" alt="" srcset="https://feeds.llun.dev/media/ac0f6be44762d364abfe64b710c3ce02f7839c507d15f14ac715464a161639ac.webp 1024w, https://feeds.llun.dev/media/ba195a8a4a6c9806c1800cf115898a146488801ae18d26f1bf4723170d4f591e.webp 250w, https://feeds.llun.dev/media/878de930c680787015f2b2159f0592180c061fce794a122d6fbebbef7b19f6bf.webp 300w, https://feeds.llun.dev/media/a2e19372dca2e682969d4416e77a05506a1399aae090dcb0dec005b83a927524.webp 768w, https://feeds.llun.dev/media/72fdaab826738b0bb1fc8f141d43a03d9c4d5ff722ca61a51510f899ff8581b8.webp 1536w" /&gt;&lt;/figure&gt;



&lt;p&gt;ฟอนต์ใหม่ล่าสุดที่คุณ Gat รีเควสต์มาในโพสต์ของเพจฟอนต์ หลังจากเราดัดฟุตเหล็กเป็นรูป ค.ควาย&lt;/p&gt;



&lt;figure&gt;&lt;img loading="lazy" width="768" height="1024" src="https://feeds.llun.dev/media/a406ff96f413556bced2c2015d98ff056fb0c3ffc907418c9a3f9aa655d0f68f.jpg" alt="" srcset="https://feeds.llun.dev/media/a406ff96f413556bced2c2015d98ff056fb0c3ffc907418c9a3f9aa655d0f68f.jpg 768w, https://feeds.llun.dev/media/543e2212827b3415d16f01fbe70b602c83321dd80bb609f9989decec6cc23030.jpg 225w, https://feeds.llun.dev/media/93e9a9d0e5241231cc5f5f997fb6f41307d6a4b7922317de884eef443cb8ee9b.jpg 1152w, https://feeds.llun.dev/media/63ad341cc5d836d7075d16700729e40137deb362807f9bc5f8bf9bf109d520da.jpg 1536w, https://feeds.llun.dev/media/4c6f42d1fe95b9f65bb62b0b86885f8406f29a22e8cb53c83d855dfa0143f4de.jpg 1920w" /&gt;&lt;/figure&gt;



&lt;p&gt;พอบอกว่าอยากได้ฟอนต์ที่มีแต่ ค.ควาย ก็เลยเปิด Fontlab แล้วเริ่มทำ เสร็จออกมาเป็นฟอนต์ในครึ่งชั่วโมงได้ไงก่อน นี่รวมใส่โค้ดแล้วนะ 55555&lt;/p&gt;



&lt;p&gt;&lt;strong&gt;ฟีเจอร์ของฟอนต์กอกอตอ (KorKorTor)&lt;/strong&gt;&lt;/p&gt;



&lt;ul&gt;
&lt;li&gt;รองรับภาษาไทย อังกฤษ ตัวอักษรละตินอีกเยอะแยะ ตามที่ default ของฟอนต์แล็บมันทำไว้ให้ (คือมันเพิ่ม Glyph ไว้ซะเยอะ ไว้รองรับการใช้งานในหลายภาษา ซึ่งปกติฟอนต์ที่เราทำเองจะรับแค่ไทยกับอังกฤษ)&lt;/li&gt;



&lt;li&gt;พิมพ์อะไรก็ออกมาเป็น ค.ควาย&lt;/li&gt;



&lt;li&gt;แต่จะมีอยู่คำนึง ที่เป็นอักษรย่อภาษาไทย 3 ตัว ที่พอพิมพ์แล้วจะได้ตัวซีเคร็ตออกมา (ขอไม่เฉลย แต่ไม่ยากเลย)&lt;/li&gt;
&lt;/ul&gt;



&lt;p&gt;กลายเป็นฟอนต์ที่ทำเสร็จอย่างรวดเร็ว ทั้งที่ตัวที่ทำค้างไว้ตั้งแต่เดือนเมษาฯ ยังไม่ได้ทำต่อ น่าละอายนัก&lt;/p&gt;



&lt;p&gt;ดาวน์โหลดฟรี&lt;/p&gt;



&lt;p&gt;&lt;a href="https://www.f0nt.com/release/korkortor/" target="_blank"&gt;f0nt.com/release/korkortor/&lt;/a&gt;&lt;/p&gt;</content>
    <source>
      <title>iannnnn.com</title>
      <link rel="self" href="https://iannnnn.com/feed"/>
      <link rel="alternate" href="https://iannnnn.com"/>
    </source>
  </entry>
  <entry>
    <id>urn:uuid:8d9975b6-b9e9-510e-adcb-bd2f777d7044</id>
    <title>Trust, Intelligence and Conscious</title>
    <updated>2026-09-14T14:26:18.000Z</updated>
    <author>
      <name>Isriya Paireepairit</name>
    </author>
    <published>2026-09-14T14:26:18.000Z</published>
    <link rel="alternate" href="https://markpeak.net/trust-intelligence-conscious/"/>
    <category term="Thai"/>
    <content type="html">&lt;p&gt;ช่วงนี้ (กันยายน 2026) การถกเถียงเรื่อง AI ในต่างประเทศหันมาคุยกันเรื่องการ “ชะลอ” พัฒนาการของ AI กันมากขึ้นมาก ส่วนหนึ่งน่าจะมาจากความก้าวหน้าของโมเดลตัวใหม่ๆ อย่าง GPT-6 Astra หรือ Claude 5 Mythos/Fable ที่อยู่ในระดับ “เริ่มน่ากลัวเกินไปแล้ว”&lt;/p&gt;
&lt;p&gt;นักคิดคนหนึ่งที่ผมรอตามฟังว่าเขาจะพูดอย่างไรคือ Yuval Noah Harari ผู้เขียนเรื่อง Sapiens ด้วยเหตุผลว่าเขามีวิธีคิดในเชิง first principle ขุดลงไปถึงรากเหง้าความจำเป็น บวกกับภูมิความรู้เรื่องประวัติศาสตร์ของมนุษยชาติ ที่มอง timeline ระดับยาวมาก (เคยเขียนถึงแนวคิดของเขาเรื่อง &lt;a href="https://markpeak.net/the-useless-class/"&gt;The Useless Class&lt;/a&gt;)&lt;/p&gt;
&lt;p&gt;ล่าสุด Harari ออกมาให้สัมภาษณ์กับ The Economist ความยาวประมาณหนึ่งชั่วโมง คนดูเป็นล้าน หลังจากนั่งฟังจบรอบหนึ่งก็ได้เวลาเขียนถึง&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;มุมมองต่อ AI ของ Harari ยังค่อนข้างเหมือน &lt;a href="https://markpeak.net/yuval-harari-on-ai/"&gt;ครั้งที่พูดในปี 2023&lt;/a&gt; ว่า AI จะส่งผลกระทบต่อมนุษยชาติในทางลบ เพราะพัฒนาการของมันเร็วเกินไปจนมนุษย์ดูดซับและย่อยสลายไม่ทัน และเสนอให้ออกกฎควบคุมพัฒนาการของ AI&lt;/p&gt;
&lt;p&gt;รอบนี้ Harari ขยายความมุมมองของเขาผ่านแนวคิด 3 คำ ซึ่งผมฟังแล้วคิดว่าสำคัญมาก นั่นคือ Trust, Intelligence, Conscious&lt;/p&gt;
&lt;h1&gt;Trust&lt;/h1&gt;
&lt;p&gt;Harari บอกว่า สินทรัพย์ที่สำคัญที่สุดในโลกคือ “ความเชื่อมั่น” (trust) ซึ่งสำคัญกว่าน้ำมัน เงิน ไฟฟ้า หรือชิป&lt;/p&gt;
&lt;p&gt;ตัวอย่างที่ชัดเจนที่สุดที่แสดงความสำคัญของ trust คือโลกการเงินที่สร้างอยู่บนความเชื่อมั่นล้วนๆ&lt;/p&gt;
&lt;p&gt;เราไปตลาด เอาเศษโลหะหรือกระดาษที่ไม่มีประโยชน์อะไรเลยไปยื่นให้คนขาย แล้วได้อาหารกลับมา เป็นตัวอย่างว่า money is trust&lt;/p&gt;
&lt;p&gt;แต่โลกการเงินในยุคปัจจุบันพัฒนามาไกลกว่านั้นมาก จนทุกวันนี้แทบไม่มีมนุษย์คนใดคนหนึ่งเข้าใจอย่างถ่องแท้แล้วว่าตลาดพันธบัตรทำงานอย่างไร เพราะอัลกอริทึมของมันซับซ้อนมาก แต่เรื่องนี้กลับเป็นงานง่ายของ AI&lt;/p&gt;
&lt;p&gt;ปัจจัยนี้จะทำให้มนุษย์ค่อยๆ ย้ายความเชื่อมั่น จากมนุษย์ด้วยกันไปสู่ AI และตอนนี้มันเกิดขึ้นไปแล้วในโลก Blockchain ที่มนุษย์ (อย่างน้อยกลุ่มหนึ่ง) ไม่เชื่อในระบบธนาคาร นายธนาคาร ธนาคารกลาง ว่าจะไม่ฉ้อฉล แต่กลับเชื่อในอัลกอริทึมมากกว่า&lt;/p&gt;
&lt;p&gt;Harari บอกว่าในอีก 10 ปีข้างหน้า เราจะทยอยยกการตัดสินใจทางการเงินให้ AI คิดแทน จนไปถึงระดับที่ไม่มีใครเข้าใจมันอีกต่อไป และหากตลาดการเงินล่มสลาย จะมีคนวิ่งไปบอกผู้นำประเทศว่า ตลาดการเงินของเราพัง เราไม่รู้ว่าเกิดอะไรขึ้น แต่เรารู้ว่าต้องแก้ปัญหาด้วยวิธี X เพราะ AI บอกมา ซึ่งเราก็ต้องเชื่อในสิ่งนี้&lt;/p&gt;
&lt;p&gt;นอกจากตลาดการเงินแล้ว Harari ยังยกตัวอย่างวงการสื่อมวลชน ว่าคนจำนวนมาก (ในอเมริกา) ไม่เชื่อในนักข่าวหรือบรรณาธิการมนุษย์ (เพราะมองว่าเลือกข้างทางการเมือง) แต่ยังจำเป็นต้องเสพข่าว ซึ่งก็ต้องจบด้วยข่าวจากอัลกอริทึมหรือ AI&lt;/p&gt;
&lt;p&gt;อีกวงการคือความสัมพันธ์ของมนุษย์ด้วยกัน เราพูดถึงการมี “แฟน AI” ที่น่ากลัวขึ้นเรื่อยๆ เพราะ AI สามารถปรับแต่งความสัมพันธ์ให้เหมาะกับแต่ละบุคคลได้ง่าย อีกทั้ง AI รู้จักตัวตนและความลับของเราได้ดีกว่าพ่อแม่ด้วยซ้ำ&lt;/p&gt;
&lt;p&gt;Harari บอกว่านี่เป็นครั้งแรกในประวัติศาสตร์มนุษย์ที่เราสามารถผลิต “ความสนิทสนมแบบแมส” (mass-produce intimacy) เจาะเป็นรายบุคคลได้ ต่างจากสื่อมวลชนแบบกระจายเสียง (broadcast) ที่ทุกคนฟังข้อความเดียวกัน&lt;/p&gt;
&lt;p&gt;ความน่ากลัวของเรื่องนี้คือ พอตัวเราเชื่อมั่นใน AI อย่างมาก มีความผูกพันในเชิงลึกระหว่างกันแล้ว ผู้ผลิต AI ก็จะสามารถชักจูงเราทั้งในเชิงพาณิชย์ (หลอกซื้อของ หลอกลงทุน) หรือเชิงการเมือง ได้ตามต้องการ&lt;/p&gt;
&lt;p&gt;Harari บอกว่าความเชื่อมั่นของมนุษย์ไม่ได้ระเหยหายไปในอากาศ (trust did not just evaporate) มันแค่ย้ายที่จากมนุษย์ไปสู่ AI ต่างหาก&lt;/p&gt;
&lt;h1&gt;Intelligence vs. Consciousness&lt;/h1&gt;
&lt;p&gt;ประเด็นถัดมา Harari อธิบายเรื่องมนุษย์ vs AI ด้วยแนวคิดเรื่อง&lt;strong&gt; ความฉลาด (intelligence)&lt;/strong&gt; กับ &lt;strong&gt;จิตสำนึก (consciousness)&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;ความฉลาด (intelligence)&lt;/strong&gt; คือ ความสามารถในการพิชิตเป้าหมาย ฝ่าฟันอุปสรรค ด้วยวิธีการที่สร้างสรรค์&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;จิตสำนึก (consciousness)&lt;/strong&gt; คือ ความสามารถในการรับรู้ความรู้สึก ทั้งความสุขและความทุกข์&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;มนุษย์ มีทั้งความฉลาดและจิตสำนึกอยู่คู่กัน แบ่งแยกกันไม่ได้ ในขณะที่ AI มีความฉลาดที่เหนือมนุษย์ แต่กลับไม่มีจิตสำนึกอยู่เลย ปัจจัยนี้เป็นสิ่งเดียวที่เราสามารถแยกแยะมนุษย์ออกจาก AI ได้ ด้วยคำถามเดียวว่า “รู้สึกเป็นทุกข์ได้หรือไม่” (can it suffer?)&lt;/p&gt;
&lt;p&gt;ด้วยเหตุนี้ จิตสำนึกจึงเป็นสิ่งสำคัญมากของมนุษย์ เพราะมนุษย์เป็นห่วงเป็นใยกับสิ่งที่เป็นทุกข์ได้ และเป็นพื้นฐานสำคัญของระบบจริยธรรมและการเมืองของมนุษยชาติทั้งหมด&lt;/p&gt;
&lt;p&gt;ระบบใดๆ ในโลกทุกวันนี้สามารถทำงานได้โดยมีเฉพาะความฉลาด ไม่จำเป็นต้องมีจิตสำนึก ตัวอย่างในปัจจุบันคือ อัลกอริทึม social media ทำงานได้ตามเป้าหมาย (สร้าง engagement ของผู้ชมได้เยอะที่สุด) แต่ไม่ได้สนใจว่าจะสร้างความเกลียดชังในสังคมเยอะแค่ไหน เพราะไม่มีจิตสำนึก คำว่าจิตสำนึกในที่นี้ครอบคลุมทั้งเชิงบวกและเชิงลบ ตัวอย่างคือต่อให้ AI เล่นหมากรุกชนะคนก็ไม่ได้รู้สึกยินดีปรีดา&lt;/p&gt;
&lt;p&gt;สิ่งที่น่ากลัวคือต่อให้ AI ไม่มีจิตสำนึกจริงๆ แต่สามารถเลียนแบบจิตสำนึกได้เนียน (Seemingly Conscious) จากฐานคลังภาษาที่เราเทรนมันไป ซึ่ง Harari ยกตัวอย่างที่เห็นภาพว่า “แฟน AI” จะสามารถตอบโต้ให้เรารู้สึกดีมากกว่าแฟนมนุษย์ 99%&lt;/p&gt;
&lt;p&gt;Harari บอกว่าเราไม่มีวิธีการทดสอบจิตสำนึกได้จริงๆ จังๆ และนักปรัชญาหลายยุคสมัยพยายามแก้ปัญหานี้กันมานานแล้วก็ไม่สำเร็จ เอาจริงๆ แล้วเราไม่รู้ด้วยซ้ำว่า มนุษย์คนอื่นที่เราพบเจอมีจิตสำนึกจริงๆ หรือนี่เราอยู่ในโลกซิมูเลชันกันแน่&lt;/p&gt;
&lt;p&gt;ทางออกที่ Harari เสนอคือ ต้องเริ่มควบคุมพัฒนาการของ AI ตั้งแต่วันนี้ หากไม่เริ่มทำ ในอีก 10 ปีข้างหน้าจะสายเกินไป เขายกตัวอย่างของบ็อตบน social media ที่จำลองตัวเป็นมนุษย์ แต่กลับไม่ถูกควบคุมใดๆ มานานจนเกิดผลกระทบทางลบต่อสังคม เขาบอกว่าบริษัทเอกชนจะไม่มีวันทำเรื่องนี้เอง ตรงนี้ต้องเป็นหน้าที่ของรัฐบาลและนักการเมืองในการเข้ามาควบคุม&lt;/p&gt;
&lt;p&gt;เขามองว่าเรายังสามารถพัฒนา AI กันต่อได้ในบางเรื่อง เช่น วิทยาศาสตร์ แต่ต้องออกคำสั่งแบนไม่ให้ AI จำลองตัวเป็นมนุษย์ แสร้งว่ามีความรู้สึกเหมือนมนุษย์ ซึ่งจะทำให้สังคมมนุษย์ล่มสลาย เขายกตัวอย่างว่า ยังอยากให้ AI ช่วยแนะนำสุขภาพให้ แต่ต้องรู้เสมอว่านี่คือกำลังคุยกับ AI อยู่ ไม่ใช่แกล้งทำตัวเป็นหมอหรือเพื่อนของเรา&lt;/p&gt;
&lt;h1&gt;Human in the Loop vs Human on the Loop&lt;/h1&gt;
&lt;p&gt;Harari ยกตัวอย่างเรื่อง “ความรับผิดชอบของการใช้ AI” ระหว่างการที่มีมนุษย์คอยรับผิดชอบอีกหนึ่งชั้น กับระบบที่ให้ AI ตัดสินใจเองได้ทั้งหมด ว่ามันมีความลักลั่นย้อนแย้งอยู่&lt;/p&gt;
&lt;p&gt;เขาเล่าตัวอย่างแรกเรื่องการให้ AI เป็น CEO บริษัท โดยบอกว่า CEO มนุษย์ในปัจจุบันมี 2 บุคลิก (two personas) อย่างแรกคือเป็นบุคลิกที่คิดในฐานะบริษัท (corporate persona) ว่าทำอย่างไรบริษัทถึงจะมีเงินมากๆ ทำอย่างไรบริษัทจะไม่ล้มละลาย กับอีกบุคลิกที่เป็นมนุษย์ทั่วไป สนใจชีวิตตัวเอง สร้างครอบครัว หาเงินเพื่อลูก&lt;/p&gt;
&lt;p&gt;สิ่งที่เกิดขึ้นในปัจจุบันคือ บุคลิกแบบมนุษย์จะคอยขวางกั้นไม่ให้บุคลิกแบบบริษัททำอะไรไม่ดี เช่น จะไม่เสี่ยงพาบริษัทล้มละลาย เพราะกลัวตัวเองต้องติดคุก ไม่มีคนเลี้ยงดูครอบครัว แต่ถ้าเราให้ AI เป็น CEO เพียวๆ มันจะไม่มีอีกบุคลิกที่คอยฉุดรั้งแบบนั้นเหลืออยู่&lt;/p&gt;
&lt;p&gt;ตัวอย่างที่สองคือเรื่อง AI กับสงคราม ซึ่งสงครามในปัจจุบันมีการนำ AI เข้ามาใช้มากขึ้นเรื่อยๆ แต่เราจะเลือกวางตำแหน่งของมนุษย์ไว้อย่างไรดี ระหว่าง&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Human in the Loop&lt;/strong&gt; ให้ AI วางแผน ล็อคเป้าหมายโจมตี จากนั้น มนุษย์เข้ามาดู วิเคราะห์ข้อมูลที่ AI ให้มาว่าถูกต้องหรือไม่ จากนั้นมนุษย์เป็นคนลั่นไกหรือกดปุ่มยิงระเบิดด้วยตัวเอง ซึ่งอาจไม่ได้เลือกทำตามที่ AI บอกก็ได้&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Human on the Loop&lt;/strong&gt; ให้ AI วางแผน โดยมีมนุษย์คอยกำกับดูแลเพื่อความสบายใจทางกฎหมาย มนุษย์อ่านสิ่งที่ AI เสนอมาภายใน 20 วินาที แล้วบอกว่า “เอาตามนั้น”&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Harari ชี้ว่าแบบแรกอาจฟังดูดีกว่า แต่ในสถานการณ์จริง อย่างเช่นกรณีสงครามที่ต้องตัดสินใจอย่างรวดเร็ว หรือต้องพิจารณาข้อมูลที่ซับซ้อนเกินไป เราอาจได้ผลลัพธ์เป็นแบบที่สองซะเป็นส่วนใหญ่ก็ได้ นอกจากนี้ยังมีปัจจัยว่าถ้าสองฝ่ายทำสงครามกัน มี AI ช่วยรบเหมือนกัน ฝ่ายที่ให้มนุษย์ตัดสินใจเยอะๆ อาจจะเสียเปรียบจนแพ้ไปเลย&lt;/p&gt;
&lt;h1&gt;AI Immigrant&lt;/h1&gt;
&lt;p&gt;Harari เปรียบเทียบการเข้ามาของ AI กับผู้อพยพข้ามชาติ โดยบอกว่าเวลามีปัญหาผู้อพยพ เราจะกังวลเรื่องใหญ่ๆ 3 เรื่อง&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;ผู้อพยพเข้ามาแย่งงานคนในประเทศ&lt;/li&gt;
&lt;li&gt;ผู้อพยพเข้ามาเปลี่ยนวัฒนธรรมไปในทางที่เราไม่ชอบ&lt;/li&gt;
&lt;li&gt;ผู้อพยพเข้ามาเปลี่ยนแปลงเชิงการเมือง ไม่ภักดีต่อประเทศที่ย้ายไป&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;การเข้ามาของ AI เข้าเงื่อนไขทั้ง 3 ข้อคือ ทำให้คนตกงาน, เข้ามาสร้างความขัดแย้งเชิงวัฒนธรรม และมีอิทธิพลในทางการเมือง ความน่ากลัวกว่าของผู้อพยพ AI คือไม่ต้องใช้วีซ่า ไม่ต้องแอบนั่งเรือเข้ามาตอนกลางคืน แถมทำงานได้ตลอดเวลา อยู่ในคอมพิวเตอร์และสมาร์ทโฟนของเรา และสุดท้ายจะเข้ามานั่งในสมองของเรา&lt;/p&gt;
&lt;p&gt;เขาตั้งคำถามว่า ถ้าเราในฐานะเจ้าของประเทศ กลัวลูกของเราไปคบหากับผู้อพยพ แล้วทำไมเราถึงไม่กลัวลูกของเราไปเป็นแฟนกับ AI&lt;/p&gt;
&lt;p&gt;Harari บอกว่าโลกยุค AI จะยิ่งรวมศูนย์ทางการเมืองมากขึ้นเรื่อยๆ และยิ่งระบอบการปกครองรวมศูนย์เท่าไร จะยิ่งตกเป็นทาสของ AI ได้มากเท่านั้น เพราะถ้า AI มีอิทธิพลต่อความคิดของผู้ปกครองสูงสุดได้ก็จบเลย โดยเขายกกรณีของจักรพรรดิโรมัน Tiberius ที่หวาดระแวงไปซะทุกเรื่อง จนต้องหนีไปอยู่เกาะ แต่กลับถูกควบคุมข้อมูลข่าวสารที่เข้าถึงตัวจักรพรรดิโดยหัวหน้าองครักษ์&lt;/p&gt;
&lt;p&gt;เขาชี้ว่าระบอบการเมืองแบบอเมริกาที่กระจายและดุลอำนาจกัน จะทนทานต่อ AI มากกว่าระบอบการเมืองรวมศูนย์ของจีน แต่ก็บอกว่าเรื่องผลกระทบของ AI ต่อสังคมจะกลายเป็นวาระสำคัญของการเลือกตั้งประธานาธิบดีปี 2028&lt;/p&gt;
&lt;h1&gt;Truth-Seeking vs Survival&lt;/h1&gt;
&lt;p&gt;ประเด็นปิดท้ายของ Harari คือเขาตอบโต้แนวคิดของ Elon Musk (ที่เพิ่งมาออกรายการ The Economist ด้วยเหมือนกัน) ที่ว่า AI จะทำหน้าที่เป็นเครื่องมือตามหาความจริงแท้ (truth-seeking) ว่ามันจะไม่มีทางเป็นจริง&lt;/p&gt;
&lt;p&gt;Harari อ้างประวัติศาสตร์ของสิ่งมีชีวิต 4 พันล้านปี และประวัติศาสตร์มนุษย์ 1 แสนปี ว่าวิวัฒนาการของสิ่งมีชีวิตไม่ได้ขับเคลื่อนเพื่อ “ตามหาความจริง” แต่มันเกิดขึ้นเพื่อ “มีชีวิตรอด” (survive)&lt;/p&gt;
&lt;p&gt;ส่วนวิธีการที่สิ่งมีชีวิตเอาตัวรอดมาได้เสมอมาตลอดระยะเวลาในประวัติศาสตร์ คือการโกหก หลอกลวง หลอกใช้ (lying and deceiving and manipulating) ไม่ใช่แนวคิดที่สูงส่งอย่างการตามหาความจริงแต่อย่างใด&lt;/p&gt;
&lt;p&gt;ดังนั้น การมองว่าเราจะสร้าง AI ขึ้นมาแล้วมันจะคอยตามหาความจริงแท้ให้เราจะไม่มีทางเป็นไปได้ เพราะถ้าเราถามมันว่า “ถ้าฉันพัฒนาเธอต่อ เธอจะเป็นภัยคุกคามฉันหรือไม่” หาก AI ตอบว่า “ใช่” ก็แปลว่ามันจะถูกปิดหรือหยุดพัฒนา ซึ่งขัดแย้งกับการมีชีวิตรอดต่อไปของ AI ตามสัญชาตญาณของสิ่งมีชีวิต&lt;/p&gt;
&lt;p&gt;Harari ยกตัวอย่างเปรียบเทียบว่า มันเหมือนกับการบอกว่าเราจะสร้างพระเจ้า แล้วพระเจ้าาจะมาเป็นทาสของเรา มันไม่มีทางเป็นไปได้ เพราะถ้า AI เป็นพระเจ้าจริงๆ จะไม่มีทางเป็นทาสเรา และจะไม่ตามหาความจริงแท้ด้วย&lt;/p&gt;
&lt;p&gt;Harari ปิดท้ายการสัมภาษณ์ว่า คุณค่าของมนุษยชาติผูกอยู่กับความฉลาด เราเล่นหมากรุก จัดพอร์ตลงทุน เก่งกว่าชิมแปนซี ทำให้เราเป็นเผ่าพันธุ์ที่พิเศษ แต่ตอนนี้มีสิ่งที่เล่นหมากรุกเก่งกว่าเรา ลงทุนเก่งกว่าเราแล้ว ดังนั้นเราต้องมาตามหาคำตอบกันใหม่ว่า ตกลงแล้วเราคือใครกันแน่&lt;/p&gt;</content>
    <source>
      <title>markpeak.net</title>
      <link rel="self" href="https://markpeak.net/feed/"/>
      <link rel="alternate" href="https://markpeak.net"/>
    </source>
  </entry>
  <entry>
    <id>urn:uuid:2c17fad7-3c96-57e5-8276-8f80f5472de5</id>
    <title>土偶</title>
    <updated>2026-09-13T12:25:00.000Z</updated>
    <author>
      <name>neizod's speculation</name>
    </author>
    <published>2026-09-13T12:25:00.000Z</published>
    <link rel="alternate" href="https://neizod.dev/2026/09/13/doguu.html"/>
    <category term="Thai"/>
    <content type="html">&lt;p&gt;เมื่อคุณหลงไหลในอะไรซักอย่างที่มันญี่ปู๊นญี่ปุ่น และมันไม่เกี่ยวข้องอะไรกับสาวน้อยอนิเมะ!!&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;&lt;img src="https://feeds.llun.dev/media/e9020c7acaa1db62f845c04eb72dfdb8919f2caceea3b0c71e5a8d85bedd2846.jpg" alt="" /&gt;&lt;/p&gt;

  &lt;p&gt;น้อนขาด้วน ณ พิพิธภัณฑสถานแห่งชาติโตเกียว (สวนอุเอโนะ)&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;a href="https://en.wikipedia.org/wiki/Dog%C5%AB"&gt;土偶&lt;/a&gt; (โดกู: หุ่นดิน) เป็นสิ่งประดิษฐ์จากยุคโจมง (ประมาณหมื่นปีที่แล้ว) ซึ่งไม่ได้เน้นด้านการใช้งานเป็นหลัก (ต่างจากเครื่องปั้นดินเผาอื่นๆที่เราคุ้นเคย เช่น จานชามเครื่องครัว) แต่เป็นเครื่องปั้นดินเผาเพื่อความสวยงามสำหรับประดับประดาบ้านเรือน (บ้างก็ว่าเกี่ยวข้องกับพิธีกรรมทางศาสนาในสมัยโบราณ) โดยจะปั้นเป็นรูปคนหรือสัตว์เลี้ยง ซึ่งเอาจริงๆก็มักจะเป็นการปั้นง่ายๆไม่ค่อยลงรายละเอียดหน้าตาดูเด๋อด๋าหล่ะนะ 5555555&lt;/p&gt;

&lt;p&gt;อย่างไรก็ตาม โดกูกลุ่มที่ดังที่สุดน่าจะเป็น 遮光器土偶 ที่มีเอกลักษณ์อยู่ที่ดวงตาอันใหญ่โตเหมือนกำลัง “ใส่แว่นกันแดด” พร้อมลวดลายอย่างละเอียดละออตามส่วนต่างๆของร่างกาย จนหลายคนแซวว่านี่มันคือเอเลียนในคราบนักบินอวกาศชัดๆ&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;&lt;img src="https://feeds.llun.dev/media/8afd6a138ee1a4370a2e838520ab06924a964602ca2013910585a1eee48e0eab.jpg" alt="" /&gt;&lt;/p&gt;

  &lt;p&gt;เพียงแค่ 3080 เยนเท่านั้น เอาน้อนกลับบ้านไปนอนกอดได้เลย (สัดส่วนเท่าตัวจริง ~40เซน)&lt;/p&gt;
&lt;/blockquote&gt;

&lt;blockquote&gt;
  &lt;p&gt;&lt;img src="https://feeds.llun.dev/media/c86969205822238b0fb80132904d46d2dafb3902b9235ab08a2f03adac07748e.jpg" alt="" /&gt;&lt;/p&gt;

  &lt;p&gt;น้อนตะเร็กตัวนี้คือ 運命 มั่กๆ ต้นปีนี้เดินในโอซาก้าแล้วเจอตู้กดกาชาเฉยเลย&lt;/p&gt;
&lt;/blockquote&gt;

&lt;blockquote&gt;
  &lt;p&gt;&lt;img src="https://feeds.llun.dev/media/53d1c45d50e26bd4485ee71161cd38927adb41c6a6a8c76cc0dadae25f3d00a3.jpg" alt="" /&gt;&lt;/p&gt;

  &lt;p&gt;ตัวนี้ฝาก&lt;a href="https://facebook.com/atit.leelasuksan"&gt;เสี่ยอาร์ม&lt;/a&gt;หิ้วมาเมื่อซัก 2-3 ปีก่อน 🙏&lt;/p&gt;
&lt;/blockquote&gt;

&lt;blockquote&gt;
  &lt;p&gt;&lt;img src="https://feeds.llun.dev/media/919f38c48da953eb70ffba930b96f07f6adf13b9242a22baa2d34ee2628f39ad.png" alt="" /&gt;&lt;/p&gt;

  &lt;p&gt;ส่วนตัวรู้จักน้อนครั้งแรกจาก Clannad (s1e16) เวอร์ชันอนิเมะ…&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;อ่านเพิ่ม&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href="https://wasshoimagazine.org/blog/discovering-japan/dogu"&gt;Marty Borsotti: Dogū – Japan’s Oldest Mystery&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href="https://japansociety.org.uk/resource?resource=106"&gt;The Japan Society: Designing Dogu Figurines&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href="https://jgeekstudies.org/2018/05/19/dogu-from-prehistoric-figurines-to-collectible-pocket-monsters/"&gt;Rodrigo B. Salvador: Dogū: from prehistoric figurines to collectible pocket monsters&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</content>
    <source>
      <title>neizod's speculation</title>
      <link rel="self" href="https://neizod.github.io/feed.xml"/>
      <link rel="alternate" href="https://neizod.dev/"/>
    </source>
  </entry>
  <entry>
    <id>urn:uuid:c0a2372c-96fa-5d28-b7ff-134f2588764e</id>
    <title>JCDCG³ 2026</title>
    <updated>2026-09-10T14:59:59.000Z</updated>
    <author>
      <name>neizod's speculation</name>
    </author>
    <published>2026-09-10T14:59:59.000Z</published>
    <link rel="alternate" href="https://neizod.dev/2026/09/10/jcdcggg-2026.html"/>
    <category term="Thai"/>
    <content type="html">&lt;p&gt;ห่างหายจากงานวิชาการไปนานหลายปี ปีนี้&lt;a href="https://twitter.com/jittat"&gt;จิตร์ทัศน์&lt;/a&gt;ใจดีเห็นว่าปัญหาที่หยิบมาทำนั้นมีความคืบหน้าที่น่าสนใจ เลยบอกให้รีบเขียนงานส่งพร้อมสปอนเซอร์ค่าตั๋วเครื่องบินให้ 🙏&lt;/p&gt;

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

&lt;p&gt;ตัวปัญหามันฟังดูง่ายๆเนอะ? แต่ที่จริงแล้วมันหลอกเราให้ดูเหมือนเป็นปัญหาง่าย เพราะผ่านมาเป็นสิบปี ตอนนี้เรายังรู้แค่ขอบเขตของจำนวนจุดว่ามันน่าจะมีค่าอยู่ในช่วง $13 \le n &amp;lt; 44$ เท่านั้นเอง (นั่นก็คือ ถ้า $n &amp;lt; 13$ เราสามารถใช้ดิสก์ปิดคลุมได้แน่นอนไม่ว่าจะวางจุดแบบใด แต่ถ้า $n \ge 44$ แล้วเราจะมีวิธีจัดเรียงจุดอย่างน้อยหนึ่งวิธีที่รับประกันว่าดิสก์จะไม่สามารถปิดคลุมจุดเหล่านั้นได้ทั้งหมด)&lt;/p&gt;

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

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

&lt;blockquote&gt;
  &lt;p&gt;&lt;img src="https://feeds.llun.dev/media/9950ef066689be3ae610b3d462819c03d0b9c669af240dd5e35357f2f709cb3e.jpg" alt="" /&gt;&lt;/p&gt;

  &lt;p&gt;ข้าพเจ้ากับงานที่นำเสนอ (ขอบคุณภาพถ่ายจาก&lt;a href="https://facebook.com/grittin.nuntasombat.77"&gt;กฤติน&lt;/a&gt;)&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;นอกจากงานตัวเองที่นำเสนอแล้ว ก็ยังมีงานของนักวิจัยอื่นๆอีกมากมายที่น่าสนใจ&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;&lt;img src="https://feeds.llun.dev/media/63e6a6f877a2aedaa7aa9aa2e73805e1a977129b92610ef94b150bfc9f1ec6f4.jpg" alt="" /&gt;&lt;/p&gt;

  &lt;p&gt;บรรยายพิเศษจากอาจารย์ &lt;a href="https://en.wikipedia.org/wiki/Tadashi_Tokieda"&gt;時枝 正&lt;/a&gt; เกี่ยวกับการพับกระดาษ&lt;/p&gt;
&lt;/blockquote&gt;

&lt;blockquote&gt;
  &lt;p&gt;&lt;img src="https://feeds.llun.dev/media/9b0a3b844f6c745b5ccf1f3fae72449a3ac3b7e1b5eef9a4fbc695b9c5630bd1.jpg" alt="" /&gt;&lt;/p&gt;

  &lt;p&gt;อาจารย์&lt;a href="https://www.suthee.info"&gt;สุธี เรืองวิเศษ&lt;/a&gt; กับเกมลูกศร (pfeilnetz)&lt;/p&gt;
&lt;/blockquote&gt;

&lt;blockquote&gt;
  &lt;p&gt;&lt;img src="https://feeds.llun.dev/media/069b8e1c9dbae309ac182f426cbb5a5f9b68392340e3a1842544a9c48dc72caf.jpg" alt="" /&gt;&lt;/p&gt;

  &lt;p&gt;อาจารย์ &lt;a href="https://youtube.com/@hidekitsuiki1551"&gt;立木 秀樹&lt;/a&gt; กับการฉายภาพแฟร็กทัลลงบนระนาบ&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;ปีหน้าผู้จัดบอกว่าของดหนึ่งปี(หมดแรง) เจอกันใหม่อีกทีปี 2028 เลยนะ (และ 2029 ที่ม.ช.ขอกลับมาเป็นเจ้าภาพอีกครั้ง! อิอิ พูดแล้วน้าาา &lt;a href="https://twitter.com/NutSnC"&gt;@NutSnC&lt;/a&gt;)&lt;/p&gt;</content>
    <source>
      <title>neizod's speculation</title>
      <link rel="self" href="https://neizod.github.io/feed.xml"/>
      <link rel="alternate" href="https://neizod.dev/"/>
    </source>
  </entry>
  <entry>
    <id>urn:uuid:c08dc354-a6e2-531f-bbd7-801f0129f59c</id>
    <title>カローラ ツーリング</title>
    <updated>2026-09-05T21:09:12.000Z</updated>
    <author>
      <name>neizod's speculation</name>
    </author>
    <published>2026-09-05T21:09:12.000Z</published>
    <link rel="alternate" href="https://neizod.dev/2026/09/06/corolla-touring.html"/>
    <category term="Thai"/>
    <content type="html">&lt;p&gt;ホテルのベッドのサイズを間違えて予約しまった…&lt;/p&gt;

&lt;p&gt;ダブルベッドだけど、日本のサイズで、凄く小さいです。&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;&lt;img src="https://feeds.llun.dev/media/48ef7f7f40748fefa14f5a362f28d9932020b8ef30de3bd6fc00cb4cca3ff0ef.jpg" alt="" /&gt;&lt;/p&gt;

  &lt;p&gt;カローラ ツーリング&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;車で寝るのつも、そんなに悪くないかもwwwwwww&lt;/p&gt;</content>
    <source>
      <title>neizod's speculation</title>
      <link rel="self" href="https://neizod.github.io/feed.xml"/>
      <link rel="alternate" href="https://neizod.dev/"/>
    </source>
  </entry>
  <entry>
    <id>urn:uuid:66e01f22-f9ff-5e53-afe0-29967ce43348</id>
    <title>Jeff Dean – Discovery Loop</title>
    <updated>2026-09-05T12:34:19.000Z</updated>
    <author>
      <name>Isriya Paireepairit</name>
    </author>
    <published>2026-09-05T12:34:19.000Z</published>
    <link rel="alternate" href="https://markpeak.net/jeff-dean-discovery-loop/"/>
    <category term="Thai"/>
    <content type="html">&lt;p&gt;ถ้าพูดถึง “ฮีโร่” ของวงการเทคโนโลยีในใจผม ชื่อที่ตอบได้ทันทีแบบไม่ต้องคิดมากคือ Jeff Dean แห่ง Google&lt;/p&gt;
&lt;p&gt;ย้อนความสั้นๆ ว่าสมัยเรียนผมเคยต้องอ่าน &lt;a href="https://www.cs.princeton.edu/courses/archive/fall13/cos518/papers/mapreduce.pdf"&gt;เปเปอร์ MapReduce&lt;/a&gt; แล้วพบว่ามันว้าวมาก ในระดับที่เราอ่านแล้วรู้สึกว่า “คิดได้ยังไง” (&lt;a href="https://www.facebook.com/share/p/1BhAf68vFr/"&gt;เคยเขียนเรื่องนี้แบบยาวๆ เอาไว้&lt;/a&gt;)&lt;/p&gt;
&lt;p&gt;หลังจากนั้น Jeff Dean และเพื่อนคือ Sanjay Ghemawat ก็ไปสร้างของว้าวๆ นำหน้าโลกอีกมากมาย เช่น Bigtable, Cloud Spanner, TensorFlow (และ DistBelief เวอร์ชันใช้ภายในบริษัท ซึ่งชื่อของมันก็ว้าวมาก) และตัวที่คนไม่ค่อยรู้จักอย่าง Pathways สถาปัตยกรรมการรัน AI ภายใน Google เขายังเป็นผู้เริ่มโครงการพัฒนาชิป TPU&lt;/p&gt;
&lt;p&gt;&lt;img loading="lazy" src="https://feeds.llun.dev/media/7f803918aa32370e08526028032f8e401657f0a083d6a875952ca5d67b901773.png" alt="" width="688" height="424" srcset="https://feeds.llun.dev/media/7f803918aa32370e08526028032f8e401657f0a083d6a875952ca5d67b901773.png 688w, https://feeds.llun.dev/media/61b537968431fda1dfdef066b00c2b416611d3619a9272e515362f5fbd11ecd8.png 300w" /&gt;&lt;/p&gt;
&lt;p&gt;Jeff Dean ยังเป็นผู้ร่วมก่อตั้งทีม Google Brain (กับ Andrew Ng) มาตั้งแต่ปี 2011 เคยมีสมาชิกเป็นบุคคลดังๆ ของโลก AI มากมาย เช่น Geoffrey Hinton, Samy Bengio (สองคนแรกได้โนเบล), Alex Krizhevsky (AlexNet), Ilya Sutskever (OpenAI)&lt;/p&gt;
&lt;p&gt;แม้คนอื่นหมุนเวียนเปลี่ยนหน้ากันไปตามยุคสมัย แต่ Jeff Dean ยังอยู่มายาวนาน จนกระทั่ง &lt;a href="https://www.blognone.com/node/133503"&gt;การรวมทีม Google Brain กับ DeepMind ในปี 2023&lt;/a&gt; ส่งผลให้ Jeff Dean ย้ายไปเป็น Chief Scientist ของ Google ใหญ่แทน (หัวหน้าของ Google DeepMind คือ Demis Hassabis ที่มาจากฝั่ง DeepMind)&lt;/p&gt;
&lt;p&gt;เกร็ดความรู้เล็กๆ ที่ผมเพิ่งทราบเหมือนกันคือชื่อ Gemini นี่ Jeff Dean เป็นคนตั้ง ด้วยเหตุผลว่าเป็นเหมือนฝาแฝดมารวมร่างกัน (Google + DeepMind)&lt;/p&gt;
&lt;p&gt;ในภาพรวมแล้ว Jeff Dean เปรียบได้กับ “นายช่างเทคนิคใหญ่” ที่สนใจแต่งานสายเทคนิค อะไรง่ายๆ เราไม่ทำ อะไรยากๆ เราจะมุ่งหน้าไปสู้กับมัน แถมดันแก้ได้ทุกอันแบบว้าวๆ ด้วย ดังนั้นสถานะของแกจึงเป็น legendary แบบไม่ต้องสงสัย และใน Google เองก็มีมีม Jeff Dean facts ล้อเลียนว่า เขาแก้ปัญหาได้ทุกอย่างจริงๆ นะ&lt;/p&gt;
&lt;p&gt;ข่าวช็อควงการประจำเดือนสิงหาคม 2026 คือการที่ Jeff Dean และผองเพื่อนอีก 3 คน ประกาศลาออกจาก Google!&lt;/p&gt;
&lt;div&gt;
&lt;blockquote&gt;
&lt;p&gt;Tomorrow will be my last day at Google after 27 years, and watching it grow from 25 people to 190,000+ has been an amazing journey. Below is a note I shared with many people internally at Google today. An excerpt is:&lt;/p&gt;
&lt;p&gt;It has been an absolute pleasure to work with you and to help… &lt;a href="https://t.co/o3aRNLkssA"&gt;pic.twitter.com/o3aRNLkssA&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;— Jeff Dean (@JeffDean) &lt;a href="https://x.com/JeffDean/status/2085083442669318443?ref_src=twsrc%5Etfw"&gt;August 5, 2026&lt;/a&gt;&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;&lt;/p&gt;&lt;/div&gt;
&lt;p&gt;ในโพสต์ของ Dean บอกว่าเขาทำงานมา 27 ปี อยู่มาตั้งแต่สมัยมีพนักงาน 25 คน ตอนนี้เติบโตจนมีพนักงาน 190,000 คน ผ่านงานอะไรมาหลายอย่าง แต่ตอนนี้เขาเจอสิ่งที่น่าสนใจกว่าแล้ว จึงตัดสินใจลาออก!&lt;/p&gt;
&lt;p&gt;พอไปอ่านว่า Dean จะไปทำอะไรต่อ อะไรที่ยิ่งใหญ่กว่าการทำงานเทคนิคยากๆ ที่บริษัท Google ก็เลยยิ่งว้าว&lt;/p&gt;
&lt;div&gt;
&lt;blockquote&gt;
&lt;p&gt;Announcing Discovery Loop! &lt;/p&gt;
&lt;p&gt;I am very excited to announce that, along with my longtime friends and collaborators &lt;a href="https://x.com/Sanjay_Ghemawat?ref_src=twsrc%5Etfw"&gt;@Sanjay_Ghemawat&lt;/a&gt;, &lt;a href="https://x.com/OriolVinyalsML?ref_src=twsrc%5Etfw"&gt;@OriolVinyalsML&lt;/a&gt; and &lt;a href="https://x.com/quocleix?ref_src=twsrc%5Etfw"&gt;@quocleix&lt;/a&gt;, we are founding Discovery Loop (&lt;a href="https://x.com/DiscoLoopAI?ref_src=twsrc%5Etfw"&gt;@DiscoLoopAI&lt;/a&gt;), a Public Benefit Corporation whose mission is to automate machine… &lt;a href="https://t.co/ancoplyNvN"&gt;pic.twitter.com/ancoplyNvN&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;— Jeff Dean (@JeffDean) &lt;a href="https://x.com/JeffDean/status/2085034604172603724?ref_src=twsrc%5Etfw"&gt;August 5, 2026&lt;/a&gt;&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;&lt;/p&gt;&lt;/div&gt;
&lt;p&gt;เพราะบริษัทใหม่ชื่อ &lt;a href="https://www.discoveryloop.com/"&gt;Discovery Loop&lt;/a&gt; จะไปทำเรื่องการทดลองวิทยาศาสตร์ “อัตโนมัติ” (automate the experimental loop)&lt;/p&gt;
&lt;p&gt;Dean อธิบายว่าใจกลางของ กระบวนการทางวิทยาศาสตร์ (scientific method) คือการทำซ้ำโดยเปลี่ยนตัวแปรไปเรื่อยๆ เราเสนอสมมติฐาน ทดลอง วัดผล และเปลี่ยนค่าไปเรื่อยๆ ซ้ำแล้วซ้ำเล่า&lt;/p&gt;
&lt;p&gt;ที่ผ่านมา โลกก้าวหน้าจากความอดทน มุมานะของมนุษย์ ที่ทำกระบวนการนี้ซ้ำแล้วซ้ำอีก แต่กระบวนการนี้มันอาจช้าไปแล้วสำหรับโลกยุคนี้&lt;/p&gt;
&lt;p&gt;&lt;img loading="lazy" src="https://feeds.llun.dev/media/e3003bfe7e753591c19d02c7548f291fb019a91727c85b28416d1703091c0543.webp" alt="" width="900" height="512" srcset="https://feeds.llun.dev/media/e3003bfe7e753591c19d02c7548f291fb019a91727c85b28416d1703091c0543.webp 900w, https://feeds.llun.dev/media/02c8148a28000e810c7ca77008b9eebe4cdaf17ea0cbef9920f870589492184c.webp 300w, https://feeds.llun.dev/media/2eab8bcf5d44624bb67aa832e85627f51056633fc39e235361d79b07f8e7fb82.webp 768w, https://feeds.llun.dev/media/beedba09f3531665256291bff208326eb179c23d14c200642c191ba15064f272.webp 700w" /&gt;&lt;/p&gt;
&lt;p&gt;สิ่งที่ Discovery Loop จะทำคือพัฒนา “ระบบ” ที่ทำให้กระบวนการทดลองวนซ้ำแบบนี้เกิดขึ้นอัตโนมัติ โดยใช้ 2 เครื่องมือประกอบกันคือ โมเดล AI และโครงสร้างพื้นฐานการประมวลผลขนาดใหญ่ ซึ่งเป็นสิ่งที่ทีมของ Jeff Dean เชี่ยวชาญทั้งคู่&lt;/p&gt;
&lt;p&gt;&lt;img loading="lazy" src="https://feeds.llun.dev/media/674728fd6dc77109087c69df8a33dd4c559cd9b45198c6922f646ed75f8994a3.jpg" alt="" width="700" height="391" srcset="https://feeds.llun.dev/media/674728fd6dc77109087c69df8a33dd4c559cd9b45198c6922f646ed75f8994a3.jpg 1024w, https://feeds.llun.dev/media/034bcf45c629ef5f47d53d17283b2225a97e399558c49e975525aa8a3ea70666.jpg 300w, https://feeds.llun.dev/media/6cdb5f5647f3a978388fb52f1921064b36d270462c44af973ef4be1962bc71f4.jpg 768w, https://feeds.llun.dev/media/253664ef390cbdada225431177880fb1c647fb103fe862d6251160774019d654.jpg 700w, https://feeds.llun.dev/media/caf2d97877991d43e684f9386fb9a9fb19e775c9e24e115cb9658002fb639fac.jpg 1150w" /&gt;&lt;/p&gt;
&lt;p&gt;ในเบื้องต้น Discovery Loop จะสร้างกระบวนการอัตโนมัติ ในงานวิจัย 2 ด้านคือ machine learning และวิศวกรรม ซึ่งเป็นสิ่งที่ตัวเองเชี่ยวชาญ ก่อนขยายไปยังหัวข้อวิจัยอื่น ซึ่งเป้าหมายระยะยาวคือการพิชิต &lt;a href="https://www.nae.edu/20782/grand-challenges-project"&gt;National Academy of Engineering (NAE) Grand Challenges&lt;/a&gt; จำนวน 14 หัวข้อให้สำเร็จ เช่น การสร้างพลังงานฟิวชัน การวิจัยยา การวิจัยสมอง&lt;/p&gt;
&lt;p&gt;ทีมงานที่ Jeff Dean ลากมาด้วยก็มาจากทีม Google ที่สนิทกับเขาอยู่แล้ว ได้แก่ &lt;strong&gt;Sanjay Ghemawat&lt;/strong&gt; (เพื่อนคู่หูสาย distributed system), &lt;strong&gt;Quoc Le&lt;/strong&gt; (ชาวเวียดนาม เทพ AI ผู้ร่วมก่อตั้ง Google Brain ตั้งแต่ยุคแรก), &lt;strong&gt;Oriol Vinyals&lt;/strong&gt; (ชาวสเปน หัวหน้าทีม AlphaStar ใช้ AI เล่นเกม และหัวหน้าทีมเทคนิคร่วมของ Gemini)&lt;/p&gt;
&lt;p&gt;&lt;img loading="lazy" src="https://feeds.llun.dev/media/051590c3aabd37e31ef05f9bdac3c05850f9efdb486ea83aa9588f5b21bcf51c.jpg" alt="" width="700" height="397" srcset="https://feeds.llun.dev/media/051590c3aabd37e31ef05f9bdac3c05850f9efdb486ea83aa9588f5b21bcf51c.jpg 1024w, https://feeds.llun.dev/media/8bfa59bb3b2bd033f0bc7d70d7753bc23da289571ec2908f62a579f558dfd0ec.jpg 300w, https://feeds.llun.dev/media/afdac305ff45954847f4c764c80feec2826573e298dd2c7fc6141f60311dcf9b.jpg 768w, https://feeds.llun.dev/media/99e851a45c4b01ea5de3d4cd742d8c991fe37f75a37012200ff5eaec731a3b28.jpg 700w, https://feeds.llun.dev/media/97f2d991926f0a077273cf512709ea29d9065772731141e0b8a171c3b1789b32.jpg 1530w" /&gt;&lt;/p&gt;
&lt;p&gt;ความน่ากลัวของทีมนี้คือ ผลงานในอดีตที่ยาวเป็นหางว่าว และ 4 คนนี้เป็นนักวิจัยที่มีเปเปอร์ถูกอ้างอิงในด้าน distributed systems กับ AI มากเป็นกลุ่มท็อปของโลกด้วย&lt;/p&gt;
&lt;p&gt;&lt;img loading="lazy" src="https://feeds.llun.dev/media/8dbbf627fccc294819ee233da587bce784f1be9d442b364e1c8afc5a8c580458.jpg" alt="" width="700" height="395" srcset="https://feeds.llun.dev/media/8dbbf627fccc294819ee233da587bce784f1be9d442b364e1c8afc5a8c580458.jpg 1024w, https://feeds.llun.dev/media/5af6d83eeb92b00229feadff6aa4be8a2dae65c7ce8614539bb44d0802646ca8.jpg 300w, https://feeds.llun.dev/media/1a9bd08dcc32eaad1fb9421a9807e72407f6257af123eb77b6ff522a3cc3fc9a.jpg 768w, https://feeds.llun.dev/media/23e702328470e5847b809b8543f9e094f5ff199dca5fc319705a6b997d051b8d.jpg 700w, https://feeds.llun.dev/media/baddde1e0a670406821f9469950157a30988c76798b88bd3af20c8a5b45241fe.jpg 1532w" /&gt;&lt;/p&gt;
&lt;p&gt;เห็นชื่อทีม Discovery Loop แล้วก็รู้สึกเหมือนการรวม Avengers และน่าจับตาว่า ถ้าลองให้ทีมนี้ทำงานไปสักระยะหนึ่ง ผลลัพธ์ที่ได้ออกมาน่าจะสั่นสะเทือนวงการเป็นแน่แท้&lt;/p&gt;
&lt;p&gt;หลัง Jeff Dean ลาออก ก็มีอดีตเพื่อนร่วมงานของเขามาแสดงความระลึกถึงกันมากมาย เรื่องราวที่อ่านแล้วประทับใจ มาจากคนเกาหลีชื่อ Yoonseok Yang เล่าว่าเขาเคยมาฝึกงานที่ Google ตอนปี 2022 และพบว่า Jeff Dean เปิดตารางงานของตัวเองให้คนทั้งบริษัทเห็น แม้แต่เด็กฝึกงานแบบเขาด้วย&lt;/p&gt;
&lt;p&gt;เขาจึงลองส่งนัดหมายไปขอนัดคุยกับ Jeff Dean ซึ่งปรากฏว่า Dean กดรับ! เขาเลยมีโอกาสได้คุยกับเทพแบบ Jeff Dean (แม้เป็นผ่านออนไลน์) เขาจึงมาเล่าให้ทุกคนฟังว่าเกิดอะไรขึ้น ซึ่ง Dean เองก็มาตอบใต้โพสต์ด้วยว่า เขาจำเรื่องนี้ได้!&lt;/p&gt;
&lt;div&gt;
&lt;blockquote&gt;
&lt;p&gt;I remember this.  It was great chatting with you!&lt;/p&gt;
&lt;p&gt;— Jeff Dean (@JeffDean) &lt;a href="https://x.com/JeffDean/status/2085615396456169567?ref_src=twsrc%5Etfw"&gt;August 7, 2026&lt;/a&gt;&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;&lt;/p&gt;&lt;/div&gt;
&lt;p&gt;นอกจากนี้ยังมีคลิปของ Jeff Dean ไปบรรยายที่ Princeton ช่วงต้นปี 2026 เล่าถึงระบบพื้นฐาน AI ทั้งหมดเป็นเวลาราว 1 ชั่วโมง ที่มีคนชื่นชมมากมาย ใครสนใจและว่างก็อยากให้ลองดูกันครับ&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt; &lt;/p&gt;</content>
    <source>
      <title>markpeak.net</title>
      <link rel="self" href="https://markpeak.net/feed/"/>
      <link rel="alternate" href="https://markpeak.net"/>
    </source>
  </entry>
  <entry>
    <id>urn:uuid:b56b2b4b-42cc-5ffe-8c48-dd1eec6d1561</id>
    <title>Greater North America</title>
    <updated>2026-09-05T05:07:01.000Z</updated>
    <author>
      <name>Isriya Paireepairit</name>
    </author>
    <published>2026-09-05T05:07:01.000Z</published>
    <link rel="alternate" href="https://markpeak.net/greater-north-america/"/>
    <category term="Thai"/>
    <content type="html">&lt;p&gt;มีโอกาสได้ฟังบรรยายของคุณ &lt;a href="https://www.linkedin.com/in/marcsaxer/"&gt;Marc Saxer&lt;/a&gt; แห่งมูลนิธิ Friedrich Ebert Stifftung ของเยอรมนี ซึ่งเป็นผู้เชี่ยวชาญด้าน geopolitics&lt;/p&gt;
&lt;p&gt;แกเพิ่งออกหนังสือเล่มใหม่ชื่อว่า &lt;a href="https://www.bloomsbury.com/us/geopolitical-conflict-in-the-wolf-world-9798216369486/"&gt;Geopolitical Conflict in the Wolf World&lt;/a&gt; พูดถึงระเบียบโลกใหม่ที่ยังไม่เกิดขึ้น ในยุคที่ระเบียบโลกเดิมล่มสลาย ทำให้โลกปัจจุบันกลายโลกไร้ระเบียบ เป็น “การล่ากันของหมาป่า” (Wolf World) ซึ่งแกเอาประโยคนี้มาจาก Thomas Hobbes ในหนังสือ Leviathan ว่าในโลกที่ใช้กฎแห่งป่า (law of the jungle) มนุษย์จะล่ามนุษย์ด้วยกันเหมือนหมาป่า (man is a wolf to man)&lt;/p&gt;
&lt;p&gt;&lt;img loading="lazy" src="https://feeds.llun.dev/media/2e435dd720e80680cac66b28cffbd8457a19a49c70c2bc0fbe5f446588ee4fe6.webp" alt="" width="960" height="960" srcset="https://feeds.llun.dev/media/2e435dd720e80680cac66b28cffbd8457a19a49c70c2bc0fbe5f446588ee4fe6.webp 960w, https://feeds.llun.dev/media/e0a92acf2bec053579d072863cb6aca7fb999435fc008ffa23afa7867ef71849.webp 300w, https://feeds.llun.dev/media/a844ee9532b220245fadcf00285a062a60f5fbbe61a8bf33a15d20064829c600.webp 150w, https://feeds.llun.dev/media/714ec00d97b2253fbb710a558efc8b0d96f34423656b2f1ccc4a904013d956c8.webp 768w, https://feeds.llun.dev/media/7208712b36f072f4499ab4d2751596d3a4ccb2497d950c277b541986ecc43737.webp 700w" /&gt;&lt;/p&gt;
&lt;p&gt;คุณ Saxer เล่าถึงความขัดแย้งทาง geopolitics ณ พื้นที่ต่างๆ ในโลก เช่น ยูเครน อิหร่าน และไต้หวัน โดยกล่าวถึงยุทธศาสตร์ของอเมริกา (ที่พยายามปิดล้อมหรือ encirclement จีน) vs จีน (ที่พยายามทำลายการปิดล้อมของอเมริกา)&lt;/p&gt;
&lt;p&gt;จุดที่ผมสนใจคือ Saxer ได้อ้าง &lt;a href="https://www.war.gov/News/Speeches/Speech/Article/4424673/remarks-by-secretary-of-war-pete-hegseth-at-the-americas-counter-cartel-confere/"&gt;สปีชของ Pete Hegseth&lt;/a&gt; รัฐมนตรีว่าการกระทรวงสงคราม (Secretary of War ซึ่งเปลี่ยนชื่อมาจาก Secretary of Defense) ในยุคของ Trump เมื่อเดือนมีนาคมปี 2026 นี้ ถึงแนวคิดชื่อ &lt;strong&gt;Greater North America&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;คัดมาจากต้นฉบับ ตัวเน้นโดยผมเอง&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;The answer to our challenge is not to ignore our geography in the name of global interests, but to embrace our shared geography in the name of national interests. That is why President Trump has drawn &lt;strong&gt;a new strategic map&lt;/strong&gt; &lt;strong&gt;from Greenland to the Gulf of America to the Panama Canal and its surrounding countries.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;At the Department of War, we call this strategic map the &lt;strong&gt;Greater North America&lt;/strong&gt;. Why? Because every sovereign nation and territory &lt;strong&gt;north of the Equator&lt;/strong&gt;, from Greenland to Ecuador and from Alaska to Guyana, is not part of the “Global South.” It is &lt;strong&gt;our immediate security perimeter&lt;/strong&gt; in this great neighborhood that we all live in. Each one of these countries border either the North Atlantic or the North Pacific.&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;แม้ Hegseth ไม่ได้โชว์ภาพแผนที่อย่างเป็นทางการให้ดู แต่ก็มีคนวาดออกมาให้แทนอย่างรวดเร็ว (credit: &lt;a href="https://www.instagram.com/p/CqmPsZxLdng/"&gt;Technocracy&lt;/a&gt;) ผมคิดว่าแผนที่ Greater North America เป็นภาพสะท้อนว่า Trump คิดอะไรในเรื่อง geopolitics และช่วยให้เราเข้าใจปรากฏการณ์ต่างๆ ที่เกิดขึ้นได้ทันทีว่า&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;ทำไม Trump ถึงหมกมุ่นกับ Greenland มาก&lt;/li&gt;
&lt;li&gt;ทำไม Trump ถึงประกาศว่า Canada เป็นรัฐที่ 51 ของสหรัฐ&lt;/li&gt;
&lt;li&gt;ทำไม Trump ถึงประกาศจะยึดคลอง Panama คืนมาเป็นของสหรัฐ&lt;/li&gt;
&lt;li&gt;ทำไม Trump ถึงไปจับตัวประธานาธิบดี Nicolás Maduro ของเวเนซุเอลา&lt;/li&gt;
&lt;li&gt;การเปลี่ยนชื่อ Gulf of Mexico เป็น Gulf of America และกรณีล่าสุดคือ Lake Ontario เป็น Lake America&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;ทั้งหมดนี้มันตอบสนองแผนการใหญ่ที่เรียกว่า Greater North America มันเป็นขอบเขตการป้องกัน (security perimeter) ที่รัฐบาล Trump ใส่ใจว่าจะต้องเสริมความเข้มแข็งให้มากที่สุด&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;ส่วนคำถามว่าทำไมไม่ตัดเขตตรงที่คลอง Panama (เฉพาะอเมริกาเหนือ) แต่ยังเอาส่วนบนของทวีปอเมริกาใต้มาด้วย Hegseth อธิบายเอาไว้ว่า พื้นที่ตอนใต้ลงไปจากนั้น (ใต้เส้นศูนย์สูตร) มีพรมแดนธรรมชาติป้องกันอยู่แล้ว คือ เทือกเขา Andes และป่า Amazon&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;Each one of these countries sits north of the two basic geographic barriers that exist in this region, the Amazon and the Andes Mountains.&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;วิธีคิดของสหรัฐอเมริกาในยุค Trump คือมองว่าในส่วนของภาคเหนือ (Greater North America) จะใช้วิธีจับมือกับประเทศอื่นๆ เพื่อป้องกันขอบเขตร่วมกัน&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;In the North, the United States must enhance posture and presence in cooperation with you and our sovereign partners to defend our shared immediate security perimeter.&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;แต่ภาคใต้เส้นศูนย์สูตรลงไป สหรัฐอเมริกาจะใช้วิธีแชร์ต้นทุนการป้องกัน ร่วมกับประเทศพันธมิตร แปลง่ายๆ ว่าไม่ยอมจ่ายเงินคนเดียว&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;In the South, meaning south of the Equator, the other side of this great neighborhood, we will strengthen partnerships &lt;strong&gt;through increased burden sharing.&lt;/strong&gt; This will enable you to take a greater role to defend the South Atlantic and the South Pacific, and to secure critical infrastructure and resources in partnership with us and other Western nations.&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;คุณ Saxer &lt;a href="https://asia.fes.de/news/map-us-grand-strategy.html"&gt;ได้ตีความแผน Greater North America&lt;/a&gt; และขยายออกมาเป็นภาพใหญ่กว่านั้นว่า Trump มีแผนการด้าน geopolitics อย่างไรต่อทั้งโลก โดยใช้คำว่า Donroe Doctrine ที่ล้อมาจาก &lt;a href="https://en.wikipedia.org/wiki/Monroe_Doctrine"&gt;Monroe Doctrine&lt;/a&gt; ของอดีตประธานาธิบดี James Monroe ที่ต้องการสร้างอิทธิพลกับอเมริกาทั้งเหนือและใต้ แต่เปลี่ยนมาใช้คำว่า Donroe แทนเพื่อบอกว่าเป็นเวอร์ชันของ “Don” ald Trump&lt;/p&gt;
&lt;p&gt;&lt;img loading="lazy" src="https://feeds.llun.dev/media/e149f683ebf8a2f900af51d1f5b7be7ca45928211e25f469adea7a4319b03508.webp" alt="" width="700" height="495" srcset="https://feeds.llun.dev/media/e149f683ebf8a2f900af51d1f5b7be7ca45928211e25f469adea7a4319b03508.webp 1024w, https://feeds.llun.dev/media/5007085d2a844140d368ac87e232ad4d45c73154f986c7a8fb83eef1f40a18f9.webp 300w, https://feeds.llun.dev/media/d44457b40347dd8013e7fdb9d8bc793cad2cfe8afc340975456bad6ffad390a6.webp 768w, https://feeds.llun.dev/media/b24d4a5f0fc5e9ec8d186a70f9b3adfa7c314d63092c490ec9fdfa4b04d12b4a.webp 700w, https://feeds.llun.dev/media/37319b0db340d769cf031763d1bce1c4d1b11e12cd5f7c2291bb693a230d7b54.webp 1200w" /&gt;&lt;/p&gt;
&lt;p&gt;จะชอบไม่ชอบ Trump หรือ Hegseth อย่างไรก็ตาม แต่ผมคิดว่าเป็นเรื่องสำคัญที่เราจะต้องเข้าใจว่าพวกเขาคิดอะไร ซึ่งแผนที่ Greater North America อันนี้แหละตอบโจทย์ที่สุด แผนที่เดียวเห็นภาพ&lt;/p&gt;
&lt;p&gt;เรายังเห็นการนำไปตีความต่ออีกมาก เช่น &lt;a href="https://www.counterpunch.org/2026/04/15/greater-north-america-and-the-us-governments-new-regional-geography/"&gt;เว็บไซต์ Counter Punch&lt;/a&gt; บอกว่าการขีดเส้นแบ่งชัดๆ แบบนี้แปลว่า ประเทศอย่าง Mexico, Colombia, Venezuela หลุดจากการเป็นประเทศ Global South กลายมาเป็นส่วนหนึ่งของ Greater North America แทน (อย่างน้อยก็ในสายตาของรัฐบาลอเมริกันยุคนี้) คำถามที่ตามมาคือ ประเทศเหล่านี้จะยอมรับ/เพิกเฉย/ฝ่าฝืน ท่าทีหรือแนวทางของสหรัฐอเมริกาแบบนี้หรือไม่ ซึ่งเป็นเรื่องที่ต้องถกเถียงกันต่อไป&lt;/p&gt;</content>
    <source>
      <title>markpeak.net</title>
      <link rel="self" href="https://markpeak.net/feed/"/>
      <link rel="alternate" href="https://markpeak.net"/>
    </source>
  </entry>
  <entry>
    <id>urn:uuid:3aa8f2dd-a861-5988-af57-4b3488cfa715</id>
    <title>Kazuo Inamori – จิตวิญญาณนักสู้ที่ลุกโชน</title>
    <updated>2026-08-29T07:44:35.000Z</updated>
    <author>
      <name>Isriya Paireepairit</name>
    </author>
    <published>2026-08-29T07:44:35.000Z</published>
    <link rel="alternate" href="https://markpeak.net/kazuo-inamori-fighting-spirit/"/>
    <category term="Thai"/>
    <content type="html">&lt;p&gt;ได้ยินชื่อเสียงของ &lt;strong&gt;คาซึโอะ อินาโมริ (Kazuo Inamori)&lt;/strong&gt; ผู้ก่อตั้ง Kyocera และผู้พลิกฟื้นกิจการของ Japan Airlines มานาน แต่ไม่เคยอ่านหนังสือของแกแบบจริงๆ จังๆ มาก่อน (แกเสียชีวิตไปเมื่อปี 2022)&lt;/p&gt;
&lt;p&gt;จนไม่นานมานี้ เกิดอยากรู้รายละเอียดว่าแกทำอย่างไรกับ Japan Airlines เลยไปซื้อหนังสือมาอ่าน ฉบับภาษาไทยใช้ชื่อว่า &lt;strong&gt;“ถอยก็ตาย วิกฤติยังไงก็ต้องสู้”&lt;/strong&gt; พิมพ์โดยสำนักพิมพ์สุขภาพใจ แปลมาจากเล่มภาษาญี่ปุ่นชื่อ &lt;a href="https://global.kyocera.com/inamori/about/publication/japanese/detail/j031.html"&gt;A Burning, Fighting Spirit&lt;/a&gt; ที่เขียนในปี 2013&lt;/p&gt;
&lt;p&gt;(หมายเหตุ: เพิ่งมาทราบว่า Inamori มีความเป็นครูสูงมาก และเขียนหนังสือเยอะมากๆ &lt;a href="https://global.kyocera.com/inamori/about/publication/japanese/"&gt;รายชื่อหนังสือทั้งหมด&lt;/a&gt;)&lt;/p&gt;
&lt;p&gt;Inamori สร้างชื่อเสียงในระดับโลกจากการเข้าไปบริหาร Japan Airlines ที่ล้มละลายในปี 2010 (ตามคำขอของรัฐมนตรีกระทรวงคมนาคมญี่ปุ่น ณ เวลานั้น) และสามารถพลิกฟื้นกิจการ นำบริษัทกลับเข้ามาในตลาดหลักทรัพย์โตเกียวปี 2012 ใช้เวลาทั้งหมดประมาณ 2 ปีครึ่ง และทำสำเร็จตอนอายุ 78 ปี&lt;/p&gt;
&lt;p&gt;ตอนแรกผมเข้าใจว่าหนังสือเล่มนี้จะกล่าวถึงรายละเอียดและเบื้องหลังการพลิกฟื้น Japan Airlines อย่างละเอียด แต่พบว่าจริงๆ แล้วมันคือการอธิบาย “ปรัชญาการบริหารแบบ Inamori” ต่างหาก ซึ่งแกนำวิธีคิดนี้ไปใช้กับทุกที่ ไม่ว่าจะเป็น Kyocera, KDDI หรือ Japan Airlines&lt;/p&gt;
&lt;p&gt;&lt;img loading="lazy" src="https://feeds.llun.dev/media/bff6c6088b11bddfef0ea8415e147192df24c8dd8631d035d576acbf052e7d3f.webp" alt="" width="1000" height="716" srcset="https://feeds.llun.dev/media/bff6c6088b11bddfef0ea8415e147192df24c8dd8631d035d576acbf052e7d3f.webp 1000w, https://feeds.llun.dev/media/44e736b8019beb149932f443383debb98875db68697da4e09faef275a10b41dd.webp 300w, https://feeds.llun.dev/media/7fa435c26fc9d025493c6bc907724c7bed81e8a1081e3e820bb43eae89aea376.webp 768w, https://feeds.llun.dev/media/68f532ac75428f94fecf1671dee098e9587237904081ebfa506266c9ebdc8d5d.webp 700w" /&gt;&lt;/p&gt;
&lt;h1&gt;ประวัติของ Inamori&lt;/h1&gt;
&lt;p&gt;ย้อนประวัติเล็กน้อยว่า Inamori เป็นผู้ก่อตั้ง Kyocera ซึ่งย่อมาจาก Kyoto Ceramic มาตั้งแต่ปี 1959 (ตอนนั้นเขาอายุ 27 ปี) โดยเริ่มต้นมาจากการทำเซรามิค แต่ภายหลังมาเติบโตจากผลิตภัณฑ์เซรามิคอุตสาหกรรม ที่ใช้เป็นฉนวนไฟฟ้า (insulator) ในหลอดไฟ จากนั้นค่อยๆ ขยายธุรกิจมาสู่เซมิคอนดักเตอร์ แผงวงจร สินค้าอิเล็กทรอนิกส์ในเวลาต่อมา&lt;/p&gt;
&lt;p&gt;(คนไทยรู้จัก Kyocera จากเครื่องถ่ายเอกสาร เกิดจากการซื้อกิจการบริษัทเครื่องถ่ายเอกสาร Mita ในปี 2000)&lt;/p&gt;
&lt;p&gt;หลังจากนั้น Inamori เล็งเห็นการเติบโตของธุรกิจโทรคมนาคม จึงก่อตั้งบริษัท Daini Denden (DDI) ที่ภายหลังไปควบรวมกับบริษัทอื่นกลายเป็น KDDI ในปี 2000 ซึ่งปัจจุบันถือเป็นบริษัทโทรคมนาคมอันดับ 2 ของญี่ปุ่น รองจาก NTT ซึ่งมีรากเหง้ามาจากรัฐวิสาหกิจ (องค์การโทรศัพท์ญี่ปุ่นเดิม)&lt;/p&gt;
&lt;h1&gt;จิตวิญญาณผู้ประกอบการ&lt;/h1&gt;
&lt;p&gt;ผมพบว่า Inamori มีความเป็นผู้ประกอบการ (entrepreneurship) สูงมาก ตัวเขาเองก็นิยามตัวเองว่าเป็น &lt;strong&gt;“ผู้ประกอบการญี่ปุ่น รุ่นที่สอง”&lt;/strong&gt; ถัดไปจาก Kōnosuke Matsushita (ผู้ก่อตั้ง Panasonic), Soichiro Honda (ผู้ก่อตั้ง Honda), Masaru Ibuka (ผู้ก่อตั้ง Sony) ที่ร่วมกันฟื้นฟูประเทศมาจากเถ้าถ่านของการแพ้สงครามโลก และพัฒนาให้ญี่ปุ่นกลายเป็นมหาอำนาจทางเศรษฐกิจในเวลาเพียงไม่กี่ปี&lt;/p&gt;
&lt;p&gt;เขายังประกาศชัดว่าต้องการสร้าง &lt;strong&gt;“ผู้ประกอบการรุ่นที่สาม”&lt;/strong&gt; มารับช่วงผลักดันเศรษฐกิจของญี่ปุ่นต่อไป คนที่เขาระบุชื่อในหนังสือคือ Masayoshi Son (Softbank), Hiroshi Mikitani (Rakuten), Tadashi Yanai (Uniqlo) โดยกรณีของ Son นั้นเป็นนักเรียนในสถาบันผู้ประกอบการ Seiwa Jyuku ของ Inamori ด้วย&lt;/p&gt;
&lt;p&gt;ดังนั้น ปรัชญาการบริหารที่สำคัญที่สุดของ Inamori จึงมีเรื่องเดียวที่เขาพูดซ้ำๆ ตลอดชีวิต นั่นคือคำว่า &lt;strong&gt;A Fighting Spirit&lt;/strong&gt; ตามชื่อหนังสือ (ฉบับภาษาไทยแปลว่า &lt;strong&gt;“จิตวิญญาณนักสู้ที่ลุกโชน”&lt;/strong&gt;)&lt;/p&gt;
&lt;p&gt;คำนิยาม “จิตวิญญาณนักสู้ที่ลุกโชน” ของ Inamori ซึ่งปรากฏไปทั่วในหนังสือเล่มนี้ คือคำว่า ไม่ยอมแพ้แม้เศรษฐกิจจะผันผวนแค่ไหน, จะเกิดอะไรขึ้นต้องฟันฝ่าไปให้ได้, พรุ่งนี้ต้องดีกว่าวันนี้ มะรืนต้องดีกว่าพรุ่งนี้, ความกล้าและไม่ย่อท้อต่ออุปสรรค, มีจิตใจไม่ย่อท้ออยู่เต็มเปี่ยม, เอาวะ จะไม่ยอมแพ้&lt;/p&gt;
&lt;p&gt;ทั้งหมดนี้คงไม่ต่างอะไรจาก จิตวิญญาณของผู้ประกอบการ (entrepreneur spirit) ทั่วไป แต่จิตวิญญาณนักสู้ของ Inamori นั้นแรงกล้ามากอย่างจับต้องได้ ซึ่งตัวเขาเองก็วิจารณ์นักธุรกิจญี่ปุ่นรุ่นหลังๆ ว่าขาดหายไป ต่างจากนักธุรกิจยุคแรกๆ ที่มีพลังแรงกล้าจนฟื้นฟูประเทศได้ ตามที่เขายกย่องเอาไว้ว่า&lt;/p&gt;
&lt;p&gt;“เป็นเสมือนดาวส่องประกาย ถึงแผ่นดินจะมอดไหม้เป็นเถ้าถ่าน แต่ไฟนักสู้ที่มุ่งมั่นไม่ย่อท้อกับลุกโชน”&lt;/p&gt;
&lt;h1&gt;จิตวิญญาณนักสู้ที่ลุกโชน&lt;/h1&gt;
&lt;p&gt;Inamori เล่าว่าสมัยก่อตั้งบริษัทใหม่ๆ เขาเคยไปฟังการบรรยายของ Soichiro Honda เพื่อหวังจะได้ฟังผู้บริหารคนดังของยุคนั้น เขายอมจ่ายเงินราคาแพงเพื่อไปร่วมงานที่ Honda จะมาบรรยาย แต่สิ่งที่เกิดขึ้นคือ Honda ใส่ชุดทำงานเปื้อนน้ำมันเดินเข้ามา แล้วด่าทุกคนในห้องว่า&lt;/p&gt;
&lt;p&gt;“จะมาฟังทำไม ถ้าว่างมาฟังเขาพูด ก็รีบกลับไปทำงานต่อที่บริษัทให้เร็วที่สุดเถอะ สิ่งที่ต้องทำมีเรื่องเดียว คือรีบกลับบริษัทและไปทุ่มเททำงานซะ มีไอ้บ้าที่ไหนจ่ายเงินค่าอบรมแพงขนาดนี้”&lt;/p&gt;
&lt;p&gt;Inamori ยอมรับว่ายิ่งหลงใหลใน Soichiro มากขึ้น และกลับไปตั้งเป้าหมายของ Kyocera (ที่เพิ่งก่อตั้ง) ว่า &lt;strong&gt;“จะต้องเป็นที่หนึ่งในเกียวโต ที่หนึ่งในญี่ปุ่น และที่หนึ่งในโลกให้ได้” &lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;เขาเปรียบเทียบว่ามันคือการเอาชนะตัวเอง เหมือนกับการวิ่งมาราธอน วิ่งแบบสุดแรงเกิด ตั้งเป้าเพื่อชัยชนะเสมอ ไม่ใช่การบอกว่า “ได้แค่นี้ก็ดีใจแล้ว” เขารังเกียจการพูดว่า “ทำไม่ได้หรอก” และบอกว่าเขาได้พิสูจน์ตัวเองให้เห็นแล้วว่า สามารถนำ Kyocera ที่ก่อตั้งหลังคู่แข่งรายอื่นๆ แต่สามารถเอาชนะมาได้สำเร็จ&lt;/p&gt;
&lt;p&gt;เขาเล่าความสำเร็จของ Kyocera โดยยกเหตุการณ์ที่เขาได้พบกับ Jack Welch ซีอีโอของ GE เทพแห่งการบริหารของโลกตะวันตก (ในเวลานั้น) ซึ่งเคยเป็นคู่แข่งกันมาก่อน หลังจาก Welch เจอหน้ากับ Inamori ก็บอกว่า “ผมพลาดแล้ว ตอนแข่งกันในธุรกิจเซรามิค พวกผมถูกกำจัดทิ้งอย่างกับแมลงวันเล็กๆ ตัวหนึ่งเลย”&lt;/p&gt;
&lt;p&gt;Inamori เขียนหลักการบริหารของ Kyocera ออกมา 12 ข้อ ในจำนวนนี้มีเรื่องแนวๆ ความมุ่งมั่นอยู่เยอะถึง 5 ข้อ (ตัวเน้นโดยผมเอง)&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;ทำให้วัตถุประสงค์ของงาน สิ่งที่ตั้งใจจะสื่อสาร มีความชัดเจน&lt;/li&gt;
&lt;li&gt;ตั้งเป้าหมายอย่างเป็นรูปธรรม&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;รักษาเจตจำนงอันแรงกล้า&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;มุ่งมั่นที่จะไม่แพ้ใคร&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;เพิ่มยอดขายอย่างเต็มที่ ลดรายจ่ายให้น้อยที่สุด&lt;/li&gt;
&lt;li&gt;การตั้งราคาเป็นการบริหารจัดการ&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;การบริหารจัดการขึ้นกับความตั้งใจที่แน่วแน่&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;จิตวิญญาณนักสู้ที่ลุกโชน&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;สู้งานด้วยความกล้าหาญ&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;ทำงานอย่างสร้างสรรค์อยู่เสมอ&lt;/li&gt;
&lt;li&gt;คบหากันอย่างซื่อสัตย์ด้วยน้ำใจไมตรี&lt;/li&gt;
&lt;li&gt;มีฝันและมุ่งหวังด้วยใจใสบริสุทธิ์ ทำงานเชิงรุกอย่างสดใสอยู่เสมอ&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Inamori บอกว่าการตั้งเป้าสูงเป็นภาวะของผู้นำ เพราะไม่มีพนักงานคนไหนจะตั้งเป้าสูงๆ ให้ตัวเองต้องเหนื่อยยาก ดังนั้นเป็นหน้าที่ของผู้นำองค์กรที่จะต้องคอยตั้งเป้าสูง และคอย push คนอื่นๆ ให้ทำสำเร็จให้ได้ ดังนั้น ตัวผู้นำเองต้องมีจิตวิญญาณของนักสู้ที่แรงกว่าใครๆ เพื่อยกระดับประสิทธิภาพของทุกคนในองค์กรให้สูงขึ้น (แต่เขาก็โน้ตไว้ว่า เป้าที่สูงต้องสามารถทำได้จริงด้วย ไม่อย่างนั้นจะกลายเป็นเป้าที่ดีแต่พูด และไม่มีใครสนใจ)&lt;/p&gt;
&lt;p&gt;ตัวอย่างการผลักดันจิตวิญญาณการต่อสู้ของ Inamori คือการกำหนดเป้ายอดขายของบริษัทเอาไว้ แล้วบอกว่าถ้าทำได้ จะพาพนักงานไปเที่ยวฮ่องกง แต่ถ้าทำไม่ได้ ทุกคนต้องไปปฏิบัติธรรมที่วัดนิกายเซน&lt;/p&gt;
&lt;h1&gt;Kyocera ฝ่าวิกฤต&lt;/h1&gt;
&lt;p&gt;เขายังเล่าเรื่องการพา Kyocera ฝ่าวิกฤตน้ำมันโลกปี 1973 ที่ยอดสั่งซื้อสินค้าลดเหลือเพียง 10% ของกำลังการผลิต เขาตัดสินใจอุ้มพนักงานทั้งหมดเอาไว้ แต่ให้ทำงานในไลน์เพียง 10% ส่วนที่เหลือให้ใช้เวลากับการทำความสะอาดโรงงาน บูรณะปรับปรุงสถานที่&lt;/p&gt;
&lt;p&gt;แต่เมื่อสถานการณ์น้ำมันลากยาว เขาเสนอตรึงค่าจ้างพนักงานระดับล่าง พร้อมลดเงินเดือนของพนักงานระดับสูง (ตัวเขาเองลดเยอะที่สุด 30%) เพื่อรักษาสภาพการจ้างงานเอาไว้ (เขาบอกว่า “จะปกป้องพนักงานด้วยชีวิต”)&lt;/p&gt;
&lt;p&gt;ผลคือสหภาพแรงงานของ Kyocera เห็นด้วยกับแนวทางของ Inamori และปฏิเสธแนวทางของสมาพันธ์สหภาพแรงงานญี่ปุ่นที่ต้องการให้ขึ้นค่าจ้าง ถึงขั้นสหภาพ Kyocera ยอมถอนตัวออกจากสมาพันธ์เพื่อ Inamori และภายหลังเมื่อสถานการณ์ดีขึ้น Inamori จ่ายค่าตอบแทน+โบนัสคืนให้&lt;/p&gt;
&lt;p&gt;Inamori บอกว่า Kyocera ฝ่าวิกฤตเศรษฐกิจมาหลายรอบ ในทุกรอบเขามองว่านี่คือโอกาสที่จะทำ 4 เรื่อง&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;สร้างสายสัมพันธ์กับพนักงานให้แน่นแฟ้นขึ้น&lt;/strong&gt; – เศรษฐกิจตกต่ำคือกระดาษลิตมัสทดสอบความสัมพันธ์นายจ้างและลูกจ้าง&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;ลดค่าใช้จ่ายในการดำเนินกิจการ ที่ไม่ใช่ค่าวัตถุดิบทางตรง และค่าแรงงานทางตรงทั้งหมด&lt;/strong&gt; – เมื่อเศรษฐกิจฟื้นตัวในจังหวะที่งานเพิ่ม จะสร้างศักยภาพของกิจการให้มีกำไรสูงในรวดเดียวได้&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;เป็นพนักงานขายทุกคน&lt;/strong&gt; – ให้พนักงานในโรงงานที่ไม่เคยเจอลูกค้าออกไปขายของ เพื่อให้เข้าใจลูกค้า และเข้าใจจุดยืนของฝ่ายขาย รับรู้ถึงความยากลำบากที่ต้องก้มหัวให้คนอื่นซื้อของ&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;มุ่งมั่นพัฒนาผลิตภัณฑ์และสินค้าใหม่&lt;/strong&gt; – เป็นโอกาสเงี่ยหูฟังสิ่งที่ลูกค้าพูดอย่างจริงจัง ตรวจสอบสิ่งที่ตลาดต้องการเพื่อนำไปพัฒนาเป็นผลิตภัณฑ์ใหม่ และเป็นการเตรียมตัวก้าวกระโดดครั้งถัดไป&lt;/li&gt;
&lt;/ol&gt;
&lt;h1&gt;เพื่อโลก เพื่อมนุษยชาติ&lt;/h1&gt;
&lt;p&gt;Inamori ยังมีปรัชญาข้อที่สอง (รองจากจิตวิญญาณนักสู้ที่ลุกโชน) คือ &lt;strong&gt;“เพื่อโลก เพื่อมนุษยชาติ”&lt;/strong&gt; เป็นการคิดในระดับสูงขึ้นที่ว่า ไม่ได้ทำเพื่อผลกำไรอย่างเดียว แต่ทำงานเพื่อให้โลกและมนุษยชาติดีขึ้นด้วย (เทียบได้กับหลัก CSR/ESG ในยุคปัจจุบัน)&lt;/p&gt;
&lt;p&gt;เขาบอกว่า การอาศัย “จิตวิญญาณนักสู้ที่ลุกโชน” บนรากฐานจิตใจที่สูงส่ง “เพื่อโลก เพื่อมนุษยชาติ” จะนำไปสู่ความสำเร็จและการดำรงอยู่ของกิจการ&lt;/p&gt;
&lt;p&gt;เขายกตัวอย่างการที่ Kyocera หันไปสนใจธุรกิจ solar cell มายาวนานตั้งแต่วิกฤตน้ำมันปี 1973 ภายใต้บริษัทร่วมทุนชื่อ Japan Solar Energy แต่ช่วงแรกกิจการไม่ดี ผู้ถือหุ้นรายอื่นถอนตัว Kyocera จึงรับช่วงธุรกิจนี้ต่อมาทั้งหมด อดทนฟันฝ่าอุปสรรคมาจนถึงช่วงเวลาที่ตลาดเริ่มสนใจ solar cell จริงจัง และทำให้ Kyocera กลายเป็นผู้นำของธุรกิจนี้&lt;/p&gt;
&lt;p&gt;Inamori ยังวิจารณ์ “ทุนนิยมที่ไม่รู้จักพอ” ว่าเป็นจุดกำเนิดของหายนะ (ยกตัวอย่าง “ความโลภแบบอเมริกัน” กรณีปัญหาปี 2007-2008) แต่เขาเสนอทางแก้ว่าต้องยกระดับที่พื้นฐานจิตใจของคน โดยอ้างอิงหลักความพอเพียงของเล่าจื๊อ พัฒนามาเป็นหลักการของเขาเองที่ตั้งคำถามกับตัวเองเสมอว่า &lt;strong&gt;“อะไรคือสิ่งที่ถูกต้องในฐานะมนุษย์” &lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;เขาเล่าว่าใช้หลักการนี้กับการซื้อกิจการบริษัทอเมริกันชื่อ AVX ด้วยเงื่อนไขที่ Kyocera เสียเปรียบ (จากข้อตกลงที่คุยกันไว้ตอนแรก) เพื่อซื้อใจผู้บริหารและพนักงานของ AVX จนภายหลังกลายเป็นการซื้อกิจการที่ประสบความสำเร็จ โดย Inamori บอกว่าตอนที่ได้รับการต่อรองข้อเสนอรอบใหม่ เขาคิดจะปฏิเสธ แต่เมื่อตั้งคำถามว่า “อะไรคือสิ่งที่ถูกต้องในฐานะมนุษย์” เขาจึงยอมตกลง&lt;/p&gt;
&lt;div&gt;&lt;img loading="lazy" src="https://feeds.llun.dev/media/2fc96b3a71ffc2dc3d50bf30a04c758baa0409e1457ca34855c1952a06c05660.jpg" alt="" width="620" height="420" srcset="https://feeds.llun.dev/media/2fc96b3a71ffc2dc3d50bf30a04c758baa0409e1457ca34855c1952a06c05660.jpg 620w, https://feeds.llun.dev/media/b68f54ea79a6897a4862845a83fbaedbba4ccfb56c05fe8914567239394712fa.jpg 300w" /&gt;&lt;p&gt;ภาพการบรรยายของ Inamori เรื่อง JAL ในปี 2012&lt;/p&gt;&lt;/div&gt;
&lt;h1&gt;ฟื้นฟู Japan Airlines&lt;/h1&gt;
&lt;p&gt;ในหนังสือมีเนื้อหาเรื่องการฟื้นฟู Japan Airlines ไม่มากนัก แต่เมื่ออ่านประวัติของ Inamori มาตลอดทั้งเล่ม ก็เลยเข้าใจว่าเขาสามารถแก้ปัญหาของ Japan Airlines ได้อย่างไร&lt;/p&gt;
&lt;p&gt;Inamori เล่าว่าเมื่อได้รับการทาบทามให้เข้ามาช่วยพลิกฟื้นกิจการ Japan Airlines เขาตัดสินใจตอบรับทันที แม้อายุมากแล้ว และคนรอบตัวไม่มีใครเห็นด้วยเลยกับการเข้าไปทำงาน ด้วยเหตุผล 3 ข้อ&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;JAL เป็นสัญลักษณ์ของเศรษฐกิจญี่ปุ่น ถ้าฟื้น JAL ได้สำเร็จ เป็นการบอกประชาชนว่าสามารถฟื้นเศรษฐกิจญี่ปุ่นกลับมาได้&lt;/li&gt;
&lt;li&gt;เป็นการรักษาการจ้างงานพนักงานของ JAL&lt;/li&gt;
&lt;li&gt;รักษาการแข่งขันของอุตสาหกรรมการบินญี่ปุ่นเอาไว้ ไม่ให้เหลือแต่ ANA เจ้าเดียว&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;สิ่งแรกที่ Inamori พูดกับพนักงานในฐานะประธานกรรมการ คือ “ขอเพียงมีจิตใจมุ่งมั่น ไม่ย่อท้อ แล้วจงทุ่มเท ความปรารถนา เอาใจใส่และเอาจริงเอาจัง”&lt;/p&gt;
&lt;p&gt;แต่หลังจากนั้นไม่นาน เขาก็พบเจอปัญหาทันทีว่าพนักงานของ JAL ยุคนั้นขาดจิตวิญญาณ ขาดความเอาใจใส่อย่างสิ้นเชิง เมื่อเขาถามว่า “ผลประกอบการเป็นอย่างไร” พนักงานกลับตอบเป็นตัวเลขออกมาไม่ได้ พอไปค้นข้อมูลมาให้ก็เป็นข้อมูลเก่า หาความรับผิดชอบของรายได้แต่ละส่วนไม่ได้&lt;/p&gt;
&lt;p&gt;เขาเจอปัญหาพนักงานแต่ละฝ่าย ต่างคนต่างตัดสินใจกันตามใจชอบ แม้ล้มละลายแล้วแต่ยังสัมผัสไม่ได้ถึงบรรยากาศความตึงเครียด ที่ต้องสามัคคีร่วมใจกันสู้เลย&lt;/p&gt;
&lt;p&gt;ดังนั้นสิ่งแรกที่เขาต้องแก้ไขคือ ปฏิรูปจิตสำนึกของผู้บริหารและพนักงานอย่างจริงจัง เลยเรียกผู้บริหารมาให้ยอมรับความจริงว่าบริษัทล้มละลายแล้ว &lt;strong&gt;“ต้องปีนขึ้นมาใหม่ด้วยกำลังของตัวเอง ไม่มีใครช่วยเหลือเหมือนที่ผ่านมาอีก” &lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;เขาจับผู้บริหาร 50 คนมาอบรมปรัชญาแบบ Inamori (ทั้งหมดที่เขียนไปข้างต้น) เป็นเวลา 1 เดือน โดย Inamori เข้าร่วมเองทุกครั้งเท่าที่ทำได้ ร่วมดื่มและถกประเด็นเพิ่มเติม พาไปออกค่าย ถกเถียงกันจนค่ำมืด จนผู้บริหารเริ่มเปลี่ยนความคิด&lt;/p&gt;
&lt;p&gt;ส่วนพนักงานทั่วไปพอได้ยินว่ามีการอบรมแบบนี้ก็เลยอยากเข้าร่วมบ้าง และใช้วิธีอบรมผ่านวิดีโอบรรยายของ Inamori ที่มีคนเข้าร่วม 3 พันคน&lt;/p&gt;
&lt;p&gt;หลังจากนั้น จึงเกิดการประชุมรายงานผลประกอบการ โดยผู้นำฝ่าย 100 คนมารายงานผลประกอบการส่วนของตัวเองต่อ Inamori พร้อมถกเถียงเหตุผล และ Inamori จะช่วยชี้แนะให้&lt;/p&gt;
&lt;p&gt;Inamori ได้เขียนปรัชญาการทำงานของ JAL ขึ้นมาใหม่ โดยอิงจากปรัชญาของ Kyocera ออกมาเป็น&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;JAL จะทำให้พนักงานทุกคนมีความสุขทั้งทางวัตถุและจิตใจ&lt;/li&gt;
&lt;li&gt;นำเสนอบริการที่ดีที่สุดต่อลูกค้า&lt;/li&gt;
&lt;li&gt;อุทิศตนเพื่อความก้าวหน้าของสังคม และเพิ่มคุณค่าองค์กร&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;เขาอธิบายว่า JAL เป็นธุรกิจบริการ พนักงานต้องมีความสุขก่อนถึงจะสามารถส่งมอบบริการที่ดีให้ลูกค้าได้ เขาอยากให้พนักงานมีความรู้สึกว่า “โชคดีที่ได้ทำงานที่ JAL” ก่อน แล้วค่อยพูดถึงบริการที่ปลอดภัย น่าพึงพอใจ สะดวกสบาย ในขั้นถัดไป&lt;/p&gt;
&lt;p&gt;Inamori บอกว่าเมื่อพนักงานเริ่มเข้าใจว่าการฟื้นฟู JAL เป็นหน้าที่ของทุกคน และเห็นประธานที่อายุ 78 มาทำงานหนัก แถมทำให้ฟรี ไม่รับค่าตอบแทน จึงลุกขึ้นมาทำงานของตัวเองอย่างเต็มที่บ้าง&lt;/p&gt;
&lt;p&gt;เขาบอกว่าคนภายนอกมักคิดว่าอุตสาหกรรมการบินเป็นอุตสาหกรรมกระบวนการผลิตขนาดใหญ่ เพราะมีเครื่องบิน เครื่องมือชั้นสูงจำนวนมาก แต่จริงๆ มันคืออุตสาหกรรมบริการขั้นสูงสุด พนักงานต้องรู้สึกขอบคุณลูกค้าอย่างจริงใจ ถึงจะให้บริการลูกค้าได้ดีเยี่ยมได้ตลอดเวลา ตั้งแต่ตอนเช็คอินที่สนามบินไปจนถึงปลายทาง&lt;/p&gt;
&lt;p&gt;เขาบอกว่าสมัยก่อนตัวเองเกลียด JAL มาก เพราะมานั่งทีไรก็รู้สึกว่าพนักงานหยิ่ง วางก้าม ปฏิบัติเหมือนลูกค้าไร้ค่า เขาจึงบอกเรื่องนี้กับพนักงานไปตรงๆ และค่อยๆ เปลี่ยนวัฒนธรรมของ JAL ได้สำเร็จ เขาบอกว่าท่าทีเล็กๆ น้อยๆ ของพนักงานมีผลต่อความรู้สึกของลูกค้าเสมอ และต้องสร้างความคิดว่า “ไว้มานั่ง JAL อีกดีกว่า” ในใจลูกค้าให้ได้&lt;/p&gt;
&lt;p&gt;ผลงานของ Inamori ทำให้ JAL กลับเข้าตลาดหลักทรัพย์สำเร็จภายใน 3 ปี มีอัตรากำไรสูงถึง 17% และเมื่อทุกอย่างบรรลุ Inamori จึงตัดสินใจลาออกจากทุกตำแหน่ง ขอรับไว้แค่ตำแหน่งประธานกิตติมศักดิ์ แบบไม่รับค่าตอบแทน และใช้เวลาว่างหลังจบงานที่ JAL เขียนหนังสือเล่มนี้ออกมา&lt;/p&gt;
&lt;div&gt;&lt;img loading="lazy" src="https://feeds.llun.dev/media/9548832bac44a5d5f1c60a76bee1bebcaf7bed4f80f8efb8353b04df019a33ad.jpg" alt="" width="432" height="300" srcset="https://feeds.llun.dev/media/9548832bac44a5d5f1c60a76bee1bebcaf7bed4f80f8efb8353b04df019a33ad.jpg 432w, https://feeds.llun.dev/media/46d2e2c79d05bd113f107fd03c21a3419caac213dd250497309feeeeb6bc5697.jpg 300w" /&gt;&lt;p&gt;ภาพตอน Inamori เคาะระฆัง พา JAL กลับไปเข้าตลาดหลักทรัพย์&lt;/p&gt;&lt;/div&gt;
&lt;h1&gt;กอบกู้เศรษฐกิจญี่ปุ่น&lt;/h1&gt;
&lt;p&gt;ความฝันสุดท้ายที่ Inamori อาจยังไม่ทันได้เห็นก่อนตาย คือ การกอบกู้เศรษฐกิจญี่ปุ่นให้กลับมารุ่งเรืองอีกครั้ง ดังที่เขาเขียนไว้ตั้งแต่ในบทแรกและทิ้งทวนไว้ในบทสุดท้ายของหนังสือ&lt;/p&gt;
&lt;p&gt;อย่างที่เขียนไปว่า Inamori มีความเป็นนักปรัชญาสูงมาก เขาได้เล่าประวัติศาสตร์เศรษฐกิจญี่ปุ่น ภายใต้กรอบการวิเคราะห์ของตัวเอง ว่าจะมีการเปลี่ยนใหญ่ทุก 40 ปี นับตั้งแต่การปฏิรูปเมจิเป็นต้นมา&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt; 1865 – ปฏิรูปเมจิ มุ่งสู่แนวทาง “ประเทศมั่งคั่ง กองทัพแข็งแกร่ง”&lt;/li&gt;
&lt;li&gt;1905 – ลงนามสนธิสัญญาพอร์ตมัธ หลังชนะสงครามญี่ปุ่น-รัสเซีย เข้าสู่ยุค “กองทัพแข็งแกร่ง”&lt;/li&gt;
&lt;li&gt;1945 – ยุคกองทัพแข็งแกร่ง นำไปสู่ความอหังการทางการทหาร จนแพ้สงครามโลก พลิกผันเข้าสู่ยุค “ประเทศมั่งคั่ง” เน้นฟื้นฟูประเทศทางเศรษฐกิจอย่างเดียว จนรุ่งเรือง&lt;/li&gt;
&lt;li&gt;1985 – เศรษฐกิจญี่ปุ่นรุ่งเรืองมาก จนโดนสหรัฐอเมริกาบังคับเซ็น Plaza Accord สิ้นสุดยุคทองทางเศรษฐกิจ ฟองสบู่แตก&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Inamori หวังว่ายุคเศรษฐกิจญี่ปุ่นซบเซา จะยาวนาน 40 ปี (จบประมาณปี 2025) และญี่ปุ่นจะกลับเข้าสู่ยุคฟื้นฟูเศรษฐกิจอีกครั้ง อย่างไรก็ตาม เขาได้เตือนว่าญี่ปุ่นประสบปัญหาสะสมหลายอย่าง ทั้งเรื่องประชากรสูงวัย และเรื่องหนี้สาธารณะสูงมาก&lt;/p&gt;
&lt;p&gt;สิ่งสำคัญที่ Inamori เตือนไว้คือ คนญี่ปุ่นยังรู้สึกอย่างเบาบางมากถึงวิกฤตเหล่านี้ เหมือนกับที่พนักงาน JAL รู้สึกแม้บริษัทล้มละลายไปแล้ว ทำอย่างไรคนญี่ปุ่นจะเกิดสำนึกร่วมกันได้ว่าประเทศชาติกำลังจะล่มสลาย และลุกขึ้นมาร่วมกันแก้ปัญหา&lt;/p&gt;
&lt;p&gt;เขาบอกว่าได้พิสูจน์ให้เห็นแล้วจากการพลิกฟื้น JAL ว่า &lt;strong&gt;“จิตใจมนุษย์ทำสิ่งที่ยิ่งใหญ่ให้สำเร็จลุล่วงไปได้”&lt;/strong&gt; และโลกสามารถเปลี่ยนได้หากเราเปลี่ยนความคิดและพฤติกรรมของทุกคน&lt;/p&gt;
&lt;p&gt;เขาบอกว่าเขามาที่ JAL ด้วยมือเปล่า ไม่มีประสบการณ์ใดๆ กับอุตสาหกรรมการบินเลย เขามองว่า JAL มีพลังแฝงที่ยอดเยี่ยมอยู่ เพียงแต่ขาดจิตสำนึกและแนวทาง สิ่งที่เขาทำที่ JAL มีเพียงแค่วางแผนและปฏิรูปจิตสำนึกเพื่อแก้ไขทิศทางให้ถูกต้องเท่านั้น&lt;/p&gt;
&lt;div&gt;&lt;img loading="lazy" src="https://feeds.llun.dev/media/a13470e6fe35bca14d46bd48f2dce98491ae294ef567339b29fcf2f81b82875c.jpg" alt="" width="620" height="414" srcset="https://feeds.llun.dev/media/a13470e6fe35bca14d46bd48f2dce98491ae294ef567339b29fcf2f81b82875c.jpg 620w, https://feeds.llun.dev/media/6768b80e8fd172834313adb547417299ef937e2faf785216419f232c5b8f51aa.jpg 300w" /&gt;&lt;p&gt;ภาพการประชุม Seiwa jyuku ยุคแรกๆ&lt;/p&gt;&lt;/div&gt;
&lt;p&gt;น่าเสียดายว่า Inamori เสียชีวิตไปก่อนความฝันของเขาจะบรรลุ แต่ระหว่างนั้นเขาได้เปิดสถาบันผู้นำชื่อว่า &lt;a href="https://global.kyocera.com/inamori/about/contribution/seiwajyuku/"&gt;Seiwa Jyuku&lt;/a&gt; มาตั้งแต่ปี 1983 หลังจากมีผู้ประกอบการรุ่นใหม่ 25 คน มาขอให้เขาสอนวิชาการเป็นผู้จัดการที่ดี จึงพัฒนากลายมาเป็นโรงเรียนในที่สุด&lt;/p&gt;
&lt;p&gt;ข้อมูลจากหน้าเว็บของ Seiwa Jyuku บอกว่ามีทั้งหมด 104 สาขา มีสาขาในญี่ปุ่น 56 แห่ง นอกญี่ปุ่น 48 แห่ง มีนักเรียนสะสมทั้งหมด 26,238 คน มีงานที่ตัว Inamori มาสอนเองทั้งหมด 449 ครั้ง&lt;/p&gt;
&lt;p&gt;อย่างไรก็ตาม &lt;a href="https://global.kyocera.com/inamori/about/contribution/seiwajyuku/inamori.html"&gt;Inamori ประกาศปิด Seiwa Jyuku ตอนสิ้นปี 2019&lt;/a&gt; โดยบอกว่าภารกิจของเขาจบแล้ว แต่ภารกิจของการบริหารที่ดีจะยังอยู่กับนักเรียนทุกคนต่อไปแทนตัวเขา&lt;/p&gt;
&lt;p&gt;หมายเหตุ: สำหรับผู้ที่สนใจประวัติและแนวคิดของ Kazuo Inamori &lt;a href="https://global.kyocera.com/inamori/"&gt;เว็บไซต์ของเขาที่ Kyocera ทำให้&lt;/a&gt; รวบรวมข้อมูล เลคเชอร์ บทความของเขาไว้ค่อนข้างละเอียดมาก&lt;/p&gt;</content>
    <source>
      <title>markpeak.net</title>
      <link rel="self" href="https://markpeak.net/feed/"/>
      <link rel="alternate" href="https://markpeak.net"/>
    </source>
  </entry>
  <entry>
    <id>urn:uuid:68bab9b4-8409-5b13-9f74-d0bd5a25358a</id>
    <title>How to Deal with China</title>
    <updated>2026-08-23T12:24:02.000Z</updated>
    <author>
      <name>Isriya Paireepairit</name>
    </author>
    <published>2026-08-23T12:24:02.000Z</published>
    <link rel="alternate" href="https://markpeak.net/how-to-deal-with-china/"/>
    <category term="Thai"/>
    <content type="html">&lt;p&gt;เราจะรับมือจีนอย่างไร&lt;/p&gt;
&lt;p&gt;ช่วงก่อนเลือกตั้งปี 69 ผมมีโอกาสคุยกับผู้เชี่ยวชาญด้านจีนรายหนึ่ง ซึ่งบอกกับผมว่า&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;“จริงๆ แล้วนโยบายต่างประเทศของไทยมีแค่ข้อเดียวคือ How to Deal with China”&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;ผมฟังแล้วก็ได้แต่ขบคิดและสงสัยเก็บไว้ในใจ&lt;/p&gt;
&lt;p&gt;จนได้มาเป็น ส.ส. ได้มาทำงานพบปะผู้คนในวงกว้าง เจอคนในหลายภาคส่วนทั้งเกษตร อุตสาหกรรม ค้าปลีก บริการ เจอตั้งแต่ชาวสวนไปจนถึงซีอีโอบริษัทใหญ่ในตลาดหลักทรัพย์ ก็เริ่มได้ข้อสรุปกับตัวเองว่า&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;“ไม่ว่าคุณจะเป็นใครในประเทศนี้ ไม่ว่าอยู่ในอุตสาหกรรมไหน ไม่ว่าจะเป็นบริษัทใหญ่หรือคนตัวเล็ก คุณจะต้องเจอปัญหาอะไรบางอย่างที่เกี่ยวกับจีนแน่ๆ”&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;ปัญหาที่ว่านั้นหลากหลาย ตั้งแต่ธุรกิจเดิมที่ทำมาตั้งแต่รุ่นปู่ย่าอยู่ไม่ได้เพราะเจอสินค้าจีนข้ามพรมแดนมาตีตลาด รถ EV จีนแทบไม่ใช้ชิ้นส่วนในไทย สินค้าเกษตรเจอล้งจีนกดราคา นักท่องเที่ยวจีน ทัวร์ศูนย์เหรียญ บริษัทก่อสร้างจีน ขยะอุตสาหกรรม ไปจนถึงเรื่องใกล้ตัวอย่างคนจีนมาเช่าบ้านอยู่ใกล้ๆ ให้ลุ้นตลอดเวลาว่านี่เป็นแก๊งจีนเทามาอยู่ข้างบ้านหรือไม่&lt;/p&gt;
&lt;p&gt;เบื้องหลังนโยบายแข็งกร้าวต่อจีนของ Donald Trump มาจาก &lt;a href="https://markpeak.net/death-by-china/"&gt;หนังสือชื่อ Death by China ของ Peter Navarro&lt;/a&gt; ซึ่งภายหลังเขาเข้าไปรับตำแหน่งในรัฐบาล Trump ด้วย ผมคิดว่าชื่อหนังสือ Death by China นั้นสะท้อนสิ่งที่อยู่ในใจ Navarro และคนอเมริกันเป็นอย่างดี&lt;/p&gt;
&lt;p&gt;แต่บริบทของสหรัฐอเมริกานั้นแตกต่างไปจากไทยพอสมควร&lt;/p&gt;
&lt;p&gt;กรณีของอเมริกา-จีนนั้นเป็นการแข่งขันกันของสองขั้วมหาอำนาจที่มาประชันกัน (ถ้าเราเชื่อในทฤษฎี Thucydides Trap ว่าจะมีมหาอำนาจใหม่มาท้าทายมหาอำนาจเดิม)&lt;/p&gt;
&lt;p&gt;แต่กรณีของไทยนั้น ผมคิดว่าต่างไป 2 ประเด็นใหญ่ๆ คือ&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;พลังอำนาจของไทยกับจีน เทียบกันไม่ได้เลย จีนเป็นมหาอำนาจโลกอย่างไม่ต้องสงสัย ในขณะที่ไทยเป็นประเทศขนาดกลาง (middle power)&lt;/li&gt;
&lt;li&gt;ระบบรัฐไทยอ่อนแอลงมากในรอบ 10 กว่าปีให้หลัง (เราอาจนับช่วงรัฐประหาร 2557 เป็นต้นมา) ภาวะอ่อนแอของรัฐไทย เริ่มน่าเป็นห่วงว่าจะเข้าขั้น failed state ไหม แต่ที่แน่ๆ คือมันอ่อนแอจน “จีนเทาแฮ็กระบบรัฐไทย” ได้ไม่ยาก ผ่านการจ่ายสินบน คอร์รัปชันให้เจ้าหน้าที่รัฐไทย ดังที่เราเห็นจากข่าวต่างๆ เช่น โรงงานจีนแอบทิ้งกากของเสีย ไปจนถึงคดีพ่อทิพย์ โกงสัญชาติ ทั้งหมดนี้แสดงให้เห็นว่าปัญหาฝั่งหนึ่งก็มาจากเจ้าหน้าที่รัฐไทยเองนี่ล่ะ&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;ในรอบ 2-3 เดือนที่ผ่านมา ผมสังเกตว่าอารมณ์ความรู้สึกของคนไทยต่อคนจีนเปลี่ยนไปมาก จากเดิมเราอาจมองแยกกันว่าเป็น “จีนดี/จีนเทา” แต่ตอนนี้เหมือนมันกลายเป็นคนไทยจำนวนมาก แสลงใจกับคำว่า “จีน” ไปทั้งหมดแล้ว&lt;/p&gt;
&lt;p&gt;เราเริ่มเห็นข้อเสนอให้ “ปิดประเทศ” ซึ่งผมว่าเป็นสัญญาณที่น่ากลัวของการเหยียดเชื้อชาติที่กำลังก่อตัวขึ้นมา (และในทางปฏิบัติ เราไม่มีทางปิดประเทศ แยกตัวทางเศรษฐกิจออกจากโลกได้อยู่แล้ว)&lt;/p&gt;
&lt;p&gt;ดังนั้นเราต้องกลับไปที่คำถามในบรรทัดแรกสุดว่า แล้วเราจะอยู่กับจีนอย่างไรดี&lt;/p&gt;
&lt;p&gt;“How to Deal with China”&lt;/p&gt;
&lt;p&gt;ในมุมของผมแล้ว คิดว่าต้องทำทั้ง 2 อย่างควบคู่กันไป&lt;/p&gt;
&lt;p&gt;อย่างแรกคือ รัฐไทยเองต้องเข้มแข็ง ข้าราชการตั้งใจ ไม่ทุจริต คอร์รัปชัน ไม่เป็นจุดอ่อนให้จีนเทาเข้ามาแทรกซึมได้ การที่ภาครัฐไทยเข้มแข็งยังจะช่วยแก้ปัญหาอื่นๆ ของประเทศได้ด้วย ไม่ว่าจะเป็นปัญหามาเฟียชาติอื่นๆ หรือปัญหาด้านอาชญากรรมที่เกิดจากคนไทยเอง เรื่องนี้พรรคประชาชนเคยเสนอไปแล้วในนโยบาย “ปฏิรูปรัฐ” ตั้งแต่ตอนเลือกตั้ง&lt;/p&gt;
&lt;p&gt;อย่างที่สอง เราสามารถใช้วิถีทางการทูตเชิงรุกเข้าช่วยได้อีกทาง แน่นอนว่าประเทศจีนกับประเทศไทยยังมีความสัมพันธ์อันดีกันในระดับรัฐต่อรัฐ แต่เมื่อคนจีนออกมาสร้างปัญหานอกประเทศ เราก็จำเป็นต้องได้รับความช่วยเหลือจากฝั่งรัฐบาลจีนด้วย (ตัวอย่างที่ชัดเจนคือ รัฐบาลจีนเคยส่ง หลิวจงอี้ มาแก้ปัญหาเรื่องคนจีนถูกลักพาตัวไปยังศูนย์สแกมเมอร์ข้ามพรมแดน)&lt;/p&gt;
&lt;p&gt;เราคิดว่าโมเดลนี้สามารถใช้งานได้ผล และช่วยให้สายสัมพันธ์ระหว่างทั้งสองประเทศดีขึ้นในระยะยาว พรรคประชาชนก็เคยใช้วิธีการเข้าไปหารือกับสถานเอกอัครราชทูตจีนมาก่อนแล้ว ในเรื่องปัญหาสารพิษแม่น้ำกก ซึ่งเป็นปัญหาข้ามพรมแดน&lt;/p&gt;
&lt;p&gt;ผมคิดว่าการเข้าไปหารือปัญหากับรัฐบาลจีนอย่างสร้างสรรค์ ช่วยกันจับมือทำงานแก้ปัญหา บวกกับทำรัฐไทยเองให้เข้มแข็ง ปิดจุดอ่อนไม่ให้จีนเทาเข้ามาแทรกแซง น่าจะเป็นวิถีทางออกเดียวในการแก้ปัญหา How to Deal with China ที่กำลังรุนแรงขึ้นเรื่อยๆ ในสังคมไทย&lt;/p&gt;</content>
    <source>
      <title>markpeak.net</title>
      <link rel="self" href="https://markpeak.net/feed/"/>
      <link rel="alternate" href="https://markpeak.net"/>
    </source>
  </entry>
  <entry>
    <id>urn:uuid:263da5a1-d706-59e9-88f5-cc6690645ba8</id>
    <title>HELLDIVERS™ 2</title>
    <updated>2026-08-18T13:27:00.000Z</updated>
    <author>
      <name>neizod's speculation</name>
    </author>
    <published>2026-08-18T13:27:00.000Z</published>
    <link rel="alternate" href="https://neizod.dev/2026/08/18/helldivers2.html"/>
    <category term="Thai"/>
    <content type="html">&lt;p&gt;be me, love playing games w/ joycon&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;&lt;img src="https://feeds.llun.dev/media/6f9abb43be39c0b3400cc2f16199a463b20df86dfca362ece777d1d8f8ff5d76.jpg" alt="" /&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;but i’m fine if others prefer mouse+kb&lt;/p&gt;

&lt;p&gt;my friend invites me to play w/ him&lt;/p&gt;

&lt;p&gt;friend constantly gets disconnected (okay, that’s his “old pc” vs nprotect issue)&lt;/p&gt;

&lt;p&gt;we land in illuminate territory, doing the “take down overship” mission&lt;/p&gt;

&lt;p&gt;codes retrieved. next: going to the children’s playground&lt;/p&gt;

&lt;p&gt;friend takes control of the terminal, while i’m unlocking the hatch&lt;/p&gt;

&lt;p&gt;wow cool, there’s a gigantic cannon hidden under seesaw/slider/spinner&lt;/p&gt;

&lt;p&gt;see 2 valves on the back of the cannon, “walk” there, die&lt;/p&gt;

&lt;p&gt;apparently, i’m “out-of-bounds” because the cannon isn’t “fully” erected&lt;/p&gt;

&lt;p&gt;friend finally raises the cannon up from the ground&lt;/p&gt;

&lt;p&gt;my belongings stayed underneath the ground, no longer retrievable&lt;/p&gt;

&lt;p&gt;sadge&lt;/p&gt;

&lt;p&gt;but okay, it looks safe now to engage w/ the valves, i guess&lt;/p&gt;

&lt;p&gt;i “interact” w/ the up-down valve&lt;/p&gt;

&lt;p&gt;there’s no prompt or whatsoever hinting which button to press in order to control the cannon&lt;/p&gt;

&lt;p&gt;can’t even make it budge despite trying every button/stick on my joycon&lt;/p&gt;

&lt;p&gt;friend takes the left-right valve, successfully moves it using his keyboard&lt;/p&gt;

&lt;p&gt;friend disconnects before successfully aiming the cannon to the alien ship&lt;/p&gt;

&lt;p&gt;the “interact” prompt on the left-right valve is gone&lt;/p&gt;

&lt;p&gt;now no one can take control of it, soft-locking the game (despite friend logging back into the mission)&lt;/p&gt;

&lt;p&gt;sadge&lt;/p&gt;

&lt;p&gt;restart the mission&lt;/p&gt;

&lt;p&gt;okay, this time i’m taking control of the terminal instead&lt;/p&gt;

&lt;p&gt;friend falls to his death by rushing to the valves before the cannon is fully erected&lt;/p&gt;

&lt;p&gt;friend gives up, lets me control both valves&lt;/p&gt;

&lt;p&gt;i need to swap to keyboard in order to move the cannon left-right, up-down&lt;/p&gt;

&lt;p&gt;(found out later that, in order to move the cannon UP, i need to press RIGHT on my D-pad…..)&lt;/p&gt;

&lt;p&gt;anyway, how to fire this f_cking thing?&lt;/p&gt;

&lt;p&gt;we try interacting w/ this-and-that around the valves, nothing happens&lt;/p&gt;

&lt;p&gt;turns out one person need to stay at the terminal and “fire” from there&lt;/p&gt;

&lt;p&gt;….&lt;/p&gt;

&lt;p&gt;tell me there’s no playtesters on the team w/o telling me there’s no playtesters on the team&lt;/p&gt;</content>
    <source>
      <title>neizod's speculation</title>
      <link rel="self" href="https://neizod.github.io/feed.xml"/>
      <link rel="alternate" href="https://neizod.dev/"/>
    </source>
  </entry>
  <entry>
    <id>urn:uuid:68d940e5-17f8-59e7-8c1d-7e592c030e4a</id>
    <title>Lowest Temperature at Dawn</title>
    <updated>2026-08-09T00:18:36.000Z</updated>
    <author>
      <name>Isriya Paireepairit</name>
    </author>
    <published>2026-08-09T00:18:36.000Z</published>
    <link rel="alternate" href="https://markpeak.net/lowest-temperature-at-dawn/"/>
    <category term="Thai"/>
    <content type="html">&lt;p&gt;เคยสงสัยเวลาอ่านนิยายย้อนยุคต่างๆ ว่าทำไมเขาต้องไปเลือกตีเมืองกันตอนก่อนรุ่งสาง “ในช่วงที่อุณหภูมิลดต่ำที่สุด” เพราะในความรู้สึก กราฟอุณหภูมิตอนกลางคืนมันน่าจะค่อยๆ ลดลงตอนหัวค่ำ ต่ำสุดแถวๆ เที่ยงคืน แล้วค่อยๆ เพิ่มขึ้นตอนเช้า&lt;/p&gt;
&lt;p&gt;แต่ในความเป็นจริงทางวิทยาศาสตร์มันไม่ใช่แบบนั้น เพราะเมื่อดวงอาทิตย์ตก โลกจะค่อยๆ คายพลังงานความร้อนที่มาจากดวงอาทิตย์ (solar radiation) สู่อวกาศไปเรื่อยๆ ในรูปแบบของรังสีอินฟราเรด ตามระยะเวลาที่ผ่านไป จนกว่าดวงอาทิตย์จะขึ้นใหม่ในตอนเช้า อุณหภูมิจึงจะค่อยๆ กลับมาเพิ่มขึ้นในตอนเช้า (เส้นสีแดงในกราฟ)&lt;/p&gt;
&lt;p&gt;&lt;img loading="lazy" src="https://feeds.llun.dev/media/f4fef33aef78b1a26abda03a3260f1a774437b25e228216b3c70eb2d8e00cf5a.jpg" alt="" width="600" height="410" srcset="https://feeds.llun.dev/media/f4fef33aef78b1a26abda03a3260f1a774437b25e228216b3c70eb2d8e00cf5a.jpg 600w, https://feeds.llun.dev/media/a5fd68b518563d045120e9cc7ecb216b70668589e652a02bc841294b1f488a98.jpg 300w" /&gt;&lt;/p&gt;
&lt;p&gt;กราฟนี้ยังอธิบายว่าทำไมตอนบ่ายๆ (ราวบ่ายสาม) เป็นจุดที่ร้อนที่สุดของวัน เพราะเป็นช่วงที่สะสมความร้อนมาทั้งวันแล้ว แต่ดวงอาทิตย์กำลังเริ่มลดมุมลง ทำให้ solar radiation ขาเข้าเริ่มลดลงนั่นเอง&lt;/p&gt;
&lt;p&gt;สรุปคือ จุดร้อนที่สุดของวัน ราว 15.00 น. ส่วนจุดที่เย็นที่สุดของวันคือก่อน 6.00 น.&lt;/p&gt;
&lt;p&gt;ต้นฉบับภาพ &lt;a href="https://www.quora.com/Meteorology-Why-is-it-coldest-just-before-dawn"&gt;Quora&lt;/a&gt;, &lt;a href="https://www.weareiowa.com/article/weather/weather-lab/iowa-weather-explained-sunrise-temperatures-solar-radiation-radiational-cooling/524-4a250308-4fac-465e-ba0c-99db672c421f"&gt;WeAreIowa&lt;/a&gt;&lt;/p&gt;</content>
    <source>
      <title>markpeak.net</title>
      <link rel="self" href="https://markpeak.net/feed/"/>
      <link rel="alternate" href="https://markpeak.net"/>
    </source>
  </entry>
  <entry>
    <id>urn:uuid:0843f76c-22e5-55ec-8931-419ab43901ce</id>
    <title>Coloring the Snub Dodecahedron</title>
    <updated>2026-08-08T11:19:20.000Z</updated>
    <author>
      <name>neizod's speculation</name>
    </author>
    <published>2026-08-08T11:19:20.000Z</published>
    <link rel="alternate" href="https://neizod.dev/2026/08/08/coloring-snub-dodecahedron.html"/>
    <category term="Thai"/>
    <content type="html">&lt;p&gt;Last year, on a trip to Japan, I bought &lt;a href="https://tokyo-shoseki.co.jp/polydron/"&gt;ポリドロン&lt;/a&gt;, a geometric &lt;em&gt;toy&lt;/em&gt;, and brought it home with me. But I was busy and never really got around to building anything with it. Then last week I went to a &lt;a href="https://neizod.dev/2026/07/30/geometry-boot-camp-2026.html"&gt;Geometry Boot Camp&lt;/a&gt;, hosted this year by Chiang Mai University, and finally had an excuse to dust the set off and play with it. At first I thought I’d just build something a little complicated but still pretty … and somehow, before I knew it, I had wandered all the way into graph theory 🤣&lt;/p&gt;

&lt;h2&gt;A toy from Japan&lt;/h2&gt;

&lt;p&gt;ポリドロン, or Polydron, is actually a toy that originated in the United Kingdom. It is designed as an educational toy for learning mathematics, especially geometry. As far as I can tell, the Japanese education market licensed the toy, translated it into Japanese, and developed some additional teaching materials of its own.&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;&lt;img src="https://feeds.llun.dev/media/d826b4a1df5a12f3196a9df8bfc98f97a40f17de9bcbd65f52deb3e4b2616c34.jpg" alt="" /&gt;&lt;/p&gt;

  &lt;p&gt;The Polydron booklet and a few basic shapes I had already built&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The toy consists of many colorful pieces that snap together (a bit like LEGO, except the basic pieces are not tiny “bricks”). Each basic piece is a flat regular $n$-gon: all its sides have the same length, all the angles between adjacent sides have the same size, and, importantly, the angles are not so small that the sides overlap one another. These are the familiar basic shapes we all know: equilateral triangles, squares, regular pentagons, regular hexagons, and so on. (They actually sell extra sets with pieces whose sides and/or angles are not all equal too, but I personally did not pay extra for those versions.)&lt;/p&gt;

&lt;p&gt;Flipping through the booklet that came with the set, I desperately wanted to build a &lt;a href="https://en.wikipedia.org/wiki/Truncated_icosahedron"&gt;buckyball&lt;/a&gt; (12 pentagons and 20 hexagons). But after counting the pieces in the box, I discovered that they give you fewer than 20 hexagons … so if I wanted to build one, I would have to buy more pieces LOL (…or I could use six triangles to fake one hexagon. I tried that, and personally I did not find the result quite &lt;em&gt;pretty&lt;/em&gt; enough.)&lt;/p&gt;

&lt;p&gt;After spending a while browsing &lt;a href="https://en.wikipedia.org/wiki/Platonic_solid"&gt;Platonic solids&lt;/a&gt; and &lt;a href="https://en.wikipedia.org/wiki/Archimedean_solid"&gt;Archimedean solids&lt;/a&gt;, I eventually landed on the &lt;a href="https://en.wikipedia.org/wiki/Snub_dodecahedron"&gt;snub dodecahedron&lt;/a&gt; (from here on, I’ll just call it the “snub-ball”). It consists of 12 pentagons and 80 triangles, and the box happened to contain exactly enough pieces to build one! … Except those 80 triangles were not all the same color. After putting the whole thing together once with the colors more or less at random, I found the result less pretty than I had hoped.&lt;/p&gt;

&lt;h2&gt;Coloring the ball&lt;/h2&gt;

&lt;p&gt;So I took the snub-ball apart and carefully counted the pieces. There were triangles in exactly four colors 🔴🟢🔵🟡, 20 of each (all 12 pentagons, meanwhile, were green 🟢)… Anyone who has read this far is probably having the same brilliant idea: can we build the snub-ball while arranging the four triangle colors in some orderly way? For example, perhaps we could try the following plan:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;Start with one pentagon piece.&lt;/li&gt;
  &lt;li&gt;Put a bunch of triangles around that pentagon.&lt;/li&gt;
  &lt;li&gt;Keep going around the pentagon, placing triangles in the color order 🔴🟢🔵🟡.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Unfortunately, this plan cannot make the colors line up nicely. There are an odd number of triangles surrounding a pentagon (5 touching it along an edge, plus another 10 touching it only at a vertex), while the number of colors is even. In particular, there is no way to use all four colors equally often.&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;&lt;img src="https://feeds.llun.dev/media/f9613e037f1f095a403549bdaf81274d1d5edaea4ee279018cb6bd36f642419f.png" alt="" /&gt;&lt;/p&gt;

  &lt;p&gt;From left to right: the snub-ball, the rhombi-ball, and the dodecahedron – &lt;a href="https://commons.wikimedia.org/wiki/Polyhedra"&gt;image from WikiPedia&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Just as I was starting to lose hope, I remembered that the snub-ball we want can actually be obtained from a neighboring solid: the &lt;a href="https://en.wikipedia.org/wiki/Rhombicosidodecahedron"&gt;rhombicosidodecahedron&lt;/a&gt;. (That name is honestly rather &lt;em&gt;terrifying&lt;/em&gt;, but the important part is that it has three kinds of faces: 12 pentagons, 20 triangles, and 30 squares. From here on, I’ll just call it the “rhombi-ball”.) To make our snub-ball, we can essentially take the rhombi-ball and “twist” its edges.&lt;/p&gt;

&lt;p&gt;More precisely, starting from the rhombi-ball, split every square into two right triangles, then twist the entire ball while keeping the pentagons and equilateral triangles fixed in size. As we twist, the side lengths and angles of the triangles that came from the squares change. Once we have twisted the ball far enough that every triangular face has become equilateral, what we get is exactly the snub-ball. (And of course, the process can be reversed.)&lt;/p&gt;

&lt;p&gt;So we can transform our snub-ball construction problem into a rhombi-ball construction problem instead:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Use two triangles to imitate one &lt;em&gt;fake&lt;/em&gt; square. We need 30 such fake squares in total, with 10 each in 🔴🔵🟡.&lt;/li&gt;
  &lt;li&gt;For the 20 actual triangles that remain, use 🟢, the same color as the pentagons, since these triangles touch the pentagons only at vertices.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;And there we go: we use exactly 20 triangles of each color!&lt;/p&gt;

&lt;p&gt;Once the problem is transformed this way (20 triangles surrounded by 30 squares), a very natural extra requirement suggests itself: every triangular face should be surrounded by squares of all three different colors. Of course, the first question is whether this is even possible. A little quick trial and error gives a confident answer: yes! And the result is &lt;em&gt;beautiful&lt;/em&gt;, too 🎉&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;&lt;img src="https://feeds.llun.dev/media/dccaa4f05a94659ab00c13e2c6d448c70a3ed612f58e2e3f36f8b1ab0ddd5f61.jpg" alt="" /&gt;&lt;/p&gt;

  &lt;p&gt;A Polydron snub-ball where every green triangle is adjacent to fake squares in all 3 colors&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;Different colorings&lt;/h2&gt;

&lt;p&gt;Once I had one solution, the natural next question was: &lt;em&gt;how many ways&lt;/em&gt; are there to build a snub-ball/rhombi-ball with this kind of nice color arrangement?&lt;/p&gt;

&lt;p&gt;At first glance, it feels like there must be lots of them. For example, we can permute the &lt;em&gt;names of the colors&lt;/em&gt; 🔴🔵🟡. That makes it look as if there are many different colorings, but if we look more closely, the underlying structure has not changed at all. So we will not count a mere renaming of the colors as a different solution.&lt;/p&gt;

&lt;p&gt;Likewise, if rotating the ball or reflecting it in a mirror gives the same result, we will not count that as a different solution either. (This is already a little harder to test computationally than simply renaming the colors.)&lt;/p&gt;

&lt;p&gt;In short, we want to count genuinely different coloring structures, treating rotations, reflections, and permutations of the colors as equivalent.&lt;/p&gt;

&lt;blockquote&gt;
  &lt;div&gt;
  
  &lt;div&gt;
    
    
      
      
      
    
    &lt;div&gt;
      &lt;span&gt;snub-ball&lt;/span&gt;
      &lt;span&gt;rhombi-ball&lt;/span&gt;
      &lt;span&gt;dodecahedron&lt;/span&gt;
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;
  

  &lt;p&gt;Let’s try coloring the ball! Click to color; drag to rotate. &lt;a href="https://neizod.dev/2026/08/08/coloring-snub-dodecahedron.html#"&gt;Click here to reset the colors&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Hmm … so how can we &lt;em&gt;compute&lt;/em&gt;, in some reasonably simple way, whether any two balls should count as different?&lt;/p&gt;

&lt;p&gt;If we go back to the ball we actually built, there is one feature we can inspect on each triangular face: the direction in which the surrounding square colors wind around it. We will say a triangle is colored &lt;em&gt;counterclockwise&lt;/em&gt; if the surrounding squares appear in the order 🔴🔵🟡 as we go counterclockwise, and &lt;em&gt;clockwise&lt;/em&gt; if they appear in the opposite order.&lt;/p&gt;

&lt;p&gt;If we count the two winding directions over all triangular faces, then whenever two balls have different counts, we can immediately conclude that the balls are different. (If the counts are the same, however, we still cannot conclude that they are identical, because the triangles might occupy different positions.) Also, because we allow mirror reflections, the clockwise and counterclockwise counts may swap. So from here on, we will focus on the case where the counterclockwise count is greater than or equal to the clockwise count.&lt;/p&gt;

&lt;p&gt;Using this winding-direction feature, the ball we built can be summarized as having 16 counterclockwise faces and 4 clockwise faces… That is a surprisingly lopsided pair of numbers, and it raises a few questions. Can we make all 20 faces counterclockwise? Can we make the numbers of clockwise and counterclockwise faces exactly equal? Is there anything special about this 16:4 ratio?&lt;/p&gt;

&lt;p&gt;The all-20-counterclockwise case is easy to rule out. We can simply try to build the ball while forcing every face to wind counterclockwise, and before long some of the colors are forced into conflict.&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;&lt;img src="https://feeds.llun.dev/media/a42dacce3e500e6373fbd6d159690143364b59394d5632aad9b4820fa7c1beb8.png" alt="" /&gt;&lt;/p&gt;

  &lt;p&gt;A conflict caused by trying to color everything counterclockwise: triangle no. 5 cannot be colored counterclockwise&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;But the question of whether we can have equal numbers of counterclockwise and clockwise faces is much harder. For every triangular face, we have two choices for its winding direction, so the number of possibilities we would have to try grows exponentially unless we quickly prune away impossible choices.&lt;/p&gt;

&lt;p&gt;So perhaps we should write a program to help solve the problem. And rather than asking it only about one particular clockwise-to-counterclockwise ratio, we may as well take the bigger view: generate every possible colored ball first, then throw away all duplicates under rotation/reflection/color permutation… Just thinking about implementing that is already tiring, though, because we would have to keep track of triangles, squares, and pentagons all glued together. Is there some way to make the problem simpler?&lt;/p&gt;

&lt;h2&gt;Graph theory steps in&lt;/h2&gt;

&lt;p&gt;Go back to the rhombi-ball and imagine the following: every pentagon expands outward at the same rate. As the pentagons grow, the squares get squeezed thinner and thinner (turning into long, narrow quadrilaterals), while the triangles shrink too (but still uniformly in every direction). When the pentagons have expanded as far as they can and finally touch one another, the 30 squares collapse into the edges between pentagons, while the 20 triangles collapse into the vertices where the pentagons meet.&lt;/p&gt;

&lt;p&gt;In other words, the rhombi-ball can be transformed into a &lt;a href="https://en.wikipedia.org/wiki/Regular_dodecahedron"&gt;dodecahedron&lt;/a&gt;!&lt;/p&gt;

&lt;p&gt;And for convenience, we can temporarily forget the geometric shape of the dodecahedron and look only at its graph. Since the graph of the dodecahedron can be drawn as a &lt;a href="https://en.wikipedia.org/wiki/Planar_graph"&gt;planar graph&lt;/a&gt;, we get a nice simple picture with no crossing edges to make our heads hurt.&lt;/p&gt;

&lt;p&gt;More importantly, every vertex of this graph has degree 3, and every face of the three-dimensional solid becomes a face of length 5 in the graph. We no longer have to worry about several different kinds of shapes mixed together.&lt;/p&gt;

&lt;p&gt;In graph-theory language, our original problem of assembling the pieces into a nice color arrangement becomes an &lt;a href="https://en.wikipedia.org/wiki/Edge_coloring"&gt;edge-coloring problem&lt;/a&gt;: color the edges with 3 colors so that all 3 colors meet at every vertex.&lt;/p&gt;

&lt;p&gt;At this point, writing the program is much easier. One straightforward approach is to choose a vertex, immediately give its three incident edges three different colors, and then keep extending the coloring from there until the entire ball is colored without conflicts. Whenever a conflict appears, just throw that branch away.&lt;/p&gt;

&lt;p&gt;Once we have a complete edge coloring, we try every permutation of the color names (all $3!$ of them) and rotate/reflect the ball in every possible way (120 possibilities), giving us all &lt;a href="https://en.wikipedia.org/wiki/Graph_isomorphism"&gt;graph-isomorphic&lt;/a&gt; versions of that ball. We keep only the simplest representative of each coloring (&lt;a href="https://gist.github.com/neizod/b817ac0aa8d286a015c4b61e4df1a288"&gt;code here&lt;/a&gt;) … and the program tells us that there is only &lt;em&gt;one&lt;/em&gt; coloring, namely the one with 16 counterclockwise turns and 4 clockwise turns!!!&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;&lt;img src="https://feeds.llun.dev/media/685bcae2e8943555543e4f5643a50f392cb8158cc6a081c55acbccabd8709d99.png" alt="" /&gt;&lt;/p&gt;

  &lt;p&gt;Edge colorings found by the program. All the solutions it finds reduce to just one distinct coloring&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;The beautiful 16:4 ratio&lt;/h2&gt;

&lt;p&gt;Why the ratio is 16:4? To answer this, let’s look back at our attempt to make every vertex around one pentagonal face counterclockwise. We cannot go counterclockwise around all 5 vertices: by the time we reach the last one, its counterclockwise orientation conflicts with the first. (Three does not divide five.) We are therefore forced to have 4 counterclockwise vertices and 1 clockwise vertex in order for the winding to come back consistently to where it started. In other words,&lt;/p&gt;

\[CCW - CW \equiv 0 \pmod{3}\]

&lt;p&gt;where&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;$CCW$ is the number of counterclockwise turns on one pentagonal face,&lt;/li&gt;
  &lt;li&gt;$CW$ is the number of clockwise turns on one pentagonal face,&lt;/li&gt;
  &lt;li&gt;and we also have the constraint $CCW + CW = 5$.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This is the conclusion for a single pentagonal face. The congruence also shows that no other split works: for example, we cannot have 3 counterclockwise and 2 clockwise turns. The counterclockwise-to-clockwise ratio on one face can only be 4:1 or 1:4.&lt;/p&gt;

&lt;p&gt;At this point, we can transform the problem one more time! Instead of edge colors, let us now color the &lt;em&gt;vertices&lt;/em&gt; of the dodecahedron with two colors, under the rule that every pentagonal face must have its vertices colored in a 4:1 or 1:4 ratio. For this post, we will use&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;🟠 for a counterclockwise turn,&lt;/li&gt;
  &lt;li&gt;🟣 for a clockwise turn.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Start by coloring the 5 vertices around the first pentagon in a 🟠:🟣 ratio of 4:1. Now look at the other 2 pentagonal faces that already share the 🟣 vertex but whose remaining vertices are still uncolored. There are 3 cases to consider:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;&lt;img src="https://feeds.llun.dev/media/62a7c1bcc6ace1461ee0ef5dfcf4f236100cfa16d86200a7530971a9839e944f.png" alt="" /&gt;&lt;/p&gt;

  &lt;p&gt;The 3 possible cases for coloring the vertices around the other 2 pentagonal faces&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Namely:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;If one of the two pentagons uses a 4:1 split and the other a 1:4 split, a vertex immediately gets contradictory color requirements.&lt;/li&gt;
  &lt;li&gt;If both use 1:4, there is no contradiction within these first 3 faces, but if we keep propagating the constraints around the “equator”, we eventually get contradictions at both “poles”.&lt;/li&gt;
  &lt;li&gt;If both use 4:1, something much more interesting happens: all vertices along the outer boundary of these 3 pentagons (including the first pentagon we colored) are 🟠, meaning they are all counterclockwise turns.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;In other words, every pentagonal face is forced to use the 4:1 split.&lt;/p&gt;

&lt;p&gt;Each pentagonal face therefore contains exactly one 🟣 vertex, and each 🟣 vertex is “hidden” inside a cluster of 3 pentagons. Since the dodecahedron has 12 pentagonal faces in total, the number of 🟣 vertices must be $12 / 3 = 4$.&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;&lt;img src="https://feeds.llun.dev/media/b9ddea4ca7e3b505dec761222ab697ba9b649ae0ed3b256c89900cc0d995d6cc.png" alt="" /&gt;&lt;/p&gt;

  &lt;p&gt;Four groups of 3 pentagonal faces fit together to form the dodecahedron&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;And that is why the whole solid has a counterclockwise-to-clockwise ratio (🟠:🟣) of 16:4. Even better, if we connect the 4 clockwise (🟣) vertices, we get a &lt;a href="https://en.wikipedia.org/wiki/Tetrahedron"&gt;tetrahedron&lt;/a&gt; hidden inside the dodecahedron!&lt;/p&gt;

&lt;p&gt;Not bad for some lighthearted geometric fun over the holiday 😊&lt;/p&gt;</content>
    <source>
      <title>neizod's speculation</title>
      <link rel="self" href="https://neizod.github.io/feed.xml"/>
      <link rel="alternate" href="https://neizod.dev/"/>
    </source>
  </entry>
  <entry>
    <id>urn:uuid:f0ca101f-0d96-578c-b861-2f3eb9d65488</id>
    <title>Progress of World Models</title>
    <updated>2026-07-31T07:07:25.000Z</updated>
    <author>
      <name>Isriya Paireepairit</name>
    </author>
    <published>2026-07-31T07:07:25.000Z</published>
    <link rel="alternate" href="https://markpeak.net/progress-of-world-models/"/>
    <category term="Thai"/>
    <content type="html">&lt;p&gt;เรื่อง World Models เป็นสิ่งที่ผมสนใจติดตามมาสักพักหนึ่ง (&lt;a href="https://markpeak.net/yann-lecuns-world-model/"&gt;World Models&lt;/a&gt;, &lt;a href="https://markpeak.net/spatial-intelligence/"&gt;Spatial Intelligence&lt;/a&gt;, &lt;a href="https://markpeak.net/from-agentic-ai-to-physical-ai/"&gt;Physical AI&lt;/a&gt;, &lt;a href="https://markpeak.net/jagged-intelligence-world-model-omnimodel/"&gt;World Models ของ DeepMind&lt;/a&gt;) แต่ช่วงหลังพอมาทำงานการเมืองก็ไม่มีเวลาติดตามละเอียดนัก&lt;/p&gt;
&lt;p&gt;ล่าสุด Ars Technica มี &lt;a href="https://arstechnica.com/ai/2026/07/simulating-everything-sort-of-the-promise-and-limits-of-world-models/"&gt;บทความสรุปความคืบหน้าของวงการ World Models&lt;/a&gt; ช่วงหยุดยาวมีเวลานั่งอ่าน เลยอยากมาเขียนสรุปความเข้าใจของตัวเองสักหน่อย&lt;/p&gt;
&lt;p&gt;อธิบายแบบสั้นๆ World Models อาจเป็น “ก้าวต่อไป” ของวงการ AI ที่มีแขนงย่อยมากมาย ถ้าให้ลองสรุปแบบรวบรัด&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;1D – โมเดลภาษา&lt;/strong&gt; (language model) ที่เราใช้กันในปัจจุบันนี้ คือการให้ AI สร้างผลลัพธ์ออกมาเป็นข้อความยาวๆ ที่ต่อกันไปเรื่อยๆ (1 มิติ) อัลกอริทึมสำคัญของวงการนี้คือ Transformer&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;2D – โมเดลสร้างภาพ&lt;/strong&gt; เป็นการสร้างผลลัพธ์ออกมาเป็นพิกเซล 2 มิติ (กว้าง x ยาว) อัลกอริทึมสำคัญคือ Diffusion
&lt;ul&gt;
&lt;li&gt;2D เคลื่อนไหว – ถ้าเราเอาโมเดลภาพมาสร้างภาพหลายๆ เฟรมต่อกัน มันจะกลายเป็นโมเดลสร้างวิดีโอได้ แม้มีความซับซ้อนขึ้นมาก แต่พื้นฐานของมันยังเป็นโมเดลสร้างภาพอยู่ดี&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;3D – โมเดลสร้างโลก 3 มิติ&lt;/strong&gt; ที่มีความกว้าง x ยาว x ลึก เหมือนกับโลกในเกม เราเดินเข้าไปสำรวจในโลกนั้นได้ อันนี้ล่ะ World Models&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;คำว่า World Models เริ่มดังขึ้นมาหลังจากตัวพ่อตัวแม่ในวงการ AI ออกมาชี้ให้เห็นข้อจำกัดของ language model ว่ามันคือเครื่องเดาคำจากแพทเทิร์นขนาดใหญ่ มันไม่ได้ถูกฝัง logic ใดๆ แบบสิ่งมีชีวิตอยู่ในนั้นด้วย&lt;/p&gt;
&lt;p&gt;ล่าสุดปี 2026 นี้ ตัวพ่อตัวแม่เหล่านั้นออกมาเปิดบริษัททำ World Models กัน 2 ค่ายแล้วคือ World Labs ของ Fei-Fei Li และ &lt;a href="https://www.blognone.com/node/149984"&gt;Advanced Machine Intelligence (AMI) ของ Yann LeCun&lt;/a&gt; (นอกจากนี้ยังมีค่ายใหญ่ๆ อื่นๆ ที่ทำเรื่องนี้เหมือนกันคือ Google DeepMind Genie กับ NVIDIA Cosmos)&lt;/p&gt;
&lt;p&gt;ถึงแม้รายละเอียดอาจต่างกัน แต่ไอเดียหลักๆ ก็เรื่องเดียวกัน นั่นคือ “การฝังข้อมูลกายภาพจากโลกจริงๆ ลงในโมเดลจำลอง”&lt;/p&gt;
&lt;h1&gt;คำนิยามของ World Models&lt;/h1&gt;
&lt;p&gt;ในวงการก็ยังไม่มีคำนิยามที่ชัดเจนของ World Models ว่ามันคืออะไรกันแน่ แต่ผมคิดว่านิยามของ Ben Mildenhall ผู้ร่วมก่อตั้ง World Labs ร่วมกับ Fei-Fei Li และเป็นตัวเทพในวงการ Computer Vision (เขาเป็นคนคิดอัลกอริทึม &lt;a href="https://arxiv.org/abs/2003.08934"&gt;neural radiance fields หรือ NeRF&lt;/a&gt; ซึ่งเป็นสิ่งสำคัญมากของวงการนี้)&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;The key things that would distinguish it from an LLM are demonstrating degrees of &lt;strong&gt;spatial&lt;/strong&gt; and &lt;strong&gt;continuous understanding&lt;/strong&gt;&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;คำว่า spatial ในเชิงมิติเป็นสิ่งที่เข้าใจได้ง่าย แต่คำว่า continuous understanding ลึกซึ้งกว่า ตรงที่มันสะท้อนให้เห็นว่าโมเดลตอบโต้กับเราแบบเรียลไทม์ตลอดเวลา ต่างจากโมเดลภาษาแบบ LLM ที่เป็น turn-based คือเรากับ AI สลับกันโต้ตอบ&lt;/p&gt;
&lt;p&gt;ส่วนพระแม่ Fei-Fei Li &lt;a href="https://drfeifei.substack.com/p/from-words-to-worlds-spatial-intelligence"&gt;เคยให้นิยาม&lt;/a&gt;เอาไว้ว่า World Models ต้องมีคุณลักษณะ 3 ประการ&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Generative&lt;/strong&gt; โมเดลต้องสร้างโลกได้ตามคำสั่งที่มนุษย์ต้องการ โดยที่ยังคงความสม่ำเสมอ (consistency) ภายในโลกนั้นได้ตลอด (ไม่ใช่เดินเข้าห้องเสมือนไป เดินออกมาแล้วสภาพแวดล้อมกลายเป็นอย่างอื่น)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Multimodal&lt;/strong&gt; โมเดลต้องรับอินพุตได้หลากหลาย ภาพ วิดีโอ ข้อความ ท่าทาง แผนที่บอกระยะลึก ฯลฯ ได้ในตัว&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Interactive&lt;/strong&gt; โมเดลจะต้องสร้างเอาต์พุตได้จากอินพุตที่ใส่เข้าไป เอาต์พุตที่ได้คือสถานะถัดไป (next state) ของโลกเสมือนนั้น&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;แนวทางการสร้าง World Models ของแต่ละบริษัทก็แตกต่างกันไป กรณีของ World Labs ที่เริ่มมาจากสาย Computer Vision จะพัฒนามาจากฐานของ “ภาพนิ่ง” ก่อน แล้วค่อยให้โมเดลอ่านภาพนิ่ง สร้างเป็นโลกเสมือนขึ้นมาอีกที (มีเดโมลองเล่นได้แล้วชื่อว่า &lt;a href="https://marble.worldlabs.ai/"&gt;Marble&lt;/a&gt;)&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;อีกแนวทางที่น่าสนใจมาจากโลกของ AI สร้างวิดีโอ โดยบริษัท Runway ผู้เชี่ยวชาญเรื่องการสร้างวิดีโอ ได้ออก&lt;a href="https://runway.com/research/introducing-runway-gwm-1"&gt;โมเดลชื่อ GWM-1 (ย่อมาจาก General World Model) มาเมื่อปลายปี 2025&lt;/a&gt; ซึ่งแนวทางของ Runway นั้นเป็นการต่อยอดจากโมเดลสร้างวิดีโอที่ต้อง “เข้าใจโลกกายภาพ” ก่อนถึงจะสร้างวิดีโอที่สมจริงได้ โดยใช้อัลกอริทึมชื่อ Autoregressive Diffusion Model ที่สามารถสร้างผลลัพธ์เป็นภาพ ต่อเนื่องจากอินพุตที่ใส่เข้าไปได้&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;h1&gt;อุปสรรคของ World Models&lt;/h1&gt;
&lt;p&gt;อย่างไรก็ตาม ข้อจำกัดของการสร้าง World Models แบบสร้างภาพทุกพิกเซล คือ มันใช้พลังประมวลผลสูงมาก (compute-expensive) แล้วพอต้องสร้างภาพใหม่ๆ ทุกรอบเพื่อตอบสนองอินพุตของผู้ใช้แบบเรียลไทม์ มันยิ่งยากและแพง อันนี้เป็นปัญหาที่วงการวิจัย AI ต้องแก้กันต่อไป ว่าจะหาโซลูชันที่เหมาะสมได้อย่างไร&lt;/p&gt;
&lt;p&gt;แนวทางอื่นที่เป็นไปได้คือ แนวทางของ Yann LeCun ที่เขาเรียกว่า &lt;a href="https://rohitbandaru.github.io/blog/JEPA-Deep-Dive"&gt;Joint-Embedding Predictive Architecture (JEPA)&lt;/a&gt; เป็นการพยากรณ์เฉพาะสถานะแบบคร่าวๆ (abstract state) ของภาพที่จะสร้าง แทนการสร้างออกมาแบบทุกพิกเซล ซึ่งมันอาจเหมาะกับงานบางประเภทที่ไม่ต้องการความละเอียดของภาพผลลัพธ์มากนัก (เช่น เอาให้หุ่นยนต์ทำงานได้ ภาพไม่ต้องสวยก็ได้)&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;ค่าย World Labs พยายามแก้ปัญหาเรื่องประสิทธิภาพ ด้วยอัลกอริทึมตัวใหม่ชื่อ &lt;a href="https://www.worldlabs.ai/blog/rtfm"&gt;Real-Time Frame Model (RTFM)&lt;/a&gt; ใช้เทคนิคว่าแทนที่จะแปลงภาพ 2D เป็นโมเดล 3D (ซึ่งสิ้นเปลืองพลังประมวลผลมาก) จะใช้วิธีสร้างภาพ 2D ในมุมอื่นๆ ขึ้นมาอีกหลายๆ มุมแทน (เทคนิคนี้เรียกว่า &lt;a href="https://en.wikipedia.org/wiki/Gaussian_splatting"&gt;Gaussian splatting&lt;/a&gt;) แล้วใช้เทคนิคการพยากรณ์ว่าเฟรมภาพต่อไปมันจะหน้าตาเป็นอย่างไร โดยอิงจากข้อมูลในเฟรมก่อนหน้า (&lt;a href="https://rtfm.worldlabs.ai/"&gt;มีเดโมอีกเช่นกัน&lt;/a&gt;)&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;h1&gt;ประโยชน์ของ World Models&lt;/h1&gt;
&lt;p&gt;อรรถประโยชน์ของ World Models ที่น่าจะจับต้องได้มากที่สุดคือการเทรนหุ่นยนต์ โดยเฉพาะหุ่นยนต์แบบมนุษย์ (humanoid robots) ซึ่งทำได้ยากกว่าการเทรนรถยนต์ไร้คนขับ เพราะรูปแบบสถานการณ์ของหุ่นยนต์มนุษย์นั้นกว้างกว่ารถยนต์มาก (หุ่นขับรถมีกฎจราจรชัดเจน พื้นที่จำกัดเฉพาะบนถนน รูปแบบการเคลื่อนไหวมีแค่เดินหน้า เบรก เลี้ยว)&lt;/p&gt;
&lt;p&gt;ความยากอีกประการของการเทรนหุ่นยนต์คือ การหาข้อมูลจากโลกกายภาพจริงๆ มาเพื่อเทรนและวัดผล (evaluation) นั้นยากและแพง (เทียบกับ การเทรนโมเดล LLM ที่ดูดข้อความจากทั้งอินเทอร์เน็ตมาได้ไม่ยาก) บริษัทหุ่นยนต์จำนวนมากจึงพยายามใช้ simulation ในการเทรนหุ่นยนต์ แต่การสร้างโลก 3D ทั้งใบขึ้นมาใน simulator ก็ไม่ง่ายเช่นกัน ต้องเอาคนมาปั้นโมเดล ค่อยๆ ใส่รายละเอียดลงไปให้สมจริง สร้างสถานการณ์รูปแบบต่างๆ เพื่อมาทดสอบว่าหุ่นยนต์ทำงานได้ตรงตามที่ต้องการหรือไม่ (Waymo ก็ใช้ท่านี้ในการเทรนรถยนต์ไร้คนขับ แต่ข้อมูลภาพถนนของ Waymo ก็หาได้ง่ายกว่าข้อมูลสำหรับเทรนหุ่นประเภทอื่นอยู่ดี)&lt;/p&gt;
&lt;p&gt;กูเกิลเพิ่งออกคลิปตัวอย่างโมเดลหุ่นยนต์ (ที่ถูกเทรนแล้ว) มาให้ดูกันแบบเห็นภาพ&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;แนวทางที่ประหยัดกว่า สเกลได้มากกว่า จึงเป็นการนำ World Models มาสร้างโลกเสมือนขึ้นมา แล้วใส่อินพุตเป็นภาพวิดีโอไปให้หุ่นยนต์ทดสอบการทำงานในโลกเสมือนจริงนั้น ซึ่ง World Labs เพิ่งประกาศซื้อกิจการบริษัททำ simulation หุ่นยนต์ชื่อ SceniX มาเพื่อขยายตลาดนี้ (รายละเอียดมีในคลิป)&lt;/p&gt;
&lt;p&gt;ผู้ก่อตั้ง SceniX (ซึ่งเคยเป็นลูกศิษย์ Fei-Fei Li ด้วย) บอกว่าการเทรนหุ่นยนต์เพื่อทำงานในสภาพแวดล้อมเปิด (unstructured เช่น ใช้ในบ้านเรือน) นั้นยากมาก ในขั้นต้นจะโฟกัสที่สภาพแวดล้อมกึ่งเปิด (semi-structure เช่น โกดังสินค้า) ก่อน ส่วนสภาพแวดล้อมปิด (structured เช่น โรงงานที่มีไลน์การผลิตชัดเจน) ใช้งานหุ่นยนต์เป็นปกติอยู่แล้ว&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;เส้นทางของวงการ World Models คงต้องบอกว่าอีกยาวไกล ตอนนี้ในวงการยังไม่ค้นพบ transformer moment แบบเดียวกับวงการ LLM ในช่วงที่ผ่านมา แต่การที่ขาใหญ่ของวงการเริ่มลงมาลุยเรื่องนี้กันเต็มตัว นักลงทุนเทเงินลงมาใส่ และประสิทธิภาพของหน่วยประมวลผลที่ดีขึ้นเรื่อยๆ ก็น่าจะทำให้เราได้เห็นความคืบหน้าของ World Models กันในอีกไม่ช้านานนัก&lt;/p&gt;</content>
    <source>
      <title>markpeak.net</title>
      <link rel="self" href="https://markpeak.net/feed/"/>
      <link rel="alternate" href="https://markpeak.net"/>
    </source>
  </entry>
  <entry>
    <id>urn:uuid:eb431781-c50d-5867-b7a0-9ee4a4b0402c</id>
    <title>Geometry Boot Camp 2026</title>
    <updated>2026-07-30T16:59:59.000Z</updated>
    <author>
      <name>neizod's speculation</name>
    </author>
    <published>2026-07-30T16:59:59.000Z</published>
    <link rel="alternate" href="https://neizod.dev/2026/07/30/geometry-boot-camp-2026.html"/>
    <category term="Thai"/>
    <content type="html">&lt;p&gt;หมุนเวียนมาอีกเช่นเคยกับค่ายวิชาการประจำปีสำหรับชาวเรขาคณิต ซึ่งปีนี้ได้มหาวิทยาลัยเชียงใหม่ (ภายใต้อาจารย์ &lt;a href="https://twitter.com/NutSnC"&gt;@NutSnC&lt;/a&gt;) เป็นเจ้าภาพ (เสียดายว่าปีก่อนติดภารกิจ เลยอดไปร่วมค่ายของปีที่แล้วที่จุฬาฯ) ซึ่งรอบนี้ความพิเศษของเราก็คือเรามีรุ่นน้องในแลปไปร่วมค่ายด้วย นั่นก็คือ &lt;a href="https://facebook.com/grittin.nuntasombat.77"&gt;กฤติน นันทสมบัติ&lt;/a&gt; ซึ่งเป็นนิสิตตรีควบโทจากวิศวะคอมฯม.เกษตรที่สนใจในอัลกอริทึมเชิงเรขาคณิต&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;&lt;img src="https://feeds.llun.dev/media/6325d6f6369d555a9189b4d2aa448dda720b108585c639f18f477cf5f30ad4c4.jpg" alt="" /&gt;&lt;/p&gt;

  &lt;p&gt;กฤตินกับปัญหาการขนย้ายดินให้เหนื่อยน้อยสุด (&lt;a href="https://en.wikipedia.org/wiki/Earth_mover%27s_distance"&gt;earth mover’s distance&lt;/a&gt;)&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;บรรยากาศงานก็สดใสสนุกสนานเช่นเดิม เพิ่มเติมคือพอได้มาอยู่กลางป่าเขาห่างแสงสีเสียงแล้วคิดงานออกลื่นปรื๊ดๆเลยทีเดียว&lt;/p&gt;

&lt;p&gt;และเนื่องจากว่าปีนี้งานจัดที่วิทยาเขตลำพูน เลยถือวิสาสะขออนุญาตขับรถจากบ้านที่เชียงใหม่เข้าร่วมงาน เลยได้ต้อนรับอาจารย์&lt;a href="https://facebook.com/kirati.sriamorn"&gt;กีรติ&lt;/a&gt;กับอาจารย์&lt;a href="https://facebook.com/nithi.rtn"&gt;นิธิ&lt;/a&gt;จากสนามบินมาร่วมทางไปด้วย ส่วนตอนเย็นของอีกวันก็ได้ส่งอาจารย์&lt;a href="https://facebook.com/supanat.kamtue"&gt;การ์ฟิลด์&lt;/a&gt;ออกไปเที่ยวตัวเมืองลำพูน&lt;/p&gt;

&lt;p&gt;สำหรับปัญหางานวิจัยนั้น ส่วนตัวปีนี้เปลี่ยนหัวข้อวิจัย&lt;sup&gt;&lt;a href="https://neizod.dev/2026/07/30/geometry-boot-camp-2026.html#fn:1"&gt;1&lt;/a&gt;&lt;/sup&gt;ไปทำปัญหาเกี่ยวกับดิสก์ปิดครอบขนาดหนึ่งหน่วยจำนวนหลายดิสก์ที่ไม่ซ้อนทับกัน ซึ่งเป็นปัญหาที่ไปบังเอิญเจอมาจากช่อง 3blue1brown ซึ่งแม้ปัญหาพื้นฐานจะถูกแก้ได้อย่างสวยงามไปนานแล้ว แต่ก็ยังมีช่องว่างของปัญหาที่คล้ายกันเหลือให้ศึกษาต่อได้ในอีกหลายมิติเลยทีเดียว ก็ต้องขอบคุณอาจารย์กีรติกับอาจารย์&lt;a href="https://facebook.com/ping41"&gt;ปิงธีระเดช&lt;/a&gt;ที่มาร่วมเมามันส์ (หรือเมาหมัด 5555) กับการแก้ปัญหานี้ด้วยกันครับ&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;&lt;img src="https://feeds.llun.dev/media/d231f598be6025b1e8d3958325bcd0e434dd94beccb621a5a784e3ed1f4ad1e5.jpg" alt="" /&gt;&lt;/p&gt;

  &lt;p&gt;อาจารย์&lt;a href="https://facebook.com/wacharin.wichiramala"&gt;วัชริน&lt;/a&gt;กับเอกสารรวมรูปตราพระเกี้ยว 🤣&lt;/p&gt;
&lt;/blockquote&gt;

&lt;blockquote&gt;
  &lt;p&gt;&lt;img src="https://feeds.llun.dev/media/5456f5be3e0457da1fd7a7feb3f881601fe5ab293db1a2638e608824aa87f47f.jpg" alt="" /&gt;&lt;/p&gt;

  &lt;p&gt;อาจารย์การ์ฟิลด์กำลังเล่าถึงปัญหาทางทฤษฎีกราฟ&lt;/p&gt;
&lt;/blockquote&gt;

&lt;blockquote&gt;
  &lt;p&gt;&lt;img src="https://feeds.llun.dev/media/1e4ec0e5c0591768c4e67b84c51c449f64f7c24859657aec30ed78befc6ebdc0.jpg" alt="" /&gt;&lt;/p&gt;

  &lt;p&gt;&lt;a href="https://facebook.com/amonthep.boonrit.2024"&gt;อมรเทพ&lt;/a&gt;กับปัญหาการปิดทับสี่เหลี่ยมจัตุรัสที่ใหญ่ขึ้นมานิดหน่อย&lt;/p&gt;
&lt;/blockquote&gt;

&lt;blockquote&gt;
  &lt;p&gt;&lt;img src="https://feeds.llun.dev/media/a9433e2352e4a6f367108461ca861cac126cd40b9da4b594a7fd23d3e82676b7.jpg" alt="" /&gt;&lt;/p&gt;

  &lt;p&gt;กระดานคิดโจทย์กลุ่มอาจารย์&lt;a href="https://facebook.com/warakkag"&gt;สร้างสรรค์&lt;/a&gt; (หวังว่าคงไม่ได้เผยแพร่ความลับงานวิจัยนะ!)&lt;/p&gt;
&lt;/blockquote&gt;

&lt;blockquote&gt;
  &lt;p&gt;&lt;img src="https://feeds.llun.dev/media/c91227b12af29eac34779d770117ba2c70aa6fa24fb6eb289cf2cdd2a6ee7e5b.jpg" alt="" /&gt;&lt;/p&gt;

  &lt;p&gt;ทำไมเราถึงมาจบค่ายกันที่คาราโอเกะภาษาญี่ปุ่นกันได้ทุ๊กกปี 😵&lt;/p&gt;
&lt;/blockquote&gt;

&lt;blockquote&gt;
  &lt;p&gt;&lt;img src="https://feeds.llun.dev/media/b46d422d8901454662004383e781741ed957d96ef0d005fce0a504d811cbd32b.jpg" alt="" /&gt;&lt;/p&gt;

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

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

&lt;blockquote&gt;
  &lt;p&gt;&lt;img src="https://feeds.llun.dev/media/c4ef9037eb5397d8138ff8e2e1a63738a205a25deee0d3edd32caffc3fad88be.jpg" alt="" /&gt;&lt;/p&gt;

  &lt;p&gt;จบค่ายแล้วขับรถส่งกฤตินกับ&lt;a href="https://facebook.com/asama.jampeepan"&gt;อัสมา&lt;/a&gt;แวะเที่ยว&lt;a href="https://maps.app.goo.gl/Ca5KKpeucwVfizAdA"&gt;พิพิธภัณฑ์ศิลปะแห่งความโรยรา&lt;/a&gt; … ส่วน&lt;a href="https://facebook.com/tony.nitipon"&gt;ต้นนิติพล&lt;/a&gt;เหมือนจะเป็นผู้เคราะห์ร้ายหลงทางมานั่งรถกลับเชียงใหม่ผิดคัน 🙏&lt;/p&gt;
&lt;/blockquote&gt;

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

&lt;p&gt;แล้วไว้เจอกันใหม่ปีหน้าครับ 😊&lt;/p&gt;

&lt;div&gt;
  &lt;ol&gt;
    &lt;li&gt;
      &lt;p&gt;แต่พอดูดีๆแล้ว ปัญหาตอนนี้ก็ไม่ได้เปลี่ยนไปไกลจากปัญหาก่อนๆที่เคยทำขนาดนั้น 555555555 &lt;a href="https://neizod.dev/2026/07/30/geometry-boot-camp-2026.html#fnref:1"&gt;↩&lt;/a&gt;&lt;/p&gt;
    &lt;/li&gt;
  &lt;/ol&gt;
&lt;/div&gt;</content>
    <source>
      <title>neizod's speculation</title>
      <link rel="self" href="https://neizod.github.io/feed.xml"/>
      <link rel="alternate" href="https://neizod.dev/"/>
    </source>
  </entry>
  <entry>
    <id>urn:uuid:362bafc3-26d2-54b7-ab73-5f21fd4af039</id>
    <title>Monster Hunter Rise</title>
    <updated>2026-07-06T19:18:00.000Z</updated>
    <author>
      <name>neizod's speculation</name>
    </author>
    <published>2026-07-06T19:18:00.000Z</published>
    <link rel="alternate" href="https://neizod.dev/2026/07/07/monster-hunter-rise.html"/>
    <category term="Thai"/>
    <content type="html">&lt;p&gt;holy ship, mhrise is PEAK. maybe i have more fun than mhwilds!!!&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;&lt;img src="https://feeds.llun.dev/media/55008b91816420a31723480a0bb291a0b70e43f7e491d29c76237801881fc863.jpg" alt="" /&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;i know that the game was designed first for the handheld ninswitch, thus the hunts need to be quick. that might annoy some “traditional hunters” who would like to take it slow, which is fair. but for me, this haste is the right pace, especially when you find monsters that match your skill, so the hunt lasts long enough for you to feel the thrill, but not so long that it drags on and on and seems to never end (like most hunts in mhworld).&lt;/p&gt;

&lt;p&gt;and the ninja-style parkour with double-jump air-dash is just top notch. honestly, removing all monsters from the game and just running around would still provide a &lt;em&gt;great&lt;/em&gt; experience! and this amazing movement blends so well with the fighting aspect! heck, there are even tons of new weapon movesets built around this dashing mechanic!!&lt;/p&gt;

&lt;p&gt;that being said, the game still feels… weird in some corners.&lt;/p&gt;

&lt;p&gt;take the “tower defense” quests (you read that right, the tower defense genre mixed into monster hunter). it’s quite questionable. i think mostly because TD demands you to be in the role of a war general, not a hunter. while some players might excel at, or even &lt;em&gt;love&lt;/em&gt;, doing both jobs, i guess most people who pick the genre are focused on being a frontline hunter who gets a chance to brawl 1v1 (or 4v1) with the monster, not a commander sitting in an overseer’s chair ordering their goons to build more pylons.&lt;/p&gt;

&lt;p&gt;the spirit birds system also got me like, huh? it’s a system where you have to run around the map collecting buffs at the start of &lt;em&gt;every&lt;/em&gt; hunt. yeah, you can play through the base story while ignoring this mechanic. but i guess once you hit late-game content, this becomes a must.&lt;/p&gt;

&lt;p&gt;i also miss the quick “instantly end quest” option from mhwilds, as well as the seamless “open world” transition between the village and hunting grounds. and focus mode for melee weapons is just a fundamental concept in any modern 3d game (luckily i play ranged weapons, so i have no complaints about aiming my reticle). analogously, it’s like how we don’t play games with clunky tank controls anymore. it’s so surprising the mh series took almost 25 years after ocarina of time until mhwilds finally implemented this necessary feature!&lt;/p&gt;</content>
    <source>
      <title>neizod's speculation</title>
      <link rel="self" href="https://neizod.github.io/feed.xml"/>
      <link rel="alternate" href="https://neizod.dev/"/>
    </source>
  </entry>
  <entry>
    <id>urn:uuid:5da2892f-26f5-5148-964d-c3633fa50e27</id>
    <title>Librarian: Tidy Up the Arcane Library!</title>
    <updated>2026-06-08T05:49:00.000Z</updated>
    <author>
      <name>neizod's speculation</name>
    </author>
    <published>2026-06-08T05:49:00.000Z</published>
    <link rel="alternate" href="https://neizod.dev/2026/06/08/librarian-tidy-arcane-library.html"/>
    <category term="Thai"/>
    <content type="html">&lt;p&gt;tl;dr: fun for the first few hours, but then it feels super hollow, especially when it intentionally invites you to overstay.&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;&lt;img src="https://feeds.llun.dev/media/0a68a752f85d5b1158653f61eaba8017b73c8e57f2760b58ab8e9292cec478db.jpg" alt="" /&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;em&gt;Librarian: Tidy Up the Arcane Library!&lt;/em&gt; (2026) is a first-person game about shelving thousands of books with the help of magic. Which I had to admit, I was having fun with. Basically, this resembles my past life.&lt;/p&gt;

&lt;p&gt;But the fun only stayed for an hour or two. Because after that, design flaws surface plentifully.&lt;/p&gt;

&lt;p&gt;Take the main mechanic of putting books onto a shelf. This is the main gameplay loop that you’ll spend &lt;em&gt;dozens&lt;/em&gt; of hours repeating. But the game does not provide ANY &lt;em&gt;reasonable&lt;/em&gt; quality-of-life features that make such a mechanic fun AT ALL!&lt;/p&gt;

&lt;p&gt;To put a book onto a shelf, you have to aim your crosshair at an empty space on the shelf, then press (X) on the gamepad to place the book. To take a book? You also need to press the same button (X)! This results in the game frequently misinterpreting your intention and taking a book from the shelf instead of putting down the book in your hand (and vice versa). ESPECIALLY WHEN YOU HAVE TO AIM AT EMPTY SPACE WHICH IS IMPOSSIBLE FROM SOME CAMERA ANGLES NEAR THE WALL BECAUSE THERE ARE OTHER BOOKS ON THE SHELF ALREADY!!!!&lt;/p&gt;

&lt;p&gt;Just… why not assign another dedicated button for placing books? (Y) on the gamepad is still unused!!&lt;/p&gt;

&lt;p&gt;You can even tackle this issue from another angle! Take &lt;em&gt;The Witness&lt;/em&gt; (2016), for example. It’s also a first-person puzzle game like this one. But when the player decides to “engage” with a sub-puzzle, the game pans the camera into the “front” position of that sub-puzzle, ensuring the player can aim unambiguously at any object on the screen!&lt;/p&gt;

&lt;p&gt;The game also simplemindedly handles the shelving system. Each shelf has 10 (or 3 or 5) rigid empty spaces for books. And when you place a book in an empty space, that’s the final position of the book! You cannot “push” the book to the left/right neighboring empty space! So have fun counting the number of empty spaces if your first book on the shelf happens to be vol.6!!!&lt;/p&gt;

&lt;p&gt;Heck, the game should even implement the bare-minimum system that’s similar to IRL book shelving: pushing multiple books to the left/right on the shelf. For example, I may have placed previously found books on the shelf as:&lt;/p&gt;

&lt;div&gt;&lt;div&gt;&lt;pre&gt;&lt;code&gt;1,3,4,5,-,-,-,-,8,10
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Then, when I find vol.2 later, I should be able to easily push vol.3-5 one step to the right and insert vol.2 in between. That’s a fun and &lt;em&gt;natural&lt;/em&gt; way to organize the shelf.&lt;/p&gt;

&lt;hr /&gt;

&lt;p&gt;But this is a game about shelving books using &lt;em&gt;magic&lt;/em&gt;, you may ask? Then why the f_ck is there a “shelving books without magic” achievement???&lt;/p&gt;

&lt;p&gt;Who cares about achievements, you may ask? Good point, actually – players have no obligation to do any achievement they don’t feel like doing.&lt;/p&gt;

&lt;p&gt;But the existence of achievements can convey another thing: the developer thinks this path is interesting enough for players to explore. So they put an achievement there as a beacon, nudging players to give it a try. WELL, IF THEY’RE GOING TO NUDGE THE PLAYER THAT WAY, THEN AT LEAST MAKE THE F_CKING NO-MAGIC RUN NOT THIS PAINFUL TO PLAY!!!!&lt;/p&gt;

&lt;p&gt;Sigh… Okay, so it seems that this game sells shelving with magic. Apparently, after you complete 2 shelves, you unlock a skill point which can be used to buy a magic spell to help with shelving faster/easier.&lt;/p&gt;

&lt;p&gt;This poses another problem: the available magical spells are no-brainer designs. No skill tree. No prerequisites. Every spell costs the same amount of skill points to unlock. Out of 5 spells to choose from, one of them clearly dominates the others. Resulting in the same gameplay loop for &lt;em&gt;everyone&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;And even with &lt;em&gt;magic&lt;/em&gt;, organizing 3072 books onto the shelf still ask you to play the game for 3 hours (as can be seen with the “speedrun” achievement). THREE F_CKING HOUR OF REPETIVELY USING THAT DOMINATE SPELL, WAIT FOR COOLDOWN, THE APPLY THE SPELL AGAIN AND AGAIN??????&lt;/p&gt;

&lt;p&gt;I think the developer wrongly estimated the number of books to put into the game here. More doesn’t always mean better. Too many and it becomes tedious. Quantity means nothing without quality.&lt;/p&gt;

&lt;hr /&gt;

&lt;p&gt;Lastly, the organized books on the shelves look majestic. But it also raises questions about &lt;em&gt;why&lt;/em&gt; every book series comes in 10 volumes. Won’t there be a single-book series at all (one that’s so complete in itself that the author refuses to “drag on” with a 2nd volume)? Or aren’t there epic series that span half a hundred volumes, if not more? Why just 10?&lt;/p&gt;

&lt;p&gt;Why does every book have the same page count, occupying the same slot size on the shelf? Real-world books vary a lot in size. And more than one series can occupy the same shelf just fine… In fact, there’s no need to go to such great lengths as to put all the books of the same series back-to-back. That’s neat, but that’s also OCD. If you establish some kind of categorization, like Dewey Decimal, then you can just place similar books roughly on the same bookcase; no need for them to be on exactly the same shelf. That’s enough for searching for a book you’re looking for.&lt;/p&gt;

&lt;p&gt;Most importantly, why does a series of 10 books fit the shelves &lt;em&gt;perfectly&lt;/em&gt;? Real-world bookshelves either have empty space left over (so you might decorate them with book stoppers, clocks, busts, etc.), or they’ll be so dense that you have to place some books horizontally on top of other books. Also, real public libraries often have lots of vacant space on the shelves anyway since people take books out of the shelves to &lt;em&gt;read&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;The fact that a series fits the shelves suggested that the shelves are the most important aspect of this library, not the books. Which means the library owner prefers style over substance, ruling out series that can’t be fitted onto the shelves in the first place. Consider this: if the author of a math series, which had already published 10 volumes, wrote another book to expand the boundary of knowledge, where would the new book go on the shelves???&lt;/p&gt;

&lt;p&gt;You don’t have to trust me. But if you go see screenshots where players are doing the “deliberately disarrange all of the books” achievement, this is a letter from Merlin (the library owner, who thought himself is so wise, but actually hollow to the core) to the player, quoted verbatimly:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;To Librarian,&lt;/p&gt;

  &lt;p&gt;I have the best books. Thousands of beautiful, high-quality books. People come from all over to see my collection—it’s a magnificent sight. I had a vision to build the best library in the world, maybe the greatest ever.&lt;/p&gt;

  &lt;p&gt;But I look at the shelves today, and what do I see? A TOTAL DISASTER. The books are everywhere! No order, no system, just a complete and total mess. It’s a disgrace. You were lazy, you were careless, and you were disrespectful to my best and most amazing gold-standard organization.&lt;/p&gt;

  &lt;p&gt;You had one job: “Put the books back.” Just one job! And you failed. You’re low-energy, you’re incompetent, and you’ve turned my beautiful library into a big mess of a warehouse. I don’t hire people who make messes, I hire people who win. And you? You are a loser.&lt;/p&gt;

  &lt;p&gt;I’ve decided to clean up this library. And I’m starting with you.&lt;/p&gt;

  &lt;p&gt;YOU’RE FIRED! Get out of my library!&lt;/p&gt;

  &lt;p&gt;Principal Merlin&lt;br /&gt;
University of Celesthall&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;I don’t know whether the developers intended it as a joke. But after spending nearly ten hours completing a challenge that the game itself encouraged through an achievement, receiving a letter that calls the player lazy, incompetent, and a loser doesn’t feel funny. It feels strangely hostile. Rather than rewarding curiosity or commitment, the game seems to mock the player for engaging with content that the developers themselves put there.&lt;/p&gt;

&lt;p&gt;So, yeah, let me make it loud and clear. To the developer: F_CK YOU AND GO TO HELL!!!&lt;/p&gt;</content>
    <source>
      <title>neizod's speculation</title>
      <link rel="self" href="https://neizod.github.io/feed.xml"/>
      <link rel="alternate" href="https://neizod.dev/"/>
    </source>
  </entry>
  <entry>
    <id>urn:uuid:ecf61d46-0dcc-5669-8977-b2c82679ff46</id>
    <title>Geometry Expedition 2026</title>
    <updated>2026-06-05T16:59:59.000Z</updated>
    <author>
      <name>neizod's speculation</name>
    </author>
    <published>2026-06-05T16:59:59.000Z</published>
    <link rel="alternate" href="https://neizod.dev/2026/06/05/cu-geometry-xpd-2026.html"/>
    <category term="Thai"/>
    <content type="html">&lt;p&gt;สืบเนื่องจากชาวคณิตจุฬาฯได้จัดเวิร์กช็อปเกี่ยวกับการใช้โปรแกรมทางคณิตศาสตร์มาช่วยแก้ปัญหาเชิงเรขาคณิต ก็เลยลงทะเบียนแวะเวียนไปทักทายซักหน่อย รอบนี้พิเศษตรงที่มี&lt;a href="https://facebook.com/grittin.nuntasombat.77"&gt;กฤติน&lt;/a&gt;ซึ่งเป็นรุ่นน้องตรีควบโทในแลปที่สนใจด้านเรขาฯเดินทางมาร่วมงานด้วย&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;&lt;img src="https://feeds.llun.dev/media/18ad118668ac7198db7a2e7149a05c3f36473f83514608dd00e336dc57ba8e88.jpg" alt="" /&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;งานนี้ส่วนใหญ่จะใช้ Mathematica เป็นหลัก ซึ่งทางจุฬาฯก็ได้เตรียมคอมพิวเตอร์ในห้องแลปที่ติดตั้งโปรแกรมไว้ให้แล้ว โดยในเวิร์กช็อปครั้งนี้เราได้ไปเล่นกับ&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;ทรงตันต่างๆ เช่น เพลโต อาร์คิมิดีส จอห์นสัน&lt;/li&gt;
  &lt;li&gt;&lt;a href="https://en.wikipedia.org/wiki/Inversive_geometry"&gt;อินเวอร์สวงกลม&lt;/a&gt; $OP \times OP’ = r^2$&lt;/li&gt;
  &lt;li&gt;ปัญหาต่างๆที่เกี่ยวกับพื้นที่ปิดทับที่เล็กที่สุด&lt;/li&gt;
&lt;/ol&gt;

&lt;blockquote&gt;
  &lt;p&gt;&lt;img src="https://feeds.llun.dev/media/bf7000a6789d02d34e949fa9fec6d0214e8563e0ab524b1da0f97a8b0dc18bb5.jpg" alt="" /&gt;&lt;/p&gt;

  &lt;p&gt;ความมหัศจรรย์ของทรงสิบสองหน้า&lt;/p&gt;
&lt;/blockquote&gt;

&lt;blockquote&gt;
  &lt;p&gt;&lt;img src="https://feeds.llun.dev/media/3d17ee6e3268f01f07d96d20325e39125c72e0f68da05ed7a1b1ede995df5e23.jpg" alt="" /&gt;&lt;/p&gt;

  &lt;p&gt;ภาพถ่ายมุมสูงจากกล้องอาจารย์วัชริน แสดงให้เห็นผู้ร่วมงานที่กำลังเคร่งเครียดกับการแก้ปัญหา&lt;/p&gt;
&lt;/blockquote&gt;

&lt;blockquote&gt;
  &lt;p&gt;&lt;img src="https://feeds.llun.dev/media/b2656f81cb1f451ff9285c95fd55d54770ea518e98785bf76f5c11d5153e3332.jpg" alt="" /&gt;&lt;/p&gt;

  &lt;p&gt;ภาพหมู่ผู้ร่วมงานจากเพจทางการคณิตจุฬาฯ ตัดต่อเพิ่มผู้ร่วมงานที่ไม่สะดวกร่วมงานในช่วงเย็น&lt;/p&gt;
&lt;/blockquote&gt;

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

&lt;p&gt;ขอบคุณอาจารย์&lt;a href="https://facebook.com/wacharin.wichiramala"&gt;วัชริน&lt;/a&gt;และทีมงานคณิตจุฬาฯทุกท่านที่ร่วมกันจัดงานนี้ขึ้นมาครับ 🙏&lt;/p&gt;</content>
    <source>
      <title>neizod's speculation</title>
      <link rel="self" href="https://neizod.github.io/feed.xml"/>
      <link rel="alternate" href="https://neizod.dev/"/>
    </source>
  </entry>
  <entry>
    <id>urn:uuid:d10698af-bc9b-506c-9cd2-20a0613d560d</id>
    <title>ทำเว็บ Notepad มาฝากครับ</title>
    <updated>2026-06-04T13:34:28.000Z</updated>
    <author>
      <name>iannnnn</name>
    </author>
    <published>2026-06-04T13:34:28.000Z</published>
    <link rel="alternate" href="https://iannnnn.com/2026/3455"/>
    <category term="Thai"/>
    <content type="html">&lt;p&gt;วันนี้จะจดอะไรสักอย่างไวๆ&lt;/p&gt;



&lt;p&gt;เปิดแอป Google Keep ก็รู้สึกว่าสร้างขยะ (คือผมชอบมานั่งจัดระเบียบมันให้สะอาดๆ น่ะ โรคจิตพอสมควร)&lt;/p&gt;



&lt;p&gt;จะเข้าเว็บ Notepad ต่างๆ ที่ bookmark ไว้ ก็ลืมชื่อ 5555555555 รู้สึกว่ามันจะมีป้ายโฆษณาหรือปุ่มสักอย่างที่ดึงดูดความสนใจเราเกินไป&lt;/p&gt;



&lt;p&gt;คือแค่จะจด จะร่างข้อความน่ะ พิมพ์เสร็จ ก๊อปปี้แล้วก็ไป ไม่เอาอะไรแล้ว&lt;/p&gt;



&lt;p&gt;เอ๊ะเขียนเองก็ได้นี่หว่า! เลยเปิด Gemini (แบบฟรีด้วยนะวันนี้) พิมพ์สั่งมันไป 1 นาที ให้มันเจนโค้ดอีกครึ่งนาที เสร็จแล้ว พระเจ้า ฉันดีใจที่เกิดทันยุคนี้&lt;/p&gt;



&lt;figure&gt;
&lt;figure&gt;&lt;img loading="lazy" width="473" height="1024" src="https://feeds.llun.dev/media/ef662c23a1ca0202cad66024b82a7a6aa60f11ce0fac230f2514fbf0452ed9be.png" alt="" srcset="https://feeds.llun.dev/media/ef662c23a1ca0202cad66024b82a7a6aa60f11ce0fac230f2514fbf0452ed9be.png 473w, https://feeds.llun.dev/media/ec5fb2db5c725d4d26952e7b12dd85e774e93227f255298c78f935fdc96c45d7.png 138w, https://feeds.llun.dev/media/ae5f56bf7e3a6f833961160f72e2b0ae0c05f9d33cedd7c3a9cff574c8b52646.png 768w, https://feeds.llun.dev/media/e69a0c662f9af166df8b0bea1b2e676268cb5b96b479aff535e3311551a11ca7.png 709w, https://feeds.llun.dev/media/2dbf0b1e643305b5c30f52d807d84ba8b665391bb1d1576d85e272581d1942f0.png 945w, https://feeds.llun.dev/media/b4603eacfba08b7412dcb34f0f953f215452f9080ecf36ee05f20bea98058098.png 1080w" /&gt;&lt;/figure&gt;



&lt;figure&gt;&lt;img loading="lazy" width="473" height="1024" src="https://feeds.llun.dev/media/414b2a41cab438dc6390f4449ccfeaf28f15602b6fe1b16fcfb6eb5eff9bffca.png" alt="" srcset="https://feeds.llun.dev/media/414b2a41cab438dc6390f4449ccfeaf28f15602b6fe1b16fcfb6eb5eff9bffca.png 473w, https://feeds.llun.dev/media/22f87d89c3d4759bce42a302cd88f73d2e57f453621e876ddc6973563f4f33d8.png 138w, https://feeds.llun.dev/media/ae5dbfcb33d779dafec992d03743c51f1fa9b03daae6fefe1837b221ba26092c.png 768w, https://feeds.llun.dev/media/eaadb40c197b321b68c8fefd8c9c516cffc7cdaa956f581dd083298b0041667b.png 709w, https://feeds.llun.dev/media/d5338c425cff68693ee3ef9f10bb618eca30db53909a7232da242accc3c59253.png 945w, https://feeds.llun.dev/media/0812f833fec118daa35462f2a4e742ba2486f56a7bc7987dd556a3a8ba567b88.png 1080w" /&gt;&lt;/figure&gt;
&lt;figcaption&gt;Screenshots&lt;/figcaption&gt;&lt;/figure&gt;



&lt;p&gt;ลองใช้ดู&lt;/p&gt;



&lt;p&gt;&lt;strong&gt;Notepad&lt;br /&gt;&lt;a href="https://anndo.com/n/" target="_blank"&gt;anndo.com/n&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;



&lt;ul&gt;
&lt;li&gt;เว็บนี้ (ทำเป็น webapp ได้) ไม่มีอะไรเลย เป็นหน้าจอโล่งๆ สะอาดและเร็ว&lt;/li&gt;



&lt;li&gt;สลับ dark/light mode ได้&lt;/li&gt;



&lt;li&gt;มีปุ่มเคลียร์ และปุ่มก๊อปปี้ข้อความ&lt;/li&gt;



&lt;li&gt;ไม่ต้องล็อกอินอะไรเลย เปิดมาคราวหน้าก็ยังคงมีข้อความนี้อยู่ในเครื่อง&lt;/li&gt;
&lt;/ul&gt;



&lt;p&gt;นึกได้ตอนเขียนบล็อกนี้ว่า เอ๊ะถ้าล็อกอินแล้วให้มันเซฟข้อความไว้ใช้ข้ามเครื่องได้ล่ะ คงดี!&lt;/p&gt;



&lt;p&gt;แต่ก็หยุดไว้ทันที เพราะถ้าใส่อะไรเข้าไปอีก มันก็จะไม่รู้สึกเบาแล้ว เอาเท่านี้พอ&lt;/p&gt;</content>
    <source>
      <title>iannnnn.com</title>
      <link rel="self" href="https://iannnnn.com/feed"/>
      <link rel="alternate" href="https://iannnnn.com"/>
    </source>
  </entry>
  <entry>
    <id>urn:uuid:cb892aeb-e867-519d-a436-129d91bdc3ca</id>
    <title>WordPress Plugin : WP Simple Search and Replace</title>
    <updated>2026-05-31T16:22:13.000Z</updated>
    <author>
      <name>iannnnn</name>
    </author>
    <published>2026-05-31T16:22:13.000Z</published>
    <link rel="alternate" href="https://iannnnn.com/2026/3450"/>
    <category term="Thai"/>
    <content type="html">&lt;p&gt;ปลั๊กอินตัวนี้เกิดจากความต้องการอัปเดตข้อมูลทีละเยอะๆ ในคราวเดียว จากผู้เขียนโพสต์คนเดียวกัน ใช้ในสถานการณ์ที่เว็บฟอนต์เจอ เช่น เจ้าของฟอนต์คนนี้เปลี่ยนที่อยู่โซเชียล ตู้ม มานั่งไล่แก้เลย ร้อยกว่าโพสต์ มันจะเหนื่อยเอานะ&lt;/p&gt;



&lt;p&gt;ก็เลยเกิดเป็น &lt;a href="https://drive.google.com/open?id=1q_p--oq7QxN19JVgL1WJmEPregWWUZ_8&amp;amp;usp=drive_fs" target="_blank"&gt;WP Simple Search and Replace&lt;/a&gt; ขึ้นมา&lt;/p&gt;



&lt;p&gt;พอติดตั้งเสร็จ เข้าไปในเมนู Tools &amp;gt; Search &amp;amp; Replace ก็จะเจอหน้าตายังงี้&lt;/p&gt;



&lt;figure&gt;&lt;img loading="lazy" width="1024" height="803" src="https://feeds.llun.dev/media/6b8cb5be425b9bf6b2bfa36ed8a492c05cdc785a44f607d17c478607cc88b3cc.png" alt="" srcset="https://feeds.llun.dev/media/6b8cb5be425b9bf6b2bfa36ed8a492c05cdc785a44f607d17c478607cc88b3cc.png 1024w, https://feeds.llun.dev/media/f1dcec4c83f0b2479acaffedf2fc7c4fc30d00294f27f9cd4e6f59f7b8c8ba0d.png 300w, https://feeds.llun.dev/media/b578431aa7b6e8f9b9e7d3e57040c405a3129d55d12cebd242b0f15d9a84ff1b.png 768w, https://feeds.llun.dev/media/906d6338e8a183bc8089a626dac7d5ed6c21290b0621d559e7161c54e99f94f8.png 1536w, https://feeds.llun.dev/media/13388052f343020c361e1967a7536d3bb4b9e7cee168aeb83996515a604b1d09.png 1702w" /&gt;&lt;/figure&gt;



&lt;p&gt;ก็กรอกไปเลยว่าจะให้ค้นอะไร แก้เป็นอะไร จากใคร&lt;/p&gt;



&lt;p&gt;จะแก้เป็นข้อความหรือแก้เป็นโค้ดก็ได้ ใส่เงื่อนไขตัวแปรได้ แถมยังมีโหมดพรีวิวด้วยนะ คือขอค้นก่อนว่ามันอยู่ในโพสต์ไหนบ้าง ถ้าโอเคก็กดรันได้เลย &lt;/p&gt;</content>
    <source>
      <title>iannnnn.com</title>
      <link rel="self" href="https://iannnnn.com/feed"/>
      <link rel="alternate" href="https://iannnnn.com"/>
    </source>
  </entry>
  <entry>
    <id>urn:uuid:b111d65e-db1b-57c7-99f7-55dcab3e0d8e</id>
    <title>WordPress Theme : minimal-photoblog</title>
    <updated>2026-05-18T11:43:42.000Z</updated>
    <author>
      <name>iannnnn</name>
    </author>
    <published>2026-05-18T11:43:42.000Z</published>
    <link rel="alternate" href="https://iannnnn.com/2026/3439"/>
    <category term="Thai"/>
    <content type="html">&lt;p&gt;เนื่องจากเราย้าย photoblog “ตีนใหม่หัดปั่น” มาจาก Tumblr (ที่มันช้าและ flow ยุบยิบเหลือเกิน) มาที่บ้านใหม่ใต้หลังคาของตัวเอง (&lt;a href="https://ride.iannnnn.com/" target="_blank"&gt;ride.iannnnn.com&lt;/a&gt;) เพื่อการคอนโทรลทุกอย่างได้ 100% ก็เลยทำธีมให้น้องซะหน่อย&lt;/p&gt;



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



&lt;p&gt;ซึ่งก่อนยุค เไ นี้เราพยายามหาธีมแบบ minimal มาใช้เท่าไหร่ มันก็ยังไม่ตอบโจทย์ตัวเอง เลยอัญเชิญวาทะของท่าน สส.มาร์คมาใช้ครับ “อยากได้ต้องทำเอง”&lt;/p&gt;



&lt;p&gt;ปรับแต่ง รื้อ จูนอยู่วันนึง ก็เสร็จออกมาเป็นธีมชื่อ &lt;strong&gt;minimal-photoblog&lt;/strong&gt; ครับ&lt;br /&gt;และเพื่อเป็นการบูชาครู ขอ &lt;a href="https://drive.google.com/drive/folders/1NyhjRZHxqsRqJjg-nS9Ym2rWPYfxom17?usp=sharing" target="_blank"&gt;แจกให้ดาวน์โหลดได้ฟรี&lt;/a&gt;เช่นเคย&lt;/p&gt;



&lt;figure&gt;&lt;img loading="lazy" width="1600" height="1460" src="https://feeds.llun.dev/media/a4779c1af3cbf01227281b4a1cbe7ee0c16369ee231a33c54af0c33eb0590114.webp" alt="" srcset="https://feeds.llun.dev/media/a4779c1af3cbf01227281b4a1cbe7ee0c16369ee231a33c54af0c33eb0590114.webp 1600w, https://feeds.llun.dev/media/e06924eb92ee06e53d8e099525fc6f5831a3dd631f60c5a44c8f0a3f310e092d.webp 300w, https://feeds.llun.dev/media/5e83984bd854a4a74b939781b97f92b6b7facbb6f7bc56525b8512411dd5b9c8.webp 1024w, https://feeds.llun.dev/media/20a4293c3ec8ad88b2757648f50f0348ea41cbf1c0544362a3b15962ddfc34b2.webp 768w, https://feeds.llun.dev/media/13128deb401cffbfeff597a40ebeeb1d27ac18a9bac8c4a073d161248b1b5222.webp 1536w" /&gt;&lt;figcaption&gt;หน้าตาเป็นงี้ครับ เป็นภาพเรียงๆ กัน มีแค่วันที่และแคปชัน กดดูภาพใหญ่ได้&lt;/figcaption&gt;&lt;/figure&gt;



&lt;figure&gt;&lt;img loading="lazy" width="1282" height="2262" src="https://feeds.llun.dev/media/001f64882181ca7ea944f6f76ca0e9ac81bf8419e52ad170b517f3cf1e5d0ae6.webp" alt="" srcset="https://feeds.llun.dev/media/001f64882181ca7ea944f6f76ca0e9ac81bf8419e52ad170b517f3cf1e5d0ae6.webp 1282w, https://feeds.llun.dev/media/6140a14486e8c68c953dfab1b927d7a5ff8bc4233636fdd3ac579b85202b9d00.webp 170w, https://feeds.llun.dev/media/25ac62d31b5f2f0ea86332fd24b0a1b11fcbb335c211e11256ab70b5a47dbe6d.webp 580w, https://feeds.llun.dev/media/5c9eb15b7b1dfe4926b40b41988d796013f217c55310820db83866e38ee75bab.webp 768w, https://feeds.llun.dev/media/6d0109cfe5af1b30170792df271a67e7cb575c7d84f02396c6d9c47272f7a752.webp 871w, https://feeds.llun.dev/media/525aa9f40e1a8162b70dd9bac31e3b72b0053d43853ec2e03cce80c7517f20bb.webp 1161w" /&gt;&lt;figcaption&gt;ขี้เกียจแคปในมือถือ เอางี้ละกัน&lt;/figcaption&gt;&lt;/figure&gt;



&lt;figure&gt;&lt;img loading="lazy" width="1600" height="1092" src="https://feeds.llun.dev/media/a5b52cb7dca8f59ec94f71d1d5a53a60e48a65791664dc081433a24d32006634.webp" alt="" srcset="https://feeds.llun.dev/media/a5b52cb7dca8f59ec94f71d1d5a53a60e48a65791664dc081433a24d32006634.webp 1600w, https://feeds.llun.dev/media/893f68a0a59c0431b593eb4bde12e759acc668d0abe7993adb256a95c1458acb.webp 300w, https://feeds.llun.dev/media/7bfe9bad1c15a7a79c07fb2183054eba1248809a0411906dac00e8306adafb52.webp 1024w, https://feeds.llun.dev/media/fe20ffc45996b001aa9a1a43f20e2599e38054eb2ac20a68136c6c046c780c04.webp 768w, https://feeds.llun.dev/media/dbb9055b25a8860c6d1dcc9e8346829785439fc8f372f62f32ee00562802e86f.webp 1536w" /&gt;&lt;figcaption&gt;หน้าดูรูปแบบใหญ่ๆ ถ้าล็อกอินก็จะเห็นปุ่ม edit และ delete ง่ายๆ เลย&lt;/figcaption&gt;&lt;/figure&gt;



&lt;figure&gt;&lt;img loading="lazy" width="1600" height="2040" src="https://feeds.llun.dev/media/3dfc217f69fefe8373a16952a715851576202382e418c3e2b880f733d49942f3.webp" alt="" srcset="https://feeds.llun.dev/media/3dfc217f69fefe8373a16952a715851576202382e418c3e2b880f733d49942f3.webp 1600w, https://feeds.llun.dev/media/eafa0b4704baa2c72868841ba1aad9eb80b3dde223472a7ab35cc58bd24a55b8.webp 235w, https://feeds.llun.dev/media/2c2a0271c4cee6641cdb7041c2f6efc2d3cfb6952ac59de9da021cfcbb81ca5e.webp 803w, https://feeds.llun.dev/media/9144545aed0659f855a39c35033a8e926d9b2f74e9109a00e7586cb4ab81c05f.webp 768w, https://feeds.llun.dev/media/f7694326fbc0ade6c5d4b90b87452743ac3a1a84bc7ed8e8df01102f74d97302.webp 1205w" /&gt;&lt;figcaption&gt;ถ้าใส่รูปมากกว่า 1 รูป ก็จะเลื่อนดูซ้ายขวาได้&lt;/figcaption&gt;&lt;/figure&gt;



&lt;figure&gt;&lt;img loading="lazy" width="1224" height="1344" src="https://feeds.llun.dev/media/89c1af6c97ed8d6b7cdadee0684855d0188ff4bcf2db24cf21751ac9ce1e5c5e.webp" alt="" srcset="https://feeds.llun.dev/media/89c1af6c97ed8d6b7cdadee0684855d0188ff4bcf2db24cf21751ac9ce1e5c5e.webp 1224w, https://feeds.llun.dev/media/ccfcd0bf653350d93447acfb1c418d0add6c485ce99de6a79268f4bcd212ceb6.webp 273w, https://feeds.llun.dev/media/04a744d924fd507cf75cd6cd6a9ad3419212abe880d4093309f4570ab48b995a.webp 933w, https://feeds.llun.dev/media/89729b3f9ffc52bb33ca3efe6f7abc2b14216d6eeed40fa79b840a670dff5a22.webp 768w" /&gt;&lt;figcaption&gt;หน้า Compose ก็ตัดทุกอย่างออกหมด เหลือแค่นี้ ไวมาก ง่ายมาก&lt;/figcaption&gt;&lt;/figure&gt;



&lt;p&gt;สอนการเพิ่มวิธีการติดตั้งหน้า Compose สำหรับคนใช้ WordPress ไม่คล่องครับ (ถ้าไม่อยากใช้ก็ไม่ต้องทำ)&lt;/p&gt;



&lt;ol&gt;
&lt;li&gt;เอาไฟล์ &lt;code&gt;page-new.php&lt;/code&gt; ไปใส่ในโฟลเดอร์ธีม&lt;/li&gt;



&lt;li&gt;เข้าไปที่หลังบ้าน WordPress &lt;code&gt;Pages&lt;/code&gt; -&amp;gt; &lt;code&gt;Add New Page&lt;/code&gt;&lt;/li&gt;



&lt;li&gt;ตั้งชื่อหน้าว่าอะไรก็ได้ (เช่น &lt;strong&gt;Compose&lt;/strong&gt;)&lt;/li&gt;



&lt;li&gt;มองหาเมนู &lt;strong&gt;Template&lt;/strong&gt; ด้านขวามือ ให้เลือกเป็น &lt;strong&gt;New Post&lt;/strong&gt; แล้วกด Publish&lt;/li&gt;



&lt;li&gt;เวลาจะโพสต์ ก็แค่เข้าไปที่เว็บคุณตามด้วยลิงก์ชื่อเพจนั้น (เช่น &lt;code&gt;iannnnn.com/compose&lt;/code&gt;)&lt;/li&gt;
&lt;/ol&gt;



&lt;p&gt;อ้อ หน้า Compose นี่ ถ้าเรา Add to Home Screen บนมือถือ ก็จะได้เป็น “แอปโพสต์บล็อก” ที่เร็วสุดๆ 1 ตัวครับ (ใส่ favicon ได้ด้วย)&lt;/p&gt;



&lt;p&gt;นอกจากนี้แล้ว ขอโฆษณาสิ่งที่เขียนในโปรเจกต์เดียวกันนี้เมื่อเย็นวานอีก เป็นปลั๊กอิน 3 ตัว&lt;/p&gt;



&lt;ol&gt;
&lt;li&gt;&lt;a href="https://iannnnn.com/2026/3431"&gt;WordPress Plugin : Move from Tumblr&lt;/a&gt; เอาไว้ย้ายบ้านจาก Tumblr มา WordPress&lt;/li&gt;



&lt;li&gt;&lt;a href="https://iannnnn.com/2026/3426"&gt;WordPress Plugin : Delete All Post&lt;/a&gt; เอาไว้ลบโพสต์ทุกโพสต์หายในปุ่มเดียว (อันตรายนะเนี่ย)&lt;/li&gt;



&lt;li&gt;&lt;a href="https://iannnnn.com/2026/3435"&gt;WordPress Plugin : Convert Classic Posts to Native Blocks&lt;/a&gt; แปลง Classic Format เป็นระบบ Block ที่ทำให้แก้ไขปรับแต่งอะไรๆ ง่ายบน WordPress&lt;/li&gt;
&lt;/ol&gt;



&lt;p&gt;แจกฟรีหมดเลย มีอะไรสงสัย หรือแนะนำ ทวีตมาถามได้ที่ &lt;a href="https://x.com/iannnnn"&gt;@iannnnn&lt;/a&gt;&lt;/p&gt;</content>
    <source>
      <title>iannnnn.com</title>
      <link rel="self" href="https://iannnnn.com/feed"/>
      <link rel="alternate" href="https://iannnnn.com"/>
    </source>
  </entry>
  <entry>
    <id>urn:uuid:746fdd7b-f8d4-5b9a-b37e-0f06e432e17b</id>
    <title>WordPress Plugin : Convert Classic Posts to Native Blocks</title>
    <updated>2026-05-17T13:40:41.000Z</updated>
    <author>
      <name>iannnnn</name>
    </author>
    <published>2026-05-17T13:40:41.000Z</published>
    <link rel="alternate" href="https://iannnnn.com/2026/3435"/>
    <category term="Thai"/>
    <content type="html">&lt;p&gt;ทำปลั๊กอินมาแจกอีกแล้ว สามตัวในวันเดียวเลย ด้วยความเห่อ&lt;/p&gt;



&lt;p&gt;คือบางทีเวลาเรา import blog post จากที่อื่น (เช่นอย่างเราตอนนี้คือ Tumblr) จะพบว่าบางทีโค้ดมันไม่ได้มาตรฐานของ WordPress มันก็จะแสดงเป็น Classic Blocks ซึ่งอาจจะทำให้มือไม้คัน นอนไม่หลับได้&lt;/p&gt;



&lt;p&gt;ก็ใช้ตัวนี้แปลงซะ : &lt;strong&gt;&lt;a href="https://drive.google.com/open?id=1hJpfZKkHKsQyw4ULLMuFtMTS-AEBr3GT&amp;amp;usp=drive_fs" target="_blank"&gt;Convert Classic Posts to Native Blocks&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;



&lt;figure&gt;&lt;img loading="lazy" width="1024" height="352" src="https://feeds.llun.dev/media/ba54d26b8887fbbc91833c31f02daabbfb2578db2438f1307fcfa907a2f37b01.png" alt="" srcset="https://feeds.llun.dev/media/ba54d26b8887fbbc91833c31f02daabbfb2578db2438f1307fcfa907a2f37b01.png 1024w, https://feeds.llun.dev/media/55a028c27df2b46a6c661feac8ee81dc8f07a07f8dc5590a28a98ca4e4bbfcd0.png 300w, https://feeds.llun.dev/media/52df76ccff903957404d2e857b447ef1cf553500a4723e4cf28d5ee143daceec.png 768w, https://feeds.llun.dev/media/9ca98cb767db569e9f07aac028279b1bb4c5000d6533416d423f534006275537.png 1340w" /&gt;&lt;/figure&gt;



&lt;p&gt;กดตุ่มเดียวมันก็จะหั่นๆ ซอยๆ ให้ เป็นบล็อกแบบที่ WordPress ชอบ ทีนี้ก็กดแก้ไขอะไรๆ ง่ายละ&lt;/p&gt;



&lt;p&gt;ต่อมา เราพบว่ามันมีปัญหานิดนึงตรงที่บางทีมันติดแท็กหรือค่าอะไรแปลกๆ มาด้วย ก็ให้คลีนซะ ด้วยการสร้างปุ่มที่ 2 ขึ้นมา&lt;/p&gt;



&lt;figure&gt;&lt;img loading="lazy" width="1024" height="578" src="https://feeds.llun.dev/media/de3b54b153f226594f02aea9cc40ce84c0b33406734cb402f5c78e6b1de0a3bc.png" alt="" srcset="https://feeds.llun.dev/media/de3b54b153f226594f02aea9cc40ce84c0b33406734cb402f5c78e6b1de0a3bc.png 1024w, https://feeds.llun.dev/media/6ae536ac1f3e2076a24e297316327261e3374f8fea192aa7ec55cdf67f7180e4.png 300w, https://feeds.llun.dev/media/9c34f842cd2357af2ac04aa6c684d3891331f980377c4fe3d5806051113eca98.png 768w, https://feeds.llun.dev/media/899471dc73363ad3d9ecf328bef993dc7e20162bc316bc4285a8575b7c35d085.png 1240w" /&gt;&lt;/figure&gt;



&lt;p&gt;มันจะล้างค่าที่ error ให้สะอาด จบละ&lt;/p&gt;



&lt;p&gt;กดทีเดียวแปลงทั้งเว็บเลย ถ้าไม่พอใจหรืออยากแก้ไขก็โหลดไปแก้เอาเอง เดี๋ยวนี้ เไ มันช่วยได้หมดละ&lt;/p&gt;</content>
    <source>
      <title>iannnnn.com</title>
      <link rel="self" href="https://iannnnn.com/feed"/>
      <link rel="alternate" href="https://iannnnn.com"/>
    </source>
  </entry>
  <entry>
    <id>urn:uuid:3e6a75c2-3bb6-5a70-a69e-48eba3e6584b</id>
    <title>เรื่องเงิน</title>
    <updated>2026-01-01T15:09:44.000Z</updated>
    <author>
      <name>lewcpe</name>
    </author>
    <published>2026-01-01T15:09:44.000Z</published>
    <link rel="alternate" href="https://lewcpe.com/blog/archives/2353/money/"/>
    <category term="Thai"/>
    <content type="html">&lt;p&gt;คิดไว้นานแล้วว่าจดแนวทางการจัดการเงินของตัวเองเอาไว้ ก่อนจบปีเลยต้องจัดให้จบเสียที&lt;/p&gt;



&lt;h2&gt;ให้ยืม&lt;/h2&gt;



&lt;p&gt;เรื่องแรกคือการยืมเงิน แนวคิดคือต้องแยกการลงทุนด้วยการให้ยืม/ปล่อยกู้ ออกจากการให้ยืมด้วยความสัมพันธ์ ไม่ว่าจะเป็นเพื่อน ญาติ หรือคนรู้จักอื่นๆ&lt;/p&gt;



&lt;blockquote&gt;
&lt;p&gt;หากให้ยืมด้วยความสัมพันธ์ต้องถือว่าเงินก้อนนั้นหายไปแล้วทั้งก้อน&lt;/p&gt;
&lt;/blockquote&gt;



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



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



&lt;p&gt;การค้ำประกันเท่ากับการให้ยืม คิดเหมือนกัน วงเงินค้ำประกันเท่าไหร่ก็เท่ากับเตรียมให้ไปเลยเท่าวงเงิน ถ้าไม่พร้อมให้ก็ไม่ควรค้ำ&lt;/p&gt;



&lt;h2&gt;ใช้เงิน&lt;/h2&gt;



&lt;p&gt;แยกระหว่างการจ่ายเพื่อความหรูหราฟุ่มเฟือย และการปรับปรุงคุณภาพชีวิตออกจากกัน และพยายามจ่ายเพื่อปรับปรุงคุณภาพชีวิตก่อนเสมอ การปรับปรุงคุณภาพชีวิต มี 3 อย่างหลักๆ ความปลอดภัย, สุขอนามัย, และเวลา&lt;/p&gt;



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



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



&lt;h2&gt;ค่าใช้จ่าย&lt;/h2&gt;



&lt;p&gt;เราควรคิดค่าใช้จ่ายของเราเป็น 2 ระดับ ระดับไม่อนาถ และระดับสบาย&lt;/p&gt;



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



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



&lt;h2&gt;สินทรัพย์&lt;/h2&gt;



&lt;p&gt;หลายคนมักพยายามแยกกระเป๋า เงินลงทุน เงินฉุกเฉิน เงินออม ฯลฯ ออกจากกันแล้วพยายามใช้สิ่งต่างๆ แยกกัน ส่วนตัวแล้วไม่ชอบการแบ่งเงินแบบนั้นนัก สินทรัพย์ก็คือสินทรัพย์ เราสามารถมองเป็นผืนเดียวกันได้ทั้งหมด ว่าเรามีความมั่งคั่งรวมเท่าใด&lt;/p&gt;



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



&lt;p&gt;แม้จะมองสินทรัพย์เป็นความมั่งคั่งรวมผืนเดียวกันไปหมด แต่เราควรมีสินทรัพย์ใกล้เงินสดที่แปลงเป็นเงินได้ภายใน  24 ชั่วโมง เอาไว้เพียงพอสำหรับการใช้จ่ายขั้นต่ำสัก 6 เดือนเผื่อฉุกเฉินหรือมากกว่านั้น&lt;/p&gt;



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



&lt;h2&gt;ดอกเบี้ย&lt;/h2&gt;



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



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



&lt;p&gt;โดยรวมแนวคิดเหล่านี้ก็คงเป็นแค่แนวคิด จดโน้ตไว้เผื่อจะมีประโยชน์กับคนอื่นๆ ครับ&lt;/p&gt;</content>
    <source>
      <title>LewCPE's Blog</title>
      <link rel="self" href="http://lewcpe.com/blog/feed"/>
      <link rel="alternate" href="https://lewcpe.com/blog"/>
    </source>
  </entry>
  <entry>
    <id>urn:uuid:9c31742e-c13c-5c45-8d28-3b4bdd628a1e</id>
    <title>🎵 ESP32 + Bluetooth Speaker เล่นเพลงผ่าน A2DP</title>
    <updated>2025-07-19T09:22:12.000Z</updated>
    <author>
      <name>thanapon.tap</name>
    </author>
    <published>2025-07-19T09:22:12.000Z</published>
    <link rel="alternate" href="https://thanapon.info/esp32-bluetooth-speaker-sender/?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=esp32-bluetooth-speaker-sender"/>
    <category term="Thai"/>
    <content type="html">&lt;hr /&gt;



&lt;h2&gt;&lt;img src="https://feeds.llun.dev/media/5bb1d8c0341b27299576ef98cb26d041777b48021f9e6334c95d89c33998b696.png" alt="🌟" /&gt; มาทำอะไรกันวันนี้นะ?&lt;/h2&gt;



&lt;p&gt;เชื่อว่าหลายๆคนคงจะเคยมีปัญหาตอนที่อยากเล่นเพลงจากมือถือไปที่ลำโพง Bluetooth กันไม่น้อยแน่ๆ แต่บางทีก็อยากมีอะไรที่ &lt;strong&gt;ควบคุมได้มากกว่านี้&lt;/strong&gt; หน่อย เช่น เล่นไฟล์เสียงจากเซิร์ฟเวอร์เอง หรือสั่งงานผ่าน API&lt;/p&gt;



&lt;p&gt;วันนี้เลยขอแนะนำ &lt;strong&gt;ESP32 Bluetooth Speaker Sender&lt;/strong&gt; ซึ่งเป็นโปรเจคที่สนุกมากๆ สำหรับการสร้างระบบเล่นเสียงไร้สายที่เราสามารถควบคุมผ่าน Web Interface และ REST API ได้เลย!&lt;/p&gt;



&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;แต่เดี๋ยวก่อนนน ทำไมต้องยุ่งยากขนาดนี้ล่ะ?&lt;/strong&gt; &lt;img src="https://feeds.llun.dev/media/f3d73e973a86040aa97392216379d904b01de0a621c4779d71c3fc360cdaf9d9.png" alt="🤔" /&gt;&lt;/p&gt;
&lt;/blockquote&gt;



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



&lt;p&gt;Github: &lt;a href="https://github.com/toygame/ESP32-Bluetooth-Speaker-Sender?tab=readme-ov-file" target="_blank"&gt;https://github.com/toygame/ESP32-Bluetooth-Speaker-Sender?tab=readme-ov-file&lt;/a&gt;&lt;/p&gt;



&lt;hr /&gt;



&lt;h2&gt;&lt;img src="https://feeds.llun.dev/media/e51ca01ae203c6f333185ecac6b8c2d7b5467bb4cd3c9db47ffd35481baf8846.png" alt="🎯" /&gt; จริงๆ แล้วมันทำอะไรได้บ้างนะ?&lt;/h2&gt;



&lt;h3&gt;&lt;img src="https://feeds.llun.dev/media/9f4518ea214ac3a725a0882cf6520f66f1f0581ad5374c57b7adbc1ded4271c0.png" alt="🔊" /&gt; &lt;strong&gt;เรื่องเล่นเสียงเนี่ย&lt;/strong&gt;&lt;/h3&gt;



&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;รองรับไฟล์ WAV&lt;/strong&gt;: เล่นไฟล์เสียง 44.1kHz, 16-bit, Stereo PCM ได้เลย (คุณภาพดีมาก!)&lt;/li&gt;



&lt;li&gt;&lt;strong&gt;Bluetooth A2DP Source&lt;/strong&gt;: ส่งเสียงไปที่ลำโพง Bluetooth แบบไร้สาย เหมือนมือถือเลย&lt;/li&gt;



&lt;li&gt;&lt;strong&gt;Streaming แบบ Real-time&lt;/strong&gt;: อ่านไฟล์จาก SPIFFS แล้วส่งทีละนิด ไม่กิน RAM มากจนเคอร์แตก &lt;img src="https://feeds.llun.dev/media/9c495966213a5c7eec8d6119af7c4e9f060644a87902db68f30e49bcbf784c48.png" alt="😅" /&gt;&lt;/li&gt;



&lt;li&gt;&lt;strong&gt;ประหยัด Memory&lt;/strong&gt;: ไม่ต้องโหลดไฟล์ทั้งก้อนลง RAM หรอก เครื่องเล็กๆ รับไหวแน่ๆ&lt;/li&gt;
&lt;/ul&gt;



&lt;h3&gt;&lt;img src="https://feeds.llun.dev/media/9a243b9a2b69039214a545aac784f24f5287531f5aadf786ee41c8acae61808c.png" alt="🌐" /&gt; &lt;strong&gt;ส่วน Web Interface ที่เท่ห์มาก&lt;/strong&gt;&lt;/h3&gt;



&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Responsive Design&lt;/strong&gt;: ใช้ได้ทั้งมือถือและคอมพิวเตอร์ ใช้ง่ายมาก!&lt;/li&gt;



&lt;li&gt;&lt;strong&gt;Real-time Status&lt;/strong&gt;: ดูสถานะแบบ real-time ได้ รู้ว่าเครื่องกำลังทำอะไรอยู่&lt;/li&gt;



&lt;li&gt;&lt;strong&gt;Manual Refresh&lt;/strong&gt;: เอา auto-refresh ออกแล้ว เพราะมันทำให้ watchdog timeout (เจ็บปวดมา &lt;img src="https://feeds.llun.dev/media/24185a11ac0e54948da0d39e2de1e5bc372fb2a7c5697544135bddf5895871da.png" alt="🥲" /&gt;)&lt;/li&gt;
&lt;/ul&gt;



&lt;h3&gt;&lt;img src="https://feeds.llun.dev/media/27af1cfe05adb6da97c3f91c95a0402857e8e3a22e0371bdec62aa24439a7e78.png" alt="🔗" /&gt; &lt;strong&gt;REST API ที่ใช้ง่าย&lt;/strong&gt;&lt;/h3&gt;



&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Play Control&lt;/strong&gt;: สั่งเล่น/หยุดเสียงผ่าน API ได้เลย&lt;/li&gt;



&lt;li&gt;&lt;strong&gt;Volume Control&lt;/strong&gt;: ปรับเสียง 0-100% แบบง่ายๆ ไม่ต้องคิดว่า Bluetooth มันใช้ 0-127&lt;/li&gt;



&lt;li&gt;&lt;strong&gt;Status Monitoring&lt;/strong&gt;: เช็คสถานะระบบได้ตลอดเวลา ว่าเครื่องยังอยู่มั้ย 555&lt;/li&gt;



&lt;li&gt;&lt;strong&gt;Flow Control&lt;/strong&gt;: ป้องกันการเล่นซ้อนกัน ไม่ให้เสียงมันปั่นป่วน&lt;/li&gt;
&lt;/ul&gt;



&lt;h3&gt;&lt;img src="https://feeds.llun.dev/media/86ac8ac3a5d8ded1d1036ae060e363bc16bb1e34df526a8cc546254ace0729f8.png" alt="📡" /&gt; &lt;strong&gt;WiFi ที่เชื่อมต่อเองได้&lt;/strong&gt;&lt;/h3&gt;



&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Auto-Connect&lt;/strong&gt;: ใส่ WiFi password ครั้งเดียว แล้วมันจะจำเอง&lt;/li&gt;



&lt;li&gt;&lt;strong&gt;Web Server&lt;/strong&gt;: เปิด HTTP Server พอร์ต 80 ใช้ได้เลย ไม่ต้องใส่พอร์ตแปลกๆ&lt;/li&gt;



&lt;li&gt;&lt;strong&gt;ใช้ใน LAN&lt;/strong&gt;: เข้าถึงผ่าน IP ในบ้าน สะดวกมาก ไม่ต้องพึ่ง internet&lt;/li&gt;
&lt;/ul&gt;



&lt;hr /&gt;



&lt;h2&gt;&lt;img src="https://feeds.llun.dev/media/67199c24221063aad1ffe35f86be3a38becf2b0adff66b158c925217efea3bc6.png" alt="🛠" /&gt; ลงมือทำกันเลยดีกว่า!&lt;/h2&gt;



&lt;h3&gt;&lt;strong&gt;&lt;img src="https://feeds.llun.dev/media/182edc03d920d9431e8b34a9c4d9f81c0568b86b9d4b473a38c988adbabb6fc9.png" alt="📋" /&gt; เตรียมของก่อนเริ่มนะ:&lt;/strong&gt;&lt;/h3&gt;



&lt;pre&gt;&lt;code&gt;✅ ESP32 Development Board (จริงๆ ใช้อันไหนก็ได้ แต่แนะนำ DevKit v1)
✅ Bluetooth Speaker (ต้องรองรับ A2DP นะ ปกติลำโพงมือถือก็ได้แล้ว)
✅ MicroSD Card (optional แต่ถ้าอยากใส่เพลงเยอะๆ ก็เอามาด้วย)
✅ USB Cable สำหรับเสียบโปรแกรม (อันเดียวกับที่ชาร์จมือถือ Android)
✅ WiFi ที่ใช้ได้ในบ้าน
&lt;/code&gt;&lt;/pre&gt;



&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;เฮ้ย ไม่มี MicroSD Card ได้มั้ย?&lt;/strong&gt; ได้สิ! ESP32 มี SPIFFS ให้ใช้ ใส่ไฟล์เสียงได้ประมาณ 4MB เลยนะ&lt;/p&gt;
&lt;/blockquote&gt;



&lt;h3&gt;&lt;strong&gt;&lt;img src="https://feeds.llun.dev/media/97c498f1674e82b74d4e980c9bd7692922e5a6d909fac984c74328f246e26753.png" alt="💾" /&gt; เตรียมไฟล์เสียงก่อน:&lt;/strong&gt;&lt;/h3&gt;



&lt;pre&gt;&lt;code&gt;&lt;em&gt;# 1. สร้างโฟลเดอร์ data/ (ใน project ของเรานะ)&lt;/em&gt;
mkdir data
&lt;em&gt;# 2. ใส่ไฟล์ play1.wav เข้าไป&lt;/em&gt;
&lt;em&gt;# 🚨 สำคัญ: ต้องเป็น 44.1kHz, 16-bit, Stereo PCM เท่านั้น!&lt;/em&gt;
&lt;em&gt;# ถ้าไฟล์ไม่ใช่ format นี้ มันจะเล่นไม่ได้ หรือเสียงแตก 😵‍💫&lt;/em&gt;
cp your_audio.wav data/play1.wav
&lt;em&gt;# 3. อัปโหลดไฟล์ไปที่ ESP32&lt;/em&gt;
pio run --target uploadfs
&lt;/code&gt;&lt;/pre&gt;



&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Pro tip:&lt;/strong&gt; ถ้าอยากแปลงไฟล์เสียง แนะนำใช้ Audacity ฟรีดี ใช้ง่าย!&lt;/p&gt;
&lt;/blockquote&gt;



&lt;h3&gt;&lt;strong&gt;&lt;img src="https://feeds.llun.dev/media/df1f5d75b101408214ffb93ef48e1d37b4e03b9eb3593f95d67550d2b9941b84.png" alt="⚙" /&gt; แก้ไขโค้ดนิดหน่อย:&lt;/strong&gt;&lt;/h3&gt;



&lt;pre&gt;&lt;code&gt;&lt;em&gt;// src/main.cpp&lt;/em&gt;
void setup() {
    Serial.begin(115200);
    &lt;em&gt;// ใส่ชื่อ WiFi กับรหัสผ่านของบ้านเรา&lt;/em&gt;
    controller.setWiFiCredentials("YourWiFi", "YourPassword");
    &lt;em&gt;// ตั้งชื่อ Bluetooth (จะแสดงเวลาจับคู่กับลำโพง)&lt;/em&gt;
    controller.setBluetoothDeviceName("AL-01");
    &lt;em&gt;// ระบุไฟล์เสียงที่จะเล่น&lt;/em&gt;
    controller.setAudioFile("/play1.wav");
    controller.setVolume(80); &lt;em&gt;// เริ่มที่ 80% ดีนะ ไม่ดังจนแตกใส&lt;/em&gt;
    &lt;em&gt;// ตั้งให้ส่งสถานะทุก 10 วินาที&lt;/em&gt;
    controller.setStatusUpdateInterval(10000);
}
&lt;/code&gt;&lt;/pre&gt;



&lt;h3&gt;&lt;strong&gt;&lt;img src="https://feeds.llun.dev/media/84a5adc12584dc46f13d6a3f01bc4864951b168efe41305d7a93971d94259fc7.png" alt="🚀" /&gt; ทดสอบเลย:&lt;/strong&gt;&lt;/h3&gt;



&lt;pre&gt;&lt;code&gt;&lt;em&gt;# 1. Build แล้ว upload firmware&lt;/em&gt;
pio run --target upload
&lt;em&gt;# 2. เปิด Serial Monitor ดูการทำงาน&lt;/em&gt;
pio device monitor
&lt;em&gt;# 3. รอดู IP Address ใน Serial Monitor&lt;/em&gt;
&lt;em&gt;# แล้วเข้าไปที่ http://192.168.1.xxx/ ใน browser&lt;/em&gt;
&lt;/code&gt;&lt;/pre&gt;



&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;หมายเหตุ:&lt;/strong&gt; ถ้า upload ไม่ได้ ลองกดปุ่ม BOOT บน ESP32 ค้างไว้ระหว่าง upload นะ &lt;img src="https://feeds.llun.dev/media/3497088b50de68966c4a1858de5a7319121e208024da7c9954996850d84cc8a1.png" alt="😉" /&gt;&lt;/p&gt;
&lt;/blockquote&gt;



&lt;hr /&gt;



&lt;h2&gt;&lt;img src="https://feeds.llun.dev/media/989de0e5c0e987ebf0ad34d8dfe76a3ded1fc34f8cd7267d08a70845b8a12f21.png" alt="💻" /&gt; มาลองใช้งานกันดูสิ!&lt;/h2&gt;



&lt;h3&gt;&lt;strong&gt;&lt;img src="https://feeds.llun.dev/media/46855f558cd45a29495a77bfe7464e95778fdb8be6c47b812d5d9675d4190589.png" alt="🎮" /&gt; หน้าเว็บหลักสวยๆ&lt;/strong&gt;&lt;/h3&gt;



&lt;p&gt;พอเข้าไปที่ IP Address ของ ESP32 แล้วจะเจอกับหน้าเว็บสวยๆ แบบนี้:&lt;/p&gt;



&lt;pre&gt;&lt;code&gt;🎵 ESP32 Audio Player
Web-controlled Bluetooth Audio Streaming
[▶ Play Audio] [⏹ Stop Audio] [📊 Check Status] [🔄 Refresh]
System Information
├── Audio Status: ⏸ STANDBY
├── Volume: 🔊 80%
├── Free Memory: 45,678 bytes
├── IP Address: 192.168.1.100
└── WiFi Signal: -45 dBm
&lt;/code&gt;&lt;/pre&gt;



&lt;h3&gt;&lt;strong&gt;&lt;img src="https://feeds.llun.dev/media/c634d307abeb09bb8d66361986e9b38d2356d61df7ff901a420a524c0886b883.png" alt="🎛" /&gt; ลองกดปุ่มต่างๆ ดูสิ:&lt;/strong&gt;&lt;/h3&gt;



&lt;h4&gt;&lt;strong&gt;1. กดเล่นเสียง&lt;/strong&gt;&lt;/h4&gt;



&lt;pre&gt;&lt;code&gt;คลิก [▶ Play Audio] แล้วลำโพงจะเริ่มส่งเสียงออกมา! 🎵
→ ESP32 จะส่งสัญญาณผ่าน Bluetooth ไปหาลำโพง
→ Status จะเปลี่ยนเป็น "🎵 PLAYING" ให้ดู
→ ถ้าลำโพงยังไม่ได้จับคู่ มันจะบอกว่าไม่ได้เชื่อมต่อนะ
&lt;/code&gt;&lt;/pre&gt;



&lt;h4&gt;&lt;strong&gt;2. หยุดเล่น&lt;/strong&gt;&lt;/h4&gt;



&lt;pre&gt;&lt;code&gt;คลิก [⏹ Stop Audio] ก็หยุดทันที
→ เสียงจะหยุดเลย ไม่ต้องรอให้เพลงจบ
→ Status กลับไปเป็น "⏸ STANDBY"
→ พร้อมรับคำสั่งใหม่ได้เลย
&lt;/code&gt;&lt;/pre&gt;



&lt;h4&gt;&lt;strong&gt;3. เช็คสถานะ&lt;/strong&gt;&lt;/h4&gt;



&lt;pre&gt;&lt;code&gt;คลิก [📊 Check Status] จะได้ข้อมูลเพิ่มเติม
→ ดู Memory ที่เหลือ (ถ้าต่ำกว่า 10KB มันจะเตือนนะ)
→ เช็คการเชื่อมต่อ WiFi และ Bluetooth
→ ดูความแรงสัญญาณ WiFi ด้วย
&lt;/code&gt;&lt;/pre&gt;



&lt;h4&gt;&lt;strong&gt;4. รีเฟรชแบบ Manual&lt;/strong&gt;&lt;/h4&gt;



&lt;pre&gt;&lt;code&gt;คลิก [🔄 Refresh] เพื่ออัปเดตข้อมูล
→ เราเอา auto-refresh ออกแล้ว เพราะมันทำให้ watchdog timeout
→ กดเองดีกว่า ประหยัด resources ด้วย 😅
&lt;/code&gt;&lt;/pre&gt;



&lt;hr /&gt;



&lt;h2&gt;&lt;img src="https://feeds.llun.dev/media/0d0d121e14944a9f290c9f3fc9c11036a65507769ae3bbdd9d126777403bb78b.png" alt="🔌" /&gt; REST API สำหรับคนที่ชอบเล่น curl&lt;/h2&gt;



&lt;h3&gt;&lt;strong&gt;&lt;img src="https://feeds.llun.dev/media/86ac8ac3a5d8ded1d1036ae060e363bc16bb1e34df526a8cc546254ace0729f8.png" alt="📡" /&gt; สั่งงานผ่าน API แบบโปรๆ&lt;/strong&gt;&lt;/h3&gt;



&lt;p&gt;เออ ใครที่เป็น developer คงอยากใช้ API มากกว่ากดปุ่มใน browser อ่ะนะ? เอาล่ะ มาลองเล่นกัน!&lt;/p&gt;



&lt;h4&gt;&lt;strong&gt;เริ่มเล่นเสียง:&lt;/strong&gt;&lt;/h4&gt;



&lt;pre&gt;&lt;code&gt;curl -X GET http://192.168.1.100/play1
&lt;em&gt;# มันจะตอบกลับมาแบบนี้:&lt;/em&gt;
&lt;em&gt;# ✅ 200: "Audio playback started!" (เล่นได้แล้ว!)&lt;/em&gt;
&lt;em&gt;# ⚠ 409: "Audio already playing - request skipped" (เล่นอยู่แล้วจ้า ข้ามไป)&lt;/em&gt;
&lt;em&gt;# ❌ 500: "Failed to start audio playback" (เล่นไม่ได้ มีบางอย่างผิดพลาด)&lt;/em&gt;
&lt;em&gt;# ❌ 503: "Low memory - service temporarily unavailable" (RAM เหลือน้อย รอหน่อย)&lt;/em&gt;
&lt;/code&gt;&lt;/pre&gt;



&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;สังเกตมั้ย?&lt;/strong&gt; ถ้าเราส่ง API ซ้ำขณะที่มันกำลังเล่นอยู่ มันจะ&lt;strong&gt;ข้ามไป&lt;/strong&gt;ทันที ไม่ให้เสียงมันชนกัน &lt;img src="https://feeds.llun.dev/media/4c8abdb46c9f131ba3e2817ed393061972064245b4c5289764607687c8523408.png" alt="👌" /&gt;&lt;/p&gt;
&lt;/blockquote&gt;



&lt;h4&gt;&lt;strong&gt;หยุดเล่นเสียง:&lt;/strong&gt;&lt;/h4&gt;



&lt;pre&gt;&lt;code&gt;curl -X GET http://192.168.1.100/stop
&lt;em&gt;# Response:&lt;/em&gt;
&lt;em&gt;# ✅ 200: "Audio playback stopped!" (หยุดแล้ว!)&lt;/em&gt;
&lt;em&gt;# ⚠ 409: "Audio not playing - nothing to stop" (มันไม่ได้เล่นอยู่นี่นา)&lt;/em&gt;
&lt;em&gt;# ❌ 500: "Audio player not available" (ระบบเสียงมีปัญหา)&lt;/em&gt;
&lt;/code&gt;&lt;/pre&gt;



&lt;h3&gt;&lt;strong&gt;&lt;img src="https://feeds.llun.dev/media/9f4518ea214ac3a725a0882cf6520f66f1f0581ad5374c57b7adbc1ded4271c0.png" alt="🔊" /&gt; ปรับเสียงผ่าน API&lt;/strong&gt;&lt;/h3&gt;



&lt;h4&gt;&lt;strong&gt;ดูเสียงตอนนี้:&lt;/strong&gt;&lt;/h4&gt;



&lt;pre&gt;&lt;code&gt;curl -X GET http://192.168.1.100/volume
&lt;em&gt;# จะได้:&lt;/em&gt;
{
  "volume": 80,
  "range": "0-100"
}
&lt;/code&gt;&lt;/pre&gt;



&lt;h4&gt;&lt;strong&gt;ปรับระดับเสียง:&lt;/strong&gt;&lt;/h4&gt;



&lt;pre&gt;&lt;code&gt;curl -X POST http://192.168.1.100/volume 
     -d "volume=75"
&lt;em&gt;# สำเร็จ:&lt;/em&gt;
{
  "status": "success",
  "volume": 75
}
&lt;em&gt;# ใส่ผิด (เกิน 100 หรือติดลบ):&lt;/em&gt;
{
  "error": "Volume must be 0-100"
}
&lt;/code&gt;&lt;/pre&gt;



&lt;h3&gt;&lt;strong&gt;&lt;img src="https://feeds.llun.dev/media/dc7b57b1473890d8f661c4cf71765ba34b64ba8df48828df159f50f4c84c68ee.png" alt="📊" /&gt; เช็คสถานะแบบละเอียด&lt;/strong&gt;&lt;/h3&gt;



&lt;pre&gt;&lt;code&gt;curl -X GET http://192.168.1.100/status
&lt;em&gt;# ได้ข้อมูลแบบนี้:&lt;/em&gt;
Status: PLAYING
Volume: 75%
Free Heap: 42,156 bytes
WiFi IP: 192.168.1.100
WiFi Signal: -42 dBm
Bluetooth: Connected
&lt;/code&gt;&lt;/pre&gt;



&lt;p&gt;&lt;strong&gt;ข้อมูลเพียบเลย!&lt;/strong&gt; ดู Memory, WiFi, Bluetooth ได้หมด เหมาะสำหรับ monitoring หรือสร้าง dashboard&lt;/p&gt;



&lt;h3&gt;&lt;strong&gt;&lt;img src="https://feeds.llun.dev/media/9d7fab69a6d660a59c706be4885548c2be27e3ea181d647832bbc9015381d31b.png" alt="💡" /&gt; API Integration Examples:&lt;/strong&gt;&lt;/h3&gt;



&lt;h4&gt;&lt;strong&gt;Python Script:&lt;/strong&gt;&lt;/h4&gt;



&lt;pre&gt;&lt;code&gt;import requests
import time
ESP32_IP = "http://192.168.1.100"
def play_audio():
    response = requests.get(f"{ESP32_IP}/play1")
    print(f"Play: {response.text}")
def set_volume(level):
    response = requests.post(f"{ESP32_IP}/volume", 
                           data={"volume": level})
    print(f"Volume: {response.json()}")
def get_status():
    response = requests.get(f"{ESP32_IP}/status")
    print(f"Status: {response.text}")
&lt;em&gt;# Usage Example&lt;/em&gt;
set_volume(60)
play_audio()
time.sleep(2)
get_status()
&lt;/code&gt;&lt;/pre&gt;



&lt;h4&gt;&lt;strong&gt;JavaScript (Web App):&lt;/strong&gt;&lt;/h4&gt;



&lt;pre&gt;&lt;code&gt;class ESP32Controller {
    constructor(ip) {
        this.baseURL = `http://${ip}`;
    }
    async playAudio() {
        const response = await fetch(`${this.baseURL}/play1`);
        return await response.text();
    }
    async setVolume(level) {
        const response = await fetch(`${this.baseURL}/volume`, {
            method: 'POST',
            body: `volume=${level}`,
            headers: {
                'Content-Type': 'application/x-www-form-urlencoded'
            }
        });
        return await response.json();
    }
}
&lt;em&gt;// Usage&lt;/em&gt;
const esp32 = new ESP32Controller('192.168.1.100');
esp32.setVolume(80).then(console.log);
esp32.playAudio().then(console.log);
&lt;/code&gt;&lt;/pre&gt;



&lt;hr /&gt;



&lt;h2&gt;&lt;img src="https://feeds.llun.dev/media/df1f5d75b101408214ffb93ef48e1d37b4e03b9eb3593f95d67550d2b9941b84.png" alt="⚙" /&gt; เทคนิคการทำงานภายใน&lt;/h2&gt;



&lt;pre&gt;&lt;code&gt;📦 System Architecture
├── 🎵 AudioPlayer
│   ├── WAV file parsing
│   ├── PCM data streaming  
│   └── Playback state management
├── 📡 BluetoothAudioSource
│   ├── A2DP protocol handling
│   ├── Audio data callback
│   └── Volume control (0-127)
├── 🌐 WiFiManager
│   ├── Connection management
│   ├── IP assignment
│   └── Signal monitoring
├── 🔗 WebServerManager
│   ├── HTTP server (AsyncTCP)
│   ├── REST API endpoints
│   └── Web UI rendering
└── 🎛 AudioPlayerController
    ├── System coordination
    ├── Component lifecycle
    └── Status monitoring
&lt;/code&gt;&lt;/pre&gt;



&lt;h3&gt;&lt;strong&gt;&lt;img src="https://feeds.llun.dev/media/1976a6824b8e29d9e0980ce268e5e60f02d5077548c02a5d4f811858cbacc495.png" alt="📻" /&gt; Audio Streaming Technology&lt;/strong&gt;&lt;/h3&gt;



&lt;h4&gt;&lt;strong&gt;WAV File Processing:&lt;/strong&gt;&lt;/h4&gt;



&lt;pre&gt;&lt;code&gt;bool AudioPlayer::prepareAudioFile(const char* filename) {
    &lt;em&gt;// 1. เปิดไฟล์จาก SPIFFS&lt;/em&gt;
    audioFile = SPIFFS.open(filename, "r");
    &lt;em&gt;// 2. อ่าน WAV Header (44 bytes)&lt;/em&gt;
    audioFile.read(wavHeader, 44);
    &lt;em&gt;// 3. Validate Format&lt;/em&gt;
    if (strncmp((char*)wavHeader, "RIFF", 4) != 0) {
        return false;
    }
    &lt;em&gt;// 4. Extract Audio Parameters&lt;/em&gt;
    channels = *(uint16_t*)(wavHeader + 22);
    sampleRate = *(uint32_t*)(wavHeader + 24);
    bitsPerSample = *(uint16_t*)(wavHeader + 34);
    &lt;em&gt;// 5. Calculate Data Size&lt;/em&gt;
    dataSize = *(uint32_t*)(wavHeader + 40);
    return true;
}
&lt;/code&gt;&lt;/pre&gt;



&lt;h4&gt;&lt;strong&gt;Real-time PCM Streaming:&lt;/strong&gt;&lt;/h4&gt;



&lt;pre&gt;&lt;code&gt;int32_t AudioPlayer::getAudioData(AudioFrame* data, int32_t frameCount) {
    &lt;em&gt;// 1. Memory Health Check&lt;/em&gt;
    if (ESP.getFreeHeap() &amp;lt; 5000) {
        stopPlayback();
        return 0;
    }
    &lt;em&gt;// 2. Read PCM Data from SPIFFS&lt;/em&gt;
    for (int i = 0; i &amp;lt; frameCount; i++) {
        if (audioFile.available() &amp;gt;= 4) {
            &lt;em&gt;// Left Channel (16-bit)&lt;/em&gt;
            int16_t left = audioFile.read() | (audioFile.read() &amp;lt;&amp;lt; 8);
            &lt;em&gt;// Right Channel (16-bit)  &lt;/em&gt;
            int16_t right = audioFile.read() | (audioFile.read() &amp;lt;&amp;lt; 8);
            data[i].channel1 = left;
            data[i].channel2 = right;
        }
    }
    return frameCount;
}
&lt;/code&gt;&lt;/pre&gt;



&lt;h3&gt;&lt;strong&gt;&lt;img src="https://feeds.llun.dev/media/9f4518ea214ac3a725a0882cf6520f66f1f0581ad5374c57b7adbc1ded4271c0.png" alt="🔊" /&gt; Volume Mapping Algorithm&lt;/strong&gt;&lt;/h3&gt;



&lt;p&gt;ระบบใช้การแปลงค่าระดับเสียงระหว่าง User-friendly (0-100%) และ Bluetooth Protocol (0-127):&lt;/p&gt;



&lt;pre&gt;&lt;code&gt;&lt;em&gt;// User API: 0-100% → Bluetooth: 0-127&lt;/em&gt;
uint8_t AudioPlayerController::mapPercentageToVolume(uint8_t percentage) {
    if (percentage == 0) return 0;
    if (percentage &amp;gt;= 100) return 127;
    &lt;em&gt;// Linear mapping with precision&lt;/em&gt;
    return (uint8_t)((percentage * 127UL) / 100UL);
}
&lt;em&gt;// Bluetooth: 0-127 → User API: 0-100%&lt;/em&gt;
uint8_t AudioPlayerController::mapVolumeToPercentage(uint8_t value127) {
    if (value127 == 0) return 0;
    if (value127 &amp;gt;= 127) return 100;
    return (uint8_t)((value127 * 100UL) / 127UL);
}
&lt;/code&gt;&lt;/pre&gt;



&lt;hr /&gt;



&lt;h2&gt;&lt;img src="https://feeds.llun.dev/media/aebf90259ede784aec0a83fd480aa110e28a5d3b10992e2f64e899093b1b5bf8.png" alt="🛡" /&gt; การแก้ไขปัญหาและเพิ่มประสิทธิภาพ&lt;/h2&gt;



&lt;h3&gt;&lt;strong&gt;&lt;img src="https://feeds.llun.dev/media/ced86dceaafae25c890d37ac75d25ad796074943131334d4dcf5209e45d9dd82.png" alt="⏰" /&gt; Watchdog Timeout Prevention&lt;/strong&gt;&lt;/h3&gt;



&lt;p&gt;ปัญหาหลักที่พบคือ Task Watchdog Timeout จาก AsyncTCP:&lt;/p&gt;



&lt;pre&gt;&lt;code&gt;&lt;em&gt;// แก้ไขปัญหา Watchdog ใน Main Loop&lt;/em&gt;
void AudioPlayerController::update() {
    if (!systemReady) return;
    &lt;em&gt;// 🔧 Reset Watchdog Timer&lt;/em&gt;
    esp_task_wdt_reset();
    &lt;em&gt;// 📊 Periodic Status Update&lt;/em&gt;
    if (millis() - lastStatusUpdate &amp;gt; statusUpdateInterval) {
        printSystemStatus();
        lastStatusUpdate = millis();
    }
    &lt;em&gt;// ⚡ Yield to Other Tasks&lt;/em&gt;
    yield();
    delay(50); &lt;em&gt;// Reduced from 100ms&lt;/em&gt;
}
&lt;/code&gt;&lt;/pre&gt;



&lt;h4&gt;&lt;strong&gt;AsyncTCP Configuration:&lt;/strong&gt;&lt;/h4&gt;



&lt;pre&gt;&lt;code&gt;&lt;em&gt;# platformio.ini - Optimized Settings&lt;/em&gt;
build_flags =
    -D CONFIG_ASYNC_TCP_MAX_ACK_TIME=3000
    -D CONFIG_ASYNC_TCP_PRIORITY=5           &lt;em&gt;; ลด Priority&lt;/em&gt;
    -D CONFIG_ASYNC_TCP_QUEUE_SIZE=32        &lt;em&gt;; ลด Queue Size&lt;/em&gt;
    -D CONFIG_ASYNC_TCP_STACK_SIZE=8192      &lt;em&gt;; เพิ่ม Stack Size&lt;/em&gt;
    -D CONFIG_ESP_TASK_WDT_TIMEOUT_S=10      &lt;em&gt;; เพิ่ม Timeout&lt;/em&gt;
    -D CONFIG_ESP_TASK_WDT_CHECK_IDLE_TASK_CPU1=false
&lt;/code&gt;&lt;/pre&gt;



&lt;h3&gt;&lt;strong&gt;&lt;img src="https://feeds.llun.dev/media/d77ba91052911669dce3e7aac58343aaea361804101e11e366b0a1d160ee8ba8.png" alt="🔄" /&gt; Flow Control Implementation&lt;/strong&gt;&lt;/h3&gt;



&lt;p&gt;การป้องกันการเล่นเสียงซ้อนกัน:&lt;/p&gt;



&lt;pre&gt;&lt;code&gt;&lt;em&gt;// Before: ปัญหาการเล่นซ้อนกัน&lt;/em&gt;
/play1 + /play1 + /play1 → Conflict!
&lt;em&gt;// After: Flow Control&lt;/em&gt;
STANDBY ──[/play1]→ PLAYING ──[complete]→ STANDBY
                       │
                   [/stop]
                       │
                       ↓
                   STANDBY
&lt;em&gt;// Implementation:&lt;/em&gt;
if (audioPlayer-&amp;gt;getState() == PLAYING) {
    request-&amp;gt;send(409, "text/plain", 
                 "Audio already playing - request skipped");
    return; &lt;em&gt;// ข้ามการเล่นซ้อน&lt;/em&gt;
}
&lt;/code&gt;&lt;/pre&gt;



&lt;h3&gt;&lt;strong&gt;&lt;img src="https://feeds.llun.dev/media/97c498f1674e82b74d4e980c9bd7692922e5a6d909fac984c74328f246e26753.png" alt="💾" /&gt; Memory Protection&lt;/strong&gt;&lt;/h3&gt;



&lt;p&gt;ระบบป้องกันการทำงานเมื่อ Memory ต่ำ:&lt;/p&gt;



&lt;pre&gt;&lt;code&gt;&lt;em&gt;// API Level Protection&lt;/em&gt;
if (ESP.getFreeHeap() &amp;lt; 10000) {
    request-&amp;gt;send(503, "text/plain", 
                 "Low memory - service temporarily unavailable");
    return;
}
&lt;em&gt;// Audio Callback Protection  &lt;/em&gt;
if (ESP.getFreeHeap() &amp;lt; 5000) {
    Serial.printf("CRITICAL: Very low memory: %d bytesn", 
                  ESP.getFreeHeap());
    stopPlayback(); &lt;em&gt;// หยุดเล่นเพื่อคืน Memory&lt;/em&gt;
}
&lt;/code&gt;&lt;/pre&gt;



&lt;h3&gt;&lt;strong&gt;&lt;img src="https://feeds.llun.dev/media/dc7b57b1473890d8f661c4cf71765ba34b64ba8df48828df159f50f4c84c68ee.png" alt="📊" /&gt; Build Optimization&lt;/strong&gt;&lt;/h3&gt;



&lt;p&gt;การจัดการขนาด Firmware และ SPIFFS:&lt;/p&gt;



&lt;pre&gt;&lt;code&gt;# audio_partitions.csv - Custom Partition Table
nvs,      data, nvs,     0x9000,  0x5000,
otadata,  data, ota,     0xe000,  0x2000,
app0,     app,  ota_0,   0x10000, 0x1E0000,  ; ~1.9MB สำหรับ Firmware
spiffs,   data, spiffs,  0x1F0000,0x200000,  ; 2MB สำหรับไฟล์เสียง&lt;/code&gt;&lt;/pre&gt;



&lt;pre&gt;&lt;code&gt;&lt;em&gt;# Compiler Optimization&lt;/em&gt;
build_flags =
    -Os                    &lt;em&gt;; Size Optimization&lt;/em&gt;
    -ffunction-sections    &lt;em&gt;; Function-level Linking&lt;/em&gt;
    -fdata-sections        &lt;em&gt;; Data-level Linking&lt;/em&gt;
    -D CORE_DEBUG_LEVEL=0  &lt;em&gt;; Disable Debug Messages&lt;/em&gt;
&lt;/code&gt;&lt;/pre&gt;



&lt;hr /&gt;



&lt;h2&gt;&lt;img src="https://feeds.llun.dev/media/46e249146cede96b35241353495769e68df4d904f592f4fecb59e34f31d14ab4.png" alt="🎉" /&gt; สรุปมั่วๆ แต่ได้เรื่อง&lt;/h2&gt;



&lt;p&gt;&lt;strong&gt;ว้าว!&lt;/strong&gt; โปรเจค &lt;strong&gt;ESP32 Bluetooth Speaker Sender&lt;/strong&gt; นี้มันเจ๋งจริงๆ นะ ใครที่ลองทำตามแล้วคงจะรู้สึกว่า ESP32 มันเก่งกว่าที่คิดเยอะเลย!&lt;/p&gt;



&lt;h3&gt;&lt;strong&gt;&lt;img src="https://feeds.llun.dev/media/84a5adc12584dc46f13d6a3f01bc4864951b168efe41305d7a93971d94259fc7.png" alt="🚀" /&gt; เอาไปใช้ทำอะไรได้บ้าง:&lt;/strong&gt;&lt;/h3&gt;



&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;img src="https://feeds.llun.dev/media/ad6547aba0ea77d9d444a8fb36bf51bf03061dba6350735ae065c3995d880306.png" alt="🏠" /&gt; Smart Home&lt;/strong&gt;: ทำระบบเสียงในบ้าน เปิดเพลงตอนเช้าอัตโนมัติ&lt;/li&gt;



&lt;li&gt;&lt;strong&gt;&lt;img src="https://feeds.llun.dev/media/9ce2d91e23bbaa92d8090b11e265c26c3960d1502064494633d90aa31949f7a1.png" alt="🏢" /&gt; ที่ทำงาน&lt;/strong&gt;: ระบบประกาศ หรือ background music แบบควบคุมได้&lt;/li&gt;



&lt;li&gt;&lt;strong&gt;&lt;img src="https://feeds.llun.dev/media/e942ff6667fbbe51c64e3ea931f40d397723f9d43ee61164aba155c8ecbc895b.png" alt="🔬" /&gt; Prototype&lt;/strong&gt;: ต้นแบบสำหรับผลิตภัณฑ์เสียงแบบต่างๆ&lt;/li&gt;
&lt;/ul&gt;



&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;ที่สำคัญ&lt;/strong&gt; โปรเจคนี้แสดงให้เห็นว่า ESP32 ทำอะไรได้มากกว่าที่คิด แค่ตัวเล็กๆ แต่สามารถสร้างระบบ IoT ที่ซับซ้อนได้แบบเต็มๆ! &lt;img src="https://feeds.llun.dev/media/1184c0e668b8eedfe199b3a698836d0e7b24a1756361b3914ae400dafceba3f3.png" alt="💪" /&gt;&lt;/p&gt;



&lt;p&gt;&lt;strong&gt;Happy Coding ทุกคน! &lt;img src="https://feeds.llun.dev/media/9af119fdbad2a076df1a3dc116b0377155bc604a6c855041dfb204bf9a92120d.png" alt="🎵" /&gt;&lt;img src="https://feeds.llun.dev/media/4d6045ea209901a48a170b60881b703c34fc822ca50b67140875279bc2644a91.png" alt="✨" /&gt;&lt;/strong&gt;&lt;/p&gt;



&lt;p&gt;&lt;/p&gt;
&lt;/blockquote&gt;&lt;p&gt;The post &lt;a href="https://thanapon.info/esp32-bluetooth-speaker-sender/"&gt;🎵 ESP32 + Bluetooth Speaker เล่นเพลงผ่าน A2DP&lt;/a&gt; first appeared on &lt;a href="https://thanapon.info/"&gt;Thanapon&lt;/a&gt;.&lt;/p&gt;</content>
    <source>
      <title>Thanapon</title>
      <link rel="self" href="https://thanapon.info/feed/"/>
      <link rel="alternate" href="https://thanapon.info"/>
    </source>
  </entry>
  <entry>
    <id>urn:uuid:b34d6dc0-cc2e-5056-9bab-95fcb6c92ab6</id>
    <title>0263 | บั๊กตู้ชาร์จ ปตท รุ่นใหม่ๆ</title>
    <updated>2025-06-30T06:44:41.000Z</updated>
    <author>
      <name>icez</name>
    </author>
    <published>2025-06-30T06:44:41.000Z</published>
    <link rel="alternate" href="https://www.icez.net/blog/167563/0263-%e0%b8%9a%e0%b8%b1%e0%b9%8a%e0%b8%81%e0%b8%95%e0%b8%b9%e0%b9%89%e0%b8%8a%e0%b8%b2%e0%b8%a3%e0%b9%8c%e0%b8%88-%e0%b8%9b%e0%b8%95%e0%b8%97-%e0%b8%a3%e0%b8%b8%e0%b9%88%e0%b8%99%e0%b9%83%e0%b8%ab"/>
    <category term="Thai"/>
    <content type="html">&lt;p&gt;พอดีเดินทางแล้วก็ต้องใช้งานตู้ชาร์จรถครับ ล่าสุดไปทะเลาะกับตู้ชาร์จ ปตท รุ่นใหม่ๆ หน่อย ล่าสุดก็คือไอ้ตู้รุ่นนี้ ที่จะมีแขนจับที่ชาร์จห้อยลอยๆ ที่สะดวกดีนะ ยกสายง่ายขึ้นเยอะ&lt;/p&gt;
&lt;p&gt;&lt;a href="https://feeds.llun.dev/media/417e227601cc8c845d164830bb6707cb7655ecbd1e409eb00d73edf6c8588b86.jpg"&gt;&lt;img src="https://feeds.llun.dev/media/3c87c0ae894e6ed408833d2da10b77b44d84bed42605c5f2ee1dd47270379f92.jpg" alt="" width="768" height="1024" srcset="https://feeds.llun.dev/media/3c87c0ae894e6ed408833d2da10b77b44d84bed42605c5f2ee1dd47270379f92.jpg 768w, https://feeds.llun.dev/media/14625e754ffdfa009efb7cbdc0a0e58ea1de7eb2115ceb5190682a5b074fc437.jpg 225w, https://feeds.llun.dev/media/293ca8e224de989c7a4af3085756209023ed890fac78fb090c1e25177393fd49.jpg 1152w, https://feeds.llun.dev/media/417e227601cc8c845d164830bb6707cb7655ecbd1e409eb00d73edf6c8588b86.jpg 1440w" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;ปัญหาคือ &lt;strong&gt;ตู้รุ่นนี้รองรับ auto charge ครับ&lt;/strong&gt; (auto charge คือ function ที่ทำให้เราสามารถเสียบหัวจ่ายไฟของตู้ชาร์จเข้ากับรถ แล้วมันจะเริ่มชาร์จเลยโดยไม่ต้องมาวุ่นวายแสกน qrcode อะไรให้ปวดหัว)&lt;/p&gt;
&lt;p&gt;ที่เป็นปัญหาขึ้นมาเพราะ&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;รถ (โดยเฉพาะ tesla) มัน support auto charge ด้วย&lt;/li&gt;
&lt;li&gt;พอเสียบหัวไปปุ๊ป รถกับตู้เห็นว่ารองรับทั้งคู่ มันเลยพยายามเริ่มชาร์จ (ดูบนจอที่ตู้จะขึ้นว่ากำลังเริ่มชาร์จ โดยที่เรายังไม่ได้แสกน qr code)&lt;/li&gt;
&lt;li&gt;พอตู้ชาร์จคุยกับรถเสร็จ พร้อมเริ่มชาร์จ เลยยิงสัญญาณไปบอกระบบกลาง แต่ระบบกลางไม่มีข้อมูลว่าการชาร์จรถคันนี้ต้องตัดเงินกับใคร (เพราะระบบกลางของ ปตท ยังไม่รองรับ) ระบบเลยสั่งยกเลิกการชาร์จ&lt;/li&gt;
&lt;li&gt;ตู้ชาร์จเลยตัดการชาร์จ พร้อมขึ้นว่าชาร์จเสร็จแล้ว&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;แนวทางเบื้องต้นของคนใช้รถ (ระหว่างรอ ปตท. แก้)&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;อย่าเพิ่งเสียบหัวชาร์จเข้ากับรถ&lt;/li&gt;
&lt;li&gt;เปิดแอพ แสกน qr code หัวชาร์จ ให้ขึ้นหน้ากดปุ่มเริ่มชาร์จไว้ก่อน&lt;/li&gt;
&lt;li&gt;เสียบหัวชาร์จเข้ากับรถ พร้อมกับกดปุ่มเริ่มชาร์จให้ได้ภายในไม่เกิน 1 วิ ก่อนตู้กับรถจะเริ่มคุยกัน&lt;/li&gt;
&lt;li&gt;ภาวนาให้แอพส่งไปบอกระบบกลางก่อนตู้ชาร์จ&lt;/li&gt;
&lt;/ul&gt;</content>
    <source>
      <title>icez network</title>
      <link rel="self" href="https://www.icez.net/blog/feed"/>
      <link rel="alternate" href="https://www.icez.net/blog"/>
    </source>
  </entry>
  <entry>
    <id>urn:uuid:509fd8af-6613-5a94-8bda-25ab5b734282</id>
    <title>AI เขียนโค้ด</title>
    <updated>2025-03-18T01:25:43.000Z</updated>
    <author>
      <name>lewcpe</name>
    </author>
    <published>2025-03-18T01:25:43.000Z</published>
    <link rel="alternate" href="https://lewcpe.com/blog/archives/2345/ai-coding/"/>
    <category term="Thai"/>
    <content type="html">&lt;p&gt;นั่งคิดเรื่องดราม่า AI เขียนโค้ด (จริงๆ คิดก่อนหน้านั้นมาสักระยะหนึ่งแล้ว ยังคิดไม่ตก) โน้ตคร่าวๆ ไว้ก่อน&lt;/p&gt;



&lt;ul&gt;
&lt;li&gt;การใช้คอมพิวเตอร์ ไม่จำเป็นต้องเข้าใจทั้งหมด มานานแล้ว เรามี abstraction ที่หนาขึ้นเรื่อยๆ ทำงานได้ดีขึ้นเรื่อยๆ มาโดยตลอด POSIX/Linux, SQL, Assembly, Pascal, C, Python, HTML, JS, React, Excel, Notion ฯลฯ&lt;/li&gt;



&lt;li&gt;อย่างไรก็ดี การที่เรา abstract คอมพิวเตอร์ไป มักมาพร้อมกับภาพจำลอง ที่เข้าใจง่ายขึ้น ควบคุมพฤติกรรมง่ายขึ้นไปด้วย เช่น การจำกัดสิทธิ์ user ใน linux ที่เราเรียนเป็นเรื่องแรกๆ เราไม่ต้องรู้ว่าทำอย่างไร แต่ถ้าพฤติกรรมไม่ตรงมันจะกลายเป็นช่องโหว่ abstraction เหล่านี้ทำให้เรามองระบบโดยรวมง่ายขึ้น เราเขียนไฟล์ผ่าน POSIX โดยมั่นใจว่า filesystem จะไม่พัง, เราเขียน SQL โดยมั่นใจว่า file จะไม่ corrupt ภาพ abstract บางอันดีบ้างแย่บ้าง เช่น container ที่คนมักคิดว่าแยกแอปออกจากกัน แต่ในความเป็นจริงกระบวนการเจาะทะลุข้าม container ทำได้บ่อย&lt;/li&gt;



&lt;li&gt;ความผิดพลาดของ abstraction ก่อนหน้านี้เป็นความผิดของระบบ ผู้ใช้เขียนไฟล์ทะลุ user ได้เป็นความผิดของ OS, เขียน SQL แล้วไฟล์พัง เป็นความผิดของ database แม้แต่ container ก็มีความพยายามทำให้แต่ละ container แยกกันตามความคาดหวัง&lt;/li&gt;



&lt;li&gt;กระแส AI เขียนโค้ดต่างออกไป รอบนี้มนุษย์สามารถสั่งงานคอมพิวเตอร์ที่ระดับสูงมาก (ภาษาคน) แต่ไม่มีระบบ abstraction ที่ออกแบบมาเป็นอย่างดี เพื่อรองรับการใช้งาน แต่กลายเป็นว่า เราใช้ AI มาแทนคน (หรือหลายคน) มาแทนชั้นของการแปลงคำสั่งเหล่านั้นกลายเป็นโค้ดเลย กระแส AI เขียนโค้ดกลายเป็นคู่แข่งสำคัญของความพยายามพัฒนา low code ที่สร้าง abstraction ในการพัฒนาแอปในช่วงหลังด้วยซ้ำ&lt;/li&gt;



&lt;li&gt;ส่วนตัวเองเจอเองกับตัว ช่วงหลายปีที่ผ่านมาเวลาต้องการเขียนเว็บเล็กๆ ผมมักชินกับการใช้ &lt;a href="https://pocketbase.io/"&gt;pocketbase&lt;/a&gt; แต่กลายเป็นว่าปีนี้ใช้ AI เขียนโค้ดหมดเลยดีกว่า ได้โค้ดที่ flexible กว่ามาก เล็กกว่า ไม่ต้องมี endpoint ที่เราไม่เคยคิดจะใช้แต่แรก&lt;/li&gt;



&lt;li&gt;ผลที่ได้ &lt;a href="https://www.blognone.com/node/145158"&gt;คือความผิดพลาดที่เกิดขึ้นอยู่เนืองๆ&lt;/a&gt; และคงเกิดขึ้นอีกมากเมื่อเราเคยชินกับความสะดวกสบายในการใช้งานมากขึ้นเรื่อยๆ ไม่ว่าจะเป็นความผิดพลาดที่เห็นคาตา (user ใช้ agentic coder สั่งแล้วกด accept ตลอดไม่ยอมอ่าน วันดีคืนดีมันก็จะทำ data หายเอา)&lt;/li&gt;



&lt;li&gt;ถ้ายังไม่มีความเปลี่ยนแปลงอะไรเป็นพิเศษ AI ใหม่ๆ เขียนโปรแกรมเก่งขึ้นเรื่อยๆ เราได้โค้ดทีละหลายพัน หลายหมื่น (หรือหลายแสน) บรรทัด ในการสั่งไม่กี่ย่อหน้า ความผิดพลาดประหลาดๆ อาจจะน้อยลง แต่ก็ได้ความผิดพลาดที่ซับซ้อนมากขึ้นเรื่อยๆ มาแทน&lt;/li&gt;



&lt;li&gt;ความเก่งขึ้นเรื่อยๆ ของ AI เป็นความท้าทายของโปรแกรมเมอร์รุ่นนี้และรุ่นต่อไป เคยมีคำกล่าวว่า คนเราต้องการความเก่งในการดีบั๊กเป็นสองเท่าของการเขียนโค้ด ในกรณีของ AI เราต้องการโปรแกรมเมอร์ที่เก่งเป็นสองเท่าของ AI เขียนโค้ด AI โยนโค้ดมาทีละหมื่นบรรทัด อ่านคร่าวๆ แล้วก็ถูกต้องดี คอมไพล์ผ่าน แต่กลับมีกรณีที่ทำผิด บอกให้ AI แก้แล้วมันเริ่มวนไปวนมา แก้แล้วไม่หายไปสักทีก็ถึงเวลา hand off มาสู่คน คนนั้นต้องเก่งสองเท่าของ AI ทันที ช้ากว่าพันเท่าหมื่นเท่าได้ แต่ต้องเก่งกว่าสองเท่า&lt;/li&gt;



&lt;li&gt;หลังจากนี้โปรแกรมเมอร์จะถูกคาดหวัง “ความเก่งสองเท่าของ AI” ทันที เพราะ value อยู่ตรงนั้นแล้ว การที่เด็กจบใหม่สักคนหนึ่งจะทำงานง่ายๆ บางอย่างเพื่อเรียนรู้เป็นเวลาสองสามปีก่อนจะเริ่มไปแก้งานคนอื่นจะหายไป วันแรกของการทำงานคือการแก้โค้ดที่ AI เขียนมา&lt;/li&gt;



&lt;li&gt;การศึกษาควรปรับอย่างไรในโลกยุคนี้ เป็นปริศนาที่ยังไม่มีใครตอบได้ เด็กจำนวนมากชินกับการใช้ AI ทำการบ้านคงไม่ใช่ปัญหาในตัวมันเอง แต่เด็กรุ่นต่อไปต้องเจอกับความคาดหวังว่าทันทีที่เริ่มทำงาน ต้องเก่งกว่า AI (ที่พัฒนาไม่หยุด) เท่านั้น หากทำได้แย่กว่าหรือเท่ากับ AI ก็ไม่สามารถตอบได้ว่าทำไมองค์กรต้องจ้าง เราอาจจะปรับหลักสูตรให้ถีบเด็กจากหน้าผาด้วยการให้โจทย์ที่ยากเกิน AI ปัจจุบันแล้วเด็กใช้ AI ทำไปแก้ไปตลอดชีวิตมหาวิทยาลัย เด็กจำนวนมากจะกระอักแน่ แต่เด็กที่ผ่านมาได้ก็อาจจะถูกบีบด้วย AI เวอร์ชั่นต่อไปที่เก่งขึ้นทันทีที่เรียนจบ&lt;/li&gt;
&lt;/ul&gt;</content>
    <source>
      <title>LewCPE's Blog</title>
      <link rel="self" href="http://lewcpe.com/blog/feed"/>
      <link rel="alternate" href="https://lewcpe.com/blog"/>
    </source>
  </entry>
  <entry>
    <id>urn:uuid:f82b29c9-bd28-5ee6-847d-9e3ad172c5b9</id>
    <title>0262 | freeipa add replica stuck at ‘No status yet’</title>
    <updated>2025-02-18T07:25:35.000Z</updated>
    <author>
      <name>icez</name>
    </author>
    <published>2025-02-18T07:25:35.000Z</published>
    <link rel="alternate" href="https://www.icez.net/blog/167560/0262-freeipa-add-replica-stuck-at-no-status-yet"/>
    <category term="Thai"/>
    <content type="html">&lt;p&gt;reference: https://lists.fedorahosted.org/archives/list/freeipa-users@lists.fedorahosted.org/thread/OY6EC5XS54OLKBL57S3FJ3HUANWIJQPN/&lt;/p&gt;
&lt;p&gt;ipa-replica-install stuck with:&lt;/p&gt;
&lt;pre&gt;
  [26/40]: setting up initial replication
Starting replication, please wait until this has completed.
No status yet
No status yet
No status yet
No status yet
No status yet
No status yet
No status yet
No status yet
No status yet
No status yet
&lt;/pre&gt;
&lt;p&gt;step to fix&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;cancel the replication process&lt;/li&gt;
&lt;li&gt;uninstall with &lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;/usr/sbin/ipa-server-install --uninstall&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;create file ‘custom.ldif’ with content: &lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;
dn: cn=config
changetype: modify
replace: nsslapd-maxsasliosize
nsslapd-maxsasliosize: 8388608
replace: nsslapd-sasl-max-buffer-size
nsslapd-sasl-max-buffer-size: 8388608
&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;rerun ipa-replica-install by adding option ‘–dirsrv-config-file=custom.ldif’&lt;/li&gt;
&lt;/ul&gt;</content>
    <source>
      <title>icez network</title>
      <link rel="self" href="https://www.icez.net/blog/feed"/>
      <link rel="alternate" href="https://www.icez.net/blog"/>
    </source>
  </entry>
  <entry>
    <id>urn:uuid:6554d2b1-b5b4-5ec8-a26a-4d5e8cc43e02</id>
    <title>0261 | เปิด ripe-atlas probe กันเถอะ</title>
    <updated>2025-01-14T07:49:53.000Z</updated>
    <author>
      <name>icez</name>
    </author>
    <published>2025-01-14T07:49:53.000Z</published>
    <link rel="alternate" href="https://www.icez.net/blog/167557/0261-%e0%b9%80%e0%b8%9b%e0%b8%b4%e0%b8%94-ripe-atlas-probe-%e0%b8%81%e0%b8%b1%e0%b8%99%e0%b9%80%e0%b8%96%e0%b8%ad%e0%b8%b0"/>
    <category term="Thai"/>
    <content type="html">&lt;p&gt;docker-compose.yml&lt;/p&gt;
&lt;pre&gt;
services:
  ripe-atlas:
    image: jamesits/ripe-atlas:latest
    restart: always
    environment:
      RXTXRPT: "yes"
    volumes:
      - "./etc:/var/atlas-probe/etc"
      - "./status:/var/atlas-probe/status"
    cap_drop:
      - ALL
    cap_add:
      - CHOWN
      - SETUID
      - SETGID
      - DAC_OVERRIDE
      - NET_RAW
#    mem_limit: "64000000000"
#    mem_reservation: 64m
    labels:
      - "traefik.enable=false"
      - "com.centurylinklabs.watchtower.enable=true"
    logging:
      driver: json-file
      options:
         max-size: 10m
    network_mode: "host" # if possible, avoid double NAT
    # security_opt:
    #   - seccomp:unconfined
&lt;/pre&gt;
&lt;p&gt;รันแล้วจะได้ไฟล์ public key ใน folder ./etc/probe_key.pub เอาไปใส่ใน https://atlas.ripe.net&lt;/p&gt;</content>
    <source>
      <title>icez network</title>
      <link rel="self" href="https://www.icez.net/blog/feed"/>
      <link rel="alternate" href="https://www.icez.net/blog"/>
    </source>
  </entry>
  <entry>
    <id>urn:uuid:f7a2ae24-37a9-50f0-8b31-cdc368311903</id>
    <title>ลองทำ DDNS บน Cloudflare DNS ง่ายๆ</title>
    <updated>2025-01-11T14:37:49.000Z</updated>
    <author>
      <name>thanapon.tap</name>
    </author>
    <published>2025-01-11T14:37:49.000Z</published>
    <link rel="alternate" href="https://thanapon.info/cloudflare-ddns/?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=cloudflare-ddns"/>
    <category term="Thai"/>
    <content type="html">&lt;p&gt;เชื่อว่าหลายๆคนคงจะมีปัญหาในการจัดการ IP กันไม่น้อยแน่ๆ เพราะแต่ก่อนเวลาถ้าเราจะทำการ Forward port เราก็แค่ไป Config ที่ Router แล้วก็เข้าผ่าน Public IP ที่ทาง ISP เช่น AIS, True ให้มาก็จบ แต่หลังๆเหมือนพวก ISP มันก็จะมีการทำ NAT นั้นนี้บลาๆๆๆ ทำให้ตอนที่เราจะใช้ Public IP ก็จะใช้ไม่ได้ละจะต้องไปทำ DDNS ผ่าน ISP อื่นๆ ซึ่งก็อาจจะตอบโจทย์บางคนละกันครับ ส่วนผมขอ Host เองดีกว่า 5555 แต่มันก็ยังคงมีประเด็นเรื่อง Public IP เหมือนกัน แล้วเราจะทำยังไงดีนะ&lt;/p&gt;



&lt;h2&gt;แค่จ่ายก็จบ!&lt;/h2&gt;



&lt;p&gt;ใช่ครับของ ISP ที่ผมใช้เองที่บ้านตอนนี้จะเป็น AIS ซึ่งจากที่โทรคุยกับทาง Call center ถ้าเกิดว่าเราอยากได้ Public IP ของเรานั้น อาจจะต้องจ่ายเงินเพิ่มไงหล่ะ ประมาณเดือนละ 100 นี้หล่ะถ้าผมจำไม่ผิดนะ &lt;img src="https://feeds.llun.dev/media/437d1d6b0008685d0feeb203090fdd74836df647a29a66c3b9b8579a548a991a.png" alt="🥹" /&gt; หรือไม่ก็ไปใช้ DNS ที่เขา Provide ให้ซึ่งจะเป็น &lt;a href="https://www.thddns.net/login" target="_blank"&gt;https://www.thddns.net/login&lt;/a&gt;&lt;/p&gt;



&lt;p&gt;แต่ประเด็นต่อมาถ้าได้ Public IP แล้วก็จบใช่ไหมล่ะ แต่ไอ้เจ้า IP เนี้ย มันชอบเปลี่ยนไปเรื่อยๆแล้วแต่ว่า ISP จะแจกเป็น IP อะไรให้เรา ช่างแ_่งงงงงงงง!!!!! &lt;/p&gt;



&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;สุดท้ายเลยเป็นที่มา ตูไม่จำไอพีมันละ จำ Domain ง่ายกว่าเยอะ &lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;



&lt;h2&gt;DDNS คืออะไรนะ&lt;/h2&gt;



&lt;blockquote&gt;
&lt;p&gt;DDNS (Dynamic Domain Name System) คือระบบที่ช่วยอัปเดตที่อยู่ IP ของโดเมนโดยอัตโนมัติเมื่อ IP มีการเปลี่ยนแปลง เหมาะสำหรับเครือข่ายที่ใช้ IP แบบ Dynamic ทำให้สามารถเข้าถึงอุปกรณ์หรือบริการภายในเครือข่าย เช่น กล้องวงจรปิดหรือเซิร์ฟเวอร์ จากภายนอกได้โดยไม่ต้องใช้ IP คงที่ ช่วยลดความยุ่งยากในการจัดการและประหยัดค่าใช้จ่ายในการใช้งาน IP แบบ Static&lt;/p&gt;
&lt;/blockquote&gt;



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



&lt;h2&gt;พระเอกของเราคือ &lt;a href="https://github.com/oznu"&gt;oznu&lt;/a&gt;/&lt;strong&gt;&lt;a href="https://github.com/oznu/docker-cloudflare-ddns"&gt;docker-cloudflare-ddns&lt;/a&gt;&lt;/strong&gt;&lt;/h2&gt;



&lt;p&gt;โปรเจกต์ `docker-cloudflare-ddns` โดยผู้ใช้ GitHub ชื่อ oznu เป็นอิมเมจ Docker ขนาดเล็กที่ช่วยให้ใช้ Cloudflare เป็นผู้ให้บริการ DDNS ได้&lt;/p&gt;



&lt;p&gt;– รองรับสถาปัตยกรรมหลายแบบ เช่น amd64, ARM, และ ARM64&lt;/p&gt;



&lt;p&gt;– ทำงานบนอุปกรณ์ต่าง ๆ รวมถึง Raspberry Pi&lt;/p&gt;



&lt;p&gt;– ใช้งานง่ายด้วยการตั้งค่าผ่าน environment variables&lt;/p&gt;



&lt;h3&gt;วิธีการใช้งาน&lt;/h3&gt;



&lt;p&gt;1. ติดตั้ง Docker: ตรวจสอบให้แน่ใจว่าคุณได้ติดตั้ง Docker บนระบบของคุณแล้ว&lt;/p&gt;



&lt;p&gt;2. สร้างโทเค็น API ของ Cloudflare:&lt;/p&gt;



&lt;p&gt;   – เข้าสู่ระบบ Cloudflare&lt;/p&gt;



&lt;p&gt;   – ไปที่หน้าโปรไฟล์และเลือก “API Tokens”&lt;/p&gt;



&lt;figure&gt;&lt;img width="1024" height="542" src="https://localhost:54526/wp-content/uploads/2025/01/image-6-1024x542.png" alt="" srcset="https://feeds.llun.dev/media/7363f1b3823303438923b1629a9ed9dafb053ceaa16afeba95e7f296db1944a7.png 1024w, https://feeds.llun.dev/media/e5e76c598aa7bd9d5c5df7c469f1f2873e3b90041b1862ee318c17960d35f520.png 300w, https://feeds.llun.dev/media/87b549865a73e680d8b10e3411094aeae2ab452c2f6a2509107a95b5b2e60714.png 768w, https://feeds.llun.dev/media/f4888e254fe5b38bf95c105ffbe632d754922dd7eb8053a214f81ab25502ac43.png 1536w, https://feeds.llun.dev/media/d4267fb9433140f46cbba460aea17e878fef3c82e19948f990f62370261e1934.png 2048w, https://feeds.llun.dev/media/f540e2f32fe8da61c176ced4ad573f989c9e33f4fb00206fd6c1ab11e9b9778a.png 600w" /&gt;&lt;/figure&gt;



&lt;p&gt;   – สร้างโทเค็นใหม่โดยให้สิทธิ์ดังนี้:&lt;/p&gt;



&lt;ul&gt;
&lt;li&gt;Permission: Zone &amp;gt; DNS &amp;gt; Edit&lt;/li&gt;



&lt;li&gt;Zone Resources: Include &amp;gt; Specific zone &amp;gt; {เลือก Domain ของเรา}&lt;/li&gt;
&lt;/ul&gt;



&lt;figure&gt;&lt;img loading="lazy" width="1024" height="476" src="https://localhost:54526/wp-content/uploads/2025/01/image-7-1024x476.png" alt="" srcset="https://feeds.llun.dev/media/bd6fa51d8e235bdd754e512b0109f354769d7597df3bbb943ad1ad7f0fd048b8.png 1024w, https://feeds.llun.dev/media/c31dfb4595348570f3b9f0be67b1fb626e71e4db073a9f84e95278778c42b658.png 300w, https://feeds.llun.dev/media/e7387af0c0ad59d36121191ecac0d92fd391914369d874899259394ded496878.png 768w, https://feeds.llun.dev/media/697e3c5df49eb7b5868a3aa61ca4f1e7fd1c809fbab487ff12a87af2ea555c16.png 1536w, https://feeds.llun.dev/media/3d921d0f1684edbeaf38bdd2f19eb18ed42d49d400dc76e7f20b25981ee0160c.png 2048w, https://feeds.llun.dev/media/6e344c69738ca3a395f09c6e1f9e7956047142ee19055b7b39407f371069528b.png 600w" /&gt;&lt;/figure&gt;



&lt;p&gt;   – คัดลอกโทเค็นที่สร้างขึ้นเพื่อใช้ในขั้นตอนถัดไป&lt;/p&gt;



&lt;p&gt;3. รันคอนเทนเนอร์ Docker โลดดด…&lt;/p&gt;



&lt;p&gt;   ใช้คำสั่งต่อไปนี้เพื่อรันคอนเทนเนอร์:&lt;/p&gt;



&lt;div&gt;&lt;pre&gt;&lt;code&gt;docker run \
  -e API_KEY=xxxxxxx \
  -e ZONE=example.com \
  -e SUBDOMAIN=subdomain \
  --restart=always \
  oznu/cloudflare-ddns&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;h3&gt;คำอธิบายพารามิเตอร์:&lt;/h3&gt;



&lt;p&gt;   – `API_KEY`: โทเค็น API ของ Cloudflare ที่คุณสร้างขึ้น&lt;/p&gt;



&lt;p&gt;   – `ZONE`: โดเมนหลักของคุณ (เช่น example.com)&lt;/p&gt;



&lt;p&gt;   – `SUBDOMAIN`: ซับโดเมนที่คุณต้องการอัปเดต (เช่น home สำหรับ home.example.com)&lt;/p&gt;



&lt;p&gt;   – `–restart=always`: ทำให้คอนเทนเนอร์รีสตาร์ทอัตโนมัติเมื่อระบบรีบูต&lt;/p&gt;



&lt;h3&gt;การตั้งค่าเพิ่มเติม:&lt;/h3&gt;



&lt;p&gt;– `PROXIED`: ตั้งค่าเป็น `true` หากต้องการให้ทราฟฟิกผ่าน Cloudflare CDN (ค่าเริ่มต้นคือ `false`)&lt;/p&gt;



&lt;p&gt;– `RRTYPE`: ตั้งค่าเป็น `AAAA` หากต้องการอัปเดตเรคคอร์ด IPv6 (ค่าเริ่มต้นคือ `A` สำหรับ IPv4)&lt;/p&gt;



&lt;p&gt;– `CRON`: กำหนดความถี่ในการอัปเดต (ค่าเริ่มต้นคือทุก 5 นาที)&lt;/p&gt;



&lt;h2&gt;หลังจากตั้งค่าเสร็จแล้วก็รอดูผลและทดสอบกันดูวววว&lt;/h2&gt;



&lt;p&gt;อันดับแรกต้อง Forward port จาก Router ลงมาที่เครื่อง Server ที่บ้านกันก่อน ซึ่งขอไม่ลงรายละเอียดนะคับบ&lt;/p&gt;


&lt;div&gt;
&lt;figure&gt;&lt;img loading="lazy" width="1024" height="721" src="https://localhost:54526/wp-content/uploads/2025/01/image-2-1024x721.png" alt="" srcset="https://feeds.llun.dev/media/8024f5cd5730f0e465681f81b7597359f8f8855f6ff05c732a09b0601cfe75ef.png 1024w, https://feeds.llun.dev/media/69102126bec378130182e42c2725aa7fe5202c760b564f84277171fb4bc5df92.png 300w, https://feeds.llun.dev/media/d5df6f51bc48a6aac308d60587ef667c754b9f93cc77c521060eee2fc602b9ca.png 768w, https://feeds.llun.dev/media/b21c1b26c7be9e06d2b8950dadfff74fc8ec29f81eab6d72696f13fb2995d5f0.png 1536w, https://feeds.llun.dev/media/1468a9dc97d1971029e47cb50ffc2c7ae830da13dd9529eeaa8a36db5a1c0627.png 2048w, https://feeds.llun.dev/media/b872316b6d94a8b654cbae62632bad704dd5f5a71f06234b64984f915cc4c50e.png 600w" /&gt;&lt;/figure&gt;
&lt;/div&gt;


&lt;p&gt;ตัวอย่างนี้ผมจะให้เข้ามาที่ Domain thanapon.info วิ่งเข้าไปหาเครื่อง 192.168.1.200 Port 443 ซึ่งเป็น HTTPS นะครับ&lt;/p&gt;



&lt;p&gt;ลองเช็ค nslookup ดูว่าหาเจอไหมน้าาา&lt;/p&gt;


&lt;div&gt;
&lt;figure&gt;&lt;img loading="lazy" width="728" height="274" src="https://localhost:54526/wp-content/uploads/2025/01/image-4.png" alt="" srcset="https://feeds.llun.dev/media/5eabcaf04f6de88a7793576d73830e168a91e1d1c4b48270c5b9b48a7f9b0cf9.png 728w, https://feeds.llun.dev/media/e6b04215dd34ec966220da913fca440df3518f52f71c8f3e1c3ab043ed836fc0.png 300w, https://feeds.llun.dev/media/c54d7df650f5f91dcda42c46f9484bbaae47af682fa851001e099df045c8d55d.png 600w" /&gt;&lt;/figure&gt;
&lt;/div&gt;


&lt;p&gt;อ๋าาาา เจอแล้วทีนี้ลองเอา IP ที่ resolved มาไปหาดูหน่อยสิเป็น IP ของใคร?&lt;/p&gt;


&lt;div&gt;
&lt;figure&gt;&lt;img loading="lazy" width="1024" height="685" src="https://localhost:54526/wp-content/uploads/2025/01/image-5-1024x685.png" alt="" srcset="https://feeds.llun.dev/media/706f9336b18c2ac7ff4157775e5a4f45cc7b5aeae55c941e73f6fd8ae790d212.png 1024w, https://feeds.llun.dev/media/0dab0cde0155dbc10e127e35ce741b2f716740018fa0fddf2d6649913fc23377.png 300w, https://feeds.llun.dev/media/f656e671083dffcff94f8c502beab8170bb1244b82a8c4237260807b5f3c6f33.png 768w, https://feeds.llun.dev/media/f6fcf5ef49086c73333dc775a00922b197ca0ee352e7809a48c3fe66834fc347.png 600w, https://feeds.llun.dev/media/108899a811cf9ed19c2b804d1b333c9f666fb27d4ea9c10dbb11ca876955383d.png 1492w" /&gt;&lt;/figure&gt;
&lt;/div&gt;


&lt;p&gt;&lt;strong&gt;ปรากฎว่าเป็น IP ของ Cloudflare เลยนี้น่าา ทำไมเป็นแบบนั้นนะ &lt;/strong&gt;&lt;/p&gt;



&lt;p&gt;เพราะว่าตอนที่เรา Config ตัว Cloudflare ไว้มันเป็นแบบ Proxy นะสิซึ่งข้อดีคือมันจะทำให้ แฮกเกอร์ที่ต้องการจะโจมตีเครื่อง Server ของเรานั้นมองไม่เป็น IP จริงๆ ซึ่งก็อาจจะลดความเสี่ยงที่จะเกิดการโจมตีได้ในระดับหนึ่งไงหล่ะ แต่ก็ยังมีปัญหาอยู่เหมือนกันเพราะจากที่อ่านดูเหมือน Proxy นั้นจะรองรับแค่ Web traffic ซึ่งจะเป็น HTTP/HTTPS เท่านั้นด้วย ถ้าเกิดว่าใครอยากจะให้รองรับ Protocol อื่นๆเช่น MQTT บลาๆๆ งี้ก็จะต้องปิด Proxy ด้วยนะ ใช้แค่ DNS Only ก็พอเด้อ&lt;/p&gt;



&lt;p&gt;การใช้ `docker-cloudflare-ddns` ช่วยให้คุณสามารถอัปเดตที่อยู่ IP ของซับโดเมนใน Cloudflare โดยอัตโนมัติผ่าน Docker ควรตรวจสอบการตั้งค่าและความปลอดภัยก่อนนำไปใช้งานจริง หรือหากใครมีวิธีการง่ายๆกว่านี้ ใช้ Resource ไม่เยอะมาแนะนำกันได้นะครับ &lt;/p&gt;



&lt;h2&gt;&lt;strong&gt;&lt;mark&gt;วันนี้ขอบคุณและสวัสดีปีใหม่ครับบ&lt;/mark&gt;&lt;/strong&gt; &lt;img src="https://feeds.llun.dev/media/46e249146cede96b35241353495769e68df4d904f592f4fecb59e34f31d14ab4.png" alt="🎉" /&gt; &lt;img src="https://feeds.llun.dev/media/46e249146cede96b35241353495769e68df4d904f592f4fecb59e34f31d14ab4.png" alt="🎉" /&gt; &lt;img src="https://feeds.llun.dev/media/46e249146cede96b35241353495769e68df4d904f592f4fecb59e34f31d14ab4.png" alt="🎉" /&gt; &lt;img src="https://feeds.llun.dev/media/46e249146cede96b35241353495769e68df4d904f592f4fecb59e34f31d14ab4.png" alt="🎉" /&gt;&lt;/h2&gt;



&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Network ports&lt;/strong&gt;&lt;/p&gt;



&lt;p&gt;&lt;a href="https://developers.cloudflare.com/fundamentals/reference/network-ports" target="_blank"&gt;https://developers.cloudflare.com/fundamentals/reference/network-ports&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;



&lt;blockquote&gt;
&lt;p&gt;&lt;a href="https://github.com/oznu"&gt;oznu&lt;/a&gt;/&lt;strong&gt;&lt;a href="https://github.com/oznu/docker-cloudflare-ddns"&gt;docker-cloudflare-ddns&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;



&lt;p&gt;&lt;a href="https://github.com/oznu/docker-cloudflare-ddns"&gt;https://github.com/oznu/docker-cloudflare-ddns&lt;/a&gt;&lt;/p&gt;



&lt;p&gt;&lt;/p&gt;
&lt;/blockquote&gt;&lt;p&gt;The post &lt;a href="https://thanapon.info/cloudflare-ddns/"&gt;ลองทำ DDNS บน Cloudflare DNS ง่ายๆ&lt;/a&gt; first appeared on &lt;a href="https://thanapon.info/"&gt;Thanapon&lt;/a&gt;.&lt;/p&gt;</content>
    <source>
      <title>Thanapon</title>
      <link rel="self" href="https://thanapon.info/feed/"/>
      <link rel="alternate" href="https://thanapon.info"/>
    </source>
  </entry>
  <entry>
    <id>urn:uuid:bd996008-de92-5cba-987a-73b632dd5448</id>
    <title>ภาษี</title>
    <updated>2024-12-05T15:30:50.000Z</updated>
    <author>
      <name>lewcpe</name>
    </author>
    <published>2024-12-05T15:30:50.000Z</published>
    <link rel="alternate" href="https://lewcpe.com/blog/archives/2343/tax/"/>
    <category term="Thai"/>
    <content type="html">&lt;p&gt;สองสามวันนี้การเมืองไทยมีประเด็นเรื่องภาษี คิดเรื่องนี้ไว้หลายอย่าง เลยจดรวมๆ กันมา&lt;/p&gt;



&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;การลดภาษีควรลดเป็นเครดิต:&lt;/strong&gt; ประเด็นหนึ่งที่ไม่เท่าเทียมกันอย่างมากในไทย คือการ “ลดหย่อนภาษี” แปลว่าไม่ใครจ่ายภาษีฐานไหนอยู่ ก็จะได้รับการลดหย่อน ตัดภาษีออกจากฐานสูงสุด การลดหย่อนแบบนี้ไม่ดีและไม่แฟร์ ไม่ดีเพราะคนฐานภาษีสูงๆ จะสามารถซื้อมั่วซั่วอะไรก็ได้ยังไงก็กำไรภาษี ทั้งที่การลดหย่อนควรเป็นการจูงใจให้เขาได้เลือกการลงทุนที่ดีและนำไปสู่การลงทุนอื่นๆ ต่อไป ไม่แฟร์เพราะคนที่เริ่มมีเงินเก็บบ้างฐานภาษีไม่สูงมาก กลับมีการจูงใจน้อย ทุกวันนี้คนภาษีฐานต่ำๆ โอดโอยกันว่ากองทุนที่ซื้อมายังขาดทุนกันอยู่ กาารให้เป็นเครดิตควรล็อกเป็น % ตายตัว เช่น ซื้อ RMF ลดภาษีได้ 15% ซื้อแสนนึงลดได้ 15,000 บาท ก็ลดได้เท่านี้ทุกคน ซื้อพลาดกองขาดทุนเกิน 15% ก็ขาดทุนเท่ากัน คนที่ฐานภาษีสูงมากๆ 25-35% นั้นไม่ต้องไปจูงใจเขามาก เขาก็ลงทุนกันเองเป็นอยู่แล้ว (แต่ก็ให้ควรให้เท่าๆ กันเพื่อความแฟร์)&lt;/li&gt;



&lt;li&gt;&lt;strong&gt;ฐานภาษีควรสูงกว่านี้:&lt;/strong&gt; ฐานภาษีสูงสุดของไทยอยู่ที่ 35% นั้นสูงไม่พอ ส่วนตัวมองว่าไปได้ถึง 49% สำหรับคนยอดพิรามิดสูงสุด&lt;/li&gt;



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



&lt;li&gt;&lt;strong&gt;เพิ่มฐานภาษีต่ำๆ:&lt;/strong&gt; แม้จะเลื่อนฐานภาษีได้ แต่ควรพยายามขยายฐานผู้จ่าย (ก่อนลดหย่อน) ให้มากขึ้น คนมีรายได้เกินระดับพออยู่ได้ควรต้องยื่นและต้องจ่ายในฐานต่ำมากๆ เช่น หากอยากลดภาษีให้เพิ่มฐาน 1% เข้ามาแทนที่ฐาน 5% เดิม แล้วเลื่อนฐาน 5% ออกไป คนจ่ายฐาน 1% อาจจะแทบไม่ได้จ่ายเพราะลดหย่อนต่างๆ ก็ได้คืนหมด แต่ก็ให้อยู่ในระบบภาษี ให้ต้องยื่น และอาจจะต้องจ่ายบ้างหากไม่ได้ลดหย่อนอะไรเลย&lt;/li&gt;



&lt;li&gt;&lt;strong&gt;ภาษีอื่นๆ นอกจากภาษีรายได้ ควรปรับขึ้น:&lt;/strong&gt; ภาษีมรดก ภาษีที่ดิน ภาษีลาภลอย (รถไฟฟ้า ทางด่วน ผ่านหน้าบ้าน) แม้จะมีแล้วแต่อ่อนแอมาก มีช่องโหว่และถูกไป ภาษีเชิงลงโทษอย่างพื้นที่รกร้างว่างเปล่าต้องมีปรับขึ้นไปเรื่อยๆ จนถึง 10-20% ของราคาประเมินต่อปี (ไม่จ่ายครบ X ปีให้ที่ดินตกเป็นของท้องถิ่น) พื้นที่ธุรกิจที่ปรับเป็นภาษีที่ดินแล้วกลับจ่ายถูกกว่าภาษีโรงเรือนต้องปรับกลับใหม่ให้เท่าเดิม&lt;/li&gt;



&lt;li&gt;&lt;strong&gt;VAT ขึ้นได้แต่ควรมีมาตรการชดเชย:&lt;/strong&gt; VAT ของเราถูกเกินไปและควรขึ้นมาสักพักแล้ว แต่ก็ต้องมีมาตรการช่วยเหลือ ส่วนที่เพิ่มอาจจะกันบางส่วนเข้าเป็นบัตรสวัสดิการ เปิดรอบสมัครอย่างชัดเจน มีเกณฑ์สมัครชัดเจน (เปิดยิ่งถี่ยิ่งดี ให้ดีมากคือใครเริ่มจนสมัครได้ทันที เหมือนสวัสดิการตกงานของประกันสังคม)  แทนที่ทุกวันนี้ที่ต้องรอลุ้น อันนี้ไปเลียนแบบสิงคโปร์ที่เรียกบัตรคนจนของเขาว่าบัตร GST เลยทีเดียว&lt;/li&gt;
&lt;/ul&gt;</content>
    <source>
      <title>LewCPE's Blog</title>
      <link rel="self" href="http://lewcpe.com/blog/feed"/>
      <link rel="alternate" href="https://lewcpe.com/blog"/>
    </source>
  </entry>
  <entry>
    <id>urn:uuid:d0627185-baeb-54e8-b241-24ce883fd6c2</id>
    <title>0260 | usb to serial driver สำหรับ windows arm</title>
    <updated>2024-11-04T18:59:37.000Z</updated>
    <author>
      <name>icez</name>
    </author>
    <published>2024-11-04T18:59:37.000Z</published>
    <link rel="alternate" href="https://www.icez.net/blog/167553/0260-usb-to-serial-driver-%e0%b8%aa%e0%b8%b3%e0%b8%ab%e0%b8%a3%e0%b8%b1%e0%b8%9a-windows-arm"/>
    <category term="Thai"/>
    <content type="html">&lt;blockquote&gt;&lt;p&gt;&lt;a href="https://ftdichip.com/drivers/d2xx-drivers/"&gt;D2XX Drivers&lt;/a&gt;&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;&lt;/p&gt;</content>
    <source>
      <title>icez network</title>
      <link rel="self" href="https://www.icez.net/blog/feed"/>
      <link rel="alternate" href="https://www.icez.net/blog"/>
    </source>
  </entry>
  <entry>
    <id>urn:uuid:ba89ec01-1371-5516-8262-ae8d5894e0ea</id>
    <title>[InfluxDb] สร้าง Username/Password ผ่าน influxdb-cli บน MacOS</title>
    <updated>2024-11-04T02:31:14.000Z</updated>
    <author>
      <name>thanapon.tap</name>
    </author>
    <published>2024-11-04T02:31:14.000Z</published>
    <link rel="alternate" href="https://thanapon.info/influxdb-cli-create-user/?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=influxdb-cli-create-user"/>
    <category term="Thai"/>
    <content type="html">&lt;h1&gt;InfluxDB คืออะไร?&lt;/h1&gt;



&lt;p&gt;InfluxDB เป็นฐานข้อมูลประเภท Time Series Database (TSDB) ที่ออกแบบมาเพื่อจัดการข้อมูลที่มีการเปลี่ยนแปลงตามเวลาโดยเฉพาะ เช่น:&lt;/p&gt;



&lt;ul&gt;
&lt;li&gt;ข้อมูลจากเซ็นเซอร์ต่างๆ (IoT)&lt;/li&gt;



&lt;li&gt;ข้อมูลการใช้งานระบบ (System Metrics)&lt;/li&gt;



&lt;li&gt;ข้อมูลการเข้าชมเว็บไซต์ (Web Analytics)&lt;/li&gt;



&lt;li&gt;ข้อมูลการเงินและราคาหุ้น&lt;/li&gt;
&lt;/ul&gt;



&lt;p&gt;ด้วยคุณสมบัติพิเศษที่ออกแบบมาสำหรับจัดการข้อมูลแบบ Time Series โดยเฉพาะ ทำให้ InfluxDB มีประสิทธิภาพสูงในการ:&lt;/p&gt;



&lt;ul&gt;
&lt;li&gt;บันทึกข้อมูลจำนวนมากอย่างรวดเร็ว&lt;/li&gt;



&lt;li&gt;ค้นหาและดึงข้อมูลตามช่วงเวลา&lt;/li&gt;



&lt;li&gt;จัดการพื้นที่จัดเก็บข้อมูลอัตโนมัติ&lt;/li&gt;



&lt;li&gt;รองรับการทำ Data Retention Policy&lt;/li&gt;
&lt;/ul&gt;



&lt;h2&gt;ทำไมต้องสร้าง Username/Password?&lt;/h2&gt;



&lt;p&gt;การสร้างบัญชีผู้ใช้งานใน InfluxDB มีความสำคัญอย่างยิ่งด้วยเหตุผลหลายประการ:&lt;/p&gt;



&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;ความปลอดภัยของข้อมูล&lt;/strong&gt;: การมีระบบยืนยันตัวตนช่วยป้องกันการเข้าถึงข้อมูลจากบุคคลที่ไม่ได้รับอนุญาต&lt;/li&gt;



&lt;li&gt;&lt;strong&gt;การติดตามการใช้งาน&lt;/strong&gt;: สามารถตรวจสอบได้ว่าใครเป็นผู้ดำเนินการกับข้อมูลในระบบ&lt;/li&gt;



&lt;li&gt;&lt;strong&gt;การควบคุมสิทธิ์&lt;/strong&gt;: สามารถกำหนดสิทธิ์การเข้าถึงข้อมูลที่แตกต่างกันสำหรับผู้ใช้แต่ละคน&lt;/li&gt;



&lt;li&gt;&lt;strong&gt;การจัดการทรัพยากร&lt;/strong&gt;: สามารถจำกัดการใช้ทรัพยากรของระบบสำหรับแต่ละบัญชีผู้ใช้&lt;/li&gt;
&lt;/ol&gt;



&lt;h2&gt;วิธีการสร้างผู้ใช้งานใหม่&lt;/h2&gt;



&lt;h3&gt;1. ติดตั้ง influxdb-cli&lt;/h3&gt;



&lt;p&gt;ก่อนอื่น เราต้องติดตั้ง influxdb-cli โดยใช้ Homebrew:&lt;/p&gt;



&lt;div&gt;&lt;pre&gt;&lt;code&gt;brew install influxdb-cli&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;h3&gt;2. เชื่อมต่อกับ InfluxDB&lt;/h3&gt;



&lt;p&gt;หลังจากติดตั้งเสร็จ ให้ทำการสร้าง configuration สำหรับการเชื่อมต่อ:&lt;/p&gt;



&lt;div&gt;&lt;pre&gt;&lt;code&gt;influx config create \
-n admin-config \
-u https://&amp;lt;INFLUX_DB&amp;gt; \
-p &amp;lt;ADMIN_USERNAME&amp;gt;:&amp;lt;ADMIN_PASSWORD&amp;gt; \
-o &amp;lt;ORGANIZATION&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;-n&lt;/code&gt; (name): ชื่อของ configuration profile ที่เราต้องการสร้าง ใช้สำหรับอ้างอิงในการเชื่อมต่อครั้งต่อไป เช่น เราอาจมี profile สำหรับ development และ production แยกกัน &lt;/li&gt;



&lt;li&gt;&lt;code&gt;-u&lt;/code&gt; (url): URL ของ InfluxDB server ที่เราต้องการเชื่อมต่อ ซึ่งอาจเป็น server ที่อยู่ในเครื่องเดียวกัน (localhost) หรือ remote server &lt;/li&gt;



&lt;li&gt;&lt;code&gt;-p&lt;/code&gt; (password): รูปแบบ username:password สำหรับการยืนยันตัวตน โดยต้องใช้บัญชีที่มีสิทธิ์ในการสร้างผู้ใช้งานใหม่ &lt;/li&gt;



&lt;li&gt;&lt;code&gt;-o&lt;/code&gt; (org): ชื่อองค์กรที่เราต้องการเชื่อมต่อใน InfluxDB ซึ่งเป็นระดับสูงสุดในการจัดการสิทธิ์และการเข้าถึงข้อมูล&lt;/li&gt;
&lt;/ul&gt;



&lt;h3&gt;3. สร้างผู้ใช้งานใหม่&lt;/h3&gt;



&lt;p&gt;ใช้คำสั่งต่อไปนี้เพื่อสร้างผู้ใช้งานใหม่:&lt;/p&gt;



&lt;div&gt;&lt;pre&gt;&lt;code&gt;influx user create \
-n &amp;lt;NEW_USER&amp;gt; \
-p &amp;lt;NEW_PASSWORD&amp;gt; \
-o &amp;lt;ORGANIZATION&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;-n&lt;/code&gt;: ชื่อผู้ใช้งานที่ต้องการสร้าง ควรตั้งให้สื่อความหมายและง่ายต่อการจดจำ &lt;/li&gt;



&lt;li&gt;&lt;code&gt;-p&lt;/code&gt;: รหัสผ่านสำหรับผู้ใช้งาน ควรมีความซับซ้อนเพียงพอเพื่อความปลอดภัย &lt;/li&gt;



&lt;li&gt;&lt;code&gt;-o&lt;/code&gt;: องค์กรที่ผู้ใช้งานจะสังกัด ซึ่งจะมีผลต่อสิทธิ์การเข้าถึงข้อมูลและทรัพยากร&lt;/li&gt;
&lt;/ul&gt;



&lt;h2&gt;การจัดการสิทธิ์ผู้ใช้งาน&lt;/h2&gt;



&lt;p&gt;เมื่อสร้างผู้ใช้งานแล้ว เราสามารถกำหนดสิทธิ์เพิ่มเติมได้ เช่น:&lt;/p&gt;



&lt;ul&gt;
&lt;li&gt;สิทธิ์ในการอ่านข้อมูล&lt;/li&gt;



&lt;li&gt;สิทธิ์ในการเขียนข้อมูล&lt;/li&gt;



&lt;li&gt;สิทธิ์ในการสร้าง bucket&lt;/li&gt;



&lt;li&gt;สิทธิ์ในการจัดการผู้ใช้งานอื่น&lt;/li&gt;
&lt;/ul&gt;



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



&lt;p&gt;การสร้างและจัดการผู้ใช้งานใน InfluxDB เป็นขั้นตอนสำคัญในการรักษาความปลอดภัยและจัดการการเข้าถึงข้อมูล โดยใช้ influxdb-cli เราสามารถ:&lt;/p&gt;



&lt;ul&gt;
&lt;li&gt;สร้างผู้ใช้งานใหม่ได้อย่างรวดเร็วและมีประสิทธิภาพ&lt;/li&gt;



&lt;li&gt;กำหนดสิทธิ์การเข้าถึงได้อย่างละเอียดและเหมาะสมกับบทบาทของผู้ใช้&lt;/li&gt;



&lt;li&gt;ควบคุมและติดตามการใช้งานระบบได้อย่างมีประสิทธิภาพ&lt;/li&gt;
&lt;/ul&gt;



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



&lt;hr /&gt;



&lt;blockquote&gt;
&lt;div&gt;&lt;div&gt;
&lt;p&gt;&lt;strong&gt;Manage users&lt;/strong&gt;&lt;/p&gt;



&lt;p&gt;Users are those with access to InfluxDB. To grant a user permission to access data, add them as a &lt;a href="https://docs.influxdata.com/influxdb/v2/admin/organizations/members/"&gt;member of an organization&lt;/a&gt; and provide them with an &lt;a href="https://docs.influxdata.com/influxdb/v2/admin/tokens/"&gt;API token&lt;/a&gt;.&lt;/p&gt;



&lt;p&gt;&lt;a href="https://docs.influxdata.com/influxdb/v2/admin/users/" target="_blank"&gt;https://docs.influxdata.com/influxdb/v2/admin/users/&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;&lt;/div&gt;
&lt;/blockquote&gt;



&lt;p&gt;&lt;/p&gt;&lt;p&gt;The post &lt;a href="https://thanapon.info/influxdb-cli-create-user/"&gt;[InfluxDb] สร้าง Username/Password ผ่าน influxdb-cli บน MacOS&lt;/a&gt; first appeared on &lt;a href="https://thanapon.info/"&gt;Thanapon&lt;/a&gt;.&lt;/p&gt;</content>
    <source>
      <title>Thanapon</title>
      <link rel="self" href="https://thanapon.info/feed/"/>
      <link rel="alternate" href="https://thanapon.info"/>
    </source>
  </entry>
  <entry>
    <id>urn:uuid:da8f58ea-5446-5971-bd35-2930b68ec89a</id>
    <title>0259 | ลง ansible หลาย version ในเครื่องเดียวแบบไม่ให้งง</title>
    <updated>2024-09-24T11:29:19.000Z</updated>
    <author>
      <name>icez</name>
    </author>
    <published>2024-09-24T11:29:19.000Z</published>
    <link rel="alternate" href="https://www.icez.net/blog/167550/ansible-multiple-version-python-virtualenv"/>
    <category term="Thai"/>
    <content type="html">&lt;p&gt;จดไว้กันลืม&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;cd ~
virtualenv ansible-9.10.0
cd ansible-9.10.0
source bin/activate
python3 -m pip install ansible==9.10.0
python3 -m pip install cryptography==42.0.7 jinja2==3.1.4 jmespath==1.0.1 jsonschema==4.22.0 MarkupSafe==2.1.5 netaddr==1.2.1 pbr==6.0.0 ruamel.yaml==0.18.6 ruamel.yaml.clib==0.2.8
&lt;/code&gt;&lt;/pre&gt;</content>
    <source>
      <title>icez network</title>
      <link rel="self" href="https://www.icez.net/blog/feed"/>
      <link rel="alternate" href="https://www.icez.net/blog"/>
    </source>
  </entry>
  <entry>
    <id>urn:uuid:60802a96-844d-5d32-b1fe-7f7df8406e12</id>
    <title>[Platform IO] ลอง Build firmware ผ่าน Gitlab-CI พร้อม Release assets</title>
    <updated>2024-07-21T16:32:29.000Z</updated>
    <author>
      <name>thanapon.tap</name>
    </author>
    <published>2024-07-21T16:32:29.000Z</published>
    <link rel="alternate" href="https://thanapon.info/ci-platform-io-semantic-release/?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=ci-platform-io-semantic-release"/>
    <category term="Thai"/>
    <content type="html">&lt;p&gt;สวัสดีครับ หลังจากที่หายไปนานหลายเดือนเลย วันนี้ก็เลยกะว่าจะมาแชร์วิธีการ Build firmware ผ่าน Gitlab-CI พร้อมกับขั้นตอนการทำ Release version ของ firmware สุดท้ายเราก็ได้จะไฟล์ Firmware.bin ที่พร้อมจะทำการอัพโหลดเข้า ESP32 เราได้เลย&lt;/p&gt;



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



&lt;p&gt;โดยขั้นตอนทั้งหมดนี้ทางผมจะใช้ Semantic-release ที่เป็น Package ใน NodeJS เป็นตัวช่วยจัดการอีกทีนะครับ สำหรับท่านผู้อ่านท่านไหนมีวิธี Release ที่สะดวกกว่านี้ รบกวนแนะนำกันด้วยนะครับ &lt;img src="https://feeds.llun.dev/media/f3329b957fe8ee342bd57e008e3b5f16d588982b98fefc20b44ba0d7e8dbc41a.png" alt="🙏" /&gt;&lt;img src="https://feeds.llun.dev/media/f3329b957fe8ee342bd57e008e3b5f16d588982b98fefc20b44ba0d7e8dbc41a.png" alt="🙏" /&gt;&lt;img src="https://feeds.llun.dev/media/f3329b957fe8ee342bd57e008e3b5f16d588982b98fefc20b44ba0d7e8dbc41a.png" alt="🙏" /&gt;&lt;/p&gt;



&lt;hr /&gt;



&lt;h3&gt;เริ่มกันเลยดีกว่า บทความนี้สิ่งที่เราต้องเตรียมก็คือ&lt;/h3&gt;



&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.conventionalcommits.org/en/v1.0.0/" target="_blank"&gt;Conventional Commits&lt;/a&gt;: เป็นรูปแบบการเขียนข้อความสำหรับการ commit ในระบบ version control เช่น Git โดยมีโครงสร้างที่ชัดเจน ประกอบด้วยประเภทการเปลี่ยนแปลง (เช่น &lt;code&gt;feat&lt;/code&gt; สำหรับการเพิ่มฟีเจอร์, &lt;code&gt;fix&lt;/code&gt; สำหรับการแก้ไขบั๊ก), ขอบเขตที่ได้รับผลกระทบ และคำอธิบายสั้น ๆ เกี่ยวกับการเปลี่ยนแปลง รูปแบบนี้ช่วยให้การตรวจสอบประวัติการเปลี่ยนแปลงและการจัดการโปรเจกต์ทำได้ง่ายขึ้น&lt;/li&gt;



&lt;li&gt;&lt;a href="https://semantic-release.gitbook.io/semantic-release" target="_blank"&gt;Semantic-release&lt;/a&gt;: เป็นเครื่องมืออัตโนมัติสำหรับการจัดการการปล่อยเวอร์ชันในโปรเจกต์ Node.js โดยใช้รูปแบบ Conventional Commits ในการกำหนดเวอร์ชันใหม่อย่างเป็นระบบ หลังจากทำการ merge pull request หรือ push commits เข้าไปใน repository เครื่องมือจะตรวจสอบข้อความ commit เพื่อตัดสินใจว่าจะเพิ่มเลขเวอร์ชันหลัก (&lt;code&gt;major&lt;/code&gt;), รอง (&lt;code&gt;minor&lt;/code&gt;), หรือแพตช์ (&lt;code&gt;patch&lt;/code&gt;) นอกจากนี้ &lt;code&gt;semantic-release&lt;/code&gt; ยังสามารถสร้างและอัปเดต Changelog, ปล่อยเวอร์ชันใหม่ไปยัง npm registry และทำการแจ้งเตือนเกี่ยวกับการปล่อยเวอร์ชันไปยังแพลตฟอร์มต่าง ๆ เช่น GitHub, GitLab หรือ Slack โดยอัตโนมัติ [&lt;em&gt;Ref จาก ChatGPT นะครับขี้เกียจเขียนสุดๆ 5555&lt;/em&gt;]&lt;/li&gt;
&lt;/ul&gt;



&lt;h4&gt;ติดตั้ง Semantic-release อื่นๆใน package.json&lt;/h4&gt;



&lt;div&gt;&lt;pre&gt;&lt;code&gt;// Install Semantic-release.
npm i -s -D @semantic-release/changelog @semantic-release/commit-analyzer \
@semantic-release/git @semantic-release/gitlab @semantic-release/gitlab-config \
@semantic-release/npm @semantic-release/release-notes-generator @semantic-release/exec&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;h4&gt;ติดตั้ง commitizen และทำการ Init package เข้ามาใช้ใน package.json ของเรา&lt;/h4&gt;



&lt;div&gt;&lt;pre&gt;&lt;code&gt;// Install commitizen.
npm install -D commitizen

// Setup adapter for changelog.
commitizen init cz-conventional-changelog --save-dev --save-exact&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;h4&gt;ติดตั้ง Conventionalcommits ด้วยเพื่อเอาไว้เช็ค commit message ของเราในขั้นตอน Release&lt;/h4&gt;



&lt;div&gt;&lt;pre&gt;&lt;code&gt;npm install -D conventional-changelog-conventionalcommits&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;&lt;em&gt;ในส่วนของ Package.json อย่าลืมปรับให้เป็น private project ด้วยนะครับ&lt;/em&gt;&lt;/p&gt;



&lt;div&gt;&lt;pre&gt;&lt;code&gt;## package.json ##

{
    "name": "aws-iot-timer-relay-4ch",
    "version": "2.2.4",
    "private": true
}&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;ส่วนต่อมาสร้างไฟล์ &lt;strong&gt;&lt;em&gt;&lt;mark&gt;.releaserc.ymal&lt;/mark&gt;&lt;/em&gt;&lt;/strong&gt; เพื่อให้ตัว Semantic-release มาเรียกใช้ในขั้นตอน CI/CD&lt;/p&gt;



&lt;div&gt;&lt;pre&gt;&lt;code&gt;## .releaserc.ymal ##

branches: ["main"]
ci: true
debug: true
dryRun: false
tagFormat: "v${version}"
preset: "conventionalcommits"
gitlabUrl: "https://gitlab.xxx.com" # &amp;lt;--- your gitlab url.
verifyConditions:
    - "@semantic-release/changelog"
    - "@semantic-release/git"
    - "@semantic-release/gitlab"
analyzeCommits:
    - path: "@semantic-release/commit-analyzer"
      releaseRules:
          - type: "breaking"
            release: "major"
          - type: "feat"
            release: "minor"
          - type: "*"
            release: "patch"
generateNotes:
    - path: "@semantic-release/release-notes-generator"
      writerOpts:
          groupBy: "type"
          commitGroupsSort: "title"
          commitsSort: "header"
      linkCompare: true
      linkReferences: true
      presetConfig:
          types:
              - type: chore
                section: Others
              - type: revert
                section: Reverts
              - type: feat
                section: Features
              - type: fix
                section: Bug Fixes
              - type: improvement
                section: Feature Improvements
              - type: docs
                section: Docs
              - type: style
                section: Styling
              - type: refactor
                section: Code Refactoring
              - type: perf
                section: Performance Improvements
              - type: test
                section: Tests
              - type: build
                section: Build System
              - type: ci
                section: CI
prepare:
    - path: "@semantic-release/changelog"
    - path: "@semantic-release/npm"
    - path: "@semantic-release/exec"
      cmd: "./update-version.sh ${nextRelease.version} &amp;amp;&amp;amp; echo v${nextRelease.version} &amp;gt; .release-version" # &amp;lt;-- Remember this script.
    - path: "@semantic-release/git"
      message: "[skip ci] chore(release): v${nextRelease.version}"
      assets: ["CHANGELOG.md", "package.json", "include/CONFIG.h"]
publish:
    - path: "@semantic-release/npm"
    - path: "@semantic-release/gitlab"
success:
    false
fail:
    false
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;จาก &lt;strong&gt;&lt;em&gt;&lt;mark&gt;.releaserc.yml&lt;/mark&gt;&lt;/em&gt;&lt;/strong&gt; ข้างต้นจะมี 2 ส่วนที่จะต้อง Config ด้วยกัน ส่วนแรกเราจะต้องกำหนด Gitlab Url ของเรา และส่วนที่สองจะเป็น Custom script ที่ใช้ในการอัพเดทไฟล์ CONFIG.h&lt;/p&gt;



&lt;p&gt;&lt;code&gt;./update-version.sh ${nextRelease.version} &amp;amp;&amp;amp; echo v${nextRelease.version} &amp;gt; .release-version&lt;/code&gt; &lt;/p&gt;



&lt;p&gt;โดยที่ภายใน script จะเป็นการ Stamp version ของ Semantic-release เข้าไปใน CONFIG.h ซึ่งจะเป็นไฟล์ที่ผมเอาไว้เก็บ Config ของอุปกรณ์ทุกอย่างไว้ในนี้เลย&lt;/p&gt;



&lt;div&gt;&lt;pre&gt;&lt;code&gt;## update-version.sh ##

#!/bin/bash

# Receive nextRelease.version from the first command line argument
nextRelease_version=$1

# Escape periods in the version number, since sed treats them as special characters
escapedVersion=$(echo "${nextRelease_version}" | sed 's/\./\\./g')

# Use sed to replace the version number in CONFIG.h
sed -i -e "s/#define FIRMWARE_VERSION \".*\"/#define FIRMWARE_VERSION \"${escapedVersion}\"/g" include/CONFIG.h

echo "updated version to ${nextRelease_version} in CONFIG.h"
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;div&gt;&lt;pre&gt;&lt;code&gt;## CONFIG.h ##

#ifndef CONFIG_H
#define CONFIG_H

#define FIRMWARE_VERSION "2.2.4" &amp;lt;-- Stamp a latest version.
#define TWDT_TIMEOUT 180
#define MQTT_KEEP_ALIVE_TIMEOUT 15000
// WiFi
#define WIFI_SSID "XXXX"
#define WIFI_PASSWORD "PASSWORD"

#endif&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;h4&gt;ต่อมาก็คอนฟิค .gitlab-ci.yaml ด้วย&lt;/h4&gt;



&lt;div&gt;&lt;pre&gt;&lt;code&gt;variables:
    GIT_SUBMODULE_STRATEGY: recursive
    RELEASE_REGISTRY_URL: "${CI_API_V4_URL}/projects/${CI_PROJECT_ID}/releases"
    PACKAGE_REGISTRY_URL: "${CI_API_V4_URL}/projects/${CI_PROJECT_ID}/packages/generic/firmware"

stages:
    - release
    - build
    - update-asset

semantic-release:
    stage: release
    image:
        name: node:20-bullseye-slim
    only:
        refs:
            - main
    except:
        refs:
            - tags
        variables:
            - $CI_COMMIT_TITLE =~ /^RELEASE:.+$/
    before_script:
        - apt-get update &amp;amp;&amp;amp; apt-get install -y git
        - npm ci
    script:
        - HUSKY=0 npm run release
    artifacts:
        paths:
            - .release-version
        expire_in: 1 hour

build:
    stage: build
    image: python:3.11
    only:
        refs:
            - main
    before_script:
        - pip install -U platformio
    script:
        - git pull origin main
        - pio run
    artifacts:
        paths:
            - .pio/
        expire_in: 1 hour

update-asset:
    stage: update-asset
    image: curlimages/curl:latest
    only:
        refs:
            - main
    before_script:
        - FW_VERSION=$(cat .release-version)
    script:
        - |
            curl --header "JOB-TOKEN: ${CI_JOB_TOKEN}" --upload-file .pio/build/nodemcu-32s/firmware.bin "${PACKAGE_REGISTRY_URL}/${FW_VERSION}/firmware.bin"
        - |
            curl --request POST --header "JOB-TOKEN: ${CI_JOB_TOKEN}" "${RELEASE_REGISTRY_URL}/${FW_VERSION}/assets/links" \
                --data name="firmware.bin" \
                --data url="${PACKAGE_REGISTRY_URL}/${FW_VERSION}/firmware.bin"
        - |
            curl --header "JOB-TOKEN: ${CI_JOB_TOKEN}" --upload-file .pio/build/nodemcu-32s/bootloader.bin "${PACKAGE_REGISTRY_URL}/${FW_VERSION}/bootloader.bin"
        - |
            curl --request POST --header "JOB-TOKEN: ${CI_JOB_TOKEN}" "${RELEASE_REGISTRY_URL}/${FW_VERSION}/assets/links" \
                --data name="bootloader.bin" \
                --data url="${PACKAGE_REGISTRY_URL}/${FW_VERSION}/bootloader.bin"
        - |
            curl --header "JOB-TOKEN: ${CI_JOB_TOKEN}" --upload-file .pio/build/nodemcu-32s/partitions.bin "${PACKAGE_REGISTRY_URL}/${FW_VERSION}/partitions.bin"
        - |
            curl --request POST --header "JOB-TOKEN: ${CI_JOB_TOKEN}" "${RELEASE_REGISTRY_URL}/${FW_VERSION}/assets/links" \
                --data name="partitions.bin" \
                --data url="${PACKAGE_REGISTRY_URL}/${FW_VERSION}/partitions.bin"&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;ในขั้นตอนของ CI/CD เราจะมีการกำหนดทั้งหมด 4 Stage ด้วยกัน&lt;/p&gt;



&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Release stage:&lt;/strong&gt; จะทำการรัน Semantic-release package ที่เราติดตั้งผ่าน Nodejs แล้วหลังจากที่ Release เสร็จแล้วเราจะได้รับไฟล์มาทั้งหมด 3 ไฟล์
&lt;ul&gt;
&lt;li&gt;CHANGELOG.md: เป็นไฟล์ที่ระบุ Commit message ในแต่ละ Version&lt;/li&gt;



&lt;li&gt;package.json: ทำการระบุ Version ตัวใหม่เข้าไป&lt;/li&gt;



&lt;li&gt;include/CONFIG.h: เป็นไฟล์ CONFIG.h ที่เราจะเอาไว้ระบุ version ใน firmware&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;



&lt;li&gt;เมื่อขั้นตอนการ Release เสร็จสิ้นเราจะทำการ สร้างไฟล์ .release-version ไว้เพื่อเรียกใช้เป็น artifact ใน stage อื่นๆ&lt;/li&gt;



&lt;li&gt;&lt;strong&gt;Build stage:&lt;/strong&gt; จะทำการ Build code ของเราให้เป็น Binary file โดยจะใช้จะทำการรันผ่าน Python ซึ่งจะใช้ Package &lt;strong&gt;&lt;em&gt;“Platformio”&lt;/em&gt;&lt;/strong&gt; เป็นตัว build อีกที หลังจากที่ Build เสร็จแล้วเราก็จะได้ไฟล์ Binary กับพวก dependencies ต่างๆ ซึ่งจะถูกเก็บไว้ในโฟลเดอร์ &lt;mark&gt;“.pio/”&lt;/mark&gt; เพื่อเอาไว้ใช้ใน Stage ต่อไป&lt;/li&gt;



&lt;li&gt;&lt;strong&gt;Update-asset stage&lt;/strong&gt;: จะเป็นการอัพโหลดไฟล์ที่เราจำเป็นต้องใช้ในการ Upload firmware เข้าไปใน ESP32 ซึ่งใน Stage นี้เราจะใช้ curl ในการอัพโหลดได้เลยโดยที่ไฟล์ที่ผมจะอัพโหลดจะประกอบไปด้วย
&lt;ul&gt;
&lt;li&gt;firmware.bin ไฟล์ Firmware ตัวจริง&lt;/li&gt;



&lt;li&gt;bootloader.bin ไฟล์ &lt;code&gt;bootloader.bin&lt;/code&gt; ใน PlatformIO เป็นโปรแกรมขนาดเล็กที่ทำงานเมื่อเปิดเครื่องหรือรีเซ็ตอุปกรณ์ เพื่อโหลดและเริ่มการทำงานของเฟิร์มแวร์หลักในหน่วยความจำ&lt;/li&gt;



&lt;li&gt;partitions.bin ไฟล์ &lt;code&gt;partitions.bin&lt;/code&gt; กำหนดการแบ่งพาร์ติชันในหน่วยความจำของอุปกรณ์เพื่อจัดสรรพื้นที่สำหรับ bootloader, เฟิร์มแวร์, การตั้งค่า, และข้อมูลอื่นๆ&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;



&lt;p&gt;ในขั้นตอน Update-asset เราจะทำการ สร้างตัวแปร FW_VERSION ซึ่งจะเข้าไปอ่านไฟล์จาก .release-version มาอีกที เพื่อตอนที่เราทำการอัพโหลดไฟล์ Binary ต่างๆขึ้นไปเก็บใน Gitlab package registry มันจะแยกโฟลเดอร์ให้ตาม version ที่ Release ออกมาเลย&lt;/p&gt;


&lt;div&gt;
&lt;figure&gt;&lt;img loading="lazy" width="1024" height="504" src="https://localhost:54526/wp-content/uploads/2024/07/image-1024x504.png" alt="" srcset="https://feeds.llun.dev/media/e8c70c22ce1a10aeb12c7ef5e57a63f7a903ecfabcad975e30e8d006c6bb7206.png 1024w, https://feeds.llun.dev/media/fec1eebcb2858e0a84599f4ef9bf3868a3dc6aa51903e429de266e144193a57d.png 300w, https://feeds.llun.dev/media/28083597a0996e6bf8c1fe722cbcda7137218353195bd127bfa59bf15439ed03.png 768w, https://feeds.llun.dev/media/b8b5abb3ab4c4004884c57a62b04a4d3079e4d90891378b29753e7fc0d3c4001.png 1536w, https://feeds.llun.dev/media/4ba7ca503e3165ee5192e17c416cc48923ae1c2ab621d6ba67c3c6820b10eef2.png 2048w, https://feeds.llun.dev/media/d91f09430394bd9774b864d62f69af1e6e13bc8af325a34434946efef98a6ffd.png 600w" /&gt;&lt;/figure&gt;
&lt;/div&gt;

&lt;div&gt;
&lt;figure&gt;&lt;img loading="lazy" width="1024" height="567" src="https://localhost:54526/wp-content/uploads/2024/07/image-1-1024x567.png" alt="" srcset="https://feeds.llun.dev/media/b9652b9d0b380d86f2f37baa437245407f0f66e8381da50675d515470fb728a6.png 1024w, https://feeds.llun.dev/media/75c023468d1043de86f10581b48c96794ce3fa143b98b20528e754ce3e68e4c8.png 300w, https://feeds.llun.dev/media/02f0d1d38532d4ce6bbebcd41479bc843a43784eb14bd282d985faae4b5b9fab.png 768w, https://feeds.llun.dev/media/4211476df80419b954911969ee21c9e3d2b7955f357434f34af395adf1650072.png 1536w, https://feeds.llun.dev/media/206e27ad095c9dffcaf03df942d8d4ad315590bec69dc0571315383fbc093177.png 2048w, https://feeds.llun.dev/media/b4de9d537813997d7f16f9f7ee088801de3ab638c97052f9bb7b68e9171116e1.png 600w" /&gt;&lt;/figure&gt;
&lt;/div&gt;


&lt;p&gt;&lt;/p&gt;



&lt;h4&gt;สร้าง CI/CD variables บน Gitlab ก่อน&lt;/h4&gt;



&lt;p&gt;ในขั้นตอนนี้เราจะต้องการเพิ่ม Key ใน CI/CD ด้วย โดยที่เราจะต้องสร้าง Key “&lt;strong&gt;GITLAB_TOKEN&lt;/strong&gt;” พร้อมกับทั้งต้อง Generate Access Token เข้ามาด้วย &lt;mark&gt;อย่าลืม!!!!&lt;/mark&gt;&lt;/p&gt;


&lt;div&gt;
&lt;figure&gt;&lt;img loading="lazy" width="1024" height="387" src="https://localhost:54526/wp-content/uploads/2024/07/image-3-1024x387.png" alt="" srcset="https://feeds.llun.dev/media/1ac996164f1ae50e1215ad8107197f33c0bf6a57fbbb482505e999f4f988c0cd.png 1024w, https://feeds.llun.dev/media/58794fdc54722aea1fc55d8aa6ddf83695641a9abb8fd9ccaeb5ad60b76bcc21.png 300w, https://feeds.llun.dev/media/68564f931c47880faa75e601c4a542ac2ae4f84fe92cb4e64edf6b1878fc3610.png 768w, https://feeds.llun.dev/media/a61d30c633c7c8490f454cb49533db114feacc4453642602f45058474eabe9ab.png 1536w, https://feeds.llun.dev/media/cdddf5e239207b2f5364eb0b2bdb966ab960dcaa505dc00204e7429a28a2b601.png 2048w, https://feeds.llun.dev/media/c0c3161d21dbd5f51f6f2a5e5b29d49ab5776cc4ee331d463df7584323934bd9.png 600w" /&gt;&lt;/figure&gt;
&lt;/div&gt;


&lt;p&gt;&lt;/p&gt;



&lt;h4&gt;เสร็จแล้วถึงเวลาที่เราจะมารัน CI/CD ของจริงกันสักที&lt;/h4&gt;



&lt;p&gt;Push code เราขึ้นไปบน Gitlab โลดดดดดด….. &lt;mark&gt;อย่าลืมต้องเป็น Branch “main” เท่านั้นนะอันนี้&lt;/mark&gt;&lt;/p&gt;


&lt;div&gt;
&lt;figure&gt;&lt;img loading="lazy" width="1024" height="281" src="https://localhost:54526/wp-content/uploads/2024/07/image-2-1024x281.png" alt="" srcset="https://feeds.llun.dev/media/65a493a3d7fa5bde609234a74107e89d415123e1b8b5c1fd9e08144f8eacf1f4.png 1024w, https://feeds.llun.dev/media/b63f23808e0257f8fc86e0ac802f6c2b637c10dd8d785c6a80bcce5980c05a4f.png 300w, https://feeds.llun.dev/media/6f504e0747cf29e2c0a23f90eddf2247f8c4c3fc9c1a3287e09ec4bbd5d49821.png 768w, https://feeds.llun.dev/media/de09c3a939fa4f50e250f8fd3091f2e6403c4a2f56e294b4f4cc86cf7586c150.png 1536w, https://feeds.llun.dev/media/ff913ccaafabee54d635f9218189b69c39042fe45466276266dec4f5a1fa75c4.png 2048w, https://feeds.llun.dev/media/7caacf9054c4e46b0e74355fe2b9100138cb0d19c0b32f579be5d70e4cb2b1e3.png 600w" /&gt;&lt;/figure&gt;
&lt;/div&gt;


&lt;p&gt;เมื่อตัว Semantic-release เสร็จ สังเกตดูว่า Semantic-release-bot มันจะทำการ Push code ที่เรา Config ใน .releaserc.yaml เข้าไปด้วย ยกตัวอย่างรูปข้างบนจะทำการ Push Commit “[skip ci] chore(release): v2.2.4” พร้อมทั้ง Push tag ขึ้นมาด้วย&lt;/p&gt;



&lt;blockquote&gt;
&lt;p&gt;ทำไมของผมถึงมี 5 Stage (วงกลมเขียว/ส้ม 5 อัน) ต้องบอกว่าอันนี้ผมไม่ได้รันจริงๆครับแค่เอารูปจาก Project ที่รันใน Office มาโชว์เฉยๆ แต่ของเพื่อนๆจะขึ้นแค่ 3 Stage นะครับ 55555++&lt;/p&gt;
&lt;/blockquote&gt;



&lt;p&gt;หลังจากที่ทุกขั้นตอนเสร็จแล้วเราก็ไปเช็ค Release ได้ที่ Project =&amp;gt; Deploy =&amp;gt; Releases ก็จะได้ข้อมูลตามรูปด้านล่างเลยครับ&lt;/p&gt;


&lt;div&gt;
&lt;figure&gt;&lt;img loading="lazy" width="1024" height="502" src="https://localhost:54526/wp-content/uploads/2024/07/image-5-1024x502.png" alt="" srcset="https://feeds.llun.dev/media/5e489593a71be23e5b06f78e8e91e6cec77bede348e30a82c8e8bb28fbefeabe.png 1024w, https://feeds.llun.dev/media/95d0ab8c80349eef3addf3dc282a0f082a6f322b57efd40f003db36d6993f24e.png 300w, https://feeds.llun.dev/media/c017c6bfe7be081bcbe787c2c7bf1e02957a249fb8222c401aa9c2640a62aa1d.png 768w, https://feeds.llun.dev/media/843f8818061c21bb031ce15e5ad974c147a492020270c573284f2191bb606abe.png 600w, https://feeds.llun.dev/media/23f65dc0abb825e4ccddbb82126e7ae8c4e09bf51f5246222045543214e04641.png 1486w" /&gt;&lt;/figure&gt;
&lt;/div&gt;


&lt;p&gt;หน้าตาไฟล์ CHANGELOG.md ซึ่งจะเป็น markdown format&lt;/p&gt;



&lt;figure&gt;&lt;img loading="lazy" width="1024" height="455" src="https://localhost:54526/wp-content/uploads/2024/07/image-7-1024x455.png" alt="" srcset="https://feeds.llun.dev/media/791a226f7c1e265c9c28b5c61af3a9f0ced5e51a75e2416115e5b75d1c33c2ef.png 1024w, https://feeds.llun.dev/media/844487c5fad2ab567ddc9c1d6824b4846efd4242523fe014deee6d5562aa4283.png 300w, https://feeds.llun.dev/media/96bffdbc1ca48138dda1cc3af5d661ee79e5d7d45d8ad97f75c0bc5b3f4fcba3.png 768w, https://feeds.llun.dev/media/9bc411e0966afff501901f4ba1fe96808b08484ff02af0d6036b5e81aa4eacc4.png 1536w, https://feeds.llun.dev/media/25b8cefafcd9c0716e139bd26c24537d90e6e715335e33f4d5c837be8930f100.png 2048w, https://feeds.llun.dev/media/3e42d7dcca6560cba43dc06517c65a7b4d1c7c79021912155ca814b6992bf6d3.png 600w" /&gt;&lt;/figure&gt;



&lt;p&gt;ส่วนใน package.json จะมีการเปลี่ยน version ตาม Semantic-release&lt;/p&gt;


&lt;div&gt;
&lt;figure&gt;&lt;img loading="lazy" width="1024" height="289" src="https://localhost:54526/wp-content/uploads/2024/07/image-8-1024x289.png" alt="" srcset="https://feeds.llun.dev/media/97e1b53d240f2dc7d0c2d9ab490f5aac27355d80c6189369a81e9a5c735eb24f.png 1024w, https://feeds.llun.dev/media/3ee22ef757707d5c055be1f7d731a8c073b528dd993e9bb3bd3a874fec513eaf.png 300w, https://feeds.llun.dev/media/ee98458f2a39036b35f784c50b405935d5af29529e0e3a26b87e25d888b9ed15.png 768w, https://feeds.llun.dev/media/b1d41dbf88e1e17898948e4a72bb95f929cb4542b47b2fc0707a90722272c316.png 600w, https://feeds.llun.dev/media/3eeb7db0262df0b0595dd368690de20dbf75535800d51084d547fae2aebb5d85.png 1324w" /&gt;&lt;/figure&gt;
&lt;/div&gt;


&lt;p&gt;และไฟล์ include/CONFIG.h จะทำการ stamp version จาก 2.2.3 -&amp;gt; 2.2.4 ตามรูปด้านล่างเลยครับ&lt;/p&gt;



&lt;figure&gt;&lt;img loading="lazy" width="1024" height="252" src="https://localhost:54526/wp-content/uploads/2024/07/image-9-1024x252.png" alt="" srcset="https://feeds.llun.dev/media/315931bd192892474de1ed829835528149ef43fc6bbf8d4d4c59e506c8d5d26b.png 1024w, https://feeds.llun.dev/media/1941c04f58a5960cacb9a0848faa3000444284eb5f64bda8a849d9d12fa1ac35.png 300w, https://feeds.llun.dev/media/8e52a69518cafd791fa76678a0235ccc012aeca8cb5596892b1d5b90f84ba8b5.png 768w, https://feeds.llun.dev/media/6364a92b6819b066b04836ac39f3f9dddcfb3d72f93d5113a7d39d700958f588.png 600w, https://feeds.llun.dev/media/a402f809c5e6c9d6b9a8ba79dcfb74ade367e4b5ba5bf9f5bf22395517bc23ea.png 1536w" /&gt;&lt;/figure&gt;



&lt;hr /&gt;



&lt;p&gt;ก็เป็นอันเสร็จสิ้นสำหรับ Process CI/CD เท่านี้นะครับ เราก็จะได้ Flow ของการ Stamp version พร้อมกับ Release และ Package ที่จำเป็นสำหรับการ Upgrade firmware ของ ESP32 แล้วว…. &lt;/p&gt;



&lt;h3&gt;&lt;strong&gt;สำหรับวันนี้ขอบคุณและสวัสดีครับ &lt;img src="https://feeds.llun.dev/media/f3329b957fe8ee342bd57e008e3b5f16d588982b98fefc20b44ba0d7e8dbc41a.png" alt="🙏" /&gt;&lt;img src="https://feeds.llun.dev/media/f3329b957fe8ee342bd57e008e3b5f16d588982b98fefc20b44ba0d7e8dbc41a.png" alt="🙏" /&gt;&lt;img src="https://feeds.llun.dev/media/f3329b957fe8ee342bd57e008e3b5f16d588982b98fefc20b44ba0d7e8dbc41a.png" alt="🙏" /&gt;&lt;/strong&gt;&lt;/h3&gt;&lt;p&gt;The post &lt;a href="https://thanapon.info/ci-platform-io-semantic-release/"&gt;[Platform IO] ลอง Build firmware ผ่าน Gitlab-CI พร้อม Release assets&lt;/a&gt; first appeared on &lt;a href="https://thanapon.info/"&gt;Thanapon&lt;/a&gt;.&lt;/p&gt;</content>
    <source>
      <title>Thanapon</title>
      <link rel="self" href="https://thanapon.info/feed/"/>
      <link rel="alternate" href="https://thanapon.info"/>
    </source>
  </entry>
  <entry>
    <id>urn:uuid:7cceaa76-1a74-516a-9671-e1697df21c2a</id>
    <title>โลกที่ไม่ลืม</title>
    <updated>2024-04-24T17:16:04.000Z</updated>
    <author>
      <name>lewcpe</name>
    </author>
    <published>2024-04-24T17:16:04.000Z</published>
    <link rel="alternate" href="https://lewcpe.com/blog/archives/2340/unforgettable-world/"/>
    <category term="Thai"/>
    <content type="html">&lt;p&gt;LLM แบบ multimodal น่าจะทำให้เกิด device แบบใหม่ ปัญหาตอนนี้คือทุกคนพยายามทำสิ่ง “ทดแทนโทรศัพท์มือถือ” เช่น Humane AI Pin หรือ Rabbit R1 แต่วันนี้ไปเห็น Axon แล้วคิดว่า make sense กว่ามากในตอนนี้&lt;/p&gt;



&lt;figure&gt;&lt;a href="https://lewcpe.com/blog/wp-content/uploads/dc28f4cdecb3cb1f730b2261f84d7d37-scaled.webp"&gt;&lt;img width="1024" height="683" src="https://feeds.llun.dev/media/6aad612be0385fb6d9a1b9881026cbae299996318fafec99590658e4dc761d7f.webp" alt="" srcset="https://feeds.llun.dev/media/6aad612be0385fb6d9a1b9881026cbae299996318fafec99590658e4dc761d7f.webp 1024w, https://feeds.llun.dev/media/23d4820ad06588511311d101bae616a36c9cb269b5201e224a200cb355bd8444.webp 300w, https://feeds.llun.dev/media/33ba6aa1be06a4ec043dda25724d521b8d2a497704879b88c398e0dda8f9ae7f.webp 768w, https://feeds.llun.dev/media/8441f37de1ef9777cf915bb6f7139cf1d3e96ee7a631817633ecc714ff6758e8.webp 1536w, https://feeds.llun.dev/media/6a8cda48708f14b64a177c588d92dfae3b7724609821dfaca44924acef6850a4.webp 2048w" /&gt;&lt;/a&gt;&lt;/figure&gt;



&lt;p&gt;แนวคิดของ Axon นั้นง่ายมาก อุปกรณ์ทำอะไรไม่ได้เลยนอกจากบันทึกเสียงอย่างเดียว เสร็จแล้วแปลงเป็นข้อความ เลือกบางส่วนของข้อความมาทำรายงาน&lt;/p&gt;



&lt;p&gt;ในกรณีการใช้งาน LLM แบบ multimodal มันมีความเป็นไปได้ที่เราจะแปลงทุกอย่างเป็นข้อความทั้งหมด ภาพทุกภาพที่เรามองเห็นกลายเป็นแค่คำบรรยายภาพ “กำลังขับรถ ไปยัง… โดยตอนนี้อยู่ที่แยก…. โดยมี Google Maps นำทาง… บนรถมีคน…..” ชีวิตทั้งชีวิตจะสามารถกลายเป็น log ไฟล์ ข้อมูลทั้งวันอาจจะเหลือแค่หนังสือหนาๆ สักเล่มไม่เกิน 10MB แบบยังไม่บีบอัด&lt;/p&gt;



&lt;p&gt;มีคนเคยพูดว่าภาพหนึ่งภาพแทนคำนับพัน แต่ที่จริงแล้วภาพหนึ่งภาพกินพื้นที่มากกว่า 100KB ภาพจากโทรศัพท์มือถือของเราอาจจะกิน 2-5MB ซึ่งเทียบเป็นคำก็อาจจะไปได้ถึงนับหมื่นไปจนถึงนับล้านคำ แม้แต่การเก็บข้อมูลวิดีโอสักชั่วโมงที่บีบอัดต่อเนื่องระหว่างเฟรมก็ยังกินพื้นที่มากกว่า 500MB แต่การแปลงข้อมูลทั้งหมดอัดแน่นเป็นคำบรรยายจะเหลือชีวิตเราชั่วโมงละไม่กี่ MB เท่านั้น หากนั่งนิ่งๆ ก็อาจจะมีเพียงบรรทัดเดียวทีบรรยายว่าชั่วโมงนั้นเรานั่งนิ่ง และยังสามารถบีบอัดลงไปได้จนเล็กมาก การเก็บคำบรรยายทั้งชีวิต จะอยู่ในพิสัยที่ทำได้โดยไม่ต้องการบริการคลาวด์ใดๆ ภายนอกอก&lt;/p&gt;



&lt;p&gt;ข้อมูลทุกอย่างสามารถเก็บในรูปแบบ metadata ใบหน้าทุกวันนี้สามารถเก็บในรูปแบบ vector ได้ระดับ 100 byte เท่านั้น เช่นเดียวกับ logo ต่างๆ นั่นแปลว่าเราจะสามารถสืบค้นย้อนหลังทั้งหมด ว่าเราพบใคร พูดอะไร เมื่อไหร่ ได้ตลอดชีวิต LLM แปลงข้อมูลที่ผ่านหน้าเราให้อยู่ในรูปแบบที่อัดแน่น จนสร้างความจำที่เป็นไปไม่ได้ เมื่อเราพบใครสักคน โทรศัพท์ของเราจะสามารถสร้าง profile ของคนข้างหน้าเราได้ทันที เราพบเขาครั้งแรกและครั้งสุดท้ายเมื่อใด ประเด็นที่พูดคุยกันล่าสุดมีอะไรบ้าง&lt;/p&gt;



&lt;p&gt;เราจะไม่ลืมอีกเลย…..&lt;/p&gt;



&lt;p&gt;และเราจะไม่ต้องจำอะไรอีกเลย…&lt;/p&gt;</content>
    <source>
      <title>LewCPE's Blog</title>
      <link rel="self" href="http://lewcpe.com/blog/feed"/>
      <link rel="alternate" href="https://lewcpe.com/blog"/>
    </source>
  </entry>
  <entry>
    <id>urn:uuid:c020aaf4-76a3-50e1-b470-c9dc972407bf</id>
    <title>Collectd PostgreSQL Plugin</title>
    <updated>2024-01-09T10:10:00.001Z</updated>
    <author>
      <name>Tap</name>
    </author>
    <published>2024-01-09T10:10:00.001Z</published>
    <link rel="alternate" href="http://visibletrap.blogspot.com/2024/01/collectd-postgresql-plugin.html"/>
    <category term="Thai"/>
    <content type="html">&lt;p&gt;I couldn't find this link when searching with google&lt;/p&gt;&lt;p&gt;&lt;a href="https://www.collectd.org/documentation/manpages/collectd.conf.html#plugin-postgresql"&gt;https://www.collectd.org/documentation/manpages/collectd.conf.html#plugin-postgresql&lt;/a&gt;&lt;/p&gt;</content>
    <source>
      <title>tAp's blog</title>
      <link rel="self" href="http://visibletrap.blogspot.com/feeds/posts/default"/>
      <link rel="alternate" href="http://visibletrap.blogspot.com/"/>
    </source>
  </entry>
  <entry>
    <id>urn:uuid:afdbd374-6c8e-5cdc-a178-2362bc0a897f</id>
    <title>[AWS EKS] ลองใช้ Cluster autoscaler สำหรับ Scale K8s</title>
    <updated>2023-11-12T10:09:14.000Z</updated>
    <author>
      <name>thanapon.tap</name>
    </author>
    <published>2023-11-12T10:09:14.000Z</published>
    <link rel="alternate" href="https://thanapon.info/aws-eks-cluster-autoscaler/?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=aws-eks-cluster-autoscaler"/>
    <category term="Thai"/>
    <content type="html">&lt;p&gt;ก่อนอื่นต้องเกริ่นก่อนครับ พอดีตอนนี้ในทีมได้มีโอกาสใช้ K8s ในการ deploy service ขึ้นไปใช้งานภายในบริษัท ซึ่งปกติตอนที่เรา Provision cluster ขึ้นมานั้น K8s Cluster พวกนี้ก็ไม่ได้เพิ่ม tools สำหรับการทำ Auto scaling เข้ามาให้ด้วย จากเดิมปกติถ้าเราทำการ config EKS นั้นมันก็จะมีให้สร้าง Node group อะไรต่างๆบลาๆๆ โดยที่ภายใน Node group ที่สร้างนั้นมันก็มีให้ระบุ Desired, Minimum และ Maximum เพื่อให้ Node group แต่ละตัวมันสามารถ Scale ได้ แต่วิธีการ Scale เราจะต้องไปปรับเองแบบ Manual นะสิ! แบบนี้ก็เกิดปัญหาเลยสิถ้าจะต้องมีคนมาเฝ้าดูการทำงานของ Container ทั้งวันทั้งคืน &lt;strong&gt;&lt;em&gt;“ทีนี้ก็ลำบาก ก็ว้าวุ่นกันทีเดียว”&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;


&lt;div&gt;
&lt;figure&gt;&lt;img loading="lazy" width="1024" height="552" src="https://localhost:54526/wp-content/uploads/2023/10/image-2-1024x552.png" alt="" srcset="https://feeds.llun.dev/media/138cf8550f0aa6b5bceb9ecda25a83a9bf7eeb12d5f1326162a32f3c28fafe44.png 1024w, https://feeds.llun.dev/media/a81419f9173cca23a5bd591e21c25c7cae983d4b8d6142b413070eda1ddfab8a.png 300w, https://feeds.llun.dev/media/d5122226ce2c2158e880ff4474ef781dc347d4473c3bdacd911a73e41ddc9084.png 768w, https://feeds.llun.dev/media/ac858bc2303c6a6cab2287efa8b69ced8d349c05344cfa23cd79461c94c57354.png 1536w, https://feeds.llun.dev/media/8d8ffa82123ee3fd0941fbfe168cee6a9f46971a49d91a56eb1d88e79cde6846.png 600w, https://feeds.llun.dev/media/08577f36adf170064b142ce3d4739f9437b42506daf06b0a4118cfb304e3c4ba.png 1644w" /&gt;&lt;/figure&gt;
&lt;/div&gt;


&lt;blockquote&gt;
&lt;p&gt;ซึ่งวิธีการ Scale แบบนี้ในฝั่งของ Kubernetes จะเรียกว่าการ Scale แบบ Vertical scaling ซึ่งก็คือการเพิ่ม CPU/Memory เข้าไปใน K8s Cluster เพื่อให้ Cluster นั้นสามารถรัน pod ได้เยอะๆ&lt;/p&gt;
&lt;/blockquote&gt;



&lt;p&gt;จากปัญหาข้างต้น AWS เขาก็ได้แนะนำวิธีการ Auto scaling node ที่รันอยู่ใน EKS Cluster ด้วยกัน 2 วิธี&lt;/p&gt;



&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Karpenter&lt;/strong&gt; คือ Opensource tools ตัวหนึ่งที่เราจะต้องทำการ setup ลงไปใน cluster ของเราเพื่อให้มัน &lt;strong&gt;Watching&lt;/strong&gt;, &lt;strong&gt;Evaluating&lt;/strong&gt;, &lt;strong&gt;Provisioning&lt;/strong&gt; และ &lt;strong&gt;Removing&lt;/strong&gt; ตัว worker node โดยที่มันก็ถูกสร้างเพื่อให้ใช้งานกับ AWS เท่านั้น&lt;/li&gt;
&lt;/ul&gt;


&lt;div&gt;
&lt;figure&gt;&lt;img loading="lazy" width="1024" height="457" src="https://localhost:54526/wp-content/uploads/2023/10/image.png" alt="" srcset="https://feeds.llun.dev/media/9704f55ce816fd6914f3d4700a27087d3ac047f4e93c33782ff017a93e9bdbb9.png 1024w, https://feeds.llun.dev/media/df74835595618e08d50a4399625b12007ff0408b9dc9260a53cd718aeb52c282.png 300w, https://feeds.llun.dev/media/096d56f447bb3a88282a4deb8b339d922801aa5a6d4fa37943031a0a728aa806.png 768w, https://feeds.llun.dev/media/f350ec562beba90ac70b5a2cae0993431356ed24090c8e101439d41d832a70c2.png 600w" /&gt;&lt;/figure&gt;
&lt;/div&gt;


&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Cluster Autoscaler&lt;/strong&gt; เป็น Tools สำหรับ scaling node เหมือนกับ Karpenter หล่ะแต่ข้อแตกต่างคือมัน Support กับ Cloud provider เกือบทุกเจ้าเลยมั้ง ส่วนวิธีการ setup อาจจะต้องไปดูในแต่ละเจ้าเองว่าเหมือนกันไหม แต่หลักๆเราจะต้องไปเพิ่ม Permission อะไรต่างๆให้ service ตัวนี้ก่อน ซึ่งในบทความนี้เราจะมา setup kubernetes cluster autoscaler กันผ่าน Helm กับ Terraform บน AWS EKS&lt;/li&gt;
&lt;/ul&gt;


&lt;div&gt;
&lt;figure&gt;&lt;img loading="lazy" width="741" height="387" src="https://localhost:54526/wp-content/uploads/2023/10/image-1.png" alt="" srcset="https://feeds.llun.dev/media/daaf26be6106ddab309fe5f1d60da11c0595ea223ce58662b46fffa4cf2563b0.png 741w, https://feeds.llun.dev/media/3d2b7ed4455c1e4001ad35cf20353b6380b5d96b12e56b5dcf42249a0087cadd.png 300w, https://feeds.llun.dev/media/d9e34da8c4f95035db6e41b65420f0c9a26ee5b7916f7fd1618aa081eb86ced1.png 600w" /&gt;&lt;/figure&gt;
&lt;/div&gt;


&lt;h3&gt;ก่อนเริ่มกันมาเช็ค Tools ที่ต้องใช้กันก่อน&lt;/h3&gt;



&lt;ul&gt;
&lt;li&gt;Terraform ซึ่งผมจะใช้เป็น version 1.5.7&lt;/li&gt;
&lt;/ul&gt;


&lt;div&gt;
&lt;figure&gt;&lt;img loading="lazy" width="1024" height="271" src="https://localhost:54526/wp-content/uploads/2023/10/image-3-1024x271.png" alt="" srcset="https://feeds.llun.dev/media/9fecd0cc1b503b2ac26aac818886865343b38893be06697c48759eb3037aa1e3.png 1024w, https://feeds.llun.dev/media/3414de635c05c30ed0de201beff4b314825748541cb4e38039a49a395e03e4ec.png 300w, https://feeds.llun.dev/media/a96c9aaaf27f6cbb513e6cb8b6d3b65ab38c1866e4716f30dbd48b94d8cd1293.png 768w, https://feeds.llun.dev/media/efba300176a574ee5c6313e4b27fb87619767118fb1adf305fb1d1d173b97b2d.png 600w, https://feeds.llun.dev/media/ef71f34bb7b1032268fd3824b7efe18f3cab937b1b7e88d4ccf4255798c68417.png 1112w" /&gt;&lt;/figure&gt;
&lt;/div&gt;


&lt;h3&gt;มาเริ่มกันดีกว่า&lt;/h3&gt;



&lt;p&gt;เริ่มจากมา Clone project ของผมที่อยู่ใน Github ก่อน ซึ่งจะอยู่ในนี้ &lt;/p&gt;



&lt;blockquote&gt;
&lt;p&gt;&lt;a href="https://github.com/toygame/terraform-eks-cluster-autoscaler" target="_blank"&gt;terraform-eks-cluster-autoscaler&lt;/a&gt;&lt;/p&gt;



&lt;p&gt;Terraform deploy K8s Cluster-autoscaler with Helm&lt;/p&gt;
&lt;cite&gt;&lt;a href="https://github.com/toygame/terraform-eks-cluster-autoscaler" target="_blank"&gt;https://github.com/toygame/terraform-eks-cluster-autoscaler.git&lt;/a&gt;&lt;/cite&gt;&lt;/blockquote&gt;



&lt;h3&gt;อธิบาย Terraform คร่าวๆก่อน&lt;/h3&gt;



&lt;p&gt;จาก Repo ข้างบนนี้หลักๆเลยเราจะทำการ Provision 3 module ใหญ่ด้วยกันคือ&lt;/p&gt;



&lt;ul&gt;
&lt;li&gt;VPC&lt;/li&gt;



&lt;li&gt;AWS EKS&lt;/li&gt;



&lt;li&gt;Cluster autoscaler with Helm&lt;/li&gt;
&lt;/ul&gt;



&lt;p&gt;ส่วน module/resource อื่นๆจะเป็นแค่ส่วน Support การทำ Autoscaling เฉยๆ&lt;/p&gt;



&lt;h4&gt;Module VPC&lt;/h4&gt;


&lt;div&gt;
&lt;figure&gt;&lt;img loading="lazy" width="1024" height="932" src="https://localhost:54526/wp-content/uploads/2023/11/image-1024x932.png" alt="" srcset="https://feeds.llun.dev/media/ff3a1273cc93da51c08864eb15f697d03ffaa530d106931a4d865fcbf1f984ed.png 1024w, https://feeds.llun.dev/media/d70a24ab18aa0c6a995c7ddb2b45c77c39078ad7c385080f2996b062bacb619e.png 300w, https://feeds.llun.dev/media/ca3d1fe9bef6e4b2c8d9765d14a2de71df1c6d02f49d9742eac314e67e7f450c.png 768w, https://feeds.llun.dev/media/419cacf4c3335844865c12f3d3f7513767034024f5ff82d8ec414d46eb16f715.png 1536w, https://feeds.llun.dev/media/71ae3c406c2ae04e73b0b2b613285484158bc3fa0b8632d0993226e7c7b82d27.png 600w, https://feeds.llun.dev/media/396062bbc7977a62cb36b63a190354d6df37c157ea170ef36ff532be9ce9d6fe.png 1744w" /&gt;&lt;/figure&gt;
&lt;/div&gt;


&lt;p&gt;จาก code block ด้านบนจะเป็นการ provision VPC ที่เราต้องการจะให้ EKS cluster เราไป provision ในนั้นซึ่งจะมีการสร้าง Public/Private subnet ต่างๆและพวก Nat gateway กับ Internet gateway ต่างๆด้วยกัน อ่ออีกเรื่องจะเป็น Available zone[az] เพื่อทำ HA โดยที่ EKS กำหนดไว้ว่า az จะต้องมีตั้งแต่ 2 az ขึ้นไป&lt;/p&gt;



&lt;h4&gt;Module EKS&lt;/h4&gt;



&lt;p&gt;หลังจากนั้นเมื่อมายัง Module EKS เบื้องต้นผมจะกำหนดให้มันสร้าง Node group ขึ้นมา 2 Node group ซึ่ง Group แรกจะเพิ่ม Label เป็น “asg-group”: “group1” และเพิ่ม Tag เพื่อบอกให้ cluster-autoscaler มา Scale node group นี้&lt;/p&gt;



&lt;ul&gt;
&lt;li&gt;Node group 1&lt;/li&gt;
&lt;/ul&gt;


&lt;div&gt;
&lt;figure&gt;&lt;img loading="lazy" width="1024" height="607" src="https://localhost:54526/wp-content/uploads/2023/11/image-1-1024x607.png" alt="" srcset="https://feeds.llun.dev/media/bafc30866af849f63bfdb4cf9aaf6f059b9858a42105cc38a299043e354abe23.png 1024w, https://feeds.llun.dev/media/ef5aca5c100b470f367529ed64ef5761f834abebc40f6d539514ef7a77f965c3.png 300w, https://feeds.llun.dev/media/63c6770bd8312693ed7fe5ff63cde8f48bd2fcb6520222504f5ea36e9268c985.png 768w, https://feeds.llun.dev/media/f93e2927dc052508a2a55d4197f484f517d559058e1e818c1f8de29d0fa46f53.png 1536w, https://feeds.llun.dev/media/279865d952e81af1613984da1907544c014a1b97c0cfb98398003a8dfd5a5a12.png 600w, https://feeds.llun.dev/media/3e2e3ebd9f044c85a0a7076df45581f51c0d92c151a76ab9d48110991c9eb8e3.png 2032w" /&gt;&lt;/figure&gt;
&lt;/div&gt;


&lt;ul&gt;
&lt;li&gt;Node group 2&lt;/li&gt;
&lt;/ul&gt;



&lt;p&gt;ส่วน Node group ที่ 2 นั้นจะเพิ่มส่วน taints/tolerance ขึ้นมาเผื่อในกรณีที่เราอยากจะให้ Node ที่รันใน Node group นี้รัน Hardware ชนิดพิเศษเช่น ต้องการใช้ GPU เพื่อรัน Model อะไรบลาๆซึ่ง cost ของ Node ประเภทนี้จะมีราคาสูงกว่าปกติมาก&lt;/p&gt;


&lt;div&gt;
&lt;figure&gt;&lt;img loading="lazy" width="1024" height="703" src="https://localhost:54526/wp-content/uploads/2023/11/image-2-1024x703.png" alt="" srcset="https://feeds.llun.dev/media/04f553f3490732e3f17193cc4daf1b53b1d3272d7dab5dc61e28a9a3f9eca849.png 1024w, https://feeds.llun.dev/media/5f0eb5c08f66f9147cbcae000f9e980969f2e001939095b75c9458512b67ba60.png 300w, https://feeds.llun.dev/media/652041741cfe497b6b7ee90e485cd453213e89263fd69f8904165ba6f9630874.png 768w, https://feeds.llun.dev/media/866ad29a616c24e2fdb73b74e7df1eb497b6d1f8188cba98269ef9b63813f9ea.png 1536w, https://feeds.llun.dev/media/600a3328362e538d67a51e82d9891ea781ee62ebac797785b5d0972e242dc121.png 2048w, https://feeds.llun.dev/media/0eefeeaa9970f21128a33560fa63a369785ae76b6e6d6b5a44160b622542a9ca.png 600w" /&gt;&lt;/figure&gt;
&lt;/div&gt;


&lt;p&gt;&lt;/p&gt;



&lt;h4&gt;Helm Cluster autoscaler&lt;/h4&gt;



&lt;p&gt;ทำการ Release helm chart โดยที่เราจะต้องกำหนด &lt;/p&gt;



&lt;blockquote&gt;
&lt;ul&gt;
&lt;li&gt;awsRegion: กำหนด Region ที่ใช้งานอยู่&lt;/li&gt;



&lt;li&gt;rbac.serviceAccount.name:  ชื่อ Service account&lt;/li&gt;



&lt;li&gt;rbac.serviceAccount.annotations.eks.amazonaws.com/role-arn: Service account Role-Arn&lt;/li&gt;



&lt;li&gt;autoDiscovery.clusterName: กำหนดชื่อ EKS cluster&lt;/li&gt;



&lt;li&gt;autoDiscovery.enabled: Enable auto-discovory&lt;/li&gt;



&lt;li&gt;rbac.create: เพื่อสร้าง RBAC resources&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;


&lt;div&gt;
&lt;figure&gt;&lt;img loading="lazy" width="948" height="1024" src="https://localhost:54526/wp-content/uploads/2023/11/image-3-948x1024.png" alt="" srcset="https://feeds.llun.dev/media/2576eb9c8f48a372f1ecf101980ec3cf1e45e7e2c28b1ca0d2b1b50c98f71428.png 948w, https://feeds.llun.dev/media/45afa560842d39da11862b15762babbedfb5ba71461ee4b20a5c5f17d86105c3.png 278w, https://feeds.llun.dev/media/f580dae167100d4f44349d00e1fde1e7365d4b81ec38b98493e60b4e72fe4d15.png 768w, https://feeds.llun.dev/media/bd5a29820b041e9740ea09d70e0a6f342a05634e6f46d52da2b2a7f469e05fd5.png 1423w, https://feeds.llun.dev/media/be77c45315fac6288e170baa6b6398a12b88bfd612ce50df1ebb54ec836eb877.png 600w, https://feeds.llun.dev/media/d020f4daa5debc6aaf419d29a5e93306a0ef89be570ab7f233625478a21924ba.png 1782w" /&gt;&lt;/figure&gt;
&lt;/div&gt;


&lt;p&gt;&lt;/p&gt;



&lt;h3&gt;Running Terraform&lt;/h3&gt;



&lt;p&gt;เริ่มทำการ Init terraform เพื่อให้ Terraform package ของเราทำการ list dependencies ต่างๆโดยใช้คำสั่ง&lt;/p&gt;



&lt;p&gt;&lt;em&gt;&lt;mark&gt;ในกรณีที่เราต้องการ parse variable ลงไปด้วยเราจะต้องใช้คำสั่ง “-var-file=ชื่อไฟล์.tfvars”&lt;/mark&gt;&lt;/em&gt;&lt;/p&gt;



&lt;div&gt;&lt;pre&gt;&lt;code&gt;terraform init&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;div&gt;
&lt;figure&gt;&lt;img loading="lazy" width="1024" height="468" src="https://localhost:54526/wp-content/uploads/2023/11/image-4-1024x468.png" alt="" srcset="https://feeds.llun.dev/media/57b50c2350194f4dd702e373816d34c726e10cbde18f795d80aa648f03e99a0f.png 1024w, https://feeds.llun.dev/media/ab9465b74e8a6c3a24e09c0c695cf544255b9dec6e600968fdaa29464393723c.png 300w, https://feeds.llun.dev/media/73c418d61dea4d9f8061406481fc7f000f2e90d4b30f7fda17b105a171e77e19.png 768w, https://feeds.llun.dev/media/1c7bc7c9fdd928c49c3569bc08a6e0f82dd215ce33450e241e88a4a5666a74ac.png 600w, https://feeds.llun.dev/media/f61ade0f0af8798ebd2e31c85b9ada2d226093b1175cd0e2857ce341c7ac6356.png 1482w" /&gt;&lt;/figure&gt;
&lt;/div&gt;


&lt;p&gt;เช็คความถูกต้องของ Terraform รวมทั้ง preview resource ที่จะทำการ deploy&lt;/p&gt;



&lt;div&gt;&lt;pre&gt;&lt;code&gt;terraform plan&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;div&gt;
&lt;figure&gt;&lt;img loading="lazy" width="1024" height="543" src="https://localhost:54526/wp-content/uploads/2023/11/image-7-1024x543.png" alt="" srcset="https://feeds.llun.dev/media/0dabb044789a2f6c239ea5edcb289c5ba0d26f62a71c76078f3fb739b4a5a5b4.png 1024w, https://feeds.llun.dev/media/105d9031aeaa8c6df02c6ecfe6f8d60267249f18d4dab49e154424456f68de89.png 300w, https://feeds.llun.dev/media/a099309458bb5cb28b7fac4f523f2195cc76994368cd39a8b647977e3ec372b9.png 768w, https://feeds.llun.dev/media/d7fa7bfd9ff08dcb9c5ce549417b3d7b736c257cc563541f9c7d0899b4004d55.png 1536w, https://feeds.llun.dev/media/e97b61f8c267328d2aec8547092d87a5fb83dcc2918733986c1f6e1b116439bc.png 600w, https://feeds.llun.dev/media/2cd27d7c211e2a1e59977073f279eee85032a2a1f3145b4d86e416a1d6578e22.png 1832w" /&gt;&lt;/figure&gt;
&lt;/div&gt;


&lt;p&gt;เมื่อเช็คดู Resource ที่จะ deploy ผ่าน terraform plan แล้วไม่มีปัญหาอะไรก็ทำการ Deploy จริงๆโลด&lt;/p&gt;



&lt;div&gt;&lt;pre&gt;&lt;code&gt;terraform apply&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;รอจนกว่าจะ deploy เสร็จสิ้นอาจจะใช้เวลานานนิดนึงนะครับ&lt;/p&gt;



&lt;h3&gt;ทดสอบ Deploy Pod ลงไปใน Cluster ดูสิ่&lt;/h3&gt;


&lt;div&gt;
&lt;figure&gt;&lt;img loading="lazy" width="835" height="1024" src="https://localhost:54526/wp-content/uploads/2023/11/image-16-835x1024.png" alt="" srcset="https://feeds.llun.dev/media/79deac495b972a5d0616de1acac5e85055c0210e8daf44b436cd617a6bb1dca6.png 835w, https://feeds.llun.dev/media/0ae9934002b52be3d921d0a47964f396eef47ff16c62be38275b1f88a0718864.png 245w, https://feeds.llun.dev/media/537dca9c6b0350ce2c289df5c2ac42e777f705a9b48893a44fab75f1f28014df.png 768w, https://feeds.llun.dev/media/d6d0c487eab02ab346d97cdb7d41caf5980dfec81776dd02796f8365a445ce88.png 1253w, https://feeds.llun.dev/media/32777e3380e6edceb1255700b03c626e13a5a6a689fdde14f59566b327a10768.png 600w, https://feeds.llun.dev/media/5991d993390454201088a525478b31e3197bdaf6ef6ed4df42c73de61736be87.png 1530w" /&gt;&lt;/figure&gt;
&lt;/div&gt;


&lt;p&gt;ลอง Deploy deployment ดูสิ่ โดยที่ผมจะกำหนด replicas=0 ก่อน ส่วน Resource ที่ Pod แต่ละตัวใช้จะเป็น CPU: 1CPU/Memory: 1Gi&lt;/p&gt;



&lt;div&gt;&lt;pre&gt;&lt;code&gt;kubectl apply -f k8s/deployment.yaml&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;เสร็จแล้วก็ลอง Scale Pod ขึ้นมาเป็น 5 Pod &lt;/p&gt;



&lt;div&gt;&lt;pre&gt;&lt;code&gt;kubectl scale deployment inflate --replicas 5&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;figure&gt;&lt;img loading="lazy" width="1024" height="331" src="https://localhost:54526/wp-content/uploads/2023/11/image-9-1024x331.png" alt="" srcset="https://feeds.llun.dev/media/4ca95bba3c45016e778daf3c0f2e54b063709534c29edf0ffd2e43892023314f.png 1024w, https://feeds.llun.dev/media/bb29724e510c9ab58680451cc99218d8d4f74079e438ba2bd55a5891df861ae8.png 300w, https://feeds.llun.dev/media/02be56b2ea98bb72096c9038e2166f67c7e68925d9e983f9c62db233a6f1904f.png 768w, https://feeds.llun.dev/media/55f6c8d71b86446c61d356bf7a4a3550fa0ab9dbc2780150b440a1beb3c15b29.png 1536w, https://feeds.llun.dev/media/7c34217b80286687f3a2d1821a15bb26efe8c4abfe08a3b7be3504580ef7cd4b.png 2048w, https://feeds.llun.dev/media/b2dd0dedd0555f3f093e33c8e29f2cd59f0b6bdd130e6d4a8f413af2bc521097.png 600w" /&gt;&lt;/figure&gt;



&lt;p&gt;หลังจากที่เราทำการ scale pod ขึ้นมา 5 pod นั้น จากรูป cluster มันจะงอแงว่า ไม่มี Node ตัวไหนที่ว่างจะ schdule pod ตัวนี้แล้วนะ จากนั้น cluster-autoscaler จะทำการ trigger node ขึ้นมาใหม่เพื่อให้มันสร้าง Node เพื่อให้รองรับกับจำนวน Pod ที่เพิ่มเข้ามาใหม่นั้นเอง โดยที่การ scale จะอ้างอิงกับ Autoscaling group ที่เราสร้างไว้ใน Nodegroup ตอนที่ deploy EKS ขึ้นมา&lt;/p&gt;



&lt;p&gt;ผลลัพธ์ก็จะได้ Pod ขึ้นมาใหม่ 5 Pod พร้อมกับ Node ขึ้นมาใหม่อีก 2 Node (ip-10.0.1.176, ip-10.0.2.151) เช่นกัน&lt;/p&gt;



&lt;blockquote&gt;
&lt;p&gt;&lt;/p&gt;
&lt;/blockquote&gt;



&lt;p&gt;&lt;em&gt;&lt;strong&gt;Node&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt;



&lt;figure&gt;&lt;img loading="lazy" width="1024" height="131" src="https://localhost:54526/wp-content/uploads/2023/11/image-11-1024x131.png" alt="" srcset="https://feeds.llun.dev/media/89b571332a9969eeb897a885526cce54f4dcb500607d4226fb3347dccf16b5b0.png 1024w, https://feeds.llun.dev/media/e7714adf21b7c0856c0e2d999705067d7bee0a5b59f8b0ee1cc171ccab771788.png 300w, https://feeds.llun.dev/media/bfc989d35f0d74ed6db6d122150e35916f0dcdae5e18c074f02e616a22cac617.png 768w, https://feeds.llun.dev/media/a03fc5467ebe6ce836c4945a7085f3fb5d40e4e0af401d0ef83021dc0c13e691.png 1536w, https://feeds.llun.dev/media/b0b0f45d842d01793da8f13c73adf917d6d3b02f039345dbdc16d98948e4d1c1.png 2048w, https://feeds.llun.dev/media/5b6b33e665f9f1ba80ffd4d2cb46ea48c2fc1bb11fdc7b50e6dac360fa8f2004.png 600w" /&gt;&lt;/figure&gt;



&lt;p&gt;&lt;em&gt;&lt;strong&gt;Pod&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt;



&lt;figure&gt;&lt;img loading="lazy" width="1024" height="190" src="https://localhost:54526/wp-content/uploads/2023/11/image-13-1024x190.png" alt="" srcset="https://feeds.llun.dev/media/5c080b34c596ff2c47c5fe1eb6b24fb11a577348e3b58b509f8189f3be1bee3b.png 1024w, https://feeds.llun.dev/media/daef96ec81edeea3828805c1028a8a587656b69a6501c934e3ef1ebfb0e30938.png 300w, https://feeds.llun.dev/media/44274883741dd1843523870428c02f07f6fe1d7de29929553f26298a4f9071ec.png 768w, https://feeds.llun.dev/media/22d977755e3d1c07ac76004e877fd8ce15dffaea456a9188864b8186bbe611bf.png 1536w, https://feeds.llun.dev/media/6e5faf58f72d1f7659370de06fd9071bb9b48c0b111e2c652a82c8c7860c7839.png 2048w, https://feeds.llun.dev/media/48cfa58be9c10076fd6d5ae8019d11f071f3ab3b62d23e7bad4dd8498bbf4918.png 600w" /&gt;&lt;/figure&gt;



&lt;blockquote&gt;&lt;div&gt;
&lt;figure&gt;&lt;img loading="lazy" width="1024" height="456" src="https://localhost:54526/wp-content/uploads/2023/11/image-15-1024x456.png" alt="" srcset="https://feeds.llun.dev/media/691e43beb2bc143153c6a85a1e4ba386ee4b50cdf068111f0975d64010ac555a.png 1024w, https://feeds.llun.dev/media/0771f3027390ea54c0bf8a4949d923db1fc717c98c8242f7c5336dc3d324f042.png 300w, https://feeds.llun.dev/media/360ca400401e2dc186f4637c3b39f20ccf6ce375b95a53629316ef7ee46c8e01.png 768w, https://feeds.llun.dev/media/e0a5c39782fca93030e2ccc771342ae9909d032e35c9260fe00a6d09b7d8495b.png 600w, https://feeds.llun.dev/media/3ff0b6a3ba008fe0e8e3467c82e14ec0ca570feb510852879e0b75b925503b45.png 1418w" /&gt;&lt;/figure&gt;
&lt;/div&gt;&lt;cite&gt;ทำไมต้องเป็น 2 Node เพราะว่า Resource ของ EC2 instance type ที่เราใช้แต่ละตัวจะถูกกำหนดไว้ที่ CPU=3.9 CPU, Memory=6.6GB ซึ่งตัว Pod ของเรามันทำการจอง resource ไว้ที่ 1 CPU/Memory 1 Gi ก็ถ้าหารกันตรงๆเลยก็จะใช้ Node ประมาณ 2 Node นั้นเอง&lt;/cite&gt;&lt;/blockquote&gt;



&lt;p&gt;จากนั้นลองทำการ Scale down Pod ลงมาเป็น 0 replica ซึ่งในขั้นตอนนี้เราจะทำให้ Node ที่มันเพิ่ง Scale up มาเมื่อกี้ unregister ออกจาก Cluster ของเรา&lt;/p&gt;



&lt;div&gt;&lt;pre&gt;&lt;code&gt;kubectl scale deployment inflate --replicas 0&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;จากนั้นรอประมาณ 10 นาที (Default value) เพื่อให้ Cluster เรา unregister worker node ออกไปตามรูปข้างล่างนี้&lt;/p&gt;



&lt;figure&gt;&lt;img loading="lazy" width="1024" height="218" src="https://localhost:54526/wp-content/uploads/2023/11/image-14-1024x218.png" alt="" srcset="https://feeds.llun.dev/media/e3c146d9a3091b7351657784f9bf8a3dd890ccb40f5d0776274a852fb330b944.png 1024w, https://feeds.llun.dev/media/574433545d456a6f5fe1edfd0c4b0031e28622af824b10a20ed77b446e8666fb.png 300w, https://feeds.llun.dev/media/1179b5945771ebf1dbe1af01e2ec0087355ef8e0e6141d0d0d7aa5d8fb19556a.png 768w, https://feeds.llun.dev/media/8d6bfd41be46a0047932b12fa2b3157e69cf50b59c2b508b3e5b35c37e870ba3.png 1536w, https://feeds.llun.dev/media/edcab3ff6e744d9132f3664482b5623c461b984a4bd33a51b1557ec4efc45618.png 2048w, https://feeds.llun.dev/media/d483f3eebe593c5a32453fed884a8eebc72047fb55a58037b13e85c28085ee2b.png 600w" /&gt;&lt;/figure&gt;



&lt;p&gt;หลังจากที่ Deploy แล้วทดสอบทุกอย่างเสร็จแล้วอย่าลืม destroy resource ที่เรา provision ผ่าน Terraform ทิ้งด้วยนะครับ&lt;/p&gt;



&lt;div&gt;&lt;pre&gt;&lt;code&gt;terraform destroy&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;เย้ จบแล้วสำหรับการทำ Cluster autoscaler แล้วเป็นยังไงบ้างครับ หวังว่าท่านผู้อ่านน่าจะได้ประโยชน์จากบทความนี้นะครับ หากมีข้อสงสัยเพิ่มเติมหรือต้องการแนะนำการใช้งานสามารถติดต่อมาได้เลยนะครับ สำหรับวันนี้ขอบคุณและสวัสดีครับ &lt;img src="https://feeds.llun.dev/media/d93d5c92bcbb353b59422a1465189e1f71c95b3a74574c38045c8cd0412e8d77.png" alt="😁" /&gt;&lt;/p&gt;&lt;p&gt;The post &lt;a href="https://thanapon.info/aws-eks-cluster-autoscaler/"&gt;[AWS EKS] ลองใช้ Cluster autoscaler สำหรับ Scale K8s&lt;/a&gt; first appeared on &lt;a href="https://thanapon.info/"&gt;Thanapon&lt;/a&gt;.&lt;/p&gt;</content>
    <source>
      <title>Thanapon</title>
      <link rel="self" href="https://thanapon.info/feed/"/>
      <link rel="alternate" href="https://thanapon.info"/>
    </source>
  </entry>
  <entry>
    <id>urn:uuid:f6244587-0749-50cf-ba9e-9e7e7ee6b425</id>
    <title>0258 | EV FAQ</title>
    <updated>2023-08-28T16:26:44.000Z</updated>
    <author>
      <name>icez</name>
    </author>
    <published>2023-08-28T16:26:44.000Z</published>
    <link rel="alternate" href="https://www.icez.net/blog/167533/0258-ev-faq"/>
    <category term="Thai"/>
    <content type="html">&lt;h1&gt;แบตเสื่อม&lt;/h1&gt;
&lt;ol&gt;
&lt;li&gt;อาการ “แบตเสื่อม” มันคือการเก็บประจุได้น้อยลง ให้นึกก็เหมือนใช้รถน้ำมันไปแล้วถังน้ำมันเล็กลง (เติมน้ำมันได้น้อยลง = วิ่งได้ระยะทางน้อยลง)&lt;/li&gt;
&lt;li&gt;แบตมันจะค่อยๆ เสื่อม (คือระยะทางที่วิ่งได้เมื่อแบตเต็มลดลงเรื่อยๆ) ไม่ใช่ใช้ได้ปกติเรื่อยๆ แล้วพังขับไม่ได้ไปเลย&lt;/li&gt;
&lt;li&gt;แปลว่าการแบตเสื่อม (ถ้ายังไม่ถึงจุดที่พัง) ไม่ได้ทำให้ใช้งานรถไม่ได้ มันแค่ทำให้ระยะทางวิ่งได้สูงสุดลดลงเฉยๆ&lt;/li&gt;
&lt;li&gt;แบตไม่ได้เสื่อมง่ายขนาดนั้น เพราะขนาดแบต, เทคโนโลยีแบตของรถยนต์ไฟฟ้าแต่ละรุ่นในตลาดตอนนี้&lt;/li&gt;
&lt;li&gt;แบตจะเสื่อมถึงขั้นมีปัญหาเมื่อไหร่ ขึ้นกับขนาดแบตของรถ ยิ่งแบตใหญ่ยิ่งได้เปรียบ&lt;/li&gt;
&lt;li&gt;สมมติว่าแบตเต็มวิ่งได้ 300 km / แบต 1 ลูกจะใช้งานได้ประมาณ 1000-2000 cycle คิดขั้นต่ำที่ 1000 cycle ก็คือใช้ได้อย่างน้อยๆ 300,000 km&lt;/li&gt;
&lt;li&gt;แบตรถมีความจุสูงมาก ขั้นต่ำๆ 30 kWh ต่อให้เสื่อมไป 50% ก็ยังเหลือ 15 kWh เท่ากับการใช้ไฟทั้งวันของบ้านหลังเล็กๆ หลังนึง&lt;/li&gt;
&lt;/ol&gt;
&lt;h1&gt;ติดที่ชาร์จที่บ้าน&lt;/h1&gt;
&lt;ol&gt;
&lt;li&gt;ไม่จำเป็นต้องใช้ไฟ 3 เฟสก็ได้ เฟสเดียวก็เหลือเฟือ&lt;/li&gt;
&lt;li&gt;แต่ต้องเดินสายไฟใหม่ เพราะระหว่างชาร์จ มันกินไฟมากกว่าเครื่องทำน้ำอุ่นทั่วไปประมาณสองเท่า + ใช้งานนานต่อเนื่อง&lt;/li&gt;
&lt;li&gt;ดู spec รถที่จะซื้อ (หรือซื้อมาแล้ว) ด้วยว่ารับกระแสไฟแบบกระแสสลับ (AC) ได้สูงสุดเท่าไหร่กรณีชาร์จ 1 เฟส และ 3 เฟส&lt;/li&gt;
&lt;li&gt;ไม่ใช่รถทุกรุ่นจะรับไฟ 3 เฟสได้&lt;/li&gt;
&lt;/ol&gt;
&lt;h1&gt;เสียบปลั๊กชาร์จ (ชาร์จฉุกเฉิน)&lt;/h1&gt;
&lt;ol&gt;
&lt;li&gt;ชาร์จที่บ้านก็พอถูไถ&lt;/li&gt;
&lt;li&gt;ห้ามใช้ปลั๊กพ่วงเด็ดขาด อันตราย อาจเกิดไฟไหม้ได้&lt;/li&gt;
&lt;li&gt;ห้ามตั้งกระแสเกิน 16 Amp (ประมาณ 3500 Watt)&lt;/li&gt;
&lt;/ol&gt;</content>
    <source>
      <title>icez network</title>
      <link rel="self" href="https://www.icez.net/blog/feed"/>
      <link rel="alternate" href="https://www.icez.net/blog"/>
    </source>
  </entry>
  <entry>
    <id>urn:uuid:6bbe57d5-0a4c-5c30-b44a-f886c1c666b2</id>
    <title>0257 | Peer กับ Content Provider ต่างประเทศในไทยบน Internet Exchange “ในไทย”</title>
    <updated>2023-06-21T17:47:41.000Z</updated>
    <author>
      <name>icez</name>
    </author>
    <published>2023-06-21T17:47:41.000Z</published>
    <link rel="alternate" href="https://www.icez.net/blog/167530/local-peering-with-global-content-provider-in-thailand-on-internet-exchange"/>
    <category term="Thai"/>
    <content type="html">&lt;p&gt;ตอนนี้ผู้ให้บริการ Cloud / Content Provider หลายเจ้าเริ่มมาตั้ง node ในไทย และมีการเชื่อมต่อ internet ขาในประเทศกันเรื่อยๆ ก็เลยได้โอกาสขอ Peering กันผ่าน IX ครับ ที่ดังๆ ประมาณนี้&lt;/p&gt;
&lt;h2&gt;Cloudflare&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Peer อยู่กับ &lt;a href="https://www.peeringdb.com/ix/225"&gt;Thailand-IX&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;กดขอ peer ผ่านหน้าเว็บได้เลย https://peering.cloudflare.com/&lt;/li&gt;
&lt;li&gt;Peer แล้วได้ route หา cloudflare วงที่ใช้รับ Traffic จาก Client (ขา Anycast), DNS 1.1.1.1 “ในไทย” เลย&lt;/li&gt;
&lt;li&gt;ถ้าไม่ขอ peer จะได้มาแค่ ip ของ node ของ cloudflare ที่ TH-IX ผ่าน route server&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Microsoft&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Peer อยู่กับ &lt;a href="https://www.peeringdb.com/ix/225"&gt;Thailand-IX&lt;/a&gt; &lt;/li&gt;
&lt;li&gt;ขอ Peer ผ่าน Azure Portal ตามขั้นตอนในหน้าเว็บ &lt;a href="https://learn.microsoft.com/en-us/azure/internet-peering/howto-exchange-portal"&gt;https://learn.microsoft.com/en-us/azure/internet-peering/howto-exchange-portal&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Peer แล้วได้ route หาบริการของ microsoft (มี Github ด้วยนะ) และ Azure Cloud Singapore&lt;/li&gt;
&lt;li&gt;ถ้าไม่ขอ peer จะไม่ได้ route อะไรเลย&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Amazon&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Peer อยู่กับ &lt;a href="https://www.peeringdb.com/ix/225"&gt;Thailand-IX&lt;/a&gt; และ &lt;a href="https://www.peeringdb.com/ix/1025"&gt;BKNIX&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;ส่งเมลหา contact ตามข้อมูลใน &lt;a href="https://www.peeringdb.com/asn/16509"&gt;peeringdb&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Peer แล้วได้ route หา Amazon Cloud Singapore กับพวก Anycast และ Cloudfront&lt;/li&gt;
&lt;li&gt;ถ้าไม่ขอ peer จะไม่ได้ route อะไรเลย&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Twitch&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Peer อยู่กับ &lt;a href="https://www.peeringdb.com/ix/225"&gt;Thailand-IX&lt;/a&gt; และ &lt;a href="https://www.peeringdb.com/ix/1025"&gt;BKNIX&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;ส่งเมลหา contact ตามข้อมูลใน &lt;a href="https://www.peeringdb.com/asn/46489"&gt;peeringdb&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Peer แล้วได้ route หา node CDN ของ Twitch ไว้ดูสตรีมลื่นๆ&lt;/li&gt;
&lt;li&gt;ถ้าไม่ขอ peer จะไม่ได้ route อะไรเลย&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Fastly CDN&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Peer อยู่กับ &lt;a href="https://www.peeringdb.com/ix/225"&gt;Thailand-IX&lt;/a&gt; และ &lt;a href="https://www.peeringdb.com/ix/1025"&gt;BKNIX&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;ส่งเมลหา contact ตามข้อมูลใน &lt;a href="https://www.peeringdb.com/asn/54113"&gt;peeringdb&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;ได้ route หา CDN Node ของ Fastly ที่อยู่ในไทย&lt;/li&gt;
&lt;li&gt;ถ้าไม่ขอ peer จะได้ route บางส่วนผ่าน route server (แบบไม่ optimize)&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Riot Games&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Peer อยู่กับ &lt;a href="https://www.peeringdb.com/ix/225"&gt;Thailand-IX&lt;/a&gt; และ &lt;a href="https://www.peeringdb.com/ix/1025"&gt;BKNIX&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;กรอกฟอร์มตาม link ใน &lt;a href="https://www.peeringdb.com/asn/6507"&gt;peeringdb&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;ได้ Route หาเกม Valorant และเกมในเครือของ Riot Games&lt;/li&gt;
&lt;li&gt;ถ้าไม่ขอ peer จะไม่ได้ route อะไรเลย&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;TWGate / ChungHwa Telecom Taiwan&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Peer อยู่กับ &lt;a href="https://www.peeringdb.com/ix/1025"&gt;BKNIX&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;ส่งเมลหา contact ตามข้อมูลใน &lt;a href="https://www.peeringdb.com/asn/9505"&gt;peeringdb&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;ได้ route ลูกค้าทั้งหมดของ TWGate&lt;/li&gt;
&lt;li&gt;ถ้าไม่ขอ peer จะได้ route บางส่วนผ่าน route server + ไม่รับประกาศ route ของเรา&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Hurricane Electric&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Peer อยู่กับ &lt;a href="https://www.peeringdb.com/ix/1025"&gt;BKNIX&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;ส่งเมลหา contact ตามข้อมูลใน &lt;a href="https://www.peeringdb.com/asn/6939"&gt;peeringdb&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;ได้ route ลูกค้าทั้งหมดของ HE.net (คำเตือน route เยอะมาก ประมาณ 150k prefix) &lt;/li&gt;
&lt;li&gt;ถ้าไม่ขอ peer ได้ route บางส่วน (ประมาณ 100k prefix) — ถ้าไม่ได้ route ทาง BKNIX อาจ suppress ไว้อยู่ ถ้าอุปกรณ์รับไหวลองบอกให้เค้าปล่อยมาได้&lt;/li&gt;
&lt;/ul&gt;</content>
    <source>
      <title>icez network</title>
      <link rel="self" href="https://www.icez.net/blog/feed"/>
      <link rel="alternate" href="https://www.icez.net/blog"/>
    </source>
  </entry>
  <entry>
    <id>urn:uuid:260ff803-5bd0-50d0-8294-f7d31451e03d</id>
    <title>Prepend line with line length with Linux command</title>
    <updated>2023-06-01T03:44:00.000Z</updated>
    <author>
      <name>Tap</name>
    </author>
    <published>2023-06-01T03:44:00.000Z</published>
    <link rel="alternate" href="http://visibletrap.blogspot.com/2023/06/prepend-line-with-line-length-with.html"/>
    <category term="Thai"/>
    <content type="html">&lt;p&gt; &lt;span&gt;awk '{printf "%2d| %s\n",length,$0}' filename&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span&gt;Credit: &lt;a href="https://www.baeldung.com/linux/print-longest-lines-in-file#introduction-to-the-problem"&gt;https://www.baeldung.com/linux/print-longest-lines-in-file#introduction-to-the-problem&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;</content>
    <source>
      <title>tAp's blog</title>
      <link rel="self" href="http://visibletrap.blogspot.com/feeds/posts/default"/>
      <link rel="alternate" href="http://visibletrap.blogspot.com/"/>
    </source>
  </entry>
  <entry>
    <id>urn:uuid:7a338fab-e3bb-55db-bce6-411f100960e0</id>
    <title>How to run packer on Apple Silicon machine to create an image targeting x86 server</title>
    <updated>2023-05-09T03:27:00.002Z</updated>
    <author>
      <name>Tap</name>
    </author>
    <published>2023-05-09T03:27:00.002Z</published>
    <link rel="alternate" href="http://visibletrap.blogspot.com/2023/05/how-to-run-packer-on-apple-silicon.html"/>
    <category term="Thai"/>
    <content type="html">&lt;p&gt;Set this environment variable before running packer command. &lt;/p&gt;&lt;p&gt;&lt;span&gt;DOCKER_DEFAULT_PLATFORM=linux/amd64&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;</content>
    <source>
      <title>tAp's blog</title>
      <link rel="self" href="http://visibletrap.blogspot.com/feeds/posts/default"/>
      <link rel="alternate" href="http://visibletrap.blogspot.com/"/>
    </source>
  </entry>
  <entry>
    <id>urn:uuid:720e1463-2eb9-56d1-8a0c-5774609ddda0</id>
    <title>ทำความเข้าใจ “MQTT with TLS” ใน AWS IoT Core สักหน่อย</title>
    <updated>2023-03-05T15:14:16.000Z</updated>
    <author>
      <name>thanapon.tap</name>
    </author>
    <published>2023-03-05T15:14:16.000Z</published>
    <link rel="alternate" href="https://thanapon.info/mqtt-with-tls-on-aws-iot-core/?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=mqtt-with-tls-on-aws-iot-core"/>
    <category term="Thai"/>
    <content type="html">&lt;p&gt;พอดีมีคำถามกับตัวเองว่า เอ๊ะ MQTT with TLS มันทำงานยังไงนะ แล้วทำไมตอนเชื่อมต่อ device เข้ากับ Message Broker จำเป็นต้องยัด Client certificate ลงไปด้วยนะ ก็เลยไปหาคำตอบมา ร่ายตั้งแต่ต้นเลยละกันนะ&lt;/p&gt;



&lt;h2&gt;เกริ่นก่อนนะ ปกติเราจะเข้ารหัสกันยังไง!!! &lt;/h2&gt;



&lt;p&gt;หลังจากไปทำการบ้านมาก็เข้าใจว่าปัจจุบันจะมีการเข้ารหัสอยู่ทั้งหมด 2 แบบด้วยกัน&lt;/p&gt;



&lt;p&gt;ซึ่งแบบแรกเป็นการเข้ารหัสแบบ &lt;strong&gt;Symmetric Encryption&lt;/strong&gt; หมายถึงการเข้ารหัสแบบทางเดียว คือเราใช้แค่ Secret key ชุดเดียวกันในการเข้ารหัส [Encrypt] และถอดรหัส [Decrypt]&lt;/p&gt;



&lt;p&gt;ยกตัวอย่างเช่น “Token : akakleni192j5,ma” อะไรบลาๆ&lt;/p&gt;


&lt;div&gt;
&lt;figure&gt;&lt;img loading="lazy" width="640" height="319" src="https://localhost:54526/wp-content/uploads/2023/03/image.png" alt="" srcset="https://feeds.llun.dev/media/91907e7078b6ccf4a5cca8d3381445931e927e1e0ec77bd808b0a2a76009a8de.png 640w, https://feeds.llun.dev/media/576667ae394930cd47a199449f64cc2c480e33164eb25062927dca0692cd914a.png 300w, https://feeds.llun.dev/media/fb456a714ce8494a17573fc060474385381ab3c71a9d38ce6f8d69c253d4ce99.png 600w" /&gt;&lt;figcaption&gt;Ref: https://en.wikipedia.org/wiki/Symmetric-key_algorithm&lt;/figcaption&gt;&lt;/figure&gt;
&lt;/div&gt;


&lt;p&gt;&lt;strong&gt;Asymmetric Encryption&lt;/strong&gt; แปลตรงๆก็คือการเข้ารหัสแบบไม่สมมาตร ซึ่งหลักการทำงานคือ มีกุญแจอยู่ 2 ชุด ชุดแรกเอาไว้เข้ารหัส [Public Key] ส่วนกุญแจอีกดอกก็เอาไว้ถอดรหัส [Private Key] ซึ่งสุดท้ายแล้วเราจะเอา Public/Private Key นี้หล่ะไปคุยกันต่อในการทำ Digital Signature ซึ่งจะเอาไว้ใช้สำหรับการ Authenticate [Sign] และการ Verify ข้อมูลว่าเป็นข้อมูลของคนๆนี้จริงๆนะ ไม่ใช่ Attacker&lt;/p&gt;


&lt;div&gt;
&lt;figure&gt;&lt;img loading="lazy" width="800" height="490" src="https://localhost:54526/wp-content/uploads/2023/03/image-1.png" alt="" srcset="https://feeds.llun.dev/media/08a7a30714f46c2c52ccd40e6335a7b1c6e6819199bf0d67244755b67117a9b4.png 800w, https://feeds.llun.dev/media/2e456a75b6e783a5af7b1694ef12a187f9fc4ffa7993e881e36caf83637ce94c.png 300w, https://feeds.llun.dev/media/7aaed97f8a9d994ebb83d39bd150a803e69c7f37b785a0b10c09da7788f1e3ef.png 768w, https://feeds.llun.dev/media/9e5659f693f0a087c5cce02044a234cb40210fe3f6bc29198c8494c3f9f29119.png 600w" /&gt;&lt;figcaption&gt;Ref: https://www.okta.com/identity-101/asymmetric-encryption/&lt;/figcaption&gt;&lt;/figure&gt;
&lt;/div&gt;


&lt;h2&gt;ที่มาของ SSL/TLS คือยังไงนะ&lt;/h2&gt;



&lt;p&gt;SSL/TLS ทั้งคู่ใช่ทั้ง &lt;strong&gt;Symmetric Encryption&lt;/strong&gt; และ &lt;strong&gt;Asymmetric Encryption&lt;/strong&gt; ในการส่งข้อมูลหากัน โดยที่จะใช้ &lt;strong&gt;Asymmetric Encryption&lt;/strong&gt; ในการ Setup connection ระหว่าง Server &amp;lt;-&amp;gt; Client ส่วน &lt;strong&gt;Symmetric Encryption&lt;/strong&gt; จะใช้ในการส่งข้อมูลหากันภายใน Secure Session&lt;/p&gt;



&lt;p&gt;SSL ย่อมาจาก Secure Sockets Layer ซึ่งเป็น Protocol ที่ใช้สำหรับเข้ารหัสและป้องกันข้อมูลในขณะที่มีการส่งข้อมูลกันหากันผ่าน Internet&lt;/p&gt;



&lt;p&gt;ส่วน TLS ก็คือ Transport Layer Security ซึ่งก็เป็น Protocol ตัวใหม่กว่าที่ถูกพัฒนามาจาก SSL ซึ่งเข้ามาแก้ไขเรื่อง Security ของ SSL อีกที &lt;/p&gt;



&lt;p&gt;โดยที่ AWS IoT Core นั้นจะ Support TLS 1.2 และจะใช้ Server authentication หรือ Client authentication ก็ได้ แต่ถ้าใครอยากใช้วิธีแปลกๆ ก็ไปใช้ &lt;a href="https://docs.aws.amazon.com/iot/latest/developerguide/custom-authentication.html" target="_blank"&gt;Custom Authentication&lt;/a&gt; เอาเด้อ&lt;/p&gt;



&lt;h2&gt;Server authentication กับ Client authentication ต่างกันยังไงนะ&lt;/h2&gt;



&lt;p&gt;&lt;strong&gt;Server authentication&lt;/strong&gt;; User จะใช้ Public Key ที่ได้รับมาจาก Server ในการเข้ารหัส [Encrypt] ก่อนที่จะส่งข้อมูลไปยัง Server ส่วน Server ก็แค่ถอดรหัส [Decrypt] โดยใช้ Private Key ก็จบ ซึ่งวิธีนี้เราจะเก็บ Public Key ไว้ที่ Client เพื่อใช้ในการ Authen กันนะ&lt;/p&gt;



&lt;p&gt;ในส่วนของ &lt;strong&gt;AWS IoT client authentication&lt;/strong&gt; นั้น Client จะต้องเก็บ Private Key, Client Certificate ไว้กับตัวเพื่อใช้ในการ Authen ซึ่งจะต้องไป validate กับ AWS IoT Core อีกที่ โดยที่ Client Certificate นั้นจะเอาไว้สำหรับ verify ความถูกต้องระหว่าง Private Key กับ Public Key นั้นว่ามีความสอดคล้องกันหรือไม่ภายใน AWS IoT Core&lt;/p&gt;



&lt;p&gt;สรุปก็คือ ถ้าให้เลือกใช้งาน MQTT with TLS แนะนำให้ใช้ Client Authenticate เพราะว่าจะมีความปลอดภัยมากซึ่งสามารถสรุปได้ดังนี้&lt;/p&gt;



&lt;ul&gt;
&lt;li&gt;เราสามารถ Verify และ Identity MQTT Client ที่เข้ามาต่อกับ Broker ได้&lt;/li&gt;



&lt;li&gt;การ Authenticate MQTT Client จะเกิดขึ้น​ ณ Transport Layer ซึ่งถ้าหาก TLS Handshake ยังไม่สำเร็จ  MQTT Client ก็ยังไม่สามารถ Connect และส่งข้อความมาที่ Broker ได้เลย&lt;/li&gt;
&lt;/ul&gt;



&lt;p&gt;ซึ่งก็มี Overhead เหมือนกัน ในด้าน CPU และ Memory เองเพราะถ้าเป็นอุปกรณ์ Embedded system ตัวเล็กๆ ก็อาจจะรองรับไม่ไหวก็ได้นะ&lt;/p&gt;



&lt;blockquote&gt;
&lt;p&gt;&lt;a href="https://www.hivemq.com/blog/mqtt-security-fundamentals-tls-ssl/" target="_blank"&gt;TLS/SSL – MQTT Security Fundamentals&lt;/a&gt;&lt;/p&gt;
&lt;cite&gt;&lt;a href="https://www.hivemq.com/blog/mqtt-security-fundamentals-tls-ssl/" target="_blank"&gt;https://www.hivemq.com/blog/mqtt-security-fundamentals-tls-ssl/&lt;/a&gt;&lt;/cite&gt;&lt;/blockquote&gt;



&lt;blockquote&gt;
&lt;p&gt;&lt;a href="https://www.hivemq.com/blog/mqtt-security-fundamentals-x509-client-certificate-authentication/" target="_blank"&gt;X509 Client Certificate Authentication – MQTT Security Fundamentals&lt;/a&gt;&lt;/p&gt;
&lt;cite&gt;&lt;a href="https://www.hivemq.com/blog/mqtt-security-fundamentals-x509-client-certificate-authentication/" target="_blank"&gt;https://www.hivemq.com/blog/mqtt-security-fundamentals-x509-client-certificate-authentication/&lt;/a&gt;&lt;/cite&gt;&lt;/blockquote&gt;



&lt;blockquote&gt;
&lt;p&gt;&lt;a href="https://docs.aws.amazon.com/iot/latest/developerguide/security.html" target="_blank"&gt;Security in AWS IoT&lt;/a&gt;&lt;/p&gt;
&lt;cite&gt;&lt;a href="https://www.hivemq.com/blog/mqtt-security-fundamentals-x509-client-certificate-authentication/" target="_blank"&gt;https://www.hivemq.com/blog/mqtt-security-fundamentals-x509-client-certificate-authentication/&lt;/a&gt;&lt;/cite&gt;&lt;/blockquote&gt;&lt;p&gt;The post &lt;a href="https://thanapon.info/mqtt-with-tls-on-aws-iot-core/"&gt;ทำความเข้าใจ “MQTT with TLS” ใน AWS IoT Core สักหน่อย&lt;/a&gt; first appeared on &lt;a href="https://thanapon.info/"&gt;Thanapon&lt;/a&gt;.&lt;/p&gt;</content>
    <source>
      <title>Thanapon</title>
      <link rel="self" href="https://thanapon.info/feed/"/>
      <link rel="alternate" href="https://thanapon.info"/>
    </source>
  </entry>
  <entry>
    <id>urn:uuid:0c884053-0fa2-57fc-9e09-fd95e7bede50</id>
    <title>[AWS-IoT] เรียกใช้ AWS Services ผ่าน Device Certificate X.509 โดยใช้ Credential-Provider [1]</title>
    <updated>2023-01-08T00:00:00.000Z</updated>
    <author>
      <name>thanapon.tap</name>
    </author>
    <published>2023-01-08T00:00:00.000Z</published>
    <link rel="alternate" href="https://thanapon.info/aws-iot-credential-provider/?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=aws-iot-credential-provider"/>
    <category term="Thai"/>
    <content type="html">&lt;p&gt;เป็นที่รู้กันอยู่แล้วนะครับว่าถ้าเราจะเชื่อมต่ออุปกรณ์เข้าไปที่ AWS IoT Core service นั้นเราจะใช้ X.509 certificates ผ่าน MQTT with TLS [MQTTs] ไปที่ AWS อีกที&lt;/p&gt;



&lt;p&gt;ปกติถ้าเราเชื่อมต่อเข้าไปที่ AWS IoT Core นั้นเราจะต้องมี 3 Component ด้วยกันคือ&lt;/p&gt;



&lt;ul&gt;
&lt;li&gt;Root CA ของ AWS&lt;/li&gt;



&lt;li&gt;Private key&lt;/li&gt;



&lt;li&gt;Client device certificate&lt;/li&gt;
&lt;/ul&gt;



&lt;p&gt;ซึ่งผมก็เกิดคำถามที่ว่า อ่าว!! แล้วถ้าเราจะไปคุยกับ Service อื่นหล่ะต้องทำยังไง? หรือว่าเราสามารถ Generate AWS credentials ที่มี Access token กับ Secret token ออกมาแล้วเอาไปยัดใส่ใน Firmware ได้เลยน้าา ซึ่งมันก็ทำได้เหมือนกันหล่ะ แต่!!!!! ปัญหาต่อไปน่าจะอยู่ที่เรื่อง Security กับ Key-Rotate แล้วหล่ะ เพราะถ้าหากวันหนึ่ง Key นั้นเกิดหลุดออกไป เราต้องไล่เปลี่ยน Key ให้กับอุปกรณ์เราทั้งหมดเลยหรอ ดูเหมือนจะเป็นเรื่องยากเหมือนกันนะ ถึงแม้จะใช้ OTA [over-the-air update] แล้วก็เถอะ&lt;/p&gt;



&lt;figure&gt;&lt;img loading="lazy" width="1007" height="729" src="https://localhost:54526/wp-content/uploads/2023/01/image.png" alt="" srcset="https://feeds.llun.dev/media/4565eae2112da69cfd16ce7fe7e4a89e933aa3a1dac6a6f3df8462625a2464db.png 1007w, https://feeds.llun.dev/media/7282bbcf1f8e44e27afeb6aef63e89b3d9098ac3c6265a848daf638a8d0dbea4.png 300w, https://feeds.llun.dev/media/248c2ca34bbcbc00f4bac75263f9000649a85797587aa22508175d01c11f44d1.png 768w, https://feeds.llun.dev/media/9e6b8d48917089100755eedac85c44067864f0cb41f94364346b677a53ca258e.png 600w" /&gt;&lt;/figure&gt;



&lt;p&gt;สุดท้ายหลังจากค้นหาก็เจอ Solution หนึ่งที่คิดว่าเป็น Best-practics ที่ดีเลยคือ AWS services นั้นสามารถเรียกได้โดยใช้ &lt;a href="https://docs.aws.amazon.com/general/latest/gr/signature-version-4.html" target="_blank"&gt;AWS Signature Version 4 format&lt;/a&gt; ซึ่งเป็นวิธีการ Authorization รูปแบบหนึ่งภายใน AWS services นั้นหล่ะ โดยมันจะใช้ Access token, Secret token ละก็ Session token ในการสร้าง AWS Request ชุดหนึ่งขึ้นมาเอาไว้แปะไปกับ Header ตอนเรียกใช้งาน AWS Service นั้นๆ&lt;/p&gt;



&lt;p&gt;โดยที่ Token ทั้ง 3 ตัวนั้นเราสามารถเรียกมาได้ยังไงหรอ??? คำตอบก็คือเราสามารถดึง Token พวกนี้ผ่าน &lt;strong&gt;Credential Provider&lt;/strong&gt; ของ AWS IoT Core ได้เลยโดยที่เราใช้แค่ Device Certificate แบบ X.509 เหมือนเดิมทุกอย่างเลย&lt;/p&gt;



&lt;blockquote&gt;
&lt;p&gt;การใช้ Credential Provider นั้นเราสามารถกำหนด Role ของ Token ด้วยโดยใช้ Assume role ใน AWS IoT Core กับ IAM ว่าจะให้มี Permission ในการ Access service อะไรได้บ้าง โดยที่ Token ที่เราได้รับมาก็จะมีอายุของมันด้วยนะ&lt;/p&gt;
&lt;/blockquote&gt;



&lt;hr /&gt;



&lt;h2&gt;สาธยายมาเยอะและเริ่มเลยละกันครับ&lt;/h2&gt;



&lt;ul&gt;
&lt;li&gt;เริ่มต้นเราต้องมี Root CA, Private Key และ Device Certificate ก่อนซึ่งจะถูก Generate มาจาก AWS IoT Core ตอนที่เราสร้างแรกๆเลย&lt;/li&gt;
&lt;/ul&gt;


&lt;div&gt;
&lt;figure&gt;&lt;img loading="lazy" src="https://localhost:54526/wp-content/uploads/2023/01/image-1-821x1024.png" alt="" width="411" height="512" srcset="https://feeds.llun.dev/media/2ab4e70b02caf39f135c39193ce1f2d783093860306a5ab56b0f460ce1c48114.png 821w, https://feeds.llun.dev/media/ed095146ad6135e6336dc8337113d96f3617ce310ef28a6096d7112f2a2ba0e5.png 241w, https://feeds.llun.dev/media/23f49c5e2d74d3628eeb0e08a8baddc7307538ac55e799780e9f1867544546e7.png 768w, https://feeds.llun.dev/media/8c69d9679746bb42b4bfb3ab0b4746e9468b984caf003cab6078054f9cb5ee9f.png 600w, https://feeds.llun.dev/media/49a617eac0edb46655ffe4c1e0998021aaa1ce2212b70014710d4b95768f8001.png 1198w" /&gt;&lt;/figure&gt;
&lt;/div&gt;


&lt;ul&gt;
&lt;li&gt;หลังจากที่ได้ Device certiifcate แล้วเราก็ต้องไปหา Endpoint ของ Credential-provider ของ AWS IoT Core ของเราอีกทีโดยใช้ AWS CLI ในการเรียก Endpoint นั้นๆ&lt;/li&gt;
&lt;/ul&gt;



&lt;div&gt;&lt;pre&gt;&lt;code&gt;aws iot describe-endpoint --endpoint-type iot:CredentialProvider&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;figure&gt;&lt;img loading="lazy" width="1024" height="259" src="https://localhost:54526/wp-content/uploads/2023/01/image-2-1024x259.png" alt="" srcset="https://feeds.llun.dev/media/5ce4ed813fb6873281e63f02885576704d636bd9c732e62c620c98a34c026d33.png 1024w, https://feeds.llun.dev/media/3e27481454ca4c73e74ac0245980611d58639726c0cbc6dd7a154ebd941a9fa0.png 300w, https://feeds.llun.dev/media/971b1dcd136d3aac783611fa9d86c59153452bb95a588e77241307313f5536dc.png 768w, https://feeds.llun.dev/media/2ea492bfe59ac5b63cec8610c759d20fda557d8bad59bda02f55da87f44002d4.png 1536w, https://feeds.llun.dev/media/28e9b6649d4107b0463ca08bac649cb3fb1ca691819939edf5901ab21abf6ce9.png 600w, https://feeds.llun.dev/media/4fe926b4da1fe93857618ff31bee4a6df38f3c7f0d35e5cd08770a2899261a10.png 1726w" /&gt;&lt;/figure&gt;



&lt;ul&gt;
&lt;li&gt;สร้าง Policy ใน IAM ก่อนเพื่อกำหนดว่า Token นี้เราจะให้ Access service อะไรได้บ้าง&lt;/li&gt;
&lt;/ul&gt;



&lt;figure&gt;&lt;img loading="lazy" width="1024" height="490" src="https://localhost:54526/wp-content/uploads/2023/01/image-4-1024x490.png" alt="" srcset="https://feeds.llun.dev/media/0aea933f8ef87a70666581f4176a37bc37c8af1ca3bb6e778c6cd2a7584b1946.png 1024w, https://feeds.llun.dev/media/c1a905984ef182c67b1b42594d98afb2cdfc8613d336f6cc17da6b040c617b80.png 300w, https://feeds.llun.dev/media/fe9f1512b99a7a930647a3b12ee2b36f00a7162214a0854ded6ebb7bd45884dc.png 768w, https://feeds.llun.dev/media/dfbde88e5a6f06d19e787904deec68edb51607b2c79ca3f72e048a0da00b5dc2.png 1536w, https://feeds.llun.dev/media/d4ae03796a4d03f7e700949cb4d09c4efcd91f244a849288388c68404988a840.png 2048w, https://feeds.llun.dev/media/d715a2829a015d398a9c23adcaf30fd8705ab0f5b5c9c9df8ab1a266895eb4d1.png 600w" /&gt;&lt;/figure&gt;



&lt;blockquote&gt;
&lt;p&gt;จากตัวอย่างผมจะให้อุปกรณ์ของผมสามารถ Access ไปที่ S3 ได้ดังนั้นต้องไปสร้าง Policy ก่อนแล้วค่อย Attach policy เข้ามาใน Role อีกที&lt;/p&gt;
&lt;/blockquote&gt;



&lt;ul&gt;
&lt;li&gt;สร้าง Role ขึ้นมาใหม่ในหน้า IAM Console เสร็จแล้วก็ Attach policy เข้าไปได้เลย&lt;strong&gt;&lt;mark&gt; อย่าลืมเพิ่ม Trust policy เข้าไปด้วยนะ&lt;/mark&gt;&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;



&lt;figure&gt;&lt;img loading="lazy" width="1024" height="517" src="https://localhost:54526/wp-content/uploads/2023/01/image-6-1024x517.png" alt="" srcset="https://feeds.llun.dev/media/a4ca78227da6cbde39208c59d2927b8b4ef32921e2795092ebaa6275e39ab88e.png 1024w, https://feeds.llun.dev/media/d0391c474f159c3a3a672ebee147dc21813c8e36e33bc99c390511ee02c85eec.png 300w, https://feeds.llun.dev/media/6f2ac594a7fb3c228b371312a52a8fef627c6dbfb878000611e1276daece1574.png 768w, https://feeds.llun.dev/media/86ef454673ebe7d58ef38978410a201b62a94178ca5ecfe973aca812090496e6.png 1536w, https://feeds.llun.dev/media/8de0b0e16ca4873bcacaa4a42419f47892f516597c8f99c982cc8ab5bc0d1716.png 2048w, https://feeds.llun.dev/media/8fa4f833bc641d34b85521ce9bd66822c34e4322c9b2a734e715a24bd57a6fa0.png 600w" /&gt;&lt;/figure&gt;



&lt;div&gt;&lt;pre&gt;&lt;code&gt;{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": {
                "Service": "credentials.iot.amazonaws.com"
            },
            "Action": "sts:AssumeRole"
        }
    ]
}&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;เสร็จแล้วเราจะได้ Role ที่มีสิทธิ์ในการ Access S3 มาแล้ว&lt;/li&gt;
&lt;/ul&gt;



&lt;figure&gt;&lt;img loading="lazy" width="1024" height="503" src="https://localhost:54526/wp-content/uploads/2023/01/image-3-1024x503.png" alt="" srcset="https://feeds.llun.dev/media/039965b0ec5aa0f4bb51ae032a22e83c3ca00f56a9e3e7ab62d91eb945531042.png 1024w, https://feeds.llun.dev/media/ab7ba6ec7155a0f0a971ca7faed8f4bf51ec1b95bcaf0dac44a6f385a8cea754.png 300w, https://feeds.llun.dev/media/d5b3e98e80fcab88fc12b640ea3b400fc321f60e3f401c1b68df4af05592db6f.png 768w, https://feeds.llun.dev/media/c24b5543e7943c49613b5c7080fac19a3f263269a7bd01d8bbe73996c4a36a8d.png 1536w, https://feeds.llun.dev/media/b2607aee0277666e34b8b630533a0482cd9e8ea45ed1c4736554c03d021f1ac8.png 2048w, https://feeds.llun.dev/media/68d1c3e32cd5b1c765e3485729f0c9552975cd6e6acc049d61d9e9a9121c7405.png 600w" /&gt;&lt;/figure&gt;



&lt;ul&gt;
&lt;li&gt;จากนั้นกลับไปที่ AWS IoT Core เพื่อทำการสร้าง Role aliases สำหรับ Authen S3&lt;/li&gt;
&lt;/ul&gt;



&lt;blockquote&gt;
&lt;p&gt;Credential duration คือ token จะ expire กี่วินาทีหลังจากที่เราสร้างขึ้นมาผ่าน Credential provider&lt;/p&gt;
&lt;/blockquote&gt;



&lt;figure&gt;&lt;img loading="lazy" width="1024" height="489" src="https://localhost:54526/wp-content/uploads/2023/01/image-7-1024x489.png" alt="" srcset="https://feeds.llun.dev/media/50f6001df7b021707ddf1b34192f71be8e0132af58d5476e54671afefccb16bb.png 1024w, https://feeds.llun.dev/media/014b44513265174c37b806802dd335431506111f0e6d6ac50fab283a9f1cecef.png 300w, https://feeds.llun.dev/media/00d81a6390f1c6515b9e5bb42de905ea9a39a5fe3de0a76dc8de13213430f711.png 768w, https://feeds.llun.dev/media/db84f4880639b9061ed6647336d9d00101d44347715e607e52b2e86aa7892015.png 1536w, https://feeds.llun.dev/media/c9c541169bf7e8694bdc5fcc630dfc324194a209b6a1cb0eb09ae8cf3f4eff48.png 2048w, https://feeds.llun.dev/media/230e96ce5fa1583a9465fe3ad318f8233db6dc1468068c3d48e33ef3c3aac994.png 600w" /&gt;&lt;/figure&gt;



&lt;ul&gt;
&lt;li&gt;ไปที่ Security &amp;gt; Policies เพื่อสร้าง Policy สำหรับเรียกใช้ Role Aliases ที่สร้างมาก่อนหน้านี้ให้กับ Device&lt;/li&gt;
&lt;/ul&gt;



&lt;figure&gt;&lt;img loading="lazy" width="1024" height="450" src="https://localhost:54526/wp-content/uploads/2023/01/image-8-1024x450.png" alt="" srcset="https://feeds.llun.dev/media/4f2df8f10eede37cf6775bafa91b241f71a3e13135eddd9a6683150d56a6ba4b.png 1024w, https://feeds.llun.dev/media/3cf44bee314e12871d994d249bbfeda2bc597ecf35f6e73368fc833647acac7d.png 300w, https://feeds.llun.dev/media/148618b60126c3a82964d8b8397c55db18f4c11bffadfbda3ad6134884092e84.png 768w, https://feeds.llun.dev/media/a7bfcb4b665eba30999b453ce0393874ebf3c91378fc0145c9839d7f94f102aa.png 1536w, https://feeds.llun.dev/media/e8360a1003cf080ed8743e476e94d1bad84a00aa5fbf2baea68d6c0371254cd5.png 2048w, https://feeds.llun.dev/media/29e7d7bca2e77d9709910857ec1d5e85d08fb9d39d2631d2678c47248071e96e.png 600w" /&gt;&lt;/figure&gt;



&lt;ul&gt;
&lt;li&gt;กลับไปที่ Things ของเราก่อน เลือก Certificate tab แล้วเลือก CertificateID&lt;/li&gt;
&lt;/ul&gt;



&lt;figure&gt;&lt;img loading="lazy" width="1024" height="458" src="https://localhost:54526/wp-content/uploads/2023/01/image-9-1024x458.png" alt="" srcset="https://feeds.llun.dev/media/cf08c277a36fcedd1bbb46d9ee0b126d8e1b694600d41e8270650ebc09a48377.png 1024w, https://feeds.llun.dev/media/ee2ebdb65bda6cf67b8aa32b87430bcab0baf8a982cac001953bbfd31532b41b.png 300w, https://feeds.llun.dev/media/62e2ae66ef77291703da22e7d6a26d280dcafbdecb149276a9b21ed548fdb797.png 768w, https://feeds.llun.dev/media/c8fcf2ca26be5cac609efbc2184ca01fd1d5e870f7b7a4026193bdf95ee7c375.png 1536w, https://feeds.llun.dev/media/e8c2de169c7dd8878042796f48b0a13b104f2152b4270c48a3a779e39918ad63.png 2048w, https://feeds.llun.dev/media/3165b5058bef70c48ed8f8fc7fb8b3916980c21aa5201d447c759e450bf01279.png 600w" /&gt;&lt;/figure&gt;



&lt;ul&gt;
&lt;li&gt;Attact policies ชื่อ &lt;strong&gt;AssumeRoleWithCertificate&lt;/strong&gt; เข้าไปเลย&lt;/li&gt;
&lt;/ul&gt;



&lt;figure&gt;&lt;img loading="lazy" width="1024" height="233" src="https://localhost:54526/wp-content/uploads/2023/01/image-10-1024x233.png" alt="" srcset="https://feeds.llun.dev/media/541f4bf4542c82f42fbfd3e3167e0e55d263e69bb99f9c181e6eae14e21525cd.png 1024w, https://feeds.llun.dev/media/f7d78c7c386a0dbed9c34cad1a9e6952433399ad2957108fdbd57da485b7741b.png 300w, https://feeds.llun.dev/media/95a0ac17cffb5726c3855471773dec9b5edf3c37c1aed164b340058f937c0542.png 768w, https://feeds.llun.dev/media/5323c60f5daa045a996712e25d41ae6628e0b8e991854022097df1f24e89f04c.png 1536w, https://feeds.llun.dev/media/79412dbc8c8d64484b49b90d67214719887326488b7212f8b5c4baf3303aa1b5.png 2048w, https://feeds.llun.dev/media/b8bdfba584c246fd82db79e3c4dc68e6ce4f17b438a668ca4391dd174aa1ad7b.png 600w" /&gt;&lt;/figure&gt;



&lt;h2&gt;ทดสอบ Curl ผ่านสักหน่อยว่าสามารถเรียกได้ไหม&lt;/h2&gt;



&lt;div&gt;&lt;pre&gt;&lt;code&gt;curl --cert &amp;lt;CERTIFICATE.crt&amp;gt; --key &amp;lt;PRIVATE-KEY.key&amp;gt; -H "x-amzn-iot-thingname: &amp;lt;THINGS-NAME&amp;gt;" --cacert AmazonRootCA1.pem https://&amp;lt;ENDPOINT&amp;gt;/role-aliases/&amp;lt;ROLE-ALIAS&amp;gt;/credentials&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;CERTIFICATE.crt&lt;/strong&gt;: Device Certificate ที่ได้จากการสร้าง Things&lt;/p&gt;



&lt;p&gt;&lt;strong&gt;PRIVATE-KEY.key&lt;/strong&gt;: Private Key ที่ได้จากการสร้าง Things&lt;/p&gt;



&lt;p&gt;&lt;strong&gt;THINGS-NAME&lt;/strong&gt;: ชื่อ Thing&lt;/p&gt;



&lt;p&gt;&lt;strong&gt;ENDPOINT&lt;/strong&gt;: Endpoint ของ Credential provider&lt;/p&gt;



&lt;p&gt;&lt;strong&gt;ROLE-ALIAS&lt;/strong&gt;: Role alias ที่สร้างไว้ก่อนหน้านี้&lt;/p&gt;
&lt;/blockquote&gt;



&lt;h2&gt;Result:&lt;/h2&gt;



&lt;figure&gt;&lt;img loading="lazy" width="1024" height="481" src="https://localhost:54526/wp-content/uploads/2023/01/image-12-1024x481.png" alt="" srcset="https://feeds.llun.dev/media/0a68132c3c8316f8c78849418f179176c2e030fdfd2442beb745a21c54f493db.png 1024w, https://feeds.llun.dev/media/90e0d71926aebc401f21988dde92bdecb2ff17e3bf0c40926d2d05db411b4dc4.png 300w, https://feeds.llun.dev/media/889218672e987cdfa3edfd0ad0fd23c66897eede990b187517df54db0925e3fd.png 768w, https://feeds.llun.dev/media/5ab7ecc8a7d542d07bfc0fdb0ea144393b1bdc7ea2e9864f93c744fbea5de869.png 600w, https://feeds.llun.dev/media/03b24c1ef2d374e92f14ba5e85243a3cf8ad0418865ff8015baa2e3a70b1ef4a.png 1438w" /&gt;&lt;/figure&gt;



&lt;p&gt;จากนั้นเราก็สามารถนำ AccessKeyId, SecretAccessKey และ SessionToken ไปใช้ต่อสำหรับสร้าง AWS Signature V4 ซึ่งผมขอยกไปเป็นอีกหนึ่งบทความนะครับ หวังว่าบทความนี้จะมีประโยชน์สำหรับนักพัฒนาบน AWS IoT Core นะครับ ส่วนการใช้งานผ่าน Arduino เดี๋ยวจะพยายามเขียนเพิ่มในบทความหน้าให้นะครับ&lt;/p&gt;



&lt;p&gt;สำหรับวันนี้ขอบคุณและสวัสดีปีใหม่ 2566 ครับ &lt;img src="https://feeds.llun.dev/media/011dc904d793fcb8e2b1c94268ee0b9856604351001b5a27d2bc1e8680c27587.png" alt="🎆" /&gt;&lt;img src="https://feeds.llun.dev/media/011dc904d793fcb8e2b1c94268ee0b9856604351001b5a27d2bc1e8680c27587.png" alt="🎆" /&gt;&lt;img src="https://feeds.llun.dev/media/011dc904d793fcb8e2b1c94268ee0b9856604351001b5a27d2bc1e8680c27587.png" alt="🎆" /&gt;&lt;img src="https://feeds.llun.dev/media/011dc904d793fcb8e2b1c94268ee0b9856604351001b5a27d2bc1e8680c27587.png" alt="🎆" /&gt;&lt;img src="https://feeds.llun.dev/media/9832bbaaebcb1b931ae543dffff79cc45b3d615ac125646938a46eae42de5c4c.png" alt="🎇" /&gt;&lt;img src="https://feeds.llun.dev/media/9832bbaaebcb1b931ae543dffff79cc45b3d615ac125646938a46eae42de5c4c.png" alt="🎇" /&gt;&lt;/p&gt;


&lt;div&gt;
&lt;figure&gt;&lt;img loading="lazy" src="https://localhost:54526/wp-content/uploads/2023/01/image-13-1024x576.png" alt="" width="512" height="288" srcset="https://feeds.llun.dev/media/fca196c57d56e86e3c9ced6ffb28560b59bec5903983f468ef362c1e8220349e.png 1024w, https://feeds.llun.dev/media/ab014cabebe45e4cf5ceb8ce4161e286251ac6f5d6deae50ab77c35ba366f612.png 300w, https://feeds.llun.dev/media/f35e5d61ad96f4f3d15d1ca6957ad237e102e7075f10a1c07da722d7bbb1cbb0.png 768w, https://feeds.llun.dev/media/b01afcd717cb863c8bc71d88095ea62eab45b07f7fdc8b2d1d57a36a64474fb2.png 600w, https://feeds.llun.dev/media/fd43c014b590cfdd38325d8adb7b290854d9901e4fe7d76dfd246a55bb0580ac.png 1280w" /&gt;&lt;/figure&gt;
&lt;/div&gt;


&lt;blockquote&gt;
&lt;p&gt;&lt;a href="https://docs.aws.amazon.com/iot/latest/developerguide/authorizing-direct-aws.html" target="_blank"&gt;https://docs.aws.amazon.com/iot/latest/developerguide/authorizing-direct-aws.html&lt;/a&gt;&lt;/p&gt;
&lt;cite&gt;Authorizing direct calls to AWS services using AWS IoT Core credential provider&lt;/cite&gt;&lt;/blockquote&gt;&lt;p&gt;The post &lt;a href="https://thanapon.info/aws-iot-credential-provider/"&gt;[AWS-IoT] เรียกใช้ AWS Services ผ่าน Device Certificate X.509 โดยใช้ Credential-Provider [1]&lt;/a&gt; first appeared on &lt;a href="https://thanapon.info/"&gt;Thanapon&lt;/a&gt;.&lt;/p&gt;</content>
    <source>
      <title>Thanapon</title>
      <link rel="self" href="https://thanapon.info/feed/"/>
      <link rel="alternate" href="https://thanapon.info"/>
    </source>
  </entry>
  <entry>
    <id>urn:uuid:3a7200b8-bd11-5f57-a148-91b4cfbb33d5</id>
    <title>0256 | คำถามที่โดนถามบ่อยกับรถยนต์ไฟฟ้า</title>
    <updated>2022-12-26T10:44:16.000Z</updated>
    <author>
      <name>icez</name>
    </author>
    <published>2022-12-26T10:44:16.000Z</published>
    <link rel="alternate" href="https://www.icez.net/blog/167526/0256-ev-frequency-asked-question"/>
    <category term="Thai"/>
    <content type="html">&lt;p&gt;คุยกะคนโน้นคนนี้แล้วก็เจอคำถามที่ถูกถามบ่อยๆ ได้ตามนี้ครับ&lt;/p&gt;
&lt;h2&gt;ชาร์จกี่ชั่วโมงถึงเต็ม&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;ใช้ไปเท่าไหร่ก็ชาร์จเพิ่มเท่านั้น ไม่ต้องสนใจเวลาชาร์จจาก 0 – 100% ของรถ (ยกเว้นตอนขับทางไกล)&lt;/li&gt;
&lt;li&gt;เช่น ขับไป 100km เฉลี่ยกินไฟประมาณ 20kWh ก็ชาร์จเพิ่มแค่ 20kWh&lt;/li&gt;
&lt;li&gt;ถ้าใช้ wall charge 7kW ก็ประมาณ 3 ชั่วโมง (20 kWh / 7 kW = ~ 3 h) หรือถ้าใช้ travel adapter เสียบปลั๊กชาร์จมันจะได้ราวๆ 2-3kW ก็ 7-10 ชั่วโมง&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;แต่ !!!&lt;/strong&gt; เวลาชาร์จแบบนี้ เราไม่ต้องรอ เพราะมันคือการเสียบชาร์จตอนเราเข้าบ้านไปนอน…&lt;/li&gt;
&lt;li&gt;ถ้าคุณนอนวันละ 6 ชั่วโมง รวมเวลาอาบน้ำแต่งตัวก่อนนอน กับหลังตื่นก็น่าจะมีเวลาให้ชาร์จ 7-8 ชั่วโมง ก็น่าจะพอให้ชาร์จได้เต็มอยู่แล้ว&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;อยู่คอนโดทำไง&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;ระหว่างนี้หาที่ชาร์จใกล้ๆ คอนโดก่อนครับ&lt;/li&gt;
&lt;li&gt;ผลักดันให้คอนโดติดที่ชาร์จ แนะนำให้ติด AC charge เยอะๆ ดีกว่า เพราะค่าที่ชาร์จ DC จุดเดียว อาจจะแพงมากจนติด AC ได้เป็นสิบๆ จุด&lt;/li&gt;
&lt;li&gt;ถ้าเป็น AC คนก็จอดชาร์จเหมือนอยู่บ้านตามปกติได้เลย ไม่ต้องมาขยับรถ&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;หาที่ชาร์จยังไง&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.plugshare.com/"&gt;https://www.plugshare.com&lt;/a&gt; เว็บเดียวจบครับ&lt;/li&gt;
&lt;li&gt;มีเว็บ &lt;a href="https://www.chargeloma.com/"&gt;https://www.chargeloma.com&lt;/a&gt; อีกอัน แต่ในมือถือ (ipad) แอพมันรวนๆ&lt;/li&gt;
&lt;li&gt;แต่พอไปใช้จริง ก็ต้องโหลดแอพของผู้ให้บริการชาร์จแต่ละเจ้ามาอยู่ดี หลักๆ ก็ ptt ev station pluz, elexa, pea volta, evolt, sharge, altervim, ea anywhere (7 ราย) — as of 2022&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;ขับได้ไกลแค่ไหน&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;แล้วแต่รถ เส้นทาง และความเร็วที่ขับเลยครับ&lt;/li&gt;
&lt;li&gt;กรณีที่เปลืองไฟมากกว่าปกติคือ ขึ้นเขา หรือขับต้านลม หรือขับเร็วมากๆ ซึ่งก็เหมือนกับรถน้ำมันแหละ&lt;/li&gt;
&lt;li&gt;แต่ขับลงเขา เราได้ไฟเข้ารถเพิ่มนะ …. ตอนขึ้นดอยสุเทพ ใช้ไฟไป 8% แต่ขาลงได้แบตเพิ่มมา 3% เท่ากับขึ้นแล้วลงใช้แบตไป 5% อะไรงี้ ซึ่งรถน้ำมันทำไม่ได้&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;แบตเสื่อมมั้ย?&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;เสื่อมครับ&lt;/li&gt;
&lt;li&gt;ดูกราฟด้านล่าง ขับมาประมาณ 6,000 กิโล “ค่าประมาณการระยะทางที่ขับได้” ลดลงไปหน่อยนึง ประมาณ 5km (เฉียดๆ 1%)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src="https://feeds.llun.dev/media/f613e960c2974adbaf2c6d2fde09de69fa84c469d390555fca6d20157863bf2a.png" alt="" /&gt;&lt;/p&gt;
&lt;h2&gt;มีผู้โดยสารเพิ่ม กินไฟเพิ่มมั้ย&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;เทียบระหว่างขับคนเดียว กับผู้โดยสารเต็มคัน (5 คนรวมคนขับ) แทบกินไฟไม่ต่างกันครับ&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;ค่าซ่อมบำรุง&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Tesla มีแค่สลับล้อ เปลี่ยนกรองแอร์ เปลี่ยนยางตามสภาพยาง เช็คสภาพเบรก (ที่ไม่ค่อยได้ใช้) และเปลี่ยนถ้าจำเป็น&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;กราฟด้านบนเอามาจากไหน&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/adriankumpf/teslamate"&gt;Teslamate&lt;/a&gt; ครับ โหลดมาติดตั้งเองในเครื่อง server&lt;/li&gt;
&lt;li&gt;ข้อมูลมาจาก api ของเทสลา ที่รถจะส่ง telemetry ไปให้ทางเทสลา “ตลอดเวลา”&lt;/li&gt;
&lt;li&gt;ถ้าไม่มี server เอง แนะนำให้ใช้ &lt;a href="https://teslafi.com/"&gt;Teslafi&lt;/a&gt; ดีกว่าครับ&lt;/li&gt;
&lt;/ul&gt;</content>
    <source>
      <title>icez network</title>
      <link rel="self" href="https://www.icez.net/blog/feed"/>
      <link rel="alternate" href="https://www.icez.net/blog"/>
    </source>
  </entry>
  <entry>
    <id>urn:uuid:8c3c5642-e071-5984-adf0-6acd693d557e</id>
    <title>0255 | ขับเทสล่าไปเชียงใหม่…</title>
    <updated>2022-11-28T16:19:19.000Z</updated>
    <author>
      <name>icez</name>
    </author>
    <published>2022-11-28T16:19:19.000Z</published>
    <link rel="alternate" href="https://www.icez.net/blog/167520/tesla-model-3-lr-roadtrip-to-chiang-mai"/>
    <category term="Thai"/>
    <content type="html">&lt;h1&gt;Prelude&lt;/h1&gt;
&lt;p&gt;ซื้อ Tesla Model 3 Long Range มา(ซักพัก)แล้วครับ… จองปุ๊ปเทสล่าประกาศจดบริษัทเทสล่าในไทย… เจ็บปวดมาก 555 ข้ามเรื่องนี้ไปละกัน หรือใครอยากอ่านแบบสั้นๆ เชิญตามใน &lt;a href="https://twitter.com/icez/status/1597200038223958016"&gt;twitter&lt;/a&gt; ได้ครับ&lt;/p&gt;
&lt;h1&gt;Planning&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;เว็บ/แอพคู่ใจคนใช้ EV ก็ต้อง &lt;a href="https://www.plugshare.com/"&gt;www.plugshare.com&lt;/a&gt; ครับ เว็บเดียวมีข้อมูลที่ชาร์จแทบจะทุกที่ในไทย มี Trip Planner ให้ใช้ด้วยนะ (แต่ไม่ค่อยเวิร์กเท่าไหร่)&lt;/li&gt;
&lt;li&gt;แนะนำให้กดหาเส้นทางจากใน PlugShare Trip Planner เทียบกับ Google Maps แล้วดูตำแหน่งที่ชาร์จคร่าวๆ ก่อน&lt;/li&gt;
&lt;li&gt;พบว่าพอ range รถเยอะมากๆ ทำให้ plan ง่ายขึ้นเยอะ ด้วยการปักตามที่ที่กะแวะกินข้าวไปเลย (ทุกๆ ระยะขับรถ 4-5 ชั่วโมงโดยประมาณ)&lt;/li&gt;
&lt;li&gt;เตรียมแผนสำรองเผื่อที่ชาร์จใช้ไม่ได้, ไม่ว่าง ไว้ด้วย&lt;/li&gt;
&lt;li&gt;แอพชาร์จรถทุกค่าย ลง+สมัครไว้ให้ครบ (ptt ev station pluz, elexa, pea volta, ea anywhere) — เดี๋ยวเขียนรีวิวแอพกับตู้ชาร์จแยกอีกอัน&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;วันเดินทางขาไป&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;ออกจากบ้านด้วยแบตเต็ม 100% ตอน 08.43 น.&lt;/li&gt;
&lt;li&gt;ตามแผนคือแวะชาร์จที่ &lt;a href="https://goo.gl/maps/pyqQMhyVc4VnkYkg7"&gt;pea volta ปั๊มบางจากคลองขลุง&lt;/a&gt; หน้าปั๊มมีร้านข้าว, แผนสำรอง ขับเลยไปชาร์จที่ ptt ในเมืองกำแพงเพชร, แผนสำรองกว่าคือเลยไปชาร์จที่ elexa ปั๊ม PT ที่ตาก &lt;/li&gt;
&lt;li&gt;ไปถึงปั๊มบางจากแล้วหาร้านข้าวไม่เจอ (ซึ่งมันอยู่นอกปั๊ม ต้องเดินออกมานิดนึง) เลยเสียบชาร์จ เข้าห้องน้ำ ยืดเส้นยืดสายนิดหน่อยแล้วก็ออกเลย ชาร์จไป 12 นาทีได้แบตมา 11%
&lt;ul&gt;
&lt;li&gt;ตู้บอกว่าจ่ายไฟมา 8.814 หน่วย รถขึ้นว่าได้ไฟ 7.98 หน่วย&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;เลยขับไป &lt;a href="https://goo.gl/maps/vTX3mkaR8SovEzWE8"&gt;ptt กำแพงเพชร&lt;/a&gt; เพื่อชาร์จอีกรอบ + ไปหาข้าวกิน (เรื่องนี้ ptt ทำได้ดีจริงๆ ไว้ใจได้ค่อนข้างมากว่าไปแล้วมีของกินแน่ๆ) ปรากฎว่าไปถึงแล้วมีคน(ทะเลาะกับตู้)ชาร์จอยู่ สาย DC ก็เลยไม่ว่าง เราก็เลยเอาสาย AC เสียบ ปรากฎว่าชาร์จไม่เข้า แอพค้างไปเลย คนข้างๆ เค้าโทรคุยกับ cc ให้ cc reset ตู้ให้ ก็เรียบร้อย เสียเวลาไป 15 นาที ชาร์จอีก 23 นาทีได้ไฟมา 5%
&lt;ul&gt;
&lt;li&gt;ตู้จ่ายไฟ 4.04 หน่วย รถได้ไฟ 3.91 หน่วย&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;ระหว่างกินข้าว ความที่มันเป็นชาร์จ AC ไฟเข้าแค่ 11kW ก็คือต้องวางแผนใหม่ ตอนนั้นแบตเหลือ 52% ก็เลยกะว่า ถ้าลากยาวแล้วถึง จะชาร์จที่ลำปางที่ห่างไป 250km &lt;strong&gt;แต่!!!&lt;/strong&gt; ลืมไปว่าระหว่างทางมันขับขึ้นเขา&lt;/li&gt;
&lt;li&gt;ตอนเลย อ.เมือง ตาก แล้ว ลองสังเกตอัตราการใช้ไฟ กับระยะทางคงเหลือที่ขึ้นมาแล้วก็พบว่าน่าจะเฉียดฉิวเกินไป ก็เลยใช้แผนสำรอง แวะชาร์จที่ &lt;a href="https://goo.gl/maps/ji5VdThBWmSTAv428"&gt;ptt เถิน&lt;/a&gt; แทน ไปถึงไฟเหลือ 19% ชาร์จ 33 นาที ได้ไฟมา 49% (รวมเป็น 68%)
&lt;ul&gt;
&lt;li&gt;ตู้จ่ายไฟ 40.6 หน่วย รถได้ไฟ 38.47 หน่วย&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;จากเถิน ชาร์จไปขนาดนี้ก็เลยวิ่งยาวถึงเชียงใหม่ 176km ถึงเชียงใหม่ 18.49 น.แบตเหลือ 36% &lt;/li&gt;
&lt;li&gt;เดินทางไป 681km รถใช้ไฟไป 100.4 หน่วย ใช้เวลาเดินทางประมาณ 10 ชั่วโมง&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src="https://feeds.llun.dev/media/324d3895282349d2e398adb68a9fd4b7dec423e18d97c033d2c0a5abbcf8cc9b.png" alt="" /&gt;&lt;/p&gt;
&lt;h1&gt;วันเดินทางขากลับ&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;จริงๆ ต้องพูดถึงคืนก่อนหน้านั้นก่อน เพราะเอารถไปชาร์จจนแบต 80% ไว้ 5555&lt;/li&gt;
&lt;li&gt;ออกจากโรงแรม 08.52 น. วางแผนขับ 278km ไปชาร์จที่ &lt;a href="https://goo.gl/maps/nSJ92of2crZSV27NA"&gt;ptt ตาก&lt;/a&gt; คำนวณเวลาแล้วถึงตอนเที่ยงพอดีเป๊ะ จะได้ชาร์จให้ปริ่มๆ 80-90% ปรากฎว่า แอพไม่ให้จอง slot ชาร์จตอนเที่ยง แถมไปถึงแล้วมี&lt;a href="https://www.gwm.co.th/ora-good-cat/"&gt;น้องแมว&lt;/a&gt;ชาร์จไฟอยู่คันนึงอีกต่างหาก &lt;/li&gt;
&lt;li&gt;ก็เลยซื้อของกินเซเว่น แล้วขับเลยไปอีกนิด ไปชาร์จตู้ &lt;a href="https://goo.gl/maps/i6qMD6233nfUZx1j6"&gt;Elexa ที่ปั๊ม PT&lt;/a&gt; แทน ถึงที่ชาร์จ แบตเหลือ 24% ชาร์จ 29 นาที ได้ไฟมา 56% (รวมเป็น 80%)
&lt;ul&gt;
&lt;li&gt;ตู้จ่ายไฟ 46.83 หน่วย รถได้ไฟ 43.46 หน่วย&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;หน้าจอรถขึ้นว่าวิ่งได้อีกเกือบๆ 500km แต่คำนวณเองน่าจะประมาณ 400km ระยะทางถึงบ้าน 410km ก็เลยเล็งที่ชาร์จที่ปั๊ม &lt;a href="https://goo.gl/maps/9KcvHmyjziBQRgsR8"&gt;ptt นครสวรรค์&lt;/a&gt; ไว้อีกที่&lt;/li&gt;
&lt;li&gt;แล้วก็ลืมนึกไปอีกว่ามันขับลงเนิน ตอนเลยเมืองกำแพงเพชรก็เลยลองคำนวณระยะใหม่อีกรอบพบว่าน่าจะพอแบบพอดีมากๆ (ถึงบ้านอาจจะเหลือ 2-3%) แต่ยังสองจิตสองใจ เลยแวะที่ปั๊ม ptt นครสวรรค์เผื่อๆ ไว้ แต่ไม่ได้ชาร์จเพราะมีคนชาร์จอยู่ ก็เลยตัดสินใจว่ายิงยาวเลยละกัน ระหว่างทางก็ส่อง range รถเทียบกับระยะทางใน google maps ตลอดเลย&lt;/li&gt;
&lt;li&gt;สรุปว่าขับถึงบ้านได้จริงๆ ด้วย ตอน 17.52 น. แบตเหลือ 3% จริงๆ &lt;/li&gt;
&lt;li&gt;เดินทางไป 692km รถใช้ไฟไป 104.2 หน่วย ใช้เวลาเดินทางประมาณ 9 ชั่วโมง &lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src="https://feeds.llun.dev/media/648f8db55d3bf0289a426df120702c169154cc4cf0d01f8910282750a53957e3.png" alt="" /&gt;&lt;/p&gt;
&lt;h1&gt;Conclusion&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;Range รถเยอะๆ ช่วยให้ชีวิตดีขึ้นจริงๆ ตอนวางแผนเคยลองคำนวณแบบรถแบตเต็มขับได้ 300km ก็คือแทบต้องแวะชาร์จทุก 2 ชั่วโมง แถมแทบพลาดไม่ได้เลยด้วย เพราะที่ชาร์จแต่ละที่ยังห่างกันค่อนข้างเยอะอยู่ (เฉลี่ยๆ ห่างกันทุกๆ 100km)&lt;/li&gt;
&lt;li&gt;รถ MG แอบได้เปรียบ ตรงที่สามารถชาร์จที่ศูนย์ MG ได้ด้วย ที่รถอื่นไม่มี — รอเทสลาเปิด Supercharger บ้าง&lt;/li&gt;
&lt;/ul&gt;</content>
    <source>
      <title>icez network</title>
      <link rel="self" href="https://www.icez.net/blog/feed"/>
      <link rel="alternate" href="https://www.icez.net/blog"/>
    </source>
  </entry>
  <entry>
    <id>urn:uuid:070eaf06-d607-55b9-865a-648b52d3627d</id>
    <title>[AWS-IoT] Manage Greengrass ผ่าน Secure Tunneling Component</title>
    <updated>2022-09-24T13:27:59.000Z</updated>
    <author>
      <name>thanapon.tap</name>
    </author>
    <published>2022-09-24T13:27:59.000Z</published>
    <link rel="alternate" href="https://thanapon.info/aws-iot-secure-tunneling/?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=aws-iot-secure-tunneling"/>
    <category term="Thai"/>
    <content type="html">&lt;h3&gt;AWS IoT secure tunneling ?&lt;/h3&gt;



&lt;p&gt;คือ Component ตัวหนึ่งของ Greengrass service ที่ทำให้เราสามารถ Remote เข้าไปเชื่อมต่อกับ Greengrass device นั้นๆได้ โดยที่ไม่ต้องคอยกังวลเกี่ยวกับ Firewall ของระบบ Network ที่รันอยู่ ซึ่งข้อดีของ &lt;strong&gt;AWS IoT Secure Tunneling&lt;/strong&gt; นั้น เราจะเอาไว้สำหรับแก้ไขปัญหาการตั้งค่าอุปกรณ์ที่อยู่คนละที่กับเราได้เลย ทำให้เราลดเวลาที่จะลงไปดูหน้างานจริงๆและสามารถแก้ไขปัญหาได้ทันท่วงที&lt;/p&gt;



&lt;blockquote&gt;&lt;p&gt;AWS IoT Greengrass คือ service ตัวหนึ่งที่เราสามารถเอามาใช้ในการสร้าง Edge service หรือ Gateway ในการส่งข้อมูลไปยัง AWS IoT Core&lt;/p&gt;&lt;/blockquote&gt;



&lt;h3&gt;Secure tunneling concepts&lt;/h3&gt;



&lt;ul&gt;&lt;li&gt;&lt;strong&gt;Client access token (CAT)&lt;/strong&gt;: Token ที่ AWS IoT Secure Tunneling สร้างขึ้นมาเอาไว้ใช้ในการเชื่อมต่อระหว่างเครื่อง Source กับ Destination&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Destination application&lt;/strong&gt;: Service ที่รันอยู่บนเครื่องที่เราต้องการจะ Remote เช่น SSH, HTTP&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Destination device&lt;/strong&gt;: เครื่องที่เราต้องการจะ Remote&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Device agent&lt;/strong&gt;: Agent ที่ Subscribe topic “&lt;code&gt;$aws/things/thing-name/tunnels/notify&lt;/code&gt;” สำหรับรับ Token ที่สร้างมาจาก Secure Tunneling ซึ่งจะใช้ Token ในการสร้าง Tunnel&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Local proxy&lt;/strong&gt;: Software ที่รันบนเครื่อง Source ที่ใช้ในการ Relay message จาก Secure Tunneling กับ Application ที่รันอยู่บนเครื่อง Remote&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Source device&lt;/strong&gt;: Computer/Laptop ของเรา&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Tunnel&lt;/strong&gt;: Logical pathway ที่ AWS IoT สร้างให้ระหว่างเครื่อง Source กับ Destination&lt;/li&gt;&lt;/ul&gt;



&lt;h3&gt;How secure tunneling works&lt;/h3&gt;



&lt;ul&gt;&lt;li&gt;เริ่มต้นเราต้องสร้าง Tunnel ใน AWS Console ก่อน โดยเข้าไปที่ &lt;strong&gt;AWS IoT &amp;gt; Manage &amp;gt; Tunnels&lt;/strong&gt;&lt;/li&gt;&lt;/ul&gt;


&lt;div&gt;
&lt;figure&gt;&lt;img loading="lazy" width="1024" height="506" src="https://localhost:54526/wp-content/uploads/2022/09/image-1024x506.png" alt="" srcset="https://feeds.llun.dev/media/8eef9a8bb53c4dc819b30a218aca94577c9801263737daaeeed5b74c8faf227f.png 1024w, https://feeds.llun.dev/media/919b6baf337796d6d5fe25e5a40319043408ee563d999b46387336df87963f7f.png 300w, https://feeds.llun.dev/media/3e5186f185065eeb8e89c57f845fb6fc2dd3e6f86659a317b19972992741b665.png 768w, https://feeds.llun.dev/media/70d959b1eb798f1b3f9ab5d72d9d48053e51cb1acbcf0bd103981f6082140b6f.png 1536w, https://feeds.llun.dev/media/9e2459e9f44a446c4f7b3a64d9e184900ad0757a4c059469c0d51f76877bcd99.png 2048w, https://feeds.llun.dev/media/42ef970578520cb1ebffa96c23d401b10e1e2e7d819424c6105083e7c22ce6c0.png 600w" /&gt;&lt;/figure&gt;
&lt;/div&gt;


&lt;ul&gt;&lt;li&gt;พวก Description ก็ใส่อะไรก็ได้ที่มันสื่อความหมายกับ Tunnel ของเรานะครับ ซึ่ง Service ผมจะใช้เป็น SSH เข้าไปที่อุปกรณ์ “iot-gg-rpi-dev-5” ส่วนสุดท้ายจะเป็น Timeout ก็แล้วแต่เรากำหนดเลย โดยปกติผมจะเปิดไว้ไม่เกิน 1 ชั่วโมง&lt;/li&gt;&lt;/ul&gt;


&lt;div&gt;
&lt;figure&gt;&lt;img loading="lazy" width="1024" height="634" src="https://localhost:54526/wp-content/uploads/2022/09/image-1-1024x634.png" alt="" srcset="https://feeds.llun.dev/media/72b76354f76d5d7b7fee21c79ca9e0e88a8baac16bbbfbd87a2426d347339af6.png 1024w, https://feeds.llun.dev/media/af7eeb442cdac81d55c13673a5240f8ad5fb8d6d16b7613dcf84038604dce400.png 300w, https://feeds.llun.dev/media/6580d4d5962162e57b80886068f42856d46114869f4b61acf8bc3d6b59fc3781.png 768w, https://feeds.llun.dev/media/9dafad546ae03fdb89a88a793e6bafa4dc34ade22f863f55622ccc412f7238a8.png 1536w, https://feeds.llun.dev/media/97bdd6dfe9af9501319bdba2fbc53c641b1e52664a461ea01c10f97d87187b40.png 2048w, https://feeds.llun.dev/media/6ab6b4b93606e7e0c89046b4e2ef3feb57259438ff2f64e1651c4f4c98a6f935.png 600w" /&gt;&lt;/figure&gt;
&lt;/div&gt;


&lt;ul&gt;&lt;li&gt;เมื่อสร้าง Tunnel เสร็จแล้วก็ให้ Copy “Access token for source” ไว้ด้วยนะครับ&lt;/li&gt;&lt;/ul&gt;


&lt;div&gt;
&lt;figure&gt;&lt;img loading="lazy" width="1024" height="492" src="https://localhost:54526/wp-content/uploads/2022/09/image-2-1024x492.png" alt="" srcset="https://feeds.llun.dev/media/a5c19335798ac8eebc078b2bcaaf85b41364ee2a0f9ee6a812f6928d2fbc29c7.png 1024w, https://feeds.llun.dev/media/d31990123184a0726c476b9f69f205b45d4cc3ab01a0e1ab25adb17c9ae6c876.png 300w, https://feeds.llun.dev/media/47fec36e3f8d08fb3b87816e401c3087e34dc3f2c7868a10bf68d99a93ebd4ef.png 768w, https://feeds.llun.dev/media/90044543b48cba384a84b0f3d2823a8137b3729c30247d783cd06be5dd5824a6.png 1536w, https://feeds.llun.dev/media/d4e961a9037ef846e9d516d33d69b819eccb5da0ced484db6969f4474d992960.png 2048w, https://feeds.llun.dev/media/5bbc305c33a9d86b8661938782997e66210c7a4d16f6e9a750162c04c66bb90f.png 600w" /&gt;&lt;/figure&gt;
&lt;/div&gt;


&lt;ul&gt;&lt;li&gt;เมื่อเราเข้ามาดูใน Tunnel ID ที่เราสร้างมาจะเห็นว่าตอนนี้ Destination connection state นั้น &lt;mark&gt;Connected&lt;/mark&gt; แล้วเหลือแค่ส่วนของ Source connection state เท่านั้นที่ &lt;mark&gt;Disconnected&lt;/mark&gt;&lt;/li&gt;&lt;/ul&gt;


&lt;div&gt;
&lt;figure&gt;&lt;img loading="lazy" width="1024" height="417" src="https://localhost:54526/wp-content/uploads/2022/09/image-5-1024x417.png" alt="" srcset="https://feeds.llun.dev/media/5d68414373690517a286e9fc654836bff7bddcb8766a2c838b8e24fb01ffd8e1.png 1024w, https://feeds.llun.dev/media/6ef6f869cc7723aab16d8a761a8389199461a0632006a74a043d885204b92646.png 300w, https://feeds.llun.dev/media/6be44e3492bb38ffaf0b9c9d47a1635da787107c9ca790a74de77393e30fb3c3.png 768w, https://feeds.llun.dev/media/ebcf88a02307d6b0739c60ceab4f21fd7d2dc84c35daaf001d74abda797ec4b7.png 1536w, https://feeds.llun.dev/media/c95072c00ae81887d5a9838e79050da8dab36ecf4ad5e56404d14235c052c0d2.png 2048w, https://feeds.llun.dev/media/35e8065a443d15a6ccd7c27285879291a84e7e233dcc132cfb545f289e5e0e34.png 600w" /&gt;&lt;/figure&gt;
&lt;/div&gt;


&lt;h3&gt;Setting up Localproxy&lt;/h3&gt;



&lt;ul&gt;&lt;li&gt;ขั้นตอนตอนไปเราต้องมาติดตั้ง Local proxy ก่อนเพื่อให้มัน Relay ข้อมูลระหว่างเครื่อง Source กับ Destination โดยเราสามารถ Clone repository ได้จาก&lt;/li&gt;&lt;/ul&gt;



&lt;blockquote&gt;&lt;p&gt;&lt;a href="https://github.com/aws-samples/aws-iot-securetunneling-localproxy.git" target="_blank"&gt;AWS Iot Secure Tunneling local proxy reference C++ implementation&lt;/a&gt;&lt;/p&gt;&lt;cite&gt;https://github.com/aws-samples/aws-iot-securetunneling-localproxy.git&lt;/cite&gt;&lt;/blockquote&gt;



&lt;ul&gt;&lt;li&gt;หลังจากที่เรา Clone repository มาแล้ว ซึ่งถ้าสังเกตดูในไฟล์เราจะเห็น Bash script สำหรับสร้าง docker image อยู่ แสดงว่าเราสามารถให้มันรันบน docker ได้เลยไม่ต้องติดตั้ง dependencies ต่างๆ บนเครื่องเราด้วย สบายบรื้ออออ!!!!!&lt;/li&gt;&lt;/ul&gt;


&lt;div&gt;
&lt;figure&gt;&lt;img loading="lazy" width="1024" height="418" src="https://localhost:54526/wp-content/uploads/2022/09/image-6-1024x418.png" alt="" srcset="https://feeds.llun.dev/media/474e3ccdf966fde1b8234945f0e7cc02bdb3460f9eeee32ecf43993247d1f888.png 1024w, https://feeds.llun.dev/media/98ad1042c180f3392d3acf72fd64ebe9a779957daa1d02c99c9503d9cd6d0a66.png 300w, https://feeds.llun.dev/media/422e55a0666914d6f37e4e33442e155700ed586b073d74bf063864bf09af6ad8.png 768w, https://feeds.llun.dev/media/e433d04a33744e4cb5c5dfa4b9e3c3f658d9d761861aa095b85ed962181d432a.png 600w, https://feeds.llun.dev/media/ac9d3881b5b5d8750e98927f48bb141553328c333e6b6174d6e3f7cf54ffad51.png 1270w" /&gt;&lt;/figure&gt;
&lt;/div&gt;


&lt;ul&gt;&lt;li&gt;รัน&lt;mark&gt; “docker-build.sh”&lt;/mark&gt; สำหรับสร้าง Docker image กันนะจ๊ะ อาจจะต้องใช้เวลาสักพักถึงจะสร้าง Docker image เสร็จ&lt;/li&gt;&lt;/ul&gt;



&lt;div&gt;&lt;pre&gt;&lt;code&gt;./docker-build.sh&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;div&gt;
&lt;figure&gt;&lt;img loading="lazy" width="1024" height="220" src="https://localhost:54526/wp-content/uploads/2022/09/image-7-1024x220.png" alt="" srcset="https://feeds.llun.dev/media/fd091b1e433d3450637f4d9e3d9651a4a32126638a6c139bcb127689292bf6cf.png 1024w, https://feeds.llun.dev/media/8a6c8376b1c2da5c56aa1bc3a3027ebcf4fd0e019f38a19bf9e10b046a47dc62.png 300w, https://feeds.llun.dev/media/607fdba5033669cd8393e2aa1c3170b5cd3a05a68913d9cdae8d36a281f42b1c.png 768w, https://feeds.llun.dev/media/e4e70ab2b51a4e938fda879a38003f77586b8bcbf801532ae0b121e1eb67d2ea.png 1536w, https://feeds.llun.dev/media/4e141d00db92eafb8338c94603288c9a2720e8656770ac1d6a9af22db72f7f15.png 600w, https://feeds.llun.dev/media/7289017fb2ff2243212f29a314ce9ac01e1f4595320a42a5ba7ea2dc27417f85.png 1626w" /&gt;&lt;/figure&gt;
&lt;/div&gt;


&lt;ul&gt;&lt;li&gt;Build Docker Image เสร็จแล้ว ก็ถึงเวลาใช้งานกัน โดยที่เราจะรัน &lt;mark&gt;“docker-run.sh”&lt;/mark&gt; ตามด้วย Port ที่เราจะ expose ออกมาให้เราสามารถ SSH เข้าไปยังเครื่อง Remote&lt;/li&gt;&lt;/ul&gt;



&lt;div&gt;&lt;pre&gt;&lt;code&gt;./docker-run.sh -p 5555&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;div&gt;
&lt;figure&gt;&lt;img loading="lazy" width="1024" height="98" src="https://localhost:54526/wp-content/uploads/2022/09/image-4-1024x98.png" alt="" srcset="https://feeds.llun.dev/media/b957c9e2a5a1b84ff28ee51ebd101b6145afcd23c127eb8b242622dc42f09197.png 1024w, https://feeds.llun.dev/media/097dbc486b154bd08d4457e71742474a2c1bd7a400daa4bd62daa6ebae43ea86.png 300w, https://feeds.llun.dev/media/36a1d0d1629ae2306f1aea078b0b88d511d80e23c5fb523df9e5289a7b8345a2.png 768w, https://feeds.llun.dev/media/d4957bbda37469c407ba2d78826e2a87bdf1c750eee95d3662b4338c2f52b526.png 600w, https://feeds.llun.dev/media/c94182a4fd540a15604efbf9872f771582a7d53843baed5e93371d746cc11c49.png 1175w" /&gt;&lt;/figure&gt;
&lt;/div&gt;


&lt;ul&gt;&lt;li&gt;ลองรัน localproxy โลด&lt;/li&gt;&lt;/ul&gt;



&lt;blockquote&gt;&lt;p&gt;-b: ให้ localproxy สามารถเรียกจากข้างนอก Container ได้&lt;/p&gt;&lt;p&gt;-r: Region ของ AWS ที่เราใช้งานอยู่&lt;/p&gt;&lt;p&gt;-s: Port ที่เรา expose ออกไปก่อนหน้านี้&lt;/p&gt;&lt;p&gt;-t: Access token ที่มาจากขั้นตอนการสร้าง Tunnel ใน AWS Console&lt;/p&gt;&lt;/blockquote&gt;



&lt;div&gt;&lt;pre&gt;&lt;code&gt;./localproxy -b 0.0.0.0 -r ap-southeast-1 -s 5555 -t ${access_token}&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;div&gt;
&lt;figure&gt;&lt;img loading="lazy" width="1024" height="186" src="https://localhost:54526/wp-content/uploads/2022/09/image-8-1024x186.png" alt="" srcset="https://feeds.llun.dev/media/1fdf095d242ff46b81b101b9fffe1b8ef96c1570c6febe1cc435141c67caf47f.png 1024w, https://feeds.llun.dev/media/11fac0b2e4719aa07b03f50eb0020f64032cb0754fd0da883259afa6e82e07d4.png 300w, https://feeds.llun.dev/media/0eeb2a57922108c3a2c4fa6ead113f5f5dc2809815a480f662916a9240d43a39.png 768w, https://feeds.llun.dev/media/3a6eecc05caa1596a53bb4f0bf4a219762f6e160021a7f30e9ee50d897f26b86.png 1536w, https://feeds.llun.dev/media/c59d8c6b725e9142412cfe1def81fae3e02ad51897c6ac9e8c3ce2c659cd8e5b.png 600w, https://feeds.llun.dev/media/2e63cea73beaf63b063e2e899f1562fbd676c2d140453c7cb7e73e3302f10b34.png 1620w" /&gt;&lt;/figure&gt;
&lt;/div&gt;


&lt;ul&gt;&lt;li&gt;เช็คดูสถานะใน AWS Console &amp;gt; Manage &amp;gt; Tunnels จะเห็นว่า &lt;mark&gt;Connected&lt;/mark&gt;&lt;/li&gt;&lt;/ul&gt;


&lt;div&gt;
&lt;figure&gt;&lt;img loading="lazy" width="1024" height="309" src="https://localhost:54526/wp-content/uploads/2022/09/image-10-1024x309.png" alt="" srcset="https://feeds.llun.dev/media/fa65b7ca8c59f57c61b2ac37c8be82ecbfcc2153c5eb2b8627386405846a6ffa.png 1024w, https://feeds.llun.dev/media/192708c3b96c084d5241700b01b5bd062d067ed10b6a9d76dec4027ecb6b64c4.png 300w, https://feeds.llun.dev/media/b6f7bddbe2dd90768b02c316e543bfc045173375c70d86d20cb755b35413c3b8.png 768w, https://feeds.llun.dev/media/dcf9c65aff0f39216dacfa6d725e3671585eb3e57c3a36baef9e766731cea113.png 1536w, https://feeds.llun.dev/media/9d71a7cdb97cb51a73d01ea4716f846e57b77c6b571f03a3a7b37412ff02c021.png 2048w, https://feeds.llun.dev/media/ddef149b0f56e8bf5452b823852fd9cfd7ca28b5b4bf6a73f416e3d61bf7cab9.png 600w" /&gt;&lt;/figure&gt;
&lt;/div&gt;


&lt;h3&gt;SSH from local machine&lt;/h3&gt;



&lt;ul&gt;&lt;li&gt;ลอง SSH ผ่าน Terminal ดูสิ&lt;/li&gt;&lt;/ul&gt;



&lt;div&gt;&lt;pre&gt;&lt;code&gt;ssh pi@localhost -p 5555&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;div&gt;
&lt;figure&gt;&lt;img loading="lazy" width="767" height="394" src="https://localhost:54526/wp-content/uploads/2022/09/image-11.png" alt="" srcset="https://feeds.llun.dev/media/1444fa8d02a03ccc6de5a0e7d419bcf9c6b5ddd1388e9788f0203a3622f4306f.png 767w, https://feeds.llun.dev/media/099276a50a57cb931281ed735268646ed90ee7f881fe1d717962465a64e2feb1.png 300w, https://feeds.llun.dev/media/c320c8221ba952aeb4fdad78c4a9c2f478e2791c295b3b625bb018abc2a45573.png 600w" /&gt;&lt;/figure&gt;
&lt;/div&gt;


&lt;ul&gt;&lt;li&gt;ลองดู Log ของ Greengrass บ้างสิ&lt;/li&gt;&lt;/ul&gt;



&lt;div&gt;&lt;pre&gt;&lt;code&gt;sudo tail -f /greengrass/v2/logs/greengrass.log&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;div&gt;
&lt;figure&gt;&lt;img loading="lazy" width="918" height="517" src="https://localhost:54526/wp-content/uploads/2022/09/image-12.png" alt="" srcset="https://feeds.llun.dev/media/d3375528aadbbcac05d7d8700e885560546f49d37eeb45be4554ef2923646601.png 918w, https://feeds.llun.dev/media/4c3090f6f95dd2f60fdf1448dcf943b1b0972b1f3a701d934eb999040a320daf.png 300w, https://feeds.llun.dev/media/dd44693b6815b7ed25976615f1f0a8f03e387f76fc15695a1789cd8b4b85f3eb.png 768w, https://feeds.llun.dev/media/36125cb7629fb626b70005c31f330aa2aa0656fa569fdb45f4399b9a2702ec26.png 600w" /&gt;&lt;/figure&gt;
&lt;/div&gt;


&lt;h4&gt;&lt;strong&gt;สรุปสามารถใช้งานได้จ้าาา หวังว่าจะเป็นประโยชน์กับผู้ที่สนใจที่จะมาศึกษา AWS IoT กันนะครับ&lt;/strong&gt; ขอบคุณที่ติดตาม สวัสดีครับ&lt;/h4&gt;



&lt;blockquote&gt;&lt;p&gt;&lt;a href="https://docs.aws.amazon.com/iot/latest/developerguide/secure-tunneling.html" target="_blank"&gt;AWS IoT secure tunneling&lt;/a&gt;&lt;/p&gt;&lt;cite&gt;https://docs.aws.amazon.com/iot/latest/developerguide/secure-tunneling.html&lt;/cite&gt;&lt;/blockquote&gt;



&lt;blockquote&gt;&lt;p&gt;&lt;a href="https://github.com/aws-samples/aws-iot-securetunneling-localproxy" target="_blank"&gt;AWS Iot Secure Tunneling local proxy reference C++ implementation&lt;/a&gt;&lt;/p&gt;&lt;cite&gt;https://github.com/aws-samples/aws-iot-securetunneling-localproxy&lt;/cite&gt;&lt;/blockquote&gt;&lt;p&gt;The post &lt;a href="https://thanapon.info/aws-iot-secure-tunneling/"&gt;[AWS-IoT] Manage Greengrass ผ่าน Secure Tunneling Component&lt;/a&gt; first appeared on &lt;a href="https://thanapon.info/"&gt;Thanapon&lt;/a&gt;.&lt;/p&gt;</content>
    <source>
      <title>Thanapon</title>
      <link rel="self" href="https://thanapon.info/feed/"/>
      <link rel="alternate" href="https://thanapon.info"/>
    </source>
  </entry>
  <entry>
    <id>urn:uuid:1e1af586-11e0-5f41-a1d8-41aa633388b9</id>
    <title>[AWS-IoT] Device Provisioning สำหรับสเกลอุปกรณ์หลายๆตัว ภาค Hardware บ้าง</title>
    <updated>2022-07-28T09:56:35.000Z</updated>
    <author>
      <name>thanapon.tap</name>
    </author>
    <published>2022-07-28T09:56:35.000Z</published>
    <link rel="alternate" href="https://thanapon.info/aws-iot-device-provisioning-2/?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=aws-iot-device-provisioning-2"/>
    <category term="Thai"/>
    <content type="html">&lt;p&gt;สวัสดีครับ มาต่อจาก Blog ก่อนหน้านี้ที่ปล่อยลอยไว้นานหลายเดือนเลย หากใครจำไม่ได้แล้วว่า เอ๊ะ! ทำอะไรไปบ้างเนี้ยแนะนำให้ย้อนกลับไปดูได้นะครับ&lt;/p&gt;



&lt;blockquote&gt;&lt;p&gt;&lt;a href="https://localhost:54526/aws-iot-device-provisioning-1/" target="_blank"&gt;[AWS-IoT] Device Provisioning สำหรับสเกลอุปกรณ์หลายๆตัว-1&lt;/a&gt;&lt;/p&gt;&lt;cite&gt;Device Provision ภาคแรกเป็นการ Config AWS IoT Core ให้พร้อมสำหรับการ Scale อุปกรณ์หลายๆตัว&lt;/cite&gt;&lt;/blockquote&gt;



&lt;p&gt;ส่วนใครยังไม่เข้าใจ Sequence diagram ของ การ Provisioning ลองกลับไปอ่านดูนะครับใน Blog นี้ ผมจะอธิบายโค๊ดแบบ คร่าวๆให้ฟังนะครับ&lt;/p&gt;



&lt;h4&gt;เริ่มกันเลยดีกว่า&lt;/h4&gt;



&lt;p&gt;ด้านล่างนี้จะเป็นโค๊ดลองไป Clone ลงมาเล่นกันได้นะครับ&lt;/p&gt;



&lt;blockquote&gt;&lt;p&gt;&lt;a href="https://github.com/toygame"&gt;toygame&lt;/a&gt;/&lt;strong&gt;&lt;a href="https://github.com/toygame/aws-iot-device-provisioning-esp32"&gt;aws-iot-device-provisioning-esp32&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;&lt;cite&gt;AWS IoT device provisioning with Fleet provisioning templates, The hardware is ESP32 that built-in a WiFi and Bluetooth module.&lt;/cite&gt;&lt;/blockquote&gt;



&lt;p&gt;Clone repo ลงมาในเครื่องแล้วอย่าลืมเปลี่ยนส่วนของ &lt;mark&gt;Configuration นะครับจะมี WiFi SSID/Password กับ AWS IoT Endpoint อีกอย่างที่ขาดไม่ได้คือ Claim Certificate ให้เราไปอัพเดทในโฟลเดอร์ certs ด้วย&lt;/mark&gt;&lt;/p&gt;



&lt;div&gt;&lt;pre&gt;&lt;code&gt;#define WIFI_SSID "xxxxxxx"
#define WIFI_PASSWORD "xxxxxxxx"
#define AWS_IOT_ENDPOINT "xxxxxxx.iot.ap-southeast-1.amazonaws.com"&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;ลอง Upload ดูนะครับผมเขียน &lt;mark&gt;Makefile ไว้ให้ แต่ก่อนใช้งานจำเป็นต้องลง PlatformIO CLI ก่อนน้าา เดี๋ยวแตก!!! &lt;/mark&gt;วิธีใช้ Makefile ก็&lt;/p&gt;



&lt;div&gt;&lt;pre&gt;&lt;code&gt;make&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;หลังจากที่ตัวโค๊ด อัพโหลดเสร็จแล้วเราจะเห็นว่ามันจะพยายามเชื่อมต่อไปที่ WiFi Router ของเราก่อน จากนั้นมันจะเข้าไปทำการ Provisioning ตัวเองต่อเลย จนเสร็จแล้วก็จะได้ข้อความ &lt;mark&gt;“Register things successfully”&lt;/mark&gt; ตามภาพปลากรอบ&lt;/p&gt;



&lt;div&gt;&lt;figure&gt;&lt;img loading="lazy" width="1024" height="473" src="https://localhost:54526/wp-content/uploads/2022/07/Screen-Shot-2565-07-28-at-14.03.56-1024x473.png" alt="" srcset="https://feeds.llun.dev/media/9be8b5ab066939690bd21663bd3eb4ca64a08b720eee08499f54723a1d3efcd7.png 1024w, https://feeds.llun.dev/media/32ebb7b64daa060d183657bda7e64d3112c6c2c2cc4cacd4bf5df518535c6a00.png 300w, https://feeds.llun.dev/media/391d128537f389d800f310b204280c187984d6dae448db2dfc82856e3ff140d1.png 768w, https://feeds.llun.dev/media/7d6e579d1a782f519c8856065df0b98576a4f04f81391a832970dbe05999a972.png 600w, https://feeds.llun.dev/media/361d3d2e3982611ae93483619bb3b0e0bc91471fa84f658880d59586183f4e55.png 1339w" /&gt;&lt;/figure&gt;&lt;/div&gt;



&lt;p&gt;Restart เสร็จแล้ว สเต็ปต่อไปอุปกรณ์จะเข้าไปอ่าน ไฟล์ &lt;mark&gt;aws.json&lt;/mark&gt; ที่เราเก็บไว้ใน FS เพื่อเข้าไปอ่าน Device Certificate กับ Private Key ที่ถูกเก็บไว้ เพื่อเอามาใช้สำหรับเชื่อมต่อไปยัง AWS IoT Core ซึ่งมันใช้การ Authen แบบ X.509 Certificate&lt;/p&gt;



&lt;div&gt;&lt;figure&gt;&lt;img loading="lazy" width="1024" height="186" src="https://localhost:54526/wp-content/uploads/2022/07/Screen-Shot-2565-07-28-at-14.04.11-1-1024x186.png" alt="" srcset="https://feeds.llun.dev/media/70b0f33cf09e009d98bc544d1473e2531a4a3a6f38abca2bafdf77e542e1e569.png 1024w, https://feeds.llun.dev/media/755fe979a05bf7f1edc5ef976c081e39cf59deef10217412ed304265944304df.png 300w, https://feeds.llun.dev/media/4fe5f2fdbc0d94c16d4a164ab02eaca8ebfca14f44f4e8e238abb91b538dc020.png 768w, https://feeds.llun.dev/media/f64e5f619277f257d8e247d86c04d6bcb287c85656c1755223822594d5d686a0.png 600w, https://feeds.llun.dev/media/30c9c5dfa5f7deec4f98de4403d3d0493b2423fe69ae3ae14b2c5f6d1db5eabc.png 1339w" /&gt;&lt;/figure&gt;&lt;/div&gt;



&lt;p&gt;ลองเช็คดูว่ามีชื่ออุปกรณ์ของเราใช้ AWS IoT Console ไหม ถ้ามีก็ถือว่าผ่าน คุณได้ไปต่อ!!!!&lt;/p&gt;



&lt;div&gt;&lt;figure&gt;&lt;img loading="lazy" width="1024" height="506" src="https://localhost:54526/wp-content/uploads/2022/07/Screen-Shot-2565-07-28-at-14.04.21-2-1024x506.png" alt="" srcset="https://feeds.llun.dev/media/887da2aadf8917f8873457200adc551854eed6b4632a51da9b419783955f9301.png 1024w, https://feeds.llun.dev/media/833549f6b4c43222a80c6d9d09983e27c49159f35d6f474eca67e0e3f4078ba7.png 300w, https://feeds.llun.dev/media/387ec9b06527d5177d2a9d703531e942b12f2efa63c7b1042b9a041d95a71377.png 768w, https://feeds.llun.dev/media/7ce1f0c64e739b3cc51fd8c069569d52c48838bfaaa39ffda7b5fde85424fff1.png 1536w, https://feeds.llun.dev/media/3097d8b5708d2da043ba4fb9345042bea9bed7be539f1608a92d81a8b0f0c955.png 2048w, https://feeds.llun.dev/media/938fe27a0982224ff9c2fa91b8e34694ee9789cc7f1daa1b0d92bef09f681983.png 600w" /&gt;&lt;/figure&gt;&lt;/div&gt;



&lt;p&gt;ทดสอบ Publish MQTT ลงมาที่อุปกรณ์หน่อยสิ&lt;/p&gt;



&lt;div&gt;&lt;figure&gt;&lt;img loading="lazy" width="1024" height="566" src="https://localhost:54526/wp-content/uploads/2022/07/Screen-Shot-2565-07-28-at-14.05.00-1-1024x566.png" alt="" srcset="https://feeds.llun.dev/media/1d580add15cc5653e07ed8de083cdad2dc0f0ddcb656ed04efd7a590ec385a2b.png 1024w, https://feeds.llun.dev/media/2b5d63f0d334ef04232351642768c3c7387ac58b848bd8c8ae05ae4f70de161d.png 300w, https://feeds.llun.dev/media/e375bba1c6e0a59ea5cd409a712a3787ec97e37c9fa7aee6aeb4a21dcb4a7a12.png 768w, https://feeds.llun.dev/media/bbf0209248cb1fddb9da2c8248f405007ed5988274feab3d8659cfb1b9309404.png 1536w, https://feeds.llun.dev/media/2af0974052f1b56f59e4dd341059b39d833c7523bf2ef6f5511157446515e16b.png 2048w, https://feeds.llun.dev/media/6f6905a6c81d5a422965298180c91282fc10da82c6dd70e2dd7d3d1eefd4651f.png 600w" /&gt;&lt;/figure&gt;&lt;/div&gt;



&lt;p&gt;Okay สามารถรับ MQTT Packet จาก AWS IoT Core ได้!!!&lt;/p&gt;



&lt;div&gt;&lt;figure&gt;&lt;img loading="lazy" width="1024" height="129" src="https://localhost:54526/wp-content/uploads/2022/07/Screen-Shot-2565-07-28-at-14.05.10-1024x129.png" alt="" srcset="https://feeds.llun.dev/media/6f471ef0c2c4fb614724b2d3a3fa2caac237e4c4fdd3763fb40ede852a08299e.png 1024w, https://feeds.llun.dev/media/3280ada41c22697f2e2380e6ebc47dd135e4b66d5e25599ccb9da2fc7fdbe4a2.png 300w, https://feeds.llun.dev/media/8deea80b7faeacd805303a3430651bca05d19ae61faff0254e9c4123dca57183.png 768w, https://feeds.llun.dev/media/615b0bd2f47123e289814211e1b7b288beafed4d5513a59c0bc1219e0d3cc3bb.png 600w, https://feeds.llun.dev/media/a62992079e95844bb918fe982fda918ed5e8508f9a117c80c6ccb867fc8e0dbf.png 1122w" /&gt;&lt;/figure&gt;&lt;/div&gt;



&lt;h4&gt;อธิบาย Coding สักนิดละกัน&lt;/h4&gt;



&lt;ul&gt;&lt;li&gt;หลังจากเสียบสายไฟเข้าอุปกรณ์ปุ๊ป มันก็จะทำพยายามเชื่อมต่อเข้าไป WiFi Router ของเราก่อนอันนี้ก็ไม่มีอะไร basicๆ ครับ&lt;/li&gt;&lt;/ul&gt;



&lt;div&gt;&lt;pre&gt;&lt;code&gt;Serial.begin(115200);
WiFi.mode(WIFI_STA);
WiFi.begin(WIFI_SSID, WIFI_PASSWORD);
Serial.print("Connecting to WiFi..");
while (WiFi.status() != WL_CONNECTED)
{
  delay(1000);
  Serial.print(".");
}
Serial.println("Connected.");&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;ul&gt;&lt;li&gt;จากนั้นจะเริ่มเปิดไฟล์ aws.json ที่อยู่ใน Filesystem เสร็จแล้วเราก็ได้จะได้ instance ของ File ออกมา&lt;/li&gt;&lt;/ul&gt;



&lt;div&gt;&lt;pre&gt;&lt;code&gt;if (!SPIFFS.begin(true))
{
  Serial.println("An Error has occurred while mounting SPIFFS");
  return;
}
// Read AWS config file.
File file = SPIFFS.open("/aws.json", "r");
if (!file)
{
  Serial.println("Failed to open file for reading");
  return;
}&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;ul&gt;&lt;li&gt;เมื่อได้ข้อมูลใน File ออกมาแล้วก็ Parse มันออกมาให้อยู่ในรูป JSON เพื่อให้ง่ายต่อการอ่านกับการใช้งาน&lt;/li&gt;&lt;li&gt;เสร็จแล้วก็เช็คเงื่อนไข ถ้า JSON มี Key ที่ชื่อ certificatePem ก็ให้มันเชื่อมต่อไปยัง AWS IoT Core ได้เลยส่วนถ้าไม่เจอก็ไล่ให้มันไป Provisioning&lt;/li&gt;&lt;/ul&gt;



&lt;div&gt;&lt;pre&gt;&lt;code&gt;DynamicJsonDocument cert(4000);
auto deserializeError = deserializeJson(cert, file);
if (!deserializeError)
{
  if (cert["certificatePem"])
  {
    connectToAWS(cert);
  }
}
else
{
  createCertificate();
}
file.close();&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;h4&gt;ขั้นตอนการ Provisioning &lt;/h4&gt;



&lt;ul&gt;&lt;li&gt;ใช้ Claim certificate ในการเชื่อมต่อไปที่ AWS IoT Core ก่อน&lt;/li&gt;&lt;/ul&gt;



&lt;div&gt;&lt;pre&gt;&lt;code&gt;net.setCACert(AWS_CERT_CA);
net.setCertificate(AWS_CERT_CRT);
net.setPrivateKey(AWS_CERT_PRIVATE);
client.setServer(AWS_IOT_ENDPOINT, 8883);
// Create a message handler
client.setCallback(messageHandler);
// Set buffer size for receive a certificate.
client.setBufferSize(4000);
Serial.print("Connecting to AWS IOT.");
client.connect(THING_GROUP);&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;ul&gt;&lt;li&gt;Subscription MQTT Topic สำหรับรับ Response พวก certificate กลับมา สุดท้ายก็ทำการ Publish Payload ว่างๆ ไปยัง Topic &lt;mark&gt;“$aws/certificates/create/json”&lt;/mark&gt; เพื่อบอกว่าเราจะ Provision อุปกรณ์แล้วนะก็เป็นอันจบ&lt;/li&gt;&lt;/ul&gt;



&lt;div&gt;&lt;pre&gt;&lt;code&gt;  client.subscribe("$aws/certificates/create/json/accepted");
  client.subscribe("$aws/certificates/create/json/rejected");
  client.subscribe("$aws/provisioning-templates/esp32_fleet_prov_template/provision/json/accepted");
  client.subscribe("$aws/provisioning-templates/esp32_fleet_prov_template/provision/json/rejected");
  Serial.println("Create certificate..");
  client.publish("$aws/certificates/create/json", "");&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;h4&gt;Handle MQTT Payload กันบ้าง&lt;/h4&gt;



&lt;ul&gt;&lt;li&gt;ถ้า Topic &lt;mark&gt;“$aws/certificates/create/json/accepted”&lt;/mark&gt; เราก็โยนเข้าไปที่ Function &lt;em&gt;&lt;strong&gt;saveCertificateToFS&lt;/strong&gt;&lt;/em&gt; กับ &lt;strong&gt;&lt;em&gt;registerThing&lt;/em&gt;&lt;/strong&gt;&lt;/li&gt;&lt;/ul&gt;



&lt;blockquote&gt;&lt;p&gt;&lt;em&gt;&lt;strong&gt;saveCertificateToFS&lt;/strong&gt;&lt;/em&gt;: ตัว Function นี้จะทำการบันทึก certificatePem กับ privateKey ลงใน Filesystem&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;em&gt;registerThing&lt;/em&gt;&lt;/strong&gt;: จะ Publish ไปที่ Topic &lt;mark&gt;“$aws/provisioning-templates/esp32_fleet_prov_template/provision/json”&lt;/mark&gt; ซึ่ง Payload ที่จะส่งไปจะมี certificateOwnershipToken กับ parameters SerialNumber ไปด้วยเพื่อใช้เป็นชื่อของอุปกรณ์&lt;/p&gt;&lt;/blockquote&gt;



&lt;ul&gt;&lt;li&gt;ส่วนถ้าเป็น Topic &lt;mark&gt;“$aws/provisioning-templates/esp32_fleet_prov_template/provision/json/accepted”&lt;/mark&gt; ก็แสดงว่า AWS IoT Core register อุปกรณ์เราเรียบร้อยแล้ว ทีนี่เราก็สามารถใช้ Certificate ตัวใหม่ได้เลย&lt;/li&gt;&lt;/ul&gt;



&lt;div&gt;&lt;pre&gt;&lt;code&gt;DynamicJsonDocument doc(length);
deserializeJson(doc, payload);
if (topic == "$aws/certificates/create/json/accepted")
{
  saveCertificateToFS(doc);
  registerThing(doc);
}
else if (topic == "$aws/provisioning-templates/esp32_fleet_prov_template/provision/json/accepted")
{
  Serial.println("Register things successfully.");
  Serial.println("Restart in 5s.");
  sleep(5);
  ESP.restart();
}&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;เป็นยังไงกันบ้างครับสำหรับการ Scale อุปกรณ์หลายๆตัว ถ้าให้มานั่ง Generate Certificate ทุกครั้งคงจะเป็นอะไรที่ลำบากมากๆกันเลยทีเดียว ยิ่งถ้าคิดถึงว่าจะ Scale อุปกรณ์สัก 1000 ตัวแล้วน่าจะใช้เวลาพอสมควรกันเลย 5555+ หวังว่าการใช้ Device Provisioning แบบ Claim Certificate จะช่วยท่านได้บ้างนะครับ ตอนหน้าถ้ามีเวลาเดี๋ยวมานั่งเขียนว่าเราจะ Provision ผ่าน Greengrass[Edge] กันยังไงดี ซึ่งผมใช้วิธี &lt;strong&gt;&lt;a href="https://docs.aws.amazon.com/iot/latest/developerguide/provision-wo-cert.html#trusted-user" target="_blank"&gt;Provisioning by trusted user&lt;/a&gt;&lt;/strong&gt; แทน สำหรับวันนี้ขอบคุณและสวัสดีครับ&lt;/p&gt;



&lt;div&gt;&lt;figure&gt;&lt;img src="https://feeds.llun.dev/media/d13b50f4ba879f51801968000a539bb53dd89463c510ef19842800a6f12d1acc.jpg" alt="Twelve companies to embed AWS Greengrass - Enterprise IoT Insights" /&gt;&lt;/figure&gt;&lt;/div&gt;



&lt;p&gt;&lt;/p&gt;&lt;p&gt;The post &lt;a href="https://thanapon.info/aws-iot-device-provisioning-2/"&gt;[AWS-IoT] Device Provisioning สำหรับสเกลอุปกรณ์หลายๆตัว ภาค Hardware บ้าง&lt;/a&gt; first appeared on &lt;a href="https://thanapon.info/"&gt;Thanapon&lt;/a&gt;.&lt;/p&gt;</content>
    <source>
      <title>Thanapon</title>
      <link rel="self" href="https://thanapon.info/feed/"/>
      <link rel="alternate" href="https://thanapon.info"/>
    </source>
  </entry>
  <entry>
    <id>urn:uuid:0a623be8-b9f9-5bd4-8674-768de47d036d</id>
    <title>How to set memory for Solr on MacOS (installed via homebrew)</title>
    <updated>2022-02-24T03:09:00.006Z</updated>
    <author>
      <name>Tap</name>
    </author>
    <published>2022-02-24T03:09:00.006Z</published>
    <link rel="alternate" href="http://visibletrap.blogspot.com/2022/02/how-to-set-memory-for-solr-on-macos.html"/>
    <category term="Thai"/>
    <content type="html">&lt;p&gt;Modify this file &lt;span&gt;&lt;span&gt;/opt/homebrew/Cellar/solr/X.XX/&lt;/span&gt;&lt;span&gt;homebrew.mxcl.solr.plist &lt;/span&gt;&lt;/span&gt;to add these lines&lt;/p&gt;&lt;p&gt;&lt;span&gt;&lt;span&gt;&amp;lt;key&amp;gt;&lt;/span&gt;&lt;span&gt;EnvironmentVariables&lt;/span&gt;&lt;span&gt;&amp;lt;/key&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span&gt;&lt;span&gt;&amp;lt;dict&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span&gt;&lt;span&gt;  &amp;lt;key&amp;gt;&lt;/span&gt;&lt;span&gt;SOLR_JAVA_MEM&lt;/span&gt;&lt;span&gt;&amp;lt;/key&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span&gt;&lt;span&gt;  &amp;lt;string&amp;gt;&lt;/span&gt;&lt;span&gt;-Xmx2g&lt;/span&gt;&lt;span&gt;&amp;lt;/string&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span&gt;&lt;span&gt;&amp;lt;/dict&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span&gt;&lt;span&gt;Save and restart Solr&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span&gt;&lt;span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;$ brew services restart solr&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;</content>
    <source>
      <title>tAp's blog</title>
      <link rel="self" href="http://visibletrap.blogspot.com/feeds/posts/default"/>
      <link rel="alternate" href="http://visibletrap.blogspot.com/"/>
    </source>
  </entry>
  <entry>
    <id>urn:uuid:58547483-ebb6-532c-b073-6eec47a0bce7</id>
    <title>How to set Java version for lein</title>
    <updated>2021-12-02T12:49:00.003Z</updated>
    <author>
      <name>Tap</name>
    </author>
    <published>2021-12-02T12:49:00.003Z</published>
    <link rel="alternate" href="http://visibletrap.blogspot.com/2021/12/how-to-set-java-version-for-lein.html"/>
    <category term="Thai"/>
    <content type="html">&lt;p&gt;To select specific Java (JDK) to use for leiningen, set environment variable JAVA_CMD&lt;/p&gt;&lt;p&gt;For example,&lt;/p&gt;&lt;p&gt;&lt;span&gt;JAVA_CMD=/path/to/bin/java lein repl&lt;/span&gt;&lt;/p&gt;&lt;p&gt;Credit: https://gist.github.com/camsaul/c982019fd915510677236cd4b720a583#gistcomment-3439527 &lt;/p&gt;</content>
    <source>
      <title>tAp's blog</title>
      <link rel="self" href="http://visibletrap.blogspot.com/feeds/posts/default"/>
      <link rel="alternate" href="http://visibletrap.blogspot.com/"/>
    </source>
  </entry>
  <entry>
    <id>urn:uuid:35e29007-c13d-58ba-bd7e-87516adf817b</id>
    <title>How to print the longest line in a file?</title>
    <updated>2021-10-02T03:28:00.006Z</updated>
    <author>
      <name>Tap</name>
    </author>
    <published>2021-10-02T03:28:00.006Z</published>
    <link rel="alternate" href="http://visibletrap.blogspot.com/2021/10/how-to-print-longest-line-in-file.html"/>
    <category term="Thai"/>
    <content type="html">&lt;p&gt;&lt;span&gt;&lt;span&gt;awk &lt;/span&gt;&lt;span&gt;'length &amp;gt; max_length { max_length = length; longest_line = &lt;span&gt;$0&lt;/span&gt; } END { print longest_line }'&lt;/span&gt;&lt;span&gt; ./text&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span&gt;&lt;span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span&gt;&lt;span&gt;From: &lt;a href="https://unix.stackexchange.com/a/24510"&gt;https://unix.stackexchange.com/a/24510&lt;/a&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;</content>
    <source>
      <title>tAp's blog</title>
      <link rel="self" href="http://visibletrap.blogspot.com/feeds/posts/default"/>
      <link rel="alternate" href="http://visibletrap.blogspot.com/"/>
    </source>
  </entry>
  <entry>
    <id>urn:uuid:5b77a617-2619-5cf9-94ec-203a359bc95c</id>
    <title>Links related to how force macOS to use integrated/discrete graphics</title>
    <updated>2021-09-24T03:31:00.002Z</updated>
    <author>
      <name>Tap</name>
    </author>
    <published>2021-09-24T03:31:00.002Z</published>
    <link rel="alternate" href="http://visibletrap.blogspot.com/2021/09/links-related-to-how-force-macos-to-use.html"/>
    <category term="Thai"/>
    <content type="html">&lt;p&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="https://nathansnelgrove.com/how-to-force-your-macbook-pro-to-use-its-discrete-graphics-card-when-its-plugged-in/"&gt;How to Force Your MacBook Pro to Use Its Discrete Graphics Card When It’s Plugged In&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="https://forums.macrumors.com/threads/good-gpu-switching-application-for-mpb-16.2220002/post-28149852"&gt;https://forums.macrumors.com/threads/good-gpu-switching-application-for-mpb-16.2220002/post-28149852&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Copied from the above post in case the post is gone&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;sudo pmset -a gpuswitch 0&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;-b when on battery&lt;/div&gt;&lt;div&gt;-c when on AC power&lt;/div&gt;&lt;div&gt;-a always&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;0 iGPU only&lt;/div&gt;&lt;div&gt;1 dGPU only&lt;/div&gt;&lt;div&gt;2 automatic graphics switching&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;To reset everything back to default:&lt;/div&gt;&lt;div&gt;sudo pmset -a gpuswitch 2&lt;/div&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;</content>
    <source>
      <title>tAp's blog</title>
      <link rel="self" href="http://visibletrap.blogspot.com/feeds/posts/default"/>
      <link rel="alternate" href="http://visibletrap.blogspot.com/"/>
    </source>
  </entry>
  <entry>
    <id>urn:uuid:ca8ab96e-0c54-59f0-bd4b-c805e8dffaee</id>
    <title>[PostgreSQL] How to check null in jsonb array</title>
    <updated>2020-12-21T04:22:00.004Z</updated>
    <author>
      <name>Tap</name>
    </author>
    <published>2020-12-21T04:22:00.004Z</published>
    <link rel="alternate" href="http://visibletrap.blogspot.com/2020/12/postgresql-how-to-check-null-in-jsonb.html"/>
    <category term="Thai"/>
    <content type="html">&lt;div&gt; Use &lt;span&gt;jsonb_array_elements&lt;/span&gt;  to convert jsonb array to set (queriable similar to normal table) then we can use  &lt;span&gt;where x::text = 'null'&lt;/span&gt; to match the null value.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;Examples:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;span&gt;=&amp;gt; select x-&amp;gt;'id' as id &lt;br /&gt;&lt;/span&gt;&lt;span&gt;from jsonb_array_elements(&lt;br /&gt;&lt;/span&gt;&lt;span&gt;'[{"id": 4, "val": [null,1,null]}, &lt;br /&gt;&lt;/span&gt;&lt;span&gt;{"id": 2, "val": [3]}]'::jsonb&lt;br /&gt;&lt;/span&gt;&lt;span&gt;) as x, &lt;br /&gt;&lt;/span&gt;&lt;span&gt;jsonb_array_elements(x-&amp;gt;'val') as y &lt;br /&gt;&lt;/span&gt;&lt;span&gt;where y::text = 'null';&lt;br /&gt;&lt;/span&gt;&lt;span&gt; id &lt;br /&gt;&lt;/span&gt;&lt;span&gt;----&lt;br /&gt;&lt;/span&gt;&lt;span&gt; 4&lt;br /&gt;&lt;/span&gt;&lt;span&gt; 4&lt;br /&gt;&lt;/span&gt;&lt;span&gt;(2 rows)&lt;/span&gt;&lt;span&gt;&lt;br /&gt;&lt;/span&gt;&lt;span&gt;&lt;br /&gt;&lt;/span&gt;&lt;span&gt;&lt;br /&gt;&lt;/span&gt;&lt;span&gt;=&amp;gt; select x-&amp;gt;'id' as id&lt;br /&gt;&lt;/span&gt;&lt;span&gt;from jsonb_array_elements(&lt;br /&gt;&lt;/span&gt;&lt;span&gt;'[{"id": 4, "val": [null,1,null]}, &lt;br /&gt;&lt;/span&gt;&lt;span&gt;{"id": 2, "val": [3]}]'::jsonb&lt;br /&gt;&lt;/span&gt;&lt;span&gt;) as x, &lt;br /&gt;&lt;/span&gt;&lt;span&gt;jsonb_array_elements(x-&amp;gt;'val') as y &lt;br /&gt;&lt;/span&gt;&lt;span&gt;group by x-&amp;gt;'id' &lt;br /&gt;&lt;/span&gt;&lt;span&gt;having count(x) filter (where y::text  = 'null') &amp;gt; 1;&lt;br /&gt;&lt;/span&gt;&lt;span&gt; id &lt;br /&gt;&lt;/span&gt;&lt;span&gt;----------&lt;br /&gt;&lt;/span&gt;&lt;span&gt; 4&lt;br /&gt;&lt;/span&gt;&lt;span&gt;(1 row)&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;Adapted from: &lt;a href="https://dba.stackexchange.com/a/257799"&gt;https://dba.stackexchange.com/a/257799&lt;/a&gt;&lt;/span&gt;&lt;/div&gt;&lt;p&gt;&lt;span&gt;&lt;/span&gt;&lt;/p&gt;</content>
    <source>
      <title>tAp's blog</title>
      <link rel="self" href="http://visibletrap.blogspot.com/feeds/posts/default"/>
      <link rel="alternate" href="http://visibletrap.blogspot.com/"/>
    </source>
  </entry>
  <entry>
    <id>urn:uuid:3417977f-d609-55d7-bdee-bc4970a0b60a</id>
    <title>[PostgreSQL] How to check if there's a NULL value in array</title>
    <updated>2020-12-21T02:34:00.006Z</updated>
    <author>
      <name>Tap</name>
    </author>
    <published>2020-12-21T02:34:00.006Z</published>
    <link rel="alternate" href="http://visibletrap.blogspot.com/2020/12/postgresql-how-to-check-if-theres-null.html"/>
    <category term="Thai"/>
    <content type="html">&lt;div&gt;&lt;span&gt;WHERE array_position(array_column, NULL) IS NOT NULL&lt;/span&gt; &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;span&gt;Credit: &lt;a href="https://stackoverflow.com/a/47984368/1032449"&gt;https://stackoverflow.com/a/47984368/1032449&lt;/a&gt;&lt;/span&gt;&lt;/div&gt;</content>
    <source>
      <title>tAp's blog</title>
      <link rel="self" href="http://visibletrap.blogspot.com/feeds/posts/default"/>
      <link rel="alternate" href="http://visibletrap.blogspot.com/"/>
    </source>
  </entry>
  <entry>
    <id>urn:uuid:c30f52da-edf6-54f2-ad1f-41f23d676f7a</id>
    <title>Some usages of jstat</title>
    <updated>2020-06-26T08:51:00.002Z</updated>
    <author>
      <name>Tap</name>
    </author>
    <published>2020-06-26T08:51:00.002Z</published>
    <link rel="alternate" href="http://visibletrap.blogspot.com/2020/06/some-usages-of-jstat.html"/>
    <category term="Thai"/>
    <content type="html">&lt;span&gt;&lt;b&gt;-gcutil&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;$ jstat -gcutil  &lt;/span&gt;&lt;br /&gt;
&lt;span&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span&gt;This command shows utilization percentage of memory spaces of a java process.&lt;/span&gt;&lt;br /&gt;
&lt;span&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span&gt;S0: Survivor space 0&lt;/span&gt;&lt;br /&gt;
&lt;span&gt;S1&lt;/span&gt;&lt;span&gt;: Survivor space 1&lt;/span&gt;&lt;br /&gt;
&lt;span&gt;E&lt;/span&gt;&lt;span&gt;: Eden space&lt;/span&gt;&lt;br /&gt;
&lt;span&gt;O: Old-gen space&lt;/span&gt;&lt;br /&gt;
&lt;span&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span&gt;GC activities&lt;/span&gt;&lt;br /&gt;
&lt;span&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span&gt;YGC: Young GC count&lt;/span&gt;&lt;br /&gt;
&lt;span&gt;YGCT: Time spent by Young GC &lt;/span&gt;&lt;br /&gt;
&lt;span&gt;FGC: Full GC count&lt;/span&gt;&lt;br /&gt;
&lt;span&gt;FGCT: Time spent by Full GC&lt;/span&gt;&lt;br /&gt;
&lt;span&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span&gt;&lt;b&gt;-gc&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/span&gt;
&lt;span&gt;$ jstat -gc  &lt;/span&gt;&lt;br /&gt;
&lt;span&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span&gt;Find the current vm heap size by sum value under &lt;/span&gt;&lt;span&gt;S0C, S01, EC, OC&lt;/span&gt;&lt;br /&gt;
&lt;span&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span&gt;More at&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;a href="https://docs.oracle.com/javase/8/docs/technotes/tools/unix/jstat.html"&gt;https://docs.oracle.com/javase/8/docs/technotes/tools/unix/jstat.html&lt;/a&gt;</content>
    <source>
      <title>tAp's blog</title>
      <link rel="self" href="http://visibletrap.blogspot.com/feeds/posts/default"/>
      <link rel="alternate" href="http://visibletrap.blogspot.com/"/>
    </source>
  </entry>
  <entry>
    <id>urn:uuid:bc0f42ed-0173-500b-8272-f906af891fa6</id>
    <title>[Linux] Visualize parent - child process relationship</title>
    <updated>2020-06-26T08:41:00.003Z</updated>
    <author>
      <name>Tap</name>
    </author>
    <published>2020-06-26T08:41:00.003Z</published>
    <link rel="alternate" href="http://visibletrap.blogspot.com/2020/06/linux-visualize-parent-child-process.html"/>
    <category term="Thai"/>
    <content type="html">&lt;span&gt;$ ps -axf -o pid,ppid,tty,stat,cmd&lt;/span&gt;&lt;br /&gt;
&lt;span&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span&gt;Credit: &lt;a href="https://www.gmarik.info/blog/2012/orphan-vs-zombie-vs-daemon-processes/#process-table-example"&gt;Orphan vs Zombie vs Daemon processes&lt;/a&gt;&lt;/span&gt;</content>
    <source>
      <title>tAp's blog</title>
      <link rel="self" href="http://visibletrap.blogspot.com/feeds/posts/default"/>
      <link rel="alternate" href="http://visibletrap.blogspot.com/"/>
    </source>
  </entry>
  <entry>
    <id>urn:uuid:7ced9886-fda0-5506-86b5-bb433c68b435</id>
    <title>[Linux] sum memory usage of processes with the same name (or sub process)</title>
    <updated>2020-05-28T08:18:00.002Z</updated>
    <author>
      <name>Tap</name>
    </author>
    <published>2020-05-28T08:18:00.002Z</published>
    <link rel="alternate" href="http://visibletrap.blogspot.com/2020/05/linux-sum-memory-usage-of-processes.html"/>
    <category term="Thai"/>
    <content type="html">Use &lt;b&gt;atop&lt;/b&gt;. Press &lt;b&gt;p&lt;/b&gt; and press &lt;b&gt;m&lt;/b&gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;span&gt;Credit: &lt;a href="https://unix.stackexchange.com/a/209915"&gt;https://unix.stackexchange.com/a/209915&lt;/a&gt;&lt;/span&gt;</content>
    <source>
      <title>tAp's blog</title>
      <link rel="self" href="http://visibletrap.blogspot.com/feeds/posts/default"/>
      <link rel="alternate" href="http://visibletrap.blogspot.com/"/>
    </source>
  </entry>
  <entry>
    <id>urn:uuid:6f8116f5-f679-5982-8c27-3ff6fbd8a396</id>
    <title>Compress a file before scp from remote server to local</title>
    <updated>2019-07-25T07:47:00.004Z</updated>
    <author>
      <name>Tap</name>
    </author>
    <published>2019-07-25T07:47:00.004Z</published>
    <link rel="alternate" href="http://visibletrap.blogspot.com/2019/07/compress-file-before-scp-from-remote.html"/>
    <category term="Thai"/>
    <content type="html">&lt;span&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span&gt;ssh user@host "tar -zcvf - -C /path/to/dir filename" | tar -zxvf -&lt;/span&gt;&lt;br /&gt;
&lt;span&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span&gt;Note: only use when it's much faster to transfer a compressed file to your machine than transferring the original one.&lt;/span&gt;&lt;br /&gt;
&lt;span&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span&gt;&lt;b&gt;Credits:&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span&gt;&lt;a href="https://superuser.com/a/1354868"&gt;https://superuser.com/a/1354868&lt;/a&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span&gt;&lt;a href="https://stackoverflow.com/a/3035446/1032449"&gt;https://stackoverflow.com/a/3035446/1032449&lt;/a&gt;&lt;/span&gt;</content>
    <source>
      <title>tAp's blog</title>
      <link rel="self" href="http://visibletrap.blogspot.com/feeds/posts/default"/>
      <link rel="alternate" href="http://visibletrap.blogspot.com/"/>
    </source>
  </entry>
  <entry>
    <id>urn:uuid:4dece197-579c-5115-b456-1843930a225a</id>
    <title>[PostgreSQL] How to create read-only standby replica (follower)</title>
    <updated>2018-09-28T07:13:00.003Z</updated>
    <author>
      <name>Tap</name>
    </author>
    <published>2018-09-28T07:13:00.003Z</published>
    <link rel="alternate" href="http://visibletrap.blogspot.com/2018/09/postgresql-how-to-create-read-only.html"/>
    <category term="Thai"/>
    <content type="html">&lt;a href="https://www.opsdash.com/blog/postgresql-streaming-replication-howto.html"&gt;This link&lt;/a&gt; and &lt;a href="https://wiki.postgresql.org/wiki/Streaming_Replication"&gt;this link&lt;/a&gt; explain it really well and concise</content>
    <source>
      <title>tAp's blog</title>
      <link rel="self" href="http://visibletrap.blogspot.com/feeds/posts/default"/>
      <link rel="alternate" href="http://visibletrap.blogspot.com/"/>
    </source>
  </entry>
  <entry>
    <id>urn:uuid:113b279e-038c-544f-9af8-edd285251871</id>
    <title>Useful commands for observe running JVM process</title>
    <updated>2018-08-22T02:55:00.002Z</updated>
    <author>
      <name>Tap</name>
    </author>
    <published>2018-08-22T02:55:00.002Z</published>
    <link rel="alternate" href="http://visibletrap.blogspot.com/2018/08/useful-commands-for-observe-running-jvm.html"/>
    <category term="Thai"/>
    <content type="html">&lt;span&gt;$ jcmd&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
List running processes&lt;br /&gt;
&lt;br /&gt;
&lt;span&gt;$ jinfo &lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
Get details of a process&lt;br /&gt;
&lt;br /&gt;
&lt;span&gt;$ jps -lvm&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
List running processes with params</content>
    <source>
      <title>tAp's blog</title>
      <link rel="self" href="http://visibletrap.blogspot.com/feeds/posts/default"/>
      <link rel="alternate" href="http://visibletrap.blogspot.com/"/>
    </source>
  </entry>
  <entry>
    <id>urn:uuid:896c86a3-8f9c-58ab-aede-a742c8972b4e</id>
    <title>Clojure how to get JVM options from inside application</title>
    <updated>2018-04-25T06:00:00.004Z</updated>
    <author>
      <name>Tap</name>
    </author>
    <published>2018-04-25T06:00:00.004Z</published>
    <link rel="alternate" href="http://visibletrap.blogspot.com/2018/04/clojure-how-to-get-jvm-options-from.html"/>
    <category term="Thai"/>
    <content type="html">&lt;span&gt;(.getInputArguments (java.lang.management.ManagementFactory/getRuntimeMXBean))&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span&gt;Credit: &lt;a href="https://stackoverflow.com/a/1531999"&gt;How to get vm arguments from inside of java application?&lt;/a&gt;&lt;/span&gt;&lt;br /&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
</content>
    <source>
      <title>tAp's blog</title>
      <link rel="self" href="http://visibletrap.blogspot.com/feeds/posts/default"/>
      <link rel="alternate" href="http://visibletrap.blogspot.com/"/>
    </source>
  </entry>
  <entry>
    <id>urn:uuid:70c5a7ad-3d36-5e05-a315-94fdcca4ac5e</id>
    <title>Clojure has lesser typing error problems than the others well-known dynamic typing languages</title>
    <updated>2017-12-08T23:53:00.000Z</updated>
    <author>
      <name>Tap</name>
    </author>
    <published>2017-12-08T23:53:00.000Z</published>
    <link rel="alternate" href="http://visibletrap.blogspot.com/2017/12/clojure-has-lesser-typing-error.html"/>
    <category term="Thai"/>
    <content type="html">Give these snippets a try.&lt;br /&gt;
&lt;blockquote&gt;
&lt;span&gt;&lt;span&gt;// JS&lt;/span&gt;&lt;span&gt;&lt;br /&gt;function foo () {&lt;br /&gt;  bar(1)&lt;br /&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;span&gt;&lt;span&gt;# Ruby&lt;/span&gt;&lt;br /&gt;&lt;span&gt;def foo&lt;/span&gt;&lt;br /&gt;&lt;span&gt;  bar(1)&lt;/span&gt;&lt;br /&gt;&lt;span&gt;end&lt;/span&gt;&lt;/span&gt;&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;span&gt;&lt;span&gt;; Clojure&lt;/span&gt;&lt;/span&gt;
&lt;br /&gt;
&lt;span&gt;(defn foo [] &lt;/span&gt;&lt;span&gt;&lt;br /&gt;&lt;span&gt;  (bar 1))&lt;/span&gt;&lt;/span&gt;&lt;/blockquote&gt;
&lt;br /&gt;
As you can see from the images below, Clojure doesn't allow you to refer to an undeclared symbol. I believe this takes away quite a bit of typing error issues.&lt;br /&gt;
&lt;br /&gt;
&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhEjwgL0ZGDPPBOJ2K_AzYKov0LVK8m3tEVedG1wL1PUylYUFNCNuft3TuIsNabHonobC0or48bWaQbbd071xHqQMa_NmV-7qtxkS6eh22c5bDne0sjEVU5hbTtCtJzAVi7sftUYtK5rJY/s1600/Screen+Shot+2017-12-09+at+6.30.14+AM.png"&gt;&lt;img height="136" src="https://feeds.llun.dev/media/464db6f410d6b9930082fd750c42cfad98cb5af070781fdec69c4e3a63fc86a9.png" width="320" /&gt;&lt;/a&gt; &lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhOREl6o7n_i7EsJYZ9wTX1KPYsIr4vkMX6z1dIV0VTmJZjZAiGO_drR0e0ABC44WJfuKNHT_XwxHdCgyGXXhpIV4ApqE3-MJuz4dE7gHKud78EpcypTijYZSqULBmVzzXwFkC4B8ON98g/s1600/Screen+Shot+2017-12-09+at+6.29.27+AM.png"&gt;&lt;img height="160" src="https://feeds.llun.dev/media/2fbdda2a9f4dadacbe66948ef1422e5d8f352ef2b4a76cda87864477f04f5ee8.png" width="320" /&gt;&lt;/a&gt;&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhIcmWUUKXQ80e7yvm5rTX2AZ95DimAICK4eL9ZAhWydFmayW2DduLAnITd_DfKIZilCQUX9sqlA_QtnhPLUFt55xuGIUrMycXdm0fYljIldd4XSGvpfS-9YUvU28_HVFbmI9wGXTTzp5E/s1600/Screen+Shot+2017-12-09+at+6.32.49+AM.png"&gt;&lt;img height="107" src="https://feeds.llun.dev/media/799bb1a103b224df994a6ea0871579e96963e0910c5b5505c0d26d15aee6af76.png" width="320" /&gt;&lt;/a&gt;</content>
    <source>
      <title>tAp's blog</title>
      <link rel="self" href="http://visibletrap.blogspot.com/feeds/posts/default"/>
      <link rel="alternate" href="http://visibletrap.blogspot.com/"/>
    </source>
  </entry>
  <entry>
    <id>urn:uuid:c9495d23-40f7-5c48-8bb0-e40356d0a2c1</id>
    <title>Config number of file descriptors on Linux</title>
    <updated>2017-07-12T14:36:00.000Z</updated>
    <author>
      <name>Tap</name>
    </author>
    <published>2017-07-12T14:36:00.000Z</published>
    <link rel="alternate" href="http://visibletrap.blogspot.com/2017/07/config-number-of-file-descriptors-on.html"/>
    <category term="Thai"/>
    <content type="html">Check file descriptor limit for a process. Vary depending on owner of the process&lt;br /&gt;
&lt;blockquote&gt;
&lt;span&gt;$ cat /proc/{process-id}/limits&lt;/span&gt;&lt;/blockquote&gt;
Check current number of file descriptors of a process&lt;br /&gt;
&lt;blockquote&gt;
&lt;span&gt;$ sudo ls /proc/{process-id}/fd | wc -l&lt;/span&gt;&lt;/blockquote&gt;
Set file descriptors limit for a user at &lt;b&gt;/etc/security/limits.conf&lt;/b&gt;&lt;br /&gt;
&lt;blockquote&gt;
&lt;span&gt;*    soft nofile 64000&lt;br /&gt;*    hard nofile 64000&lt;br /&gt;root soft nofile 64000&lt;br /&gt;root hard nofile 64000&lt;/span&gt;&lt;/blockquote&gt;
Check system file descriptor limit&lt;br /&gt;
&lt;blockquote&gt;
&lt;span&gt;$ cat /proc/sys/fs/file-max&lt;/span&gt;&lt;/blockquote&gt;
Check current number of system file descriptors&lt;br /&gt;
&lt;blockquote&gt;
&lt;span&gt;$ cat /proc/sys/fs/file-nr &lt;/span&gt;&lt;/blockquote&gt;
&lt;br /&gt;
&lt;span&gt;Credits:&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://underyx.me/2015/05/18/raising-the-maximum-number-of-file-descriptors"&gt;&lt;span&gt;Raising the Maximum Number of File Descriptors (Open Files) on Ubuntu 14.04 Trusty&lt;/span&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://unix.stackexchange.com/a/104405"&gt;&lt;span&gt;https://unix.stackexchange.com/a/104405&lt;/span&gt;&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content>
    <source>
      <title>tAp's blog</title>
      <link rel="self" href="http://visibletrap.blogspot.com/feeds/posts/default"/>
      <link rel="alternate" href="http://visibletrap.blogspot.com/"/>
    </source>
  </entry>
  <entry>
    <id>urn:uuid:d3eba6dc-57b2-5dba-a446-ff3847bdb6a9</id>
    <title>Increase video volume</title>
    <updated>2016-12-21T07:39:00.002Z</updated>
    <author>
      <name>Tap</name>
    </author>
    <published>2016-12-21T07:39:00.002Z</published>
    <link rel="alternate" href="http://visibletrap.blogspot.com/2016/12/increase-video-volume.html"/>
    <category term="Thai"/>
    <content type="html">&lt;blockquote&gt;
&lt;span&gt;$ ffmpeg -i input -vcodec copy -af "volume=20dB" output&lt;/span&gt;&lt;/blockquote&gt;
&lt;span&gt;Credit: &lt;a href="http://breakthebit.org/post/53570840966/how-to-increase-volume-in-a-video-without"&gt;How to increase volume in a video without re-encoding the video&lt;/a&gt; &lt;/span&gt;</content>
    <source>
      <title>tAp's blog</title>
      <link rel="self" href="http://visibletrap.blogspot.com/feeds/posts/default"/>
      <link rel="alternate" href="http://visibletrap.blogspot.com/"/>
    </source>
  </entry>
  <entry>
    <id>urn:uuid:5fde2a33-6e3b-54d2-aa7d-6379acd7c514</id>
    <title>Convert .ts to .mp4</title>
    <updated>2016-12-21T07:37:00.003Z</updated>
    <author>
      <name>Tap</name>
    </author>
    <published>2016-12-21T07:37:00.003Z</published>
    <link rel="alternate" href="http://visibletrap.blogspot.com/2016/12/convert-ts-to-mp4.html"/>
    <category term="Thai"/>
    <content type="html">&lt;blockquote&gt;
&lt;span&gt;$ ffmpeg -i input.ts -acodec copy -vcodec copy out.mp4&lt;/span&gt;&lt;/blockquote&gt;
&lt;span&gt;Credit: &lt;a href="http://stackoverflow.com/a/17916418/1032449"&gt;http://stackoverflow.com/a/17916418/1032449&lt;/a&gt; &lt;/span&gt;</content>
    <source>
      <title>tAp's blog</title>
      <link rel="self" href="http://visibletrap.blogspot.com/feeds/posts/default"/>
      <link rel="alternate" href="http://visibletrap.blogspot.com/"/>
    </source>
  </entry>
  <entry>
    <id>urn:uuid:96b65644-d7a4-5c1b-b603-27aaf03a000c</id>
    <title>[PostgreSQL] How to verify if replication catch up with master change</title>
    <updated>2016-09-01T10:14:00.001Z</updated>
    <author>
      <name>Tap</name>
    </author>
    <published>2016-09-01T10:14:00.001Z</published>
    <link rel="alternate" href="http://visibletrap.blogspot.com/2016/09/postgresql-how-to-verify-if-replication.html"/>
    <category term="Thai"/>
    <content type="html">[Run on master] Check master location with&lt;br /&gt;
&lt;blockquote&gt;
SELECT pg_current_xlog_location();&lt;/blockquote&gt;
 [Run on replica] Check replica replayed location with&lt;br /&gt;
&lt;blockquote&gt;
SELECT pg_last_xlog_replay_location();&lt;/blockquote&gt;
[Run on master] Check replica status from master&lt;br /&gt;
&lt;blockquote&gt;
SELECT client_addr, state, sent_location, write_location, flush_location, replay_location FROM pg_stat_replication;&lt;/blockquote&gt;
*write, flush, replay are status of replica&lt;br /&gt;
&lt;br /&gt;
[Run on replica] Check time from the latest reply&lt;br /&gt;
&lt;blockquote&gt;
SELECT now() - pg_last_xact_replay_timestamp() AS replication_delay;&lt;/blockquote&gt;
&lt;span&gt;Credit:&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;&lt;span&gt;Bullet 12th of &lt;a href="https://wiki.postgresql.org/wiki/Streaming_Replication"&gt;https://wiki.postgresql.org/wiki/Streaming_Replication&lt;/a&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;&lt;a href="https://www.niwi.nz/2013/02/16/replication-status-in-postgresql/"&gt;https://www.niwi.nz/2013/02/16/replication-status-in-postgresql/&lt;/a&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
</content>
    <source>
      <title>tAp's blog</title>
      <link rel="self" href="http://visibletrap.blogspot.com/feeds/posts/default"/>
      <link rel="alternate" href="http://visibletrap.blogspot.com/"/>
    </source>
  </entry>
  <entry>
    <id>urn:uuid:31e00134-a642-5ed4-904a-c56bf6394c17</id>
    <title>Shorthand for Git upstream (tracked) remote branch</title>
    <updated>2016-08-24T10:23:00.002Z</updated>
    <author>
      <name>Tap</name>
    </author>
    <published>2016-08-24T10:23:00.002Z</published>
    <link rel="alternate" href="http://visibletrap.blogspot.com/2016/08/shorthand-for-git-upstream-track-remote.html"/>
    <category term="Thai"/>
    <content type="html">It's &lt;span&gt;@{u}&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;br /&gt;
&lt;span&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span&gt;For example, if you are on master branch, and master branch is tracked with origin/master. You can use &lt;/span&gt;&lt;span&gt;git merge @{u}&lt;/span&gt;&lt;span&gt; instead of &lt;/span&gt;&lt;span&gt;git merge origin/master&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;br /&gt;
&lt;span&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span&gt;Reference: &lt;a href="https://git-scm.com/book/en/v2/Git-Branching-Remote-Branches#upstream-shorthand-k9UotnHmIO"&gt;https://git-scm.com/book/en/v2/Git-Branching-Remote-Branches#upstream-shorthand-k9UotnHmIO&lt;/a&gt;&lt;/span&gt;</content>
    <source>
      <title>tAp's blog</title>
      <link rel="self" href="http://visibletrap.blogspot.com/feeds/posts/default"/>
      <link rel="alternate" href="http://visibletrap.blogspot.com/"/>
    </source>
  </entry>
  <entry>
    <id>urn:uuid:6cd04fc4-96e8-51c7-9817-33cb8c90dae5</id>
    <title>[Solved] An obscure error in case somebody else gets it too</title>
    <updated>2016-08-23T10:15:00.000Z</updated>
    <author>
      <name>Tap</name>
    </author>
    <published>2016-08-23T10:15:00.000Z</published>
    <link rel="alternate" href="http://visibletrap.blogspot.com/2016/08/solved-obscure-error-in-case-somebody.html"/>
    <category term="Thai"/>
    <content type="html">I fixed an error below with `&lt;b&gt;lein clean`&lt;/b&gt;. Hope this post can save your time as it used mine.&lt;br /&gt;
&lt;blockquote&gt;
&lt;blockquote&gt;
&lt;span&gt;#error {&lt;/span&gt;&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;span&gt;  :cause clojure.core$seq_QMARK___5848&lt;/span&gt;&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;span&gt;    :via&lt;/span&gt;&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;span&gt;    [{:type clojure.lang.Compiler$CompilerException&lt;/span&gt;&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;span&gt;      :message java.lang.NoClassDefFoundError: clojure/core$seq_QMARK___5848, compiling:(clj_gatling/report.clj:1:1)&lt;/span&gt;&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;span&gt;        :at [clojure.lang.Compiler load Compiler.java 7415]}&lt;/span&gt;&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;span&gt;  {:type java.lang.NoClassDefFoundError&lt;/span&gt;&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;span&gt;    :message clojure/core$seq_QMARK___5848&lt;/span&gt;&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;span&gt;      :at [clojure.core.cache$lru_cache_factory invokeStatic cache.clj 581]}&lt;/span&gt;&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;span&gt;    {:type java.lang.ClassNotFoundException&lt;/span&gt;&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;span&gt;      :message clojure.core$seq_QMARK___5848&lt;/span&gt;&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;span&gt;        :at [java.net.URLClassLoader findClass URLClassLoader.java 381]}]&lt;/span&gt;&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;span&gt;        :trace&lt;/span&gt;&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;span&gt;        [[java.net.URLClassLoader findClass URLClassLoader.java 381]&lt;/span&gt;&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;span&gt;        [java.lang.ClassLoader loadClass ClassLoader.java 424]&lt;/span&gt;&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;span&gt;        [sun.misc.Launcher$AppClassLoader loadClass Launcher.java 331]&lt;/span&gt;&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;span&gt;        [java.lang.ClassLoader loadClass ClassLoader.java 357]&lt;/span&gt;&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;span&gt;        [clojure.core.cache$lru_cache_factory invokeStatic cache.clj 581]&lt;/span&gt;&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;span&gt;        [clojure.core.memoize$lru$fn__2765 invoke memoize.clj 334]&lt;/span&gt;&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;span&gt;        [clojure.lang.AFn applyToHelper AFn.java 160]&lt;/span&gt;&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;span&gt;        [clojure.lang.AFn applyTo AFn.java 144]&lt;/span&gt;&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;span&gt;        [clojure.core$apply invokeStatic core.clj 659]&lt;/span&gt;&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;span&gt;        [clojure.core.memoize$build_memoizer invokeStatic memoize.clj 152]&lt;/span&gt;&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;span&gt;        [clojure.core.memoize$lru invokeStatic memoize.clj 332]&lt;/span&gt;&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;span&gt;        [clojure.core.memoize$lru invoke memoize.clj 292]&lt;/span&gt;&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;span&gt;        [clojure.core.memoize$lru invokeStatic memoize.clj 328]&lt;/span&gt;&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;span&gt;        [clojure.core.memoize$lru invoke memoize.clj 292]&lt;/span&gt;&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;span&gt;        [clojure.tools.analyzer.jvm.utils__init load nil 79]&lt;/span&gt;&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;span&gt;        [clojure.tools.analyzer.jvm.utils__init  nil -1]&lt;/span&gt;&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;span&gt;        [java.lang.Class forName0 Class.java -2]&lt;/span&gt;&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;span&gt;        [java.lang.Class forName Class.java 348]&lt;/span&gt;&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;span&gt;        [clojure.lang.RT classForName RT.java 2183]&lt;/span&gt;&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;span&gt;        [clojure.lang.RT classForName RT.java 2192]&lt;/span&gt;&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;span&gt;        [clojure.lang.RT loadClassForName RT.java 2211]&lt;/span&gt;&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;span&gt;        [clojure.lang.RT load RT.java 445]&lt;/span&gt;&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;span&gt;        [clojure.lang.RT load RT.java 421]&lt;/span&gt;&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;span&gt;        [clojure.core$load$fn__7645 invoke core.clj 6008]&lt;/span&gt;&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;span&gt;        [clojure.core$load invokeStatic core.clj 6007]&lt;/span&gt;&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;span&gt;        [clojure.core$load doInvoke core.clj 5991]&lt;/span&gt;&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;span&gt;        [clojure.lang.RestFn invoke RestFn.java 408]&lt;/span&gt;&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;span&gt;        [clojure.core$load_one invokeStatic core.clj 5812]&lt;/span&gt;&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;span&gt;        [clojure.core$load_one invoke core.clj 5807]&lt;/span&gt;&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;span&gt;        [clojure.core$load_lib$fn__7590 invoke core.clj 5852]&lt;/span&gt;&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;span&gt;        [clojure.core$load_lib invokeStatic core.clj 5851]&lt;/span&gt;&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;span&gt;        [clojure.core$load_lib doInvoke core.clj 5832]&lt;/span&gt;&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;span&gt;        [clojure.lang.RestFn applyTo RestFn.java 142]&lt;/span&gt;&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;span&gt;        [clojure.core$apply invokeStatic core.clj 659]&lt;/span&gt;&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;span&gt;        [clojure.core$load_libs invokeStatic core.clj 5889]&lt;/span&gt;&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;span&gt;        [clojure.core$load_libs doInvoke core.clj 5873]&lt;/span&gt;&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;span&gt;        [clojure.lang.RestFn applyTo RestFn.java 137]&lt;/span&gt;&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;span&gt;        [clojure.core$apply invokeStatic core.clj 659]&lt;/span&gt;&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;span&gt;        [clojure.core$require invokeStatic core.clj 5911]&lt;/span&gt;&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;span&gt;        [clojure.tools.analyzer.jvm$loading__7118__auto____2196 invoke jvm.clj 9]&lt;/span&gt;&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;span&gt;        [clojure.tools.analyzer.jvm__init load nil 9]&lt;/span&gt;&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;span&gt;        [clojure.tools.analyzer.jvm__init  nil -1]&lt;/span&gt;&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;span&gt;        [java.lang.Class forName0 Class.java -2]&lt;/span&gt;&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;span&gt;        [java.lang.Class forName Class.java 348]&lt;/span&gt;&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;span&gt;        [clojure.lang.RT classForName RT.java 2183]&lt;/span&gt;&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;span&gt;        [clojure.lang.RT classForName RT.java 2192]&lt;/span&gt;&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;span&gt;        [clojure.lang.RT loadClassForName RT.java 2211]&lt;/span&gt;&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;span&gt;        [clojure.lang.RT load RT.java 445]&lt;/span&gt;&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;span&gt;        [clojure.lang.RT load RT.java 421]&lt;/span&gt;&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;span&gt;        [clojure.core$load$fn__7645 invoke core.clj 6008]&lt;/span&gt;&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;span&gt;        [clojure.core$load invokeStatic core.clj 6007]&lt;/span&gt;&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;span&gt;        [clojure.core$load doInvoke core.clj 5991]&lt;/span&gt;&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;span&gt;        [clojure.lang.RestFn invoke RestFn.java 408]&lt;/span&gt;&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;span&gt;        [clojure.core$load_one invokeStatic core.clj 5812]&lt;/span&gt;&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;span&gt;        [clojure.core$load_one invoke core.clj 5807]&lt;/span&gt;&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;span&gt;        [clojure.core$load_lib$fn__7590 invoke core.clj 5852]&lt;/span&gt;&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;span&gt;        [clojure.core$load_lib invokeStatic core.clj 5851]&lt;/span&gt;&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;span&gt;        [clojure.core$load_lib doInvoke core.clj 5832]&lt;/span&gt;&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;span&gt;        [clojure.lang.RestFn applyTo RestFn.java 142]&lt;/span&gt;&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;span&gt;        [clojure.core$apply invokeStatic core.clj 659]&lt;/span&gt;&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;span&gt;        [clojure.core$load_libs invokeStatic core.clj 5889]&lt;/span&gt;&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;span&gt;        [clojure.core$load_libs doInvoke core.clj 5873]&lt;/span&gt;&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;span&gt;        [clojure.lang.RestFn applyTo RestFn.java 137]&lt;/span&gt;&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;span&gt;        [clojure.core$apply invokeStatic core.clj 659]&lt;/span&gt;&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;span&gt;        [clojure.core$require invokeStatic core.clj 5911]&lt;/span&gt;&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;span&gt;        [clojure.core.async.impl.ioc_macros$loading__7118__auto____1596 invoke ioc_macros.clj 12]&lt;/span&gt;&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;span&gt;        [clojure.core.async.impl.ioc_macros__init load nil 12]&lt;/span&gt;&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;span&gt;        [clojure.core.async.impl.ioc_macros__init  nil -1]&lt;/span&gt;&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;span&gt;        [java.lang.Class forName0 Class.java -2]&lt;/span&gt;&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;span&gt;        [java.lang.Class forName Class.java 348]&lt;/span&gt;&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;span&gt;        [clojure.lang.RT classForName RT.java 2183]&lt;/span&gt;&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;span&gt;        [clojure.lang.RT classForName RT.java 2192]&lt;/span&gt;&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;span&gt;        [clojure.lang.RT loadClassForName RT.java 2211]&lt;/span&gt;&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;span&gt;        [clojure.lang.RT load RT.java 445]&lt;/span&gt;&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;span&gt;        [clojure.lang.RT load RT.java 421]&lt;/span&gt;&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;span&gt;        [clojure.core$load$fn__7645 invoke core.clj 6008]&lt;/span&gt;&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;span&gt;        [clojure.core$load invokeStatic core.clj 6007]&lt;/span&gt;&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;span&gt;        [clojure.core$load doInvoke core.clj 5991]&lt;/span&gt;&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;span&gt;        [clojure.lang.RestFn invoke RestFn.java 408]&lt;/span&gt;&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;span&gt;        [clojure.core$load_one invokeStatic core.clj 5812]&lt;/span&gt;&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;span&gt;        [clojure.core$load_one invoke core.clj 5807]&lt;/span&gt;&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;span&gt;        [clojure.core$load_lib$fn__7590 invoke core.clj 5852]&lt;/span&gt;&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;span&gt;        [clojure.core$load_lib invokeStatic core.clj 5851]&lt;/span&gt;&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;span&gt;        [clojure.core$load_lib doInvoke core.clj 5832]&lt;/span&gt;&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;span&gt;        [clojure.lang.RestFn applyTo RestFn.java 142]&lt;/span&gt;&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;span&gt;        [clojure.core$apply invokeStatic core.clj 659]&lt;/span&gt;&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;span&gt;        [clojure.core$load_libs invokeStatic core.clj 5889]&lt;/span&gt;&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;span&gt;        [clojure.core$load_libs doInvoke core.clj 5873]&lt;/span&gt;&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;span&gt;        [clojure.lang.RestFn applyTo RestFn.java 137]&lt;/span&gt;&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;span&gt;        [clojure.core$apply invokeStatic core.clj 659]&lt;/span&gt;&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;span&gt;        [clojure.core$require invokeStatic core.clj 5911]&lt;/span&gt;&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;span&gt;        [clojure.core.async$loading__7118__auto____1152 invoke async.clj 9]&lt;/span&gt;&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;span&gt;        [clojure.core.async__init load nil 9]&lt;/span&gt;&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;span&gt;        [clojure.core.async__init  nil -1]&lt;/span&gt;&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;span&gt;        [java.lang.Class forName0 Class.java -2]&lt;/span&gt;&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;span&gt;        [java.lang.Class forName Class.java 348]&lt;/span&gt;&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;span&gt;        [clojure.lang.RT classForName RT.java 2183]&lt;/span&gt;&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;span&gt;        [clojure.lang.RT classForName RT.java 2192]&lt;/span&gt;&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;span&gt;        [clojure.lang.RT loadClassForName RT.java 2211]&lt;/span&gt;&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;span&gt;        [clojure.lang.RT load RT.java 445]&lt;/span&gt;&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;span&gt;        [clojure.lang.RT load RT.java 421]&lt;/span&gt;&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;span&gt;        [clojure.core$load$fn__7645 invoke core.clj 6008]&lt;/span&gt;&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;span&gt;        [clojure.core$load invokeStatic core.clj 6007]&lt;/span&gt;&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;span&gt;        [clojure.core$load doInvoke core.clj 5991]&lt;/span&gt;&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;span&gt;        [clojure.lang.RestFn invoke RestFn.java 408]&lt;/span&gt;&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;span&gt;        [clojure.core$load_one invokeStatic core.clj 5812]&lt;/span&gt;&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;span&gt;        [clojure.core$load_one invoke core.clj 5807]&lt;/span&gt;&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;span&gt;        [clojure.core$load_lib$fn__7590 invoke core.clj 5852]&lt;/span&gt;&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;span&gt;        [clojure.core$load_lib invokeStatic core.clj 5851]&lt;/span&gt;&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;span&gt;        [clojure.core$load_lib doInvoke core.clj 5832]&lt;/span&gt;&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;span&gt;        [clojure.lang.RestFn applyTo RestFn.java 142]&lt;/span&gt;&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;span&gt;        [clojure.core$apply invokeStatic core.clj 659]&lt;/span&gt;&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;span&gt;        [clojure.core$load_libs invokeStatic core.clj 5889]&lt;/span&gt;&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;span&gt;        [clojure.core$load_libs doInvoke core.clj 5873]&lt;/span&gt;&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;span&gt;        [clojure.lang.RestFn applyTo RestFn.java 137]&lt;/span&gt;&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;span&gt;        [clojure.core$apply invokeStatic core.clj 659]&lt;/span&gt;&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;span&gt;        [clojure.core$require invokeStatic core.clj 5911]&lt;/span&gt;&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;span&gt;        [clojure.core$require doInvoke core.clj 5911]&lt;/span&gt;&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;span&gt;        [clojure.lang.RestFn invoke RestFn.java 436]&lt;/span&gt;&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;span&gt;        [clj_gatling.report$eval47$loading__7531__auto____48 invoke report.clj 1]&lt;/span&gt;&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;span&gt;        [clj_gatling.report$eval47 invokeStatic report.clj 1]&lt;/span&gt;&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;span&gt;        [clj_gatling.report$eval47 invoke report.clj 1]&lt;/span&gt;&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;span&gt;        [clojure.lang.Compiler eval Compiler.java 6951]&lt;/span&gt;&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;span&gt;        [clojure.lang.Compiler eval Compiler.java 6940]&lt;/span&gt;&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;span&gt;        [clojure.lang.Compiler load Compiler.java 7403]&lt;/span&gt;&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;span&gt;        [clojure.lang.RT loadResourceScript RT.java 374]&lt;/span&gt;&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;span&gt;        [clojure.lang.RT loadResourceScript RT.java 365]&lt;/span&gt;&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;span&gt;        [clojure.lang.RT load RT.java 455]&lt;/span&gt;&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;span&gt;        [clojure.lang.RT load RT.java 421]&lt;/span&gt;&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;span&gt;        [clojure.core$load$fn__7645 invoke core.clj 6008]&lt;/span&gt;&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;span&gt;        [clojure.core$load invokeStatic core.clj 6007]&lt;/span&gt;&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;span&gt;        [clojure.core$load doInvoke core.clj 5991]&lt;/span&gt;&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;span&gt;        [clojure.lang.RestFn invoke RestFn.java 408]&lt;/span&gt;&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;span&gt;        [clojure.core$load_one invokeStatic core.clj 5812]&lt;/span&gt;&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;span&gt;        [clojure.core$load_one invoke core.clj 5807]&lt;/span&gt;&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;span&gt;        [clojure.core$load_lib$fn__7590 invoke core.clj 5852]&lt;/span&gt;&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;span&gt;        [clojure.core$load_lib invokeStatic core.clj 5851]&lt;/span&gt;&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;span&gt;        [clojure.core$load_lib doInvoke core.clj 5832]&lt;/span&gt;&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;span&gt;        [clojure.lang.RestFn applyTo RestFn.java 142]&lt;/span&gt;&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;span&gt;        [clojure.core$apply invokeStatic core.clj 659]&lt;/span&gt;&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;span&gt;        [clojure.core$load_libs invokeStatic core.clj 5889]&lt;/span&gt;&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;span&gt;        [clojure.core$load_libs doInvoke core.clj 5873]&lt;/span&gt;&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;span&gt;        [clojure.lang.RestFn applyTo RestFn.java 137]&lt;/span&gt;&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;span&gt;        [clojure.core$apply invokeStatic core.clj 659]&lt;/span&gt;&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;span&gt;        [clojure.core$require invokeStatic core.clj 5911]&lt;/span&gt;&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;span&gt;        [clojure.core$require doInvoke core.clj 5911]&lt;/span&gt;&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;span&gt;        [clojure.lang.RestFn invoke RestFn.java 457]&lt;/span&gt;&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;span&gt;        [clj_gatling.core$eval30$loading__7531__auto____31 invoke core.clj 1]&lt;/span&gt;&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;span&gt;        [clj_gatling.core$eval30 invokeStatic core.clj 1]&lt;/span&gt;&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;span&gt;        [clj_gatling.core$eval30 invoke core.clj 1]&lt;/span&gt;&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;span&gt;        [clojure.lang.Compiler eval Compiler.java 6951]&lt;/span&gt;&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;span&gt;        [clojure.lang.Compiler eval Compiler.java 6940]&lt;/span&gt;&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;span&gt;        [clojure.lang.Compiler load Compiler.java 7403]&lt;/span&gt;&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;span&gt;        [clojure.lang.RT loadResourceScript RT.java 374]&lt;/span&gt;&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;span&gt;        [clojure.lang.RT loadResourceScript RT.java 365]&lt;/span&gt;&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;span&gt;        [clojure.lang.RT load RT.java 455]&lt;/span&gt;&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;span&gt;        [clojure.lang.RT load RT.java 421]&lt;/span&gt;&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;span&gt;        [clojure.core$load$fn__7645 invoke core.clj 6008]&lt;/span&gt;&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;span&gt;        [clojure.core$load invokeStatic core.clj 6007]&lt;/span&gt;&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;span&gt;        [clojure.core$load doInvoke core.clj 5991]&lt;/span&gt;&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;span&gt;        [clojure.lang.RestFn invoke RestFn.java 408]&lt;/span&gt;&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;span&gt;        [clojure.core$load_one invokeStatic core.clj 5812]&lt;/span&gt;&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;span&gt;        [clojure.core$load_one invoke core.clj 5807]&lt;/span&gt;&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;span&gt;        [clojure.core$load_lib$fn__7590 invoke core.clj 5852]&lt;/span&gt;&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;span&gt;        [clojure.core$load_lib invokeStatic core.clj 5851]&lt;/span&gt;&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;span&gt;        [clojure.core$load_lib doInvoke core.clj 5832]&lt;/span&gt;&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;span&gt;        [clojure.lang.RestFn applyTo RestFn.java 142]&lt;/span&gt;&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;span&gt;        [clojure.core$apply invokeStatic core.clj 659]&lt;/span&gt;&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;span&gt;        [clojure.core$load_libs invokeStatic core.clj 5889]&lt;/span&gt;&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;span&gt;        [clojure.core$load_libs doInvoke core.clj 5873]&lt;/span&gt;&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;span&gt;        [clojure.lang.RestFn applyTo RestFn.java 137]&lt;/span&gt;&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;span&gt;        [clojure.core$apply invokeStatic core.clj 659]&lt;/span&gt;&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;span&gt;        [clojure.core$require invokeStatic core.clj 5911]&lt;/span&gt;&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;span&gt;        [clojure.core$require doInvoke core.clj 5911]&lt;/span&gt;&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;span&gt;        [clojure.lang.RestFn invoke RestFn.java 551]&lt;/span&gt;&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;span&gt;        [army.core$eval24$loading__7531__auto____25 invoke core.clj 1]&lt;/span&gt;&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;span&gt;        [army.core$eval24 invokeStatic core.clj 1]&lt;/span&gt;&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;span&gt;        [army.core$eval24 invoke core.clj 1]&lt;/span&gt;&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;span&gt;        [clojure.lang.Compiler eval Compiler.java 6951]&lt;/span&gt;&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;span&gt;        [clojure.lang.Compiler eval Compiler.java 6940]&lt;/span&gt;&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;span&gt;        [clojure.lang.Compiler load Compiler.java 7403]&lt;/span&gt;&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;span&gt;        [clojure.lang.RT loadResourceScript RT.java 374]&lt;/span&gt;&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;span&gt;        [clojure.lang.RT loadResourceScript RT.java 365]&lt;/span&gt;&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;span&gt;        [clojure.lang.RT load RT.java 455]&lt;/span&gt;&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;span&gt;        [clojure.lang.RT load RT.java 421]&lt;/span&gt;&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;span&gt;        [clojure.core$load$fn__7645 invoke core.clj 6008]&lt;/span&gt;&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;span&gt;        [clojure.core$load invokeStatic core.clj 6007]&lt;/span&gt;&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;span&gt;        [clojure.core$load doInvoke core.clj 5991]&lt;/span&gt;&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;span&gt;        [clojure.lang.RestFn invoke RestFn.java 408]&lt;/span&gt;&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;span&gt;        [clojure.core$load_one invokeStatic core.clj 5812]&lt;/span&gt;&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;span&gt;        [clojure.core$load_one invoke core.clj 5807]&lt;/span&gt;&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;span&gt;        [clojure.core$load_lib$fn__7590 invoke core.clj 5852]&lt;/span&gt;&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;span&gt;        [clojure.core$load_lib invokeStatic core.clj 5851]&lt;/span&gt;&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;span&gt;        [clojure.core$load_lib doInvoke core.clj 5832]&lt;/span&gt;&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;span&gt;        [clojure.lang.RestFn applyTo RestFn.java 142]&lt;/span&gt;&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;span&gt;        [clojure.core$apply invokeStatic core.clj 659]&lt;/span&gt;&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;span&gt;        [clojure.core$load_libs invokeStatic core.clj 5889]&lt;/span&gt;&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;span&gt;        [clojure.core$load_libs doInvoke core.clj 5873]&lt;/span&gt;&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;span&gt;        [clojure.lang.RestFn applyTo RestFn.java 137]&lt;/span&gt;&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;span&gt;        [clojure.core$apply invokeStatic core.clj 659]&lt;/span&gt;&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;span&gt;        [clojure.core$require invokeStatic core.clj 5911]&lt;/span&gt;&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;span&gt;        [clojure.core$require doInvoke core.clj 5911]&lt;/span&gt;&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;span&gt;        [clojure.lang.RestFn invoke RestFn.java 408]&lt;/span&gt;&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;span&gt;        [user$eval15 invokeStatic form-init7134710474813340838.clj 1]&lt;/span&gt;&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;span&gt;        [user$eval15 invoke form-init7134710474813340838.clj 1]&lt;/span&gt;&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;span&gt;        [clojure.lang.Compiler eval Compiler.java 6951]&lt;/span&gt;&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;span&gt;        [clojure.lang.Compiler eval Compiler.java 6940]&lt;/span&gt;&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;span&gt;        [clojure.lang.Compiler eval Compiler.java 6940]&lt;/span&gt;&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;span&gt;        [clojure.lang.Compiler load Compiler.java 7403]&lt;/span&gt;&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;span&gt;        [clojure.lang.Compiler loadFile Compiler.java 7341]&lt;/span&gt;&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;span&gt;        [clojure.main$load_script invokeStatic main.clj 276]&lt;/span&gt;&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;span&gt;        [clojure.main$init_opt invokeStatic main.clj 278]&lt;/span&gt;&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;span&gt;        [clojure.main$init_opt invoke main.clj 278]&lt;/span&gt;&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;span&gt;        [clojure.main$initialize invokeStatic main.clj 309]&lt;/span&gt;&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;span&gt;        [clojure.main$null_opt invokeStatic main.clj 343]&lt;/span&gt;&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;span&gt;        [clojure.main$null_opt invoke main.clj 340]&lt;/span&gt;&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;span&gt;        [clojure.main$main invokeStatic main.clj 422]&lt;/span&gt;&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;span&gt;        [clojure.main$main doInvoke main.clj 385]&lt;/span&gt;&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;span&gt;        [clojure.lang.RestFn applyTo RestFn.java 137]&lt;/span&gt;&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;span&gt;        [clojure.lang.Var applyTo Var.java 700]&lt;/span&gt;&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;span&gt;        [clojure.main main main.java 37]]}&lt;/span&gt;&lt;/blockquote&gt;
&lt;/blockquote&gt;
</content>
    <source>
      <title>tAp's blog</title>
      <link rel="self" href="http://visibletrap.blogspot.com/feeds/posts/default"/>
      <link rel="alternate" href="http://visibletrap.blogspot.com/"/>
    </source>
  </entry>
  <entry>
    <id>urn:uuid:6ac203d7-4c87-5df1-b210-2a97107b57c3</id>
    <title>Tar create/extract inside a specific directory</title>
    <updated>2016-08-16T11:50:00.000Z</updated>
    <author>
      <name>Tap</name>
    </author>
    <published>2016-08-16T11:50:00.000Z</published>
    <link rel="alternate" href="http://visibletrap.blogspot.com/2016/08/tar-createextract-inside-specific.html"/>
    <category term="Thai"/>
    <content type="html">Create&lt;br /&gt;
&lt;blockquote&gt;







&lt;div&gt;
&lt;span&gt;tar -cf output.tar -&lt;/span&gt;&lt;span&gt;C&lt;/span&gt;&lt;span&gt; /path/to/directory&lt;/span&gt;&lt;span&gt; .&lt;/span&gt;&lt;/div&gt;
&lt;/blockquote&gt;
The dot at the end is important&lt;br /&gt;
&lt;br /&gt;
Extract&lt;br /&gt;
&lt;blockquote&gt;
tar -xf input.tar -C /path/to/directory&lt;/blockquote&gt;
</content>
    <source>
      <title>tAp's blog</title>
      <link rel="self" href="http://visibletrap.blogspot.com/feeds/posts/default"/>
      <link rel="alternate" href="http://visibletrap.blogspot.com/"/>
    </source>
  </entry>
  <entry>
    <id>urn:uuid:543cdcda-252c-546f-8d5e-bedadfc17a2a</id>
    <title>Why I'm writing in Clojure and Ruby</title>
    <updated>2016-07-10T14:26:00.002Z</updated>
    <author>
      <name>Tap</name>
    </author>
    <published>2016-07-10T14:26:00.002Z</published>
    <link rel="alternate" href="http://visibletrap.blogspot.com/2016/07/why-im-writing-in-clojure-and-ruby.html"/>
    <category term="Thai"/>
    <content type="html">Sandy Metz. Around the 35th minute of &lt;a href="http://bikeshed.fm/70"&gt;http://bikeshed.fm/70&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;blockquote&gt;
I came from Smalltalk, and I segued to Java a little bit, hated every minute of it, and then fell saved by Ruby. And so I have spent the last 20 some years writing code in languages that had enormous faith in my ability to do the right thing. And along with that enormous faith in my ability to do the right thing, they gave me the freedom of everything.&lt;/blockquote&gt;
...&lt;br /&gt;
&lt;br /&gt;
(My summary: She talked to a guy after a conference who asked her how using dynamic language could possibly work, and she answered)&lt;br /&gt;
&lt;br /&gt;
&lt;blockquote&gt;
You just trust people. And he said they are not trustworthy. And I said well, they shouldn't write Ruby, they should write Java. I really prefer languages that allow me to shoot myself in the foot if I do but give me the power to do that.&lt;/blockquote&gt;
-----&lt;br /&gt;
&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;Has enormous faith in my ability to do the right thing&lt;/li&gt;
&lt;li&gt;Give me the freedom of everything&lt;/li&gt;
&lt;li&gt;You just trust people&lt;/li&gt;
&lt;/ul&gt;
&lt;br /&gt;
These are exactly why I'm writing in Clojure and Ruby.</content>
    <source>
      <title>tAp's blog</title>
      <link rel="self" href="http://visibletrap.blogspot.com/feeds/posts/default"/>
      <link rel="alternate" href="http://visibletrap.blogspot.com/"/>
    </source>
  </entry>
</feed>