2026-09-10 · หน้าแก้คาราโอเกะเลือกหลายพยางค์พร้อมกันได้ แล้วปรับช่องเสียงทีเดียวทั้งช่วง · เดิม selected เป็นเลขตัวเดียว เลือกได้ทีละคำ เจ้าของต้องย่อทุกคำให้สั้นทีละตัว แล้วไล่ต่อกลับทีละตัวใหม่ ซึ่งเป็นงานที่เครื่องควรทำให้ · เพิ่ม selEnd เป็นปลายอีกข้างของช่วง เท่ากับ selected เมื่อเลือกคำเดียว ปุ่มเก่าทุกปุ่มจึงอ่าน selected ต่อได้เหมือนเดิม ไม่ต้องแก้ ลบ ผ่า รวม แทรก ปิดช่องว่าง เลยสักตัว · เลือกด้วย Shift+คลิก หรือกดค้างแล้วลากผ่านตัวอักษร ใช้ได้ทั้งบนแถวตัวอักษรและบนรางคลื่นเสียง · สี่ปุ่มใหม่ ลบ20ms เพิ่ม20ms เท่ากัน ยืดเต็ม ทั้งสี่ลงท้ายที่ rngLayout ตัวเดียวกัน ต่างกันแค่ตัวเลขที่ส่งเข้าไป การหนีบไม่ให้ทะลุจึงอยู่ที่เดียวและไม่มีทางหลุด · ทุกครั้งที่ปรับจะเฉลี่ยให้ทุกคำยาวเท่ากันไปในตัวตามที่เจ้าของสั่ง ซึ่งถูกในทางปฏิบัติด้วยเพราะของที่ AI ถอดเสียงมามักยาวไม่เท่ากันแบบสุ่ม การบวกเท่ากันทุกตัวโดยไม่เฉลี่ยจะรักษาความมั่วเดิมไว้ทั้งหมด · ขอบซ้ายไม่ขยับไม่ว่ากรณีไหน เจ้าของเลือกเอง เหตุผลคือคำแรกของช่วงคือจังหวะที่ต้องเริ่มร้อง ถ้ามันเลื่อนคนสวดจะเข้าผิดจังหวะทั้งวรรค ขยายไปทางขวาอย่างเดียวแล้วชนพยางค์ตัวถัดไปก็หยุด · ช่วงที่เลือกข้ามวรรคไม่ได้ ลากเลยไปจะถูกหนีบไว้ที่ขอบวรรค เพราะปุ่มปรับช่วงจัดคำให้ติดกันหมด ถ้าข้ามได้ ช่องว่างที่เว้นไว้ให้หายใจระหว่างวรรคจะถูกกลืนหายในคลิกเดียวโดยไม่มีอะไรเตือน · ไม่ทำปุ่มชิดกันตามที่เจ้าของสั่งว่าไม่เอา · rngA กับ rngB หนีบด้วยความยาวจริงของ toks ทุกครั้ง เพราะ undo สลับทั้งกองใหม่โดยไม่ผ่าน select ช่วงที่เลือกไว้จึงชี้เลยปลายอาร์เรย์ได้ แล้วลูปวาดที่วิ่งทุกเฟรมจะพังทั้งหน้า
| 1.82.0 |
2026-09-10 |
หน้าแก้คาราโอเกะเลือกหลายพยางค์พร้อมกันได้ แล้วปรับช่องเสียงทีเดียวทั้งช่วง · เดิม selected เป็นเลขตัวเดียว เลือกได้ทีละคำ เจ้าของต้องย่อทุกคำให้สั้นทีละตัว แล้วไล่ต่อกลับทีละตัวใหม่ ซึ่งเป็นงานที่เครื่องควรทำให้ · เพิ่ม selEnd เป็นปลายอีกข้างของช่วง เท่ากับ selected เมื่อเลือกคำเดียว ปุ่มเก่าทุกปุ่มจึงอ่าน selected ต่อได้เหมือนเดิม ไม่ต้องแก้ ลบ ผ่า รวม แทรก ปิดช่องว่าง เลยสักตัว · เลือกด้วย Shift+คลิก หรือกดค้างแล้วลากผ่านตัวอักษร ใช้ได้ทั้งบนแถวตัวอักษรและบนรางคลื่นเสียง · สี่ปุ่มใหม่ ลบ20ms เพิ่ม20ms เท่ากัน ยืดเต็ม ทั้งสี่ลงท้ายที่ rngLayout ตัวเดียวกัน ต่างกันแค่ตัวเลขที่ส่งเข้าไป การหนีบไม่ให้ทะลุจึงอยู่ที่เดียวและไม่มีทางหลุด · ทุกครั้งที่ปรับจะเฉลี่ยให้ทุกคำยาวเท่ากันไปในตัวตามที่เจ้าของสั่ง ซึ่งถูกในทางปฏิบัติด้วยเพราะของที่ AI ถอดเสียงมามักยาวไม่เท่ากันแบบสุ่ม การบวกเท่ากันทุกตัวโดยไม่เฉลี่ยจะรักษาความมั่วเดิมไว้ทั้งหมด · ขอบซ้ายไม่ขยับไม่ว่ากรณีไหน เจ้าของเลือกเอง เหตุผลคือคำแรกของช่วงคือจังหวะที่ต้องเริ่มร้อง ถ้ามันเลื่อนคนสวดจะเข้าผิดจังหวะทั้งวรรค ขยายไปทางขวาอย่างเดียวแล้วชนพยางค์ตัวถัดไปก็หยุด · ช่วงที่เลือกข้ามวรรคไม่ได้ ลากเลยไปจะถูกหนีบไว้ที่ขอบวรรค เพราะปุ่มปรับช่วงจัดคำให้ติดกันหมด ถ้าข้ามได้ ช่องว่างที่เว้นไว้ให้หายใจระหว่างวรรคจะถูกกลืนหายในคลิกเดียวโดยไม่มีอะไรเตือน · ไม่ทำปุ่มชิดกันตามที่เจ้าของสั่งว่าไม่เอา · rngA กับ rngB หนีบด้วยความยาวจริงของ toks ทุกครั้ง เพราะ undo สลับทั้งกองใหม่โดยไม่ผ่าน select ช่วงที่เลือกไว้จึงชี้เลยปลายอาร์เรย์ได้ แล้วลูปวาดที่วิ่งทุกเฟรมจะพังทั้งหน้า |
| 1.81.1 |
2026-09-08 |
ปุ่มตรวจในหน้าแก้ไฟล์คาราโอเกะฟ้องผิด — ตัวตรวจผิด ไม่ใช่ไฟล์ผิด · เจ้าของเปิดไฟล์โครง verses/lyrics ที่ AI ถอดเสียงมาให้ ซึ่ง AlignmentNormalizer รับได้สบายมาตั้งแต่ต้น แต่ปุ่มตรวจฟ้องว่า "วรรค N ไม่มีพยางค์" ครบทั้งสิบแปดวรรค แล้วล็อกปุ่มบันทึกไว้ ไฟล์ถูกต้องทุกตัวอักษรแต่บันทึกไม่ได้ และไม่มีอะไรบอกว่าใครผิด · ต้นเหตุคือ v1.81.0 ผมเขียนตัวตรวจไว้ในหน้าเว็บ ซึ่งรู้จักโครงเดียวคือ lines/tokens ส่วนตัวแปลงจริงรับห้าโครง sathu verses/lyrics lyrics-flat whisper-word และ lrc/srt · เป็นความผิดพลาดที่ผมเขียนคอมเมนต์เตือนตัวเองไว้ในไฟล์เดียวกันว่า ห้ามให้ผลของสองด่านขัดกันโดยไม่มีใครรู้ แล้วก็ทำแบบนั้นเองในบรรทัดถัดมา · แก้โดยเอาตัวตรวจในหน้าเว็บออกทั้งชุด ปุ่มตรวจยิงไปที่ POST /alignments/check ซึ่งเรียก AlignmentNormalizer ตัวเดียวกับตอนบันทึกจริง โดยไม่เขียนอะไรลงดิสก์ · ตอนนี้ผลจากปุ่มตรวจกับผลตอนกดบันทึกขัดกันไม่ได้เลยโดยโครงสร้าง ไม่ใช่เพราะเขียนให้ตรงกันด้วยมือ · ได้ของแถมคือปุ่มตรวจบอกชื่อรูปแบบที่ตรวจเจอ และเตือนเรื่องก้อนที่ควรซอยพยางค์กับพยางค์ที่ AI ไม่มั่นใจ ซึ่งตัวในหน้าเว็บทำไม่ได้อยู่แล้ว · หนีบข้อความผิดพลาดจากตัวแปลงก่อนแสดง เพราะมันเอาเนื้อไฟล์ของผู้ใช้ไปประกอบเป็นข้อความได้ |
| 1.81.0 |
2026-09-08 |
คลังไฟล์คาราโอเกะแก้เนื้อไฟล์ได้แล้ว ทับที่เดิม มีเลขรุ่น · เดิม /alignments/{sha} ไม่ใช่หน้าเว็บเลย มันตอบ application/json ตรง ๆ เบราว์เซอร์แค่แสดงเนื้อไฟล์ให้ดู และทั้งคลังแก้ได้อย่างเดียวคือชื่อ เพราะ update() รับแค่ title · ตอนนี้ที่อยู่เดิมกลายเป็นหน้าดูและแก้ ส่วนเนื้อดิบย้ายไป /alignments/{sha}/raw ซึ่งยังต้องมีเพราะเอาไปวางให้ AI อีกตัวอ่าน · ปัญหาที่ต้องแก้ก่อนถึงจะแก้ไฟล์ได้คือคีย์หลักเป็น sha256 ของเนื้อไฟล์ ซึ่งทำสองหน้าที่ขัดกัน เป็นชื่อเรียกที่ต้องไม่เปลี่ยน และเป็นลายนิ้วมือที่ต้องเปลี่ยนตามเนื้อ · แยกออกเป็น sha256 คงเดิมตลอดชีพของแถว กับ content_sha256 ที่เปลี่ยนทุกครั้งที่บันทึก การกันไฟล์ซ้ำตอนอัปโหลดย้ายไปดูช่องหลังทั้งหมด ถ้ายังดูคีย์หลักอยู่จะมีไฟล์เนื้อเดียวกันสองแถวโดยไม่มีใครรู้ · เจ้าของเลือกทับทิ้งไม่เก็บสำเนาเก่า เหตุผลคือไฟล์ต้นทางมาจาก AI สร้างใหม่ได้ และงานจริงอยู่ในร่างของบทอยู่แล้ว · ตรวจสองชั้น หน้าเว็บอ่าน JSON ให้ก่อนแบบเร็ว ๆ พร้อมเลขบรรทัดที่ผิด แล้วฝั่งเซิร์ฟตรวจอีกชั้นด้วย AlignmentNormalizer ตัวจริงที่รับ LRC SRT Whisper ได้ด้วย ถ้าแปลงไม่ผ่านจะไม่เขียนลงดิสก์เลย ไม่งั้นไฟล์เสียจะเข้าคลังไปแล้วพังตลอดกาลโดยหน้าคลังยังโชว์เหมือนปกติ · มีช่องติ๊กให้นำเข้าร่างของบทที่ใช้ไฟล์นี้ให้ด้วย ตั้งต้นติ๊กไว้ แต่แตะเฉพาะร่าง ไม่แตะเวอร์ชันที่เผยแพร่เด็ดขาด เพราะนั่นคือสิ่งที่แอปมือถือดาวน์โหลดไปใช้จริง การเปลี่ยนต้องเป็นการกระทำที่ตั้งใจ ไม่ใช่ผลข้างเคียง · แก้จุดที่ระบบไม่เคยรู้ว่าไฟล์ไหนใช้กับบทไหน เดิม content_id ถูกเติมเฉพาะตอนอัปไฟล์จากหน้าบท การหยิบจากคลังมาใช้ไม่เคยเติมเลย ตอนนี้เติมทั้งสองทาง จำได้ตั้งแต่นี้ไป ของเก่าที่เคยหยิบไปใช้แล้วยังว่างอยู่ · ล้าง \r\n จาก textarea ก่อนคิดลายนิ้วมือ ไม่งั้นเลขรุ่นจะเดินขึ้นทุกครั้งที่กดบันทึกโดยไม่ได้แก้อะไร |
| 1.80.0 |
2026-09-08 |
ปุ่ม "ใช้ไฟล์นี้" ในหน้าธรรมเทศนาเลิกบีบไฟล์คาหน้าจอ ส่งเข้าคิวแทน · เจ้าของกดใช้ไฟล์หลวงปู่ฝั้น 50 นาที แล้วได้หน้า error พอกดโหลดใหม่ได้ 405 Method Not Allowed ซึ่งไม่ได้บอกอะไรเลยว่าเกิดอะไรขึ้น · ต้นเหตุคือ attachStreamAudio เรียก ffmpeg บีบสดในคำขอเว็บ โดยปลด set_time_limit ทิ้งซึ่งไม่ช่วยอะไร เพราะตัวที่ตัดจริงอยู่ข้างนอกทั้งคู่ คือ nginx fastcgi_read_timeout และ Cloudflare ที่ตัดที่ 100 วินาที พอถูกตัด URL ค้างอยู่ที่ talk-audio-lib ซึ่งรับแต่ POST การโหลดใหม่จึงเป็น GET แล้วได้ 405 · และ log ว่างเปล่าเพราะคำขอที่ถูกตัดจากข้างนอกตายเงียบ ไม่ทันเขียนอะไร · ที่แย่กว่านั้นคือมันวนซ้ำได้ตลอด บีบไม่จบก็ไม่มีของบีบ พอไม่มีของบีบครั้งหน้าก็บีบสดอีกแล้วก็ตายอีก ไม่มีทางออกจากวงนี้เอง ไฟล์นี้จึงเป็นไฟล์ stream ตัวเดียวในคลัง 71 ไฟล์ที่ไม่มีของบีบ · แก้โดยเพิ่มงาน CompressLibrarySource เข้าคิวเดียวกับโฟลเดอร์รับไฟล์ ซึ่งคอมเมนต์ใน IngestInboxFile อธิบายเหตุผลไว้ครบตั้งแต่ v1.49.0 แล้ว หน้านี้แค่ไม่ได้ทำตามที่ตัวเองเขียนไว้ · ใช้ตาราง inbox_jobs ร่วมกัน เพิ่มช่อง source_sha256 เป็นตัวแยกชนิดงาน ได้หน้าคิว แถบเปอร์เซ็นต์ และการสั่งทำซ้ำมาฟรีทั้งชุด ไม่ต้องเขียนใหม่ · หน้าธรรมเทศนามีแถบคืบหน้าของตัวเอง ปิดหน้าได้ กลับมาดูทีหลังได้ และถ้ายังรอคิวอยู่แต่ไม่มีตัวเดินคิว หน้าเว็บจะปลุกให้เองครั้งเดียว · การสร้างเส้นเสียงที่เคยทำสด ๆ ในคำขอเดียวกันก็ย้ายเข้าคิวด้วย เป็นงานหนักตัวสุดท้ายที่ยังค้างอยู่ตรงนั้น การผูกไฟล์กับร่างเกิดก่อนเสมอ เพราะนั่นคือสิ่งที่คนกดปุ่มมาเพื่อให้เกิด · ไฟล์ที่ผูกทางหน้าเว็บเดิมไม่เคยถูกวัดความดัง ตอนนี้วัดแล้วเพราะอยู่ในคิวไม่ต้องรีบ · เพิ่ม php artisan chant:prepare ไว้ดูว่ามีไฟล์ไหนยังไม่มีของบีบบ้าง รันเปล่า ๆ ไม่ทำอะไร ต้องใส่ --run หรือ --queue ถึงจะทำ |
| 1.79.0 |
2026-09-08 |
หน้าแก้คาราโอเกะ — แทรกพยางค์แล้วได้คำว่าง ไม่ใช่ขีด และลากข้ามวรรคไม่ทะลุกันอีกแล้ว · เดิมปุ่ม + ก่อน / + หลัง ใส่ข้อความเริ่มต้นเป็น — ไว้ให้มองเห็นกล่องบนรางแล้วพิมพ์ทับ แต่ถ้าลืมพิมพ์ทับ ขีดนั้นติดไปในบทสวดจริงตอนเผยแพร่โดยไม่มีอะไรฟ้อง เพราะระบบมองว่าเป็นตัวอักษรปกติ เปลี่ยนเป็นค่าว่าง ซึ่งมองไม่เห็นก็จริงแต่ผิดแล้วเห็นชัดว่าผิด · ไม่แตะกฎตัวคั่น เพราะการแยก "ว่างเพราะเพิ่งแทรก" ออกจาก "ว่างเพราะเป็นตัวคั่น" ต้องติดธงเพิ่มในตัวพยางค์ แล้วธงจะไหลลงไปในไฟล์ร่างและเวอร์ชันที่เผยแพร่ กลายเป็นเปลี่ยนโครงข้อมูลเพื่อแก้เรื่องหน้าจอ · เรื่องที่สอง ตอนลากพยางค์บนราง ตัวกันซ้อนเช็คว่าเพื่อนบ้านอยู่วรรคเดียวกันไหม ถ้าคนละวรรคขอบกันชนกลายเป็น 0 กับความยาวไฟล์ = ไม่มีกันชนเลย ลากทะลุกันได้ทั้งตัว และปุ่มจัดให้เรียบร้อยก็ข้ามคู่ที่คร่อมรอยต่อวรรคด้วยเงื่อนไขเดียวกัน · แต่ AlignmentValidator ถือว่าซ้อนข้ามวรรคเป็น error ห้ามบันทึกเวอร์ชัน และข้อความ error บอกให้กดปุ่มจัดให้เรียบร้อยแก้ให้อัตโนมัติ ทั้งที่ปุ่มนั้นแก้เคสนี้ไม่ได้ เจ้าของจึงเจอ error ที่ไม่มีทางแก้และไม่รู้ว่าเกิดตอนไหน · ตัดเงื่อนไขวรรคออกทั้งสองที่ เวลาเป็นเส้นเดียว วรรคเป็นเรื่องการขึ้นบรรทัดบนจอเท่านั้น · ของแถม พอห้ามซ้อนแล้ว การคลิกเลือกพยางค์ที่เคยถูกตัวอื่นทับอยู่ก็ทำได้ · ไม่ไล่แก้ข้อมูลเก่าย้อนหลัง เพราะนั่นคือการแก้จังหวะคาราโอเกะของงานที่เผยแพร่ไปแล้วและฟังถูกอยู่ ปล่อยให้โผล่ตอนเปิดแก้บทนั้นเอง |
| 1.78.0 |
2026-09-07 |
หน้านโยบายเลิกแคชสิบนาที และมีเลขรุ่นบนหน้าให้ชี้ได้ว่ากำลังดูรุ่นไหน · สองฝั่งเถียงกันสองวันว่าหน้าอัปเดตแล้วหรือยัง ฝั่งนี้เห็นของใหม่ ฝั่งแอปเห็นของเก่า สุดท้ายเจ้าของเปิดดูเองแล้วพบว่าของใหม่ถูกต้อง ต้นเหตุคือเครื่องมือดึงหน้าเว็บฝั่งแอปมีชั้นแคชของตัวเองและอ่าน response header ไม่ได้เลย จึงยืนยันความสดของสิ่งที่ตัวเองเห็นไม่ได้ · เดิมหน้านี้ตอบ public max-age=600 ซึ่งใส่ไว้เองที่ v1.74.0 ด้วยเหตุผลว่าหน้าสาธารณะเนื้อหาไม่ค่อยเปลี่ยน เป็นนิสัยไม่ได้วัดอะไรมาก่อน แต่นโยบายความเป็นส่วนตัวคือเอกสารที่ต้องแสดงข้อความปัจจุบันเสมอ ไม่มีกรณีไหนที่การเสิร์ฟสำเนาเก่าเป็นเรื่องดี · เปลี่ยนเป็น no-cache must-revalidate ไม่ใช่ no-store เพราะ no-cache เก็บสำเนาได้แต่ต้องถามต้นทางก่อนใช้ทุกครั้ง ได้ความสดเท่ากันแต่ยังได้ 304 · ต้องส่ง ETag ไปด้วยไม่งั้น no-cache ไม่มีประโยชน์ เพราะการถามต้นทางจะได้ 200 พร้อมเนื้อหาเต็มทุกครั้งซึ่งไม่ต่างจาก no-store เลย คำนวณจากเนื้อหาที่จะส่งจริง เนื้อหาเปลี่ยนค่าก็เปลี่ยนเอง · เพิ่ม meta policy-version และบรรทัดท้ายหน้าที่คนอ่านเห็น ฝั่งแอปเสนอเองและคิดถูกกว่า เพราะถึงมีแคชคั่นอยู่ ถ้าเห็นเลขรุ่นเก่าก็รู้ทันทีว่ากำลังดูของเก่า แก้ปัญหาตรงกว่าการถอดแคชด้วยซ้ำ |
| 1.77.1 |
2026-09-06 |
ฉบับภาษาอังกฤษของหน้านโยบายสมบูรณ์ขึ้นสามจุด ตามที่ฝั่งแอปทักมาหลังเปิดหน้าจริงอ่านทีละบรรทัด · ตารางสิทธิ์ในฉบับอังกฤษเคยเป็นภาษาไทยล้วนแปดบรรทัด ทั้งที่หัวข้ออื่นแปลหมดแล้ว และเป็นหัวข้อที่ผู้ตรวจต้องอ่านที่สุดเพราะเอาไปเทียบกับ manifest ในบันเดิล เพิ่ม permissions_en ในไฟล์ตั้งค่า ถ้าจำนวนบรรทัดไม่เท่ากับของไทยจะถอยไปใช้ไทยทั้งชุด ดีกว่าจับคู่ผิดบรรทัดแล้วบอกเหตุผลของสิทธิ์ตัวอื่น · วันที่ในฉบับอังกฤษเคยเป็น 6 กันยายน 2569 คนต่างชาติเห็นเลข 2569 ในประโยคอังกฤษแล้วไม่รู้ว่าปีอะไร เพิ่ม effective_en กับ updated_en เขียนแยก ไม่แปลงอัตโนมัติ เพราะการแปลง พ.ศ. เป็น ค.ศ. ในโค้ดจะพังทันทีที่มีคนเขียนวันที่คนละรูปแบบ · หัวข้อเด็กและเยาวชนเคยเขียนว่าผู้ใช้ทุกวัยเข้าถึงได้ ซึ่งเป็นประโยคที่ผู้ตรวจหยิบมาถามได้เมื่อเทียบกับ Target audience ที่ประกาศไว้ที่ 13 ปีขึ้นไป เปลี่ยนเป็นเนื้อหาทั่วไปทางศาสนา ไม่ได้ออกแบบมาสำหรับเด็กโดยเฉพาะ ความหมายเดิมไม่เสียและตรงกับที่ประกาศ · ไม่มีอะไรในสาระเปลี่ยน ทั้งสามจุดเป็นเรื่องความครบถ้วนของฉบับแปล |
| 1.77.0 |
2026-09-06 |
แก้หน้านโยบายตามที่ฝั่งแอปแย้งใบ Data safety มา และแย้งถูกทั้งหมด · ผมเขียนในใบว่าห้ามติ๊ก Device or other IDs โดยอ้างว่าช่องนั้นหมายถึงรหัสที่ระบบปฏิบัติการให้ ซึ่งผิด เอกสารของ Google ระบุ Firebase installation ID ไว้ในหมวดนั้นด้วย ซึ่งเป็นรหัสที่ไลบรารีสุ่มขึ้นเองแล้วเก็บในพื้นที่ส่วนตัวของแอป รูปแบบเดียวกับ device_id.txt ของเราทุกประการ เกณฑ์จริงคือรหัสคงอยู่ข้ามครั้งการใช้งานและถูกส่งออกไปผูกกับบันทึกหรือไม่ ไม่ใช่ว่าใครเป็นคนสร้าง · เพิ่มกล่องอธิบายในหัวข้อ 2 ว่าทำไมการ์ด Data safety ขึ้นคำว่า Device or other IDs ทั้งที่รหัสนี้แอปสุ่มเอง เผื่อผู้ใช้เปิดการ์ดแล้วเห็นแล้วคิดว่านโยบายโกหก · เพิ่มหัวข้อ 12 เรื่องหมวดวิปัสสนาและการผ่อนคลาย ระบุว่าไม่กล่าวอ้างประโยชน์ทางสุขภาพหรือการรักษาใด ๆ และไม่เก็บข้อมูลสุขภาพเลย เพราะเจ้าของกรอกฟอร์ม Health apps ไปแล้วว่ามีฟีเจอร์ผ่อนคลาย ถ้านโยบายบอกว่าไม่ใช่แอปสุขภาพจะขัดกันเอง เลื่อนหัวข้อติดต่อเราเป็น 13 |
| 1.76.0 |
2026-09-06 |
หน้านโยบายความเป็นส่วนตัวประกาศใช้จริงแล้ว ปลดจากสถานะร่าง · ฝั่งแอปส่งสองบล็อกสุดท้ายมาครบ อ่านจาก merged manifest ในบันเดิลที่จะอัปโหลดจริง ไม่ใช่จากไฟล์ต้นทาง คือรายการเดียวกับที่ Google จะเห็นตอนสแกน · สิทธิ์แปดตัวพร้อมเหตุผลรายตัว รวมทั้ง VIBRATE ที่ปลั๊กอินประกาศมาเองซึ่งเขียนกำกับตามจริงว่าแอปไม่ได้เรียกใช้ ไม่ปิดบัง เพราะผู้ใช้เห็นมันในหน้ารายละเอียดแอปอยู่ดี · SCHEDULE_EXACT_ALARM ถูกถอดออกตั้งแต่ 4 กันยา รายการเก้าตัวที่เคยมีจึงเป็นของเก่า · ของที่แอปเก็บในเครื่องเพิ่มอีกสี่กลุ่ม ตำแหน่งที่สวดค้าง สำเนารายการเนื้อหาและปฏิทินไว้เปิดตอนไม่มีเน็ต ดัชนีไฟล์ที่โหลดครบ และเวลาแจ้งเตือนที่ตั้งล่วงหน้า ทั้งหมดอยู่ในพื้นที่ส่วนตัวของแอป ไม่มีฐานข้อมูลและไม่เขียนไฟล์นอกพื้นที่นั้น · ธง ready เป็น true แถบร่างหายและ noindex หายไปด้วย ลิงก์เอาไปกรอกใน Play ได้แล้ว |
| 1.75.1 |
2026-09-06 |
เปลี่ยนอีเมลติดต่อในหน้านโยบายเป็น [email protected] · เจ้าของเปลี่ยนก่อนที่รุ่นก่อนหน้าจะขึ้นเซิร์ฟ อีเมลเดิมจึงไม่เคยเผยแพร่ออกไป · อีเมลนี้เป็นทั้งช่องติดต่อเรื่องความเป็นส่วนตัว และช่องทางรับเรื่องขอลบบันทึกตามที่ฝั่งแอปถามมา จึงต้องเป็นอีเมลที่เปิดอ่านจริง |
| 1.75.0 |
2026-09-06 |
เติมค่าจริงลงหน้านโยบายความเป็นส่วนตัว และทำการลบบันทึกเกิน 30 วันให้ทำงานจริง · เจ้าของให้ชื่อผู้พัฒนา อีเมล และวันที่ประกาศใช้ ส่วนฝั่งแอปยืนยันกลับมาว่าไม่มีเครื่องมือเก็บสถิติสักตัว ปิดการสำรองข้อมูลของ Android ทั้งสองช่องทาง ทำหน้าแสดงรหัสเครื่องพร้อมปุ่มคัดลอกแล้ว และรหัสยาว 8 ถึง 64 ตัวไม่ใช่ 32 ตายตัว หน้านโยบายเขียนตามนั้นทุกข้อ · เพิ่มขั้นตอนขอลบข้อมูลที่ทำตามได้จริง คัดลอกรหัสจากแอปแล้วส่งอีเมลมา ก่อนหน้านี้เขียนไม่ได้เพราะผู้ใช้ดูรหัสตัวเองไม่ได้ สิทธิ์ตาม พ.ร.บ. จึงเป็นสิทธิ์บนกระดาษ · การลบผูกกับตอนมีคำถามใหม่เข้ามา ไม่ใช้ตัวตั้งเวลา เพราะตรวจแล้วเซิร์ฟไม่ได้ตั้ง cron ของ Laravel ไว้เลย ถ้าเขียนเป็นงานตามเวลามันจะเงียบสนิทโดยไม่มี error ให้ใครเห็น แล้วหน้านโยบายจะประกาศว่าลบทุก 30 วันทั้งที่ไม่เคยลบเลย · จำนวนวันอ่านจาก config/privacy.php ที่เดียว ที่เดียวกับที่หน้าเว็บอ่าน หน้าเว็บกับโค้ดจึงพูดเลขเดียวกันเสมอ · เพิ่มกล่องอายุของบันทึกในแท็บการใช้งาน บอกจำนวนแถว วันที่เก่าสุด และอายุของแถวเก่าสุด ประกาศต่อสาธารณะแล้วต้องมีที่ให้ตรวจว่าลบจริง · ธง ready ยังเป็น false เพราะยังขาดรายชื่อสิทธิ์ที่แอปขอและรายการที่แอปเก็บในเครื่อง |
| 1.74.0 |
2026-09-05 |
เพิ่มหน้านโยบายความเป็นส่วนตัวที่ /privacy · Google Play บังคับให้ทุกแอปมีลิงก์นโยบายที่เปิดได้สาธารณะ ไม่มีก็ขึ้นแอปไม่ได้ · เส้นทางอยู่นอกกลุ่ม auth เพราะคนตรวจของ Google เปิดโดยไม่มีบัญชีของเรา ถ้าเผลอย้ายเข้าไปจะเด้งไปหน้าล็อกอินแล้วแอปถูกตีกลับ และจะไม่มีอะไรฟ้อง เพราะคนที่ล็อกอินอยู่เปิดได้ปกติ · เนื้อหาเขียนจากสิ่งที่ระบบทำจริง ไม่ใช่แม่แบบสำเร็จรูป ตาราง ai_usages ไม่มีคอลัมน์เก็บข้อความ ไม่เก็บไอพี ไม่มีบัญชีผู้ใช้ ส่งข้อความไปประมวลผลที่ Gemini ของ Google และผ่าน Cloudflare ทั้งหมดนี้ต้องบอกตามตรง · ค่าที่ยังไม่รู้แยกไปอยู่ config/privacy.php ทั้งหมด ช่องไหนยังไม่เติมจะขึ้นเป็นแถบสีบนหน้าเว็บ ไม่หายเงียบ เพราะเอกสารที่เว้นช่องแล้วดูเหมือนเสร็จ อันตรายกว่าเอกสารที่ยังไม่ได้เขียน · ธง ready ยังเป็น false จึงใส่ noindex และขึ้นแถบว่ายังเป็นร่าง · จำนวนคู่สนทนาที่ส่งไปด้วยอ่านจากค่าตั้งจริงของหมวด AI ไม่ใช่ตัวเลขที่พิมพ์ค้างไว้ ไม่งั้นวันหนึ่งหน้านี้จะพูดไม่ตรงกับสิ่งที่ระบบทำ ซึ่งในเอกสารแบบนี้แปลว่าให้ข้อมูลเท็จ |
| 1.73.3 |
2026-09-04 |
ลบ backdrop_min_own ออกจากค่าตั้ง player_ui · ค่านี้ใส่ไว้เองที่ v1.19.1 โดยไม่มีใครขอ ความหมายคือบทที่มีภาพของตัวเองน้อยกว่า 5 รูปให้เอาชุดกลางมาปนเพิ่ม และมันคือต้นเหตุจริงของบั๊กภาพพื้นหลังที่เจ้าของเจอ · บทเจริญพระพุทธมนต์มีภาพ 5 รูปพอดี ยืนบนเส้นแบ่งเป๊ะ ภาพใดภาพหนึ่งโหลดไม่ทันจำนวนเหลือ 4 แอปก็ยัดชุดกลาง 75 รูปเข้ามา ผู้ใช้จึงเห็นภาพนอกเรื่องสลับมาเป็นครั้งคราวโดยไม่มีใครสั่ง และเป็นบั๊กที่ขึ้นกับว่าโหลดเสร็จหรือยัง จึงโผล่บ้างไม่โผล่บ้าง ไล่ยาก · ฝั่งแอปเลิกอ้างค่านี้แล้วและแจ้งกลับมาให้ถอด ถ้าปล่อยค้างไว้ในฐานมันจะยังถูกส่งออกไปทุกเครื่อง แล้ววันหนึ่งจะมีคนอ่านเจอแล้วเขียนโค้ดมาใช้มันอีก · ไม่ลบ backdrop_max_per_item เพราะตัวนั้นยังทำงานจริง หน้าเลือกภาพใช้เป็นเพดาน · ขยับเลขรุ่นทั้งสองตัวใน migration เพราะค่านี้อยู่ใน features ซึ่งส่งไปกับ head และ list |
| 1.73.2 |
2026-09-04 |
ทุกบทส่ง items[].backdrops ของตัวเองเสมอ และการแตะภาพขยับ list_version แล้ว · เจ้าของผูกภาพห้ารูปให้บทเจริญพระพุทธมนต์ แต่บนมือถือขึ้นภาพที่ไม่ได้อยู่ในห้ารูปนั้น ตรวจ /v1/list แล้วพบว่าเซิร์ฟส่งครบทั้งห้ารูปจริง แปลว่าของถูกส่งไปแล้วแต่ไม่ถูกใช้ · ต้นเหตุเชิงออกแบบคือกติกา "ไม่มีคีย์ backdrops = ให้ไปใช้ชุดกลางเอง" ซึ่งเป็นกติกาที่ฝั่งเซิร์ฟบังคับไม่ได้และตรวจไม่ได้ว่าอีกฝั่งทำตามหรือเปล่า ตอนนี้บทที่ไม่ได้เลือกภาพจะได้ชุดกลางยัดมาเต็มในคีย์เดียวกัน ไม่มีกรณีไม่มีคีย์ให้ต้องเดาอีก ภาพที่ควรขึ้นของบทหนึ่งอยู่ในที่เดียว · แลกด้วยลิสต์ใหญ่ขึ้นเพราะบทที่ไม่ได้เลือกภาพแบกรายชื่อทั้งคลังไปด้วย เป็นชื่อกับ url ไม่ใช่ตัวไฟล์ และ gzip บีบของซ้ำแบบนี้ได้เยอะ · แก้เลขรุ่นด้วย การผูกภาพเดิมเรียก bump ซึ่งขยับแค่ catalog_revision ทั้งที่เอกสารที่ส่งให้ฝั่งแอปบอกว่าให้ดึงลิสต์ใหม่เมื่อ list_version เปลี่ยน แอปที่ทำตามเอกสารจึงไม่มีวันเห็นภาพที่เพิ่งผูก เปลี่ยนเป็น bumpList ทั้งการผูกภาพประจำบทและทุกการแตะคลังภาพ เพราะตอนนี้การแตะคลังเปลี่ยนเนื้อของทุก item ไม่ใช่แค่ก้อนกลางก้อนเดียว |
| 1.73.1 |
2026-09-02 |
แก้หน้า AI กดบันทึกไม่ได้ทั้งหน้า และเลิกดึงชื่อบทเข้าคลังคำ · เรื่องแรกเป็นของที่ทำพังเองตั้งแต่ v1.72.1 ปุ่มโหลดค่าตั้งต้นแต่ละปุ่มเป็นฟอร์มของตัวเอง แล้วไปวางซ้อนอยู่ในฟอร์มใหญ่บันทึกทั้งหมด ซึ่ง HTML ทำไม่ได้ เบราว์เซอร์ปิดฟอร์มใหญ่ทิ้งที่แท็กปิดตัวแรก ทุกช่องที่อยู่ต่อจากนั้นรวมทั้งโควตาต่อคนต่อวันและตัวปุ่มบันทึกหลุดออกนอกฟอร์ม กดแล้วเงียบ เจ้าของเจอตอนจะแก้โควตา ส่งขึ้นไปโดยไม่ได้เปิดหน้าดูหลัง deploy ทั้งที่เป็นข้อในรายการตรวจของตัวเอง · แก้โดยให้ปุ่มเป็นปุ่มเปล่าชี้ไปหาฟอร์มด้วยแอตทริบิวต์ form ส่วนฟอร์มจริงย้ายไปอยู่ล่างสุดนอกฟอร์มอื่นทั้งหมด ใช้ได้ทั้งในและนอกฟอร์มใหญ่ ไม่ต้องพึ่ง JS และเพิ่มการตรวจฟอร์มซ้อนฟอร์มไว้ในขั้นตอนก่อนส่ง · เรื่องที่สองเจ้าของทักว่าไม่เคยสั่งให้ดึงชื่อบทมาเป็นคำ ซึ่งถูก ใส่ไว้เองตั้งแต่รุ่นแรกของตัวคั่น ชื่อบทในระบบมีเลขนำหน้าและเป็นประโยคยาว เก็บทั้งบรรทัดก็ไม่มีวันตรงกับที่ใครพิมพ์ ซอยเป็นชิ้นก็ยังได้ชิ้นที่ไม่ใช่คำที่คนใช้ ได้คำเกินมา 56 คำโดยแทบไม่มีคำไหนทำงาน และเป็นคำที่เจ้าของแก้ไม่ได้เพราะมาจากชื่อไฟล์ · ตอนนี้ทุกคำในคลังมาจากช่องในหน้าหลังบ้าน เห็นคำไหนก็แก้คำนั้นได้ ทดสอบแล้วคำถามที่ควรผ่าน 25/25 ควรดัก 8/8 เท่าเดิม แปลว่าคำจากชื่อบทไม่ได้ทำงานอยู่จริง |
| 1.73.0 |
2026-09-02 |
กล่องคลังคำบอกที่มาของทุกคำ เพิ่มช่องคำที่ไม่เอา และช่องทดลองไม่โหลดหน้าใหม่แล้ว · เดิมรายการคำอยู่บนสุดของแท็บ ส่วนช่องที่แก้มันอยู่ล่างสุด ห่างกันจนไม่มีอะไรเชื่อมว่าอันไหนแก้อันไหน และคำในรายการไม่บอกที่มา เจ้าของเห็น นิพพาน กับ พ่อลี วัดอโศการาม อยู่ติดกัน ตัวแรกลบได้จากกล่องคำแกน ตัวหลังลบไม่ได้เพราะมาจากชื่อบท แต่หน้าจอไม่บอก เจ้าของถามตรง ๆ ว่าจะเพิ่มหรือลบมันยังไง · ย้ายรายการมาอยู่ในกล่องเดียวกับช่องที่แก้มัน และติดสีบอกที่มาสามแบบ คำแกน เติมเอง จากชื่อบท · เพิ่มช่องคำที่ไม่เอา ตัดออกท้ายสุดจึงตัดได้ทุกที่มา รวมทั้งคำจากชื่อบทซึ่งเป็นที่มาเดียวที่แก้จากหน้านี้ไม่ได้ ถ้าไม่มีช่องนี้ ชื่อบทที่สร้างคำกว้างเกินไปจะปล่อยของนอกเรื่องหลุดผ่านตลอดไป ทางแก้เดียวคือไปเปลี่ยนชื่อบท ซึ่งกระทบผู้ใช้ · ช่องลองกับช่องทดลองถามยิงด้วย fetch แล้ววาดผลตรงนั้น ไม่โหลดหน้าใหม่ เจ้าของบอกว่ากดทีไรหน้าเด้งแล้วปวดตา ซึ่งจริงเพราะช่องทดลองอยู่กลางหน้า พอโหลดใหม่ต้องเลื่อนหาที่เดิมทุกครั้ง คอนโทรลเลอร์ตอบได้สองแบบ ทั้ง JSON และแบบเดิม ฟอร์มยังเป็นฟอร์มจริงและยิงไปที่เดิม ถ้า JS ไม่ทำงานจะส่งแบบเดิมและยังใช้ได้ ไม่กลายเป็นปุ่มที่กดแล้วเงียบ · ปุ่มขึ้นว่ากำลังทำงานและกดซ้ำไม่ได้ระหว่างรอ เพราะการถามจริงใช้เวลาหลายวินาที |
| 1.72.1 |
2026-09-02 |
เพิ่มปุ่มโหลดค่าตั้งต้นที่ทุกกล่องที่มีค่าตั้งต้น พร้อมป้ายบอกว่ากล่องไหนถูกแก้ไว้เองแล้ว · ต้นเหตุ all() เอาค่าในฐานทับค่าตั้งต้นเสมอ ซึ่งถูกเพราะของที่เจ้าของแก้ต้องชนะ แต่แปลว่ากล่องที่เคยกดบันทึกไปครั้งเดียวจะแช่ค่าเก่าไว้ตลอด และค่าตั้งต้นที่ปรับปรุงในรุ่นใหม่จะไปไม่ถึงหน้าจอ โดยไม่มีอะไรฟ้องเลย · เกิดขึ้นจริงที่ v1.72.0 คลังคำแกนขยายจาก 99 เป็น 198 แต่ฐานมีลิสต์เก่า 100 บรรทัดทับอยู่ เจ้าของ deploy แล้วทดสอบ ยังถูกดักเหมือนเดิมทั้งสี่ข้อ กว่าจะรู้สาเหตุต้องเข้า ssh ไปเทียบ ถ้าเป็นกล่องที่ไม่มีใครทดสอบ เช่นข้อความบทบาทระบบ จะไม่มีวันรู้เลย · ปุ่มนี้ลบคีย์ออกจากฐาน ไม่ได้เขียนค่าตั้งต้นทับลงไป เพราะลบแล้ว all() จะหยิบจากโค้ดให้เอง ซึ่งแปลว่ารุ่นถัดไปที่ปรับปรุงค่าตั้งต้นจะไหลมาถึงเองโดยไม่ต้องมากดซ้ำ ถ้าเขียนทับลงฐานจะแช่ค่าของวันนี้ไว้แล้วเจอปัญหาเดิมอีกรอบ · ป้ายข้างปุ่มบอกสองสถานะ ยังเป็นค่าตั้งต้น กับ คุณแก้ไว้เอง อย่างหลังเตือนตรง ๆ ว่าค่าตั้งต้นรุ่นใหม่จะไม่ไหลมาถึง · ปุ่มกดไม่ได้เมื่อยังไม่เคยแก้ จะได้ไม่มีใครกดแล้วสงสัยว่าเกิดอะไรขึ้น · ครอบสิบเอ็ดกล่อง คำสั่งกำกับบทบาท คำที่ผ่านเสมอ ข้อความต่อท้ายตอนเรื่องหนัก ข้อความบทบาทระบบหกชุด คำแกน และคำถามตัวอย่าง |
| 1.72.0 |
2026-09-02 |
รื้อตัวคั่นใหม่ทั้งชั้น หลังพบว่ามันดักคำถามพุทธศาสนาแท้ ๆ 13 จาก 17 ข้อ · เจ้าของทดสอบจากแอปจริงแล้วถูกดักห้าครั้งติด ทั้งที่พิมพ์คำอย่าง ลาสิกขา รัตนตรัย ซึ่งเป็นศัพท์พุทธล้วน · สาเหตุที่แท้จริงไม่ใช่จำนวนคำน้อย แต่คือเก็บคำยาวเกินไป คลังเก็บ พระรัตนตรัย ซึ่งครอบได้แค่ตัวมันเอง พอผู้ใช้พิมพ์ รัตนตรัย จึงไม่ตรง และเก็บ ธุดงค์ ที่มีการันต์ ทำให้ ธุดงควัตร ไม่ตรง · กฎใหม่คือเก็บแกนคำที่สั้นที่สุดที่ยังมีความหมาย แกนเดียวครอบได้สิบคำ เช่น สิกขา ครอบ ลาสิกขา สิกขาบท ไตรสิกขา และ บูชา ครอบ มาฆบูชา วิสาขบูชา อาสาฬหบูชา · เจ้าของเป็นคนชี้กฎนี้ · คลังคำแกนขยายจาก 99 เป็น 198 แกน จัดกลุ่มไว้ในไฟล์ให้เห็นว่าครอบเรื่องอะไรบ้าง ทดสอบกับคำถามจริง 21 ข้อที่ควรผ่านและ 8 ข้อที่ควรดัก ได้ 21/21 กับ 8/8 · ครั้งก่อนผมทดสอบด้วยประโยคที่ผมแต่งเองจากคลังคำที่ผมเพิ่งเขียน มันเลยผ่านหมดโดยไม่ได้พิสูจน์อะไรเลย · เพิ่มด่านที่เจ็ด ให้โมเดลตัดสินเองว่าคำถามอยู่ในกรอบไหม แล้วตอบกลับเป็น JSON สองช่องคือ in_scope กับ answer · เพราะตัวคั่นเห็นแค่ตัวอักษร ประโยคอย่าง ลาสิกขาไปซื้อปืนได้ไหม มีคำว่า สิกขา จึงผ่านแน่นอน แต่ครึ่งหลังไม่ใช่เรื่องศาสนา ไม่มีคลังคำแบบไหนตัดสินแบบนั้นได้ เจ้าของเป็นคนชี้จุดนี้ · เมื่อโมเดลบอกว่านอกกรอบ เซิร์ฟใช้ข้อความของบทบาทระบบแทนคำพูดของโมเดล ผู้ใช้จะได้ยินเสียงเดียวกันทุกครั้งที่ถูกปฏิเสธ ไม่ใช่บางครั้งตัวคั่นพูด บางครั้งโมเดลพูดคนละสำนวน · นับเป็น pass และกินโควตา เพราะยิงออกไปและจ่ายเงินไปแล้วจริง ถ้าไม่นับ คนที่ถามนอกเรื่องรัว ๆ จะถามได้ไม่จำกัด แยก reason เป็น out_of_scope จะได้ดูออกในรายงานว่าตัวคั่นหน้าปล่อยหลุดบ่อยแค่ไหน · คำสั่งเรื่องกรอบอยู่ในโค้ด ไม่ได้อยู่ในช่องคำสั่งกำกับบทบาทที่แก้ได้ เพราะมันคือสัญญาระหว่างโค้ดกับโมเดล ถ้าอยู่ในช่องที่แก้ได้ วันหนึ่งจะมีคนลบทิ้งแล้วตัวตัดสินจะเงียบหายโดยไม่มีอะไรฟ้อง · ถอด JSON ไม่ได้ให้ถือว่าอยู่ในกรอบและแสดงเท่าที่ได้มา เพราะเงินจ่ายไปแล้วและการปฏิเสธผิดแย่กว่าตอบไม่ครบ · เพิ่มคำถามตัวอย่างที่ฝั่งมือถือขอ ส่งไปกับ features.ai.config.examples ให้แอปทำเป็นปุ่มให้แตะ เซิร์ฟตรวจให้ก่อนว่าทุกบรรทัดผ่านตัวคั่นจริง เพราะปล่อยคำถามที่ตัวเองดักออกไปให้ผู้ใช้กด แย่กว่าไม่มีปุ่มเลย |
| 1.71.1 |
2026-09-02 |
แก้บั๊กที่รายการอนุญาตส่งออกไปแค่สองคีย์จากเจ็ดคีย์ · v1.71.0 กรองคีย์จากแถวในฐานข้อมูลตรง ๆ แต่แถวนั้นเก็บเฉพาะคีย์ที่เจ้าของเคยกดบันทึกจริง คีย์ที่เพิ่งเพิ่มเข้ามาในค่าตั้งต้นอย่าง sys_welcome sys_offtopic sys_reset quota_out sys_too_long ยังไม่เคยถูกเขียนลงแถว ตัวกรองจึงหาไม่เจอแล้วตัดทิ้งไปเงียบ ๆ · ผลคือแอปได้ไปแค่ crisis_note กับ exhausted ซึ่งแปลว่าข้อความทักทายตอนเปิดหน้าสนทนา ข้อความตอนเริ่มใหม่ และข้อความตอนถูกดัก จะไม่มีอะไรขึ้นเลยในแอป โดยไม่มีอะไรฟ้อง · แก้โดยให้หมวดคืนก้อนที่จะส่งออกเอง แทนที่จะให้ระบบสวิตช์ฟีเจอร์มากรองแถวในฐาน เพราะหมวดเป็นฝ่ายรู้ทั้งรายชื่อคีย์และค่าที่ผู้ใช้จะเจอจริง ซึ่งรวมค่าตั้งต้นเข้ามาแล้ว ไม่ขึ้นกับว่าเจ้าของเคยกดบันทึกหรือยัง · เจอเพราะตรวจ /v1/head หลัง deploy ตามที่วางไว้ ไม่ได้เจอจากรายงานของผู้ใช้ |
| 1.71.0 |
2026-09-02 |
เปิด POST /v1/ask ให้แอปถามได้จริง และปิดรูรั่วที่ /v1/head ในรุ่นเดียวกัน · ปิดรูรั่วก่อนเปิดเส้นทาง เพราะถ้าเปิดทั้งที่คลังคำยังหลุด ใครอ่าน /v1/head ได้ก็รู้ว่าพิมพ์คำไหนถึงจะผ่านด่านไปใช้เงินเจ้าของ · ระบบสวิตช์ฟีเจอร์เดิมใช้รายการห้ามส่วนกลางสี่คีย์แล้วส่งที่เหลือออกหมด หมวด AI มีคีย์เกือบยี่สิบตัว ที่เหลือจึงหลุดทั้งชุดตั้งแต่วันที่เปิดใช้งาน รวมทั้ง core_words ที่เป็นคลังคำของตัวคั่น และ daily_baht กับ price_ ที่บอกต้นทุนและบอกว่าต้องยิงกี่ครั้งระบบถึงจะหยุด · แก้โดยให้หมวดประกาศรายการอนุญาตของตัวเอง ฝั่งมือถือเสนอทางนี้และเหตุผลถูก รายการห้ามส่วนกลางต้องมีคนไปเติมทุกครั้งที่หมวดไหนเพิ่มคีย์ใหม่ แล้ววันหนึ่งจะมีคนลืม ซึ่งคือรูเดิมอีกรอบ รายการอนุญาตกลับด้าน คีย์ใหม่ไม่ถูกส่งออกโดยปริยายจนกว่าจะมีคนตั้งใจเติมชื่อ ลืมแล้วยังปลอดภัย ฟีเจอร์อื่นที่ไม่ได้ประกาศยังใช้กฎเดิม ไม่กระทบ · ด่านของ /v1/ask เรียงจากถูกที่สุดไปแพงที่สุด ปิดอยู่ ตั้งไม่ครบ ยิงถี่ งบรวมเต็ม โควตาคนนี้เต็ม ตัวคั่น แล้วค่อยยิงจริง ทุกด่านอยู่ที่เซิร์ฟ ห้ามเชื่อการกรองจากฝั่งแอปแม้แต่ด่านเดียว · ผลลัพธ์ทางธุรกิจตอบ 200 หมด ทั้งถูกดัก งบหมด โควตาหมด ยิงถี่ เพราะทั้งหมดคือระบบทำงานถูกต้อง ไม่ใช่คำขอผิดรูปหรือเซิร์ฟพัง ถ้าตอบ 4xx แอปจะไปตกในทางของ error handler แล้วแสดงข้อความพังทั่วไป ทั้งที่มีข้อความที่เจ้าของเขียนไว้ให้อ่าน เหลือ 503 ตอนปิดบริการ 502 ตอนเรียกโมเดลไม่สำเร็จ และ 422 ตอนคำขอผิดรูป · ห้ามยิงถี่กว่า 3 วินาทีต่อเครื่อง เจ้าของเลือกตัวเลขนี้ ไม่ใช้ throttle ของ Laravel เพราะมันนับตาม IP คนใช้ wifi เดียวกันจะโดนนับรวมเป็นคนเดียว ตัวจับเวลานับตามรหัสเครื่องที่แอปส่งมาแทน · รหัสเครื่องมาจากแอปและปลอมได้ รู้อยู่แล้วว่าปลอมได้ มันมีไว้แบ่งโควตาให้ผู้ใช้ปกติใช้ได้ทั่วถึง ไม่ใช่ไว้กันคนตั้งใจโกง คนที่ตั้งใจโกงถูกกันด้วยเพดานงบรวมซึ่งเป็นด่านเดียวที่กันเงินได้จริง · เพิ่มชุดข้อความสองกรณีที่ฝั่งมือถือขอ quota_out แยกจาก exhausted เพราะงบรวมหมดกับโควตาตัวเองหมดผู้ใช้ต้องทำต่างกัน และ sys_too_long แยกจาก sys_offtopic เพราะคนพิมพ์ยาวเกินที่ได้ยินว่าถามเรื่องธรรมะสิจะไปแก้ผิดจุดแล้วโดนดักซ้ำด้วยเหตุเดิม · ข้อความเรื่องหนักส่งแยกในคีย์ note ไม่ต่อท้ายคำตอบมาให้ เพราะเป็นเสียงของระบบไม่ใช่คำพูดของผู้ช่วย ถ้าเชื่อมเป็นก้อนเดียวแอปจะแยกไม่ออกว่าท่อนไหนใครพูด แล้วผู้ใช้จะเข้าใจว่า AI เป็นคนพูดประโยคนั้น · รับชื่อคีย์คำถามสามชื่อ q question text เพราะฝั่งแอปเขียนตัวยิงเสร็จก่อนสเปคออกและส่งไปทั้งสามชื่อ ยอมรับทั้งสามเพื่อไม่ให้ของที่เขียนไปแล้วต้องรื้อ แต่ชื่อที่รับประกันระยะยาวคือ q ชื่ออื่นเป็นทางถอยช่วงนี้เท่านั้น |
| 1.70.1 |
2026-09-02 |
แก้บั๊กที่ deploy v1.70.0 แล้วแอปไม่เห็นอะไรเปลี่ยนเลย · ไมเกรชัน sections ใส่เจ็ดแถวและทำให้ /v1/list มีก้อน sections อยู่จริงตั้งแต่วินาทีที่ deploy เสร็จ แต่ไม่ได้ขยับ list_version กับ catalog_revision /v1/head จึงยังบอกเลขเดิม แอปไม่มีเหตุผลให้ไปโหลดลิสต์ใหม่ และ ETag เท่าเดิมด้วย ต่อให้โหลดก็ได้ 304 กลับไป · อาการที่เห็นจากภายนอกคือขึ้นเซิร์ฟแล้วแต่ในแอปไม่มีอะไรเปลี่ยน ซึ่งแยกจากยังไม่ได้ deploy ไม่ออกเลย ฝั่งมือถือรายงานอาการนี้มาตรง ๆ · แก้ด้วยไมเกรชันที่ขยับเลขรุ่นหนึ่งครั้ง เขียน SQL ตรงไม่ผ่านโมเดล เพราะไมเกรชันต้องรันได้เหมือนเดิมในอีกสองปีแม้โมเดลจะถูกแก้ไปแล้ว · บทเรียน ไมเกรชันที่เพิ่มข้อมูลที่ /v1/list ส่งออก ต้องขยับเลขรุ่นในไมเกรชันเดียวกัน ไม่ใช่รอให้มีคนเข้าไปกดแก้อะไรในหลังบ้านก่อน กฎนี้เขียนไว้ใน CatalogState::bump() แล้ว แต่เขียนโดยคิดถึงคอนโทรลเลอร์เป็นหลัก จึงไม่มีอะไรเตือนตอนเขียนไมเกรชัน |
| 1.70.0 |
2026-09-01 |
หมวดหลักในแอปมีรูปประจำหมวดได้แล้ว และถูกส่งไปให้แอปเป็นครั้งแรก · ก่อนหน้านี้หมวดหลักทั้งเจ็ดเป็นตัวอักษรที่พิมพ์ฝังไว้ในไฟล์ layout ของหน้าเว็บ ไม่มีในฐานข้อมูล ไม่มีรูป และไม่เคยถูกส่งไปแอปเลยสักครั้ง ฝั่งแอปจึงต้องเขียนรายชื่อหมวดฝังไว้เอง แปลว่าเปลี่ยนชื่อหมวดทีหนึ่งต้องออกแอปใหม่ทั้งรอบ · เพิ่มตาราง sections พร้อมชุดตั้งต้นเจ็ดแถวในไมเกรชันเลย เพราะรายการนี้เป็นชุดปิดที่ฝั่งแอปพึ่งพา ถ้าปล่อยตารางว่างเมนูในแอปจะหายทั้งแถบตั้งแต่วินาทีที่ deploy เสร็จ · เจ้าของแก้ได้ ชื่อ รูป ลำดับ ซ่อนหรือแสดง แต่เพิ่มหรือลบไม่ได้ เพราะแต่ละแถวผูกกับหน้าจอที่มีอยู่จริงในแอป เพิ่มแถวแล้วแอปไม่มีหน้าให้เข้า ลบแถวแล้วแอปเหลือหน้าที่เข้าไม่ถึง · หมวด ai ซ่อนที่หน้านี้ไม่ได้ ให้อ่านค่าจากสวิตช์ที่หน้าสนทนาธรรมกับ AI มาแสดงแทน เพราะถ้าคุมได้สองที่ วันหนึ่งจะปิดที่หนึ่งแล้วงงว่าทำไมยังโผล่ · ตัวเลือกรูปเป็นตารางภาพจริง ไม่ใช่ช่องรายชื่อ เพราะการเลือกรูปจากชื่อแปลว่าต้องจำให้ได้ว่าภาพชื่อนั้นหน้าตายังไง เจ้าของทักเรื่องนี้ตอนเห็นภาพร่าง · หน้าจัดการหมวดย่อยยังเป็นช่องรายชื่ออยู่ ไม่ได้แก้เพราะไม่ได้สั่ง · หมวดที่ซ่อนไม่ถูกส่งไปในลิสต์เลย ไม่ได้ส่งไปพร้อมธงปิด เพราะแอปที่ลืมเช็คธงจะแสดงหมวดที่สั่งซ่อนไว้ · เรียงลำดับส่งคีย์ทั้งชุดกลับไป ไม่ใช่ส่งว่าขึ้นหรือลง ผลลัพธ์จะได้ไม่ขึ้นกับว่าใครกดพร้อมกันกี่คน |
| 1.69.7 |
2026-09-01 |
เลิกแบ่งหน้า AI เป็นสองคอลัมน์ทั้งแท็บตั้งค่าและแท็บตัวคั่น · โครง 1fr กับ 330px ผมยกมาจากหน้าอื่นโดยไม่ได้ดูว่าของในหน้านี้เหมาะกับมันไหม ผลคือของที่ต้องอ่านทวนอย่างประโยคที่ผู้ใช้จะได้อ่าน และคลังคำที่ต้องอ่านคำในนั้นได้จริง ไปเบียดอยู่ในช่อง 330px · ตอนนี้ทุกกล่องกินความกว้างเท่าที่เหลือจากเมนู ของเล็กเรียงแนวนอนอยู่ในกล่องของมันเอง · รวมกล่องเพดานงบกับกล่องราคาต่อโทเคนเป็นกล่องเดียว เพราะทั้งเจ็ดช่องเป็นตัวเลขที่หมุนราคาด้วยกัน ต้องมองพร้อมกันถึงจะตัดสินใจได้ · รวมกล่องคลังคำเข้ากับกล่องคำอธิบายตัวคั่น และย้ายรายการคำมาเต็มความกว้าง · คำที่ให้ผ่านเสมอกับข้อความต่อท้ายวางคู่กัน ไม่ซ้อนกันแล้ว · เลิกใช้ media query ที่ตั้งความกว้างไว้ตายตัว เปลี่ยนเป็น auto-fit ทั้งหมด เพราะช่วงที่แคบที่สุดไม่ใช่จอเล็กสุดแต่คือช่วงที่เมนูยังกางอยู่ เช่นหน้าต่าง 1024 เนื้อหาเหลือ 774 ส่วนที่ 900 เมนูหุบแล้วได้คืนทั้งจอ ตัวเลขตายตัวจึงพลาดช่วงกลางเสมอ |
| 1.69.6 |
2026-09-01 |
ย้ายกล่องเสียงของบทบาทระบบออกจากคอลัมน์ขวามาเป็นเต็มความกว้าง และเรียงช่องพิมพ์เป็นสองคูณสอง · ที่วางผิดเพราะกล่องใหม่ไปแทนที่กล่อง "ข้อความตอนงบหมด" เดิมซึ่งเคยอยู่ในคอลัมน์ขวาสมัยที่ยังเป็นช่องบรรทัดเดียว ผมย้ายเนื้อหาเข้าไปแทนที่โดยไม่ได้ถามว่าของใหม่ควรอยู่ตรงนั้นไหม · คอลัมน์ขวากว้าง 330px มีไว้ใส่ตัวเลขสั้น ๆ ที่ตั้งแล้วไม่ต้องกลับมาดู แต่ของใหม่คือช่องพิมพ์สี่ช่องที่เจ้าของต้องอ่านทวนว่าประโยคที่ผู้ใช้จะได้อ่านฟังดูเป็นยังไง เบียดอยู่ข้างกล่องตัวเลขจึงอ่านไม่ได้ · เจ้าของเห็นแล้วบอกว่าทำไมของที่ควรเป็นเนื้อหาหลักไปโดนบี้อยู่ริมขวา |
| 1.69.5 |
2026-09-01 |
เพิ่มบทบาทที่สองเข้ามา — เสียงของระบบ · เดิมมีบทบาทเดียวคือตัวที่ตอบ ส่วนตัวคั่นไม่มีเสียง มันคืนแค่รหัสว่าไม่ผ่านแล้วหน้าเว็บพิมพ์ป้ายว่า "ตัวคั่นดักไว้" ซึ่งเป็นภาษาของหลังบ้าน ไม่ใช่ภาษาที่จะพูดกับผู้ใช้ · เพิ่มชุดข้อความสี่กรณีในแท็บตั้งค่า บรรทัดละหนึ่งข้อความ ระบบสุ่มมาหนึ่งบรรทัด เว้นว่างแปลว่าไม่พูดอะไรเลยในกรณีนั้น · ข้อความพวกนี้ต้องเขียนไว้ล่วงหน้าห้ามให้โมเดลแต่งสด เพราะทุกกรณีในนี้คือกรณีที่ไม่ควรเสียเงิน ถ้าแต่งสดก็เท่ากับจ่ายเงินเพื่อบอกว่าไม่ควรจ่ายเงิน · ที่ต้องมีหลายบรรทัดเพราะคนหนึ่งคนจะโดนดักหลายครั้งในนาทีเดียว ประโยคเดิมเป๊ะทุกครั้งจะดูเหมือนเครื่องจักรพัง แต่การสุ่มไม่ได้แก้ต้นเหตุ โดนดักบ่อยแปลว่าคลังคำแคบไม่ใช่ผู้ใช้ผิด · ช่องข้อความตอนงบหมดเดิมเป็นบรรทัดเดียว ย้ายมารวมในกล่องนี้และรับหลายบรรทัดแล้ว ค่าเดิมที่ตั้งไว้ยังใช้ได้ทันทีเพราะหนึ่งบรรทัดคือหนึ่งข้อความ · ผลการทดลองถามตอนถูกดักและตอนงบเต็ม แสดงข้อความที่ผู้ใช้จะได้ยินจริงแทนที่จะเป็นป้ายภาษาหลังบ้านอย่างเดียว ไม่งั้นจะตั้งข้อความไปโดยไม่เคยเห็นของจริง และทำให้หน้าตาต่างจากคำตอบของ AI ชัดเจน เพราะถ้าเหมือนกันผู้ใช้จะคิดว่า AI เป็นคนปฏิเสธเขาทั้งที่มันไม่เคยเห็นคำถามด้วยซ้ำ · จงใจไม่ทำชุดข้อความสำหรับกรณีพิมพ์ยาวเกิน และไม่เอาชุดนอกเรื่องมาใช้แทน เพราะจะบอกผู้ใช้ว่าถามนอกเรื่องทั้งที่ความจริงคือพิมพ์ยาวเกิน แล้วเขาจะไปแก้ผิดจุด · เขียนกำกับที่ช่องโควตาต่อคนต่อวันว่ายังไม่ถูกบังคับใช้จริง ช่องที่ดูเหมือนคุมอะไรได้แต่ไม่คุมอะไรเลยแย่กว่าไม่มีช่อง |
| 1.69.4 |
2026-09-01 |
แก้ตัวคั่นที่ดักเกือบทุกอย่าง รวมทั้งคำถามเรื่องธรรมะตรง ๆ ที่ควรผ่าน — เจ้าของพิมพ์คำว่า มาฆบูชา แล้วถูกดัก · สาเหตุมีสองชั้น ชั้นแรกคือคลังคำเก็บชื่อเต็มทั้งชื่อ เช่น "001อภิวาทกรามไหว้ พระพุทธ พระธรรม พระสงฆ์" แต่ตัวคั่นหาว่าคำในคลังโผล่ในข้อความไหม ทิศทางนี้แปลว่าคำในคลังต้องสั้นกว่าสิ่งที่ผู้ใช้พิมพ์เสมอ ชื่อเต็มจึงไม่มีวันไปตรงกับอะไรเลยเพราะไม่มีใครพิมพ์ชื่อบทเต็ม ๆ มาถาม · ชั้นที่สองคือคลังคำไม่เคยมีคำที่คนใช้ถามจริงอย่าง ทำบุญ ศีล สมาธิ กรรม อยู่เลยสักคำ · แก้โดยซอยชื่อบทและชื่อหมวดเป็นชิ้นเก็บเพิ่มจากชื่อเต็ม ตัดที่ทุกอย่างที่ไม่ใช่ตัวอักษรและนับสระวรรณยุกต์เป็นตัวอักษรด้วยไม่งั้นคำจะขาดกลางสระ · เก็บชื่อวันสำคัญแบบไม่มีคำว่า วัน นำหน้าไว้ด้วยเพราะคนพิมพ์สองแบบ · เพิ่มช่องคำแกนพุทธศาสนาในแท็บตัวคั่น มีค่าตั้งต้น 99 คำให้แล้วและแก้ได้ทั้งหมดจากหน้าเว็บ · คำอธิบายเดิมบนหน้าที่เขียนว่า "ยิ่งเพิ่มเนื้อหา ตัวคั่นยิ่งฉลาดขึ้นเอง" ผิดและถูกเขียนใหม่ · เงื่อนไขล้างคลังคำหลังบันทึกเปลี่ยนไปเทียบค่าก่อนกับหลังตรง ๆ แทนที่จะไล่ดูว่ามีคีย์ไหนถูกส่งมา เพราะวิธีเดิมต้องเติมเงื่อนไขทุกครั้งที่เพิ่มช่องแล้ววันหนึ่งจะลืม · แก้ข้อความตัวอย่างในช่องรุ่นของโมเดลจาก gemini-2.5-flash-lite ที่ Google ปิดไปแล้วเป็น gemini-3.5-flash-lite |
| 1.69.3 |
2026-09-01 |
แก้บั๊กที่กดทดลองถามแล้วไม่เห็นผลลัพธ์ — แถบในหน้านี้ทำด้วย CSS ล้วน สถานะของแถบจึงอยู่ในหน้าที่กำลังแสดงเท่านั้น พอกดปุ่มแล้วเซิร์ฟตอบกลับ หน้าโหลดใหม่และเด้งกลับแถบแรกเสมอ ผลการทดลองที่แสดงอยู่ในแถบตัวคั่นจึงถูกซ่อนไปพอดี กดแล้วเหมือนไม่มีอะไรเกิดขึ้นทั้งที่ทำงานถูกทุกอย่าง · ผมรู้ข้อจำกัดนี้ตั้งแต่ทำแถบในหน้าปฏิทินและเขียนกำกับไว้ว่ายอมแลกได้ เพราะที่นั่นข้อความผลลัพธ์ขึ้นด้านบนซึ่งเห็นได้ทุกแถบ แต่หน้านี้ผลลัพธ์อยู่ในแถบ จึงไม่ใช่ข้อแลกอีกต่อไป กลายเป็นบั๊ก · แก้โดยให้แถบที่เปิดมาจาก ?tab= ที่เซิร์ฟส่งกลับ ไม่ใช่ค่าตายตัวในหน้า ปุ่มที่ผลลัพธ์อยู่แถบตัวคั่นจะพากลับไปแถบนั้นเอง · ยังไม่ต้องใช้ JS และกดสลับแถบเองยังทันทีเหมือนเดิม เพราะยังเป็น radio ไม่ได้เปลี่ยนเป็นลิงก์ · ชื่อแถบอยู่ในค่าคงที่ที่เดียวในคอนโทรลเลอร์ ถ้าวันหนึ่งเปลี่ยนชื่อจะแก้ที่เดียว |
| 1.69.2 |
2026-09-01 |
แก้หน้าสนทนาธรรมกับ AI ที่หน้าตาเพี้ยน — ช่องกรอกข้อความยาวทุกช่องกลายเป็นกล่องผอมมีแถบเลื่อน กว้างราวยี่สิบตัวอักษร เพราะ CSS กลางของโปรเจกต์ตั้ง width:100% ให้แค่ input กับ select ไม่ได้ตั้งให้ textarea หน้าอื่นไม่เคยเจอเพราะแทบไม่มีหน้าไหนใช้ textarea ยาว ๆ · แก้เฉพาะหน้านี้ ไม่ไปแตะ CSS กลาง เพราะไม่รู้ว่าหน้าอื่นพึ่งพฤติกรรมเดิมอยู่หรือเปล่า ถ้าแก้ที่กลางแล้วหน้าอื่นเพี้ยนจะเป็นการซ่อมหนึ่งพังสาม · ป้ายที่บอกว่ารุ่นนี้แอปยังเรียกไม่ได้ เดิมเบียดอยู่มุมขวาบนบรรทัดเดียวกับหัวเรื่อง อ่านไม่ทัน ย้ายลงมาอยู่บรรทัดคำอธิบายพร้อมเหตุผลว่าทำไมถึงยังไม่เปิด · ข้อความว่ายังตั้งอะไรไม่ครบ เดิมเบียดอยู่ข้างปุ่มเปิดใช้งาน ซึ่งเป็นข้อความที่สำคัญที่สุดบนหน้านี้ตอนยังตั้งไม่เสร็จ ย้ายมาอยู่บรรทัดของตัวเองพร้อมบอกว่าต้องไปตั้งที่ไหนต่อ |
| 1.69.1 |
2026-08-31 |
ย้ายเมนู AI จากกลุ่มระบบไปกลุ่มเนื้อหา และเปลี่ยนชื่อเป็น สนทนาธรรมกับ AI — ผมวางไว้กลุ่มระบบเพราะมองว่าหน้านี้มีกุญแจกับงบ จึงเป็นเครื่องมือของคนหลังบ้าน ซึ่งเป็นการมองจากมุมของโค้ด ไม่ใช่มุมของคนใช้ · เจ้าของทักว่าผิด เพราะฝั่งแอปมีหมวดสนทนาธรรมกับ AI อยู่ในเมนูหลักเหมือนกัน เมนูสองฝั่งจึงควรเรียงเหมือนกัน ไม่งั้นเวลาคุยกันเรื่องหมวดจะอ้างถึงคนละที่ · เหตุผลเดียวกับที่ปฏิทินย้ายมาอยู่กลุ่มนี้ที่ v1.62.0 · ชื่อหน้าและชื่อในระบบสวิตช์ฟีเจอร์เปลี่ยนตามให้ตรงกับเมนู |
| 1.69.0 |
2026-08-31 |
หมวด AI ฝั่งหลังบ้าน — ทำเฉพาะฝั่งเซิร์ฟก่อนโดยตั้งใจ ยังไม่มีเส้นทางสาธารณะให้แอปเรียก เพราะต้องพิสูจน์ด้วยมือของเจ้าของเองก่อนว่ามันทำงานได้จริง ก่อนเปิดให้ใครก็ได้บนอินเทอร์เน็ตยิงเข้ามาใช้เงิน · ข้อเท็จจริงข้อเดียวที่ตัดสินโครงทั้งหมดคือกุญแจ API ห้ามอยู่ในแอปเพราะแกะไฟล์ติดตั้งเจอ ทุกอย่างที่เสียเงินจึงต้องผ่านเซิร์ฟ และตัวคุมค่าใช้จ่ายทุกตัวต้องอยู่ฝั่งที่จ่ายเงิน · ไม่สร้างตารางค่าตั้งใหม่ ใช้ Feature ที่มีอยู่แล้ว เพราะ publicConfig ของมันตัดคีย์ model api_key endpoint system_prompt ออกก่อนส่งให้แอปอยู่แล้ว ซึ่งเป็นสี่คีย์ที่หมวดนี้ต้องซ่อนพอดี · กุญแจอยู่ในฐานไม่ใช่ .env เพราะเจ้าของต้องเปลี่ยนเองได้จากหน้าเว็บตอนย้ายจากรุ่นทดลองไปรุ่นเสียเงิน ถ้าอยู่ใน .env ต้องเข้า ssh ทุกครั้ง ซึ่งเป็นสิ่งที่ทั้งโปรเจกต์พยายามเลิก · ราคาต่อโทเคนเป็นค่าตั้งไม่ใช่ค่าคงที่ในโค้ด เพราะราคาเปลี่ยนได้และเปลี่ยนตามรุ่น ฝังไว้แล้ววันหนึ่งตัวเลขค่าใช้จ่ายบนหน้าเว็บจะโกหกโดยไม่มีใครรู้ · ตัวคั่นอยู่ที่เซิร์ฟเพราะหน้าที่จริงของมันคือกันเงินรั่วไม่ใช่มารยาท ตัวคั่นที่อยู่ในแอปใครแก้แอปก็ข้ามได้ · ตัวคั่นไม่ใช้ AI และไม่ต่อเน็ต ใช้คลังคำที่สร้างจากชื่อบท ชื่อหมวด และชื่อวันสำคัญที่มีอยู่แล้วในระบบ ยิ่งเจ้าของเพิ่มเนื้อหาตัวคั่นยิ่งฉลาดขึ้นเอง ถ้าใช้ AI คัดก็ต้องจ่ายเงินเพื่อรู้ว่าไม่ควรจ่ายเงิน ซึ่งกลับหัวกลับหาง · ภาษาไทยไม่มีช่องว่างจึงตัดคำไม่ได้ ต้องหาว่าคำในคลังโผล่ในข้อความหรือไม่ และต้องตัดคำสั้นกว่าสามตัวอักษรทิ้ง ไม่งั้นคำสั้นจะไปโผล่กลางคำอื่นแล้วตัวคั่นจะปล่อยผ่านทุกอย่างโดยที่ดูเหมือนทำงานอยู่ ซึ่งแย่กว่าไม่มีตัวคั่นเลย · เรื่องหนักผ่านตัวคั่นเสมอตามที่เจ้าของเลือก ตรวจก่อนคลังคำ คนที่เข้ามาพร้อมเรื่องสูญเสียหรือคิดสั้นต้องไม่ถูกปัดทิ้งเพราะบังเอิญไม่ได้เอ่ยคำว่าธรรมะ แต่รายการคำจับได้แค่กรณีตรงไปตรงมา เขียนกำกับไว้แล้วว่าลดโอกาสพลาดไม่ได้กันได้หมด · ข้อความต่อท้ายเรื่องหนักเว้นว่างไว้ตั้งใจ ถ้าจะใส่เบอร์สายด่วนต้องเป็นเบอร์ที่เจ้าของตรวจเองแล้วว่าถูก ระบบไม่ควรเดาเบอร์ให้เพราะเบอร์ผิดในสถานการณ์แบบนั้นแย่กว่าไม่มีเบอร์ · ตาราง ai_usages จงใจไม่มีคอลัมน์ข้อความแม้แต่ช่องเดียว เจ้าของตัดสินว่าไม่เก็บบทสนทนาที่ไหนเลยเพราะคนจะพิมพ์เรื่องส่วนตัว ราคาที่แลกคือมีคนบอกว่ามันตอบแปลกแล้วสืบไม่ได้ · เก็บเงินเป็นหนึ่งในล้านบาทเพราะคำถามหนึ่งราคาไม่ถึงหนึ่งสตางค์ ถ้าเก็บเป็นทศนิยมบาทจะปัดหายจนบวกทั้งวันแล้วได้ศูนย์ · ช่องทดลองถามจริงยิงออกไปจริงและนับรวมในบันทึกเดียวกับผู้ใช้จริง ไม่งั้นตัวเลขค่าใช้จ่ายจะไม่ตรงกับเงินที่จ่าย และเพดานงบจะไม่มีวันถูกทดสอบว่าหยุดจริงไหม · เปิดสวิตช์ไม่ได้ถ้ายังไม่ได้ตั้งกุญแจ งบ โควตา หรืออัตราแลกเปลี่ยน เพราะเปิดแล้วยิงออกไปโดยไม่มีเพดานคือเรื่องใหญ่ · เว้นช่องกุญแจว่างตอนบันทึกแปลว่าไม่แก้ ไม่ใช่ลบทิ้ง เพราะหน้าเว็บไม่เคยแสดงกุญแจกลับมา ถ้ารับค่าว่างตรง ๆ การกดบันทึกหลังแก้ช่องอื่นจะล้างกุญแจโดยไม่มีใครตั้งใจ · ใช้ cURL ตรงไม่เพิ่มไลบรารี โปรเจกต์นี้มี dependency แค่สองตัวและตั้งใจให้เป็นแบบนั้น · ตัดเองที่ยี่สิบวินาทีเพราะ Cloudflare ตัดคำขอที่ตอบช้าเกินราวร้อยวินาที ซึ่งเป็นสาเหตุของ 502 ที่เจอตอนอัปไฟล์เสียง ตัดเองดีกว่าให้มันตัดแล้วไม่มีข้อความอะไรบอก · ไม่ทำการไหลของคำตอบทีละตัวอักษรในรุ่นแรก เพิ่มทีหลังได้เมื่อรู้แล้วว่ามีคนใช้จริง · มี migration ต้องรัน deploy.sh |
| 1.68.0 |
2026-08-31 |
เพิ่มธง major ใน /v1/calendar บอกว่าวันนั้นเป็นหนึ่งในหกวันสำคัญทางพุทธ — มาจากการคุยกับฝั่งมือถือ เขาจะทำสวิตช์แจ้งเตือนสามอัน วันพระ วันสำคัญทางพุทธ วันหยุดราชการ แต่ข้อมูลที่เราส่งไปแยกวันพระธรรมดากับวันสำคัญไม่ออกเลย เพราะทั้งคู่เป็นกลุ่ม buddha เหมือนกันและมีกิจกรรมรายการเดียวเท่ากัน ต่างแค่ชื่อ ซึ่งเป็นสิ่งเดียวที่ห้ามเอามาตัดสิน · ฝั่งมือถือเขียนโค้ดที่เดาผิดไปแล้วจริง เดาว่าวันสำคัญจะมีกิจกรรมสองรายการคือตัวบอกวันพระกับตัวบอกชื่อวัน ผลคือวันมาฆบูชาจะถูกมองเป็นวันพระธรรมดาแล้วแจ้งเตือนขึ้นชื่อผิด และจะไม่มีใครเจอจนถึงมาฆบูชาปีหน้า เขาเจอเพราะเอาไฟล์ตัวอย่างที่เราส่งไปรัน · ธงอ่านจาก ThaiLunar::MAJORS ซึ่งเป็นที่เดียวที่ระบบนิยามว่าวันสำคัญทางพุทธคืออะไร ตัวเดียวกับที่กฎผูกบทใช้ตัดสิน แก้ชื่อวันในอนาคตแล้วธงยังถูกเพราะอ่านจากรายการเดียวกัน · ส่งเฉพาะตอนเป็นจริง กฎเดียวกับ uposatha เพราะมีหกวันต่อปีจากสามร้อยกว่าวัน · เป็นช่องใหม่ในวันเดิม โค้ดแอปเดิมไม่พัง และฝั่งมือถือรับไว้แล้วก่อนที่เราจะเขียนเสร็จด้วยซ้ำ · ข้อควรระวังตอนขึ้นเซิร์ฟ calendar_revision ไม่ได้ขยับเอง แอปที่ถือ ETag เดิมอยู่จะได้ 304 แล้วไม่มีวันเห็นช่องใหม่ ต้องสั่ง bumpCalendar หนึ่งครั้งหลัง deploy หรือไปผูกบทสักบทซึ่งขยับให้เอง |
| 1.67.0 |
2026-08-31 |
หน้าคิวงานตอบเองได้แล้วว่าตัวเดินคิวยังมีชีวิตอยู่ไหม และสั่งให้เดินได้จากหน้าเว็บ — มาจากของจริงคืนนี้ บรรทัด cron อยู่ครบใน crontab ทุกตัวอักษร แต่ไม่ถูกยิงมาเจ็ดวันเต็ม งานกองรอโดยหน้าเว็บไม่มีอะไรบอกเลยสักอย่าง ต้องไล่ด้วยมือทาง ssh ทั้งคืนกว่าจะรู้ว่าไม่ใช่บั๊กในโค้ด และเจ้าของทักว่าจะให้พิมพ์คำสั่งใน prompt ตลอดไปเหรอ ซึ่งถูกของเขา · กล่องสุขภาพคิวบนสุดของแท็บ แสดงสามสัญญาณที่แยกกันชัด — cron แตะล่าสุดเมื่อไหร่ · งานล่าสุดที่ทำเสร็จเมื่อไหร่ · ตอนนี้มีตัวเดินคิวเดินอยู่ไหม · ที่ต้องแยกสามอันไม่รวมเป็นอันเดียว เพราะเคสจริงคือตารางงานเงียบเจ็ดวันซึ่งปกติเพราะไม่มีใครสั่ง แต่ cron ก็ตายไปพร้อมกันซึ่งไม่ปกติ สัญญาณเดียวแยกสองอย่างนี้ไม่ออกแล้วจะพลาดซ้ำ · ชีพจร cron มาจากไฟล์เปล่าที่ cron แตะทุกนาที ไม่ได้ดูจาก queue.log เพราะ queue:work เจอคิวว่างจะออกเงียบ ๆ ไม่พิมพ์อะไร ล็อกจึงนิ่งได้เป็นสัปดาห์ทั้งที่ cron ยิงอยู่จริง แยกไม่ออกระหว่างไม่มีงานกับ cron ตาย · ต้องเติมท้ายบรรทัด cron หนึ่งครั้ง ถ้ายังไม่เติมช่องนั้นขึ้นว่า ยังไม่ได้ตั้ง พร้อมบอกวิธี ไม่ขึ้นเขียวหลอกว่าปกติ เพราะเขียวหลอกแย่กว่าไม่มีไฟเลย คนจะเลิกสงสัยทั้งที่ควรสงสัย · ตัวเดินคิวถามจากระบบปฏิบัติการด้วย pgrep ไม่ได้ถามฐานข้อมูล เพราะแถวที่ค้างสถานะกำลังทำหลังตัวเดินคิวถูกฆ่าจะโกหกว่ายังทำอยู่ · ถามไม่ได้กับถามแล้วไม่มีแยกกันคนละค่า จะได้ไม่ขึ้นแดงหลอกบนเครื่องที่ปิด shell_exec · ปุ่มเดินคิวเดี๋ยวนี้ปล่อยตัวเดินคิวแบบไม่ผูกกับคำขอแล้วคืนหน้าทันที ไม่รอสักวินาที เพราะถ้ารันในคำขอจะได้ 502 แบบเดียวกับช่องอัปที่เพิ่งถอดออกไป · ใช้ flock ตัวเดียวกับ cron กดรัว ๆ ก็ได้ตัวเดียวและไม่ชนกับ cron · หลังกดแล้วหน่วงสองวินาทีก่อนถามสถานะ เพราะตัวเดินคิวเพิ่งเกิดยังไม่ทันหยิบงาน ถามทันทีจะได้ ไม่มีตัวเดินคิว แล้วคนจะนึกว่าปุ่มไม่ทำงาน · ปุ่มหยุดใช้ queue:restart ไม่ฆ่าโปรเซส เพราะ ffmpeg เป็นลูกของ php ฆ่าแม่แล้วลูกกลายเป็นกำพร้าเขียนไฟล์ครึ่ง ๆ ทิ้งไว้ และแถวงานค้างสถานะกำลังทำอีกสองชั่วโมงตาม retry_after · ไม่ใช้ PHP_BINARY หาตัว php เพราะตอนอยู่ในเว็บมันคือ php-fpm เอา artisan ไปรันด้วย php-fpm แล้วได้ผลประหลาดที่หาสาเหตุยากมาก ใช้ PHP_BINDIR แทน และเปลี่ยนได้ที่ .env · แก้ deploy/QUEUE.md ให้บรรทัด cron มีท่อน touch พร้อมกล่องเตือนคนที่ตั้งไว้ก่อนรุ่นนี้ |
| 1.66.0 |
2026-08-30 |
เอาช่องอัปไฟล์ออกจากหน้าแก้เสียงธรรม เหลือทางเดียวคือหยิบจากคลัง — ช่องนั้นทำทุกอย่างในคำขอเดียว รับไฟล์ แฮช บีบด้วย ffmpeg คำนวณเส้นเสียง กัณฑ์ยาวจึงเกินเพดานเวลาของ php-fpm แล้วได้ 502 โดยไม่มีข้อความอะไรบอก เกิดขึ้นจริงกับไฟล์ 1:43 ชั่วโมง และคอมเมนต์ในโค้ดเองเตือนเรื่องนี้ไว้ตั้งแต่แรกแล้วว่า nginx มีเพดานของตัวเองอีกชั้น · มันยังซ้ำกับช่องอัปที่หน้าคลังไฟล์เสียงดิบด้วย ซึ่งเจ้าของสั่งให้เอาออกตั้งแต่นานแล้วแต่ยังไม่ได้ทำ วันนี้เจ้าของถามตรง ๆ ว่าถ้ามีทางที่ดีกว่าแล้วช่องนี้มีไว้ทำอะไร ซึ่งไม่มีคำตอบ · เส้นทาง upload.talkAudio ปิดด้วยคอมเมนต์บรรทัดเดียว เปิดคืนได้ทันที เมธอดในคอนโทรลเลอร์เก็บไว้ครบเพราะถ้าย้ายงานบีบไปอยู่ในคิวได้เมื่อไหร่ จะกลับมาใช้ได้โดยตัดแค่ท่อนบีบออก ลบทิ้งแล้วต้องเขียนใหม่ทั้งหมด · หน้าคลังไฟล์เสียงดิบเขียนที่อยู่โฟลเดอร์รับไฟล์ไว้เต็ม ๆ แล้ว พร้อมตารางบอกว่าโฟลเดอร์ชั้นบนสุดชื่อไหนได้ชนิดอะไร และตัวอย่างเส้นทางเต็ม เพราะเจ้าของต้องเอาไฟล์ใหญ่ขึ้นทาง aaPanel แล้วต้องมาถามทุกครั้งว่าวางตรงไหน · ชื่อโฟลเดอร์ในตารางดึงจาก config/chant.php มาแสดง ไม่ได้พิมพ์ทับไว้ ถ้าวันหนึ่งแก้ชื่อในนั้นข้อความตรงนี้เปลี่ยนตามเอง ไม่กลายเป็นคำโกหกที่ไม่มีใครรู้ · บอกให้ชัดด้วยว่าช่องอัปที่หน้าคลังไม่บีบไฟล์ให้ ได้ไฟล์ดิบเข้าคลังเฉย ๆ ต้องไปสั่งแปลงที่แท็บโฟลเดอร์รับไฟล์อีกทีถึงเอาไปใช้เป็นเสียงธรรมได้ · ยังไม่ได้แก้ที่ราก การหยิบจากคลังยังบีบสด ๆ อยู่ ถ้าหยิบไฟล์ที่ยังไม่เคยผ่านคิวและยาวมากก็ยัง 502 ได้ ทางแก้จริงคือย้ายงานบีบเข้าคิวทั้งหมด ซึ่งยังไม่ได้ทำในรุ่นนี้ |
| 1.65.0 |
2026-08-30 |
จัดหน้าปฏิทินใหม่ทั้งหน้า — เจ้าของเปิดหน้าแล้วหากล่องผูกบทไม่เจอ ทั้งที่เป็นฟีเจอร์ที่สั่งทำเอง เพราะ v1.64 เอาไปยัดไว้ในแถบขวากว้าง 330 พิกเซล ใต้กล่องข้อมูลวัน ต้องเลื่อนลงไปหา · เอาแถบขวาออกทั้งแถบ ปฏิทินจึงกว้างเต็มหน้าและช่องวันใหญ่ขึ้น · แถบผูกบทมาอยู่ใต้ปฏิทินทันที เต็มความกว้าง แบ่งเป็นคอลัมน์ตามกฎ · กฎที่วันนั้นไม่เข้าเงื่อนไขยังแสดงแต่จางลงพร้อมบอกว่าทำไมไม่เข้า ถ้าซ่อนไปเลยคนจะเข้าใจว่าระบบมีแค่กฎที่เห็นตอนนั้น · ข้อมูลวันย่อจากกล่องเหลือบรรทัดเดียวบนหัวแถบ · กิจกรรมของวันกับช่องเพิ่มวันเองพับไว้เพราะปีละไม่กี่ครั้ง แต่ยังอยู่กับวันเดียวกัน ไม่ต้องข้ามแถบไปหา · แยกเป็นสามแถบ ปฏิทิน ตรวจสอบ ระบบ ทำด้วย radio กับ CSS :checked ล้วน ไม่มี JS เพิ่มสักบรรทัด แลกกับการที่กดปุ่มในแถบระบบแล้วหน้าโหลดใหม่จะเด้งกลับแถบแรก ซึ่งยอมได้เพราะข้อความผลลัพธ์ยังขึ้นด้านบน · เพิ่มดาวในช่องวันที่มีบทผูกไว้ กวาดตาทั้งเดือนก็รู้ว่าผูกอะไรไปแล้ว ไม่ต้องกดทีละวันเช็ค คำนวณจากกฎที่โหลดมาครั้งเดียว ไม่ถามฐานรายวัน · เปิดหน้ามาเลือกวันนี้ให้เลย ถ้าวันนี้ไม่อยู่ในเดือนที่เปิดก็เอาวันแรกของเดือน แถบล่างต้องพูดถึงวันที่มองเห็นในตารางเสมอ และต้องไม่เป็นกล่องเปล่าซึ่งอ่านแล้วเหมือนฟีเจอร์ยังไม่มี · แยกการ์ดบทที่ผูกไว้เป็น _practice.blade.php เพราะเดิมต้องเขียนเหมือนกันสี่ที่ แก้ข้อความเตือนทีหนึ่งแล้วลืมอีกสามที่คือเรื่องที่จะเกิดแน่ |
| 1.64.1 |
2026-08-29 |
แก้หน้าปฏิทิน 500 — v1.64.0 ลืมใส่ ThaiLunar.php ลงในชุดที่ส่ง โค้ดใหม่เรียก ThaiLunar::MAJORS ซึ่งเป็นค่าคงที่ที่เพิ่งเพิ่มในไฟล์นั้น แต่ไฟล์นั้นไม่ได้ถูกส่งไปด้วย เซิร์ฟจึงเจอ Undefined constant แล้วพังทั้งหน้า · php -l จับไม่ได้เพราะแต่ละไฟล์ถูกต้องหมดในตัวเอง ที่ผิดคือชุดที่ส่งไม่ครบ ไม่ใช่ไวยากรณ์ · เพิ่มขั้นตอนตรวจก่อนส่งทุกครั้งตั้งแต่นี้ไป — ไล่ทุกการอ้างถึงค่าคงที่ข้ามคลาสในไฟล์ที่จะส่ง แล้วเช็คว่าไฟล์ที่นิยามค่านั้นอยู่ในชุดที่ส่งด้วยหรือเปล่า ถ้าไม่อยู่ต้องยืนยันก่อนว่าของเดิมบนเซิร์ฟมีค่านั้นแล้วจริง |
| 1.64.0 |
2026-08-29 |
ผูกบทสวดกับวันในปฏิทินได้แล้ว — กดวันไหนก็ได้ในปฏิทิน แล้วผูกบทสวดมนต์ กิจกรรมทางศาสนา วิปัสสนา หรือคาถา ไว้กับวันนั้น เพื่อให้แอปมือถือเตือนแล้วผู้ใช้กดเข้าไปทำได้ทันที · สิ่งที่ผูกจริง ๆ คือกฎไม่ใช่วันเดียว เพราะวันพระในฐานมี 5,144 วัน ผูกทีละวันคือกดห้าพันครั้งแล้วยังไม่ครบร้อยปี ตั้งกฎ วันพระทุกวัน ครั้งเดียวไหลลงทุกวันที่เข้าเงื่อนไขเองตลอด รวมถึงวันที่ยังไม่ได้คำนวณ · กฎมีสี่ระดับ วันพระทุกวัน · วันสำคัญทางพุทธทุกวัน · ชื่อวันนั้นทุกปี · เฉพาะวันนั้นวันเดียว ซ้อนกันได้และเรียงจากกว้างไปแคบ บทเดียวกันที่อยู่หลายกฎเหลือครั้งเดียว · ช่องเลือกกฎแสดงเฉพาะกฎที่วันที่กดอยู่เข้าเงื่อนไข และเซิร์ฟตรวจซ้ำอีกรอบตอนบันทึก เพราะฟอร์มถูกยิงตรงได้ ถ้ารับกุญแจอะไรก็ได้จะเกิดกฎที่ไม่มีวันไหนเข้าเงื่อนไขแล้วนั่งอยู่ในฐานเงียบ ๆ · ไม่ผูก FK กับตารางเนื้อหา ลบบทหนึ่งบทต้องไม่ลากกฎปฏิทินหายไปด้วยเงียบ ๆ กฎที่ชี้ไปบทที่ถูกลบจึงยังเห็นในหน้าหลังบ้านพร้อมป้ายเตือน แต่ไม่ถูกส่งไปแอป · บทที่ยังไม่เผยแพร่ก็เหมือนกัน เห็นในหลังบ้านพร้อมป้าย ไม่ส่งไปแอป · เพิ่มช่อง practice ใน /v1/calendar เป็นช่องใหม่ในวันเดิม โค้ดแอปเดิมไม่พัง ส่งเฉพาะวันที่มีจริง · ETag พ่วง catalog_revision เพิ่มเฉพาะตอนมีบทผูกไว้ เพราะ practice เอาชื่อกับสถานะเผยแพร่ของเนื้อหามาใส่ในคำตอบด้วย แก้ชื่อบทหรือกดเผยแพร่แล้ว calendar_revision ไม่ขยับ ถ้าไม่พ่วงแอปจะได้ 304 ค้างกับของเก่า ตอนยังไม่มีใครผูกอะไรก็ไม่พ่วง จะได้ไม่เสีย 304 ฟรีทุกครั้งที่แก้เนื้อหา · โหลดกฎทั้งตารางครั้งเดียวแล้วรวมในหน่วยความจำ ไม่ถามฐานรายวัน เพราะคำขอเดียวมี 4,017 วัน · ย้ายกล่อง ปฏิทินนี้ทำงานยังไง ออกจากหน้าปฏิทินไปเป็นหน้า /calendar/guide ของตัวเอง เจ้าของทักว่ารำคาญต้องเลื่อนผ่านทุกครั้งที่เข้ามากดดูวัน ทั้งที่อ่านครั้งเดียวก็พอ ไม่ได้ตัดเนื้อหาสักบรรทัดและมีปุ่มลิงก์ที่หัวหน้าปฏิทิน · มี migration ต้องรัน deploy.sh |
| 1.63.0 |
2026-08-29 |
เปิด /v1/calendar ให้แอปมือถือ · ส่ง 11 ปี ย้อนหลัง 1 ล่วงหน้า 9 ตามที่ฝั่งแอปตอบมาว่า ทำปฏิทินเต็มเดือนเลื่อนดูได้ และดูล่วงหน้าสำคัญกว่าดูย้อนหลัง · ส่งทุกวันไม่ใช่เฉพาะวันที่มีกิจกรรม เพราะปฏิทินเต็มเดือนต้องมีเลข ขึ้น/แรม ทุกช่อง ซึ่งแอปคำนวณเองไม่ได้ ตารางจันทรคติอยู่ฝั่งเซิร์ฟ · วัดจริงแล้ว 4,017 วัน 432 KB ดิบ เหลือ 28 KB หลัง gzip เพราะข้อมูลซ้ำกันเยอะ และการตัดวันธรรมดาออกประหยัดได้แค่หลัก KB เดียวหลังบีบ แลกกับปฏิทินที่แสดงไม่ครบ ไม่คุ้ม · เพิ่ม calendar_revision กับ calendar_url ใน /v1/head เป็นการเพิ่มช่อง โค้ดแอปเดิมไม่พัง · ETag ผูกกับ calendar_revision บวกปีปัจจุบัน ไม่ใส่ generated_at เพราะถ้าใส่ ETag จะเปลี่ยนทุกคำขอแล้ว 304 จะไม่มีวันเกิด · ที่ต้องมีปีในนั้นด้วยเพราะช่วงปีเลื่อนตามปีปัจจุบัน วันที่ 1 มกราคำตอบต่างจากเมื่อวานทั้งที่ข้อมูลไม่เปลี่ยนสักแถว · uposatha ส่งเฉพาะตอนเป็นจริง วันธรรมดามีเยอะกว่ามาก การส่ง false ทุกวันคือน้ำหนักเปล่า |
| 1.62.0 |
2026-08-29 |
ย้ายเมนูปฏิทินพุทธศาสนาไปอยู่ในกลุ่มเนื้อหา แทนที่คำภาวนาที่เจ้าของไม่ได้ใช้ · ปฏิทินเป็นของที่ผู้ใช้เห็นในแอปเหมือนบทสวด ไม่ใช่เครื่องมือของคนหลังบ้าน การมีกลุ่มปฏิทินแยกกลุ่มเดียวโดด ๆ ไว้ล่างสุดจึงผิดที่ตั้งแต่แรก · ชนิด recitation ยังอยู่ในฐานข้อมูลและใน /v1/list ตามเดิม ไม่ได้ลบ ไม่ได้ migrate ถอดแค่ลิงก์ในเมนู ถ้าวันหนึ่งจะใช้ให้เอาบรรทัดที่คอมเมนต์ไว้กลับมาบรรทัดเดียวจบ ตอนนี้ไม่มีบทชนิดนี้อยู่สักบทอยู่แล้ว จึงไม่มีอะไรเข้าไม่ถึง |
| 1.61.1 |
2026-08-29 |
แก้ข้อความ ควรได้ราว ที่เขียนผิด — ไม่ใช่ตัวเลขผิด · เขียนไว้ว่าวันพระได้ปีละ 50-51 และปีอธิกมาสได้ถึง 54 ซึ่งผิดทั้งคู่ ตรวจครบ 103 ปีในตารางแล้วได้ 49 หรือ 50 เท่านั้น ไม่เคยเป็นเลขอื่นเลยสักปี — 49 วัน 54 ปี และ 50 วัน 49 ปี · เดือนจันทรคติมี 4 วันพระ ปีสุริยคติมี 12.37 เดือนจันทรคติ จึงได้ราว 49.5 ต่อปีเสมอ · และแก้ วันพระ + ปีละ 6 เป็น วันพระ + เข้าพรรษาปีละ 1 เพราะอีกห้าวันสำคัญ มาฆ วิสาข อัฏฐมี อาสาฬห ออกพรรษา เป็นวันพระอยู่แล้ว จึงแทนที่บรรทัดวันพระ ไม่ได้บวกเพิ่ม มีแต่เข้าพรรษาที่เป็นแรม 1 ค่ำ จึงบวกเพิ่มจริง · เรื่องนี้สำคัญกว่าที่ดู เพราะคอลัมน์ ควรได้ราว คือสิ่งที่คนใช้ตัดสินว่าเมื่อไรควรสงสัย ช่วงที่กว้างเกินจริงทำให้เขาไม่รู้ว่าเมื่อไรมีปัญหา ช่วงที่แคบเกินจริงทำให้เขาตกใจกับตัวเลขที่ถูกอยู่แล้ว |
| 1.61.0 |
2026-08-29 |
ปฏิทินคำนวณเองทั้งหมด เลิกดึงจากเว็บนอกทุกแหล่ง · เจ้าของโปรเจกต์สั่งให้เหลือเฉพาะสิ่งที่ยั่งยืน หลังทักว่าระบบเดิมพึ่งไฟล์ที่เขาตรวจสอบเองไม่ได้ ไม่รู้ว่าไฟล์มาจากไหน เอามาทำไม ใช้ยังไง และถ้าเปลี่ยนคนดูแลระบบจะไม่มีใครรู้เรื่อง ซึ่งถูกทุกข้อ · เพิ่ม ChineseLunar ตารางปีจันทรคติจีน 101 ปี ให้วันไหว้ยั่งยืนเหมือนวันพระ ตรวจแล้วสร้างวันได้ถูก 36,848 วันไม่ผิดสักวัน และวันไหว้ปี 2026 ทั้งแปดวัน ตรุษจีน ง่วนเซียว บ๊ะจ่าง สารทจีน ไหว้พระจันทร์ กินเจวันแรกวันสุดท้าย ไหว้สิ้นปี ตรงกับ myhora ทุกวัน · สร้างครบทุกวันที่ตารางครอบคลุมในการคำนวณครั้งเดียว 37,977 วัน 105 ปี ราวหนึ่งเมกะครึ่ง แทนที่จะทำแค่สามปีแล้วต้องมี cron เลื่อนช่วงทุกปี ซึ่งเป็นของที่พังเงียบได้อีกหนึ่งอย่าง และต้องมีระบบเฝ้าดูมันอีกชั้น · ตอนนี้ไม่มีงานตามเวลาเลยสักงาน ไม่ต้องตั้ง cron · ถอด Google feed, การอัปไฟล์ ICS, IcsReader, ตารางประวัติการดึง, ตารางคำที่แก้ทับ, ไฟล์ ICS ดิบบนดิสก์ซึ่ง deploy.sh ไม่ได้สำรองอยู่แล้วจึงหายตอนย้ายเครื่อง, ชีพจร cron, ธง verified · วันหยุดราชการที่ตรงวันเดิมทุกปี 16 วันย้ายไปอยู่ใน config/calendar.php เป็นวันตายตัว ส่วนวันหยุดชดเชย วันหยุดพิเศษ ครม. และวันพืชมงคล ตัดออกเพราะเป็นมติของคนไม่ใช่ดาราศาสตร์ ไม่มีสูตรไหนรู้ล่วงหน้าได้ ใครต้องการต้องเพิ่มเองในหน้าปฏิทินซึ่งไม่หายเวลาคำนวณใหม่ · เพิ่มกล่องอธิบายในหน้าปฏิทินว่าระบบทำงานยังไง ที่มาของแต่ละอย่าง อะไรทำไม่ได้ ต้องทำอะไรเมื่อไร และจะทำยังไงเมื่อถึงปีสุดท้ายของตาราง เพราะความรู้ที่อยู่ในคอมเมนต์โค้ดกับในแชท คนดูแลคนต่อไปไม่มีวันได้อ่าน · เพิ่มกล่องตรวจเองได้ใน 30 วินาที แสดงจำนวนวันพระของปีนี้ กับวันสำคัญทุกวันไว้เทียบกับปฏิทินกระดาษ เพราะระบบที่ตรวจสอบตัวเองไม่ได้ คือระบบที่ต้องเชื่อคนเขียนเท่านั้น · เพิ่มตาราง calendar_builds เก็บประวัติการคำนวณในฐานข้อมูล จึงติดไปกับไฟล์สำรองของ deploy.sh ต่างจากไฟล์บนดิสก์ |
| 1.60.0 |
2026-08-29 |
ตอบสองข้อที่เจ้าของทักว่าระบบพึ่งของที่เขาตรวจสอบเองไม่ได้ · หนึ่ง ที่อยู่ไฟล์ ICS ฝังอยู่ใน config ซึ่งเขาไม่ได้เปิดดู และไฟล์ดิบที่ระบบเก็บไว้ 24 ไฟล์ต่อแหล่ง ไม่มีทางเอาออกมาจากหน้าเว็บได้เลย เก็บไว้แล้วเอาออกมาไม่ได้เท่ากับไม่ได้เก็บ วันที่อัปไฟล์เสียทับหรือวันที่เว็บต้นทางหายไป ไฟล์พวกนี้คือของที่เหลืออยู่ชิ้นเดียว จึงเขียนที่อยู่เต็ม ๆ ไว้ในหน้าให้คัดลอกไปเก็บเองได้ และทำลิงก์โหลดไฟล์ดิบย้อนหลัง พร้อมจดชื่อไฟล์ที่อัปมาไว้ในประวัติ จะได้ตอบได้ว่าข้อมูลชุดนี้มาจากไฟล์ไหน · สอง เพิ่มชีพจรของตัวตั้งเวลาที่เต้นทุกห้านาที เพราะเดิมดูได้แค่ว่า cron เคยดึงปฏิทินไหม ซึ่งเป็นงานเดือนละครั้ง ถ้าวันนี้เป็นวันที่ 15 แล้วเห็นว่าดึงล่าสุดวันที่ 1 ก็ยังบอกไม่ได้ว่า cron พังไปเมื่อวานหรือยังดีอยู่ ต้องรออีกสองสัปดาห์ถึงจะรู้ ซึ่งสายเกินไป ชีพจรเกินสิบนาทีไม่ขยับ = ตายแล้ว รู้ได้ทันที · เก็บในฐานไม่ใช่ cache เพราะ deploy สั่ง optimize:clear ทุกครั้ง ชีพจรจะหายทุกรอบที่ deploy แล้วดูเหมือน cron ตายทั้งที่ไม่ได้ตาย · เพิ่มปุ่มตรวจสถานะที่เรียก schedule:list ให้ดูว่างานลงทะเบียนครบไหม ซึ่งเป็นคนละคำถามกับว่าตัวตั้งเวลาถูกเรียกจริงไหม ผ่านข้อบนไม่ได้แปลว่าข้อล่างผ่าน · ไม่มีปุ่มติดตั้ง cron อัตโนมัติเพราะเว็บรันเป็น www แต่ crontab เป็นของ root การให้เว็บเขียน crontab ได้คือการเปิดช่องให้ใครยึดเซิร์ฟได้ทั้งเครื่อง แลกกับการประหยัดการพิมพ์หนึ่งบรรทัดครั้งเดียว จึงให้ปุ่มคัดลอกคำสั่งกับวิธีทำผ่านหน้า Cron ของ aaPanel แทน |
| 1.59.1 |
2026-08-29 |
แก้หัวคอลัมน์วันไม่ตรงกับช่องในตารางปฏิทิน · สาเหตุคือ 1fr มีความกว้างขั้นต่ำ เท่ากับเนื้อในที่ยาวที่สุดของช่องนั้น พอมีวันชื่อยาวมากอย่างวันเฉลิมพระชนมพรรษา สมเด็จพระนางเจ้าสิริกิติ์ ที่สั่งไม่ให้ตัดบรรทัด คอลัมน์นั้นถูกดันให้กว้างจนคอลัมน์อื่นหด ส่วนแถวหัวที่มีแต่ตัวอักษรสั้นยังแบ่งเจ็ดช่องเท่ากันตามปกติ สองตารางจึงเหลื่อมกัน เปลี่ยนเป็น minmax(0,1fr) และให้ช่องวันหดได้ · แก้ช่องเลือกไฟล์ที่ตั้ง accept=.ics ไว้ ทำให้เลือกไฟล์ที่โหลดจาก myhora ไม่ได้เลย เพราะเขาตั้งชื่อไฟล์มาโดยไม่มีนามสกุล ถอด accept ออก ตัวอ่าน ICS ตรวจเนื้อในอยู่แล้ว ซึ่งเชื่อถือได้กว่านามสกุล · เปลี่ยนป้ายปุ่มจาก เปิดเว็บ เป็น โหลดไฟล์ เพราะมันโหลดไฟล์ลงเครื่องเลย ไม่ได้พาไปหน้าเว็บ ป้ายเดิมทำให้เข้าใจผิด · เพิ่มคอลัมน์บอกชื่อไฟล์ที่จะโหลดมาได้ และวิธีทำสี่ขั้นในหน้า รวมทั้งบอกว่าถ้าเจอหน้า Just a moment คือด่าน Cloudflare กำลังตรวจ ให้รอแล้วกดซ้ำ |
| 1.59.0 |
2026-08-29 |
แก้ชื่อวันที่ดึงมาได้แล้ว และคำที่แก้รอดจากการดึงรอบหน้า · ปฏิทินของ Google สะกดผิดมาเอง วันขื้นปีใหม่ กับ วันรุษจีน (วันที่ 2) ซึ่งเราจะไม่แก้เงียบ ๆ ในโค้ด เพราะเป็นการเดาแทนเจ้าของ จึงทำเป็นปุ่มให้แก้เองแทน · คำที่แก้เก็บในตารางแยกผูกกับ แหล่ง+วัน+คำเดิม ไม่ใช่กับ id ของแถว เพราะแถวที่ดึงมาถูกลบทิ้งแล้วเขียนใหม่ทุกครั้ง id จึงเปลี่ยนทุกรอบ · เพิ่มคอลัมน์ raw_title เก็บคำที่เว็บส่งมาจริง แล้วให้ตัวเทียบผลต่างใช้คอลัมน์นี้ ถ้าเทียบด้วยคำที่แก้แล้ว ตัวเทียบจะเห็นของในฐานเป็นคำใหม่แต่ของที่เว็บส่งมาเป็นคำเดิม แล้วรายงานว่าเพิ่มใหม่กับลบเก่าทุกเดือนทั้งที่ไม่มีอะไรเปลี่ยนเลย · แก้ชื่อได้เฉพาะวันที่ดึงมา วันพระกับวันสำคัญเป็นคำที่สูตรสร้าง วันตายตัวแก้ที่ไฟล์ตั้งค่า · ป้ายแก้มือในช่องปฏิทินนับวันที่แก้ชื่อด้วย ไม่ใช่แค่วันที่เพิ่มเอง · วันของ Google ที่ไม่ใช่ราชการอย่างตรุษจีนกับวาเลนไทน์ ปล่อยไว้กลุ่มราชการตามที่เขาส่งมา ตามที่เจ้าของโปรเจกต์สั่ง ไม่ตีความใหม่ |
| 1.58.0 |
2026-08-29 |
แหล่งข้อมูลปฏิทินแยกเป็นสองพวก — ดึงเองได้กับต้องอัปไฟล์เอง · myhora ปิดด้วยด่านตรวจบอตของ Cloudflare ที่ตอบ cf-mitigated challenge และต้องรัน JavaScript ถึงผ่าน เซิร์ฟจึงดึงเองไม่ได้เลยแม้แต่หน้าแรก ไม่ใช่เรื่องที่แก้ที่ header ได้ และการทำระบบหลบด่านนี้ คือการฝืนสิ่งที่เจ้าของเว็บตั้งใจกันไว้ จึงไม่ทำ · เปลี่ยนไปดึงปฏิทินวันหยุดไทยของ Google แทน ซึ่งมีหลายปีในไฟล์เดียว ต่างจาก myhora ที่ให้แค่ปีปัจจุบัน จึงครอบคลุมทั้งช่วงสามปีในการดึงครั้งเดียว · เพิ่มปุ่มอัปไฟล์ ICS เอง สำหรับวันจีนกับวันหยุดพิเศษของ ครม. ที่ Google ไม่มี คนเปิด myhora ในเบราว์เซอร์ผ่านด่านได้ตามปกติเพราะเป็นคนจริง ไฟล์ที่อัปเดินท่อเดียวกับที่ดึงเองทุกประการ แปลง เทียบ เก็บไฟล์ดิบ แสดงผลต่าง ต่างกันแค่ไฟล์มาจากไหน · เพิ่มคอลัมน์ feed ในตารางกิจกรรมเพราะมีสองแหล่งที่ให้วันหยุดราชการเหมือนกัน ถ้าลบตามกลุ่มอย่างเดิม การดึง Google รอบหน้าจะล้างวันหยุดพิเศษที่เพิ่งอัปมาทิ้งเงียบ ๆ unique เปลี่ยนตามเป็น date feed group_code title ซ้ำข้ามแหล่งจึงเก็บได้ทั้งคู่ซึ่งถูกต้อง แล้วยุบให้เหลือบรรทัดเดียวตอนแสดงผล ไม่ใช่ตอนเก็บ · ปีที่รายงานหลังดึงเลือกปีปัจจุบันก่อนเสมอถ้าไฟล์ครอบคลุมถึง ไม่ใช่ปีที่มีวันเยอะสุด เพราะไฟล์หลายปีจะทำให้ calendar_year ไม่มีวันตรงกับปีจริง แล้วงานตรวจปีเปลี่ยนยิงซ้ำทุกวันตลอดไป |
| 1.57.1 |
2026-08-29 |
แก้ ดึงข้อมูลปฏิทินไม่ได้ 403 — myhora ปฏิเสธคำขอที่ไม่มี User-Agent แบบเบราว์เซอร์ ซึ่งเป็นค่าตั้งต้นของ Guzzle เว็บไทยหลายเจ้าตั้งกันบอตแบบนี้ ย้ายหัวคำขอไปไว้ใน config/calendar.php จะได้แก้ที่เดียวถ้าเขาเปลี่ยนเกณฑ์อีก และแยกข้อความ 403 429 404 ออกจาก เว็บตอบ N เฉย ๆ เพราะสามอันนี้ไม่ใช่เว็บล่ม แต่คือเขาไม่ให้เข้า คนอ่านจะได้ไม่ไปไล่หาว่าเน็ตเสียตรงไหน · บันทึกว่าใครสั่งดึง cron button หรือ cli แล้วขึ้นในหน้าหลังบ้านแยกเป็นสองบรรทัด — เว็บยอมให้ดึงไหม กับ cron ทำงานเองไหม เพราะกดปุ่มแล้วสำเร็จพิสูจน์ได้แค่เรื่องแรก ถ้าลืมตั้ง crontab ทุกอย่างจะดูปกติทุกประการ ปุ่มกดได้ ข้อมูลมี หน้าเว็บสวย แล้วเงียบไปทั้งปีโดยไม่มีอะไรผิดพลาดให้เห็น จนถึงวันที่ ครม. ประกาศวันหยุดเพิ่มแล้วปฏิทินไม่ขยับ · คอลัมน์ชื่อ run_by ไม่ใช่ trigger เพราะ TRIGGER เป็นคำสงวนของ MariaDB กฎเดียวกับ group_code |
| 1.57.0 |
2026-08-29 |
ปฏิทินพุทธศาสนา — วันพระ วันสำคัญทางพุทธ วันหยุดราชการ วันคริสต์มาส และวันไหว้ของจีน อยู่ในหน้าเดียวกันโดยแยกกลุ่มชัดเจน · วันพระคำนวณเองจากตารางปีจันทรคติที่เก็บแค่วันแรกของปีกับความยาวปี ไม่ได้เขียนสูตรสุริยยาตร์ เพราะสูตรที่เขียนผิดหนึ่งบรรทัดทำให้วันพระเลื่อนโดยไม่มีอะไรฟ้อง แล้วผู้ใช้จะไปวัดผิดวัน ซึ่งแย่กว่าไม่มีปฏิทินเลย · ตารางถูกตรวจแล้วว่าสร้างวันได้ถูกทุกวันตั้งแต่ ค.ศ. 2000 ถึง 2100 รวม 36,890 วัน และวันพระทั้ง 50 วันของปี 2026 กับวันสำคัญทั้งหกตรงกับ ICS ของ myhora ทุกวัน รวมทั้งเดือน 8 หลังของปีอธิกมาส · วันหยุดราชการกับวันของจีนดึงจาก ICS เพราะคำนวณไม่ได้ วันหยุดชดเชยและวันหยุดพิเศษมาจากมติ ครม. ไม่มีสูตรไหนรู้ล่วงหน้า · ดึงไม่สำเร็จไม่ลบของเดิมสักแถว เก็บไฟล์ ICS ดิบทุกครั้ง และแสดงว่าดึงแล้วอะไรเปลี่ยนไปบ้าง ไม่ทับเงียบ ๆ · วันที่เพิ่มเองมีที่มาเป็น manual จึงรอดทั้งจากการดึงและการคำนวณใหม่ · ดึงเองทุกวันที่ 1 และดึงทันทีเมื่อปีในฐานไม่ตรงกับปีจริง ซึ่งต้องเพิ่ม cron ในเซิร์ฟหนึ่งบรรทัดก่อน ไม่งั้นเงียบสนิท · calendar_revision แยกจาก list_version เพราะปฏิทินกับเนื้อหาเปลี่ยนคนละจังหวะ · ยังไม่เปิด /v1/calendar ในรุ่นนี้ รอตรวจว่าวันถูกจริงก่อนค่อยส่งไปให้ผู้ใช้ |
| 1.56.0 |
2026-08-28 |
คลังภาพกรองตามป้ายได้แล้ว — ติดป้ายได้มาตั้งแต่ v1.48.0 แต่ไม่เคยมีปุ่มหาเลยสักปุ่ม พอรูปเกินสองสามสิบใบ ป้ายจึงกลายเป็นของที่ใส่ไว้แล้วหาไม่เจอ เจ้าของโปรเจกต์สั่งเรื่องนี้ไว้ตั้งแต่ต้นเรื่องธรรมเทศนาแล้วแต่ยังไม่ได้ทำ และกำลังจะเจอของจริงตอนทำนิทานชาดกที่มีรูปหลายสิบใบต่อเรื่อง · แถบชิปสร้างจากป้ายที่มีอยู่จริงพร้อมจำนวน เรียงจากป้ายที่ใช้เยอะสุด บวกชิป ทั้งหมด และ ยังไม่ติดป้าย ซึ่งจำเป็นเพราะเป็นทางเดียวที่จะหารูปที่ลืมติดป้ายเจอ · กรองที่หน้าเว็บล้วน ไม่ยิงเซิร์ฟใหม่ เพราะรูปทั้งคลังถูกส่งมาแล้วในหน้าเดียว การโหลดหน้าใหม่เพื่อกรองของที่อยู่ในมือแล้วคือการรอเปล่า ๆ · เก็บป้ายลง data-tags คั่นด้วยขีดตั้ง ไม่ใช่จุลภาค เพราะป้ายไทยมีจุลภาคอยู่ในตัวได้ · แก้ข้อความ อัปได้สูงสุด 24 MB ที่ค้างอยู่ในหน้าอัปตั้งแต่ v1.55.0 ถอดเพดานนั้นออกไปแล้ว |
| 1.55.1 |
2026-08-27 |
ส่งหมวดไปให้มือถือครบทุกหมวด รวมหมวดที่ยังไม่มีบทอยู่เลย — เดิมกรองเหลือเฉพาะหมวดที่มีบทที่เผยแพร่แล้ว โดยให้เหตุผลว่ากันไม่ให้แอปแสดงช่องเปล่า ซึ่งเป็นการตัดสินใจแทนฝั่งแอปในเรื่องที่เป็นของแอป · เจ้าของโปรเจกต์สั่งว่าเมนูต้องครบตั้งแต่แรก หมวดที่สร้างไว้แล้วแต่ยังไม่ได้ใส่บทต้องเห็นในแอปด้วย ไม่ใช่โผล่มาทีหลังตอนใส่บทเสร็จ · ถ้าแอปไม่อยากแสดงหมวดว่างก็นับจาก items[].categories เอาเองได้ แต่ถ้าเซิร์ฟไม่ส่งมาเลย แอปไม่มีทางรู้ว่ามีหมวดนั้นอยู่ · หมวดที่ถูกซ่อนยังไม่ส่ง เพราะนั่นคือเจตนาจริงว่าไม่ให้เห็น · ผลข้างเคียงที่ดีคือ categories ไม่ต้องอาศัย contents อีกแล้ว จึงไม่ต้องวนอ่านหมวดของทุกบทเพื่อประกอบรายการหมวด |
| 1.55.0 |
2026-08-27 |
หมวดตั้งรูปประจำหมวดได้แล้ว และรูปนั้นไปถึงมือถือ — แถวหมวดในแท็บหมวดมีรูปย่อ ช่องเลือกรูป และปุ่มอัป ⬆ อยู่ในแถวเดียวกัน เลือกหรืออัปแล้วบันทึกทันทีเหมือนช่องชื่อ ไม่ต้องมีปุ่มบันทึกแยก · ใช้คลังภาพชุดเดียวกับที่อื่นทั้งระบบ ไม่ทำคลังแยก เพราะเป็นรูปประเภทเดียวกัน และคลังแยกจะกลายเป็นที่เก็บรูปที่สี่ที่ไม่มีใครรู้ว่ารูปไหนถูกใช้ที่ไหน ซึ่งเป็นปัญหาเดียวกับคลังเสียงกลางที่รื้อทิ้งไปที่ v1.53.0 · migration เพิ่มคอลัมน์ categories.image_id varchar(64) nullable ไม่ใส่ foreign key เพราะรหัสที่ชี้ไปหาภาพที่ถูกลบจะถูกกรองทิ้งตอนสร้างลิสต์อยู่แล้ว และ FK แบบ cascade จะทำให้ลบภาพหนึ่งใบไปล้างหมวดโดยไม่มีใครตั้งใจ · /v1/list ส่ง categories[].image เป็นก้อนพร้อม url sha256 bytes width height เหตุผลเดียวกับ items[].cover คือแอปวาดเมนูก่อนโหลดไฟล์ data และหมวดที่ใช้ภาพซึ่งไม่มีบทไหนใช้เลย จะไม่มีภาพนั้นอยู่ใน backdrops ให้หา · หมวดที่ไม่ได้ตั้งรูปจะไม่มีคีย์ image เลย ไม่ใช่ส่ง null มา |
| 1.54.1 |
2026-08-27 |
แก้หน้าเพิ่มหมวดที่ล่ม 500 — CategoryController::store() เขียน $data[id] ?: Str::slug(...) โดยเข้าใจว่ากฎ nullable แปลว่าคีย์ต้องมีเสมอ ซึ่งไม่ใช่ nullable แปลว่าส่งมาเป็นค่าว่างได้ ส่วน validate() คืนเฉพาะคีย์ที่ส่งมาจริง และฟอร์มเพิ่มหมวดไม่มีช่องรหัสเลยสักช่อง ส่ง title กับ scope มาสองตัว ผลคือ Undefined array key id ทุกครั้งที่กดเพิ่มหมวด · **เพิ่มหมวดจากหน้าเว็บพังมาตั้งแต่ v1.48.0** ตอนที่ย้ายหมวดจากหน้ากลางมาเป็นแท็บ ไม่มีใครเห็นเพราะไม่มีใครเพิ่มหมวดใหม่มาตั้งแต่ตอนนั้น เพิ่งมาเจอตอนเจ้าของโปรเจกต์จะสร้างหมวดย่อยของเสียงธรรม · แก้เป็น ($data[id] ?? ) ?: ... · ตัวสร้างรหัสสำรองที่รองรับชื่อไทยมีอยู่แล้วในบรรทัดถัดไป แค่ไปไม่ถึง เพราะ Str::slug กับชื่อไทยคืนค่าว่าง จึงตกไปใช้ cat-xxxxxx |
| 1.54.0 |
2026-08-27 |
เปลี่ยนชื่อหมวดที่คนเห็นจาก ธรรมเทศนา เป็น เสียงธรรม และเปิดทางให้มีหมวดย่อย — หมวดนี้จะไม่ได้มีแค่กัณฑ์เทศน์อีกต่อไป เจ้าของโปรเจกต์จะใส่นิทานชาดก พุทธประวัติ และเรื่องเล่าเข้ามาด้วย ซึ่งใช้ฟังก์ชันเดียวกันทุกอย่างคือเสียงยาวที่มีภาพประกอบเปลี่ยนตามเวลา ชื่อเดิมจึงแคบเกินกว่าที่หมวดนี้ทำได้จริง · **รหัส kind ยังเป็น talk เหมือนเดิม** เปลี่ยนแค่ป้ายภาษาไทย เพราะรหัสอยู่ในฐานข้อมูล เส้นทางไฟล์ และ /v1/list ที่ฝั่งมือถืออ่านอยู่ การเปลี่ยนรหัสต้อง migrate ทั้งระบบและทำให้มือถือพังทันทีโดยไม่ได้อะไรเพิ่ม · /v1/list เพิ่ม categories[].scope ซึ่งตรงกับ items[].kind เป๊ะ เดิมส่งแค่ id title order แอปจึงรู้ว่ามีหมวดอะไรบ้างแต่ไม่รู้ว่าหมวดไหนเป็นของชนิดไหน ทำเมนูย่อยไม่ได้ · เซิร์ฟไม่กำหนดว่าแอปต้องแสดงเป็นแท็บในหน้าเดียวหรือแตกเป็นเมนูแยก ส่งข้อมูลให้ครบแล้วแอปเลือกเอง ตามที่เจ้าของสั่งว่าให้มีทั้งสองแบบ · โฟลเดอร์รับไฟล์รับทั้ง เสียงธรรม/ และ ธรรมเทศนา/ ชี้ไปชนิด stream เหมือนกัน ถ้าเปลี่ยนชื่อในตารางเฉย ๆ โฟลเดอร์เดิมที่มีไฟล์ค้างอยู่จะกลายเป็นชั้นที่ไม่รู้จัก ขึ้นบนหน้าเว็บแต่กดไม่ได้โดยไม่มีอะไรบอกว่าเพราะเปลี่ยนชื่อ · หลัง deploy ต้องสั่ง bumpList() หนึ่งครั้ง เพราะโครงลิสต์เปลี่ยน |
| 1.53.10 |
2026-08-27 |
เสียงเปิดกับเสียงจบใส่คำบนจอได้แล้ว — เพิ่ม start.label และ end.label เข้าโครงข้อมูล เจ้าของโปรเจกต์สั่งเพิ่มเพื่อให้ฝั่งมือถือเอาไปแสดงตอนกำลังตีเสียงเปิดและเสียงจบ · เป็นข้อความอิสระ ไม่จำกัดความยาว ไม่มีค่าสำเร็จรูปให้เลือก เหมือน steps[].label ของลูป · ว่างแล้วเก็บเป็น null ไม่ใช่สตริงว่าง แอปเช็คตัวเดียวจบ ไม่ต้องเช็คทั้ง null และ ค่าว่าง · หน้าทดลองปฏิบัติแสดงคำนี้ในวงกลมตามจังหวะจริง · ต้องแจ้งฝั่งมือถือ โครงข้อมูลเปลี่ยน |
| 1.53.9 |
2026-08-26 |
หน้าทดลองปฏิบัติตัดเสียงเดิมก่อนเล่นเสียงใหม่เสมอ ให้ตรงกับที่ฝั่งมือถือทำ — ของเดิมสร้าง Audio ใหม่ทุกครั้งโดยไม่หยุดตัวเก่า ช่วงที่สั้นกว่าไฟล์เสียงจึงได้ยินเสียงซ้อนกันหลายชั้น ขณะที่ฝั่งมือถือตัดเสียงเดิมทิ้งเมื่อถึงช่วงถัดไป ผลคือทดลองที่หน้าแก้บทแล้วไปได้ยินอีกแบบบนเครื่องจริง ซึ่งเป็นการทดลองที่เชื่อไม่ได้ · ฝั่งมือถือเป็นคนทักเรื่องนี้เองในเอกสารทวนสัญญา และเหตุผลที่เขาให้ถูก จังหวะสำคัญกว่าความสมบูรณ์ของเสียง · กดหยุดแล้วเงียบทันที ไม่รอไฟล์ที่ค้างอยู่เล่นจบ · ยืนยันกับฝั่งมือถือว่า tempo คูณเฉพาะ steps[].sec ไม่แตะ start.wait_sec และ end.gap_sec ตามที่เขาตีความ ซึ่งชัดกว่าที่เอกสารฝั่งเซิร์ฟเขียนไว้ · ไม่เพิ่ม start.gap_sec เพราะไม่มีใครขอ |
| 1.53.8 |
2026-08-26 |
บทวิปัสสนาตั้งรูปปกได้ และรูปปกไปถึงมือถือ — เพิ่ม cover ในโครงข้อมูล เป็นรหัสภาพใน backdrops เหมือนช่องรูปอื่น ช่องเลือกอยู่ในกรอบข้อ ๑ คู่กับชื่อบท เพราะเป็นสองอย่างที่ผู้ใช้เห็นพร้อมกัน พร้อมปุ่มอัป ⬆ และรูปย่อขนาด 52 จุด · /v1/list ส่ง items[].cover เป็นก้อนพร้อม url sha256 bytes width height ไม่ใช่แค่รหัส ต่างจาก steps[].image โดยตั้งใจ เพราะ data อยู่ในไฟล์แยกที่มือถือยังไม่ได้โหลดตอนวาดรายการ ถ้าส่งแต่รหัสมือถือต้องโหลดไฟล์ data ของทุกบทก่อนถึงจะวาดรายการได้ · ไม่ได้ตัดเป็นจัตุรัสให้ ส่ง width height ไปให้มือถือครอบเอง · รวมช่องเลือกรูปนอกตารางลูปทั้งสามช่อง ปก เสียงเปิด เสียงจบ ไว้ในรายการเดียว จะได้ไม่ลืมช่องใดช่องหนึ่งตอนเติมตัวเลือกใหม่หลังอัปรูป |
| 1.53.7 |
2026-08-26 |
ปุ่มอัปรูป ⬆ อยู่ข้างช่องเลือกรูปทุกช่อง ทั้งในตารางลูป เสียงเปิด และเสียงจบ — v1.53.6 ใส่ช่องเลือกรูปให้แต่ไม่ได้ใส่ปุ่มอัป ทั้งที่เพิ่งย้ายปุ่มอัปเสียงมาไว้ตรงจุดที่ใช้ด้วยเหตุผลเดียวกันเมื่อสองเวอร์ชันก่อน คนทำเนื้อหาจึงต้องออกไปหน้าคลังภาพแล้วกลับมาใหม่ · อัปแล้วรูปเข้าคลังภาพชุดเดียวกับที่อื่นในระบบ ไม่ใช่คลังแยก และถูกเลือกให้ตรงจุดนั้นทันที ไม่โหลดหน้าใหม่ · BackdropController::store() คืน JSON เมื่อ wantsJson() · รูปที่ซ้ำกับของเดิมเซิร์ฟข้ามให้อยู่แล้ว ตอนนี้บอกด้วยว่าซ้ำ ไม่ใช่เงียบแล้วให้เดาว่าทำไมไม่มีอะไรเกิดขึ้น · ถอดเพดาน 20 รูปต่อครั้งและ 24 MB ต่อรูปของคลังภาพออก เหลืออ่านค่าจริงจาก php.ini เหมือนที่ทำกับเสียง · รวมตัวจับคลิกของปุ่ม ⬆ ทุกตัวไว้ที่เดียวและใช้ closest ไม่ใช่ e.target ตรง ๆ เพราะปุ่มในตารางถูกสร้างใหม่ทุกครั้งที่ render() |
| 1.53.6 |
2026-08-26 |
เสียงเปิดกับเสียงจบใส่รูปได้แล้ว — เพิ่ม start.image และ end.image เข้าโครงข้อมูล เป็นรหัสชี้ไป backdrops ระบบเดียวกับ steps[].image ของลูป ไม่ใช่คลังแยก เพราะเป็นรูปประเภทเดียวกันที่แสดงในวงกลมเหมือนกัน · null ได้ แปลว่าจังหวะนั้นแสดงวงกลมเรียบ ไม่ใช่จอว่าง · เซิร์ฟตรวจรหัสภาพให้ก่อนบันทึกเวอร์ชันเหมือนของลูป รหัสที่ชี้ไปหาภาพที่ถูกซ่อนหรือลบไปแล้วกลายเป็น null อัตโนมัติ · หน้าทดลองปฏิบัติแสดงรูปทั้งสองตัวตามจังหวะจริง · ต้องแจ้งฝั่งมือถือ โครงข้อมูลเปลี่ยน |
| 1.53.5 |
2026-08-26 |
หน้าทดลองปฏิบัติของวิปัสสนาเล่นเสียงจริงครบทั้งรอบ และตั้งระยะเวลาทดลองได้ — ของเดิมขยับแต่วงกลมกับตัวหนังสือ ไม่มีเสียงสักตัว และเล่นแค่ลูป ไม่รวมเสียงเปิดกับเสียงจบ จึงกดฟังไม่ได้ว่าสามชิ้นต่อกันแล้วออกมาเป็นยังไง · ตอนนี้เดินครบห้าเฟส เสียงเปิดตามจำนวนครั้ง เว้นก่อนเริ่ม วนลูปจนครบเวลา เงียบ แล้วเสียงจบตามจำนวนครั้ง · ปุ่มบวกนาที +๑ +๑๐ +๑๕ +๓๐ +๖๐ กดซ้ำสะสมได้ ๑๐+๓๐ = ๔๐ นาที ตามที่เจ้าของโปรเจกต์ออกแบบไว้ให้ฝั่งมือถือ และปุ่มล้างกลับเป็นไม่จำกัด · ไม่ตั้งเวลา = วนไปเรื่อยจนกดหยุด ซึ่งเป็นค่าเริ่มต้น ไม่ใช่เพดาน · ระยะเวลานี้อยู่ในหน้านี้เท่านั้น ไม่เข้าโครงข้อมูล ไม่ถูกบันทึก ไม่ส่งให้มือถือ ตามที่เจ้าของสั่งไว้ตั้งแต่ v1.53.0 ว่าความยาวการปฏิบัติเป็นเรื่องของฝั่งมือถือ · ครบเวลาแล้วหยุดทันทีไม่เล่นช่วงที่ค้างให้จบก่อน ตามที่ตกลงกับฝั่งมือถือ · ถอดพื้น 0.2 วินาทีที่ค้างอยู่ในตัวเล่นตัวอย่างออกอีกจุด |
| 1.53.4 |
2026-08-26 |
ถอดข้อ ๗ ใช้คำภาวนาไหม ออกจากหน้าวิปัสสนา พร้อม recitation_id และ recitation_swappable ในโครงข้อมูล — เป็นช่องที่ใส่เข้ามาเองตอน v1.53.0 โดยไม่ได้ถามเจ้าของโปรเจกต์ก่อน เขาตอบว่าไม่ได้ใช้ และถ้าอยากได้คำภาวนาก็ใส่เป็นรูปที่มีคำอยู่ในนั้นผ่านช่อง image ของแต่ละช่วงเองได้ ซึ่งโครงที่มีอยู่ทำได้อยู่แล้ว การมีอีกทางหนึ่งที่ทำเรื่องเดียวกันจึงเป็นภาระเปล่า · ชนิด recitation ยังอยู่เป็นเนื้อหาเอกเทศ ไม่ได้ลบ แค่ไม่มีอะไรชี้ไปหามันจากวิปัสสนา · หน้าแก้บทวิปัสสนาไม่ต้องดึง library มาแล้ว เหลือแต่ตัวจัดกิจกรรมที่ใช้จริง · บทที่บันทึกร่างไว้แล้วและมีสองช่องนี้ค้างอยู่ จะถูกตัดออกเองตอนบันทึกครั้งถัดไป เวอร์ชันที่เผยแพร่ไปแล้วไม่ถูกแตะ เพราะเวอร์ชันแก้ย้อนหลังไม่ได้ |
| 1.53.3 |
2026-08-26 |
ย้ายการอัปเสียงไปไว้ตรงจุดที่ใช้ และแปลงไฟล์ตอนอัป — เดิมกล่องอัปอยู่ท้ายสุดของหน้าใต้คำภาวนา ทั้งที่ข้อ ๓ ๔ ๕ ต้องมีเสียงก่อนถึงจะตั้งค่าได้ เจ้าของโปรเจกต์เปิดหน้ามาแล้วเห็นแต่ช่องเลือกที่ว่างเปล่ากับคำว่า ไม่มีเสียง จึงถามว่าไม่ให้อัพเสียงแล้วจะให้เล่นเสียงยังไง · ตอนนี้ปุ่ม ⬆ อยู่ข้างช่องเลือกเสียงทุกช่อง ทั้งในตารางลูป เสียงเปิด และเสียงจบ อัปเสร็จไฟล์เข้าคลังแล้วถูกเลือกให้ตรงจุดนั้นทันที ไม่โหลดหน้าใหม่ ไม่เด้งกลับไปบนสุด · ไฟล์แรกที่อัปคือตัวที่ถูกเลือก ที่เหลือเข้าคลังรอใช้ · เพิ่ม AudioCutter::transcode() แปลงทุกไฟล์เป็น m4a AAC 96k mono ก่อนเก็บ ค่านี้เจ้าของเลือกเอง ไม่ใช่ค่าที่ตั้งขึ้นมา ใช้ aac ธรรมดาไม่ใช่ aac_he เพราะ HE มีดีเลย์ตอนเริ่มเล่นจาก SBR ซึ่งเสียงเคาะระดับวินาทีรับไม่ได้ · เดิมเก็บดิบตามที่อัปมาโดยให้เหตุผลว่าไฟล์สั้นเกินกว่าจะคุ้มแปลง แต่มองข้ามไปว่า wav จากเครื่องอัดตัวเดียวใหญ่กว่าที่บีบแล้วสิบเท่า · ถอดพื้น 0.2 วินาทีที่ค้างอยู่ในหน้าเว็บออกอีกตัว ซึ่งทำให้ตัวเลขบนหน้ากับที่บันทึกจริงไม่ตรงกันเงียบ ๆ |
| 1.53.2 |
2026-08-25 |
ถอดเพดานที่ไม่มีใครสั่งออกจากหมวดวิปัสสนาทั้งหมด — v1.53.0 ใส่ MAX_LOOP_STEPS = 9 ไว้พร้อมคอมเมนต์ว่า "เกินนี้คนจำจังหวะไม่ไหวแล้ว" ซึ่งเป็นการตัดสินใจแทนเจ้าของโปรเจกต์ในเรื่องที่เขาเป็นคนออกแบบเอง และซ่อนอยู่ที่ชั้นบันทึกเวอร์ชัน คือหน้าเว็บให้กดได้แต่เซิร์ฟตัดทิ้งเงียบ ๆ ตอนบันทึก · เอาออกพร้อมกันทั้งชุด: จำนวนช่วงต่อลูป (เดิม 9) · ความยาวช่วงและความยาวลูป (เดิม 15 นาที) · จำนวนครั้งของเสียงเปิดและเสียงจบ (เดิม 9) · เว้นก่อนเริ่ม (เดิม 120 วินาที) · ระยะห่างเสียงจบ (เดิม 10 วินาที) · ความยาวคำบนจอ (เดิม 40 ตัวอักษร) · คำจบท้าย (เดิม 600 ตัวอักษร) · จำนวนไฟล์เสียงต่อการอัปหนึ่งครั้ง (เดิม 12) · ขนาดไฟล์เสียง (เดิม 4 MB เปลี่ยนไปอ่านค่าจริงจาก php.ini แทน จะได้ไม่โดน PHP ตัดทิ้งเงียบ ๆ ก่อนถึงโค้ด) · ที่เหลือไว้อย่างเดียวคือกันไม่ให้ความยาวช่วงเป็นศูนย์หรือติดลบ เพราะลูปจะหมุนฟรีจนแอปค้าง · หน้าแก้บทเพิ่มปุ่ม + เพิ่มช่วง ปุ่มตัวเลข 0–9 เหลือไว้เป็นทางลัด |
| 1.53.1 |
2026-08-25 |
เปลี่ยน steps[].shape เป็น steps[].image ตามที่เจ้าของโปรเจกต์สั่งผ่านฝั่งมือถือ — v1.53.0 ส่งท่าทางของวงกลมห้าค่าไปให้แอปตีความเองว่าควรวาดยังไง ซึ่งขัดกับหลักที่ว่าเซิร์ฟกำหนด แอปแสดงผล และห้าค่าตายตัวคือปัญหาเดิมของโครงเก่าในรูปแบบใหม่ เพิ่มการปฏิบัติที่ไม่ใช่ทั้งเดินและนั่งไม่ได้จนกว่าจะแก้โค้ด ทั้งที่เพิ่งรื้อโครงเดิมทิ้งด้วยเหตุผลนั้นพอดี · ตอนนี้เป็นรหัสภาพชี้ไป backdrops ระบบเดียวกับภาพประกอบของธรรมเทศนา คนทำเนื้อหาเปลี่ยนรูปเองได้โดยไม่ต้องรออัปแอป · null ได้ แปลว่าช่วงนั้นแสดงวงกลมเรียบ ไม่ใช่จอว่าง · หน้าแก้บทยกภาพที่ติดป้าย cue ขึ้นมาไว้กลุ่มบนของช่องเลือก เพราะเป็นภาพที่ทำมาเพื่อวงกลมอยู่แล้ว · ไม่เพิ่ม mode กลับ เพราะเดินกับนั่งต่างกันแค่สัญลักษณ์ที่แสดง ซึ่ง image ครอบคลุมแล้ว |
| 1.53.0 |
2026-08-25 |
รื้อหมวดวิปัสสนาใหม่ทั้งหมด — โครงข้อมูลเหลือสามชิ้น start · loop · end เดิมมีสองรูปแบบตายตัวคือ pattern สำหรับลมหายใจ กับ cadence สำหรับก้าวเดิน ทำได้แค่สองอย่างนั้น อะไรที่ไม่ใช่สองแบบนี้ต้องแก้โค้ดก่อนเสมอ เช่น พองหนอ-ยุบหนอ ลมหายใจ 4-7-8 หรือเคาะไม้อย่างพระญี่ปุ่น โครงใหม่เป็นรายการช่วงที่ยาวเท่าไรก็ได้ (0-9 ช่วง) วนซ้ำจนหมดเวลา ลูปว่างคือเงียบล้วน ลูปช่วงเดียวมีเสียงคือเคาะซ้ำ กติกาข้อเดียวคือเสียงดังตอนเริ่มช่วงเสมอ · ระฆังระหว่างทางถูกตัดทิ้งเพราะมันคือลูปช่วงเดียวยาว 5 นาทีอยู่แล้ว · เสียงย้ายมาอยู่กับบท ตาราง practice_sounds ไม่ใช้ sha256 ร่วมกันแล้ว เพราะเจ้าของสั่งว่าลบบทแล้วไฟล์ต้องหายด้วย ซึ่งทำกับไฟล์ที่ใช้ร่วมกันไม่ได้ วิปัสสนามีไม่ถึงยี่สิบบทและเสียงระฆังราว 50 KB สำเนาแยกจึงกินที่ไม่ถึงหนึ่งเมกะ · ลบคลังเสียงร่วมทิ้งทั้งตารางและไฟล์ ตรวจแล้วมีผู้ใช้จริงที่เดียวคือหน้าวิปัสสนา กิจกรรมใช้ cue ซึ่งเป็นสัญลักษณ์ภาพ บทสวดใช้ audio_assets ของตัวเอง · ตัด variants กับ duration_default_min ออกจาก /v1/list ความยาวเป็นเรื่องของฝั่งมือถือ เพราะลูปมันวนอยู่แล้ว จะหยุดกี่นาทีเป็นเรื่องของคนนั่ง ไม่ใช่ของบท |
| 1.52.0 |
2026-08-25 |
ส่งความดังจริงของไฟล์เสียงไปให้ฝั่งมือถือด้วย — เพิ่ม audio.loudness_lufs ใน /v1/list หน่วย LUFS ตามมาตรฐาน EBU R128 · มีที่มาจากคำถามจริงว่าเสียงในแอปเบา วัดแล้วไฟล์อยู่ที่ -13.2 LUFS ซึ่งดังกว่ามาตรฐานพอดแคสต์ (-16) และ LRA แค่ 2.9 LU แปลว่าทั้งกัณฑ์ดังเท่ากันหมดไม่มีช่วงไหนเบาเลย เมื่อแอปแสดงเลขนี้ได้ ครั้งหน้าจะแยกได้ทันทีว่าปัญหาอยู่ฝั่งไหนโดยไม่ต้องเดา · null แปลว่ายังไม่ได้วัด ไม่ใช่เงียบ · chant:loudness ขยับ catalog_revision ให้แล้ว เพราะค่านี้อยู่ในลิสต์แล้ว ต่างจากตอน v1.51.0 ที่เก็บไว้ดูเองในหลังบ้านอย่างเดียว |
| 1.51.1 |
2026-08-25 |
คลื่นเสียงในเครื่องเล่นเปลี่ยนเป็นหน้าต่างเลื่อนตามหัวอ่าน — v1.51.0 วาดคลื่นทั้งกัณฑ์แล้วไล่สีตามที่ฟังไป ซึ่งใช้ไม่ได้จริงกับกัณฑ์ 6 ชั่วโมง เพราะหนึ่งแท่งกินเวลา 3 นาที หัวอ่านขยับหนึ่งพิกเซลต่อสามนาที ดูยังไงก็เหมือนภาพนิ่ง · ตอนนี้แสดงหน้าต่าง 10 วินาทีรอบหัวอ่าน 12 แท่งต่อวินาที เห็นไหลชัดเจน และเป็นวิธีเดียวกับที่ฝั่งมือถือจะทำ จึงซ้อมเส้นทางนั้นไปในตัว · ขอข้อมูลทีละ 720 เฟรมด้วย HTTP range เท่ากับที่ฝั่งมือถือใช้ · วาดด้วย requestAnimationFrame เพราะ timeupdate ยิงราว 4 ครั้งต่อวินาที ซึ่งกระตุกเห็นชัดเมื่อคลื่นต้องไหล 12 แท่งต่อวินาที · คลิกข้ามเวลาย้ายไปที่แถบเวลาอย่างเดียว คลิกกลางคลื่นที่กว้าง 10 วินาทีไม่มีความหมาย |
| 1.51.0 |
2026-08-24 |
หน้าแก้ธรรมเทศนามีเครื่องเล่นทดสอบเสียงแล้ว — ปุ่มเล่น แถบเวลา และคลื่นเสียงที่อ่านจากไฟล์ viz จริงเป็นช่วงด้วย HTTP range เหมือนที่ฝั่งมือถือทำ จึงเป็นการทดสอบไฟล์ viz ไปในตัว ถ้าคลื่นไม่ตรงกับเสียงที่ได้ยินก็รู้ทันทีว่าปัญหาอยู่ฝั่งเรา ไม่ใช่ฝั่งแอป · กัณฑ์ 6 ชั่วโมงมีเส้นเสียง 12 MB จึงขอเฉพาะเฟรมที่จะวาดจริง 120 แท่ง รวมกันไม่ถึง 100 KB ไม่ได้ดึงทั้งก้อน · จำนวนย่านและระยะห่างเฟรมอ่านจากหัวไฟล์เสมอ ไม่ฝังเลขไว้ ตามกฎเดียวกับที่แจ้งฝั่งมือถือ · เก็บความดังจริงหน่วย LUFS ตามมาตรฐาน EBU R128 ไว้ในตารางไฟล์เสียง เพราะไม่มีขั้นตอนไหนในระบบแตะระดับเสียงเลย ต้นฉบับเบาแค่ไหนก็เบาถึงหูผู้ใช้เท่านั้น และดูจากเส้นเสียงไม่ได้เพราะ VizBuilder ดันยอดไปที่ 235 ทุกไฟล์ · งานคิววัดให้เองตอนนำไฟล์เข้า ของเก่าเติมย้อนหลังด้วย php artisan chant:loudness |
| 1.50.1 |
2026-08-24 |
กัณฑ์ยาวคำนวณเส้นเสียงได้แล้ว — v1.50.0 ขยายย่านสี่เท่าโดยไม่ได้ดูว่าโครงข้อมูลที่ค้างในหน่วยความจำโตตามไปด้วย กัณฑ์ 358.9 นาทีต้องการราว 700 MB ขณะที่ memory_limit ของเครื่องนี้เป็น 128M มันจึงตายเงียบกลางคำสั่ง chant:viz โดยไม่มี error ให้เห็น และเพราะตายกลางทาง บรรทัดสรุปกับการขยับ catalog_revision ก็ไม่ได้ทำงาน · ตอนนี้เขียนค่าดิบเป็น float32 ลงไฟล์ชั่วคราวทีละเฟรมแล้วอ่านกลับมาปรับระดับตอนเขียนไฟล์จริง หน่วยความจำคงที่ไม่ว่ากัณฑ์จะยาวแค่ไหน วัดจริงกับไฟล์ 30 นาที จาก 58.0 MB เหลือ 2.0 MB และเวลาเท่าเดิม (20.6 กับ 20.3 วินาที) · ผลลัพธ์ต่างจากเดิมเพียง 1 ไบต์จาก 1,036,286 ไบต์ และต่างกันแค่ค่าเดียว เป็นการปัดเศษของ float32 · chant:viz มีแถบความคืบหน้าแล้ว เดิมเงียบสนิทตลอดเวลาที่ทำไฟล์หนึ่ง กัณฑ์ยาวจึงดูเหมือนเครื่องค้าง |
| 1.50.0 |
2026-08-24 |
เส้นเสียงเปลี่ยนจาก 12 ย่านความถี่เป็น 48 — ฝั่งมือถือวาด 48 แท่งโดยวนค่า 12 ตัวซ้ำสี่รอบ ได้ลายซ้ำสี่ท่อนที่เห็นชัดด้วยตาเปล่า · ขยายหน้าต่างวิเคราะห์จาก 256 เป็น 512 ตัวอย่างพร้อมกัน เพราะที่ 256 ได้บินละ 31.25 Hz แต่ย่านล่างสุดของ 48 ย่านกว้างแค่ 6.7 Hz ผลคือ 20 ย่านล่างดึงค่าจากบินรวมกันแค่ 12 บิน และมี 3 คู่ที่ช่วงบินตรงกันเป๊ะ ซึ่งเท่ากับยืดค่าให้ดูเยอะ ไม่ใช่ย่านจริง · 512 ให้บินละ 15.6 Hz แยกครบทั้ง 48 เส้น และยังสั้นกว่าระยะห่างระหว่างเฟรม 83 ms จึงไม่เบลอตามเวลา · ชื่อไฟล์เส้นเสียงมีจำนวนย่านอยู่ด้วยแล้ว viz/{sha}.b48.bin กันไฟล์คนละรูปแบบทับกันที่ URL เดิมซึ่งจะทำให้แอปที่อ่านเป็นช่วงคำนวณออฟเซ็ตผิดทุกเฟรมโดยไม่มี error · chant:viz ขยับ catalog_revision ให้แล้วเมื่อสร้างไฟล์จริง |
| 1.49.5 |
2026-08-24 |
ธรรมเทศนาเลือก “ฝังไปกับ APK” ไม่ได้อีกแล้ว — กัณฑ์หนึ่งบีบแล้วยังใหญ่ 80–170 MB ไฟล์เดียวก็เกินเพดาน APK ของ Play Store (150 MB) เผลอเลือกครั้งเดียวฝั่งมือถือ build ไม่ผ่านแล้วไปหาสาเหตุผิดฝั่ง · ห้ามที่ชั้นตรวจสอบ ไม่ใช่แค่ซ่อนช่องในฟอร์ม เพราะช่องที่ซ่อนยังส่งค่ามาได้และงานนำเข้าข้อมูลไม่ผ่านฟอร์มเลย · ของเดิมที่ตั้งไว้ย้ายมาเป็น extra ให้อัตโนมัติตอน migrate · แยก total_bytes เป็นสองเลข — total_bytes คือที่ต้องโหลดเก็บจริงไม่รวมเสียงของบทที่สตรีม และเพิ่ม stream_bytes สำหรับเสียงที่สตรีม เดิมรวมเป็นก้อนเดียวทำให้หน้าจอบอกผู้ใช้ว่าต้องโหลดหลายร้อยเมกะทั้งที่โหลดเก็บจริงไม่กี่สิบ |
| 1.49.4 |
2026-08-24 |
รับภาพพื้นหลังที่ GD อ่านไม่ออกได้แล้ว โดยให้ ffmpeg ถอดให้ก่อน — GD บนเซิร์ฟนี้ไม่มี AVIF Support และเว็บภาพสต็อกสมัยนี้แจก AVIF เป็นค่าตั้งต้น บางเจ้ายังตั้งชื่อไฟล์เป็น .jpg ให้ด้วย ผลคือภาพถูกเก็บดิบไม่แปลงไม่ย่อ รูปปกจอล็อกสร้างไม่ได้เลยสักใบ และแอนดรอยด์ต่ำกว่ารุ่น 12 จะแสดงภาพนั้นไม่ขึ้น · นามสกุลไฟล์ดมจากเนื้อในแทนที่จะเชื่อชื่อไฟล์ที่อัปมา · ภาพที่ต้องพึ่ง ffmpeg จะใช้ตัวที่แปลงแล้วเสมอถึงจะใหญ่กว่าเดิม ไม่งั้นได้ AVIF กลับเข้าคลังเหมือนเดิม · ของเก่าที่ค้างอยู่ซ่อมด้วย php artisan chant:webp --run |
| 1.49.3 |
2026-08-23 |
ธรรมเทศนาบันทึกเป็นเวอร์ชันได้โดยไม่ต้องมีบล็อกข้อความ — เสียงคือเนื้อหาของกัณฑ์เทศน์ ข้อความกับภาพเป็นของเสริม กฎเดิมตั้งแต่ v1.47.0 บังคับว่าต้องมีบล็อกข้อความ ซึ่งขัดกับการออกแบบเองที่หน้านี้ไม่มีข้อความเลย มีแต่เส้นเสียงกลางจอกับภาพพื้นหลัง ผลคือกัณฑ์ที่มีเสียงกับภาพครบบันทึกไม่ได้สักครั้ง และเมื่อบันทึกไม่ได้ ปุ่มเผยแพร่ก็ไม่มีวันโผล่ |
| 1.49.2 |
2026-08-23 |
หน้าคิวบอกความคืบหน้าจริงของงานที่กำลังทำ — เปอร์เซ็นต์มาจากขนาดไฟล์ที่ ffmpeg กำลังเขียนอยู่จริง ไม่ได้มาจากนาฬิกา เพราะตอนบีบเสียงงานติดอยู่ใน shell_exec เขียนฐานข้อมูลไม่ได้เลยสักครั้ง หน้าเว็บจึงไป stat ไฟล์นั้นแทนตอนถูกถาม · บอกขั้นตอนที่ทำอยู่ทั้งห้าขั้น บีบเสียง เก็บไฟล์ ถอดเสียง คำนวณเส้นเสียง ย้ายเข้าคลัง · ขั้นคำนวณเส้นเสียงเป็นลูป PHP ของเราเองจึงรายงานเปอร์เซ็นต์ตรงได้ · งานค้างแล้วขึ้นว่าไม่ขยับมากี่นาทีแล้ว แถบหยุดนิ่ง ไม่หมุนหลอก · เก็บกวาดไฟล์เปล่าที่ tempnam ทิ้งไว้ใน tmp ทุกครั้งที่แปลง |
| 1.49.1 |
2026-08-23 |
แก้หน้าคลังไฟล์เสียงดิบและหน้าคาราโอเกะที่ล่ม 500 มาตั้งแต่ v1.47.0 — SourceAudio::clips() เรียกแบบ static ไม่ได้เพราะชื่อชนกับความสัมพันธ์ hasMany ที่มีอยู่ก่อน PHP จึงโยน Error ก่อนถึง __callStatic ของ Eloquent ส่วน streams() ที่หน้าตาเหมือนกันเป๊ะกลับไม่พังเพราะไม่มีความสัมพันธ์ชื่อเดียวกัน · เปลี่ยนเป็นเรียกผ่าน query() ทั้งสองตัว · เพิ่มตัวตรวจการเรียกเมธอดโมเดลแบบ static เข้ารายการตรวจก่อนส่ง เพราะ php -l ไม่มีวันเห็นบั๊กชนิดนี้ |
| 1.49.0 |
2026-08-22 |
โฟลเดอร์รับไฟล์ผ่าน FTP — ทางเข้าที่ไม่ผ่าน HTTP จึงไม่ติดเพดาน Cloudflare 100 MB ที่แก้ไม่ได้ กัณฑ์ 6 ชั่วโมงขึ้นได้โดยไม่ต้องตัดแบ่ง · ชื่อโฟลเดอร์ชั้นบนสุดบอกชนิด ชั้นในสุดกลายเป็นหมวด ตัดเลขนำหน้าให้ ไม่เดาชนิดเองถ้าไม่รู้จัก · สั่งแปลงทีละหลายร้อยไฟล์เข้าคิว ปิดหน้าไปแล้วกลับมาดูได้ งานไม่หาย · บีบและคำนวณเส้นเสียงตั้งแต่ตอนเข้าคลัง หน้าธรรมเทศนาจึงหยิบไปใช้ได้ทันทีไม่ต้องรอบีบซ้ำ · ไฟล์ชนิดตัดเป็นบทไม่ถูกบีบ เพราะจะเสียคุณภาพสองต่อตอนตัดจริง · retry_after 90 เป็น 7200 เดิมทำให้ไฟล์ที่บีบนานเกินหนึ่งนาทีครึ่งถูกแปลงซ้ำวนไม่รู้จบ · เพิ่ม deploy/QUEUE.md · ฟอร์มอัปโหลดยังอยู่ จะเอาออกใน 1.49.1 หลังพิสูจน์ว่าทางใหม่ใช้ได้จริง |
| 1.48.2 |
2026-08-20 |
เพดานขนาดไฟล์อัปเป็นค่าเดียวที่ทุกที่อ่านจากมัน ตั้งไว้ 500 MB — เดิมฝังในโค้ดสามที่ ค่าไม่ตรงกันสักที่ และสูงกว่าเซิร์ฟจริงจนข้อความเตือนไม่มีวันโผล่ ผู้ใช้เจอแต่หน้าค้าง · หน้าเว็บบอกเพดานจริงจาก php.ini ไม่ใช่เลขที่ตั้งใจให้เป็น · เบราว์เซอร์เตือนขนาดไฟล์ก่อนส่ง ไม่ต้องเสียเวลาอัปแล้วค่อยรู้ · เพิ่ม deploy/UPLOAD-LIMITS.md บอกวิธีตั้งครบทั้งสี่ชั้นพร้อมเรื่อง max_input_time ที่ตั้งต้นแค่ 60 วินาที |
| 1.48.1 |
2026-08-20 |
เอาหมวดธรรมเทศนาสี่หมวดที่ระบบใส่ไปเองออก — เจ้าของไม่ได้ขอ หมวดคือการตัดสินใจเรื่องเนื้อหา ไม่ใช่ค่าตั้งต้นทางเทคนิคที่ใส่ให้ได้ · เอาช่องหมวดออกจากฟอร์มสร้างและแก้ข้อมูลบท ไม่ใช่หน้าที่ของหน้านั้น ตั้งที่ตารางหน้ารายการหรือแท็บหมวดแทน · แก้ชื่อบทแล้วหมวดไม่ถูกล้างทิ้ง เพราะฟอร์มไม่ส่งช่องหมวดมาแล้ว จึงต้องแยกให้ออกว่าไม่ได้ส่งกับส่งมาว่าง |
| 1.48.0 |
2026-08-20 |
ลบหน้าหมวดกลางทิ้ง — หมวดเป็นแท็บของหน้าเนื้อหาแต่ละหน้าแทน แท็บที่ยืนอยู่บอกอยู่แล้วว่าหมวดนี้ของอะไร ช่องติ๊กหกชนิดต่อแถวที่เพิ่งใส่ไปจึงหายไปทั้งหมด · ทุกชนิดมีหมวดของตัวเอง รวมบทย่อยและกิจกรรมทางศาสนา · หมวดสังกัดที่เดียว ย้ายแท็บได้เผื่อสร้างผิดที่ · ช่องหมวดในตารางกรองตามชนิดของแถวแล้ว เดิมแถวคาถาเห็นหมวดของบทสวดให้ติ๊กด้วย |
| 1.47.1 |
2026-08-20 |
หมวดบอกได้ว่าใช้กับเนื้อหาชนิดไหน — หน้าสร้างธรรมเทศนาเคยโชว์แต่หมวดบทสวดกับคาถา ซึ่งไม่มีอันไหนเกี่ยวเลย · ใส่หมวดธรรมเทศนาตั้งต้นให้สี่หมวด · ตัวอย่างคำค้นเปลี่ยนตามชนิด ไม่ใช่ยกคาถาให้ทุกชนิด · เอาช่องที่มาคำแปลออกจากธรรมเทศนา เทศน์ไทยไม่มีคำแปล · ปุ่มวางข้อความโผล่เฉพาะบทสวดกับคาถา เดิมกดจากหน้าธรรมเทศนาแล้วไปโผล่ที่คลังคาถา |
| 1.47.0 |
2026-08-20 |
ธรรมเทศนาเป็นเสียงยาวที่มีภาพประกอบเปลี่ยนตามเวลา — อัปไฟล์ที่หน้านี้ได้ เข้าคลังให้เอง ติดหมวด stream บีบเป็น AAC-HE ให้ในตัว หรือหยิบไฟล์เดิมจากคลังก็ได้ · เส้นเวลาภาพประกอบ ภาพค้างจนถึงภาพถัดไป ภาพแรกบังคับเริ่มที่ศูนย์ · เซิร์ฟคำนวณเส้นเสียงรายย่านความถี่ให้ตอนอัปโหลด เพราะแอปอ่านคลื่นเสียงเองไม่ได้โดยไม่ขอสิทธิ์ไมโครโฟน · รูปปกจัตุรัสสำหรับแถบควบคุมบนหน้าจอล็อก ตอนเปิดฟังแล้วสลับไปแอปอื่น · at ส่งครบทุกบล็อก ไม่ใช่เฉพาะหัวข้อ · คลังไฟล์เสียงดิบแยกสองชนิด กรองตามหมวดได้ · เปลี่ยนชื่อ auto เป็น seconds เพราะชื่อเดิมทำให้เข้าใจว่ามีโหมดรอผู้ใช้กด ซึ่งไม่มีและจะไม่มี |
| 1.46.0 |
2026-08-20 |
แก้ตัวจัดระเบียบเวลาที่สร้างเวลาซ้อนขึ้นมาเอง — ยืดพยางค์สั้นทีหลังตัดขอบ ผลคือทับตัวถัดไปแล้วตัวตรวจตีกลับ ตอนนี้ไล่ทั้งบทเป็นสายเดียว ข้ามขอบวรรคด้วย · คำสั่งขยับเลขรุ่นแทรกแถวเดียวแทนเขียนไฟล์ใหม่ทั้งไฟล์ ซึ่งทำให้ประวัติซ้อนสองชุดตั้งแต่เปลี่ยนโครง config/version.php · trigger กันแก้เวอร์ชันที่เผยแพร่แล้วเช็คครบทุกคอลัมน์ เดิมตก data ไปห้าตัว · แจ้งเตือนบทที่ยังถูกใช้ในกิจกรรมครบทั้งร่างและเวอร์ชันที่เผยแพร่ · เขียนไฟล์ JSON อยู่ในทรานแซกชัน ล้มแล้วลบไฟล์ทิ้ง |
| 1.45.0 |
2026-08-20 |
ทุกหน้าจังหวะพิธีมีเวลาเสมอ ผ่านเองเมื่อครบ ไม่มีโหมดรอผู้ใช้กด — เซิร์ฟเติมค่าตั้งต้นตามชนิดให้ตอนบันทึกเวอร์ชัน แอปไม่ต้องเดาอีก · คำภาวนาได้ความสามารถ text ที่เคยตกหล่น · ข้อความต้อนรับหน้าเปิดแอปพร้อมหน้าจัดการ |
| 1.44.1 |
2026-08-20 |
แก้กล่องตั้งหมวดถูกครอบตัดจนใช้ไม่ได้ — ตารางอยู่ในกรอบ overflow กล่องลอยจึงโดนตัด เปลี่ยนเป็นกางในแถวแทน |
| 1.44.0 |
2026-08-20 |
บทหนึ่งอยู่ได้หลายหมวด ย้ายไปตารางเชื่อม · ตั้งหมวดได้จากหน้ารายการเลย ไม่ต้องเปิดทีละบท · เพิ่มคำค้นเพิ่มเติมต่อบท · เปลี่ยนชื่อเมนูคาถาเป็นคลังบทสวดและคาถาตามที่ตกลงกับฝั่งมือถือ |
| 1.43.0 |
2026-08-20 |
กิจกรรมทางศาสนาไม่อ้างถึงบทสวดคาราโอเกะแล้ว — เป็นเอกเทศ เปิดสวดเดี่ยวพร้อมเสียงและจังหวะของตัวเอง · เอาช่องจำนวนจบออก จำนวนจบเป็นคุณสมบัติของตัวบท ไม่ใช่ของกิจกรรม |
| 1.42.0 |
2026-08-20 |
เลือกรูปหน้าจังหวะพิธีเป็นตารางภาพจริง ค้นและกรองตามป้ายได้ แทนรายการเลื่อนที่ใช้ไม่ได้เมื่อมีรูปเป็นร้อย · หน้าคลังภาพมีปุ่มติดป้าย cue ให้กด ไม่ต้องพิมพ์เอง |
| 1.41.0 |
2026-08-20 |
เตือนวรรคที่ยาวเกิน 30 อักขระในหน้าไล่จังหวะ — ฝั่งมือถือย่อตัวอักษรตามวรรคที่ยาวที่สุด วรรคเดียวที่ยาวเกินทำให้ทั้งหน้าเล็กลง · เป็นคำเตือน บันทึกได้ตามปกติ |
| 1.40.0 |
2026-08-20 |
หน้าจังหวะพิธีใส่รูปในวงกลมได้ เลือกจากคลังภาพเดิม เก็บแค่รหัสภาพไม่เก็บ URL · ภาพที่ทำมาเพื่อวงกลมให้ติดป้าย cue |
| 1.39.0 |
2026-08-20 |
ถอดบท คืนบท และแก้ข้อมูลบทที่เผยแพร่แล้ว ขยับเลขรุ่นให้มือถือรู้ · เผยแพร่ครั้งแรกขยับ list_version ด้วย · ปล่อยรหัสแล้วคลังคาราโอเกะตามไปด้วย |
| 1.38.1 |
2026-08-20 |
แถวบทสวดกับแถวจังหวะพิธีใช้โครงเดียวกัน ตัวเลขอยู่กลางช่องเหมือนกัน |
| 1.38.0 |
2026-08-20 |
หน้าจังหวะพิธีตั้งวินาทีให้ผ่านเองได้ แตะข้ามได้ตลอด · เอาช่องจำนวนครั้งออก พิมพ์ต่อท้ายชื่อแทน · แปลง count เดิมเป็นข้อความอัตโนมัติ |
| 1.37.0 |
2026-08-20 |
คำสั่งสร้างกิจกรรมทดสอบที่ใช้ cue ครบ 9 แบบพร้อม cue ปลอม · กันหน้าทดสอบหลุดไปกิจกรรมจริงตอนบันทึกเวอร์ชัน |
| 1.36.0 |
2026-08-20 |
เพิ่ม cue จุดธูปเทียนและเดินเวียนเทียน · title ของหน้าจังหวะพิธีห้ามว่าง เติมค่าตั้งต้นให้ทั้งฝั่งหน้าเว็บและตอนบันทึกเวอร์ชัน |
| 1.35.2 |
2026-08-20 |
ย้ายเมนูกิจกรรมทางศาสนาขึ้นเหนือคาถา |
| 1.35.1 |
2026-08-20 |
แก้กลุ่มหมวดแสดงเป็นแถวเดียว — คลาส .grp ชนกับหัวข้อเมนูซ้ายที่เป็น flex |
| 1.35.0 |
2026-08-20 |
หน้าจัดหมวดใหม่ — เพิ่มหมวดอยู่บนสุด ปุ่มบันทึกติดแถบบน แบ่งหน้าทีละ 12 รายการ ค้นหาและกรองตามชนิดกับหมวดได้ |
| 1.34.0 |
2026-08-20 |
นิยามหมวดใหม่ — จัดกลุ่มตามลักษณะเนื้อหา ไม่ใช่โอกาสที่สวด · ล้างหมวดตั้งต้นที่เป็นโอกาส · เอากิจกรรมออกจากหน้าจัดหมวด · ลบหมวดถาวรได้ |
| 1.33.1 |
2026-08-20 |
ช่องประเภทบทหลัก/บทย่อยโผล่เฉพาะบทสวดมนต์ — ชนิดอื่นไม่มีเรื่องการประกอบเสียง บังคับเป็นบทหลักทั้งฝั่งหน้าเว็บและเซิร์ฟ |
| 1.33.0 |
2026-08-20 |
ปล่อยรหัสบทที่ถอดออกแล้วให้ใช้ใหม่ — เปลี่ยนรหัสเป็น xxx-removed-วันที่ ประวัติยังอยู่ครบ ไม่ต้องแตะ trigger ที่กัน content_revisions |
| 1.33.0 |
2026-08-20 |
ลบบทถาวรได้ เฉพาะบทที่ไม่เคยเผยแพร่ — ไม่มีผู้ใช้คนไหนเคยเห็น ลบแล้วรหัสว่างให้ใช้ใหม่ · มีทั้งปุ่มในหน้าที่ซ่อนไว้และคำสั่ง chant:purge |
| 1.32.1 |
2026-08-20 |
ข้อความรหัสซ้ำบอกชัดว่ารวมบทที่ถอดออกไปแล้ว — เดิมบอกแค่ “มีอยู่แล้ว” แล้วหาไม่เจอเพราะรายการปกติไม่แสดงของที่ซ่อน |
| 1.32.0 |
2026-08-20 |
เปลี่ยนกิจกรรมประจำเป็นกิจกรรมทางศาสนา · หน้าแก้กิจกรรมกรองตามชนิดได้ หาคาถามารวมง่ายขึ้น |
| 1.31.2 |
2026-08-20 |
ช่องพิมพ์และกล่องผลสูงตามจอ ไม่ล็อกที่จำนวนบรรทัด |
| 1.31.1 |
2026-08-20 |
กล่องผลสลับได้สองมุมมอง — โครงที่แยกได้ กับ ข้อมูล JSON ที่จะบันทึกจริง |
| 1.31.0 |
2026-08-20 |
เอาหน้าต่างเล่นตัวอย่างที่มีฉากหลังและเอฟเฟกต์ออกทั้งหมด — การแสดงผลเป็นหน้าที่ฝั่งมือถือ · ตัวอย่างในหลังบ้านแสดงโครงข้อมูลแทน |
| 1.30.2 |
2026-08-20 |
หน้าที่ซ่อนไว้ไม่มีปุ่มสร้างใหม่แล้ว และคงตัวกรองชนิดไว้ตอนสลับไปมา |
| 1.30.1 |
2026-08-20 |
เอาเกณฑ์ 30 อักขระและจอมือถือจำลองออกจากตัวจัดการข้อความ — บทยาวก็ควรยาวได้ และการแสดงผลเป็นหน้าที่ฝั่งมือถือ |
| 1.30.0 |
2026-08-20 |
หน้าแก้คาถาใช้รูปแบบเดียวกับหน้าวางข้อความ — กรอบเดียว คำแปลติดบรรทัด แบ่งหน้าได้ · แก้เลขวันที่เวอร์ชันที่ค้างมาหลายสิบรุ่น |
| 1.29.2 |
2026-08-20 |
แก้สร้างเนื้อหาใหม่ไม่ได้ทั้งระบบ — เลิกส่ง capabilities ตั้งแต่ v1.28.1 แต่คอลัมน์ยังบังคับให้ต้องมีค่า |
| 1.29.1 |
2026-08-19 |
แก้รหัสบทจากชื่อไทย — เดิมหน้าเว็บเก็บอักษรไทยไว้แล้วเซิร์ฟปฏิเสธ ตอนนี้ถอดเป็นอักษรโรมันด้วยตารางเดียวกันทั้งสองฝั่ง |
| 1.29.0 |
2026-08-19 |
หน้าวางข้อความรวมเป็นกรอบเดียว — ## ขึ้นบท · > คำแปลติดบรรทัด · บรรทัดว่างขึ้นหน้าใหม่ · มีคำอธิบายพร้อมตัวอย่างและปุ่มช่วยใส่สัญลักษณ์ |
| 1.28.2 |
2026-08-19 |
คาถาเพิ่มผ่านหน้าวางข้อความตรง ๆ ไม่ต้องผ่านฟอร์มตั้งค่าที่ออกแบบมาสำหรับบทสวดคาราโอเกะ |
| 1.28.1 |
2026-08-19 |
เอากล่องติ๊กความสามารถออกทั้งหมด — จำนวนจบกำหนดรายหน้าในกิจกรรมอยู่แล้ว ส่วนปุ่มสวดใหม่เป็นเรื่องของแอป |
| 1.28.0 |
2026-08-19 |
ความสามารถคำนวณจากเนื้อหาจริงแทนช่องติ๊ก — แก้บั๊กที่ลืมติ๊กคำแปลแล้วผู้ใช้ไม่เห็นคำแปลทั้งที่ใส่ไว้ · ฟอร์มสร้างเหลือเฉพาะช่องที่มีผลจริง |
| 1.27.0 |
2026-08-19 |
หน้าวางข้อความ — วางทั้งเล่มทีเดียว แยกเป็นหลายบทด้วย ## จับคู่คำแปลรายวรรค เตือนวรรคยาวเกิน พร้อมจอมือถือจำลอง |
| 1.26.0 |
2026-08-19 |
หน้าจัดหมวดและลำดับ — เพิ่ม/แก้/เรียงหมวด จัดเนื้อหาเข้าหมวด ขยับ list_version · เก็บกวาดหมวดตั้งต้นที่ซ้ำกับชนิด |
| 1.25.0 |
2026-08-19 |
บทที่ถอดออกแล้วหายจากรายการปกติ มีลิงก์ “ที่ซ่อนไว้” แยกต่างหาก — เดิมใช้ withTrashed() จึงรวมมาด้วยทุกหน้า |
| 1.24.2 |
2026-08-19 |
แก้ปุ่มถอดออก/คืน ตกลงไปบรรทัดใหม่ในทุกหน้าตาราง — form เป็นบล็อก white-space:nowrap กันไม่ได้ |
| 1.24.1 |
2026-08-19 |
ย้ายเมนูบทย่อยไปต่อจากบทสวดมนต์ · ลบแถบสลับในหน้ารายการ · แก้เลขนับข้างเมนูที่นับบทย่อยรวมมาด้วย |
| 1.24.0 |
2026-08-19 |
เปลี่ยนชื่อชนิดเป็นวิปัสสนาทั้งระบบ · เพิ่มโหมดเดินจงกรมพร้อมจังหวะก้าวและความเร็วปรับได้ · เสียง role step และ beat |
| 1.23.0 |
2026-08-19 |
กิจกรรมประจำเปลี่ยนเป็นโครงหน้าแบบหนังสือสวดมนต์ — เพิ่มหน้าจังหวะพิธี (กราบ กรวดน้ำ ประนมมือ) สลับกับหน้าบทสวด · ยังส่ง steps ให้แอปรุ่นเก่า |
| 1.22.0 |
2026-08-19 |
ภาพพื้นหลังผูกรายบท — เลือกจากคลัง จัดลำดับ ภาพแรกเป็นภาพเปิด · บังคับเพดานที่เซิร์ฟ · ส่งในระดับ item ทั้ง list และ seed |
| 1.21.2 |
2026-08-18 |
อัปภาพต้นฉบับได้ถึง 24 MB ไม่ต้องบีบมาก่อน · กันภาพความละเอียดมหาศาลทำให้หน่วยความจำหมด |
| 1.21.1 |
2026-08-18 |
แปลง WebP เฉพาะเมื่อไฟล์เล็กลงจริงหรือต้องย่อ — jpg ที่บีบมาหนักแล้วจะข้ามไป เพราะบีบซ้ำทำให้ใหญ่ขึ้นและคุณภาพแย่ลง |
| 1.21.0 |
2026-08-18 |
แปลงภาพพื้นหลังเป็น WebP และย่อให้พอดีจอตอนอัปโหลด · คำสั่ง chant:webp แปลงภาพเก่า |
| 1.20.0 |
2026-08-18 |
แก้บั๊กใหญ่ — เพิ่มภาพพื้นหลัง เสียงร่วม หรือแก้สวิตช์ฟีเจอร์ ไม่ขยับ catalog_revision มือถือจึงไม่เคยเห็นของใหม่ |
| 1.19.2 |
2026-08-18 |
แก้อัปโหลดภาพพัง — AuditLog::record ไม่รับ null · กันฟังก์ชัน GD ที่บางเครื่องไม่มี |
| 1.19.1 |
2026-08-18 |
ส่ง width/height ของภาพพื้นหลัง · เพิ่ม backdrop_min_own และ backdrop_max_per_item · เติมขนาดภาพเก่าที่ยังว่าง |
| 1.19.0 |
2026-08-18 |
เปลี่ยนเป็นลากตรงส่วนที่ไม่ต้องการแล้วกดลบ — เดิมให้เลือกส่วนที่เก็บ ซึ่งกลับหัวเพราะลบวินาทีเดียวต้องลากทั้งไฟล์ |
| 1.18.3 |
2026-08-18 |
แก้หน้าแก้เนื้อหาพัง — @json ของ Blade แยกวงเล็บเหลี่ยมหลายบรรทัดไม่ออก · ย้ายไปคำนวณใน @php |
| 1.18.2 |
2026-08-18 |
ตัดส่วนเกินออกจากคลิปที่ตัดมาแล้วได้เลย ไม่ต้องกลับไปเริ่มจากต้นฉบับ · เอาปุ่มตัดหัวท้ายเงียบออก |
| 1.18.1 |
2026-08-18 |
เปิดกล่องตัดแล้วเลือกไฟล์ต้นฉบับและช่วงเดิมให้อัตโนมัติ · ปุ่มตัดหัวท้ายเงียบหาจุดที่เสียงจริงเริ่มให้เอง |
| 1.18.0 |
2026-08-18 |
ตัดเสียงเก็บได้หลายช่วง ข้ามส่วนที่ไม่ต้องการกลางไฟล์ · ย้ายตัวต่อช่วงไปใช้ร่วมกับตัวประกอบบทเต็ม |
| 1.17.0 |
2026-08-18 |
คลังภาพพื้นหลังพร้อมวัดความสว่าง · สวิตช์ player_ui · capabilities ตรวจกับข้อมูลจริงก่อนส่ง · เตือนความยาววรรคเป็นอักขระ |
| 1.16.0 |
2026-08-17 |
ช่องกรอกคำแปลใต้แต่ละวรรค · แก้บั๊กที่คำแปลจากไฟล์ AI หายตอนบันทึกร่าง · คำแปลย้ายตามเมื่อแตกหรือรวมวรรค |
| 1.15.1 |
2026-08-17 |
แก้ Feature::on() ที่ชนกับ Model::on() ของ Laravel ทำให้หน้าสวิตช์ฟีเจอร์พังทั้งหน้า |
| 1.15.0 |
2026-08-17 |
สวิตช์ฟีเจอร์ที่เซิร์ฟคุม · stream_url + chapters สำหรับธรรมเทศนา · นั่งสมาธิหลายความยาวแต่ละอันมีคำแนะนำของตัวเอง |
| 1.14.0 |
2026-08-16 |
แยกบทหลักกับบทย่อย — บทย่อยไม่ส่งไปมือถือ ใช้ประกอบอย่างเดียว · ประกอบจากบทเดียวได้ ทยอยเพิ่มทีหลัง |
| 1.13.2 |
2026-08-16 |
ประกอบบทได้แม้บทย่อยอัปไฟล์ตรงหรือไม่มีข้อมูลการตัด — ใช้คลิปที่บีบแล้วแทน พร้อมป้ายบอกวิธี |
| 1.13.1 |
2026-08-16 |
นำเข้า JSON ก่อนมีไฟล์เสียงแล้วแก้ตัวอักษรและขอบวรรคได้ — เดิมหน้าว่างเปล่าเพราะตัวแก้ซ่อนทั้งหมด |
| 1.13.0 |
2026-08-16 |
ประกอบบทเต็มจากบทย่อย — ตัดจากไฟล์ต้นฉบับใหม่ในครั้งเดียว ไม่มีรอยต่อ · แก้ trim_start_ms ที่ไม่ได้อยู่ใน fillable |
| 1.12.2 |
2026-08-15 |
พยางค์ว่างใช้เป็นตัวคั่นกลุ่มคำได้ · แก้ tidy ที่แก้เวลาซ้อนไม่หมดเมื่อพยางค์สั้นมาก |
| 1.12.1 |
2026-08-15 |
ลากแล้วชนขอบเพื่อนบ้านหยุดเอง ไม่ซ้อนกัน · ปุ่มจัดให้เรียบร้อย แก้พยางค์ว่าง เวลาซ้อน และพยางค์สั้นเกิน |
| 1.12.0 |
2026-08-15 |
คำสั่ง chant:export — ส่งออกบทที่เผยแพร่แล้วเป็นชุดไฟล์สำหรับฝังใน APK |
| 1.11.1 |
2026-08-15 |
โหมดพยางค์ติดกันเป็นค่าเริ่มต้น · สลับเป็นแยกพยางค์ได้ตอนต้องเล็งคลิก |
| 1.11.0 |
2026-08-15 |
แถบจำลองหน้าจอมือถือ — เห็นว่าวรรคนี้ตกกี่บรรทัด สลับความกว้างและขนาดอักษรได้ |
| 1.10.2 |
2026-08-15 |
สลับลำดับหน้าคาราโอเกะ — เครื่องมืออยู่ติดรูปคลื่น เนื้อความย้ายลงล่าง |
| 1.10.1 |
2026-08-15 |
แก้ไฮไลต์ไม่ขึ้น — sweep() ยังหา .tok จาก kara.children ทั้งที่ย้ายไปซ้อนใน .vs แล้ว |
| 1.10.0 |
2026-08-15 |
หน้าคาราโอเกะแสดงเป็นวรรค มีเลขกำกับและนับพยางค์ · ปุ่มขึ้นวรรค/รวมวรรค (Enter / Shift+Enter) |
| 1.9.3 |
2026-08-15 |
ย้ายปุ่มล้างงานไปติดปุ่มบันทึกร่างในทุกตัวแก้ · กล่องนำเข้าจากคลังกระชับลง ซ่อนเองถ้าคลังว่าง |
| 1.9.2 |
2026-08-15 |
หน้าคลังไฟล์คาราโอเกะ — อัปหลายไฟล์พร้อมกัน ตรวจว่าอ่านออกก่อนเก็บ เปลี่ยนชื่อได้ |
| 1.9.1 |
2026-08-15 |
เอกสารส่งต่อ PROJECT.md — โครงระบบ หลักการ งานค้าง และกับดักที่เจอมาแล้ว |
| 1.9.0 |
2026-08-15 |
คลังไฟล์คาราโอเกะเลือกซ้ำได้ · ปุ่มล้างงานเริ่มใหม่ · ปุ่มถอดบทพร้อมเตือนผลกับผู้ใช้ · ย้ายกล่องตัดเสียงขึ้นบน |
| 1.8.3 |
2026-08-15 |
เลื่อนจากตรงนี้ไปจนจบ (Alt+ลูกศร) · ปุ่มปิดช่องว่าง |
| 1.8.2 |
2026-08-15 |
แทรกพยางค์ใหม่และลบพยางค์ในหน้าคาราโอเกะ — ปุ่ม I / Shift+I / Delete |
| 1.8.1 |
2026-08-15 |
แก้หน้าแก้เนื้อหาพัง — Laravel เดาชื่อตาราง SourceAudio ผิดเป็น source_audio |
| 1.8.0 |
2026-08-15 |
คลังไฟล์เสียงดิบ · ตัดช่วงด้วยการลากหมุดบนรูปคลื่น ฟังก่อนตัด · บีบ AAC-HE อัตโนมัติ |
| 1.7.2 |
2026-08-14 |
อ่านความยาวไฟล์เสียงแบบไม่ล้มเหลว — เซิร์ฟเวอร์ที่ปิด shell_exec ยังอัปโหลดได้ |
| 1.7.1 |
2026-08-13 |
ตัวแปลงรับโครง verses/lyrics และ time อย่างเดียว · เดาเวลาจบจากพยางค์ถัดไป |
| 1.7.0 |
2026-08-13 |
สคริปต์ deploy · setup · คู่มือขึ้น aaPanel · สำรองฐานข้อมูลอัตโนมัติ |
| 1.6.0 |
2026-08-11 |
คลังเสียงร่วม — ระฆัง เสียงนำลมหายใจ เสียงพื้นหลัง · เลือกใช้ในหน้านั่งสมาธิ |
| 1.5.0 |
2026-08-11 |
ปุ่มเล่นตัวอย่างในหน้าแก้ทุกชนิด · สลับฉากหลัง เอฟเฟกต์ ขนาดตัวอักษร |
| 1.4.0 |
2026-08-10 |
API สาธารณะ /v1/head + /v1/list · CORS · ต่อ ngrok ผ่าน Docker |
| 1.3.0 |
2026-08-10 |
ตัวแก้แยกตามชนิด 6 แบบ · แยกคำภาวนาออกจากนั่งสมาธิ |
| 1.2.0 |
2026-08-10 |
UI ทองปิดพระ · เมนูซ้าย · กรองตามชนิด |
| 1.1.0 |
2026-08-09 |
เว็บใช้งานได้ — ล็อกอิน สร้างเนื้อหา อัปโหลด เผยแพร่ |
| 1.0.0 |
2026-08-09 |
ฐานข้อมูล 15 ตาราง · trigger กันข้อมูลเสียหาย · Model + Policy |