Theppitak's blog

My personal blog.

06 กรกฎาคม 2555

swath revamp

หลังจากที่ได้ออก swath 0.4.3 ไปพร้อมกับชุด thailatex 0.5.0 แล้ว ก็ได้เวลากลับมาสะสางบั๊กเก่าที่ได้รับรายงานตั้งแต่ 5 เดือนก่อน พร้อมกับบั๊กที่เจอเองด้วย

  • บั๊กแรกที่ได้รับรายงานทางเมลส่วนตัว คือมีผู้ใช้นำ swath ไปใช้ประมวลผลเอกสารในแบบ pipeline โดยเปิดเป็น daemon ไว้แล้วส่งเอกสารไปแบ่งคำทีละบรรทัด แต่ปัญหาคือ ข้อความที่ส่งนั้นเป็น UTF-8 แล้ว swath จะรอข้อมูลจนจบแฟ้มก่อนจึงจะเริ่มทำงาน แทนที่จะให้ผลลัพธ์แบบบรรทัดต่อบรรทัด
  • บั๊กที่สอง เป็นบั๊กที่เจอเองระหว่างทดลองใช้ swath ตัดคำแฟ้ม utf-example.tex ของ thailatex เอง ซึ่งเป็นเอกสารที่มีอักขระมากกว่าสองภาษา โดยมีอักษรกรีก ซีริลลิกด้วย ปรากฏว่า swath จะกรองอักขระที่ไม่ใช่อังกฤษ-ไทย (ตามที่มีใน TIS-620) ทิ้งหมด โดยแทนเป็นอักขระ unknown

สองบั๊กนี้ มีความเกี่ยวพันกันอยู่ คือเกิดจากสาเหตุที่ swath ใช้รหัส TIS-620 ในการทำงาน บั๊กแรกนั้น เกิดจากวิธีจัดการข้อมูลที่เป็น UTF-8 โดยจะแปลงรหัสจาก UTF-8 เป็น TIS-620 ผ่าน แฟ้มชั่วคราว โดยจะแปลงข้อมูล ทั้งแฟ้ม ลงในแฟ้มชั่วคราวก่อน แล้วจึงเปิดแฟ้มชั่วคราวที่แปลงเป็น TIS-620 แล้วมาทำงานตามปกติ จึงทำให้ต้องรอข้อมูลจนจบแฟ้มเสียก่อนจึงเริ่มทำงาน

ส่วนบั๊กที่สองก็เข้าใจไม่ยากว่าเกิดจากการแปลงรหัสยูนิโค้ดเป็น TIS-620 ก่อนนั่นเอง ดังนั้น อักขระใดที่ไม่อยู่ใน TIS-620 ก็จำต้องกรองทิ้งหมด

เนื่องจากโค้ด swath ไม่ใช่โค้ดที่แกะง่ายนัก ผมจึงทำทีละเรื่อง โดยปรับโครงสร้างเรื่องการแปลงรหัสเพื่อแก้บั๊กแรกก่อน กลไกภายในยังคงเป็น TIS-620 เช่นเดิม

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

แก้โค้ดส่วนการรองรับ RTF ครั้งนี้ ผมยกเครื่องเขียนใหม่หมดเลย

เมื่อเสร็จแล้ว ก็กลับมาทำเรื่องที่สองต่อ โดยในครั้งนี้ได้ตัดสินใจว่าจะเปลี่ยนการทำงานภายใน จาก TIS-620 เป็น UCS-4 (รหัสยูนิโค้ด 32 บิต) โดยใช้ wide char (wchar_t) แทน char ธรรมดา (มีบันทึกการพูดคุยกับ อ.พฤษภ์ ไว้ที่ Google+)

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

และแน่นอนว่าต้องไล่ทำทีละฟอร์แมตเหมือนรอบก่อน และได้ปรับปรุงโค้ดส่วน RTF ให้รัดกุมกว่าเดิมด้วย

เดิมทีก็ไม่คิดว่าจะทัน Wheezy freeze อยู่แล้ว แต่ก็พยายามทำเท่าที่กรอบเวลามี เผื่อว่าจะทัน แต่สุดท้ายก็ไม่ทันอยู่ดี ความจริงก็แก้เสร็จ พร้อมแก้บั๊กร้ายแรงเสร็จในวันที่จะเริ่ม freeze นั่นแหละ แต่สำหรับการแก้ไขขนานใหญ่ขนาดนี้ ตัวโปรแกรมคงต้องผ่านการทดสอบปรับปรุงมากกว่านี้จึงจะออกรุ่นได้ ดังนั้น จึงยังไม่เร่งร้อนให้ทัน Debian รุ่นนี้ และยังคงทดสอบต่อไปด้วยจังหวะปกติ ไว้พร้อมเมื่อไรค่อยออก

ป้ายกำกับ:

0 ความเห็น:

แสดงความเห็น (มีการกลั่นกรองสำหรับ blog ที่เก่ากว่า 14 วัน)

<< กลับหน้าแรก

hacker emblem