<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Warun C. ⚡</title>
    <description>The latest articles on DEV Community by Warun C. ⚡ (@ubinix_warun).</description>
    <link>https://dev.to/ubinix_warun</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F481231%2F644d8825-2954-4826-985a-e9a05ea1a043.jpg</url>
      <title>DEV Community: Warun C. ⚡</title>
      <link>https://dev.to/ubinix_warun</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/ubinix_warun"/>
    <language>en</language>
    <item>
      <title>รวมมิตร Docker Sandbox: คู่มือรัน AI Agent ให้ปลอดภัยขั้นสุด ตั้งแต่เริ่มต้นจนเป็นโปร</title>
      <dc:creator>Warun C. ⚡</dc:creator>
      <pubDate>Mon, 06 Apr 2026 05:17:38 +0000</pubDate>
      <link>https://dev.to/ubinix_warun/rwmmitr-docker-sandbox-khuumuueran-ai-agent-aihpldphaykhansud-tangaeterimtncchnepnopr-29cj</link>
      <guid>https://dev.to/ubinix_warun/rwmmitr-docker-sandbox-khuumuueran-ai-agent-aihpldphaykhansud-tangaeterimtncchnepnopr-29cj</guid>
      <description>&lt;p&gt;ยุคนี้ใครๆ ก็ใช้ AI Coding Agent (เช่น Claude Code, Gemini หรือ OpenClaw) มาช่วยเขียนโค้ด ความเก่งของ AI พวกนี้คือมันมี "YOLO Mode" (You Only Look Once) ที่สามารถรันคำสั่ง ติดตั้งแพ็กเกจ หรือทดสอบโค้ดได้ด้วยตัวเอง&lt;/p&gt;

&lt;p&gt;แต่เดี๋ยวก่อน! การปล่อยให้ AI มารันคำสั่งบนเครื่องหลัก (Host Machine) ของเราโดยตรง ถือเป็นความเสี่ยงมหาศาล เพราะถ้า AI เผลอไปลบไฟล์สำคัญ หรือดาวน์โหลดสคริปต์อันตรายมารัน เครื่องเราอาจจะพังได้เลย&lt;/p&gt;

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

&lt;p&gt;&lt;a href="https://medium.com/m/signin?actionUrl=%2F_%2Fapi%2Fsubscriptions%2Fnewsletters%2Fb0e8bfbf2b81&amp;amp;operation=register&amp;amp;redirect=https%3A%2F%2Fmedium.com%2Fubinix-warun&amp;amp;collection=UBINIX+WARUN&amp;amp;collectionId=49c3a90b9f1f&amp;amp;newsletterV3=UBINIX+WARUN&amp;amp;newsletterV3Id=b0e8bfbf2b81" rel="noopener noreferrer"&gt;อ่านฉบับเต็ม...&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  📦 1. Docker Sandbox และ microVM คืออะไร?
&lt;/h2&gt;

&lt;p&gt;Docker Sandbox คือสภาพแวดล้อมแบบแยกส่วน (Isolated Environment) ที่ออกแบบมาเพื่อให้ AI Agent เข้ามาทำงานได้อย่างอิสระ โดยไม่กระทบกับระบบหลักของเครื่องคุณ&lt;/p&gt;

&lt;p&gt;ในเวอร์ชันหลังๆ (ตั้งแต่ Docker Desktop 4.58+) Docker ได้นำเทคโนโลยี microVM เข้ามาใช้ ซึ่งมันคือ "VM ฉบับจิ๋ว" ที่ดึงเอา ความปลอดภัยระดับฮาร์ดแวร์ ของ Virtual Machine ดั้งเดิม มาบวกกับ ความเบาและรวดเร็ว ของ Container&lt;/p&gt;

&lt;p&gt;ที่สำคัญคือ แต่ละ Sandbox จะมี Private Docker Daemon อยู่ข้างในด้วย! หมายความว่า AI สามารถสั่ง docker build หรือ docker run ซ้อนอยู่ข้างในนั้นได้ โดยที่ไม่เห็นคอนเทนเนอร์อื่นๆ บนเครื่องโฮสต์ของคุณเลย&lt;/p&gt;

&lt;p&gt;&lt;a href="https://medium.com/ubinix-warun/%E0%B8%A1%E0%B8%B2%E0%B8%A5%E0%B8%AD%E0%B8%87%E0%B9%86-docker-sandbox-%E0%B8%A3%E0%B8%B1%E0%B8%99-ai-agent-%E0%B9%83%E0%B8%AB%E0%B9%89%E0%B8%9B%E0%B8%A5%E0%B8%AD%E0%B8%94%E0%B8%A0%E0%B8%B1%E0%B8%A2%E0%B8%82%E0%B8%B1%E0%B9%89%E0%B8%99%E0%B8%AA%E0%B8%B8%E0%B8%94%E0%B8%94%E0%B9%89%E0%B8%A7%E0%B8%A2%E0%B9%80%E0%B8%97%E0%B8%84%E0%B9%82%E0%B8%99%E0%B9%82%E0%B8%A5%E0%B8%A2%E0%B8%B5-microvm-c8bbd3b75aca" rel="noopener noreferrer"&gt;มาลองๆ Docker Sandbox: รัน AI Agent ให้ปลอดภัยขั้นสุดด้วยเทคโนโลยี microVM&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  🛡️ 2. เจาะลึก Sandbox Networking: คุมกำเนิด AI ไม่ให้ซน
&lt;/h2&gt;

&lt;p&gt;ปัญหาต่อมาคือ เราจะมั่นใจได้อย่างไรว่า AI จะไม่แอบส่งข้อมูลโค้ดของเราออกไปข้างนอก? นี่คือจุดที่ Docker Sandbox Network Policies เข้ามามีบทบาท&lt;/p&gt;

&lt;p&gt;แตกต่างจาก Network ปกติของ Docker (เช่น Bridge หรือ Host) ที่ทำงานในระดับโครงสร้างเครือข่าย (L3-L4) ระบบ Sandbox Networking ทำงานในระดับแอปพลิเคชัน (L7) โดยใช้ Proxy ควบคุมการเข้าถึงในระดับ Domain Name (เช่น github.com)&lt;/p&gt;

&lt;p&gt;คุณสามารถตั้งค่านโยบายได้ 2 โหมดหลักๆ คือ:&lt;/p&gt;

&lt;p&gt;Allowlist Mode: อนุญาตทั้งหมด บล็อกแค่บางโดเมน (เหมาะสำหรับ Dev Environment ที่ต้องการความยืดหยุ่น)&lt;/p&gt;

&lt;p&gt;Denylist Mode: บล็อกการออกอินเทอร์เน็ตทั้งหมด! แล้วอนุญาต (Allow) แค่โดเมนที่จำเป็น (ปลอดภัยสูงสุด)&lt;/p&gt;

&lt;p&gt;ตัวอย่างการตั้งค่า Denylist Mode:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker sandbox network proxy my-sandbox &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--policy&lt;/span&gt; deny &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--allow-host&lt;/span&gt; api.anthropic.com &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--allow-host&lt;/span&gt; &lt;span class="s2"&gt;"*.npmjs.org"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://medium.com/ubinix-warun/%E0%B9%80%E0%B8%88%E0%B8%B2%E0%B8%B0%E0%B8%A5%E0%B8%B6%E0%B8%81-docker-sandbox-networking-%E0%B8%84%E0%B8%A7%E0%B8%9A%E0%B8%84%E0%B8%B8%E0%B8%A1%E0%B8%84%E0%B8%A7%E0%B8%B2%E0%B8%A1%E0%B8%9B%E0%B8%A5%E0%B8%AD%E0%B8%94%E0%B8%A0%E0%B8%B1%E0%B8%A2%E0%B9%83%E0%B8%AB%E0%B9%89-ai-agents-%E0%B8%AD%E0%B8%A2%E0%B9%88%E0%B8%B2%E0%B8%87%E0%B8%A1%E0%B8%B7%E0%B8%AD%E0%B9%82%E0%B8%9B%E0%B8%A3-057f502c7630" rel="noopener noreferrer"&gt;เจาะลึก Docker Sandbox Networking: ควบคุมความปลอดภัยให้ AI Agents อย่างมือโปร&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  🛠️ 3. Tutorial: รัน AI Agent ในกล่องแบบจับมือทำ
&lt;/h2&gt;

&lt;p&gt;มาลองของจริงกันครับ! เราจะสร้าง Sandbox และใช้ Custom Template เพื่อรัน Open-source AI Agent อย่าง "OpenClaw"&lt;/p&gt;

&lt;p&gt;สิ่งที่ต้องเตรียม:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Docker Desktop รองรับ Sandbox (เวอร์ชัน 4.58+)&lt;/li&gt;
&lt;li&gt;Node.js บนเครื่องโฮสต์&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Step 1: สร้าง Dockerfile สำหรับ Custom Template&lt;br&gt;
แทนที่จะติดตั้งใหม่ทุกครั้ง เราจะมัดรวมทุกอย่างไว้ใน Dockerfile&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight docker"&gt;&lt;code&gt;&lt;span class="c"&gt;# ใช้ Base Image ของ Docker Sandbox&lt;/span&gt;
&lt;span class="k"&gt;FROM&lt;/span&gt;&lt;span class="s"&gt; docker/sandbox-templates:shell&lt;/span&gt;

&lt;span class="k"&gt;ENV&lt;/span&gt;&lt;span class="s"&gt; TZ=Asia/Bangkok&lt;/span&gt;
&lt;span class="k"&gt;USER&lt;/span&gt;&lt;span class="s"&gt; root&lt;/span&gt;

&lt;span class="c"&gt;# ติดตั้งแพ็กเกจที่จำเป็น&lt;/span&gt;
&lt;span class="k"&gt;RUN &lt;/span&gt;apt-get update &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; apt-get &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-y&lt;/span&gt; curl build-essential

&lt;span class="c"&gt;# ติดตั้ง Node.js 22 และ OpenClaw&lt;/span&gt;
&lt;span class="k"&gt;RUN &lt;/span&gt;curl &lt;span class="nt"&gt;-fsSL&lt;/span&gt; https://deb.nodesource.com/setup_22.x | bash - &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="se"&gt;\
&lt;/span&gt;    apt-get &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-y&lt;/span&gt; nodejs
&lt;span class="k"&gt;RUN &lt;/span&gt;npm &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-g&lt;/span&gt; npm@11.11.0
&lt;span class="k"&gt;RUN &lt;/span&gt;npm &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-g&lt;/span&gt; openclaw@latest

&lt;span class="c"&gt;# สลับกลับมาใช้ User 'agent' &lt;/span&gt;
&lt;span class="k"&gt;USER&lt;/span&gt;&lt;span class="s"&gt; agent&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Step 2: Build และรัน Sandbox&lt;br&gt;
เปิด Terminal โฟลเดอร์เดียวกับ Dockerfile แล้วสั่ง Build:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker build &lt;span class="nt"&gt;-t&lt;/span&gt; my-openclaw-template:v1 &lt;span class="nb"&gt;.&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;จากนั้น รัน Sandbox โดยโยงโฟลเดอร์โปรเจกต์ของเรา (~/my-project) เข้าไป:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker sandbox run &lt;span class="nt"&gt;-t&lt;/span&gt; my-openclaw-template:v1 shell ~/my-project
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Step 3: เปิดใช้งาน OpenClaw และเชื่อมต่อ Dashboard&lt;br&gt;
เมื่อ Sandbox รันแล้ว ให้มุดเข้าไปตั้งค่า:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker sandbox &lt;span class="nb"&gt;exec&lt;/span&gt; &lt;span class="nt"&gt;-it&lt;/span&gt; shell-my-claw-dev /bin/bash
openclaw onboard
&lt;span class="nv"&gt;HOST&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;0.0.0.0 openclaw gateway
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;ทริคพิเศษ: เนื่องจาก Sandbox ปิดกั้นเครือข่ายขาเข้า หากคุณต้องการเข้า Dashboard ของ OpenClaw (พอร์ต 18789) จากเบราว์เซอร์เครื่องหลัก คุณจะต้องใช้สคริปต์ Node.js (socat proxy) เข้ามาช่วยเป็นสะพานเชื่อมพอร์ต (Tunnel) จากเครื่อง Host ทะลุเข้า Sandbox ครับ&lt;/p&gt;

