Tag: tutorial
130 รายการ
Blog
Java Duration.truncatedTo: ปัดช่วงเวลาเป็น bucket โดยไม่ใช้เลขหารเอง
ใช้ truncatedTo กับ ChronoUnit, ค่าติดลบ และข้อจำกัดของหน่วย ผ่าน Java 17 assertions
Java Scanner.tokens: เปลี่ยน token stream เป็น pipeline ที่ปิด resource ชัดเจน
ใช้ Scanner.tokens กับ delimiter, filter และ try-with-resources พร้อม Java 17 assertions
Java Collections.rotate: หมุนลำดับโดยไม่สร้าง list ใหม่
เข้าใจ distance บวก/ลบ, modulo, mutable list และ edge cases ผ่าน Java 17 assertions
Python inspect.getmembers_static: สำรวจ object โดยไม่เผลอเรียก property
เทียบ getmembers กับ getmembers_static ผ่าน descriptor ที่มี side effect และ unittest แบบ isolated
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
Bun.main: แยกไฟล์ที่ถูกรันตรงจากไฟล์ที่ถูก import
ใช้ Bun.main เทียบ import.meta.path เพื่อป้องกัน side effect ตอนทดสอบและ reuse module
Zig std.mem.findMinMax: หา index ค่าน้อยสุดและมากสุดในรอบเดียว
ใช้ findMinMax บน slice ที่ไม่ว่าง พร้อมจัดการ empty input และ tie behavior ด้วย test บน Zig 0.17
Rust Vec::spare_capacity_mut: เติม buffer ที่จองไว้โดยไม่สร้าง Vec ชั่วคราว
เรียนรู้ MaybeUninit, set_len invariant และ panic boundary ผ่านตัวอย่างเติมข้อมูลที่ทดสอบจริง
Go bytes.Buffer.AvailableBuffer: ต่อข้อมูลลงพื้นที่ว่างโดยลด allocation
ใช้ AvailableBuffer คู่ strconv.Append* อย่างถูกสัญญา พร้อมทดสอบการเขียน CSV, capacity และข้อห้ามเก็บ slice ข้าม Write
Java Collectors.toUnmodifiableMap: ปิดการแก้โครงสร้างหลัง stream
ใช้ toUnmodifiableMap สร้างผลลัพธ์ที่เพิ่มหรือลบไม่ได้ พร้อมทดสอบ duplicate key, null และ mutable value
Java Collections.checkedList: กันชน type ตอนรับ List จาก legacy boundary
ใช้ checkedList ตรวจ element ตอนเขียนเข้าคอลเล็กชัน พร้อมทดสอบ raw alias และอธิบายว่ามันไม่แทน validation ของข้อมูลเดิม
Java Clock.fixed: หยุดเวลาใน test โดยไม่แตะนาฬิการะบบ
ฉีด Clock เข้า business logic แล้วใช้ Clock.fixed ทดสอบวันหมดอายุแบบ deterministic พร้อมแยก wall clock จาก elapsed time
Python Fraction.from_number: รับเฉพาะตัวเลขโดยไม่เผลอ parse ข้อความ
ใช้ Fraction.from_number แยก numeric API จาก string parsing พร้อมทดสอบ int, float, Decimal และข้อควรระวังค่าทศนิยมฐานสอง
Python ExitStack.pop_all: โอนสิทธิ์ cleanup เมื่อทุกขั้นเตรียมสำเร็จ
ใช้ ExitStack.pop_all ทำ all-or-nothing resource setup พร้อม unittest ที่ตรวจ cleanup ก่อนและหลังโอน ownership
Python ChainMap.new_child: ซ้อน scope ใหม่โดยไม่ copy config ทั้งก้อน
ใช้ ChainMap.new_child สร้าง override ชั้นใหม่ พร้อมทดสอบ lookup, mutation และ parents เพื่อจัดการ config หลายระดับอย่างชัดเจน
Bun.randomUUIDv7: สร้าง UUID ที่เรียงตามเวลาได้โดยไม่ทำเป็น timestamp
ใช้ Bun.randomUUIDv7 สร้าง identifier แบบ time-ordered พร้อมทดสอบรูปแบบ ลำดับ และอธิบายข้อจำกัดด้าน privacy กับ distributed ordering
Rust slice::as_chunks: แบ่ง slice เป็นกลุ่มขนาดคงที่โดยไม่ copy
ใช้ as_chunks แปลง slice เป็น array chunks กับ remainder พร้อมทดสอบขอบเขตและอธิบายว่าทำไมขนาดศูนย์จึง panic
Go maps.Collect: สร้าง map จาก iterator คู่ key-value
ใช้ maps.Collect รับ iter.Seq2 เป็น map พร้อมทดสอบ duplicate key, empty input และแยก collection จาก validation
Go slices.AppendSeq: เติม iterator ลง slice โดยไม่ต้องเขียนลูปเอง
ใช้ slices.AppendSeq ต่อค่าจาก iter.Seq ลง slice ที่มีอยู่ พร้อมทดสอบ capacity, iterator แบบใช้ครั้งเดียว และ ownership ของข้อมูล
Java Cleaner: มี fallback cleanup แต่ยังต้องปิด resource แบบ explicit
ใช้ java.lang.ref.Cleaner เป็น safety net โดยไม่จับ owner ค้าง พร้อม Java 17 assertions และขอบเขตที่ห้ามพึ่งเวลาของ GC
Java PathMatcher: คอมไพล์ glob ครั้งเดียวแล้วตรวจ path ตาม filesystem
ใช้ FileSystem.getPathMatcher กับ glob ตรวจไฟล์หลายเส้น พร้อมแยก matching จาก path containment และทดสอบ Java 17 จริง
Java Stream.iterate แบบมี hasNext: สร้างลำดับมีขอบเขตโดยไม่พึ่ง limit เดา ๆ
ใช้ Stream.iterate(seed, hasNext, next) สร้างช่วงตามเงื่อนไข พร้อม Java 17 assertions และขอบเขต overflow กับ non-progressing step
Python LoggerAdapter merge_extra: รวม context ประจำกับข้อมูลต่อ log call
ใช้ LoggerAdapter merge_extra เพิ่ม request context โดยไม่ทับข้อมูลต่อเหตุการณ์ พร้อม unittest ที่ตรวจ LogRecord จริงและข้อควรระวัง secret
Python weakref.finalize: วาง cleanup สำรองโดยไม่ทำให้ object อยู่ค้าง
ใช้ weakref.finalize ลงทะเบียน cleanup แบบไม่ยึด owner ไว้ พร้อมทดสอบ idempotency และย้ำว่า context manager ยังเป็นเส้นทางหลัก
Python sqlite3 backup: สำรองฐานข้อมูลทีละหน้าโดยไม่ copy ไฟล์ที่กำลังเขียน
ใช้ Connection.backup สร้างสำเนา SQLite ที่สอดคล้อง พร้อม unittest จริงและข้อควรระวัง transaction, destination และการตรวจ restore
Bun.CookieMap: แยก Cookie header แล้วแก้ค่าโดยไม่ต่อสตริงเอง
ใช้ Bun.CookieMap อ่านและ serialize cookie map พร้อมแยก request Cookie จาก response Set-Cookie และไม่ใช้ parser แทน security policy
Zig splitBackwardsSequence: แยก path จากด้านท้ายโดยไม่ reverse ข้อมูล
ใช้ std.mem.splitBackwardsSequence ดึงชื่อไฟล์และโฟลเดอร์จากท้าย slice พร้อมรู้ empty field, delimiter หลายไบต์ และ lifetime
Rust VecDeque::pop_front_if: หยิบหัวคิวเฉพาะเมื่อพร้อม
ใช้ pop_front_if ตรวจและนำสมาชิกหน้าคิวออกแบบ atomic ต่อการยืม พร้อมเข้าใจ mutation ใน predicate และทางเลือกเมื่อเงื่อนไขล้ม
Go strings.SplitAfterSeq: แบ่งข้อความแบบ iterator โดยเก็บตัวคั่นไว้
ใช้ SplitAfterSeq อ่าน record ทีละส่วนโดยไม่สร้าง slice ทั้งก้อน พร้อมทดสอบ empty separator, single-use iterator และ ownership ของ substring
Java ProcessHandle.Info: อ่านคำสั่งและเวลาเริ่มของโปรเซสแบบ snapshot
ใช้ info() ดู command, user, startInstant อย่างปลอดภัยเมื่อค่าอาจว่าง พร้อมทดสอบ Optional
Java Matcher.results: เก็บทุกแมตช์เป็น Stream โดยไม่วน find เอง
ใช้ results() ดึง MatchResult ทั้งก้อน แล้ว map เป็นข้อมูลธุรกิจ พร้อมทดสอบจำนวนแมตช์
Java Currency.getAvailableCurrencies: ตรวจรหัสเงินก่อนรับจากฟอร์ม
ไล่ชุด Currency ที่ JVM รู้จัก เพื่อ validate รหัส ISO 4217 พร้อมทดสอบ THB และรหัสปลอม
Python email.headerregistry: อ่านหัวอีเมลแบบมีชนิด ไม่ต้องตัดสตริงเอง
ใช้ HeaderRegistry และ Address แยกชื่อกับที่อยู่ พร้อมทดสอบ Content-Type แบบมีพารามิเตอร์
Python csv.unix_dialect: ส่งไฟล์ CSV ข้ามเครื่องโดยไม่พังเพราะขึ้นบรรทัดใหม่
ใช้ dialect ที่ quote ทุกฟิลด์และขึ้นบรรทัดแบบ LF พร้อมทดสอบความต่างจาก excel
Java IdentityHashMap: เมื่อ key ต้องเป็น object เดิม ไม่ใช่ object ที่ equals กัน
ใช้ IdentityHashMap เฉพาะงาน topology และ graph traversal พร้อมทดสอบความต่างจาก HashMap และข้อห้ามใน business data
Java BitSet.nextSetBit: เดินเฉพาะตำแหน่งที่เปิดโดยไม่สแกนทุกช่อง
ใช้ BitSet.nextSetBit วน sparse flags พร้อมหลีกเลี่ยง off-by-one และแยก index set จาก business identity
Java ClassValue: ผูก cache กับ Class โดยไม่สร้าง static map ถือ class loader ไว้
ใช้ ClassValue คำนวณ metadata ต่อ Class แบบ lazy พร้อม remove, concurrency contract และ Java 17 assertions
Python collapse_addresses: รวม CIDR ที่ติดกันโดยไม่ขยายเป็นทุก IP
ใช้ ipaddress.collapse_addresses ลดรายการ network ที่ซ้อนหรือติดกัน พร้อมทดสอบ IPv4, type mismatch และข้อจำกัดด้าน policy
Python Path.readlink: อ่านปลายทาง symlink โดยไม่เผลอ resolve ทั้งเส้น
แยกการอ่านค่าที่ symlink เก็บจากการ resolve path จริง พร้อมทดสอบ relative target และ broken link ด้วย pathlib
Python random.binomialvariate: จำลองจำนวนครั้งที่สำเร็จโดยไม่เขียนลูปเอง
ใช้ random.binomialvariate สำหรับการทดลองอิสระ n ครั้ง พร้อม seed, validation และคำเตือนว่า PRNG ไม่เหมาะกับความลับ
React Native AppState: หยุดงานแพงเมื่อแอปพัก แล้ว sync ใหม่ตอนกลับมา
ออกแบบ lifecycle ด้วย AppState change listener โดยไม่สับสน background, inactive และ Android blur พร้อมข้อควรระวัง currentState ตอนเริ่ม
Bun Zstandard round trip: บีบ Uint8Array แล้วเปิดกลับโดยไม่เสีย byte
ใช้ Bun.zstdCompressSync และ zstdDecompressSync กับข้อมูลไบนารี พร้อมทดสอบ round trip และวางเพดานก่อนแตกข้อมูล
Rust Vec::extract_if: ดึงสมาชิกออกเฉพาะช่วงโดยยังเก็บลำดับที่เหลือ
ใช้ Vec::extract_if แยกสมาชิกที่ผ่านเงื่อนไขจาก range พร้อมเข้าใจ lazy iterator, early drop และต้นทุนการเลื่อนข้อมูล
Go slices.Grow กับ Clip: จองความจุให้พอ แล้วคืนส่วนเกินตรงขอบงาน
ใช้ slices.Grow ลดการขยาย backing array ซ้ำ และ slices.Clip ตัด capacity ก่อนส่งข้อมูลข้าม boundary พร้อม Go tests ที่รันจริง
Go slices.Concat: รวมหลาย slice โดยไม่ผูกผลลัพธ์กับ backing array เดิม
ใช้ slices.Concat รวมข้อมูลหลายก้อน พร้อมทดสอบ aliasing, capacity และกรณีที่ append เดิมอ่านยาก
Rust VecDeque::make_contiguous: เปิด ring buffer เป็น slice ก่อน sort
ทำให้ข้อมูลใน VecDeque ต่อเนื่องในหน่วยความจำเพื่อ sort หรือส่งต่อ API ที่รับ slice พร้อมเข้าใจต้นทุนการย้าย
Bun.color: แปลง design token หลายรูปแบบโดยไม่เขียน parser สีเอง
ใช้ Bun.color แปลง HEX, RGB และ named color เป็นรูปแบบมาตรฐาน พร้อม validation ก่อนส่งค่าไป CLI หรือ renderer
React Native reduced motion: เคารพการตั้งค่าลดการเคลื่อนไหวตั้งแต่เฟรมแรก
ใช้ AccessibilityInfo อ่านและติดตาม reduce motion เพื่อเปลี่ยน transition เป็นแบบนิ่งโดยไม่ปิด feedback ที่จำเป็น
Python 3.14 max-heap API: เลิกใส่เครื่องหมายลบเพื่อจัดคิวค่าสูงสุด
ใช้ heapify_max, heappush_max และ heappop_max โดยตรง พร้อมทดสอบลำดับและแยกจาก min-heap เดิม
Python statistics.kde: ประมาณ distribution โดยไม่บังคับให้ข้อมูลเป็นโค้งระฆัง
ใช้ kernel density estimation กับข้อมูลขนาดเล็ก พร้อมทดสอบ density, bandwidth และขอบเขตการตีความ
Python 3.14 os.reload_environ: รีเฟรช environment ได้ แต่ห้ามแข่งกับ thread อื่น
เข้าใจเวลาที่ os.environ ไม่ตรงกับ process environment พร้อมทดสอบ reload แบบ isolated และวาง synchronization
Java ConcurrentHashMap.newKeySet: ทำ concurrent set โดยไม่ใส่ Boolean หลอก
ใช้ key set สำหรับ dedup ข้ามหลาย thread พร้อมทดสอบ add semantics และแยกจาก map ที่ต้องเก็บ metadata
Java NavigableMap.subMap: เปิดหน้าต่างช่วงคีย์แบบ live view
เลือกข้อมูลตามขอบเขต inclusive/exclusive โดยไม่ copy พร้อมทดสอบการแก้ผ่าน view และการปฏิเสธคีย์นอกช่วง
Java Pattern.asMatchPredicate: ใช้ regex แบบตรงทั้งข้อความใน Stream
แยก full match จาก find semantics ให้ชัด พร้อมทดสอบ filter ของรหัสงานและกรณีมีข้อความเกิน
Go slices.CompactFunc: รวมข้อมูลซ้ำที่ติดกันด้วยกติกาของเรา
ลดข้อมูลซ้ำแบบ adjacent โดยกำหนด equality เอง พร้อมแยกกรณีที่ต้อง sort ก่อนและผลต่อ backing array
Rust Iterator::scan: พก state ไปทีละรายการโดยไม่หลุดจาก pipeline
ใช้ scan สร้าง running state ใน iterator พร้อมอธิบายจังหวะหยุด, ownership และกรณีที่ loop ชัดกว่า
Zig std.mem.rotate: หมุน slice in-place สำหรับคิวแบบวงแหวน
เข้าใจทิศทาง amount, ค่าเกินความยาว และ trade-off ของการหมุนข้อมูลจริงเทียบกับเก็บ head index
Bun.peek: อ่าน Promise ที่ settle แล้วโดยไม่สร้าง await boundary ใหม่
ใช้ Bun.peek อย่างจำกัดกับสถานะที่รู้ว่า settle แล้ว พร้อมแยก pending, rejected และโค้ด portable
Python AsyncContextDecorator: ใช้ lifecycle เดียวกันทั้ง async with และ decorator
สร้างขอบเขต async ที่นำกลับใช้ได้สองรูปแบบ พร้อม unittest พิสูจน์ลำดับ enter/work/exit
Python itertools.tee: แยก iterator ได้ แต่ต้องรู้ว่า buffer โตตรงไหน
อธิบาย shared source, backlog เมื่อ consumer วิ่งไม่เท่ากัน และวิธีเลือก list หรือ tee ให้ตรงงาน
Python 3.14 make_dataclass decorator: กำหนด policy ตอนสร้างคลาสจาก schema
ใช้ decorator hook บังคับ frozen/slots กับ dataclass แบบ dynamic พร้อม unittest ป้องกัน mutation
Java Exchanger: นัดแลกข้อมูลระหว่างสองงานแบบเจอกันพอดี
ใช้ Exchanger ทำ two-party handoff พร้อม timeout และแยกจาก queue ที่รองรับหลาย producer/consumer
Bun.fileURLToPath: แปลง file URL เป็นพาธโดยไม่พังช่องว่างและอักขระ escape
ใช้ Bun.fileURLToPath แทนการอ่าน pathname ตรง ๆ เมื่อต้องเปิดไฟล์ข้างโมดูลอย่างข้ามแพลตฟอร์ม
Zig indexOfScalarPos: ค้นตัวคั่นต่อจาก cursor โดยไม่ตัด slice ซ้ำ
ใช้ std.mem.indexOfScalarPos ทำ parser แบบเดิน cursor พร้อมเข้าใจ null และขอบเขตเริ่มค้นหา
Rust try_fold: สะสมค่าแล้วหยุดทันทีเมื่อเจอเงื่อนไขผิด
ใช้ Iterator::try_fold รวมข้อมูลพร้อมส่ง error ออกจากลูปเร็ว โดยไม่ต้องเขียน mutable accumulator เอง
Go slices.Backward: วนจากท้ายโดยไม่กลับลำดับข้อมูลต้นฉบับ
ใช้ iterator ย้อนลำดับใน Go เมื่ออยากอ่านจากท้ายไปหน้า โดยไม่ mutate slice และไม่เขียน index loop เอง
Java EnumSet.range: สร้างช่วงสถานะแบบ type-safe และประหยัด
ใช้ EnumSet.range เมื่อ enum มีลำดับโดเมนชัด พร้อมระวังการผูก logic กับ ordinal
Java LocalDate.datesUntil: เดินช่วงวันแบบไม่พลาดขอบเขตท้าย
สร้าง Stream ของวันที่แบบ end-exclusive พร้อม step และป้องกัน off-by-one ในรายงาน
Java Pattern.asPredicate: เปลี่ยน regex เป็นตัวกรองที่ประกอบกับ Stream ได้
ใช้ Pattern.asPredicate กับ Stream โดยแยก find ออกจาก matches และคอมไพล์ regex เพียงครั้งเดียว
Python operator.call: ส่งฟังก์ชันเข้า pipeline แบบไม่ต้องห่อ lambda
ใช้ operator.call เรียก callable ใน functional pipeline พร้อมรู้ว่าความอ่านง่ายสำคัญกว่าความสั้น
Zig std.mem.reverse: กลับลำดับในที่เดิม พร้อมเข้าใจ slice และ mutation
ทดลอง reverse slice แบบ in-place ใน Zig 0.16 และระวังเรื่องข้อมูลต้นฉบับถูกแก้
Rust Option::take_if: ย้ายค่าออกเมื่อเงื่อนไขผ่าน โดยไม่ชน borrow
ใช้ take_if ตรวจและย้ายค่าจาก Option อย่างเป็นอะตอม พร้อมเทียบกับ take และ as_ref
Go maps.Insert: เติม map จาก iterator โดยไม่ต้องเขียน loop ซ้ำ
รู้จัก maps.Insert และ iter.Seq2 สำหรับประกอบข้อมูลแบบ pull-free พร้อมขอบเขตเรื่องค่าซ้ำและลำดับ
Python hashlib.file_digest: แฮชไฟล์ใหญ่โดยไม่อ่านทั้งก้อนเอง
ใช้ hashlib.file_digest ตั้งแต่ Python 3.11 คำนวณแฮชจากไฟล์หรือไฟล์ออบเจ็กต์โดยไลบรารีจัดการบัฟเฟอร์ให้ ลดโค้ดผิดพลาดตอนเช็กซัม
Python Path.walk: เดินต้นไม้โฟลเดอร์แบบ pathlib โดยไม่ต้อง os.walk
ใช้ Path.walk ตั้งแต่ Python 3.12 ได้ dirpath/dirnames/filenames คล้าย os.walk แต่เป็น Path object ลดการต่อสตริงเอง
Java Map.ofEntries: สร้าง immutable map หลายคู่โดยไม่เปิดช่องให้แก้ทีหลัง
ใช้ Map.entry กับ Map.ofEntries สำหรับตารางคงที่ พร้อมข้อจำกัด null, duplicate key และ Java 17 assertions
Java delayedExecutor: หน่วงการส่งงานโดยไม่สร้าง scheduler ใหม่ทุกจุด
ใช้ CompletableFuture.delayedExecutor ประกอบ async pipeline พร้อมแยก delay ออกจาก timeout และทดสอบบน Java 17
Java Duration parts: แยกวัน ชั่วโมง นาที วินาทีโดยไม่คำนวณ modulo เอง
ใช้ toDaysPart และเมธอด part อื่นของ Duration เพื่อแสดงช่วงเวลา พร้อม Java 17 assertions
Python os.fwalk: เดินต้นไม้ไฟล์พร้อม dir_fd เพื่อลด path race
ใช้ os.fwalk เปิดไฟล์แบบอ้างอิงไดเรกทอรีปัจจุบัน พร้อมอธิบายอายุของ descriptor และ unittest ที่รันจริง
Python zoneinfo.reset_tzpath: คุมแหล่งข้อมูล timezone ใน test และ deployment
เปลี่ยนเส้นทางค้นหา TZif แบบชั่วคราวอย่างมีวินัย พร้อม restore state และ unittest ที่รันจริง
Python tomllib + Decimal: อ่านเลขทศนิยมจาก config โดยไม่เสียเศษ
ใช้ parse_float ของ tomllib ส่งค่าทศนิยมเข้า Decimal ตั้งแต่ตอน parse พร้อม unittest ที่รันจริง
Bun.nanoseconds: จับเวลาช่วงสั้นด้วยนาฬิกา monotonic
วัด elapsed time ของโค้ดด้วย Bun.nanoseconds โดยไม่สับสนกับเวลาปฏิทิน พร้อมตัวอย่างที่รันจริง
Zig 0.16 Socket.createPair: สร้างช่องสื่อสารสองปลายสำหรับงานในโปรเซส
ทดลอง API socket pair ใหม่ใน std.Io พร้อมอธิบาย ownership, การปิด handle และจังหวะที่ควรเลือก pipe
Rust partition_point: หาเส้นแบ่งใน slice ที่เรียงตามเงื่อนไข
ใช้ binary search หา index แรกที่ predicate เปลี่ยนจากจริงเป็นเท็จ พร้อม edge cases และ test ที่รันจริง
Go cmp.Or: เลือกค่าตัวแรกที่ไม่เป็น zero value แบบอ่านรู้เรื่อง
ใช้ cmp.Or จัดลำดับค่า config, environment และ fallback โดยไม่ต้องเขียน if ซ้อน พร้อมตัวอย่างที่รันจริง
Go context.WithCancelCause: บอกเหตุผลที่งานถูกยกเลิก
ส่งสาเหตุผ่าน cancellation tree โดยยังรักษา contract ของ context พร้อม go test ที่รันจริง
Rust slice::chunk_by: แบ่งข้อมูลติดกันตามกติกาโดยไม่ copy
ใช้ chunk_by มอง slice เป็นช่วงต่อเนื่องตาม predicate พร้อมทดสอบ empty input, ศูนย์ และเส้นแบ่งกลุ่ม
Java CompletableFuture.orTimeout: ตั้งเวลาตายให้งานอะซิงก์
ใช้ orTimeout (Java 9+) ให้ Future ล้มด้วย TimeoutException เมื่อช้าเกิน — ตัวอย่างรันจริง
Java Stream.dropWhile: โยนคำนำหน้าทิ้ง แล้วเก็บหางที่เหลือ
คู่กับ takeWhile — dropWhile ตัดหัวที่ไม่ผ่านเงื่อนไข พร้อมตัวอย่างรันจริง
Python bisect.insort: สอดค่าใหม่แล้วยังเรียงอยู่
ใช้ bisect.insort คงลิสต์เรียงตอนแทรก พร้อมตัวอย่าง unittest — เหมาะคิวคะแนน/ตารางเวลาเล็ก ๆ
Python statistics.correlation: วัดแนวโน้มสองชุดตัวเลขใน stdlib
ใช้ statistics.correlation (3.10+) คำนวณ Pearson พร้อม unittest รันจริง — ไม่ต้องดึง NumPy แค่ดูความสัมพันธ์คร่าว ๆ
Java ConcurrentHashMap.compute: อัปเดตค่าต่อคีย์แบบ atomic
ใช้ compute เพื่อนับเคาน์เตอร์โดยไม่แข่ง get+put พร้อมตัวอย่างรันจริง
Java Stream.takeWhile: ตัดคำนำหน้าตามเงื่อนไข แล้วหยุดทันที
เทียบ takeWhile กับ filter/dropWhile พร้อมตัวอย่างรันจริง
Python typing.override: แสตมป์บอก type checker ว่าตั้งใจทับเมธอดแม่
ใช้ @override จาก typing (PEP 698) เพื่อจับชื่อเมธอดทับผิด พร้อม unittest รันไทม์
Python dataclasses.replace: คัดลอกแล้วแก้บางฟิลด์แบบปลอดภัย
ใช้ dataclasses.replace กับ dataclass ธรรมดาและ frozen พร้อม unittest
Python deque(maxlen): คิววงกลมที่ตัดของเก่าให้อัตโนมัติ
ใช้ collections.deque แบบ maxlen เพื่อเก็บหน้าต่างล่าสุด N ชิ้น พร้อม unittest
Java String.stripIndent: ตัดเยื้องร่วมของบล็อกข้อความ
ใช้ stripIndent กับ text block หรือสตริงหลายบรรทัดเพื่อตัดช่องว่างนำหน้าต่ำสุดร่วมกันโดยคงเนื้อหาสัมพัทธ์
Java thenCompose: ต่อ Future แบบแบน ไม่ซ้อน CompletionStage
ใช้ CompletableFuture.thenCompose เมื่อขั้นตอนถัดไปคืน Future อีกชั้น พร้อมเทียบ thenApply ที่ซ้อน
Python operator.methodcaller: เรียกเมธอดเป็นคีย์เรียง/แมปโดยไม่เขียนแลมบ์ดา
ใช้ operator.methodcaller สร้าง callable ที่เรียกเมธอดชื่อเดิม พร้อมอาร์กิวเมนต์ คู่กับ sorted/map
Python as_completed: เก็บผลงานขนานทีละชิ้นตามลำดับเสร็จ
ใช้ concurrent.futures.as_completed เพื่อประมวลผล future ที่เสร็จก่อนโดยไม่รอทั้งหมด พร้อม unittest

