Tag: testing
123 รายการ
Blog

Java Normalizer: ค้นหาชื่อไทยให้ตรงกัน เข้าใจ NFC กับ NFKC ก่อนใช้
ทำคีย์สำหรับค้นหาข้อความด้วย java.text.Normalizer พร้อมเทสต์สระอำ ลำดับวรรณยุกต์ และตัวเลขเต็มความกว้างบน JDK 21

ตัดข้อความไทยใน Java ให้สระ วรรณยุกต์ และอีโมจิอยู่ครบด้วย BreakIterator
ทำพรีวิวข้อความไทยด้วย BreakIterator บน JDK 21 พร้อมเทสต์ขอบเขตตัวอักษรและอีโมจิ เพื่อใช้กับแจ้งเตือนและหัวข้อการ์ด

จัดรูปแบบตัวเลข Python ให้รายงานเงินบาทอ่านง่าย พร้อมเทสต์
ใช้ format specification จัดหลักพัน ทศนิยม และคอลัมน์รายงานเงินบาทด้วย Python พร้อมตัวอย่าง Decimal และ unittest ที่รันได้ทั้งไฟล์

สร้างลิงก์ภาษาไทยด้วย urllib.parse พร้อมเทสต์กัน URL พัง
ใช้ quote, urlencode และ urlsplit สร้างลิงก์ภาษาไทยที่มีช่องว่างและอักขระพิเศษ พร้อม unittest ตรวจการอ่านค่ากลับและเติม query ลง URL เดิม

เทียบ Java token ให้รัดกุมด้วย MessageDigest.isEqual พร้อมเทสต์และหมุนคีย์
ลดช่องข้อมูลรั่วจากการเทียบ token ด้วย MessageDigest.isEqual บน JDK 21 พร้อมแปลง hex ตรวจข้อมูลผิดรูปแบบ และรองรับ token เก่าระหว่างเปลี่ยนชุด

Python โหลด Secret ให้ครบก่อนเริ่มงาน พร้อมปิดค่าลับใน Log
ตรวจตัวแปรสภาพแวดล้อมที่จำเป็นให้ครบก่อนเปิดบริการ ซ่อนค่าลับใน log และเตรียมรับคีย์เก่าระหว่างหมุนคีย์ พร้อม unittest ที่รันได้

เช็ก Java ตอนเริ่มระบบ ให้ JVM ผ่านระดับแพตช์ขั้นต่ำก่อนรับงาน
ใช้ Runtime.Version เทียบเวอร์ชัน Java ตามตัวเลข พร้อม helper ตรวจเกณฑ์ขั้นต่ำแยกตามรุ่น และเทสต์ที่รันได้บน Java 21

ตรวจ Python startup: อ่าน .pth และหา sitecustomize ก่อนโค้ดเริ่มรัน
สร้างตัวตรวจ .pth และโมดูลปรับแต่ง startup แบบอ่านอย่างเดียว พร้อมเทสต์ เพื่อหาจุดที่ควรทบทวนในแต่ละ Python environment

เช็ก SHA-256 ของไฟล์ดาวน์โหลดด้วย Java ก่อนเอาเข้าระบบ
ใช้ MessageDigest ตรวจ checksum ของไฟล์แบบอ่านทีละก้อน พร้อมเทสต์บน Java 21 และเข้าใจว่าค่าแฮชยืนยันอะไรได้บ้าง

Python ใช้ CA store ไหน เช็กให้ชัดก่อนแก้ TLS error
ไล่ดูแหล่งใบรับรองที่ Python ใช้ด้วย ssl พร้อมเทสต์แบบไม่ต่อเครือข่าย แยกพาธเริ่มต้นออกจากใบรับรองที่โหลดจริง เพื่อแก้ปัญหา TLS ให้ตรงจุด

แสดงเงินบาทใน Java 21 ด้วย NumberFormat พร้อมเลขไทยและเทสต์
จัดรูปแบบเงินบาทให้ตรงงานด้วย Locale ไทย กำหนดทศนิยมและการปัดเศษ พร้อมตัวอย่างเลขไทยและเทสต์ที่รันได้บน Java 21

ส่งออก CSV ภาษาไทยให้ Excel อ่านง่ายด้วย Python utf-8-sig
เขียน CSV ภาษาไทยพร้อม BOM ด้วย utf-8-sig และจัดการบรรทัดด้วย newline='' พร้อมเทสต์ตรวจไบต์ อ่านกลับ และจับ BOM ที่ติดหัวคอลัมน์

คำนวณวันเงินเดือนออกด้วย Java TemporalAdjusters พร้อมเทสต์วันสิ้นเดือน
แปลงกฎวันจ่ายเงินและวันครบกำหนดเป็นโค้ด Java ที่อ่านออกทันที พร้อมสร้างกฎวันทำการสุดท้ายของเดือนและเทสต์กุมภาพันธ์ปีอธิกสุรทิน