&lt;p&gt;&lt;a href="https://medium.com/super-ai-agents/%E0%B8%88%E0%B8%B1%E0%B8%9A-ai-%E0%B8%A5%E0%B8%87%E0%B8%81%E0%B8%A5%E0%B9%88%E0%B8%AD%E0%B8%87-%E0%B8%A7%E0%B8%B4%E0%B8%98%E0%B8%B5%E0%B8%A3%E0%B8%B1%E0%B8%99-openclaw-%E0%B8%9A%E0%B8%99-docker-sandbox-%E0%B8%94%E0%B9%89%E0%B8%A7%E0%B8%A2-custom-template-%E0%B8%89%E0%B8%9A%E0%B8%B1%E0%B8%9A%E0%B8%88%E0%B8%B1%E0%B8%9A%E0%B8%A1%E0%B8%B7%E0%B8%AD%E0%B8%97%E0%B8%B3-f88f4b541747" rel="noopener noreferrer"&gt;จับ AI ลงกล่อง! วิธีรัน OpenClaw บน Docker Sandbox ด้วย Custom Template (ฉบับจับมือทำ)&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  🎯 สรุป
&lt;/h2&gt;

&lt;p&gt;การทำงานร่วมกับ AI Agent มอบประสบการณ์ที่ล้ำหน้าเหมือนมีผู้ช่วยส่วนตัว แต่ความปลอดภัยคือสิ่งที่เราละเลยไม่ได้&lt;/p&gt;

&lt;p&gt;Docker Sandbox (microVM) ผสานเข้ากับ Network Policies และความยืดหยุ่นของ Custom Templates ถือเป็น Best Practice ในยุคนี้ ที่ช่วยให้คุณปล่อย AI ทำงานใน "YOLO Mode" ได้อย่างสบายใจ ใครที่กำลังสนุกกับการให้ AI ช่วยเขียนโปรแกรม อย่าลืมอัปเดต Docker Desktop และลองใช้ฟีเจอร์นี้ดูนะครับ!&lt;/p&gt;




&lt;p&gt;ถูกใจกด  เป็นกำลังใจให้ทำคอนเทนต์ดีๆ &amp;amp; ติดตามเรื่องที่น่าสนใจผ่านทาง &lt;br&gt;
&lt;a href="https://bio.link/ubinix_warun" rel="noopener noreferrer"&gt;Warun Chareonsuk&lt;/a&gt; &amp;amp; Super AI Agent -- &lt;a href="https://x.com/ubinix_warun" rel="noopener noreferrer"&gt;@ubinix-warun&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;ตามลิงค์เข้าไปเลี้ยงกาแฟผมได้ที่ &lt;a href="https://buymeacoffee.com/ubinix5warun" rel="noopener noreferrer"&gt;☕ Buy Me A Coffee&lt;/a&gt;&lt;/p&gt;

</description>
      <category>docker</category>
      <category>sandbox</category>
      <category>ai</category>
      <category>agents</category>
    </item>
    <item>
      <title>Pinto Portfolio - Building at the Speed of Thought: Where Logic Meets Generative Art.</title>
      <dc:creator>Warun C. ⚡</dc:creator>
      <pubDate>Mon, 02 Feb 2026 08:00:16 +0000</pubDate>
      <link>https://dev.to/ubinix_warun/pinto-portfolio-building-at-the-speed-of-thought-where-logic-meets-generative-art-1jfi</link>
      <guid>https://dev.to/ubinix_warun/pinto-portfolio-building-at-the-speed-of-thought-where-logic-meets-generative-art-1jfi</guid>
      <description>&lt;p&gt;&lt;em&gt;This is a submission for the &lt;a href="https://dev.to/challenges/new-year-new-you-google-ai-2025-12-31"&gt;New Year, New You Portfolio Challenge Presented by Google AI&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  About Me
&lt;/h2&gt;

&lt;p&gt;I am a Hackathon addict and Full-Stack Architect driven by the philosophy of Sovereign Identity and Privacy by Default. My work bridges the gap between complex blockchain protocols and usable user interfaces, spanning from mobile applications to hardware-enforced security layers.&lt;/p&gt;

&lt;h2&gt;
  
  
  Portfolio
&lt;/h2&gt;

&lt;p&gt;

&lt;/p&gt;
&lt;div class="ltag__cloud-run"&gt;
  &lt;iframe height="600px" src="https://pinpin-jtguw4i5fq-as.a.run.app/"&gt;
  &lt;/iframe&gt;
&lt;/div&gt;




&lt;p&gt;Pinto is a modern, drag-and-drop profile builder for developers and creatives. &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Pinto allows users to design modular "Pinto ปิ่นโต (Bento-style)" landing pages with a rich set of interactive widgets (Bio, Skills, Projects, Socials). &lt;/li&gt;
&lt;li&gt;Built entirely in React, it features a dual-mode interface: Studio for live editing and Static for lightweight deployment via JSON export.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  🚀 Powered by Antigravity Integration
&lt;/h2&gt;

&lt;p&gt;We utilize Google’s AI-first IDE not just for code completion, but as an end-to-end engineering partner that unifies frontend design, backend logic, and DevOps automation.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Responsive UI Generation: Use the AI-first IDE to auto-generate the responsive Tailwind CSS grid. It ensures the "Pinto" boxes reflow perfectly from desktop to mobile.&lt;/li&gt;
&lt;li&gt;Full-Stack Architecture: Crafting the Backend API to securely handle user Authentication and manage the state/storage of the dynamic Bento layout.&lt;/li&gt;
&lt;li&gt;Automated Deployment Pipelines: Develop Dockerfile configurations and Bash scripts to build/publish the Docker image and seamlessly deploy the portfolio on Google Cloud Run.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Changelog &amp;amp; Feature Summary
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Layout &amp;amp; Design&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Dual Layout Engine:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Grid (Pinto): The classic, responsive grid layout.&lt;/li&gt;
&lt;li&gt;Stack (Listing): A vertical, mobile-optimized list view.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Template Presets: One-click reordering for specific personas:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Classic&lt;/li&gt;
&lt;li&gt;Portfolio (Work-focused)&lt;/li&gt;
&lt;li&gt;Social (Networking-focused)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Drag &amp;amp; Drop: Native HTML5 drag-and-drop support for manual reordering in Grid mode.&lt;/p&gt;

&lt;p&gt;Theming: Full Dark Mode support with persistent state.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Core Enhancements&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Authentication Flow: Sign-in to unlock Studio features.&lt;/p&gt;

&lt;p&gt;Widget Library: Support for 7 distinct widget types:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Bio: Profile image, name, title, and description.&lt;/li&gt;
&lt;li&gt;Featured Project: Large hero image with overlay text.&lt;/li&gt;
&lt;li&gt;Skills: Tag-based list of technical expertise.&lt;/li&gt;
&lt;li&gt;Milestones: List of achievements.&lt;/li&gt;
&lt;li&gt;Vibe: Personality indicators (Current Focus, Hobby, Music).&lt;/li&gt;
&lt;li&gt;Socials: Links to external platforms (Twitter, GitHub, Instagram, LinkedIn).&lt;/li&gt;
&lt;li&gt;Location: Simple location display.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Technical&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;React Architecture: Component-based architecture using Tailwind CSS for styling.&lt;/li&gt;
&lt;li&gt;Lucide Icons: Extensive use of lucide-react for consistent iconography.&lt;/li&gt;
&lt;li&gt;Responsive: Fully adaptive design for Mobile, Tablet, and Desktop viewports.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Thanks for participating!
&lt;/h2&gt;

&lt;p&gt;Thank you for exploring the Pinto Studio beta. Your feedback helps shape the future of personal portfolios. Stay tuned for more updates!&lt;/p&gt;

</description>
      <category>devchallenge</category>
      <category>googleaichallenge</category>
      <category>portfolio</category>
      <category>gemini</category>
    </item>
    <item>
      <title>รัน Typhoon 2.5 บน Colab ฟรี: จาก 30B (ไม่ไหว) สู่ 4B "Sweet Spot"</title>
      <dc:creator>Warun C. ⚡</dc:creator>
      <pubDate>Tue, 02 Dec 2025 12:12:47 +0000</pubDate>
      <link>https://dev.to/ubinix_warun/ran-typhoon-25-bn-colab-frii-cchaak-30b-aimaihw-suu-4b-sweet-spot-2jdp</link>
      <guid>https://dev.to/ubinix_warun/ran-typhoon-25-bn-colab-frii-cchaak-30b-aimaihw-suu-4b-sweet-spot-2jdp</guid>
      <description>&lt;p&gt;สวัสดีครับ! นี่คือบทความสรุปการเดินทางของเราในการพยายามรันโมเดล Typhoon 2.5 (ทั้ง 30B และ 4B) บน Google Colab Free Tier ครับ เราได้ลองผิดลองถูกมาหลายวิธี และนี่คือบทเรียนทั้งหมดที่เราพบ ตั้งแต่ความล้มเหลวไปจนถึง Config ที่ดีที่สุดครับ&lt;/p&gt;

&lt;p&gt;&lt;a href="https://medium.com/m/signin?actionUrl=%2F_%2Fapi%2Fsubscriptions%2Fnewsletters%2Fb0e8bfbf2b81&amp;amp;operation=register&amp;amp;redirect=https%3A%2F%2Fmedium.com%2Fubinix-warun&amp;amp;collection=UBINIX+WARUN&amp;amp;collectionId=49c3a90b9f1f&amp;amp;newsletterV3=UBINIX+WARUN&amp;amp;newsletterV3Id=b0e8bfbf2b81" rel="noopener noreferrer"&gt;อ่านฉบับเต็ม...&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  บทเรียนที่ 1: Typhoon 30B "ใหญ่เกินไป" สำหรับ Colab ฟรี
&lt;/h2&gt;

&lt;p&gt;ความฝันของเราคือการรันโมเดลเรือธง 30B แต่ความจริงก็คือ:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Ollama (บน T4 GPU): รอดแบบเฉียดฉิว! ใช้ VRAM 14.3 GB จาก 15 GB ที่มีให้ นี่คือการรัน "จนเต็มขีดจำกัด" ของ T4&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Transformers (เขียนโค้ด Python): ล่มโดยสิ้นเชิง!&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;บน T4 (GPU): เจอปัญหา "Disk is almost full" (Disk 112GB ไม่พอโหลดโมเดล 60-70GB)&lt;/li&gt;
&lt;li&gt;บน TPU (v5e-1): แก้ปัญหา Disk ได้ แต่เจอ "Time Out" (แค่โหลดโมเดลก็ 40 นาที จนค้าง)&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://medium.com/super-ai-agents/%E0%B9%80%E0%B8%88%E0%B8%B2%E0%B8%B0%E0%B8%A5%E0%B8%B6%E0%B8%81-typhoon-2-5-part-1-%E0%B8%97%E0%B8%94%E0%B8%A5%E0%B8%AD%E0%B8%87%E0%B8%A3%E0%B8%B1%E0%B8%99-30b-%E0%B8%9A%E0%B8%99-colab-%E0%B8%9F%E0%B8%A3%E0%B8%B5-%E0%B8%A8%E0%B8%B6%E0%B8%81%E0%B8%9B%E0%B8%B0%E0%B8%97%E0%B8%B0-runtime-ollama-02402ff24871" rel="noopener noreferrer"&gt;สรุป Part 1: ถ้าอยากลอง 30B บน Colab ฟรี, Ollama คือทางเดียว (แต่ก็เสี่ยงมาก) ส่วน transformers นั้น "เป็นไปไม่ได้"&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  บทเรียนที่ 2: Typhoon 4B "คุณภาพ" คือคำตอบ เมื่อ 30B ไม่รอด เราจึงหันมาที่ "น้องเล็ก" 4B แต่คำถามคือ "จำเป็นต้องใช้ GPU T4 ไหม?"
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Ollama (บน CPU Runtime): รันได้! ใช้ System RAM ~3.5GB และ CPU 100%&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;...แต่ (จุดเปลี่ยน): เมื่อทดสอบ เราพบว่า "คุณภาพคำตอบ (Quality) ดร็อปอย่างชัดเจน" คำตอบมักจะสั้น, เหตุผลเพี้ยน, หรือไม่ดีเท่าที่ควร&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;a href="https://medium.com/super-ai-agents/%E0%B9%80%E0%B8%88%E0%B8%B2%E0%B8%B0%E0%B8%A5%E0%B8%B6%E0%B8%81-typhoon-2-5-part-2-%E0%B8%81%E0%B8%A5%E0%B8%B1%E0%B8%9A%E0%B8%AA%E0%B8%B9%E0%B9%88%E0%B8%9E%E0%B8%B7%E0%B9%89%E0%B8%99%E0%B8%90%E0%B8%B2%E0%B8%99-%E0%B8%A3%E0%B8%B1%E0%B8%99-4b-%E0%B8%94%E0%B9%89%E0%B8%A7%E0%B8%A2-4-bit-quantization-a6e0bb262cce" rel="noopener noreferrer"&gt;สรุป Part 2: การรันบน CPU ทำได้แค่ "ให้ติด" แต่ถ้าคุณต้องการ "คุณภาพ" ที่แท้จริง... คุณต้องใช้ T4 GPU และนี่คือวิธีที่เราทำ&lt;br&gt;
&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  3. "พระเอก" ของงาน: 4-bit Quantization (โค้ด Transformers)
&lt;/h2&gt;

