Menu

Monday, September 21, 2026

Express.js trust proxy: ตั้งค่าผิดนิดเดียว เสี่ยงโดน IP Spoofing ไม่รู้ตัว

ทำไม Express.js ถึงอ่าน IP ฝั่ง Client ผิดพลาดเมื่ออยู่หลัง Proxy?

เมื่อเรานำ Express.js แอปพลิเคชันไปรันอยู่หลัง Reverse Proxy หรือ Load Balancer (เช่น Nginx, HAProxy, AWS ALB หรือ Cloudflare) Connection ที่วิ่งเข้าหา Node.js โดยตรงจะมาจาก IP ของ Proxy เอง ไม่ใช่ IP ของผู้ใช้งานจริง (Client) ส่งผลให้ค่า req.ip คืนค่าเป็น IP ของ Proxy เสมอ

เพื่อแก้ปัญหานี้ Reverse Proxy จะแนบ HTTP Header เพิ่มเติมเพื่อบอก IP ต้นทาง ได้แก่:

  • X-Forwarded-For: รายการ IP Address ที่ส่งต่อกันมาเป็นทอดๆ (รูปแบบ: client, proxy1, proxy2)
  • X-Forwarded-Proto: โปรโตคอลที่ Client ใช้เชื่อมต่อเข้ามาจริง (http หรือ https)
  • X-Forwarded-Host: Host Header ดั้งเดิมที่ Client เรียกใช้

การตั้งค่า app.set('trust proxy', value) คือการบอกให้ Express ทราบว่าจะยอมรับและนำค่าจาก Header เหล่านี้มาใช้อัปเดต Property เช่น req.ip, req.ips, req.protocol และ req.secure หรือไม่

Tuesday, September 15, 2026

[Playwright] สรุปภาพรวม Playwright (Node.js): เครื่องมือทำ Automated Testing ยุคใหม่ที่เร็วกว่า Selenium

หากคุณกำลังมองหาเครื่องมือสำหรับทำ Automated Testing หรือ Web Scraping ที่รวดเร็วและเสถียรในยุคนี้ Playwright จาก Microsoft คือหนึ่งในตัวเลือกอันดับต้นๆ ที่นักพัฒนาและ QA สาย Node.js ไม่ควรมองข้าม บทความนี้จะสรุปภาพรวม หลักการทำงาน เปรียบเทียบกับ Selenium พร้อมตัวอย่างการใช้งานจริงครับ


1. Playwright คืออะไร และทำงานอย่างไร?

Playwright คือไลบรารี Open-Source จาก Microsoft ที่รองรับการทดสอบบนเบราว์เซอร์หลักครบถ้วน ทั้ง Chromium, Firefox และ WebKit (Safari) โดยมีจุดเด่นและสถาปัตยกรรมสำคัญดังนี้:

  • Direct Protocol Connection: สื่อสารกับเบราว์เซอร์ผ่าน WebSocket / Browser Debugging Protocol โดยตรง ทำให้การสั่งงานรวดเร็วและมีความเสถียรกว่าเครื่องมือรุ่นเก่า
  • Auto-Waiting: มีระบบรอให้ Element พร้อมใช้งานจริง (Visible, Enabled, Stable) ก่อนส่งคำสั่งโดยอัตโนมัติ ช่วยลดปัญหา Flaky Tests หรือการทดสอบล้มเหลวแบบสุ่ม
  • Browser Context Isolation: สามารถแยกสภาวะการทำงาน (Context) ของเบราว์เซอร์ออกจากกันได้เหมือนการเปิด Incognito Mode ทำให้ทดสอบหลายเคสพร้อมกันแบบ Parallel ได้รวดเร็วโดยไม่ดึงทรัพยากรเครื่อง

Sunday, September 13, 2026

[OpenCode] opencode/big-pickle คือโมเดลอะไร? ความลับของ Stealth Model ที่ Dev ต้องรู้!

ช่วงนี้ผู้ใช้งาน OpenCode หลายคนอาจเริ่มสังเกตเห็นชื่อโมเดลแปลกๆ อย่าง opencode/big-pickle โผล่เข้ามาในระบบ บทความนี้จะสรุปให้ฟังว่าโมเดลนี้คืออะไร ทำไมถึงใช้ชื่อนี้ สิ่งที่มือใหม่ต้องระวัง และควรเลือกใช้โมเดลไหนแทนหากชื่อนี้หายไปครับ


1. opencode/big-pickle คืออะไร?

opencode/big-pickle เป็น Alias หรือชื่อเรียกชั่วคราวของโมเดล AI สายเขียนโค้ดและประมวลผลเชิงลึก (Coding & Reasoning Model) บนบริการ OpenCode (OpenCode Zen)

  • จุดเด่น: เน้นการวิเคราะห์ แก้โจทย์ซับซ้อนหลายขั้นตอน และรองรับการทำงานร่วมกับ Tool/Agent ในการเขียนโปรแกรม
  • สเปก: รองรับ Context Window สูงสุด 200,000 Tokens และจ่าย Output ได้สูงสุด 32,000 Tokens
  • สถานะ: เปิดให้ทดลองใช้งานฟรีผ่าน API และบริการ Zen

[OpenCode] คู่มือตั้งค่า MCP Server ใน OpenCode ฉบับเข้าใจง่าย

สำหรับสาย Developer ที่เริ่มย้ายมาใช้ OpenCode (AI Coding Assistant ตัวแรง) แล้วอยากเพิ่มเครื่องมือเสริมผ่าน MCP (Model Context Protocol) อาจจะเคยเจอการสั่งงานล้มเหลวเพราะ Copy ค่า Config มาจากตัวอื่น เช่น Claude Code หรือ Cursor ตรงๆ ไม่ได้

สาเหตุเพราะ OpenCode มีรูปแบบการตั้งค่า MCP เฉพาะตัวที่ต่างจากเจ้าอื่น วันนี้เราจะพามาดูจุดแตกต่าง พร้อมโครงสร้างแบบครบๆ ทั้ง Local และ Remote ครับ!


ความแตกต่าง: Standard Format vs OpenCode Format

บอทและ CLI ส่วนใหญ่ (เช่น Claude Code, Cursor) จะใช้ key คำว่า mcpServers และแยกคำสั่งหลักกับ Parameter ออกจากกันใน args:

แบบ Standard (ที่ใช้ใน Cursor / Claude Code):

{
  "mcpServers": {
    "playwright": {
      "command": "npx",
      "args": [
        "@playwright/mcp@latest"
      ]
    }
  }
}

แบบ OpenCode (Local MCP Server):

ใน OpenCode จะเปลี่ยน Key หลักเป็น mcp รวมเอาทั้ง command กับ args มาไว้ใน Array เดียวกัน และต้องระบุประเภทเป็น "type": "local":

{
  "mcp": {
    "playwright": {
      "type": "local",
      "command": ["npx", "-y", "@playwright/mcp@latest"],
      "enabled": true
    }
  }
}

Friday, September 11, 2026

[OpenCode] คู่มือตั้งค่า OpenCode: ความแตกต่างระหว่าง Project Config และ Global Config

การจัดโครงสร้างระบบสำหรับ OpenCode ถือเป็นหัวใจสำคัญที่ช่วยให้ AI Agent ทำงานร่วมกันได้อย่างเป็นระบบ ชัดเจน และยืดหยุ่นสูง บทความนี้สรุปโครงสร้างไฟล์ทั้งหมด ทั้งระดับ Global, Project การตั้งค่า MCP รวมถึงเปรียบเทียบการสร้าง Subagent ด้วยไฟล์ Markdown และ JSON