Java CompletableFuture.orTimeout: ตัดงานช้าด้วยหมดเวลาในตัว
สอนใช้ CompletableFuture.orTimeout เพื่อล้มอนาคตที่ค้างเกินกำหนด พร้อม java-test ที่รันบน JDK ของเครื่อง

อ่านไฟล์ TOML ด้วย tomllib ในสแตนดาร์ดไลบรารี
สอนโหลดคอนฟิก TOML ด้วย tomllib.load / loads พร้อม unittest ที่รันจริง ไม่ต้องติดตั้งแพ็กเกจภายนอก

Python itertools.batched: หั่นลิสต์เป็นก้อนคงที่แบบสั้น ๆ
สอนใช้ itertools.batched แบ่ง iterable เป็นทูเปิลขนาด n พร้อม unittest ที่รันจริง อ้างอิง docs.python.org

Java Collectors.teeing: สรุปสตรีมสองมุมในครั้งเดียว
ใช้ Collectors.teeing รวมผล average กับ count จากสตรีมเดียว พร้อมเมธอด main และการ assert

Python StrEnum: ติดป้ายสถานะที่เป็นสตริงโดยไม่ต้อง .value ทุกครั้ง
ใช้ enum.StrEnum ให้สมาชิกเทียบและต่อสตริงได้ตรง ๆ พร้อม unittest อ้างอิงเอกสารมาตรฐาน