ย่อตัวเลขบนแดชบอร์ดด้วย CompactNumberFormat ใน Java 21
แสดงยอดวิวและยอดขายเป็น 1.2K หรือคำไทยด้วย Locale พร้อมกำหนดทศนิยม การปัดเศษ และเทสต์การแปลงข้อความกลับเป็นตัวเลข

ล้างรหัสงานด้วย Python removeprefix และ removesuffix ให้ข้อมูลไม่แหว่ง
ตัด INV- หน้าเลขคำสั่งซื้อและ .csv ท้ายชื่อไฟล์ให้ตรงจุด พร้อมเทสต์จับบั๊ก lstrip และ rstrip ที่มักเผลอลบเนื้อข้อมูลไปด้วย

จัดชุดสิทธิ์เอกสารด้วย enum.Flag ใน Python พร้อมเทสต์
รวมสิทธิ์อ่าน เขียน ลบ และอนุมัติด้วย enum.Flag แทน boolean หลายตัว พร้อมตรวจสิทธิ์ เก็บค่าลงฐานข้อมูล และทดสอบด้วย unittest

Java คิด VAT เป็นบาทและสตางค์ให้ตรงทุกใบเสร็จ: BigDecimal, setScale และ RoundingMode
ทำไม double กับเงินถึงเพี้ยน สร้าง BigDecimal แบบไหนถึงถูก ปัดเศษ HALF_UP กับ HALF_EVEN ต่างกันยังไง ปัดต่อบรรทัดหรือปัดที่ยอดรวม และกับดัก equals ทดสอบจริงบน JDK 21

Java เรียงชื่อภาษาไทยให้ตรงพจนานุกรม: ทำไม Collections.sort ส่ง "เกศินี" ไปท้ายลิสต์ และ Collator แก้ยังไง
String.compareTo เรียงตามรหัส Unicode ทำให้ชื่อที่ขึ้นต้นด้วยสระหน้า เ แ โ ใ ไ ไปกองท้ายลิสต์ ใช้ java.text.Collator กับ Locale th-TH เรียงชื่อไทยให้ถูก ปรับ strength และใช้ให้ปลอดภัยกับหลายเธรด ทดสอบจริงบน JDK 21

Java แสดงวันที่เป็น พ.ศ. แบบไม่ต้อง +543 เอง: ThaiBuddhistDate และกับดัก withLocale
ใช้ java.time.chrono.ThaiBuddhistDate กับ DateTimeFormatter แสดงและรับวันที่ พ.ศ. ให้ถูก พร้อมจุดที่หลายคนพลาด: withLocale ไม่เปลี่ยนปฏิทิน แต่ localizedBy เปลี่ยน ทดสอบจริงบน JDK 21

Python string.Template: ให้ผู้ใช้แก้ข้อความแจ้งเตือนเองได้ โดยไม่เปิดช่องให้ล้วงข้อมูลในอ็อบเจกต์
ทำไมไม่ควรเอาข้อความที่ผู้ใช้พิมพ์ไปเข้า str.format ตรงๆ และใช้ string.Template กับ substitute, safe_substitute, get_identifiers แทน พร้อม unittest ที่รันจริงบน Python 3.14

Python json: ไฟล์ config มี key ซ้ำ ระบบไม่เตือนสักคำ จับให้ได้ด้วย object_pairs_hook
json.loads เก็บค่าตัวสุดท้ายเมื่อ key ซ้ำแบบเงียบๆ ตามที่เอกสาร Python เขียนไว้ ใช้ object_pairs_hook โยน error ตั้งแต่ตอนโหลด config พร้อม unittest ที่รันจริง

Python difflib.get_close_matches: เดาคำที่ผู้ใช้พิมพ์ผิด แล้วถามว่า "หมายถึงอันนี้ไหม?"
ใช้ difflib.get_close_matches ในไลบรารีมาตรฐาน ทำระบบแนะนำคำเมื่อพิมพ์ชื่อจังหวัดหรือคำสั่งผิด ปรับ n และ cutoff ให้พอดี พร้อม unittest ที่รันจริงบน Python 3.14

Java Math.clamp: บีบค่าให้อยู่ในช่วงในบรรทัดเดียว และแปลง long เป็น int แบบไม่ล้น
เลิกเขียน Math.max(min, Math.min(max, x)) ซ้อนกัน ใช้ Math.clamp ของ Java 21 คุมค่าเปอร์เซ็นต์ หน้า และขนาดหน้า พร้อม Java assertions ที่รันจริง