&lt;p&gt;นี่คือวิธีรัน 4B บน T4 GPU เพื่อให้ได้ "คุณภาพสูงสุด" โดยใช้ VRAM น้อยที่สุดครับ&lt;/p&gt;

&lt;p&gt;Quantization คืออะไร? คือการ "บีบอัด" โมเดล (เหมือนบีบไฟล์ RAW เป็น .JPG) เราใช้ 4-bit Quantization เพื่อลดขนาดโมเดลใน VRAM ลง 4 เท่า! (จาก 16-bit)&lt;/p&gt;

&lt;p&gt;นี่คือโค้ดหลักที่เราใช้:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;torch&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;transformers&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;AutoTokenizer&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;AutoModelForCausalLM&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;BitsAndBytesConfig&lt;/span&gt;

&lt;span class="c1"&gt;# 1. เลือกโมเดล 4B
&lt;/span&gt;&lt;span class="n"&gt;model_id&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;scb10x/typhoon2.5-qwen3-4b&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;

&lt;span class="c1"&gt;# 2. นี่คือหัวใจสำคัญ! (เราจะเทียบ NF4 vs FP4)
&lt;/span&gt;&lt;span class="n"&gt;quantization_config&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;BitsAndBytesConfig&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;load_in_4bit&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;bnb_4bit_quant_type&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;nf4&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="c1"&gt;# หรือ "fp4"
&lt;/span&gt;    &lt;span class="n"&gt;bnb_4bit_compute_dtype&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;torch&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;bfloat16&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# 3. โหลดโมเดล
&lt;/span&gt;&lt;span class="n"&gt;tokenizer&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;AutoTokenizer&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;from_pretrained&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;model_id&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;model&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;AutoModelForCausalLM&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;from_pretrained&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;model_id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;quantization_config&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;quantization_config&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;torch_dtype&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;torch&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;bfloat16&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;device_map&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;auto&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;วิธีนี้ ทำให้เราใช้ VRAM ไปเพียง ~4.0 GB (จากการทดลองใน Part 2) และได้คุณภาพคำตอบที่ดีเยี่ยม!&lt;/p&gt;

&lt;h2&gt;
  
  
  4. บทเรียนที่ 3: Benchmark 8-bit vs 4-bit... ใครชนะ?
&lt;/h2&gt;

&lt;p&gt;เรารู้ว่า 4-bit ดี แต่แบบไหนดีที่สุด? เราจึงทดสอบ 3 Configs บน T4 GPU (จากผลทดลองจริง):&lt;/p&gt;

&lt;h2&gt;
  
  
  🏆 บทสรุป (The Final Verdict): Config ที่ดีที่สุด
&lt;/h2&gt;

&lt;p&gt;4-bit Quantization ชนะ 8-bit ขาดลอย!&lt;/p&gt;

&lt;p&gt;&lt;a href="https://medium.com/super-ai-agents/%E0%B9%80%E0%B8%88%E0%B8%B2%E0%B8%B0%E0%B8%A5%E0%B8%B6%E0%B8%81-typhoon-2-5-part-3-benchmark-%E0%B9%80%E0%B8%97%E0%B8%B5%E0%B8%A2%E0%B8%9A-8-bit-vs-4-bit-nf4-vs-fp4-f33e3f61417d" rel="noopener noreferrer"&gt;สรุป Part 3: “Benchmark” เทียบ 8-bit vs 4-bit (NF4 vs FP4)&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;เร็วกว่า 2.5 เท่า! (12 Tok/s vs 4.6 Tok/s)&lt;/li&gt;
&lt;li&gt;ประหยัด VRAM กว่า 35% (2.71 GB vs 4.19 GB)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;ศึกชิงที่ 1: NF4 vs FP4&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;VRAM: ใช้เท่ากัน (2.71 GB)&lt;/li&gt;
&lt;li&gt;Speed: FP4 เร็วกว่า NF4 เล็กน้อย (ประมาณ 3-4%)&lt;/li&gt;
&lt;li&gt;Quality: NF4 (Normal Float) ถูกออกแบบมาเพื่อ "รักษาคุณภาพ" ได้ดีกว่า FP4 (Float Point) ที่เน้น "ความเร็ว"&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;คำแนะนำสุดท้าย: สำหรับ Google Colab T4:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;4-bit NF4 (bnb_4bit_quant_type="nf4") คือ "จุดสมดุล" (The Sweet Spot) ที่ดีที่สุด&lt;/p&gt;

&lt;p&gt;คุณจะได้โมเดลที่ ประหยัด VRAM ที่สุด (2.71 GB), เร็วมาก (11.68 Tok/s), และ รักษาคุณภาพคำตอบ ไว้ได้ใกล้เคียงต้นฉบับที่สุดครับ!&lt;/p&gt;
&lt;/blockquote&gt;




&lt;p&gt;ถูกใจกด  เป็นกำลังใจให้ทำคอนเทนต์ดีๆ &amp;amp; ติดตามเรื่องที่น่าสนใจผ่านทาง &lt;br&gt;
&lt;a href="https://bio.link/ubinix_warun" rel="noopener noreferrer"&gt;Warun Chareonsuk&lt;/a&gt; &amp;amp; Super AI Agent -- &lt;a href="https://x.com/ubinix_warun" rel="noopener noreferrer"&gt;@ubinix-warun&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;ตามลิงค์เข้าไปเลี้ยงกาแฟผมได้ที่ &lt;a href="https://buymeacoffee.com/ubinix5warun" rel="noopener noreferrer"&gt;☕ Buy Me A Coffee&lt;/a&gt;&lt;/p&gt;

</description>
      <category>llm</category>
      <category>cloud</category>
      <category>performance</category>
      <category>tooling</category>
    </item>
    <item>
      <title>ปลดล็อกพลัง ElizaOS: สร้างปลั๊กอิน AI แปลงข้อความเป็นวิดีโอ (ฉบับรวบรัด)</title>
      <dc:creator>Warun C. ⚡</dc:creator>
      <pubDate>Tue, 07 Oct 2025 08:47:12 +0000</pubDate>
      <link>https://dev.to/ubinix_warun/pldlkphlang-elizaos-sraangplakin-ai-aeplngkhkhwaamepnwidiio-chbabrwbrad-47oo</link>
      <guid>https://dev.to/ubinix_warun/pldlkphlang-elizaos-sraangplakin-ai-aeplngkhkhwaamepnwidiio-chbabrwbrad-47oo</guid>
      <description>&lt;p&gt;อยากเพิ่มความสามารถสุดล้ำให้ AI Agent ของคุณไหม? ElizaOS คือ AI Framework ที่ออกแบบมาให้ทุกอย่างเป็น "ปลั๊กอิน" ทำให้การเพิ่มทักษะใหม่ๆ ให้ AI เป็นเรื่องง่ายและสนุกเหมือนการต่อเลโก้&lt;/p&gt;

&lt;p&gt;บทความนี้จะสรุปขั้นตอนการสร้างปลั๊กอินแปลงข้อความเป็นวิดีโอ (Text-to-Video) ด้วย Fal AI ให้เห็นภาพรวมทั้งหมดในเวลาอันสั้น&lt;/p&gt;

&lt;p&gt;&lt;a href="https://medium.com/m/signin?actionUrl=%2F_%2Fapi%2Fsubscriptions%2Fnewsletters%2Fb0e8bfbf2b81&amp;amp;operation=register&amp;amp;redirect=https%3A%2F%2Fmedium.com%2Fubinix-warun&amp;amp;collection=UBINIX+WARUN&amp;amp;collectionId=49c3a90b9f1f&amp;amp;newsletterV3=UBINIX+WARUN&amp;amp;newsletterV3Id=b0e8bfbf2b81" rel="noopener noreferrer"&gt;อ่านฉบับเต็ม...&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  1. วางโครงสร้างด้วย CLI
&lt;/h1&gt;

&lt;p&gt;เราเริ่มต้นโปรเจกต์อย่างรวดเร็วด้วยคำสั่งเดียว: &lt;code&gt;elizaos create&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;...⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
Version: 1.5.7

◆  What would you like to create?
│  ○ Project - Full ElizaOS application 
       (Complete project with runtime, agents, and all features)
│  ● Plugin - Custom ElizaOS plugin
│  ○ Agent - Character definition file
│  ○ TEE Project - Trusted Execution Environment project
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;คำสั่งนี้จะสร้างโครงสร้างโปรเจกต์และปลั๊กอินที่พร้อมใช้งานทันที โดยที่เราไม่ต้องตั้งค่าอะไรที่ซับซ้อนเลย&lt;/p&gt;
&lt;h1&gt;
  
  
  2. หัวใจของปลั๊กอินในไฟล์ &lt;a href="https://github.com/ubinix-warun/plugin-fal-ai/blob/main/src/plugin.ts" rel="noopener noreferrer"&gt;plugin.ts&lt;/a&gt;
&lt;/h1&gt;

&lt;p&gt;Logic ทั้งหมดของปลั๊กอินจะรวมอยู่ที่ไฟล์ &lt;code&gt;src/plugin.ts&lt;/code&gt; ซึ่งประกอบด้วย 3 ส่วนหลัก:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Action (generateVideoAction): เปรียบเสมือน "ทักษะ" ที่เราจะสอนให้ Agent ทำ ประกอบด้วย:
&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;- name: ID ของทักษะ
- similes: คำสั่งที่ผู้ใช้สามารถพูดเพื่อเรียกใช้ทักษะนี้
- validate: ด่านตรวจสอบความพร้อม (เช่น เช็คว่ามี API Key หรือยัง)
- handler: ส่วนทำงานหลัก ที่จะเรียก API ของ Fal AI เพื่อสร้างวิดีโอ
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;ol&gt;
&lt;li&gt;Service (FalAIService): โปรแกรมที่ทำงานอยู่เบื้องหลัง เหมาะสำหรับจัดการ Task ที่ซับซ้อน&lt;/li&gt;
&lt;li&gt;Plugin Manifest (falAIPlugin): คือ "สารบัญ" ที่รวบรวมทุกความสามารถของปลั๊กอินไว้ในที่เดียว เพื่อลงทะเบียนกับระบบ ElizaOS
&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;// src/plugin.ts (สรุปโครงสร้าง)

import { Plugin, Service, Action, ... } from '@elizaos/core';

// 1. Action: ทักษะแปลงข้อความเป็นวิดีโอ
const generateVideoAction: Action = { /* ... validate, handler, examples ... */ };

// 2. Service: โปรแกรมทำงานเบื้องหลัง
export class FalAIService extends Service { /* ... start, stop ... */ }

// 3. Plugin Manifest: ประกอบร่างทุกอย่าง
export const falAIPlugin: Plugin = {
  name: 'plugin-fal-ai',
  services: [FalAIService],
  actions: [generateVideoAction],
};
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h1&gt;
  
  
  3. ตั้งค่าและทดสอบ
&lt;/h1&gt;

&lt;p&gt;ขั้นตอนสุดท้ายก่อนใช้งานคือการเพิ่ม FAL_KEY ที่ได้จากเว็บไซต์ fal.ai เข้าไปในไฟล์ .env ของโปรเจกต์&lt;/p&gt;