Python lru_cache: จำผลคำนวณซ้ำให้ฟังก์ชันบริสุทธิ์เร็วขึ้น
อธิบาย functools.lru_cache แบบสั้น พร้อม unittest ที่พิสูจน์ว่าเรียกซ้ำไม่คำนวณใหม่
Rust 1.98: substr_range คืนช่วง byte ของ slice โดยไม่ค้นซ้ำ
ทำความเข้าใจ str::substr_range สำหรับเชื่อม string slice กลับสู่ตำแหน่งต้นฉบับ พร้อมข้อจำกัดเรื่อง provenance และ UTF-8
Go 1.27: ใช้ go doc -ex หา executable example ก่อนเดา API
อ่านตัวอย่างที่ผูกกับ package และ symbol จากเครื่องตัวเองด้วย go doc -ex พร้อมวิธีใช้ให้ตรง module version
Java HttpClient: ตั้ง request timeout ไม่ให้ค้างรอปลายทาง
ใช้ java.net.http.HttpClient กับ timeout ต่อคำขอ พร้อม java-test ที่ยืนยัน Duration และพฤติกรรมหมดเวลา
Java CompletableFuture.orTimeout: ตั้งเส้นตายได้ แต่ไม่ได้หยุดงานเบื้องหลังให้
แยกเวลารอของ future ออกจากการยกเลิก I/O พร้อม test สำเร็จและ timeout บน Java 17
Java Map.copyOf คือ Snapshot แต่ unmodifiableMap ยังมองเห็นต้นฉบับเปลี่ยน
แยก immutable copy ออกจาก read-only view พร้อม assertions ที่เผย aliasing ของ map ต้นทาง
Java Optional: orElse สร้างค่าทิ้งได้ ส่วน orElseGet ทำเมื่อจำเป็น
เห็นผลของ eager กับ lazy fallback ชัด ๆ พร้อม assertion ที่กัน side effect เกิดทั้งที่มีค่าอยู่แล้ว
Python TopologicalSorter: เรียงงานจาก dependency และจับวงจรก่อนเริ่ม
สร้างแผนงานจากกราฟ predecessor พร้อม unittest สำหรับลำดับถูกต้อง งานอิสระ และ cycle
Python contextvars: ส่ง Request ID ข้าม async โดยไม่ปนกัน
ใช้ ContextVar แทน global สำหรับข้อมูลระดับ task พร้อม unittest ที่ปล่อยสอง coroutine วิ่งพร้อมกัน
Python zip(strict=True): ให้ข้อมูลคนละความยาวล้มตรงจุด ไม่เงียบหาย
ป้องกัน record ถูกตัดเมื่อสองลิสต์ยาวไม่เท่ากัน พร้อม unittest สำหรับ input ปกติ ว่าง และผิดรูป