Python math.fsum: บวกทศนิยมทั้งลิสต์ให้แม่น และรู้ว่าเมื่อไหร่ควรเลิกใช้ float กับเงิน
เทียบ total += x กับ sum() และ math.fsum บน Python 3.14 แบบรันจริง ดูว่าทำไมยอดรวมเพี้ยน อะไรแก้ได้ อะไรแก้ไม่ได้ พร้อม unittest
Java Duration.parse: รับ timeout แบบมีหน่วยโดยไม่เดาว่าเลขคืออะไร
ใช้ Duration.parse อ่านค่า ISO-8601 จาก config พร้อม Java assertions ตรวจค่าถูกต้อง รูปแบบผิด และเพดาน timeout
Java Collections.frequency: เช็กของซ้ำก่อนรับ batch
ใช้ Collections.frequency นับค่าที่เท่ากันตาม equals พร้อม Java assertions และข้อจำกัดเมื่อข้อมูลใหญ่หรือ equality ซับซ้อน
Java Map.getOrDefault: อ่าน fallback โดยไม่เผลอเพิ่ม key
ใช้ Map.getOrDefault สำหรับ lookup ที่ไม่แก้ map พร้อม Java assertions แยก missing key ออกจาก key ที่ map ไป null
Python statistics.multimode: รายงานอันดับหนึ่งร่วมโดยไม่ทิ้งคำตอบ
ใช้ statistics.multimode จัดการข้อมูลที่มีค่าพบบ่อยเท่ากัน พร้อม unittest สำหรับ tie, empty input และลำดับผลลัพธ์
Python shutil.which: หา executable ก่อนเรียก subprocess อย่างมีขอบเขต
ใช้ shutil.which กับ PATH ที่กำหนดเองและ allowlist คำสั่ง พร้อม unittest ที่สร้าง executable ชั่วคราวโดยไม่เรียก shell
Bun 1.4.3 CompressionStream: ตั้งระดับบีบอัดให้ตรง latency budget
ใช้ CompressionStream level เลือกสมดุล CPU กับขนาดข้อมูล พร้อม Bun test แบบ round-trip โดยไม่พึ่งเครือข่าย
Zig splitScalar: เก็บช่องว่างใน CSV เล็ก ๆ ไม่ให้ข้อมูลเลื่อน
ใช้ std.mem.splitScalar แยก field ด้วย delimiter หนึ่งไบต์โดยรักษาช่องว่าง พร้อม zig test ตรวจ missing และ extra fields
Go bytes.FieldsSeq: อ่าน token ทีละชิ้นโดยไม่สร้าง slice ก้อนใหญ่
ใช้ bytes.FieldsSeq เดินข้อมูลไบต์แบบ lazy หยุดได้ทันทีเมื่อได้ field ครบ พร้อม Go test ตรวจ whitespace และ early stop
Java Optional.orElseGet: เรียก fallback เฉพาะตอนค่าหลักหาย
เปรียบเทียบ orElseGet กับ fallback ที่มีต้นทุนหรือ side effect พร้อม Java 17 assertions ตรวจ lazy evaluation
Java Map.replaceAll: normalize ค่าใน map โดยรักษาชุด key เดิม
ใช้ Map.replaceAll ปรับค่าทุก entry แบบ in-place อธิบาย null, mutability และ atomicity พร้อม Java 17 assertions
Java removeIf: ล้างสมาชิกใน collection โดยไม่แก้ระหว่าง for-each
ใช้ Collection.removeIf ลบ record หมดอายุแบบ in-place อธิบาย mutability และ side effect พร้อม Java 17 assertions
Python urljoin: ต่อ URL โดยไม่เปิดทางให้ input เปลี่ยน host
ใช้ urllib.parse.urljoin พร้อมตรวจ same-origin กัน absolute URL และ scheme-relative redirect พร้อม unittest
Python Counter.total: รวมจำนวนคงเหลือโดยยังเห็นค่าติดลบ
ใช้ collections.Counter.total คำนวณผลรวมสุทธิ อธิบายค่าศูนย์/ติดลบและการ normalize พร้อม unittest
Python annotationlib: อ่าน type hint เป็นข้อความโดยไม่ resolve ชื่อทันที
ใช้ annotationlib.get_annotations กับ Format.STRING สำหรับ tooling ที่ต้องอ่าน type hint โดยไม่ import dependency เพิ่ม พร้อม unittest
Bun.inspect.custom: ทำ log อ่านง่ายโดยไม่เผลอพ่น secret
กำหนด representation ของ object ด้วย Bun.inspect.custom พร้อมทดสอบ redaction และเตือนว่าไม่ใช่ security boundary
Zig tokenizeSequence: แยกข้อมูลด้วย delimiter หลายไบต์แบบไม่ตัดกลาง
ใช้ std.mem.tokenizeSequence แยก record ด้วย delimiter ทั้งชุด ข้ามช่องว่างซ้ำ และทดสอบ edge case ด้วย zig test
Rust Iterator::is_sorted_by_key: ตรวจลำดับโดยไม่สร้าง Vec สำรอง
ตรวจ stream ว่าเรียงตาม priority หรือไม่ด้วย is_sorted_by_key พร้อม Cargo test และข้อควรระวังเรื่อง key
Go maps.EqualFunc: เทียบ config คนละชนิดด้วยกติกาเดียว
ใช้ maps.EqualFunc เทียบค่าจาก config กับ API response โดยกำหนด equality ชัดเจน พร้อม Go test
Java String.indent: จัดย่อหน้าข้อความหลายบรรทัดโดยรู้เรื่อง line ending
ใช้ indent เพิ่มและลดช่องนำหน้าอย่างสม่ำเสมอ พร้อมอธิบาย newline normalization และ Java 17 tests
Java YearMonth.atEndOfMonth: ปิดรอบบิลโดยรู้ leap year
ใช้ YearMonth แทนการเดาจำนวนวัน แยกวันที่ธุรกิจจาก timezone และทดสอบ Java 17
Java Collections.disjoint: ตรวจสิทธิ์สองชุดว่าไม่ทับกัน
ใช้ disjoint แสดง intent ของ overlap check พร้อม normalize input และ Java 17 assertions
Python importlib.resources.files: อ่านไฟล์ใน package โดยไม่เดา path
ใช้ Traversable API อ่าน resource ที่มากับ package รองรับ wheel/zip และทดสอบผ่าน temporary package
Python inspect.signature: ตรวจรูปแบบ callable โดยไม่เรียกโค้ดจริง
อ่าน parameter kind และ default เพื่อเช็ก capability ของ plugin แบบไม่ execute พร้อม unittest
Python calendar.monthrange: หาวันสุดท้ายของเดือนโดยไม่บวก 31 วัน
ใช้ monthrange คืน weekday และจำนวนวัน พร้อม validate timezone boundary และ leap year ด้วย unittest
Bun.TOML.stringify: เขียน config โดยแยก data ออกจาก template
ใช้ TOML.stringify สร้าง config ที่ parse กลับได้ ตรวจ round-trip และหลีกเลี่ยงการต่อข้อความที่ escape ผิด
Zig std.mem.replace: คำนวณขนาดก่อนแทนข้อความโดยไม่เดา buffer
ใช้ replacementSize คู่กับ replace เพื่อจองปลายทางพอดี ตรวจจำนวนครั้ง และกัน output โตเกินเพดาน
Rust Option::zip: รวมค่าที่ต้องมาคู่กันโดยไม่ซ่อนสถานะขาดครึ่ง
ใช้ Option::zip รวม start/end ที่ต้องมีพร้อมกัน แยก missing ออกจาก invalid และทดสอบด้วย Cargo offline
Go strings.FieldsFuncSeq: แยก token แบบ iterator ไม่ต้องสร้าง slice ทั้งก้อน
ใช้ FieldsFuncSeq เดิน token ทีละค่า หยุดได้เร็ว และคัดลอกเฉพาะข้อมูลที่ต้องเก็บ พร้อม Go test
Java String.formatted: ให้ template อยู่หน้าค่าที่นำมาเติม
ใช้ String.formatted สร้างข้อความที่อ่านจากซ้ายไปขวา พร้อม Locale, validation, logging และข้อห้ามนำ user input มาเป็น format string
Java Arrays.mismatch: หา index แรกที่ข้อมูลสองชุดต่างกัน
ใช้ Arrays.mismatch ทำ diff checkpoint และ binary payload พร้อมตีความ -1, ความยาวต่าง และช่วงย่อยให้ถูก
Java Objects.checkIndex: ตรวจ index ก่อนแตะ array และ ByteBuffer
ใช้ Objects.checkIndex รวม boundary check แบบ fail-fast พร้อมแยก index จาก from-to range และแปลง exception ที่ API boundary
Python secrets.compare_digest: เทียบลายเซ็นโดยลด timing leak
ตรวจ webhook MAC ด้วย compare_digest หลัง decode และ validate format พร้อมแยก constant-time comparison ออกจากการคำนวณ HMAC และ replay protection
Python bisect กับ key: แทรก record ลงลิสต์เรียงโดยไม่สร้าง key list ใหม่
ใช้ bisect_left และ insort_right กับ key function ให้ถูก โดยแยกค่าที่ค้นจาก record ที่แทรก พร้อม trade-off ของ O(log n) search กับ O(n) insertion
Python datetime.fromisoformat: รับเวลา ISO 8601 โดยไม่ลืม timezone
parse timestamp ด้วย fromisoformat พร้อมบังคับ timezone, normalize เป็น UTC และทดสอบ Z, offset, naive datetime กับเวลาที่ไม่ถูกต้อง
Bun.JSONL.parseChunk: อ่าน JSONL ทีละก้อนโดยไม่ทำ record ขาด
ใช้ parseChunk กับ read/done/error เพื่อเก็บ remainder ระหว่าง chunk พร้อมจำกัด buffer และหยุดเมื่อเจอ JSON เสีย
Zig std.mem.tokenizeAny: แยกคำเมื่อ delimiter มีหลายตัว
ใช้ tokenizeAny แยกข้อความด้วยช่องว่าง comma slash หรือ pipe โดยไม่คืน token ว่าง พร้อมเทียบ tokenizeScalar และ splitAny
Rust slice::split_off: หยิบช่วงออกจากมุมมองโดยไม่ allocate
ใช้ split_off กับ &mut &[T] เพื่อเลื่อน cursor ของ slice อย่างปลอดภัย พร้อมแยกจาก Vec::split_off และจัดการ out-of-bounds
Go maps.DeleteFunc: ล้างสมาชิกที่ไม่ผ่านเงื่อนไขใน map เดิม
ใช้ maps.DeleteFunc ลบ cache ที่หมดอายุหรือค่าที่ไม่ผ่าน policy พร้อมระวัง nil map, side effect และการแก้ map ระหว่าง callback
Python typing.assert_never: ทำให้ branch ที่ไม่ควรถึงตรวจได้ทั้ง static และ runtime
สร้าง exhaustive dispatch ด้วย Enum, assert_never และ unittest พร้อมอธิบายข้อจำกัดของ type checker
Python deque.copy: ถ่าย snapshot คิวโดยรักษา maxlen
ดู shallow-copy semantics, maxlen และการแยก mutation ของคิวด้วย unittest ที่รันจริงบน Python 3.14
Java Clock.fixed: หยุดเวลาใน test โดยไม่แตะนาฬิการะบบ
ฉีด Clock เข้า business logic แล้วใช้ Clock.fixed ทดสอบวันหมดอายุแบบ deterministic พร้อมแยก wall clock จาก elapsed time
Python weakref.finalize: วาง cleanup สำรองโดยไม่ทำให้ object อยู่ค้าง
ใช้ weakref.finalize ลงทะเบียน cleanup แบบไม่ยึด owner ไว้ พร้อมทดสอบ idempotency และย้ำว่า context manager ยังเป็นเส้นทางหลัก
Python sqlite3 backup: สำรองฐานข้อมูลทีละหน้าโดยไม่ copy ไฟล์ที่กำลังเขียน
ใช้ Connection.backup สร้างสำเนา SQLite ที่สอดคล้อง พร้อม unittest จริงและข้อควรระวัง transaction, destination และการตรวจ restore
Python random.binomialvariate: จำลองจำนวนครั้งที่สำเร็จโดยไม่เขียนลูปเอง
ใช้ random.binomialvariate สำหรับการทดลองอิสระ n ครั้ง พร้อม seed, validation และคำเตือนว่า PRNG ไม่เหมาะกับความลับ
Java String.transform: ตั้งชื่อ pipeline แปลงข้อความแทนการซ้อนเมธอด
ใช้ String.transform ส่งข้อความเข้า Function ที่ตั้งชื่อได้ พร้อมทดสอบการ normalize และ validation บน Java 17
Python dataclasses.astuple: แปลงเป็น tuple พร้อมรู้ต้นทุน deep copy
ใช้ dataclasses.astuple ที่ boundary และทดสอบว่าข้อมูลซ้อนถูกคัดลอก ไม่แชร์ list กับต้นฉบับ
Python AsyncExitStack: รวม cleanup แบบ sync และ async ไว้ในจุดเดียว
จัดการ resource ที่เปิดตามเงื่อนไขด้วย contextlib.AsyncExitStack และยืนยันลำดับปิดย้อนกลับด้วย unittest
Python math.sumprod: คูณเป็นคู่แล้วรวมอย่างอ่านตรงโจทย์
ใช้ math.sumprod ทำ dot product และ weighted total พร้อมตรวจความยาว input และชนิดตัวเลข
Python zoneinfo.reset_tzpath: คุมแหล่งข้อมูล timezone ใน test และ deployment
เปลี่ยนเส้นทางค้นหา TZif แบบชั่วคราวอย่างมีวินัย พร้อม restore state และ unittest ที่รันจริง
Zig 0.16 Socket.createPair: สร้างช่องสื่อสารสองปลายสำหรับงานในโปรเซส
ทดลอง API socket pair ใหม่ใน std.Io พร้อมอธิบาย ownership, การปิด handle และจังหวะที่ควรเลือก pipe
Python SimpleNamespace: ทำวัตถุ attribute เร็วๆ โดยไม่ต้องเขียนคลาส
ใช้ types.SimpleNamespace เก็บค่าแบบจุดเข้าถึงด้วยชื่อ พร้อมเทียบกับ dict และทดสอบการอัปเดต attribute
Python atexit: จองคิวเก็บกวาดก่อนโปรเซสจบ
ลงทะเบียนฟังก์ชันด้วย atexit.register ให้รันตอน interpreter ปกติจะจบ พร้อมทดสอบลำดับ LIFO และกรณีที่ handler ไม่ถูกเรียก
Python enum.auto: ให้เลขสมาชิกเอง ไม่ต้องไล่พิมพ์เอง
ใช้ enum.auto() ไล่ค่าอัตโนมัติใน IntEnum/Enum พร้อมทดสอบว่าลำดับประกาศคือลำดับตัวเลข และกันสับสนตอนแทรกสมาชิกใหม่