&lt;p&gt;จากนั้นก็สั่ง Build และรันโปรเจกต์ด้วยคำสั่งง่ายๆ:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# Build ปลั๊กอิน
bun run build

# Start โปรเจกต์
elizaos start
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;เพียงเท่านี้ Agent ของคุณก็พร้อมรับคำสั่ง "Create video: a cat playing a piano" และสร้างวิดีโอสุดเจ๋งกลับมาให้คุณแล้ว!&lt;/p&gt;
&lt;h1&gt;
  
  
  บทสรุป
&lt;/h1&gt;

&lt;p&gt;ElizaOS ทำให้การสร้างและต่อยอดความสามารถของ AI เป็นเรื่องง่ายและเป็นระบบอย่างไม่น่าเชื่อ จากขั้นตอนทั้งหมด จะเห็นว่าเราโฟกัสแค่การเขียน Logic ของ "ทักษะ" ที่เราต้องการเท่านั้น&lt;/p&gt;



&lt;p&gt;ถูกใจกด  เป็นกำลังใจให้ทำคอนเทนต์ดีๆ &amp;amp; ติดตามเรื่องที่น่าสนใจผ่านทาง &lt;br&gt;
&lt;a href="https://bio.link/ubinix_warun" rel="noopener noreferrer"&gt;Warun Chareonsuk&lt;/a&gt; &amp;amp; Super AI Agent -- &lt;a href="https://x.com/ubinix_warun" rel="noopener noreferrer"&gt;@ubinix-warun&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;ตามลิงค์เข้าไปเลี้ยงกาแฟผมได้ที่ &lt;a href="https://buymeacoffee.com/ubinix5warun" rel="noopener noreferrer"&gt;☕ Buy Me A Coffee&lt;/a&gt;&lt;/p&gt;


&lt;div class="ltag__link"&gt;
  &lt;a href="https://medium.com/super-ai-agents/%E0%B8%9B%E0%B8%A5%E0%B8%94%E0%B8%A5%E0%B9%87%E0%B8%AD%E0%B8%81%E0%B8%9E%E0%B8%A5%E0%B8%B1%E0%B8%87%E0%B8%82%E0%B8%AD%E0%B8%87-elizaos-%E0%B8%A1%E0%B8%B2%E0%B8%AA%E0%B8%A3%E0%B9%89%E0%B8%B2%E0%B8%87-plugin-%E0%B9%81%E0%B8%A3%E0%B8%81%E0%B8%81%E0%B8%B1%E0%B8%99%E0%B9%80%E0%B8%96%E0%B8%AD%E0%B8%B0-fal-ai-9fa92ed92180" class="ltag__link__link" rel="noopener noreferrer"&gt;
    &lt;div class="ltag__link__pic"&gt;
      &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fmiro.medium.com%2Fv2%2Fresize%3Afill%3A64%3A64%2F1%2AB8wDhSisQxofd4P96sEdNw.jpeg" alt="Warun C. ⚡"&gt;
    &lt;/div&gt;
  &lt;/a&gt;
  &lt;a href="https://medium.com/super-ai-agents/%E0%B8%9B%E0%B8%A5%E0%B8%94%E0%B8%A5%E0%B9%87%E0%B8%AD%E0%B8%81%E0%B8%9E%E0%B8%A5%E0%B8%B1%E0%B8%87%E0%B8%82%E0%B8%AD%E0%B8%87-elizaos-%E0%B8%A1%E0%B8%B2%E0%B8%AA%E0%B8%A3%E0%B9%89%E0%B8%B2%E0%B8%87-plugin-%E0%B9%81%E0%B8%A3%E0%B8%81%E0%B8%81%E0%B8%B1%E0%B8%99%E0%B9%80%E0%B8%96%E0%B8%AD%E0%B8%B0-fal-ai-9fa92ed92180" class="ltag__link__link" rel="noopener noreferrer"&gt;
    &lt;div class="ltag__link__content"&gt;
      &lt;h2&gt;ElizaOS Tutorial: วิธีสร้างปลั๊กอิน AI (Fal AI) แบบ Step-by-Step | Super AI Agents&lt;/h2&gt;
      &lt;h3&gt;Warun C. ⚡ ・ &lt;time&gt;Sep 25, 2025&lt;/time&gt; ・ 
      &lt;div class="ltag__link__servicename"&gt;
        &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fassets.dev.to%2Fassets%2Fmedium-f709f79cf29704f9f4c2a83f950b2964e95007a3e311b77f686915c71574fef2.svg" alt="Medium Logo"&gt;
        Medium
      &lt;/div&gt;
    &lt;/h3&gt;
&lt;/div&gt;
  &lt;/a&gt;
&lt;/div&gt;



</description>
      <category>elizaos</category>
      <category>falai</category>
      <category>generativeai</category>
      <category>text2video</category>
    </item>
    <item>
      <title>ใช้ Typhoon-OCR ดึงข้อความจาก PDF/รูปภาพด้วย Python</title>
      <dc:creator>Warun C. ⚡</dc:creator>
      <pubDate>Wed, 06 Aug 2025 12:25:40 +0000</pubDate>
      <link>https://dev.to/ubinix_warun/aich-typhoon-ocr-duengkhkhwaamcchaak-pdfruupphaaphdwy-python-1g</link>
      <guid>https://dev.to/ubinix_warun/aich-typhoon-ocr-duengkhkhwaamcchaak-pdfruupphaaphdwy-python-1g</guid>
      <description>&lt;p&gt;&lt;strong&gt;Typhoon-OCR&lt;/strong&gt; จาก SCB 10X คือ LLM ที่ช่วยสกัดข้อความภาษาไทยจากไฟล์ PDF และรูปภาพได้อย่างแม่นยำ นี่คือวิธีใช้งานฉบับรวบรัดผ่าน Python และ Ollama&lt;/p&gt;

&lt;p&gt;&lt;a href="https://medium.com/m/signin?actionUrl=%2F_%2Fapi%2Fsubscriptions%2Fnewsletters%2Fb0e8bfbf2b81&amp;amp;operation=register&amp;amp;redirect=https%3A%2F%2Fmedium.com%2Fubinix-warun&amp;amp;collection=UBINIX+WARUN&amp;amp;collectionId=49c3a90b9f1f&amp;amp;newsletterV3=UBINIX+WARUN&amp;amp;newsletterV3Id=b0e8bfbf2b81" rel="noopener noreferrer"&gt;อ่านฉบับเต็ม...&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  ขั้นตอนที่ 1: ติดตั้งและรันโมเดล
&lt;/h2&gt;

&lt;p&gt;เปิด Terminal แล้วรัน 2 คำสั่งนี้:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. ติดตั้งไลบรารีที่จำเป็น:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;pip &lt;span class="nb"&gt;install &lt;/span&gt;typhoon-ocr openai
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;&lt;strong&gt;2. ดาวน์โหลดและรันโมเดลผ่าน Ollama: (ต้องติดตั้ง Ollama ก่อน)&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;ollama run scb10x/typhoon-ocr-3b:latest
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;คำสั่งนี้จะเปิด API Server ที่ &lt;a href="http://localhost:11434" rel="noopener noreferrer"&gt;http://localhost:11434&lt;/a&gt; ให้โดยอัตโนมัติ&lt;/p&gt;
&lt;h2&gt;
  
  
  ขั้นตอนที่ 2: เขียนโค้ด Python
&lt;/h2&gt;

&lt;p&gt;สร้างไฟล์ Python แล้วนำโค้ดด้านล่างไปวางได้เลย&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;typhoon_ocr&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;prepare_ocr_messages&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;openai&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;OpenAI&lt;/span&gt;

&lt;span class="c1"&gt;# เตรียมข้อมูลจากไฟล์ PDF/Image
&lt;/span&gt;&lt;span class="n"&gt;messages&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;prepare_ocr_messages&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;pdf_or_image_path&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;YOUR_FILE.pdf&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;  &lt;span class="c1"&gt;# &amp;lt;-- แก้เป็นชื่อไฟล์ของคุณ
&lt;/span&gt;    &lt;span class="n"&gt;task_type&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;default&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;                 &lt;span class="c1"&gt;# "default" = ดึงข้อความ, "structure" = รักษาตาราง
&lt;/span&gt;    &lt;span class="n"&gt;page_num&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;              &lt;span class="c1"&gt;# Process page 1 of a PDF (default is 1, always 1 for images)
&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# เชื่อมต่อกับโมเดลที่รันบน Ollama
&lt;/span&gt;&lt;span class="n"&gt;client&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;OpenAI&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;base_url&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;http://localhost:11434/v1&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; 
    &lt;span class="n"&gt;api_key&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;not-needed&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# ส่งคำขอให้โมเดลทำงาน
&lt;/span&gt;&lt;span class="n"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;chat&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;completions&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;create&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;scb10x/typhoon-ocr-3b:latest&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;messages&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;messages&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
     &lt;span class="n"&gt;max_tokens&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;16000&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;extra_body&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;repetition_penalty&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mf"&gt;1.2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;temperature&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mf"&gt;0.1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;top_p&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mf"&gt;0.6&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# พิมพ์ผลลัพธ์
&lt;/span&gt;&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;choices&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="n"&gt;message&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;content&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h2&gt;
  
  
  ขั้นตอนที่ 3: รันและดูผลลัพธ์
&lt;/h2&gt;

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

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F0oyuypkrtiptzh3h7kku.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F0oyuypkrtiptzh3h7kku.png" alt=" " width="800" height="531"&gt;&lt;/a&gt;&lt;/p&gt;



&lt;p&gt;ถูกใจกด  เป็นกำลังใจให้ทำคอนเทนต์ดีๆ &amp;amp; ติดตามเรื่องที่น่าสนใจผ่านทาง &lt;br&gt;
&lt;a href="https://bio.link/ubinix_warun" rel="noopener noreferrer"&gt;Warun Chareonsuk&lt;/a&gt; &amp;amp; Super AI Agent -- &lt;a href="https://x.com/ubinix_warun" rel="noopener noreferrer"&gt;@ubinix-warun&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;ตามลิงค์เข้าไปเลี้ยงกาแฟผมได้ที่ &lt;a href="https://buymeacoffee.com/ubinix5warun" rel="noopener noreferrer"&gt;☕ Buy Me A Coffee&lt;/a&gt;&lt;/p&gt;


&lt;div class="ltag__link"&gt;
  &lt;a href="https://medium.com/super-ai-agents/%E0%B8%AA%E0%B8%81%E0%B8%B1%E0%B8%94%E0%B8%82%E0%B9%89%E0%B8%AD%E0%B8%84%E0%B8%A7%E0%B8%B2%E0%B8%A1%E0%B8%88%E0%B8%B2%E0%B8%81-pdf-%E0%B8%A3%E0%B8%B9%E0%B8%9B%E0%B8%A0%E0%B8%B2%E0%B8%9E-%E0%B8%94%E0%B9%89%E0%B8%A7%E0%B8%A2-typhoon-ocr-llm-model-%E0%B8%9C%E0%B9%88%E0%B8%B2%E0%B8%99-python-%E0%B9%81%E0%B8%9A%E0%B8%9A%E0%B8%87%E0%B9%88%E0%B8%B2%E0%B8%A2%E0%B9%86-b46d29fa567f" class="ltag__link__link" rel="noopener noreferrer"&gt;
    &lt;div class="ltag__link__pic"&gt;
      &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fmiro.medium.com%2Fv2%2Fresize%3Afill%3A64%3A64%2F1%2AB8wDhSisQxofd4P96sEdNw.jpeg" alt="Warun C. ⚡"&gt;
    &lt;/div&gt;
  &lt;/a&gt;
  &lt;a href="https://medium.com/super-ai-agents/%E0%B8%AA%E0%B8%81%E0%B8%B1%E0%B8%94%E0%B8%82%E0%B9%89%E0%B8%AD%E0%B8%84%E0%B8%A7%E0%B8%B2%E0%B8%A1%E0%B8%88%E0%B8%B2%E0%B8%81-pdf-%E0%B8%A3%E0%B8%B9%E0%B8%9B%E0%B8%A0%E0%B8%B2%E0%B8%9E-%E0%B8%94%E0%B9%89%E0%B8%A7%E0%B8%A2-typhoon-ocr-llm-model-%E0%B8%9C%E0%B9%88%E0%B8%B2%E0%B8%99-python-%E0%B9%81%E0%B8%9A%E0%B8%9A%E0%B8%87%E0%B9%88%E0%B8%B2%E0%B8%A2%E0%B9%86-b46d29fa567f" class="ltag__link__link" rel="noopener noreferrer"&gt;
    &lt;div class="ltag__link__content"&gt;
      &lt;h2&gt;วิธีใช้ Typhoon-OCR และ Python สกัดข้อความจาก PDF/รูปภาพ  | Super AI Agents&lt;/h2&gt;
      &lt;h3&gt;Warun C. ⚡ ・ &lt;time&gt;Aug 15, 2025&lt;/time&gt; ・ 
      &lt;div class="ltag__link__servicename"&gt;
        &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fassets.dev.to%2Fassets%2Fmedium-f709f79cf29704f9f4c2a83f950b2964e95007a3e311b77f686915c71574fef2.svg" alt="Medium Logo"&gt;
        Medium
      &lt;/div&gt;
    &lt;/h3&gt;
