บทความทั้งหมด

ผ่าน sandbox ไม่ได้แปลว่าใช้ได้จริง — สัญญาณหลอก 7 แบบ
ระบบสั่งซื้ออัตโนมัติที่ผมเขียนผ่าน sandbox ของผู้ให้บริการครบทุกคำสั่ง แต่เกือบทุกอย่างที่ sandbox บอกเป็นคนละเรื่องกับของจริง ทั้งเวลาตอบกลับ ยอดที่ถูกตัด ชื่อที่ใช้ได้ และรายการที่สร้างสำเร็จแต่ค้นไม่เจอ รวมสัญญาณหลอก 7 แบบพร้อมวิธีเขียนโค้ดให้ไม่หลงเชื่อ

ให้ AI คนละค่ายมาตรวจโค้ดที่ AI เขียน — กระบวนการ ไม่ใช่ความศรัทธา
พอร์ตเครื่องคำนวณจากสเปรดชีตวิศวกรรม 35 ชีตด้วย AI แล้วจะรู้ได้ยังไงว่าถูก บทความนี้เล่ากระบวนการให้เอเจนต์อีกค่ายมาตรวจอิสระสามรอบ กติกาที่ต้องตั้งก่อนเริ่ม ชั้นความเชื่อมั่นที่กันการโม้เกินหลักฐาน และคลาสความผิดพลาดที่ AI พลาดซ้ำ ๆ ทุกรอบ

ฉลากพิมพ์ไม่ตรงกระดาษ ตั้งระยะเริ่มพิมพ์ให้จบทีเดียว
หลังจากสั่งเครื่องพิมพ์ฉลากให้ยิงหัวพิมพ์ได้แล้ว ปัญหาถัดมาคือตัวหนังสือไม่อยู่บนดวงสติกเกอร์ ผมเลิกเดาแล้วพิมพ์ไม้บรรทัดกับหมุดมุมออกมาวัดจริง แล้วแยกให้ชัดว่าขนาดกระดาษ พื้นที่พิมพ์ และระยะเยื้อง เป็นคนละค่ากันสามค่า

ต่อ Open API ธนาคารออก QR รับเงิน — จาก sandbox ถึงวงจรสถานะ
QR พร้อมเพย์แบบ static ที่ประกอบเองได้ ติดตรงไม่มีใครบอกเราว่าลูกค้าจ่ายหรือยัง บทความนี้ไล่การต่อ Open API ของธนาคารใน sandbox ตั้งแต่ขอ token ออก QR แบบ dynamic อ่านวงจรสถานะ REQUESTED/PAID/CANCELLED/VOIDED ไปจนถึงกับดัก requestDt ที่ทำให้ยิงไม่ผ่านทั้งที่ payload ถูกหมด

เขียนแบบตู้ไฟเป็น SVG ให้ช่างเอาไม้บรรทัดวัดจากกระดาษได้จริง
แบบตู้ไฟที่ generate ออกมาจาก HTML ดูสวยดีแต่ช่างบอกว่าสัดส่วนเพี้ยน ผมเลยรื้อใหม่ทั้งแผ่น ยึดขนาดจริงจากแคตตาล็อกเป็นสมอ เขียน viewBox เป็นมิลลิเมตรตรงๆ แล้ววางแถบสเกลไว้ให้ช่างเอาไม้บรรทัดทาบพิสูจน์เองได้ว่าแบบที่ถืออยู่เป็น 1:10 จริง

ส่งไฟล์ขึ้นโฮสต์แล้วทับกันเงียบๆ สามกับดักตอนคัดลอกไฟล์
ส่งไฟล์สองตัวที่ชื่อซ้ำกันขึ้นโฮสต์พร้อมกัน ตัวหลังทับตัวแรกเงียบๆ ไม่มี error ไม่มี exit code ผิด เว็บยังตอบ 200 ทุกหน้า แค่หน้าภาษาอังกฤษกลายเป็นหน้าภาษาไทย นี่คือสามกับดักที่ทำให้การคัดลอกไฟล์เสียหายโดยไม่มีอะไรเตือน

ย้ายเว็บ .aspx เก่าทั้งเว็บ ทำเป็น catalog JSON แล้วคัดรูปขยะออกเอง
เจ้าของเว็บ .aspx เก่าขอให้ทำเว็บใหม่ แต่เนื้อหาสิบกว่าปีอยู่ในฐานข้อมูลที่เข้าไม่ถึงแล้ว ผมเลยไล่เก็บหน้าเว็บของเขาเองมาทำเป็น catalog JSON ที่คง legacy_id ไว้ทั้งหมด แล้วเขียนตัวคัดรูปสามชั้นกันไม่ให้ QR ของแถมกลายเป็นรูปปกบทความ

ให้ลูกค้าเลือกรูปเองผ่านหน้าเว็บ โดยไม่ต้องมีระบบล็อกอิน
งานเลือกรูปลงเว็บที่คนเลือกไม่ถนัดคอมพิวเตอร์ ถ้าใส่ระบบสมัครและล็อกอินเข้าไป งานจะจบที่หน้าล็อกอิน บทความนี้คือหน้าเลือกรูปที่ไม่มีการยืนยันตัวตนเลย แต่ปลายทางฝั่งเซิร์ฟเวอร์ตรวจทุกค่าด้วยบัญชีขาวที่เข้มจนยิงมั่วแล้วไม่เหลืออะไร พร้อมเพดานทุกชั้นและการสำรองก่อนเขียนทุกครั้ง

Build APM บน Windows: สารบัญ ทำ Apache + PHP 8.4 + MariaDB เอง
ซีรีส์ 7 ตอนพาคอมไพล์ Apache 2.4.69, PHP 8.4.27 และ MariaDB 11.8.9 บน Windows 11 จาก source เอง ให้เวลาที่ PHP ออกแพตช์ความปลอดภัย แก้เลขเวอร์ชันในไฟล์เดียวแล้ว build ใหม่ได้ภายในวัน หน้านี้คือสารบัญ ภาพรวม เวลา ดิสก์ และทางลัดสามคำสั่ง

Build APM บน Windows ตอนที่ 7: Deploy รัน และอัปเดต security patch
ตอนจบของซีรีส์ build Apache + PHP + MariaDB บน Windows ติดตั้งลง C:\APM สตาร์ตครั้งแรกและทดสอบ เปิดให้เครื่องใน LAN เข้าแบบปลอดภัย เล่าบั๊กจริงหกตัว (PidFile, plugin MariaDB, พอร์ต DB, ASLR 500, พาธมีช่องว่างและวงเล็บ) และขั้นตอนอัปเดตเวลามี security release ใหม่

Build APM บน Windows ตอนที่ 6: build PHP 8.4 พร้อม redis imagick
ตอนที่ 6 ของซีรีส์ build Apache + PHP + MariaDB บน Windows จาก source พาไล่ 30-php.ps1 ทีละขั้น ตั้งแต่ php-sdk คำสั่ง configure ทั้งเส้น การคัดลอก DLL จนถึงทดสอบ JIT, redis และ imagick ว่าใช้ได้จริง

Build APM บน Windows ตอนที่ 5: คอมไพล์ ImageMagick 7 ให้ PHP imagick
ตอนที่ 5 ของซีรีส์ Build APM บน Windows พาคอมไพล์ ImageMagick 7.1.2-34 กับ delegate library ราว 40 ตัวจาก source ด้วย toolchain ทางการ พร้อมแพตช์ channel mask 64 เป็น 32 ที่ทำให้ imagick build ผ่าน และเหตุผลที่ HEIC เขียนไม่ได้

Build APM บน Windows ตอนที่ 4: คอมไพล์ MariaDB 11.8 LTS เอง
ตอนที่ 4 ของซีรีส์ Build APM บน Windows พาคอมไพล์ MariaDB 11.8.9 จาก source ด้วย CMake และ Ninja ทีละขั้น ตั้งแต่เตรียมเครื่องมือ รันสคริปต์ ทดสอบบนพอร์ต 3399 ไปจนถึงเหตุผลที่ต้องล็อก collation เป็น utf8mb4_unicode_ci

Build APM บน Windows ตอนที่ 3: build Apache httpd 2.4.69 ด้วย CMake
build APR, APR-util, httpd 2.4.69 และ mod_fcgid ด้วย CMake กับ Ninja บน Windows อธิบายทุก option ว่าใส่ทำไม ไล่ DLL ที่ต้องวางข้าง httpd.exe ด้วย dumpbin ดักไม่ให้ลิงก์ DLL ตัว debug แล้วทดสอบ config ด้วย httpd -t

Build APM บน Windows ตอนที่ 2: ดึง source และ lib ด้วย vcpkg
ขั้นที่ 1 และ 2 ของการ build Apache เองบน Windows อ่านสคริปต์ 00-fetch.ps1 กับ 10-deps-vcpkg.ps1 ทีละบรรทัด ตรวจ sha256 ของ source ทุกตัว แล้วให้ vcpkg build OpenSSL 3.5 LTS กับ lib อีก 8 ตัวจาก source พร้อมคำสั่งตรวจผลทุกขั้น

Build APM บน Windows ตอนที่ 1: เตรียมเครื่องมือและแตก build kit
ตอนแรกของซีรีส์ build Apache + PHP 8.4 + MariaDB เองบน Windows ติดตั้ง Visual Studio 2022 Build Tools พร้อม component ที่จำเป็น Git CMake Ninja PowerShell 7 ตั้ง Defender แตก build kit ลง C:\apm-build แล้วไล่ดูโฟลเดอร์ versions.json และสคริปต์ lib.ps1 กับ build-all.ps1 ทีละบรรทัด

PHP มีช่องโหว่ RCE ระดับวิกฤตสองตัว (php2shell) อัปเดตด่วนวันนี้
CVE-2026-109618 กับ CVE-2026-109619 เป็นช่องโหว่ RCE ของ PHP ที่ CVSS 9.2 มี exploit สาธารณะแล้ว กระทบทุกเครื่องที่ใช้ PHP รับ request เว็บ รุ่นที่แก้แล้วคือ 8.5.12, 8.4.27, 8.3.36, 8.2.35 บันทึกนี้รวมวิธีเช็กเวอร์ชัน วิธีอัปเดตทั้ง Debian, RHEL, DirectAdmin, Docker และ Windows กับค่าชั่วคราวระหว่างรอแพตช์

กรอกฟอร์มราชการลง PDF ด้วยสคริปต์ และทำสำเนาบัตรให้ปลอดภัย
ฟอร์มราชการที่แจกมาเป็น PDF กรอกได้ มักกรอกภาษาไทยไม่ได้จริง ช่องแบบตารางย่อยทำให้ตัวเลขไหลทับเส้น และวรรณยุกต์ลอยไปชนสระบน บทความนี้คือวิธีไล่ชื่อช่องออกมาก่อน กรอกผ่านฟอร์มแล้วอบให้เป็นเนื้อเอกสารจริง วาดข้อความไทยเองด้วยฟอนต์ที่มีสระครบ และทำสำเนาบัตรขนาดเท่าของจริงพร้อมลายน้ำที่ระบุวัตถุประสงค์

ทำแอปคุมเพจผ่าน Graph API สามปลายทางที่ลืมแล้วไม่ผ่านรีวิว
งานที่ต้องให้ระบบหลังบ้านอ่านและตอบข้อความของเพจได้เอง ทางที่ถูกต้องมีทางเดียวคือทำแอปแล้วผ่านรีวิวของแพลตฟอร์ม บทความนี้คือสามปลายทางที่แพลตฟอร์มบังคับให้มีแต่คนลืมกันจนตกรีวิว การตรวจลายเซ็นคำขอที่ส่งมาให้ถูกวิธี และขั้นตอนแลกโทเคนสั้นเป็นโทเคนเพจที่เก็บนอกรากเว็บ

VM เห็นอุปกรณ์แต่ไม่มีเน็ต เพราะ Windows ไม่มีไดรเวอร์ CDC ECM
ส่ง USB LTE dongle เข้า VM วินโดวส์แล้วเครื่องเห็นอุปกรณ์ แต่ไม่มีการ์ดเน็ตโผล่มา สาเหตุไม่ได้อยู่ที่ซิมหรือที่การส่งผ่านพอร์ต แต่อยู่ที่ dongle เปิดหน้าตาแบบ CDC ECM ซึ่งวินโดวส์ไม่มีไดรเวอร์ติดมาให้ พร้อมกับดักโหมดสตอเรจและ dhclient ที่ทับ resolv.conf ของโฮสต์