Jev Workshop #2: คัดแยกแชทลูกค้าด้วยความน่าจะเป็น และรู้ว่าเมื่อไหร่ต้องส่งให้คน
เอาข้อความลูกค้าภาษาไทย 16 ข้อความที่ติดป้ายเองมาวัดว่า Jev คัดแยกถูกแค่ไหน ตั้งเกณฑ์ความน่าจะเป็นต่อ action เขียนเทสแบบไม่ต้องต่อเน็ตด้วย mock evaluation model และเทียบกับ LLM classifier ตัวเดิม
Python unicodedata.normalize: เทียบข้อความให้ตรงโลก Unicode
เลือก NFC/NFKC ก่อนเทียบ identifier พร้อมอธิบายว่าการ normalize ไม่ใช่ระบบป้องกันชื่อหลอกทั้งหมด
Python redirect_stdout: จับ output ของโค้ดเก่าไว้ทดสอบ
ใช้ contextlib.redirect_stdout ครอบฟังก์ชันที่ print โดยไม่แก้ global state นานเกิน scope
Python memoryview.cast: เปลี่ยนมุมมอง bytes โดยไม่ copy
อ่านบัฟเฟอร์เดิมเป็นสมาชิกชนิดใหม่ด้วย memoryview.cast พร้อมตรวจ alignment เชิงรูปแบบและ byte order
Bun.deepEquals: เทียบ config ซ้อนชั้นโดยรู้ว่า strict ต่างตรงไหน
ใช้ Bun.deepEquals ตรวจ snapshot ของ object พร้อมขอบเขต sparse array, undefined และ instance
Zig 0.16 เทียบ packed union ตาม backing integer: สะดวกแต่ต้องอ่าน representation
ทดลอง equality ของ packed union และอธิบายว่าทำไม field คนละชื่ออาจเท่ากันได้
Java RandomGenerator: เปลี่ยนอัลกอริทึมสุ่มโดยไม่ผูก Business Logic กับ Random
ใช้ RandomGenerator และ RandomGeneratorFactory บน Java 17 เลือกกลยุทธ์ สร้าง seed ทำซ้ำได้ และไม่เผลอใช้ PRNG กับ secret
Python decimal.localcontext: ล็อกกฎปัดเศษเฉพาะงาน ไม่ทำ Context รั่วทั้งโปรแกรม
ใช้ decimal.localcontext จำกัด precision และ ROUND_HALF_UP ในขอบเขตสั้น พร้อม unittest ตรวจว่า global context ไม่ถูกเปลี่ยน
Python itertools.compress: ให้ boolean mask กับข้อมูลเดินพร้อมกันแบบ lazy
คัดสมาชิกด้วย itertools.compress พร้อมรับมือ selector สั้นยาวไม่เท่ากัน และแยกกรณีที่ควร validate ก่อน
Python partialmethod: สร้างเมธอดเฉพาะทางโดยยังผูก self ถูกตำแหน่ง
ใช้ functools.partialmethod ลด wrapper ซ้ำใน class พร้อม unittest และข้อควรระวังเรื่อง signature กับ descriptor
Zig splitSequence: แยก delimiter หลายไบต์โดยยังเห็นช่องว่างระหว่างคู่ติดกัน
ใช้ std.mem.splitSequence ทำ parser รูปแบบเล็ก ๆ พร้อมเข้าใจ empty field, lifetime และความต่างจาก splitAny
Java Stream.mapMulti: คืนศูนย์หรือหลายผลลัพธ์โดยไม่สร้าง Stream ย่อยทุกครั้ง
ใช้ mapMulti แทน flatMap เมื่อแต่ละ input อาจไม่คืนค่า หรือคืนหลายค่า พร้อมตัวอย่าง Java 17 ที่รัน assertions จริง
Python 3.14 functools.Placeholder: partial ช่องกลางได้โดยไม่เขียน lambda ห่อ
ใช้ Placeholder จอง positional argument ตรงกลางของ partial พร้อมข้อจำกัดเรื่องจำนวนช่องและ keyword arguments
Python itertools.accumulate: เก็บสถานะสะสมโดยไม่สร้างลูปข้างเคียง
ใช้ accumulate ทำ running total และ state transition พร้อม initial value ที่ช่วยให้ขอบเขตข้อมูลอ่านง่าย
Python nullcontext: ทำให้เส้นทางมีและไม่มี context manager ใช้โครงเดียวกัน
ใช้ contextlib.nullcontext ลด if ซ้ำรอบ with สำหรับ resource ที่ผู้เรียกอาจส่งมาให้แล้ว พร้อม unittest
Go context.AfterFunc: ผูก cleanup กับการยกเลิกโดยไม่ทิ้ง goroutine รอ
ใช้ context.AfterFunc ปลุกงาน cleanup เมื่อ context ถูกยกเลิก พร้อมเข้าใจ race ของ stop และการรอ callback ให้จบ
Java Collectors.toMap: กำหนดชะตา key ซ้ำก่อน pipeline พังกลางทาง
ใช้ merge function ของ Collectors.toMap รวมข้อมูล key ซ้ำอย่างตั้งใจ พร้อมแยกกรณี sum, keep-first และข้อมูลผิด schema
Python contextlib.suppress: กลืนเฉพาะ error ที่ขั้นตอนนั้นยอมรับได้
ใช้ contextlib.suppress กับ cleanup แบบ best effort โดยจำกัด exception ให้แคบและทดสอบว่า error อื่นยังหลุดออกมา
Rust map_while: แปลงข้อมูลจนเจอเส้นแบ่ง แล้วหยุดอย่างมีขอบเขต
ใช้ Iterator::map_while อ่าน prefix ที่แปลงได้ พร้อมอธิบายว่า item ที่ทำให้หยุดถูก consume และ iterator ไม่ fused
Go sync.OnceValue: โหลดค่าครั้งเดียวโดยไม่เปิดช่องให้ cache แข่งกัน
ใช้ sync.OnceValue ทำ lazy initialization ที่ปลอดภัยระหว่าง goroutine พร้อมข้อจำกัดเรื่อง panic และค่าที่ต้อง refresh
Mistral ย้าย Fortran 77 สู่ C++ 40,000 บรรทัด: Parity Harness มาก่อน Agent
บทเรียนจากงาน modernization จริงที่เริ่มด้วย numerical checkpoints, caller-callee tree และ human review แทนการปล่อย agent แปลทีละฟังก์ชัน
Go testing/fstest.MapFS: เทสต์สัญญาไฟล์โดยไม่ต้องสร้าง temp directory
ใช้ MapFS จำลองต้นไม้ไฟล์แบบเล็กและ deterministic พร้อมข้อจำกัดที่ต้องรู้ก่อนแชร์ข้าม goroutine
Java Phaser: Barrier ที่เพิ่ม–ลด Worker ระหว่างทางได้
ใช้ Phaser ประสานงานหลายช่วงเมื่อจำนวน participant เปลี่ยนได้ พร้อมทดสอบ phase advance และ deregistration ด้วย Java 17
asyncio.Queue.shutdown: ปิดสายพานงานโดยไม่ส่ง Sentinel
ใช้ shutdown และ QueueShutDown แยกการปิดรับงานออกจากการประมวลผลงานค้าง พร้อมทดสอบ graceful shutdown จริง
Rust std::mem::take: ย้ายค่าออกจาก Borrow โดยไม่ Clone
ใช้ mem::take เปลี่ยน field เป็นค่า Default แล้วรับ ownership ของค่าเดิม เหมาะกับ state machine และ batch drain ที่ไม่อยากคัดลอก
Java Files.mismatch: หาตำแหน่งต่างแรกก่อนเปิด diff ใหญ่
เปรียบเทียบไฟล์แบบคืน byte offset แรกที่ต่าง พร้อมจัดการไฟล์เท่ากัน prefix และ TOCTOU ในระบบจริง
Java computeIfAbsent: สร้างค่าตอนจำเป็นโดยไม่ซ่อน side effect
ใช้ Map.computeIfAbsent สำหรับ grouping และ lazy cache พร้อมข้อควรระวัง null การแก้ map ซ้อน และ concurrency
Java Collectors.teeing: สรุปสองค่าใน stream pass เดียว
ใช้ teeing จับคู่ collector สองตัวโดยไม่ traverse stream ซ้ำ พร้อม trade-off ด้าน readability และ parallel reduction
Python ChainMap: ซ้อน config หลายชั้นโดยไม่รีบ copy
จัดลำดับ CLI environment และ defaults ด้วย ChainMap พร้อมทดสอบ precedence การเขียน และผลจาก mapping ต้นทาง