&lt;/div&gt;
  &lt;/a&gt;
&lt;/div&gt;



</description>
    </item>
    <item>
      <title>Kiro: เมื่อ "Spec" คือทางออกของปัญหา "Vibe Coding" ในยุค AI</title>
      <dc:creator>Warun C. ⚡</dc:creator>
      <pubDate>Tue, 05 Aug 2025 13:25:10 +0000</pubDate>
      <link>https://dev.to/ubinix_warun/kiro-emuue-spec-khuuethaangkkhngpayhaa-vibe-coding-ainyukh-ai-3e5m</link>
      <guid>https://dev.to/ubinix_warun/kiro-emuue-spec-khuuethaangkkhngpayhaa-vibe-coding-ainyukh-ai-3e5m</guid>
      <description>&lt;p&gt;เครื่องมือ AI อย่าง Copilot ช่วยให้เราเขียนโค้ดได้เร็วขึ้น แต่ก็มักนำไปสู่ปัญหา "Vibe Coding" 🌪️—การสั่งงาน AI ไปเรื่อยๆ อย่างไร้ทิศทาง ทำให้เกิดโค้ดที่ไม่สอดคล้องกัน, มีหนี้ทางเทคนิค (Technical Debt) และดูแลรักษายากในระยะยาว&lt;/p&gt;

&lt;p&gt;Kiro คือ AI Agent ที่เข้ามาแก้ปัญหานี้โดยตรงด้วยแนวทาง Spec-Driven Development ที่นำหลักการวิศวกรรมซอฟต์แวร์กลับมาสู่การทำงานร่วมกับ AI&lt;/p&gt;

&lt;p&gt;&lt;a href="https://medium.com/m/signin?actionUrl=%2F_%2Fapi%2Fsubscriptions%2Fnewsletters%2Fb0e8bfbf2b81&amp;amp;operation=register&amp;amp;redirect=https%3A%2F%2Fmedium.com%2Fubinix-warun&amp;amp;collection=UBINIX+WARUN&amp;amp;collectionId=49c3a90b9f1f&amp;amp;newsletterV3=UBINIX+WARUN&amp;amp;newsletterV3Id=b0e8bfbf2b81" rel="noopener noreferrer"&gt;อ่านฉบับเต็ม...&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Kiro ทำงานอย่างไร?
&lt;/h2&gt;

&lt;p&gt;แทนที่จะสั่งงานแบบด้นสด Kiro จะแนะนำให้คุณทำงานอย่างเป็นระบบผ่าน 3 ขั้นตอนหลัก:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Requirements: กำหนดเป้าหมายและ User Stories ให้ชัดเจน&lt;/li&gt;
&lt;li&gt;Design: วางแผนสถาปัตยกรรมและเทคโนโลยีที่จะใช้&lt;/li&gt;
&lt;li&gt;Implementation: แตกงานใหญ่ออกเป็น Task ย่อยๆ แล้วสั่งให้ AI ลงมือทำ
Plan และราคาโดยสรุป&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fphrifqhu20yq8fh9ajbd.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fphrifqhu20yq8fh9ajbd.png" alt="KiroPrice" width="800" height="206"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Kiro คิดค่าบริการตามการใช้งาน 2 แบบ:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Vibe Requests: คือการแชท, ขอคำแนะนำ, หรือให้ช่วยออกแบบ&lt;/li&gt;
&lt;li&gt;Spec Requests: คือการสั่งให้ Kiro "Execute" หรือลงมือทำงานตาม Task ที่วางแผนไว้&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  บทสรุป
&lt;/h2&gt;

&lt;p&gt;Kiro ไม่ใช่แค่ AI ช่วยเขียนโค้ด แต่เป็นเหมือน "เพื่อนร่วมทีม" ที่ช่วยวางแผนและทำงานอย่างเป็นระบบ เหมาะสำหรับนักพัฒนาที่เบื่อความวุ่นวายของ "Vibe Coding" และต้องการนำระเบียบแบบแผนกลับมาสู่โปรเจกต์ของตนเอง&lt;/p&gt;




&lt;p&gt;ถูกใจกด  เป็นกำลังใจให้ทำคอนเทนต์ดีๆ &amp;amp; ติดตามเรื่องที่น่าสนใจผ่านทาง &lt;br&gt;
&lt;a href="https://bio.link/ubinix_warun" rel="noopener noreferrer"&gt;Warun Chareonsuk&lt;/a&gt; &amp;amp; Super AI Agent -- &lt;a href="https://x.com/ubinix_warun" rel="noopener noreferrer"&gt;@ubinix-warun&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;ตามลิงค์เข้าไปเลี้ยงกาแฟผมได้ที่ &lt;a href="https://buymeacoffee.com/ubinix5warun" rel="noopener noreferrer"&gt;☕ Buy Me A Coffee&lt;/a&gt;&lt;/p&gt;

</description>
    </item>
    <item>
      <title>วิธีใช้ Typhoon-OCR และ Ollama แปลงภาพเป็นข้อความ (ฉบับย่อ)</title>
      <dc:creator>Warun C. ⚡</dc:creator>
      <pubDate>Tue, 29 Jul 2025 15:32:37 +0000</pubDate>
      <link>https://dev.to/ubinix_warun/withiiaich-typhoon-ocr-aela-ollama-aeplngphaaphepnkhkhwaam-chbaby-4mf7</link>
      <guid>https://dev.to/ubinix_warun/withiiaich-typhoon-ocr-aela-ollama-aeplngphaaphepnkhkhwaam-chbaby-4mf7</guid>
      <description>&lt;p&gt;เบื่อไหมกับ OCR ภาษาไทยที่ไม่แม่นยำ? ลองใช้ Typhoon-OCR ซึ่งเป็น LLM สำหรับอ่านข้อความไทยโดยเฉพาะ รันง่ายๆ ผ่าน Ollama บนเครื่องของคุณเอง ทำตามนี้ได้เลย&lt;/p&gt;

&lt;p&gt;&lt;a href="https://medium.com/m/signin?actionUrl=%2F_%2Fapi%2Fsubscriptions%2Fnewsletters%2Fb0e8bfbf2b81&amp;amp;operation=register&amp;amp;redirect=https%3A%2F%2Fmedium.com%2Fubinix-warun&amp;amp;collection=UBINIX+WARUN&amp;amp;collectionId=49c3a90b9f1f&amp;amp;newsletterV3=UBINIX+WARUN&amp;amp;newsletterV3Id=b0e8bfbf2b81" rel="noopener noreferrer"&gt;อ่านฉบับเต็ม...&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  เริ่มต้นใน 3 ขั้นตอน
&lt;/h3&gt;

&lt;p&gt;สิ่งที่ต้องมี:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Ollama&lt;/li&gt;
&lt;li&gt;Python 3&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  ขั้นตอนที่ 1: ติดตั้งโมเดลผ่าน Terminal
&lt;/h2&gt;

&lt;p&gt;เปิด Terminal (หรือ Command Prompt) แล้วรันคำสั่งนี้เพื่อดาวน์โหลดโมเดล Typhoon-OCR:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;ollama pull scb10x/typhoon-ocr-3b:latest
ollama run scb10x/typhoon-ocr-3b:latest
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h2&gt;
  
  
  ขั้นตอนที่ 2: เตรียมสคริปต์ Python
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;ติดตั้ง library ที่จำเป็น:
&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;pip &lt;span class="nb"&gt;install &lt;/span&gt;openai
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;ol&gt;
&lt;li&gt;สร้างไฟล์ Python (เช่น main.py) แล้วใส่โค้ดนี้:
&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;base64&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;openai&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;OpenAI&lt;/span&gt;

&lt;span class="c1"&gt;# ตั้งค่าเพื่อเชื่อมต่อกับ Ollama
&lt;/span&gt;&lt;span class="n"&gt;client&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;OpenAI&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;base_url&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;http://localhost:11434/v1&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;api_key&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;ollama&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# ฟังก์ชันแปลงภาพเป็น base64
&lt;/span&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;encode_image_to_base64&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;image_path&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
  &lt;span class="k"&gt;with&lt;/span&gt; &lt;span class="nf"&gt;open&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;image_path&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;rb&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
      &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;base64&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;b64encode&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;read&lt;/span&gt;&lt;span class="p"&gt;()).&lt;/span&gt;&lt;span class="nf"&gt;decode&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;utf-8&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# เปลี่ยน "sample_image.png" เป็นชื่อไฟล์ของคุณ
&lt;/span&gt;&lt;span class="n"&gt;base64_image&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;encode_image_to_base64&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;sample_image.png&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# ส่ง request ไปยังโมเดล
&lt;/span&gt;&lt;span class="n"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;chat&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;completions&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;create&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;sakares/typhoon-ocr&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="n"&gt;messages&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;role&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;user&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;content&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;type&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;text&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;text&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Extract text from this image:&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt;
          &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;type&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;image_url&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
          &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;image_url&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;url&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;data:image/png;base64,&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;base64_image&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
      &lt;span class="p"&gt;]&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;choices&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="n"&gt;message&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;content&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h2&gt;
  
  
  ขั้นตอนที่ 3: รันสคริปต์
&lt;/h2&gt;

&lt;p&gt;สั่งรันไฟล์ Python ของคุณใน Terminal:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;python main.py
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;ผลจากการรัน Typhoon OCR ...&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fqy91dvu49an4u0z4thk7.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fqy91dvu49an4u0z4thk7.png" alt="ผลลัพธ์ " width="800" height="583"&gt;&lt;/a&gt;&lt;/p&gt;



&lt;p&gt;ถูกใจกด  เป็นกำลังใจให้ทำคอนเทนต์ดีๆ &amp;amp; ติดตามเรื่องที่น่าสนใจผ่านทาง &lt;br&gt;
&lt;a href="https://bio.link/ubinix_warun" rel="noopener noreferrer"&gt;Warun Chareonsuk&lt;/a&gt; &amp;amp; Super AI Agent -- &lt;a href="https://x.com/ubinix_warun" rel="noopener noreferrer"&gt;@ubinix-warun&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;ตามลิงค์เข้าไปเลี้ยงกาแฟผมได้ที่ &lt;a href="https://buymeacoffee.com/ubinix5warun" rel="noopener noreferrer"&gt;☕ Buy Me A Coffee&lt;/a&gt;&lt;/p&gt;