ฟอร์มแจ้งปัญหาบนเว็บ static ที่ไม่มีแบ็กเอนด์สักตัว
เว็บคำนวณที่เป็นไฟล์นิ่งล้วน ไม่มีเซิร์ฟเวอร์ให้รับฟอร์ม แต่ยังต้องมีช่องให้คนใช้แจ้งว่าสูตรผิดตรงไหน บทความนี้คือเส้นทางเดียวที่ผมเลือกใช้ คือ worker ไฟล์เดียวที่รับ POST เส้นทางเดียว ตรวจ Turnstile ฝั่งเซิร์ฟเวอร์ด้วยไอพีจริง รับรูปที่ผู้ใช้กดวางจากคลิปบอร์ด แล้วยิงเมลออกจากขอบเครือข่าย พร้อมกับดักสามอย่างที่กินเวลาผมไปทั้งคืน

ตารางเกณฑ์ในสเปรดชีตที่ไม่ได้ผูกสูตร ถอดค่าคงที่กลับเป็นสูตร
ชีตที่มีตารางเกณฑ์วางอยู่ข้าง ๆ แต่ไม่ได้ผูก VLOOKUP คนอ่านตารางแล้วพิมพ์ค่าลงช่องเอง พลาดเมื่อไรไม่มีใครรู้ บทความนี้ว่าด้วยการแยกช่องสูตรกับช่องพิมพ์มือออกจากกัน แล้วถอดคอลัมน์ตัวคูณ 16 ค่ากลับมาเป็นสูตรเดียวที่ตรงทั้งตาราง

เร่งคลิปจอเป็นช่วง ๆ แต่ให้นาฬิกาบนภาพเดินตามเวลาต้นฉบับ
วิธีทำไทม์แลปส์จากคลิปอัดหน้าจอที่เร่งช่วงนิ่งแรงกว่าช่วงทำงาน ด้วย split กับ trim กับ setpts แล้ว concat กลับ พร้อมกับดักใหญ่คือ drawtext ต้องวางก่อน setpts นาฬิกาถึงจะเดินตามเวลาต้นฉบับ ไม่ใช่เวลาที่ถูกเร่งไปแล้ว

เว็บสองภาษา 26 หน้า ทำไมต้องกลายเป็น .php แล้วลิงก์พังทั้งเว็บ
หน้าโปรดักชันโชว์แท็ก PHP เป็นตัวหนังสือดิบ เพราะเว็บเซิร์ฟเวอร์เสิร์ฟ .html เป็นไฟล์ static พอเปลี่ยนทั้ง 26 หน้าเป็น .php ลิงก์ก็พังทั้งเว็บ แล้วพอทำ clean URL ต่อหน้าย่อยก็เด้งกลับเป็น .php เพราะ rewrite กับ 301 ทำครึ่งเดียว บทความนี้คือ .htaccess เต็ม กติกา $base แปดกรณี และสคริปต์ที่ทำทีเดียวทั้งเว็บ

ยิง API สองหมื่นกว่าครั้ง ให้หยุดกลางทางแล้วต่อได้ และไม่ได้ไฟล์เสีย
งานยิง API สร้างไฟล์ 26,850 ไฟล์บนโควตาที่จำกัด 20 ครั้งต่อนาที สามชิ้นที่ขาดไม่ได้คือ ตัวหน่วงที่นับรวมกันทั้งระบบ การต่องานจากของที่มีอยู่บนดิสก์ และตัวตรวจไฟล์แยกต่างหาก เพราะไฟล์ที่หลุดตอนเน็ตสะดุดมีนามสกุลถูกและขนาดไม่เป็นศูนย์

แบนเนอร์คุกกี้ที่กั้นได้จริง โหลด GTM กับ GA4 หลังกดยอมรับเท่านั้น
แบนเนอร์คุกกี้ส่วนใหญ่ขึ้นมาสวยแต่ไม่ได้กั้นอะไร เพราะ GTM กับ GA4 ถูกโหลดไปตั้งแต่บรรทัดแรกของหน้าแล้ว บทความนี้คือโครงที่โหลด container เมื่อกดยอมรับเท่านั้น วาง GA4 เป็นแท็กข้างใน GTM กันนับซ้ำ ซ่อนช่อง AdSense ไว้ก่อน และตัวตรวจที่นับ request ปลายทางให้เป็นศูนย์

หน้าเว็บว่างเปล่า ไม่มี error สักบรรทัด เพราะตั้งชื่อฟังก์ชันว่า top
deploy ขึ้นไปแล้วหน้าว่าง ไม่มี error ในล็อก ไม่มีอะไรผิดใน node --check แต่เบราว์เซอร์ฆ่าทั้งสคริปต์ตั้งแต่บรรทัดแรกเพราะมีฟังก์ชันชื่อ top ไปชนกับ window.top พร้อมรายชื่อที่ต้องเลี่ยง กับดักลำดับการโหลดสคริปต์ และด่านตรวจด้วย Playwright ที่ควรมีทุกโปรเจกต์

ระบบเฝ้าระวังที่ยิงถี่เกิน จนล้มอุปกรณ์ทั้งฟาร์มเอง
ลูปเฝ้าระวังทุก 30 วินาทีที่สั่งกู้อุปกรณ์ทุกตัวที่ ping ไม่ผ่าน ฟังดูเหมือนของดี จนวันที่อุปกรณ์ตัวเดียวค้างแล้วโดนกระแทกซ้ำจนล้มทั้งบัส บทความนี้ไล่ตั้งแต่ตัดสมมติฐานฮาร์ดแวร์ ทำตัวจับว่าใครแตะอุปกรณ์บ้าง ไปจนถึงค่าที่แก้แล้วหาย

รูปไม่โหลดในหน้าที่ซ่อนด้วย display:none เฉพาะบนมือถือ
หน้าเว็บแบบสลับหน้าด้วย display:none พอกดเปิดหน้าใหม่บนมือถือแล้วรูปดำเปล่า ทั้งที่ไฟล์คืน 200 และ fetch กับ new Image สำเร็จทั้งคู่ ตัวจริงคือ IntersectionObserver ของ loading=lazy ที่ไม่ยิงตอนหน้าเปลี่ยนจาก none เป็น block และการตั้ง loading=eager เฉย ๆ ก็ยังไม่พอ

ให้เว็บอ่านเครื่องอ่านบัตรที่เคาน์เตอร์ ด้วย agent บน localhost
เบราว์เซอร์แตะเครื่องอ่านบัตรสมาร์ตการ์ดเองไม่ได้ ทางที่ใช้ได้คือเขียน agent ตัวเล็กเปิดพอร์ตบน localhost แล้วให้หน้าเว็บเรียก บทความนี้เก็บครบทั้ง secure context, CORS preflight, การแย่งพอร์ตกับ agent เจ้าอื่น, PC/SC แบบ SHARED, การถอด TIS-620 เอง และวันที่โดนแอนตี้ไวรัสเหมาว่าเป็น backdoor

NVR ร้องไม่หยุด แต่ตอนดิสก์พังจริงกลับเงียบสนิท
เสียงที่ NVR ร้องทั้งวันไม่ใช่ videoloss อย่างที่ทุกคนคิด มันคือ ipconflict จากกล้องที่เป็น DHCP แล้ว IP ชนกันเอง พอมีคนรำคาญแล้วไปปิดเสียงยกเครื่อง วันที่ดิสก์สองลูกพังพร้อมกันเลยไม่มีเสียงเตือนสักแอะ บทความนี้แก้ที่ policy ทีละ event ด้วย ISAPI

ลบใบหน้าในเครื่องสแกนไม่ได้ เพราะ API ตอบ notSupport
เครื่องสแกนใบหน้าที่ประตูโฆษณาว่ามีคำสั่งลบใบหน้าใน FDLib แต่ยิงคำสั่งจริงกลับตอบ notSupport ทุกรูปแบบ คนที่ออกไปแล้วเลยยังสแกนเข้าได้อยู่ บทความนี้เล่าทางที่ตัน ทางที่ใช้ได้จริงคือ UserInfo/Modify แบบ body สั้นที่สุด และวงจร sync ทะเบียนคนสองทางที่รันทุกคืน

ไม่มีมิเตอร์ kWh แต่อยากรู้ค่าไฟรายวัน คิดจากกระแสที่วัดได้
บันทึกการแปลงค่ากระแสจากหัววัด CT ให้กลายเป็นหน่วยไฟและค่าไฟรายวันแบบแยกช่วงเวลา ตั้งแต่สูตรกำลังไฟสามเฟส จังหวะการอ่านที่เป็นส่วนหนึ่งของสูตร การข้ามช่วงไฟดับ ไปจนถึงการแยกช่วง peak กับ off-peak ด้วยเลขคณิตบน epoch และตารางสรุปรายวันที่ทำให้หน้าเว็บเร็วขึ้นเจ็ดเท่า

อ่านค่าจากอุปกรณ์ Modbus ที่ไม่รู้ว่าเป็นตัวอะไร พิสูจน์ก่อนตีความ
บันทึกการไล่หาอุปกรณ์บนบัส RS485 ที่ไม่มีเอกสาร ตั้งแต่กวาด baud กับ address ทีละชุด ไปจนถึงการพิสูจน์ว่า register ตัวไหนมีค่าจริงตัวไหนตาย และบทเรียนว่าการเดาชนิดอุปกรณ์จากรูปแบบตัวเลขอย่างเดียวทำให้ตีความผิดได้ยาวเป็นเดือน

เขียนค่าลง DirectAdmin ตอนที่ API มีแต่ฝั่งอ่าน ต้องขับฟอร์มของแผงเอง
บันทึกการทำให้แอปหลังบ้านสร้างและแก้แพ็กเกจโฮสติ้งบน DirectAdmin ได้ ทั้งที่ CMD_API ตัวทางการมีแต่คำสั่งอ่าน ต้อง POST เข้าฟอร์มของแผงควบคุมเอง พร้อมกฎการยืนยันผลที่ห้ามใช้ regex และสวิตช์ตัดวงจรสองชั้นที่ปิดไว้เป็นค่าตั้งต้น

nameserver ที่ registrar ไม่ตรงกับระบบบิลลิ่ง ออดิตสามฝั่งก่อนแก้
บันทึกการไล่บั๊ก "Wrong response from the server" ตอนกดเปลี่ยน nameserver ในระบบบิลลิ่ง ที่พังเฉพาะโดเมนที่มีข้อมูล glue IP ตกค้าง แล้วทำออดิตเทียบสามฝั่งระหว่าง registrar ระบบบิลลิ่ง และโซน DNS จริง ก่อนจะกล้าแก้อะไรสักตัว

ดูดเมลเข้าระบบโดยไม่ทำลายกล่องจดหมายของคนอื่น
กล่องเมลที่แอปจะไปดึงของ เป็นกล่องที่คนใช้งานอยู่จริงทุกวัน — ดึงด้วย UNSEEN คือเมลหายเงียบเมื่อเจ้าของเปิดอ่านบนมือถือก่อน cron วิธีที่ถูกคือ UID SEARCH คู่กับ UIDVALIDITY และ BODY.PEEK พร้อมการกันซ้ำที่ต้องทำฝั่งเราเอง

อ่านจากฐานสำรอง ต้องมีป้ายบอกว่าข้อมูลเก่ากี่นาที
replication บอกว่าตามหลัง 0 วินาทีได้ทั้งที่ข้อมูลค้างอยู่เมื่อวาน เพราะสองสัญญาณนี้วัดคนละเรื่องกัน — วิธีตั้งตัวเฝ้าที่เทียบทั้ง Seconds_Behind_Master และความสดของข้อมูลธุรกิจ พร้อมจับคนที่แอบเขียนลง slave และตัวเฝ้าที่เฝ้าตัวเฝ้าอีกชั้น

ให้ AI อ่านเอกสาร แต่ให้โค้ดเป็นคนคิดเลข
controller บังคับให้คนกรอกอยู่ในช่วง 0 ถึง 100 แต่เส้นทางที่ AI อ่านค่าจากเอกสารแล้วป้อนเข้ามาตรวจแค่ว่าเป็นตัวเลข ค่าติดลบตัวเดียวดันผลลัพธ์ขึ้นไป 5.25 เท่าโดยไม่มี error — บทเรียนเรื่องการมองเอาต์พุตของ AI เป็น input ที่ไม่น่าเชื่อถือเท่ากับที่คนกรอก