Zig Workshop #1: วางโครง CLI ที่รันได้จริงด้วย build.zig ของ 0.16
เริ่ม workshop สร้าง zlog เครื่องมือวิเคราะห์ nginx access log — zig init ของจริงใน 0.16, build.zig.zon ที่บังคับ fingerprint, main ที่รับ std.process.Init, อ่าน argument, buffered stdout พร้อม flush และรหัสจบโปรแกรมที่ถูกต้อง

Zig 0.16 บทที่ 9: เลือก allocator ให้ถูกงาน และของที่หายไปใน 0.16
สวนสัตว์ allocator ของ Zig 0.16 — arena ที่ทำให้โค้ดคืนหน่วยความจำหายไปเกือบหมด (วัดได้ว่าลดการขอจาก 50 ครั้งเหลือ 5), FixedBufferAllocator, MemoryPool, stackFallback พร้อมทางย้ายสู่ BufferFirstAllocator ใน 0.17, DebugAllocator vs smp_allocator และรายชื่อ allocator ที่ถูกลบทิ้งใน 0.16

Zig 0.16 บทที่ 8: allocator คืออะไร และใครเป็นเจ้าของหน่วยความจำ
หัวใจของ Zig คือไม่มี allocator ตั้งต้น — ทำความเข้าใจ interface ที่มีแค่สี่ฟังก์ชัน, ธรรมเนียมว่าใครเป็นเจ้าของผลลัพธ์, เขียน allocator ของตัวเองที่นับการใช้งานได้, และรายงาน leak จริงจาก DebugAllocator ที่ผมรันให้ดูทั้ง output และรหัสจบโปรแกรม

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