&lt;div class="ltag__link"&gt;
  &lt;a href="https://medium.com/super-ai-agents/%E0%B9%81%E0%B8%9B%E0%B8%A5%E0%B8%87%E0%B8%A3%E0%B8%B9%E0%B8%9B%E0%B8%A0%E0%B8%B2%E0%B8%9E%E0%B9%80%E0%B8%9B%E0%B9%87%E0%B8%99%E0%B8%82%E0%B9%89%E0%B8%AD%E0%B8%84%E0%B8%A7%E0%B8%B2%E0%B8%A1%E0%B8%94%E0%B9%89%E0%B8%A7%E0%B8%A2-typhoon-ocr-%E0%B8%AA%E0%B8%AD%E0%B8%99%E0%B9%83%E0%B8%8A%E0%B9%89%E0%B8%87%E0%B8%B2%E0%B8%99-llm-%E0%B8%AA%E0%B8%B3%E0%B8%AB%E0%B8%A3%E0%B8%B1%E0%B8%9A-ocr-%E0%B8%A0%E0%B8%B2%E0%B8%A9%E0%B8%B2%E0%B9%84%E0%B8%97%E0%B8%A2%E0%B8%89%E0%B8%9A%E0%B8%B1%E0%B8%9A%E0%B8%99%E0%B8%B1%E0%B8%81%E0%B8%9E%E0%B8%B1%E0%B8%92%E0%B8%99%E0%B8%B2-fc2e6579799a" class="ltag__link__link" rel="noopener noreferrer"&gt;
    &lt;div class="ltag__link__pic"&gt;
      &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fmiro.medium.com%2Fv2%2Fresize%3Afill%3A64%3A64%2F1%2AB8wDhSisQxofd4P96sEdNw.jpeg" alt="Warun C. ⚡"&gt;
    &lt;/div&gt;
  &lt;/a&gt;
  &lt;a href="https://medium.com/super-ai-agents/%E0%B9%81%E0%B8%9B%E0%B8%A5%E0%B8%87%E0%B8%A3%E0%B8%B9%E0%B8%9B%E0%B8%A0%E0%B8%B2%E0%B8%9E%E0%B9%80%E0%B8%9B%E0%B9%87%E0%B8%99%E0%B8%82%E0%B9%89%E0%B8%AD%E0%B8%84%E0%B8%A7%E0%B8%B2%E0%B8%A1%E0%B8%94%E0%B9%89%E0%B8%A7%E0%B8%A2-typhoon-ocr-%E0%B8%AA%E0%B8%AD%E0%B8%99%E0%B9%83%E0%B8%8A%E0%B9%89%E0%B8%87%E0%B8%B2%E0%B8%99-llm-%E0%B8%AA%E0%B8%B3%E0%B8%AB%E0%B8%A3%E0%B8%B1%E0%B8%9A-ocr-%E0%B8%A0%E0%B8%B2%E0%B8%A9%E0%B8%B2%E0%B9%84%E0%B8%97%E0%B8%A2%E0%B8%89%E0%B8%9A%E0%B8%B1%E0%B8%9A%E0%B8%99%E0%B8%B1%E0%B8%81%E0%B8%9E%E0%B8%B1%E0%B8%92%E0%B8%99%E0%B8%B2-fc2e6579799a" class="ltag__link__link" rel="noopener noreferrer"&gt;
    &lt;div class="ltag__link__content"&gt;
      &lt;h2&gt;สอนใช้ Typhoon-OCR + Ollama ทำ OCR ภาษาไทย แปลงรูปเป็นข้อความ | Super AI Agents&lt;/h2&gt;
      &lt;h3&gt;Warun C. ⚡ ・ &lt;time&gt;Aug 5, 2025&lt;/time&gt; ・ 
      &lt;div class="ltag__link__servicename"&gt;
        &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fassets.dev.to%2Fassets%2Fmedium-f709f79cf29704f9f4c2a83f950b2964e95007a3e311b77f686915c71574fef2.svg" alt="Medium Logo"&gt;
        Medium
      &lt;/div&gt;
    &lt;/h3&gt;
&lt;/div&gt;
  &lt;/a&gt;
&lt;/div&gt;



</description>
    </item>
    <item>
      <title>ลิงค์ Ollama Model Repo กับ LM Studio ผ่าน Gollama: ง่าย ครบ จบในที่เดียว!</title>
      <dc:creator>Warun C. ⚡</dc:creator>
      <pubDate>Wed, 23 Jul 2025 15:37:32 +0000</pubDate>
      <link>https://dev.to/ubinix_warun/lingkh-ollama-model-repo-kab-lm-studio-phaan-gollama-ngaay-khrb-cchbainthiiediiyw-4i32</link>
      <guid>https://dev.to/ubinix_warun/lingkh-ollama-model-repo-kab-lm-studio-phaan-gollama-ngaay-khrb-cchbainthiiediiyw-4i32</guid>
      <description>&lt;p&gt;ลิงค์ Ollama Model Repo กับ LM Studio ผ่าน Gollama: ง่าย ครบ จบในที่เดียว! 🚀&lt;br&gt;
เบื่อไหมกับการดาวน์โหลด LLM โมเดลใหญ่ ๆ ซ้ำซ้อนกันทั้งใน Ollama และ LM Studio? เสียเวลา เสียพื้นที่ใช่ไหมครับ? วันนี้เรามีทางออกที่ง่ายกว่า นั่นคือการใช้ Gollama!&lt;/p&gt;

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

&lt;p&gt;&lt;a href="https://medium.com/m/signin?actionUrl=%2F_%2Fapi%2Fsubscriptions%2Fnewsletters%2Fb0e8bfbf2b81&amp;amp;operation=register&amp;amp;redirect=https%3A%2F%2Fmedium.com%2Fubinix-warun&amp;amp;collection=UBINIX+WARUN&amp;amp;collectionId=49c3a90b9f1f&amp;amp;newsletterV3=UBINIX+WARUN&amp;amp;newsletterV3Id=b0e8bfbf2b81" rel="noopener noreferrer"&gt;อ่านฉบับเต็ม...&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  ขั้นตอนง่าย ๆ ในการเชื่อมต่อ:
&lt;/h2&gt;
&lt;h3&gt;
  
  
  1. ติดตั้ง Gollama
&lt;/h3&gt;

&lt;p&gt;ติดตั้ง Gollama ด้วยคำสั่งง่าย ๆ ผ่าน Terminal:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;curl -sL https://raw.githubusercontent.com/sammcj/gollama/refs/heads/main/scripts/install.sh | bash
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  2. ดึง Model ด้วย Ollama
&lt;/h3&gt;

&lt;p&gt;ตรวจสอบให้แน่ใจว่าคุณมีโมเดลที่ต้องการใน Ollama แล้ว หากยังไม่มี ก็แค่ ollama run โมเดลนั้น เช่น:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;ollama run scb10x/typhoon-translate-4b

pulling manifest 
pulling df4800286da0... 100% ▕██████████████████████████████████████████████████▏ 2.5 GB                         
pulling 64fa0d86774b... 100% ▕██████████████████████████████████████████████████▏  360 B                         
pulling 574ba8831519... 100% ▕██████████████████████████████████████████████████▏   39 B                         
pulling 1028bfde76f1... 100% ▕██████████████████████████████████████████████████▏   70 B                         
pulling 8544b568851e... 100% ▕██████████████████████████████████████████████████▏  489 B                         
verifying sha256 digest 
writing manifest 
...
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  3. ลิงค์โมเดลด้วย Gollama
&lt;/h3&gt;

&lt;p&gt;รัน Gollama แบบ Interactive (gollama -i) เพื่อเลือกโมเดลที่คุณต้องการลิงค์ กดปุ่ม "l" เมื่อเลือกโมเดลได้แล้ว มันจะสร้าง Symbolic Link (Symlink) ชี้ไปยังโมเดลใน Ollama ของคุณ&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fx4m09lpuvo1ivcymx5im.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fx4m09lpuvo1ivcymx5im.png" alt="Gollama Console" width="800" height="425"&gt;&lt;/a&gt;&lt;/p&gt;


&lt;h3&gt;
  
  
  4. เรียกใช้โมเดลใน LM Studio
&lt;/h3&gt;

&lt;p&gt;เปิด LM Studio คุณจะเห็นโมเดลที่ลิงค์ปรากฏในรายการ "My Models" หรือ "Local Models" พร้อมโหลดและใช้งานได้ทันที ไม่ต้องดาวน์โหลดซ้ำ!&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fvsudiagbi5tfedavgwce.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fvsudiagbi5tfedavgwce.png" alt="โมเดลที่ถูกลิงค์จะปรากฏใน LM Studio พร้อมใช้งานทันที!" width="800" height="447"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;โมเดลที่ถูกลิงค์จะปรากฏใน LM Studio พร้อมใช้งานทันที!&lt;/strong&gt;&lt;/p&gt;

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


&lt;h2&gt;
  
  
  สรุป: ประหยัดกว่า ง่ายกว่า!
&lt;/h2&gt;

&lt;p&gt;การใช้ Gollama ไม่ใช่แค่ช่วย ประหยัดพื้นที่จัดเก็บ เท่านั้น แต่ยังทำให้ จัดการโมเดลได้ง่ายขึ้น และ Workflow ราบรื่น ระหว่าง Ollama และ LM Studio ทำให้การทดลอง LLMs ของคุณมีประสิทธิภาพมากขึ้นอย่างเห็นได้ชัด!&lt;/p&gt;



&lt;p&gt;ถูกใจกด  เป็นกำลังใจให้ทำคอนเทนต์ดีๆ &amp;amp; ติดตามเรื่องที่น่าสนใจผ่านทาง &lt;br&gt;
&lt;a href="https://bio.link/ubinix_warun" rel="noopener noreferrer"&gt;Warun Chareonsuk&lt;/a&gt; &amp;amp; Super AI Agent -- &lt;a href="https://x.com/ubinix_warun" rel="noopener noreferrer"&gt;@ubinix-warun&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;ตามลิงค์เข้าไปเลี้ยงกาแฟผมได้ที่ &lt;a href="https://buymeacoffee.com/ubinix5warun" rel="noopener noreferrer"&gt;☕ Buy Me A Coffee&lt;/a&gt;&lt;/p&gt;


&lt;div class="ltag__link"&gt;
  &lt;a href="https://medium.com/ubinix-warun/%E0%B8%A5%E0%B8%B4%E0%B8%87%E0%B8%84%E0%B9%8C-ollama-model-repo-%E0%B8%81%E0%B8%B1%E0%B8%9A-lm-studio-%E0%B8%9C%E0%B9%88%E0%B8%B2%E0%B8%99-gollama-%E0%B8%87%E0%B9%88%E0%B8%B2%E0%B8%A2-%E0%B8%84%E0%B8%A3%E0%B8%9A-%E0%B8%88%E0%B8%9A%E0%B9%83%E0%B8%99%E0%B8%97%E0%B8%B5%E0%B9%88%E0%B9%80%E0%B8%94%E0%B8%B5%E0%B8%A2%E0%B8%A7-573e01dfcf97" class="ltag__link__link" rel="noopener noreferrer"&gt;
    &lt;div class="ltag__link__pic"&gt;
      &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fmiro.medium.com%2Fv2%2Fresize%3Afill%3A64%3A64%2F1%2AB8wDhSisQxofd4P96sEdNw.jpeg" alt="Warun C. ⚡"&gt;
    &lt;/div&gt;
  &lt;/a&gt;
  &lt;a href="https://medium.com/ubinix-warun/%E0%B8%A5%E0%B8%B4%E0%B8%87%E0%B8%84%E0%B9%8C-ollama-model-repo-%E0%B8%81%E0%B8%B1%E0%B8%9A-lm-studio-%E0%B8%9C%E0%B9%88%E0%B8%B2%E0%B8%99-gollama-%E0%B8%87%E0%B9%88%E0%B8%B2%E0%B8%A2-%E0%B8%84%E0%B8%A3%E0%B8%9A-%E0%B8%88%E0%B8%9A%E0%B9%83%E0%B8%99%E0%B8%97%E0%B8%B5%E0%B9%88%E0%B9%80%E0%B8%94%E0%B8%B5%E0%B8%A2%E0%B8%A7-573e01dfcf97" class="ltag__link__link" rel="noopener noreferrer"&gt;
    &lt;div class="ltag__link__content"&gt;
      &lt;h2&gt;ลิงค์ Ollama กับ LM Studio: ลดความซ้ำซ้อนด้วย Gollama (ภาษาไทย) | UBINIX WARUN&lt;/h2&gt;
      &lt;h3&gt;Warun C. ⚡ ・ &lt;time&gt;Aug 19, 2025&lt;/time&gt; ・ 
      &lt;div class="ltag__link__servicename"&gt;
        &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fassets.dev.to%2Fassets%2Fmedium-f709f79cf29704f9f4c2a83f950b2964e95007a3e311b77f686915c71574fef2.svg" alt="Medium Logo"&gt;
        Medium
      &lt;/div&gt;
    &lt;/h3&gt;