แอปเป็น UTC คนคิดเป็นเวลาไทย — เพี้ยน 7 ชั่วโมงแบบไม่มี error
ตั้งเวลาเผยแพร่ไว้บ่ายสาม ของขึ้นจริงสี่ทุ่ม ไม่มี error ไม่มี log อะไรผิด เพราะแอปเก็บเป็น UTC แต่คนกรอกคิดเป็นเวลาไทย บทความนี้ไล่ตั้งแต่ค่าที่ตั้งใน env แล้วไม่มีผล ไปจนถึงบรรทัดเดียวที่เขียนหน้าปัดไทยลงคอลัมน์ที่ทุกคนอ่านเป็น UTC

time-series เป็น JSON โตวันละ 50 MB ย้ายลงคอลัมน์โดยไม่แก้ dashboard
เก็บค่าที่อ่านจากอุปกรณ์ทั้งเฟรมเป็น JSON array วินาทีละแถว ผ่านไปสองสัปดาห์ตารางโต 183 MB ที่ปลายทางและ 625 MB บนเซิร์ฟเวอร์ พร้อมกับ JSON_EXTRACT ที่ทำ index ไม่ได้ — วิธีย้ายไปเก็บเป็นคอลัมน์ int แล้วให้ API ประกอบ array คืนแบบ sparse เพื่อไม่ให้ dashboard รู้ตัวสักบรรทัด

ไฟล์ลับคุม 600 ครบ แต่ log 0644 ถูกอัปออกนอกเครื่องทุกคืน
เข้ารหัส .env เรียบร้อย คุมสิทธิ์ไฟล์ลับครบทุกตัว แต่ข้อมูลลูกค้ายังรั่วออกนอกเครื่องทุกคืนผ่านทางที่ไม่มีใครจัดว่าเป็นความลับ นั่นคือไฟล์ log ที่อ่านได้ทั้งเครื่องและถูกมัดรวมขึ้น object storage พร้อม backup พร้อมวิธีปิดที่ต้นทางด้วยการ log แค่รหัสผลลัพธ์

ไฟร์วอลล์ขาออกทำระบบเช็คชื่อโดเมนพัง — root ทดสอบแล้วผ่าน
หน้าสั่งซื้อโดเมนขึ้นว่าไม่ว่างทุกชื่อ แม้แต่ชื่อที่มั่วขึ้นมาเอง ต้นเหตุคือนโยบายขาออกเป็น DROP แล้วลิสต์พอร์ตที่อนุญาตไม่มีพอร์ต 43 หลังย้ายระบบปฏิบัติการ กับดักคือทดสอบด้วย root แล้วผ่านทุกครั้ง ต้องทดสอบในนามผู้ใช้ที่รันแอปจริงเท่านั้น

เว็บกับคิวคนละผู้ใช้ — mkdir 0700 ฆ่า default ACL ทิ้งทั้งโฟลเดอร์
แอปตัวเดียวแต่รันด้วยสองผู้ใช้ ฝั่งเว็บเป็น php-fpm ฝั่งคิวเป็นอีกบัญชีหนึ่ง ตั้ง default ACL ไว้ครบแล้วยังเขียนข้ามกันไม่ได้ ต้นเหตุคือ mkdir โหมด 0700 ที่ไปตั้ง mask ทับจนสิทธิ์ ACL หายเกลี้ยง พร้อมกับดักเรื่องลบไฟล์ที่ต้องมีสิทธิ์ที่โฟลเดอร์ ไม่ใช่ที่ไฟล์

บริการยังรันอยู่ แต่ตายไปแล้ว — systemd restart ช่วยไม่ได้
เน็ตหลุดยาว DNS ใช้ไม่ได้ เดมอนที่ถือ session กับ API ภายนอกวนล็อกอินไม่สำเร็จ 194 รอบ แล้วค้างกลางขั้นตอน ไม่ exit ระบบเลยไม่ restart ให้ — ว่าด้วยการเลิกวัดว่า process ยังอยู่ไหม แล้วหันมาวัดความสดของข้อมูลแทน

tinker ส่งเมลผ่าน แต่เว็บส่งไม่ออก — proc_open ที่ปิดอยู่ใน FPM
ทดสอบส่งเมลจาก tinker ผ่านฉลุย แต่พอกดจากฟอร์มจริงกลับไม่มีอะไรออกเลย และ mail log ไม่มีสักบรรทัด — เพราะ CLI กับ PHP-FPM ไม่ใช่ PHP ตัวเดียวกัน พร้อมสูตร SMTP AUTH ที่ใช้ได้จริงบนโฮสต์ DirectAdmin และกฎเรื่อง From ที่ห้ามพลาด

deploy แล้วเว็บไม่อัปเดต — ไล่แคชห้าชั้นให้จบในครั้งเดียว
อัปไฟล์ขึ้นแล้ว เปิดดูยังเป็นของเก่า กด Ctrl+F5 ก็ยังเก่า — เพราะระหว่างไฟล์บนดิสก์กับสิ่งที่คนเห็นมีแคชคั่นอยู่ห้าชั้น แต่ละชั้นล้างคนละวิธี บทความนี้คือลำดับล้างที่ผมใช้ประจำ พร้อมกับดักที่ทำให้เว็บ 500 ค้างหลังสั่งล้าง view cache

route:cache แล้วทุก GET กลายเป็น 405 — กับดักแอปใต้ sub-path
deploy เสร็จ กด optimize ตามคู่มือ แล้วทุกหน้าตอบ 405 Method Not Allowed ทั้งที่ route:list ยืนยันว่า route ถูกต้อง — เรื่องของ route cache ที่พังเฉพาะบางเครื่อง วิธีแยกให้ขาดใน 30 วินาที และของแถมอีกสามอย่างที่เจอพร้อมกันตอนเอาแอปไปวางใต้ sub-path

php -l ผ่าน แต่หน้าเว็บ 500 — ประตูตรวจก่อน commit ที่คอมไพล์จริง
เทมเพลตพังสองรอบในเดือนเดียวทั้งที่ php -l ผ่านหมด เพราะ php -l ไม่รู้จักไวยากรณ์ของ Blade บทความนี้คือประตูตรวจ 6 ด่านที่ผมวางไว้ก่อน commit — คอมไพล์ view จริงแล้ว lint ไฟล์ที่คอมไพล์ออกมาซ้ำอีกชั้น พร้อมสคริปต์กวาด GET ทุก route ผ่าน Kernel

งานที่ยิงออกนอกระบบ ต้องจองสถานะก่อนยิงเสมอ
guard แบบ "อ่านสถานะแล้วค่อยยิง" ดูปลอดภัยจนถึงวันที่ worker โดนฆ่าหลังยิงแต่ก่อนเขียนฐานข้อมูล แล้ว retry ก็ยิงซ้ำให้ลูกค้าเห็นของสองรอบ บทความนี้คือชุดกันซ้ำทั้งชุดที่ผมใช้ ตั้งแต่การจองแบบ atomic ไปจนถึง retry_after กับ failed() ที่ห้ามทับสถานะที่สำเร็จแล้ว

โค้ดชุดเดียวสองบทบาท เว็บอยู่โฮสต์ worker อยู่เครื่องที่บ้าน
ระบบทั้งตัวเคยวิ่งอยู่บนเครื่องเดียวหลังเน็ตบ้าน เครื่องดับทีเดียวทีมใช้อะไรไม่ได้เลย ผมเลยแยกเป็นสองบทบาทด้วยโค้ดชุดเดิม — เว็บอยู่โฮสต์ที่เปิดตลอด งานหนักอยู่เครื่องที่บ้านแล้ววิ่งมาดึงงานเอง พร้อมตาราง claim แบบ atomic และแผนสลับ 18 ขั้นที่มีทางถอย

อุโมงค์เส้นเดียวคือทางเข้าเดียว และเป็นจุดตายเดียวด้วย
เครื่องทำงานอยู่หลัง NAT ไม่มีพอร์ตเปิดจากอินเทอร์เน็ตเลยสักพอร์ต ทุกทางเข้าวิ่งผ่าน cloudflared เส้นเดียว — ทั้งเว็บ ทั้ง SSH ทั้งรีโมตเดสก์ท็อป บทความนี้เล่า ingress ทั้งสี่เส้นที่ผมวางไว้ วิธีอ่านสัญญาณตอนมันล่ม และกับดักที่ทำให้อุโมงค์ไม่ขึ้นตอนบูต

แจ้งเตือนถี่เกินเท่ากับไม่ได้แจ้ง จูนบอทให้คนอ่านจริง
วันเดียว 28 เหตุการณ์กลายเป็น 56 ข้อความ และ 57 เปอร์เซ็นต์ของทั้งหมดเป็นการเตือนซ้ำทุก 30 นาที บทความนี้ว่าด้วยการแยกชั้นผู้รับ การรวมรอบที่ซ้อนกัน สถานะที่รอดจากการรีสตาร์ต และเหตุผลที่ห้ามใส่ keepalive กับ session ของแอปแชต

บัญชีเมลถูกยึดจริง หรือแค่โดนเดารหัส พิสูจน์ให้ชี้ขาดก่อนแจ้ง
การบอกลูกค้าว่าบัญชีของเขาถูกยึด เป็นข้อกล่าวหาที่ต้องมีหลักฐานระดับชี้ขาดก่อน บทความนี้ว่าด้วยหลักฐานแบบไหนถึงเรียกว่าชี้ขาด สองเคสที่ผลออกมาตรงข้ามกัน และเคสที่ผมเกือบแจ้งผิด

ชุดแบบผังโรงงานอาหาร ต้องมีกี่แผ่น สเกลเท่าไร ลงกระดาษยังไง
ชุดแบบประกอบคำขอโรงงานอาหารมี 7 รายการ แต่ละแผ่นมีช่วงสเกลของตัวเอง และมีเลขที่ต้องคำนวณก่อนวาดคือ ผังกว้างกี่เมตรลง A4 หรือ A3 ที่ 1 ต่อ 100 ได้ไหม ถ้าไม่ได้จะแบ่งแผ่นยังไงไม่ให้สเกลเพี้ยน

จากโมเดลเป็นผังตัดเหล็ก 6 เมตร แล้วออกชีทตัดให้ช่าง
อ่านความยาวชิ้นส่วนจากโมเดล รวมรายการซ้ำ แล้วจัดผังตัดแบบ first-fit decreasing บนเส้นมาตรฐาน 6 เมตร เผื่อร่องใบเลื่อย 3 มิลลิเมตร พร้อมทางเลือกบากคอหักฉากที่ลดรอยต่อจาก 12 เหลือ 6

ถอดปริมาณงานจากโมเดล SketchUp ด้วยสคริปต์ Ruby
โมเดลที่ปั้นไว้แล้วมีตัวเลขทุกตัวที่ใบถอดปริมาณต้องการ ขอแค่ตั้งชื่อกลุ่มให้อ่านได้ตั้งแต่แรก แล้วเขียนสคริปต์ไล่ grep พร้อมกับดักสองข้อที่ทำให้พื้นที่เพี้ยนเท่าตัว

ทำชุดแผ่นแบบจากโมเดล SketchUp วางเลขกับเส้นระยะอัตโนมัติ
โมเดลเสร็จแล้วยังส่งงานไม่ได้ ของที่ราชการรับคือแผ่นกระดาษที่มีเลขกำกับอาคาร เส้นบอกระยะ ทิศเหนือ และมาตราส่วน บทความนี้คือวิธีดึงรูปทรงออกจากโมเดลเป็นตัวเลข เรนเดอร์ top ortho ให้ได้เส้นดำบนพื้นขาว แล้วให้สคริปต์วางเลขกับเส้นระยะเองโดยไม่ทับกัน พร้อมช่องให้สั่งทับเป็นรายชิ้น

วัดผังอาคารด้วยมือถือ แล้วหาทิศเหนือจริงด้วย GNSS
ARCore ให้พิกัดมุมห้องเป็นเมตรได้แม่นพอใช้งาน แต่ world frame ของมันหันไปทางไหนก็ไม่รู้ ผังที่ได้เลยหมุนอยู่มุมหนึ่งเสมอ วิธีแก้คือเดินเก็บคู่ (ตำแหน่ง AR, ค่า GNSS) ระหว่างทำงาน แล้ว fit rotation แบบ Kabsch สองมิติถ่วงน้ำหนักด้วยความแม่นของแต่ละ fix ได้ทั้งทิศเหนือและพิกัดของจุดกำเนิด