Zig 0.16 บทที่ 6: error ที่คอมไพเลอร์ไม่ยอมให้คุณเมิน
ระบบ error ของ Zig ไม่มี exception ไม่มีการคลี่ stack และเมินไม่ได้ — error set เป็นชนิดข้อมูล, try/catch/errdefer, switch บน error ที่ต้องครบทุกกรณี และ error return trace ที่ผมรันจริงแล้วพบว่า ReleaseSafe ปิดไว้ ต่างจากที่เอกสารส่วนใหญ่บอก พร้อมเทียบกับ C++, Java, C#, Go และ Rust

Zig 0.16 บทที่ 5: comptime กลไกเดียวที่แทน macro, template และ reflection ทั้งหมด
comptime คือการรันภาษา Zig เองตอนคอมไพล์ — สร้างตาราง lookup ล่วงหน้า, เขียน generic ด้วยฟังก์ชันที่คืน type, อ่านโครงสร้าง struct ด้วย @typeInfo และ inline for, ตรวจความถูกต้องด้วย @compileError และ @Int ที่มาแทน @Type ใน 0.16 พร้อมตัวอย่างที่รันผ่านจริง

Zig 0.16 บทที่ 4: ทำไม I/O ต้องส่ง io ไปทุกที่ และข้อความที่เขียนไม่เหมือนเดิม
หัวใจของการเปลี่ยนแปลงใน Zig 0.16 — I/O กลายเป็นพารามิเตอร์เหมือน allocator, writer ที่คุณต้องส่ง buffer ให้เองและต้อง flush, อ่านไฟล์ทีละบรรทัดด้วย takeDelimiter, จัดการ CRLF ของ Windows และ format method ที่เปลี่ยน signature จนโค้ดเก่าใช้ไม่ได้