&lt;/div&gt;
  &lt;/a&gt;
&lt;/div&gt;



</description>
    </item>
    <item>
      <title>Part 1: เริ่มต้นใช้งาน Teable บน Docker</title>
      <dc:creator>Warun C. ⚡</dc:creator>
      <pubDate>Wed, 30 Oct 2024 10:29:14 +0000</pubDate>
      <link>https://dev.to/ubinix_warun/part-1-erimtnaichngaan-teable-bn-docker-1g3m</link>
      <guid>https://dev.to/ubinix_warun/part-1-erimtnaichngaan-teable-bn-docker-1g3m</guid>
      <description>&lt;p&gt;ในโลกของการพัฒนาแอปพลิเคชัน เครื่องมือที่ช่วยให้เราจัดการข้อมูลได้อย่างมีประสิทธิภาพเป็นสิ่งจำเป็น Airtable เป็นแพลตฟอร์มที่ได้รับความนิยมอย่างมาก  ด้วยความสามารถในการจัดการข้อมูลแบบ No-code ที่ใช้งานง่าย แต่สำหรับนักพัฒนาที่ต้องการควบคุมระบบและข้อมูลอย่างเต็มที่ Teable คือทางเลือกที่น่าสนใจยิ่งกว่า&lt;/p&gt;

&lt;p&gt;ใน Part 1 นี้ เราจะเริ่มต้นด้วยการติดตั้ง Teable ในสภาพแวดล้อมแบบ Local โดยใช้ Docker เพื่อให้คุณสามารถทดลองใช้งาน Teable ได้โดยไม่ต้อง Deployขึ้น Vercel ก่อน&lt;/p&gt;

&lt;h2&gt;
  
  
  ขั้นตอนการติดตั้ง:
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;1.ติดตั้ง Docker&lt;/strong&gt;: หากคุณยังไม่ได้ติดตั้ง Docker  ให้ดาวน์โหลดและติดตั้ง  Docker Desktop  จากเว็บไซต์  docker.com&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2.สร้างไฟล์  Docker Compose&lt;/strong&gt;:  สร้างไฟล์ชื่อ  docker-compose.yml  และวางโค้ด  YAML  ที่ปรับปรุงแล้วลงไป&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;version&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;3.9'&lt;/span&gt;

&lt;span class="na"&gt;services&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;teable&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;image&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;ghcr.io/teableio/teable:latest&lt;/span&gt;
    &lt;span class="na"&gt;restart&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;always&lt;/span&gt;
    &lt;span class="na"&gt;ports&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;3000:3000'&lt;/span&gt;
    &lt;span class="na"&gt;volumes&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;teable-data:/app/.assets:rw&lt;/span&gt;
    &lt;span class="na"&gt;env_file&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;.env&lt;/span&gt;
    &lt;span class="na"&gt;environment&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;NEXT_ENV_IMAGES_ALL_REMOTE=true&lt;/span&gt;
    &lt;span class="na"&gt;networks&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;teable&lt;/span&gt;
    &lt;span class="na"&gt;depends_on&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;teable-db-migrate&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="na"&gt;condition&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;service_completed_successfully&lt;/span&gt;
    &lt;span class="na"&gt;healthcheck&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;test&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;CMD'&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;curl'&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;-f'&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;http://localhost:3000/health'&lt;/span&gt;&lt;span class="pi"&gt;]&lt;/span&gt;
      &lt;span class="na"&gt;start_period&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;5s&lt;/span&gt;
      &lt;span class="na"&gt;interval&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;5s&lt;/span&gt;
      &lt;span class="na"&gt;timeout&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;3s&lt;/span&gt;
      &lt;span class="na"&gt;retries&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;3&lt;/span&gt;

  &lt;span class="na"&gt;teable-db&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;image&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;postgres:15.4&lt;/span&gt;
    &lt;span class="na"&gt;restart&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;always&lt;/span&gt;
    &lt;span class="na"&gt;ports&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;42345:5432'&lt;/span&gt;
    &lt;span class="na"&gt;volumes&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;teable-db:/var/lib/postgresql/data:rw&lt;/span&gt;
    &lt;span class="na"&gt;environment&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;POSTGRES_DB=${POSTGRES_DB}&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;POSTGRES_USER=${POSTGRES_USER}&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;POSTGRES_PASSWORD=${POSTGRES_PASSWORD}&lt;/span&gt;
    &lt;span class="na"&gt;networks&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;teable&lt;/span&gt;
    &lt;span class="na"&gt;healthcheck&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;test&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;CMD-SHELL'&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;sh&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;-c&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;'pg_isready&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;-U&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;${POSTGRES_USER}&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;-d&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;${POSTGRES_DB}'"&lt;/span&gt;&lt;span class="pi"&gt;]&lt;/span&gt;
      &lt;span class="na"&gt;interval&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;10s&lt;/span&gt;
      &lt;span class="na"&gt;timeout&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;3s&lt;/span&gt;
      &lt;span class="na"&gt;retries&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;3&lt;/span&gt;

  &lt;span class="na"&gt;teable-db-migrate&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;image&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;ghcr.io/teableio/teable-db-migrate:latest&lt;/span&gt;
    &lt;span class="na"&gt;environment&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;PRISMA_DATABASE_URL=postgresql://${POSTGRES_USER}:${POSTGRES_PASSWORD}@${POSTGRES_HOST}:${POSTGRES_PORT}/${POSTGRES_DB}&lt;/span&gt;
    &lt;span class="na"&gt;networks&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;teable&lt;/span&gt;
    &lt;span class="na"&gt;depends_on&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;teable-db&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="na"&gt;condition&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;service_healthy&lt;/span&gt;

&lt;span class="na"&gt;networks&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;teable&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;teable-network&lt;/span&gt;

&lt;span class="na"&gt;volumes&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;teable-db&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;{}&lt;/span&gt;
  &lt;span class="na"&gt;teable-data&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;{}&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;3.&lt;strong&gt;สร้างไฟล์  .env&lt;/strong&gt;:  สร้างไฟล์ชื่อ  .env  ในไดเรกทอรีเดียวกันกับ  docker-compose.yml  และวางโค้ด  .env  ที่ปรับปรุงแล้วลงไป  อย่าลืมเปลี่ยน  POSTGRES_PASSWORD  และ  SECRET_KEY  เป็นค่าที่ปลอดภัย&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# replace the default password
POSTGRES_PASSWORD=replace_this_password
SECRET_KEY=replace_this_secret_key

# replace the following with a publicly accessible address
PUBLIC_ORIGIN=http://127.0.0.1:3000

# ---------------------

# Postgres
POSTGRES_HOST=teable-db
POSTGRES_PORT=5432
POSTGRES_DB=teable
POSTGRES_USER=teable

# App
PRISMA_DATABASE_URL=postgresql://${POSTGRES_USER}:${POSTGRES_PASSWORD}@${POSTGRES_HOST}:${POSTGRES_PORT}/${POSTGRES_DB}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;4.&lt;strong&gt;รัน Docker Compose&lt;/strong&gt;:  เปิด  Terminal  ในไดเรกทอรีที่คุณบันทึกไฟล์&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker-compose up &lt;span class="nt"&gt;-d&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;5.&lt;strong&gt;เข้าถึง  Teable&lt;/strong&gt;:  เปิดเว็บเบราว์เซอร์และไปที่  &lt;a href="http://localhost:3000" rel="noopener noreferrer"&gt;http://localhost:3000&lt;/a&gt;  คุณจะเห็นหน้าจอ  login  ของ  Teable&lt;/p&gt;

&lt;h2&gt;
  
  
  บทสรุป
&lt;/h2&gt;

&lt;p&gt;ใน Part 1 นี้ เราได้เรียนรู้วิธีการติดตั้งและรัน Teable บน Docker แบบ local ซึ่งประกอบด้วย Postgres&lt;/p&gt;

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

&lt;p&gt;อย่างไรก็ตาม  หากต้องการนำ  Teable  ไปใช้งานจริงบน  Server  ควรพิจารณาใช้  Redis  เพื่อเพิ่มประสิทธิภาพในการทำงาน  ซึ่งเราจะได้เรียนรู้เพิ่มเติมใน  Part 3&lt;/p&gt;

&lt;p&gt;ใน  Part 2  เราจะมาเรียนรู้วิธีการเชื่อมต่อ  Teable  กับ  Vercel Postgres&lt;/p&gt;

&lt;p&gt;REF: &lt;a href="https://help.teable.io/deployment/docker-compose" rel="noopener noreferrer"&gt;https://help.teable.io/deployment/docker-compose&lt;/a&gt; &lt;/p&gt;

</description>
      <category>docker</category>
      <category>postgres</category>
      <category>nextjs</category>
    </item>
    <item>
      <title>Docker Registry กับใบรับรอง Self-Signed: ไม่ยากอย่างที่คิด (สำหรับ macOS)</title>
      <dc:creator>Warun C. ⚡</dc:creator>
      <pubDate>Wed, 23 Oct 2024 14:13:11 +0000</pubDate>
      <link>https://dev.to/ubinix_warun/docker-registry-kabaibrabrng-self-signed-aimyaakyaangthiikhid-samhrab-macos-58mg</link>
      <guid>https://dev.to/ubinix_warun/docker-registry-kabaibrabrng-self-signed-aimyaakyaangthiikhid-samhrab-macos-58mg</guid>
      <description>&lt;p&gt;ในโลกของ Docker การมี Private Registry เป็นของตัวเองนั้นช่วยให้เราจัดเก็บและแชร์ Image ได้อย่างปลอดภัยและเป็นอิสระ แต่การใช้ใบรับรอง SSL จากผู้ให้บริการภายนอกอาจมีค่าใช้จ่ายสูง บทความนี้จะแนะนำวิธีง่ายๆ ในการเปิดใช้งาน Docker Registry โดยใช้ใบรับรอง Self-Signed บน macOS&lt;/p&gt;

&lt;h2&gt;
  
  
  ขั้นตอนที่ 1: สร้างใบรับรอง Self-Signed
&lt;/h2&gt;

&lt;p&gt;เราสามารถใช้ OpenSSL ในการสร้างใบรับรองได้ดังนี้&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;openssl req &lt;span class="nt"&gt;-x509&lt;/span&gt; &lt;span class="nt"&gt;-newkey&lt;/span&gt; rsa:4096 &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-keyout&lt;/span&gt; ./certs/key.pem &lt;span class="nt"&gt;-out&lt;/span&gt; ./certs/cert.pem &lt;span class="se"&gt;\ &lt;/span&gt;
  &lt;span class="nt"&gt;-days&lt;/span&gt; 365 &lt;span class="nt"&gt;-nodes&lt;/span&gt; &lt;span class="nt"&gt;-subj&lt;/span&gt; &lt;span class="s2"&gt;"/CN=&amp;lt;your-domain&amp;gt;"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;คำสั่งนี้จะสร้างไฟล์ key.pem (private key) และ cert.pem (certificate)&lt;/p&gt;

&lt;h2&gt;
  
  
  ขั้นตอนที่ 2: กำหนดค่า Docker Registry
&lt;/h2&gt;

&lt;p&gt;เราสามารถใช้ Docker Compose ในการจัดการ Docker Registry ได้ง่ายขึ้น  โดยสร้างไฟล์ docker-compose.yml ดังนี้&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;version&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;3.8"&lt;/span&gt;
&lt;span class="na"&gt;services&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;registry&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;image&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;registry:2&lt;/span&gt;
    &lt;span class="na"&gt;restart&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;always&lt;/span&gt;
    &lt;span class="na"&gt;ports&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;5000:5000"&lt;/span&gt;
    &lt;span class="na"&gt;volumes&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;./data:/var/lib/registry&lt;/span&gt;
    &lt;span class="na"&gt;environment&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;REGISTRY_HTTP_TLS_CERTIFICATE&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;/certs/cert.pem&lt;/span&gt;
      &lt;span class="na"&gt;REGISTRY_HTTP_TLS_KEY&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;/certs/key.pem&lt;/span&gt;
    &lt;span class="na"&gt;volumes&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;./certs:/certs&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  ขั้นตอนที่ 3:  ติดตั้งใบรับรองบน macOS
&lt;/h2&gt;