ถอดแบบจาก PDF ที่วาดไม่ตรงสเกล แล้ววาดกลับให้ตรงระยะ
แบบแปลนงานนำเสนอมักวาดทีละบล็อก สเกลแกน x กับ y ไม่เท่ากัน และแต่ละห้องยังไม่เท่ากันอีก คาลิเบรตครั้งเดียวทั้งหน้าแล้ววาดตามคือผิดทุกจุด บทความนี้เป็นวิธีถอดพิกัดจากกระดาษเป็นเมตรแบบคิดสเกลใหม่ทุกห้อง นับจำนวนชิ้นด้วย colour-blob BFS แทนการนับด้วยตา แล้ววาดกลับลงโมเดลให้ตรงระยะจริง

นิวทรัลพ่วงข้ามหม้อแปลง ทำไมบาลานซ์เฟสอย่างเดียวไม่จบ
บันทึกเคสหม้อแปลงสองลูกที่นิวทรัลพ่วงถึงกัน บวกบ้านพักที่แอบเกาะสายเมนฝั่งหนึ่ง ทำให้เฟส A ค้าง 30-40 A แม้วันหยุด พร้อมกับดักการอ่านมิเตอร์ที่ตีความผิดได้ถึง 200 A ถ้าไม่ยืนยัน CT ratio ก่อน และลำดับการแก้ที่ห้ามสลับขั้นตอน

เลือกขนาดสายเมนกับเบรกเกอร์ พิกัดกระแสขึ้นกับวิธีติดตั้ง
บันทึกการเลือกสายเมนกับเบรกเกอร์ของฟีดเดอร์ใหม่ 253 A ทำไมสาย CV ขนาดเดียวกันรับได้ 227 A หรือ 364 A ขึ้นกับวิธีเดิน และทางเลือกลดขนาดสายลงเป็น 95 แล้วชดเชยด้วยกติกาการเปิดเครื่อง แลกกับการที่เมนจะทริปถ้าใครเปิดผิดกติกา

สายเมนละลายเป็นจุด ๆ วินิจฉัยฟีดเดอร์เกินพิกัดจากรอบทำงานจริง
บันทึกการวินิจฉัยสายเมน 95 ตร.มม. ที่ฉนวนละลายเป็นจุด ๆ ทั้งที่ระบบดูเหมือนใช้งานได้ปกติ ไล่จาก nameplate เครื่องซัก-อบ 6 เครื่อง 234.7 kW ไปจนถึงแบบจำลองกระแสรายนาที ที่อธิบายว่าทำไมโหลด 482 A บนสายที่รับได้ 180 A ยังไม่ทำให้ระบบล่มให้เห็น

แอปเก็บเอกสารหน้าเดียวด้วย PHP กับ SQLite ที่เก็บต้นฉบับไว้เสมอ
แอปเก็บรูปเอกสารสำหรับงานยื่นราชการที่ถ่ายจากมือถือหน้างาน ออกแบบให้หนึ่งการอัปโหลดกลายเป็นสามไฟล์ คือไฟล์ที่ใช้แสดง ไฟล์ต้นฉบับ และค่าครอปที่บันทึกไว้ กลับมาปรับใหม่ได้โดยไม่เสียคุณภาพ พร้อมการย้ายจาก JSON มาเป็น SQLite แบบดูดของเดิมเข้าให้เอง และการปิดโฟลเดอร์ข้อมูลส่วนบุคคลที่เว็บเซิร์ฟเวอร์

ทำเอกสารยื่นราชการหลายสิบแผ่นจาก HTML ให้กดพิมพ์เองแล้วตรงขอบ
ระบบเอกสารยื่นราชการที่ผู้ใช้กดปุ่มพิมพ์ในเบราว์เซอร์เองแล้วต้องได้ทุกแผ่นตรงขอบ ตั้งแต่การวัดพื้นที่พิมพ์จริงเป็นมิลลิเมตร หัวและท้ายที่ต้องซ้ำทุกหน้าโดยห้ามใช้ position fixed กรอบรูปสี่แบบตามชนิดของเอกสาร ไปจนถึงการตรวจหน้าล้นอัตโนมัติด้วย Playwright แทนการเปิดดูทีละแผ่น

ฟีดข่าวค้างสามวันทั้งที่งานรันครบ เพราะฟีดไม่ได้เรียงตามวันที่
หน้าแรกของเว็บข่าวค้างอยู่ที่ข่าววันเดิมสามวันติด ทั้งที่งานตามเวลารันครบ แปลครบ และรายงานผ่านทุกขั้น ต้นเหตุคือฟีด RSS เรียงตามความเกี่ยวข้องไม่ใช่วันที่ การเรียง pubDate แบบสตริงกลายเป็นเรียงตามชื่อวันในสัปดาห์ และการขอข่าวมาน้อยเกินไปจนด่านกรองตีตกหมดตั้งแต่ยังไม่ทันได้ดู

ส่งไฟล์จากงานอัตโนมัติเข้า Telegram กับเพดาน 50 MB ของ Bot API
วางบริการเล็ก ๆ ในเครื่องที่รับไฟล์จากสคริปต์แล้วส่งเข้า Telegram ให้ตัวเอง เป็นช่องทางออกทางเดียวล้วน ไม่มี polling ไม่รับคำสั่งกลับ พร้อมเพดานจริงของ Bot API ที่ต้องรู้ก่อนเขียน ทั้ง 50 MB ต่อไฟล์ รูปเกิน 10 MB ที่ต้องส่งเป็นเอกสาร และกับดักภาษาไทยใน curl บน Windows

พอร์ต CDP ยังตอบ แต่สั่งงานไม่ได้ เพราะ Chrome อัปเดตทับตัวเอง
เครื่องเดียวรันงานอัตโนมัติหลายตัวที่ต้องใช้เบราว์เซอร์จริง แล้วเจอสองเรื่องพร้อมกัน — งานแย่งแท็บกันเองจนได้ผลของคนอื่น และ Chrome อัปเดตไฟล์ทับตัวเองขณะโปรเซสยังรัน ทำให้พอร์ตยังตอบแต่สั่ง Runtime.evaluate ไม่ได้ บทความนี้คือวิธีแยกงาน วิธีตรวจให้เจอ และตัวซ่อมที่ทำงานเอง

ไฟดับ 25 ชั่วโมง แล้วงานตามเวลาที่พลาดไปหายไปเลย
เครื่องที่รันงานอัตโนมัติดับสามรอบในสามวัน รอบยาวสุด 25 ชั่วโมง พอกลับมาถึงรู้ว่างานที่ตั้งด้วย Task Scheduler ตรง ๆ หายไปทั้งรอบไม่รันชดเชย ส่วนงานที่ผ่านตัวสั่งงานซึ่งเทียบเวลาเองไล่ตามครบทุกตัว บทความนี้คือค่าที่ต้องเปิด สิ่งที่ห้ามทำตอนกู้ และกับดักที่ทำให้อ่านสถานะผิด

งานอัตโนมัติหยุดส่งรูป 4 วัน เพราะ subprocess เลือก ssh ตาม PATH
เขียน subprocess.run(["ssh", ...]) แล้วปล่อยให้ระบบเลือกไบนารีตาม PATH ของคนเรียก วันหนึ่งคนเรียกเปลี่ยน ไบนารีเปลี่ยนตาม งานส่งไฟล์ตายเงียบ 4 วันโดยรายงานว่าสำเร็จทุกครั้ง บทความนี้คือวิธีจับอาการ และตัวช่วยที่ probe ไบนารีจริงก่อนใช้ พร้อมด่านตรวจความครบก่อนบอกว่าเสร็จ

แยกลิงก์พังออกจาก ISP ล่ม ก่อนสั่งรีสตาร์ตอะไรบนเครื่อง
watchdog ที่เขียนกันทั่วไปคือ ping ไม่ผ่านแล้ว restart NetworkManager ซึ่งผิดครึ่งหนึ่งของเวลา เพราะเน็ตไม่ออกอาจแปลว่า ISP ล่ม ไม่ใช่การ์ดพัง บทความนี้แยกสามสถานะออกจากกันด้วย nmcli แล้วไต่บันไดจากเบาไปหนักถึงขั้น PCI remove และ rescan โดยไม่รีบูตเครื่อง

ยืม VLAN ให้เครื่องมือ Windows ที่ต้องอยู่ L2 เดียวกับอุปกรณ์
โปรแกรมค้นหาอุปกรณ์ของผู้ผลิตหลายเจ้าใช้ broadcast ซึ่งไม่ข้าม L3 ต่อ VPN เข้ามาก็ยังมองไม่เห็นอุปกรณ์ ทางออกที่ไม่ต้องแตะพอร์ตสวิตช์คือวาง VM Windows ตัวเล็กไว้บน Proxmox แล้วให้ขาของมันอยู่ใน VLAN นั้นตรงๆ พร้อมกับดัก vlan-aware bridge, thin pool ที่เต็มแล้วทำ VM อื่นพัง และ virtio ที่ทำให้ลง Windows แล้วไม่มีการ์ดเน็ต

คุมสวิตช์ทั้งไซต์จากนอกวง ด้วย cloud connector proxy ของ UniFi
เครื่องทำงานอยู่คนละที่กับไซต์ ไม่มี VPN ไม่เปิดพอร์ตเข้ามา แต่ยังต้องแก้ VLAN รายพอร์ต จอง fixed IP และไล่หาสายเสื่อมได้ บทความนี้เล่าว่า connector proxy ของ Site Manager ยิงต่อไปถึง API ตัวเก่าได้ทั้งอ่านและเขียน โดยไม่ต้องขอ CSRF และวินัยที่ต้องมีเวลาถือคีย์ที่ทำได้ขนาดนี้

ตั้ง VLAN บนสวิตช์ Hikvision ด้วย API ชุดเดียวกับที่หน้าเว็บมันใช้
สวิตช์ smart managed ที่ ISAPI หมวด Switch ตอบ 403 ยังคุมด้วยสคริปต์ได้ ถ้าไปดูว่าหน้าเว็บของมันยิงอะไร บทความนี้ถอด API ชุดนั้นออกมาเขียนเป็นตัวตั้ง VLAN แบบ dry-run ก่อน apply พร้อมกับดักที่เจอจริงทั้งชื่อฟิลด์ที่อ่านกับเขียนไม่ตรงกัน โหมด CCTV ที่บังคับ 10 Mbps และงบ PoE ที่คำนวณแล้วเกินเครื่อง

ใช้ NVR เป็นประตูเข้าหากล้องที่ยิงตรงไม่ถึง ด้วย ISAPI และ SDK
กล้องอยู่หลังขาที่สองของ NVR ยิงตรงไม่ถึงเลยสักตัว บทความนี้ไล่ว่า ISAPI ของ NVR ทำอะไรได้จริงบ้าง ใช้ได้ 26 จาก 38 endpoint ที่ลอง ดึงภาพนิ่งกับ RTSP ของกล้องวงปิดผ่าน NVR ค้นว่าช่องไหนบันทึกล่าสุดเมื่อไหร่ และตอนที่ ISAPI จนแต้มก็ลงไปเรียก HCNetSDK ผ่าน ctypes เพื่ออ่าน log ของเครื่อง

ทุกชั้นรายงานสำเร็จพร้อมกัน ทั้งที่ผลลัพธ์เป็นขยะ
วันเดียวเจอสี่ชั้นในงานอัตโนมัติชุดเดียวกันพังพร้อมกัน แต่ทุกชั้นรายงานว่าสำเร็จ ไม่มี error สักบรรทัด และคนที่ตรวจเจอคือผู้ใช้ที่ทักว่าของไม่อัปเดต บทความนี้คือกฎที่ผมเขียนขึ้นหลังจากนั้น เพื่อให้ขาที่พังส่งเสียงเองได้

โฮสต์ static บน DirectAdmin แล้ว GET ได้ 404 แต่ HEAD ได้ 200
อัปเว็บ static ขึ้น public_html แล้วเปิดไม่ได้ ไฟล์เล็กออกปกติ ไฟล์ใหญ่ 404 แต่ยิง HEAD กลับได้ 200 ทุกไฟล์ ต้นเหตุคือ .htaccess ของ Laravel ที่นั่งอยู่ที่ docroot ดูดทุกอย่างเข้า front controller บทความนี้เล่าทั้งการวินิจฉัยและทางออกสามทาง