Zig 0.16 บทที่ 3: struct, enum, union และคอนเทนเนอร์ที่เปลี่ยนไปทั้งหมด
ประกอบข้อมูลเป็นก้อนใหญ่ใน Zig 0.16 — struct กับ decl literal, enum ที่ switch ครบทุกกรณีหรือคอมไพล์ไม่ผ่าน, tagged union แทน inheritance, การจัดวางหน่วยความจำที่คอมไพเลอร์เรียงให้เอง และ ArrayList/HashMap/MultiArrayList แบบ 0.16 ที่ใช้ไม่เหมือนเดิม

Zig 0.16 บทที่ 2: ชนิดข้อมูลและการควบคุมการทำงาน ที่ไม่มีอะไรซ่อนไว้
เจาะพื้นฐานภาษา Zig 0.16 — จำนวนเต็มความกว้างใดก็ได้, การล้นที่ Zig ถือว่าผิดกฎทั้ง signed และ unsigned, optional ที่แทน null ได้จริง, ความต่างของ array กับ slice, ลูปที่วิ่งหลายชุดพร้อมกัน, labeled switch และ defer พร้อมตัวอย่างที่รันผ่านจริงทุกชิ้น

เริ่มต้น Zig 0.16 ตั้งแต่ติดตั้ง: ทำไม tutorial เก่าที่คุณเจอถึงคอมไพล์ไม่ผ่าน
บทแรกของชุดเรียน Zig ภาษาไทย — ติดตั้ง Zig 0.16.0 บน Windows, macOS และ Linux, เขียนโปรแกรมแรกสองแบบ, ตั้งโปรเจกต์ด้วย zig init และเข้าใจว่าทำไมโค้ดตัวอย่างส่วนใหญ่บนอินเทอร์เน็ตตอนนี้ใช้กับ 0.16 ไม่ได้
25 เทคนิค Go ที่นักพัฒนามืออาชีพใช้จริงในงาน Production
รวม 25 เทคนิค Go (Golang) ที่ใช้ได้จริงตั้งแต่ goroutines, channels, context, error handling ไปจนถึง generics, structured logging และฟีเจอร์ใหม่ใน Go 1.25/1.26 พร้อมตัวอย่างโค้ดและ diagram ประกอบทุกหัวข้อ
คู่มือติดตั้ง Rust ฉบับเข้าใจง่าย
เรียนรู้วิธีติดตั้ง Rust และ Cargo บน Windows, macOS และ Linux แบบละเอียด พร้อมเคล็ดลับการตั้งค่า toolchain สำหรับมือใหม่
คู่มือติดตั้ง Go (Golang) ฉบับเข้าใจง่าย
เรียนรู้วิธีติดตั้ง Go (Golang) บน Windows, macOS และ Linux แบบ step-by-step พร้อมตัวอย่างโค้ดและเคล็ดลับสำหรับมือใหม่
Lynx.js Workshop ตอนที่ 1: เริ่มต้นเขียน Mobile App ด้วย ReactLynx
พี่โชว์พาทำความรู้จัก Lynx.js (ReactLynx) — framework สำหรับสร้าง mobile app ข้าม platform ด้วย React + TypeScript จาก setup โปรเจกต์จริง, รันบนมือถือด้วย QR code, จนเข้าใจโครงสร้าง element แบบ view/text