&lt;p&gt;บน macOS เราจำเป็นต้องติดตั้งใบรับรองเข้ากับ Keychain เพื่อให้ Docker เชื่อถือใบรับรองนี้&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;
openssl s_client &lt;span class="nt"&gt;-showcerts&lt;/span&gt; &lt;span class="nt"&gt;-connect&lt;/span&gt; &amp;lt;your-domain&amp;gt;:5000 &amp;lt;/dev/null 2&amp;gt;/dev/null|openssl x509 &lt;span class="nt"&gt;-outform&lt;/span&gt; PEM &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; ~/.docker/certs.d/&amp;lt;your-domain&amp;gt;:5000/ca.pem

security add-trusted-cert &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="nt"&gt;-r&lt;/span&gt; trustRoot &lt;span class="nt"&gt;-k&lt;/span&gt; ~/Library/Keychains/login.keychain ~/.docker/certs.d/&amp;lt;your-domain&amp;gt;:5000/ca.pem

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  ขั้นตอนที่ 4:  กำหนดค่า Docker Client
&lt;/h2&gt;

&lt;p&gt;สุดท้าย หลังจากติดตั้งใบรับรองแล้ว เราสามารถเข้าสู่ระบบ Docker Registry ผ่าน HTTPS ดังนี้&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;docker login https://&amp;lt;your-domain&amp;gt;:5000
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;u&gt;ข้อควรระวัง:&lt;/u&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;การใช้ใบรับรอง Self-Signed อาจทำให้เกิดความเสี่ยงด้านความปลอดภัย ควรใช้ด้วยความระมัดระวัง&lt;/li&gt;
&lt;li&gt;ตรวจสอบให้แน่ใจว่าพอร์ต 5000 ของ Registry เปิดอยู่และสามารถเข้าถึงได้&lt;/li&gt;
&lt;/ul&gt;

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

&lt;p&gt;การเปิดใช้งาน Docker Registry ด้วยใบรับรอง Self-Signed บน macOS นั้นไม่ซับซ้อนอย่างที่คิด เพียงทำตามขั้นตอนข้างต้น คุณก็สามารถสร้าง Private Registry  ที่ปลอดภัยและใช้งานได้ฟรี&lt;/p&gt;

&lt;p&gt;หวังว่าบทความนี้จะเป็นประโยชน์สำหรับผู้ที่ต้องการใช้งาน Docker Registry  แบบง่ายๆ&lt;/p&gt;

&lt;p&gt;อ้างอิง: &lt;a href="https://stackoverflow.com/a/56412353" rel="noopener noreferrer"&gt;https://stackoverflow.com/a/56412353&lt;/a&gt;&lt;/p&gt;

</description>
      <category>docker</category>
    </item>
    <item>
      <title>Elevate Loyalty: Minting Polygon-Based Rewards with Wix Backend Events</title>
      <dc:creator>Warun C. ⚡</dc:creator>
      <pubDate>Mon, 08 Jul 2024 03:41:32 +0000</pubDate>
      <link>https://dev.to/ubinix_warun/elevate-loyalty-minting-polygon-based-rewards-with-wix-backend-events-k2l</link>
      <guid>https://dev.to/ubinix_warun/elevate-loyalty-minting-polygon-based-rewards-with-wix-backend-events-k2l</guid>
      <description>&lt;p&gt;&lt;em&gt;This is a submission for the &lt;a href="https://dev.to/challenges/wix"&gt;Wix Studio Challenge &lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What I Built
&lt;/h2&gt;

&lt;p&gt;I've developed an innovative loyalty program platform using Wix Studio and Velo (Service Plugins). This platform incentivizes user engagement and fosters brand loyalty through:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Polygon-Based Rewards: Users earn loyalty points in the form of Polygon tokens, offering them real value and the ability to participate in the wider Web3 ecosystem.&lt;/li&gt;
&lt;li&gt;Event-Driven Minting: Points are minted automatically when users complete actions like making purchases, submitting reviews, or referring friends.&lt;/li&gt;
&lt;li&gt;Gamified Experience: The platform encourages participation with a tiered rewards system and exciting redemption options.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Demo
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://ubinix5warun.wixstudio.io/wix-x-devto-airdrop" rel="noopener noreferrer"&gt;https://ubinix5warun.wixstudio.io/wix-x-devto-airdrop&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Development Journey
&lt;/h2&gt;

&lt;p&gt;Purpose of onCheckoutCompleted()&lt;/p&gt;

&lt;p&gt;This event is your golden ticket to trigger actions right after a customer successfully completes a purchase on your Wix store. It's a crucial point to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Award Loyalty Points: Calculate and mint loyalty tokens on the Polygon blockchain based on the purchase amount or specific items bought.&lt;/li&gt;
&lt;li&gt;Update User Balances: Increase the customer's loyalty point balance in your Wix database.&lt;/li&gt;
&lt;li&gt;Trigger Personalized Messages: Send a thank-you email or notification, potentially including the newly earned loyalty point amount.&lt;/li&gt;
&lt;li&gt;Analyze Purchase Data: Gather data for insights into purchasing trends, which can help refine your loyalty program.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Code Example (Velo - Backend):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;import wixData from 'wix-data';
import { mintLoyaltyTokens } from 'backend/polygon-api'; // Your custom Polygon interaction module

export function wixEcom_onCheckoutCompleted(event) {
  const { checkout } = event;
  const customerId = checkout.buyerInfo.memberId; 
  const totalAmount = checkout.totals.total;

  // 1. Calculate Loyalty Points (Example logic: 1 point per $10 spent)
  const pointsEarned = Math.floor(totalAmount / 10);

  // 2. Mint Loyalty Tokens on Polygon (Assuming you have this function)
  mintLoyaltyTokens(customerId, pointsEarned);

  // 3. Update User's Loyalty Points in Database
  wixData.query("Members")
    .eq("_id", customerId)
    .find()
    .then((results) =&amp;gt; {
      const member = results.items[0];
      member.loyaltyPoints += pointsEarned;
      wixData.update("Members", member);
    });

  // 4. (Optional) Trigger Personalized Email/Notification
  // ... (using Wix Automations or a 3rd-party service)
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;How to Set Up&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Backend Function: Create the wixEcom_onCheckoutCompleted function in a backend module (e.g., backend/events.js).&lt;/li&gt;
&lt;li&gt;Event Registration: Register this function as an event handler in your site's backend (Wix dashboard -&amp;gt; Velo -&amp;gt; Backend).&lt;/li&gt;
&lt;li&gt;Polygon Interaction: Develop the mintLoyaltyTokens function (or equivalent) to interact with your Polygon smart contract and mint the loyalty tokens.&lt;/li&gt;
&lt;li&gt;Database: Ensure you have a "Members" collection in your Wix database to store user loyalty points.&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>devchallenge</category>
      <category>wixstudiochallenge</category>
      <category>webdev</category>
      <category>javascript</category>
    </item>
    <item>
      <title>Building a Map Marker PWA with Amplify Gen 2 (Auth, Geo and CI/CD)</title>
      <dc:creator>Warun C. ⚡</dc:creator>
      <pubDate>Mon, 27 May 2024 06:09:46 +0000</pubDate>
      <link>https://dev.to/ubinix_warun/building-a-map-marker-pwa-with-amplify-gen-2-auth-geo-and-cicd-2712</link>
      <guid>https://dev.to/ubinix_warun/building-a-map-marker-pwa-with-amplify-gen-2-auth-geo-and-cicd-2712</guid>
      <description>&lt;p&gt;&lt;em&gt;This is a submission for the &lt;a href="https://dev.to/challenges/aws"&gt;The AWS Amplify Fullstack TypeScript Challenge &lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What I Built
&lt;/h2&gt;

&lt;p&gt;I created a Progressive Web App (PWA) called "Map Marker" that allows users to interactively pinpoint and save locations on a map. Users can create accounts to save their markers, add custom descriptions and photos, and search for specific locations. The app is built with a focus on offline accessibility, leveraging PWA features to ensure a seamless experience even without an internet connection.&lt;/p&gt;

&lt;h2&gt;
  
  
  Demo
&lt;/h2&gt;

&lt;p&gt;You can experience the live version of Map Marker on Amplify Hosting:&lt;br&gt;
&lt;a href="https://main.d1uv5gxgypvnin.amplifyapp.com"&gt;Map Marker (DEMO)&lt;/a&gt;&lt;br&gt;
&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fhthj5s8az1y0fm03jylr.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fhthj5s8az1y0fm03jylr.png" alt="Image description" width="800" height="456"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  Journey
&lt;/h2&gt;

&lt;p&gt;The development journey was an exhilarating adventure, as I ventured into the world of fullstack TypeScript with Amplify Gen 2. The code-first approach allowed me to define my backend infrastructure using TypeScript, which felt natural as a frontend developer.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Create Vite/PWA project from template.&lt;/span&gt;
npm create @vite-pwa/pwa@latest  amplify-vite-map-marker &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--template&lt;/span&gt; react-ts
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The built-in CI/CD pipeline in Amplify Hosting streamlined deployment, automatically rebuilding and publishing my app with each push to my Github repository.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Setup Dep. and Installation&lt;/span&gt;
npm create amplify@latest
npm &lt;span class="nb"&gt;install&lt;/span&gt;

&lt;span class="c"&gt;# Configure AWS for local development&lt;/span&gt;
aws sso login

&lt;span class="c"&gt;# Run Sandbox&lt;/span&gt;
npx ampx sandbox &lt;span class="nt"&gt;--profile&lt;/span&gt; amplify-admin 
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fx50ntynoj05dk8i47z3z.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fx50ntynoj05dk8i47z3z.png" alt="Image description" width="800" height="385"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Amplify Geo truly stole the show, providing pre-built UI components (MapView, SearchField) and convenient APIs for handling map interactions, geocoding, and place search. It dramatically simplified the integration of map functionality into my PWA.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm add aws-amplify @aws-amplify/geo
npm add @aws-amplify/ui-react-geo
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Additionally, I encountered a conflict with the Marker component from @aws-amplify/ui-react-geo, preventing me from customizing its behavior as needed.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;MapView&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;@aws-amplify/ui-react-geo&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;@aws-amplify/ui-react-geo/styles.css&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;App&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="p"&gt;...&lt;/span&gt;

  &lt;span class="k"&gt;return &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="o"&gt;&amp;lt;&amp;gt;&lt;/span&gt;
      &lt;span class="p"&gt;...&lt;/span&gt;

      &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;MapView&lt;/span&gt; 
        &lt;span class="nx"&gt;initialViewState&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{{&lt;/span&gt;
          &lt;span class="na"&gt;latitude&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mf"&gt;37.8&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
          &lt;span class="na"&gt;longitude&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mf"&gt;122.4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
          &lt;span class="na"&gt;zoom&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;14&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="p"&gt;}}&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/MapView&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;    &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;  &lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Connected Components and/or Feature Full&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Vite: For a smooth development experience.&lt;/li&gt;
&lt;li&gt;React: For building a dynamic UI.&lt;/li&gt;
&lt;li&gt;TypeScript: For robust code and type safety.&lt;/li&gt;
&lt;li&gt;AWS Amplify Gen2:

&lt;ul&gt;
&lt;li&gt;Auth: For user authentication.&lt;/li&gt;
&lt;li&gt;Geo: For map display and search.&lt;/li&gt;
&lt;li&gt;Hosting: For seamless deployment.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Next Steps
&lt;/h2&gt;

&lt;p&gt;As Amplify Gen 2 continues to mature, I'm eager to revisit this project and fully implement the intended features. I plan to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Enhance DataStore Integration&lt;/strong&gt;: Leverage DataStore's full potential for real-time data synchronization and offline support once it's more stable.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Customize Markers&lt;/strong&gt;: Explore solutions to overcome the UI component conflict and create more interactive and personalized markers.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Add More Features&lt;/strong&gt;: Implement features like geofencing, enhanced user profiles, and social sharing.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;Even though I faced some roadblocks, building this PWA map marker app with Amplify Gen 2 was a rewarding experience. It's clear that Amplify Gen 2 has immense potential to simplify fullstack development, and I'm excited to continue exploring its capabilities as it evolves.&lt;/p&gt;

</description>
      <category>devchallenge</category>
      <category>awschallenge</category>
      <category>amplify</category>
      <category>fullstack</category>
    </item>
  </channel>
</rss>