audit ระบบ prod ที่มีข้อมูลลูกค้าจริง โดยไม่ทิ้งขยะสักแถว
เจ้าของระบบสั่งให้ทดสอบทั้งระบบบนเครื่องจริงที่มีข้อมูลลูกค้าอยู่ แล้วห้ามเหลือแถวขยะไว้แม้แถวเดียว วิธีที่ผมใช้คือ bootstrap Laravel เองแล้วเรียก controller ตรง ๆ ใน transaction ที่ rollback ทิ้ง พร้อมนับ COUNT ทุกตารางก่อนและหลังเป็นหลักฐาน

มี backup ครบทุกไฟล์ แต่สร้างเครื่องใหม่ไม่ได้
dump ฐานข้อมูลครบ tar โค้ดครบ ไฟล์ความลับครบ แต่พอเอาไปวางบนเครื่องเปล่าแล้วเว็บไม่ขึ้น เพราะของที่ทำให้เครื่องทำงานได้จริงไม่เคยอยู่ในไฟล์ backup เลย บทความนี้คือรายการของที่หายไปกับเครื่อง และลำดับกู้ที่ผมเขียนไว้ให้ตัวเองในอนาคต

backup รันสำเร็จทุกคืน แต่ของนอกเครื่องไม่มีเลย 3 สัปดาห์
cron รันครบทุกคืน ไฟล์ในเครื่องครบทุกวัน log เขียนว่าเสร็จ แต่ของบนที่เก็บนอกเครื่องไม่ขยับมา 3 สัปดาห์ และชุด 8 คืนแรกหายถาวรไปแล้วเพราะ rotate ในเครื่องกินไปก่อน บทความนี้คือการชำแหละว่ารูสองรูอะไรทำให้เงียบได้นานขนาดนั้น

ออกใบเสนอราคา PDF ภาษาไทยจาก HTML ด้วย Chromium และกับดักที่เจอ
ทำระบบออกใบเสนอราคาเป็น PDF จาก HTML ด้วย Chromium ให้รองรับหลายบริษัทในเครือและหลายเทมเพลต ตั้งแต่ error Executable doesn't exist ที่ไปหยิบ headless shell ผิดตัว การจัด A4 กับแบ่งหน้า การ sanitize ชื่อไฟล์ภาษาไทย จนถึงระบบเลขเอกสารแบบ token ที่เผลอใส่ slash แล้ว path พัง

ธรรมเนียมเขียนแบบโครงเหล็กไทย ให้ช่างหยิบไปสร้างได้จริง
โมเดลโครงเหล็กที่ดูสวยบนจอ แต่ช่างเปิดแบบแล้วส่ายหัว มักผิดที่ธรรมเนียมไม่กี่ข้อ ลำดับสมาชิก หน้าตัดที่หยิบจากกองได้ กฎซ้อนไม่ใช่สาน แปที่ต้องเป็นเหล็กตัว C เปิดปาก และการเลือกหน้ารับบนคานเอียงที่พลาดแล้วเหล็กกินกัน

ย้ายการคำนวณจาก PHP ไปทำในเบราว์เซอร์: 12 วินาที เหลือ 12 มิลลิวินาที
หน้าเดียวยิง subquery หลักหมื่นครั้งจนโหลดนาน 12 วินาที ผมแก้ด้วยการทำตารางสรุปไว้ล่วงหน้า ส่ง dataset ก้อนเดียว 107 KB แล้วย้ายสูตรไปคำนวณในเบราว์เซอร์ เหลือ 12 มิลลิวินาที พร้อม parity test ที่บังคับให้ผลฝั่ง JS ตรงกับ PHP ทุกแถว

นำเข้าขอบเขตแปลงที่ดินจากระบบแผนที่ราชการเข้า SketchUp
โมเดล SketchUp ที่ใส่ Add Location แล้วมีภาพถ่ายดาวเทียมอย่างเดียว ไม่มีเส้นแบ่งแปลง บทความนี้เล่าวิธีดึงขอบเขตแปลงผ่าน WFS มาตรฐาน OGC ที่ต้องส่ง viewparams ไม่งั้นได้ศูนย์ฟีเจอร์ แปลงพิกัด UTM47 เป็น WGS84 แล้ววางลงโมเดลด้วย latlong_to_point ให้ตรงกับภาพพอดี

ขับ AutoCAD จาก PowerShell ผ่าน COM — วาดแบบด้วยสคริปต์
AutoCAD เปิด COM ไว้ให้เขียนสคริปต์สั่งได้เหมือน Excel เกาะเข้าตัวที่เปิดอยู่ด้วย New-Object แล้ววาดเส้น วงกลม ข้อความ กล่องสามมิติ สร้างเลเยอร์ ใส่เส้นบอกระยะ และเซฟไฟล์ได้ครบจาก PowerShell พร้อมกับดักสี่ข้อที่เจอมาเองรอบเดียวจำไปตลอด

สั่งงานอัตโนมัติบนเครื่อง Windows ระยะไกลผ่าน SSH + Task Scheduler
ยก workload หนักไปรันบนเครื่องแรงอีกตัวผ่าน SSH แล้วตั้งให้วิ่งเองด้วย schtasks — พร้อมกับดักที่เสียเวลาจริง ตั้งแต่ ssh เข้าไปแล้วเจอ PowerShell 5 ไม่ใช่ bash, backslash โดนกินตอนเขียนไฟล์ .bat, จนถึงเคส push ไฟล์ออกแล้วค้างนิ่งที่แก้ด้วย plink

ดักโปรโตคอลเครื่องพิมพ์ฉลากบลูทูธจาก btsnoop แล้วสั่งพิมพ์เอง
เครื่องพิมพ์ฉลากบลูทูธที่มีแต่แอปบนมือถือ ต่อเข้าระบบตัวเองไม่ได้ ผมเลยเปิด HCI snoop log บนมือถือของตัวเอง ลอก HCI/ACL/L2CAP/RFCOMM ออกทีละชั้นด้วย parser Python สั้นๆ แล้วเทียบกับไลบรารีโอเพนซอร์สจนอ่านคำสั่งออก และสั่งพิมพ์เองได้จากสคริปต์

ออดิตกล้อง CCTV ในวงเองด้วย ISAPI กับ ffprobe RTSP ไม่ผ่าน NVR
หน้าจอ NVR บอกแค่ว่ากล้องออนไลน์ ไม่ได้บอกว่ารุ่นอะไร firmware ค้างปีไหน หรือสตรีมจริงเป็นความละเอียดเท่าไหร่ บทความนี้เขียนสคริปต์ยิง ISAPI deviceInfo ตรงเข้ากล้องทีละตัว แล้วใช้ ffprobe ดึงค่าจากสตรีม RTSP จริง เพื่อทำ inventory กับ health check ระบบกล้องที่เราดูแลอยู่

วางแผนช่อง WiFi 2.4GHz ไม่ให้ทับกัน 1/6/11 พร้อมทำ heatmap หลายชั้น
อาคารห้าชั้น ชั้นละเจ็ดจุด ต้องวางช่อง 2.4GHz ให้ไม่ทับกันทั้งแนวราบและแนวตั้ง บทความนี้ลงรายละเอียดหลัก 1/6/11 ตารางแผนช่องต่อชั้น ค่า Tx power กับ RSSI threshold ที่ตั้งจริง แล้วเขียนสคริปต์ Python วางป้ายช่องลงผังชั้นด้วย PIL ก่อนเดินวัดทำ heatmap

สำรวจสวิตช์และ AP ด้วย SNMP walk ดึงตาราง MAC ต่อพอร์ตมาทำ inventory
ไม่มี controller ไม่มี NMS ก็ทำ inventory ชั้น 2 เองได้ เขียน SNMP walk ด้วย pysnmp asyncio ดึง sysDescr, ifTable และตาราง bridge FDB แล้วแปลง OID index กลับเป็น MAC เพื่อรู้ว่าอุปกรณ์ตัวไหนเสียบพอร์ตไหนของสวิตช์ตัวไหน

เขียนแอปมอนิเตอร์ ping จอเดียวด้วย C++ ImGui กับ DirectX 11
แอปเล็กๆ ที่ ping อุปกรณ์ทั้งวงพร้อมกันแล้วสรุปลงจอเดียว ยิง ICMP ตรงผ่าน iphlpapi ไม่เรียก ping.exe แยกหนึ่ง thread ต่อหนึ่ง host คุยกับ UI ด้วย std::atomic วาดด้วย Dear ImGui บน DirectX 11 แล้ว build ด้วย CMake กับสคริปต์ PowerShell ตัวเดียวจบ

อ่าน uptime อุปกรณ์ที่ไม่มี SNMP/SSH/API ด้วย TCP timestamp
กล้อง IP เครื่องคุมประตู และอุปกรณ์ฝังตัวจำนวนมากไม่มีทั้ง SNMP SSH และ API ให้ถาม uptime แต่ถ้ามันตอบ TCP timestamp มาด้วย เราอ่านเวลาบูตของมันได้จากนอกบ้านโดยไม่ต้อง login เลยสักครั้ง

crontab ของ user เว็บ ไม่ใช่ crontab ที่ cron รันจริง
แก้ตารางเวลาผ่านหน้าเว็บแล้วงานยังยิงตามเวลาเก่า เพราะสคริปต์เขียน crontab ของ user ที่เว็บรันอยู่ ไม่ใช่ของ user ที่ cron อ่านจริง วิธีตรวจให้เจอใน 3 คำสั่ง sudoers drop-in ที่ใช้ และวิธีออกแบบไม่ให้มันหลุดอีก

เก็บ secret ใน .env แบบเข้ารหัส แล้วถอดอัตโนมัติตอน config โหลด
วิธีเก็บรหัสผ่านและ API key ใน .env ของ Laravel เป็น ciphertext แล้วให้ config ถอดกลับเองตอนโหลด ด้วย helper ตัวเดียวที่ตรวจเองว่าค่าไหนเข้ารหัสไว้ พร้อมกับดัก APP_KEY ต่าง environment ที่ทำให้ระบบล่มทั้งชุดถ้าพลาด

คิวงาน Laravel บน shared host — อย่าเอาคิวไว้ Redis ตัวเดียวกับ cache
จะเปิด queue ให้ Laravel บน shared host แล้วคิดจะแยก REDIS_DB ให้คิวอยู่คนละเบอร์กับ cache — ไม่ช่วยครับ เพราะ maxmemory กับ eviction เป็นของทั้ง instance ไม่ใช่ของราย DB บทความนี้เล่าเหตุผลที่ผมเลือก database driver แทน พร้อม systemd unit เต็ม ๆ ที่ใช้แทน Supervisor

Laravel หลัง proxy เห็น IP เป็น 127.0.0.1 — ฟอร์มเงียบ ไม่มี error
ฟอร์มติดต่อบน DirectAdmin กดส่งแล้วขึ้นว่าไม่ใช่คน เมลไม่ออก แต่ log ทุกชั้นเงียบสนิท — ต้นเหตุคือ Laravel หลัง nginx-to-apache เห็น $request->ip() เป็น 127.0.0.1 ทำให้ด่านตรวจบอทไม่ผ่านแล้ว return ก่อนถึงบรรทัดส่งเมล พร้อมเหตุผลว่าทำไม TrustProxies ห้ามใส่ '*'

WAF ตอบ 406 เพราะข้อความไทยใน POST — แก้ยังไงเมื่อไม่ใช่ root
ModSecurity บนโฮสต์ตอบ 406 ใส่ข้อความไทยบางประโยคใน POST body ทำให้ฟอร์มบันทึกไม่ได้ — แต่เราเป็นแค่ผู้เช่า แก้ rule เองไม่ได้ บทความนี้คือวิธี isolate หาท่อนที่โดนแบบ black-box แล้วอ้อมด้วย JS encode ตอน submit + middleware decode กลับฝั่ง Laravel