Python 3.15: โอกาสสุดท้ายช่วยเทสต์ก่อนไฟนอล 1 ต.ค.
สรุปคำเรียกจาก Hugo van Kemenade ให้เมนเทนเนอร์เทสต์ 3.15.0rc2 และเตรียมล้อรถก่อน GA วันที่ 1 ตุลาคม 2026

asyncio.timeout: ใส่กรอบเวลาให้งาน async โดยไม่กลืน CancelledError
ใช้ asyncio.timeout เป็น context manager จำกัดเวลารอ พร้อม unittest.IsolatedAsyncioTestCase ที่พิสูจน์ทั้งสำเร็จและ TimeoutError
Python 3.15.0rc2: ทดสอบ wheel ก่อน GA 1 ต.ค. ตาม PEP 790
RC2 เป็นตัวสมัครสุดท้ายก่อน 3.15.0 วันที่ 1 ตุลาคม 2026 พร้อมเช็กลิสต์ผู้ดูแลแพ็กเกจจาก blog.python.org
Python zip(strict=True): ให้ข้อมูลคนละความยาวล้มตรงจุด ไม่เงียบหาย
ป้องกัน record ถูกตัดเมื่อสองลิสต์ยาวไม่เท่ากัน พร้อม unittest สำหรับ input ปกติ ว่าง และผิดรูป
Python singledispatch: แยกพฤติกรรมตามชนิดโดยไม่สร้าง if ยาว
ใช้ functools.singledispatch ทำจุดเข้าเดียวที่ขยาย handler ตามชนิด พร้อม unittest ของ fallback และ subclass
Python itertools.batched แบบ strict: จับข้อมูลชุดสุดท้ายที่มาไม่ครบ
แบ่ง iterable เป็นก้อนแบบ lazy และใช้ strict=True เมื่อต้องการให้จำนวนข้อมูลหารขนาด batch ลงตัว พร้อม unittest
Python copy.replace: อัปเดต Value Object โดยไม่แก้ของเดิม
ใช้ copy.replace กับ dataclass แบบ frozen เพื่อสร้างสถานะใหม่เฉพาะฟิลด์ พร้อมตรวจ invariant ด้วย unittest
Java Try-with-resources: ปิด Resource ย้อนลำดับแม้กลางทางมี Exception
ใช้ AutoCloseable และ try-with-resources ใน Java 17 เพื่อรับประกัน cleanup พร้อม assertions ของลำดับปิด
Java Switch Expressions: ให้ทุกเส้นทางคืนค่าและหยุด Fall-through โดยไม่ตั้งใจ
ใช้ switch expression และ yield ใน Java 17 เพื่อทำ mapping ให้ครบทุกกรณี พร้อม self-contained assertions
Java Helpful NullPointerExceptions: อ่าน Chain ที่ขาดให้เจอจุด null เร็วขึ้น
ใช้ข้อความ NPE ที่ละเอียดขึ้นใน Java 17 ควบคู่กับการลด method chain และเพิ่ม boundary checks
Go 1.27 ให้ go test จับ API ใหม่เกิน go.mod ด้วย stdversion
ใช้ stdversion vet check ที่มากับ go test เพื่อกันการเผลอเรียก standard library ใหม่กว่าสัญญาเวอร์ชันของโมดูล
Python asyncio.TaskGroup: ให้งานพี่น้องล้มและยกเลิกเป็นกลุ่ม
ใช้ structured concurrency ใน Python เพื่อไม่ทิ้ง background task ค้าง พร้อม unittest ที่ทดสอบทั้งสำเร็จและ fail-fast
Python Path.walk: เดินโฟลเดอร์แบบ prune ได้และไม่ตาม symlink โดยปริยาย
ใช้ pathlib.Path.walk ค้นไฟล์อย่างอ่านง่าย พร้อมตัด subtree และทดสอบด้วย temporary directory
Python ExitStack: จัดการ resource จำนวนไม่แน่นอนให้ปิดย้อนลำดับ
รวม context manager และ callback แบบ dynamic ด้วย ExitStack พร้อม unittest ที่พิสูจน์ลำดับ cleanup
Workshop Go 1.27: ทดสอบ HTTP ช้าในเวลาจำลอง ไม่ต้องรอจริง
ใช้ httptest.NewTestServer ร่วมกับ testing/synctest สร้างเครือข่ายใน memory และข้ามเวลา 10 วินาทีใน test ที่รันจริง
Workshop: ย้าย API จาก encoding/json v1 ไป v2 โดยไม่เปลี่ยนสัญญาแบบไม่รู้ตัว
เวิร์กช็อป Go 1.27 แบบลงมือจริง สร้าง characterization tests เปิดโหมดเข้ากันได้ แล้วค่อยเพิ่ม strict contract พร้อมคำสั่ง go test ที่ตรวจแล้ว

Zig 0.16 บทที่ 7: error ไม่มีข้อมูลแนบ แล้วจะบอกรายละเอียดยังไง
งานจริงของ error handling ใน Zig — รูปแบบ diagnostics struct ที่ standard library ใช้เอง, ทดสอบทุกจุดที่หน่วยความจำเต็มด้วย checkAllAllocationFailures, ตาราง safety ต่อ build mode ที่ผมรันจริงทั้งสามโหมด และการเขียน panic handler เองแบบ 0.16