Googlebot โดนไฟร์วอลล์ตัวเองแบนถาวร จนเว็บหายจากผลค้นหา
ไล่ตรวจว่าทำไมเว็บหายจากผลค้นหา แล้วเจอ Googlebot นอนอยู่ในรายการแบนถาวรของไฟร์วอลล์ตัวเอง 408 จาก 500 แถวมาจากตัวนับ false positive ของ WAF วิธีปลดแบน สคริปต์ดึงช่วงไอพีทางการของบอทมาใส่ ignore list ทุกวัน กับดัก grep และผลข้างเคียงของการบล็อกทั้งประเทศ

MariaDB ที่ยังใช้ค่า default — buffer pool 128M บนเครื่อง RAM 55 GB
เครื่อง 16 core RAM 55 GB SSD แต่ MariaDB ยังใช้ buffer pool 128 MB ตามค่าติดตั้ง ผลคืออ่านดิสก์ไป 50 ล้านครั้งใน 5 วัน ค่าก่อนหลังทั้งชุด กับดักชื่อ service กับ path config บน DirectAdmin/Debian วิธี rollback และ MyISAM อีก 500 ตารางที่รอแปลง

AI crawler ยิง ?add-to-cart= จนโหลดพุ่ง — บล็อกยังไงไม่ให้เสีย SEO
โหลดเซิร์ฟเวอร์พุ่งจนได้เมลเตือน ไล่ log แล้วพบว่า 84% ของทราฟฟิกทั้งวันมาจาก AI crawler ตัวเดียวที่ไล่กดลิงก์ add-to-cart ทุกสินค้า ปิดเป็นชั้น ๆ ด้วย robots.txt, rel=nofollow และ nginx limit_req โดยหน้าสินค้ายังถูก index ครบ

นำเข้าไฟล์ .xls จากระบบเก่าหลายร้อยไฟล์ลง Laravel ด้วย PhpSpreadsheet
ไฟล์ .xls จากระบบเก่าที่หัวตารางภาษาไทยเป็น tis-620 อ่านชื่อคอลัมน์ไม่ได้ ไฟล์ใหญ่ทำ PhpSpreadsheet กิน memory จนล้ม และไฟล์ที่ผู้ใช้รวมเองก็มีแถวซ้ำในตัวเอง — เลิกอ่านชื่อคอลัมน์แล้วนับตำแหน่งแทน ใส่ read filter และกันซ้ำด้วย natural key

เครื่องในโรงงานหลัง NAT ขึ้นคลาวด์ ด้วย push snapshot + คิวคำสั่ง
เครื่องงานจริงอยู่ใน LAN หลัง NAT ไม่มี public IP แต่เจ้าของอยากดูข้อมูลบนเว็บคลาวด์และแก้ข้อมูลจากมือถือให้ลงไปถึงเครื่องใน — ทำได้โดยไม่เปิดพอร์ตไม่ตั้ง VPN ด้วย push snapshot + คิวคำสั่งแก้ + ack แบบ idempotent

ซ่อมไฟล์ session .jsonl ของ Claude Code ที่บวม 38 MB จนเปิดไม่ขึ้น
session เดียวที่ลากยาว 8 วันโตเป็น 38.61 MB / 11,537 records จน UI เปิดประวัติไม่ขึ้น เลยเขียนสคริปต์ Python ไล่ทีละบรรทัด ตัดเฉพาะส่วนที่มนุษย์อ่านไม่ได้อยู่แล้ว เหลือ 17.41 MB โดยข้อความคนกับผู้ช่วยครบ 8,171 uuid ลำดับเดิม ไม่มี orphan

mailbox รหัสรั่ว ส่งสแปมออก 1,786 ฉบับ โดยที่ CSF/LFD ไม่เห็น
เคสจริงของ mailbox ที่ถูกขโมยรหัสแล้วใช้ยิงสแปมออกนอกวันละ 50-75 ฉบับใต้เพดาน 200 ติดต่อกัน 4 สัปดาห์ โดย CSF/LFD/BFM ไม่ขยับเลยสักครั้ง เพราะมันนับแค่ auth ที่ล้มเหลว พร้อมคำถามชี้ขาดว่าโดนแฮ็กจริงหรือแค่โดนถล่ม ชุดคำสั่ง forensics บน exim และ playbook ขอปลดออกจาก blocklist

charset ไม่ตรง ทำ index ตายเงียบ ตอน JOIN ข้ามฐาน — mirror utf8mb4
ฐานเก่าเป็น tis620 ฐานใหม่เป็น utf8mb4 พอ JOIN ข้าม database ปุ๊บ index ทุกตัวกลายเป็นของประดับทันทีโดยไม่มี error สักบรรทัด — วิธีพิสูจน์ด้วย EXPLAIN และวิธีทำ mirror แปลง tis620 เป็น utf8mb4 ตอน dump พร้อมกับดัก sed ที่ทำตารางพังเงียบ ๆ

query เดียวค้าง 54 นาที ทำเว็บล่ม 504 ทั้งเว็บ เพราะ MyISAM lock
ตารางเดียวขนาด 30 MB ทำให้เว็บทั้งระบบขึ้น 504 ทุกหน้า ทั้งที่ RAM ยังว่าง 9.5 GB — ไล่จาก information_schema.PROCESSLIST จนเจอ SELECT ตัวเดียวที่ค้าง 54 นาทีบนตาราง MyISAM แล้วลามเป็น metadata lock ทั้งเซิร์ฟเวอร์ พร้อมวิธีแก้เฉพาะหน้าและวิธีกันไม่ให้เกิดซ้ำ

ย้ายบอร์ด vBulletin 4.2.5 ไป Flarum: บทเรียนจากสองแสนโพสต์
ย้ายฟอรัมเก่า vBulletin 4.2.5 ที่มีสมาชิกเจ็ดพันกว่า กระทู้สองหมื่นกว่า และโพสต์สองแสนกว่า ไปอยู่บน Flarum — บันทึกกับดักที่เสียเวลาจริง ตั้งแต่ guest userid 0 ที่ทำ FK พังทั้งชุด, md5 ซ้อน md5 ของรหัสผ่านเก่า, การแปลง BBCode เป็น s9e XML, attachment ที่อยู่บนดิสก์ไม่ใช่ใน DB ไปจนถึงเหตุผลที่ต้อง scp สคริปต์แทน heredoc

กู้ MariaDB ที่ InnoDB redo-log เสียด้วย force_recovery แล้ว reinit
MariaDB สตาร์ทไม่ขึ้นหลังเครื่องดับไม่สะอาด — InnoDB redo log เสีย ลาก system table mysql.global_priv พังตาม นี่คือลำดับกู้จริง เริ่มจาก innodb_force_recovery ให้พออ่านได้ แล้ว dump ทีละ db ก่อน reinit ระบบใหม่ทั้งก้อน พร้อมกฎว่าอย่าดันเลข force_recovery เกินจำเป็น

ตั้ง DirectAdmin Admin Backup cron จาก CLI ไม่ต้องกดผ่าน panel
หน้า CMD_ADMIN_BACKUP ให้คลิกตั้ง cron ทีละห้าขั้น แต่จริงๆ DirectAdmin แค่ต่อท้ายบรรทัดเดียวลงไฟล์ backup_crons.list แล้วปล่อยให้ dataskq เก็บไปทำ วิธีเขียนตรงเข้าไฟล์จาก CLI พร้อมกับดัก when=now, base64 และ append_to_path ที่คนมักพลาด

นำเข้า/ย้ายข้อมูลไทยให้ไม่พัง: กับดัก VARCHAR, idempotency, สระ OCR
บทเรียนจริงจากงานนำเข้า/ย้ายข้อมูลไทยหลายแสนแถว — VARCHAR สั้นไปตัด synthetic key จนชนกันเงียบๆ, idempotency ที่ต้อง DELETE ก่อน INSERT ไม่งั้นยอดพุ่ง 200%, collation ที่มอง su001 กับ SU001 เท่ากันแต่เก็บทั้งคู่, และสระไทยเพี้ยนจาก OCR ที่ต้องมี normalization map ก่อน insert

port สูตร Excel มาเว็บให้ตรงทุกตำแหน่งทศนิยม: กับดัก floating point
พอร์ตสูตรวิศวกรรมจากไฟล์ Excel มาเป็นเครื่องคำนวณเว็บ แล้วค่าไม่ตรงที่หลักทศนิยม 1e-13 — ไม่ใช่บั๊กคณิตศาสตร์ แต่เป็นลำดับการยกกำลังและการคูณของ floating point ที่ JS กับ Excel ประเมินไม่เหมือนกัน พร้อมวิธีอ่านสูตรสองชั้นด้วย openpyxl และทำ fixture ให้จับ regression ได้จริง

ทำ Android dev บน MIUI/HyperOS แล้ว adb ทำงานไม่ได้ — กับดักบน Windows
adb ไม่ได้พังหรอกครับ แต่ Git Bash แปลง path /sdcard ให้เพี้ยน, PowerShell ทำไฟล์ screenshot เป็น 0 ไบต์, MIUI/HyperOS บล็อกการติดตั้งครั้งแรก และ here-string กลืน backslash เวลาปั้นโค้ด PHP — รวมกับดักจริงตอนทำแอป Android บน Windows พร้อมคำสั่งที่ใช้ได้จริง

อนุมานจังหวะ defrost ห้องเย็นจากความชันอุณหภูมิ ไม่ง้อเซนเซอร์ความชื้น
ห้องเย็นรีดน้ำวุ้นเส้นไม่มีเซนเซอร์ความชื้นสักตัว แต่ frost ที่เกาะคอยล์ทำให้ความชันการลดอุณหภูมิ (dT/dt) ราบลงเสมอ บทความนี้ใช้สมการ lumped-capacitance กับ time-constant τ จับ frost แล้วสั่ง defrost แบบ demand ด้วย Python จริง พร้อมคำนวณ COP ของ R404A และน้ำที่รีดออกต่อรอบ

เกณฑ์ราคากลางคอมพิวเตอร์ ICT ภาครัฐ + จัดสเปก DIY ด้วยสคริปต์
เกณฑ์ราคากลาง ICT ภาครัฐ ฉบับ ธ.ค. 2568 กำหนดสเปกเครื่องสำนักงาน 20,000 บาท และเครื่องประมวลผล 24,000 บาทไว้ชัด บทความนี้อ่านเกณฑ์จริงทีละข้อ แล้วเขียนสคริปต์ Python ดึงราคา Advice มาจัดสเปก DIY เทียบว่าประกอบเองคุ้มกว่าซื้อสำเร็จรูปแค่ไหน

เล่นกล้อง AI reCamera + gimbal: cross-compile RISC-V + CAN + Node-RED
reCamera คือกล้อง AI บนชิป RISC-V ที่วางอยู่บนแกน brushless สองแกน สั่งหมุนผ่าน CAN bus ได้ละเอียดระดับ 0.01 องศา บทความนี้ไล่ตั้งแต่ cross-compile ภาษา C สำหรับ riscv64 musl, scp ขึ้น device, โครงสร้าง CAN frame ที่คุมมอเตอร์, อ่าน encoder 15-bit กลับมา, การหาศูนย์มอเตอร์ด้วยกระแส, ไปจนถึง Node-RED dashboard + PID + auto-track และไฟล์ STP พิมพ์เคส 3D

เกณฑ์ราคากลาง CCTV ภาครัฐ MDES 2564 กับการออกแบบ BOM Hikvision PoE
อ่านเกณฑ์ราคากลางและคุณลักษณะพื้นฐานของระบบกล้องวงจรปิดภาครัฐ ฉบับ มิ.ย. 2564 ของ MDES ให้ครบก่อนตั้งงบ แล้วออกแบบ BOM Hikvision IP/PoE ให้ผ่านทั้งสเปกขั้นต่ำ เพดานราคากลาง กฎเก็บภาพย้อนหลัง 30 วัน และเงื่อนไขต้องแข่งได้อย่างน้อย 3 ยี่ห้อ

ต่อเครื่องชั่ง RS-232 Toledo ผ่าน Bluetooth อ่านด้วย PowerShell
ต่อเครื่องชั่งดิจิทัล TWT-01 ที่มีแต่พอร์ต RS-232 เข้าพีซีผ่านตัวแปลง Bluetooth BT578 แล้วอ่านน้ำหนักเรียลไทม์ด้วย PowerShell — ไล่ตั้งแต่จับคู่ Bluetooth หา COM port จาก MAC แกะ frame ของ Toledo Continuous 18 ไบต์ ไปจนถึงกับดัก null byte กับ scale auto-sleep ที่เจอจริงตอนใช้งาน

คุม TP-Link Omada OC200 ผ่าน REST API ด้วย Python
วิธี login เข้า OC200 controller ผ่าน REST API v2 ด้วย Python จริง — จัดการ CSRF token, self-signed cert, ดึง site/devices/SSID/DHCP/port-forward แล้วเขียนกลับด้วย PATCH พร้อมกับดัก read-only fields ที่ทำให้ errorCode ไม่เป็น 0

ทำ network-as-code บน MikroTik RouterOS
แนวคิด network-as-code สำหรับ MikroTik — ดึง /export ออกมาเก็บเป็นไฟล์, ล้าง secret ด้วยสคริปต์ sanitize ก่อนแชร์, แยกหมวด แล้ว generate config หลายไซต์จากเทมเพลต Jinja2 + ค่า variables ชุดเดียว

อ่านมิเตอร์ 3 เฟส DTSU666 ด้วย Raspberry Pi ผ่าน Modbus RS485
บันทึกการต่อ DTSU666 Smart Power Sensor เข้ากับ Raspberry Pi ผ่าน RS485 อ่านค่าไฟ 3 เฟสจากหลายมิเตอร์ด้วย Modbus RTU decode float 32-bit ให้ถูก แล้วเก็บลง SQLite/MySQL ก่อนส่งออก MQTT กับ REST API พร้อมบั๊กค่าติดลบที่ผมเจอเอง

แคปหน้าจอเว็บทีละหลายโดเมน + บังคับให้ชนเซิร์ฟเวอร์ต้นทาง ข้าม Cloudflare
ต้องแคปหน้าจอเว็บทีละหลายสิบโดเมนเพื่อตรวจ หรืออยากยืนยันว่าเซิร์ฟเวอร์ต้นทาง (ไม่ใช่ CDN cache) render ถูก — แต่ flag screenshot ของ Chrome พังตั้งแต่รุ่น 132 และแก้ hosts ก็โดน AV คืนค่า บทความนี้ใช้ Playwright override DNS ระดับโปรเซส จบทั้งสองปัญหา

~30 วินาที กลายเป็นตัวห้อยจิ๋ว — กับดัก Litedown ของ Flarum ที่คนไทยเจอบ่อย
เขียนโพสต์ Flarum ว่า "~30 วินาที" แล้วเลข 30 กลายเป็นตัวห้อยจิ๋วลอยอยู่ — เพราะ Litedown ของ Flarum ตีความ ~ เป็นตัวเปิด subscript คนไทยที่ใช้ ~ แทน "ประมาณ" เจอกันประจำ บทความนี้อธิบายสาเหตุ วิธีเลี่ยง และการแก้ผ่าน DB ที่เก็บเป็น s9e XML ไม่ใช่ markdown ดิบ

ตรวจ security เว็บ Laravel ที่ deploy แล้ว — ไล่ 3 ชั้นตามลำดับที่ควรแก้
หลัง deploy Laravel ขึ้น production ควรไล่ตรวจความปลอดภัย 3 ชั้น — external probe หา endpoint ที่รั่ว, ตรวจไฟล์/สิทธิ์บนเซิร์ฟเวอร์, แล้ว grep หาช่องในโค้ด บทความนี้ให้ชุดคำสั่งพร้อมลำดับความสำคัญ P0-P2 ที่ควรแก้ก่อนหลัง

ย้ายโดเมนเข้า Cloudflare แล้วเมลหาย — เพราะ record เมลถูกเปิดพร็อกซี (ส้ม)
เพิ่มโดเมนเข้า Cloudflare ให้ DNS ตรงกับโฮสต์แล้วอยู่ดี ๆ เมลส่งเข้าไม่ได้ — สาเหตุที่เจอบ่อยสุดคือปล่อย record mail/smtp/pop เป็นพร็อกซี (เมฆส้ม) ทั้งที่พร็อกซี Cloudflare แบกแค่ HTTP/S บทความนี้สรุปกฎ record ไหนต้องเทา + กับดัก token/SSL

nginx โดน heap overflow ย้อนหลัง 15 ปี — แต่เช็คแค่เวอร์ชันไม่พอ
CVE-2026-42533 กินเวอร์ชัน nginx ตั้งแต่ 0.9.6 ถึง 1.31.2 คือย้อนหลัง 15 ปี แต่จะโดนจริงหรือไม่อยู่ที่ config ไม่ใช่เวอร์ชัน ปัญหาคือเงื่อนไขที่ข่าวสรุปกันแคบกว่าของจริง เช็คตามข่าวแล้วจะได้ผลว่า "ปลอดภัย" ทั้งที่ยังเข้าเงื่อนไขอยู่

เขียนสคริปต์บน Windows ไปรันบน Linux — สองกับดักที่ทำไฟล์ค้างเซิร์ฟเวอร์
เขียน helper script บน Windows แล้ว scp ขึ้นไปรันบน Linux เป็นงานประจำ แต่มีสองอย่างที่กัดซ้ำ ๆ — path แบบ d:\ ที่ฝังในสคริปต์กลายเป็นชื่อไฟล์ประหลาดใน /tmp จนโดน file monitor จับ และไฟล์ token/payload ที่ลืมลบทิ้งไว้บนเซิร์ฟเวอร์ บทความนี้สรุปกฎกันพลาด

audit ความปลอดภัยเซิร์ฟเวอร์ Debian shared-host แบบ read-only — เริ่มยังไงไม่ให้แบนตัวเอง
ตรวจความปลอดภัยเซิร์ฟเวอร์ Debian ที่รัน DirectAdmin แบบ read-only ก่อน — แต่กับดักแรกคือทราฟฟิกจากการ scan เองเข้าเงื่อนไข brute-force ของ CSF จนแบน IP ตัวเอง บทความนี้วางลำดับ audit ที่ปลอดภัย + จุดที่ต้องดูในยุค 2024-2026

อ่าน Modbus RTU ผ่าน gateway RS485 ให้ไม่ได้ค่าผี — บทเรียนจากงานจริง
ต่อมิเตอร์/เซนเซอร์ Modbus RTU หลายตัวบนบัส RS485 ผ่าน serial-to-Ethernet gateway แล้วเจอค่าผี ค่าเพี้ยน หรืออุปกรณ์ที่ไม่มีอยู่จริงโผล่มา — เพราะ transparent gateway คือ RTU-over-TCP ที่ต้องประกอบเฟรม+CRC เอง และต้อง validate ทุก reply บทความนี้สรุปกฎที่ได้จากการทำจริง

สร้าง .ppk ให้ plink/pscp บน Windows โดยไม่ต้องเปิด puttygen
puttygen.exe บน Windows เป็น GUI ล้วน สั่งแปลง OpenSSH เป็น .ppk แบบ batch ไม่ได้ (เด้ง unrecognised option) — บทความนี้เขียนไฟล์ PPK v3 ตรง ๆ ด้วย Python พร้อมสูตร MAC HMAC-SHA-256 ที่หาอ่านยาก ใช้กับ plink/pscp/WinSCP ได้ทันที

สร้าง QR พร้อมเพย์ (EMVCo) ด้วย Python ล้วน — ไม่ต้องพึ่งไลบรารีนอก
อยากออก QR รับเงินพร้อมเพย์ในระบบ POS/เว็บของตัวเอง โดยไม่ต้องเรียก API ธนาคาร — บทความนี้ประกอบสตริง EMVCo TLV + CRC16 เองด้วย Python ล้วน ได้ payload ตรงสเปกไทยคิวอาร์ สแกนจากแอปธนาคารไหนก็จ่ายได้ พร้อมกับดักที่ทำให้แอปสแกนไม่ติด

ส่ง USB เข้า WSL2 ด้วย usbipd-win — ให้ Linux บน Windows จับฮาร์ดแวร์จริง
WSL2 มองไม่เห็นอุปกรณ์ USB เพราะเป็น VM ที่ไม่มี USB controller — usbipd-win ส่งอุปกรณ์จาก Windows ข้ามไปให้ kernel ของ WSL ตรงๆ ด้วย 3 คำสั่ง list/bind/attach พร้อมข้อควรรู้จากงานจริง: attach หลุดตอนถอดสาย, กับดัก CRLF และ USB modem แย่ง default route

libmodsecurity3 + nginx — exclusion ที่ใช้ได้จริงมีแบบเดียว: ctl:ruleEngine
ModSecurity v3 (libmodsecurity3) + nginx + OWASP CRS — ctl:ruleRemoveById ที่ตำราสอนกันไม่ทำงานและเงียบสนิท บทความนี้สรุปจากการลองครบทุกท่า: ของที่ใช้ได้จริงคือ ctl:ruleEngine จำกัดขอบเขตด้วย chained rule Host+URI และไฟล์ exclusion ต้องโหลดก่อน CRS

ลูกค้าเช็คเมลแล้วโดน firewall แบนยกออฟฟิศ — แก้ด้วย auto-whitelist จาก login
พฤติกรรมลูกค้าเมลจริงหน้าตาเหมือน bot เป๊ะ — เครื่องในออฟฟิศยิงรหัสเก่ารัวๆ จนโดน CSF แบนทั้งวง บทความนี้เล่าระบบ auto-whitelist ที่เกาะเหตุการณ์ login สำเร็จ + GeoIP ไทย แล้ว temp allow 24 ชั่วโมง พร้อมกับดัก 5 ข้อที่เจ็บมาแล้ว

Redis แยกต่อ user บน shared hosting — และบั๊ก maxmemory ที่ทำเว็บค้าง
ออกแบบ Redis หนึ่ง instance ต่อหนึ่ง user บน shared hosting ด้วย systemd template + cgroup — และบทเรียนบั๊ก maxmemory ที่ตั้งเกินเพดาน cgroup แล้วทำเว็บ WooCommerce ค้างเป็นพักๆ พร้อมกฎ 80% และ guard script กันเกิดซ้ำ

ให้ทีม 7 คน remote เข้า LAN โดยไม่เปิด port — Cloudflare Zero Trust ฉบับทำจริง
ทีมงาน 7 คนต้อง RDP เข้าเครื่องใน LAN โดยห้ามเปิด port ออก internet — สรุปสถาปัตยกรรม Cloudflare Zero Trust (WARP + cloudflared) พร้อม 3 บทเรียนจากการทำจริง: IdP ที่ลืมตั้ง, Gateway default ที่ผ่านหมด และ default-deny ที่คนลืมบ่อยสุด

WordPress ขึ้น 500 บางหน้า แต่ debug.log ว่าง — fatal จริงอยู่ที่ apache log
WordPress ขึ้น 500 เฉพาะหน้า portfolio แต่ debug.log ว่างเปล่า — เพราะ fatal ที่เกิดตอน theme render เกิดก่อน WP logging พร้อม ต้องไปหาความจริงที่ apache error log (proxy_fcgi) พร้อมวิธีแก้ child theme ที่ก๊อป template ค้างจาก parent รุ่นเก่า

AdSense บอก ads.txt "ไม่พบ" ทั้งที่ไฟล์อยู่ — ไล่ log พิสูจน์ทีละชั้น
หน้า Sites ของ AdSense ขึ้น ads.txt "ไม่พบ" ทั้งที่ไฟล์อยู่ครบถูกต้อง — บทความ forensics ไล่พิสูจน์ทีละชั้นด้วย curl + access log ว่า Googlebot เคยมาแล้วได้อะไรกลับไป สรุปคดี: ไม่มีใครบล็อค มันคือสถานะค้างของ Google เอง

กู้รูปเว็บเก่าที่หายไป ด้วย Wayback Machine CDX API + Python
เว็บเก่าอายุสิบกว่าปีรูปแตกทั้งเว็บเพราะ hotlink จาก CDN ที่ตายแล้ว — เขียนสคริปต์ Python ดึงรายการรูปจาก Wayback Machine CDX API แล้วกู้กลับมาวางที่ path เดิมโดยไม่แตะ HTML สักตัวอักษร พร้อมสคริปต์เต็มที่ใช้จริง

แอปเก่าพังหลังย้ายเซิร์ฟเวอร์ — error 1364/1366 กับ MariaDB strict mode
ย้ายเว็บจากเซิร์ฟเวอร์เก่ามาเครื่องใหม่แล้วฟอร์มสมัครสมาชิกพังทั้งที่โค้ดไม่เปลี่ยน — ต้นเหตุคือ STRICT_TRANS_TABLES ใน sql_mode ของ MariaDB รุ่นใหม่ พร้อมวิธีแก้ 3 ระดับ ตั้งแต่ conf.d จนถึง SET SESSION รายแอป

โดเมน .com โดนยึด — ย้ายทั้งเว็บไป .net บน DirectAdmin แบบข้อมูลไม่หาย
โดเมน .com หมดอายุหลุดไปอยู่กับ domain squatter — เล่าวิธีย้ายทั้งเว็บ (ไฟล์/เมล/DNS/SSL) ไปโดเมน .net ใหม่บน DirectAdmin ด้วย CMD_CHANGE_DOMAIN คำสั่งเดียว พร้อมงานหลังบ้าน 4 อย่างที่ไม่ตามมาอัตโนมัติ

ใช้ Claude อัป Proxmox 8 ขึ้น 9 แล้วสร้าง Windows VM ใหม่ทั้งคลัสเตอร์
เคสจริง ใช้ VS Code + Claude อัป Proxmox 8 ขึ้น 9 ทั้ง cluster แล้วล้างสร้าง Windows VM ใหม่ทั้งหมดแบบ VDI โดยไม่ได้ ssh เข้าเครื่องเองเลยสักครั้ง ถอดคำสั่งและสคริปต์ที่ Claude สร้างระหว่างทำงานจริงออกมาเป็นขั้นตอน ให้คนหรือ AI อ่านแล้วเอาไปสั่งทำซ้ำได้จริง

ใช้ Claude ตัดวิดีโอด้วยการพิมพ์สั่งเป็นภาษาไทย ไม่ต้องเปิดโปรแกรมตัดต่อ
วิธีที่ผมใช้จริง เอา Claude ใน VS Code มาสั่งตัด ย่อ รวม ใส่เพลงประกอบวิดีโอด้วยการพิมพ์ภาษาไทย ไม่ต้องจำคำสั่ง ffmpeg ไม่ต้องเปิดโปรแกรมตัดต่อ พร้อมวิธีให้ AI แต่งเพลงเอง เร่งด้วยการ์ดจอ NVIDIA และฝั่ง Mac กับ Linux สำหรับคนไม่เคยใช้ Claude มาก่อน

คุม Linux server ด้วย AI ผ่าน SSH ให้ปลอดภัย ไม่เผลอพังระบบ
วิธีที่ผมใช้จริงในการเอา Claude มาช่วย audit และแก้ security ของ Linux server ผ่าน SSH ตั้งแต่เตรียมเครื่อง เก็บความลับ ไปจนกฎเหล็กก่อนแตะ production

ปลุก VPS ที่เช่าค้างไว้ ทำ WireGuard เข้าบ้าน — คู่มือ client ฉบับเต็ม
เปลี่ยน VPS ที่เผลอเช่ารายปีไว้ให้เป็นจุดนัดพบ WireGuard เข้าวง LAN ที่บ้านได้ตลอดเวลา โดยไม่ต้อง forward port — ครบตั้งแต่ลงแอป import config สแกน QR ยันแก้ปัญหาและฝั่งแอดมิน

สั่ง Claude สร้างโรงเหล็กทั้งหลังใน SketchUp แล้วคำนวณ FEA ลงสี heatmap
ตอนจบของซีรีส์ ผมสั่ง Claude สร้างโรงเหล็กหลังคาเพิงหมาแหงนทั้งหลังใน SketchUp ไล่ทีละชั้นจากเสาปูนถึงกระเบื้อง แล้วส่งไปคำนวณกำลังด้วย PyNite ลงสี heatmap ตามแรงจริง

ขับ SketchUp ด้วย Claude Code ตอน 2 — ติดตั้งปลั๊กอิน MCP กันบั๊ก
ทำให้ Claude Code "เห็น" และ "ขับ" SketchUp ได้จริง ด้วยปลั๊กอิน MCP ของชุมชน พร้อมวิธีกัน 2 บั๊กที่ทำเสียเวลา — PyPI wheel พัง และ UI freeze จาก socket แบบ blocking

ขับ SketchUp ด้วย Claude Code ตอนที่ 1 — เตรียมเครื่องมือ uv กับ PyNite
เริ่มซีรีส์ขับ SketchUp ให้เขียนแบบ 3D โครงเหล็กแล้วคำนวณ FEA ด้วย Claude Code ตอนแรกว่าด้วยการเตรียมเครื่องล้วน ตั้งสิทธิ์ Claude ลง uv และสร้าง conda env ใส่ PyNite

ปลด CSF อัตโนมัติให้ออฟฟิศจริง แต่ไม่ปลดให้ attacker ด้วย geo+account gate
เคสจริง ออฟฟิศลูกค้า IP หมุนทุกวัน มี ghost device รหัสเก่าค้างทำให้ทั้งออฟฟิศโดน CSF บล็อกเป็นรอบ ๆ วิธีปลดอัตโนมัติด้วย gate แคบ account+geo ที่ปลดให้ออฟฟิศจริงแต่กันต่างชาติที่ brute creds.

วาง Telegram Bot เฝ้า DA Server แบบ blast radius เล็ก
คู่มือวาง Telegram bot เป็น control surface เบาๆ สำหรับเฝ้า DirectAdmin server — read-only commands บวก block/unblock IP เท่านั้น ไม่เปิด port ไม่เพิ่ม service และจำกัด blast radius ด้วย least-privilege ทุกชั้น

ดึง Backup ออกนอกห้อง Server ด้วย Pull Architecture + rclone/rsync
สร้าง Layer 3 off-site ให้ครบ 3-2-1 ด้วยสถาปัตยกรรมแบบ pull (host ปลายทางดึงเอง) บวก rclone + rsync และบทเรียนจาก trip จริงทั้ง NAT, RSA host key, cwRsync, และ PID recycle.

วางระบบ Backup DirectAdmin ใหม่ด้วย NFS และ POSIX ACL จากงานจริง
บันทึกการรื้อระบบ backup ของ DirectAdmin server หลัง migrate เครื่องใหม่ — จาก FTP push ที่พังสามชั้น มาเป็น NFSv4 hard mount + POSIX ACL พร้อมบทเรียนระดับ kernel ที่กว่าจะลงตัว.

อ่าน exim mainlog หา stuck client — Mail Forensics ภาคแรก
วิธีไล่อ่าน /var/log/exim/mainlog แยกให้ออกว่าใครส่งเมลไม่ได้เพราะเครื่องในออฟฟิศใส่รหัสผิด กับใครเป็น attacker brute force ด้วยคำสั่งที่ผมใช้จริงตอนลูกค้าเร่งคำตอบ

ไล่ Dovecot IMAP/POP fail บน DirectAdmin แล้วเก็บ log ยาว 90 วัน
ภาคต่อของ Mail Forensics — ไล่ IMAP/POP fail จาก /var/log/mail.log บน DirectAdmin, แยก stuck client กับ attacker ด้วย ratio ข้าม protocol, แล้วแก้ logrotate ให้เก็บ log ครบ 90 วันแทน default ที่หายภายในไม่กี่วัน

qcow2 หรือ ZFS — ทำไมผมเพิ่งย้าย หลังใช้เครื่องเดิมมา 12 ปี
บันทึกเหตุผลเบื้องหลังการเลือก storage layer ของเครื่อง Proxmox ที่รันมา 12 ปีไม่เคย reinstall — ทำไมปี 2014 เลือก qcow2 ทำไมเพิ่งย้าย ZFS ปี 2026 และอะไรคือสิ่งที่เปลี่ยน calculus จริง ๆ

ทำ Redis แบบ per-user บน DirectAdmin โดยไม่ต้องซื้อ pro_pack
วิธีติดตั้ง Redis object cache แยกต่อ user บน DirectAdmin shared hosting ด้วย systemd template + unix socket + cgroup limit โดยเขียน provisioning script เองแทน DA panel ที่ต้องใช้ pro_pack license พร้อมสูตรเชื่อม WordPress, Flarum และ Laravel

ปรับแต่ง ModSecurity บน DirectAdmin ให้พอใช้จริงกับ shared host
รวม 4 ส่วนที่ผมเพิ่มเข้าไปเหนือ DA default — exclusion ก่อน CRS, credscan ban 1 hit, แก้ MODSEC_LOG path ที่ DA ship ผิด และ self-heal cron กัน rebuild ทับ

ย้าย DirectAdmin จาก CentOS 7 ไป Debian 12 บน Proxmox (สารบัญซีรีส์)
บันทึกการย้าย DirectAdmin shared host จาก CentOS 7 (EOL) ไป Debian 12 บน Proxmox ลูกค้า 80+ ราย แตกเป็น 5 ตอน พร้อมภาพรวมขั้นตอนและลิงก์ทุกตอน

ย้าย DA ตอนจบ — security fixes + hardening หลังเครื่องนิ่ง
ปิดท้ายซีรีส์ย้าย DirectAdmin ข้ามดิสโทร ด้วยงาน security ที่ทำหลังเครื่องนิ่งแล้ว — sudoers wildcard CVE, OpenSSL SECLEVEL, ModSec exclusion ก่อน CRS, csfpost drop-in และ 5 ชั้นรอด DA update

ย้าย DA จาก CentOS 7 ไป Debian 12 ตอนที่ 4 — Cutover จริง กับ 17 ปัญหาหลังสลับเครื่อง
เล่า cutover จริงที่แผน downtime ใกล้ 0 พังเพราะ DA Legacy license และ qcow2 อ่านช้า สุดท้าย downtime 1 ชม. แล้วเจอ 17 ปัญหารัวๆ หลังสลับเครื่อง — critical web stack ดับ, medium subset ใช้ไม่ได้, minor debugging notes ครบ

ย้าย DA ตอนที่ 3 — ลง DirectAdmin + CustomBuild บน Debian 12
ลง DirectAdmin ผ่าน setup.sh แล้วประกอบ stack ทั้ง PHP หลายเวอร์ชัน MariaDB ModSecurity และ rspamd ด้วย CustomBuild บน staging VM ที่อยู่หลัง NAT พร้อมกับดักที่ผมเจอมาแล้วจริง

ย้าย DA สู่ Debian 12 ตอนที่ 2 — เปลี่ยน storage เป็น ZFS mirror
เปลี่ยน storage layer จาก mdadm RAID1 + ext4 + qcow2 สามชั้น มาเป็น ZFS mirror + raw zvol ชั้นเดียว โดยทำได้ขณะ VM เก่ายัง online ผ่านเทคนิค degrade RAID เหลือ disk ใบเดียว

ย้าย DA CentOS 7 → Debian 12 บน Proxmox ตอนที่ 1 — NAT pre-stage
เทคนิคเตรียม VM ใหม่บน internal bridge แบบ NAT ขณะที่ VM เก่ายังให้บริการลูกค้าปกติ ลด downtime ตอนย้าย DirectAdmin จาก CentOS 7 ไป Debian 12 บน Proxmox

ปลด CSF block อัตโนมัติ คัด ghost device ออกจาก botnet brute force
เคสจริงบนเซิร์ฟเวอร์ DA shared host ที่ ghost device ในออฟฟิศทำให้ทั้งออฟฟิศโดน CSF block ทุกเช้า ผมเล่าวิธีทำ auto-unblock 4 ชั้น ที่แยกเครื่องในออฟฟิศออกจาก botnet ได้โดยไม่เผลอปลด attacker

OpenClaw กับ VSCode + AI Agent ต่างกันยังไง แล้วใครควรใช้อะไร
เทียบ AI Agent สองสายที่ยกระดับ AI จากแชทบอทมาเป็นผู้ช่วยที่ลงมือทำงานจริง — สายเกตเวย์บนแชทแอปอย่าง OpenClaw กับสายฝังใน editor อย่าง VSCode + AI Agent ทั้งวิธีทำงาน ค่าใช้จ่าย token และความปลอดภัยที่มือใหม่ต้องรู้

สร้างเซิร์ฟเวอร์ AI จากเครื่องเดสก์ท็อป WSL2 + Ollama + OpenClaw
บันทึกการประกอบเซิร์ฟเวอร์ AI ในบ้านจากศูนย์ เริ่มจาก Windows 11 IoT ลง WSL2 + Ubuntu วาง Ollama รัน LLM บนการ์ดจอสองใบ แล้วต่อด้วย OpenClaw หลาย instance ผ่าน systemd ครบทั้ง driver, custom Modelfile, การแยก user และ benchmark