Theppitak's blog

My personal blog.

27 สิงหาคม 2555

Pango-HarfBuzz Merge and Effects on Thai Script

ความเปลี่ยนแปลงที่สำคัญรายการหนึ่งใน GNOME 3.6 คือ Pango จะเปลี่ยนมาใช้ HarfBuzz ในการวาดข้อความภาษาต่าง ๆ แล้ว โดยได้โละ shaping engine เดิมใน Pango ทิ้งหมด ไปเรียก HarfBuzz แทน ส่วน language engine (ตัวตัดคำ) ยังคงอยู่

ก็เลยต้องมาประเมินใหม่ ว่าหลังจาก merge HarfBuzz มาแล้ว มีความเปลี่ยนแปลงอย่างไรบ้างสำหรับภาษาไทย

จากการไล่โค้ดคร่าว ๆ ถือว่า Behdad ทำการบ้านมาดีมากสำหรับภาษาไทย (ภาษาอื่นก็คงเช่นกัน) โดยได้ถอดแบบการทำงานของ Uniscribe ของวินโดวส์มาให้มากที่สุด เพื่อความเข้ากันได้ รวมถึงการเก็บข้อมูลจากรายงานบั๊กใน Mozilla เกี่ยวกับปัญหาการ hack ของฟอนต์ราชการ 13 ฟอนต์ของ SIPA ที่ไปใช้แท็ก 'latn' ในการ implement ภาษาไทย แทนที่จะเป็น 'thai' ซึ่งผิดสเปค แต่ในโลกซอฟต์แวร์ กฎหมู่มักอยู่เหนือกฎหมายเสมอ ๆ ผิดก็เป็นถูกได้ถ้าเสียงดังพอ

ฟอนต์ที่รองรับ

เมื่อทดลอง Pango ตัวใหม่กับฟอนต์ทั่วไปที่มีการออกแบบ GPOS/GSUB เอาไว้ ก็สามารถแสดงผลได้ดีไม่มีปัญหา

ฟอนต์ Loma ซึ่งใช้ GPOS, GSUB:

Loma on new Pango

ฟอนต์ Arundina Sans ซึ่งใช้ GSUB อย่างเดียว (แต่แท็กภาษามีการแก้ไขให้เป็น 'thai' แล้ว):

Arundina Sans on new Pango

แต่สำหรับฟอนต์ที่ไม่มี OpenType feature เลยล่ะก็.. เละตุ้มเป๊ะ:

Non-OpenType on new Pango

และใน HarfBuzz ยังไม่รองรับการใช้ PUA glyph (ตัวหลบหางทั้งหลาย) ในการจัดแสดงภาษาไทย ซึ่งก็หมายความว่า legacy font ทั้งหลายจะเละบน Pango ตัวใหม่นี้ทั้งหมด ซึ่งหมายถึงฟอนต์ที่ออกแบบมาสำหรับ Windows XP ลงไป ส่วนฟอนต์ใน Windows 7 ได้ข่าวว่ามี OpenType feature สำหรับภาษาไทยเรียบร้อยแล้ว ไม่น่ามีปัญหา

พูดสั้น ๆ ก็คือ Pango/HarfBuzz ได้ deprecate การใช้ตัวหลบไปแล้ว รองรับฟอนต์ OpenType เท่านั้น

บั๊กที่คั่งค้าง

เมื่อ Pango โละ engine เก่าทิ้งหมด ก็เกิดการเปลี่ยนแปลงกับบั๊กต่าง ๆ เป็นธรรมดา มีบางบั๊กที่ปิดไปโดยปริยาย มีบางบั๊กที่ยังเป็นบั๊กอยู่ โดยสรุปก็คือ:

บั๊กที่ปิดไป:

  • GNOME #616495 เกี่ยวกับการแสดงไม้กงของภาษาลาว ซึ่งมอดูลไทยพลาดกรณีนี้ไป ผมได้เสนอแพตช์ไว้ แต่เขายังไม่รับ ตอนนี้ย้ายไป HarfBuzz แล้ว ปัญหาหายไปแล้ว บั๊กจึงปิดโดยปริยาย
  • GNOME #378001 บั๊กที่ Martin Hosken รายงานไว้เมื่อ 6 ปีที่แล้ว เกี่ยวกับการรองรับภาษาชาติพันธุ์ด้วยอักษรไทย ผมรอสเปค วทท. 3.0 อยู่ เลยยังไม่ได้ทำเสียที ตอนนี้ย้ายไป HarfBuzz แล้ว ไม่มีการตรวจลำดับด้วย วทท. 2.0 อีกต่อไป ถ้าฟอนต์รองรับก็จะสามารถแสดงภาษาชาติพันธุ์ต่าง ๆ ได้แล้ว
  • GNOME #393307, #677090 เกี่ยวกับการวาดเครื่องหมายกำกับประเภท zero width ต่าง ๆ ในยูนิโค้ด เช่น ZWJ (U+200D) ซึ่งมอดูลไทยไม่ได้กรองออก บั๊กนี้มีนักพัฒนาอื่นรายงานมา Behdad ตอบมาแล้ว แต่ยังไม่มีใครทำอะไรต่อ แต่ปัญหาหมดไปเมื่อย้ายไป HarfBuzz

บั๊กที่ยังเป็นคำถาม:

  • GNOME #583718 เกี่ยวกับการวาดสระอำใน VTE และ gnome-terminal ที่จะมี dotted circle แทรกเข้ามา ซึ่งที่ผ่านมาได้ยื้อไปยื้อมากับ Behdad อยู่ว่าควรจะจัดการภาษาไทยแยกต่างหากจากภาษาตระกูลอินเดียหรือไม่ ผมเห็นว่าควรแยก โดยได้เสนอแพตช์ให้วาดฟอนต์ monospace ในแบบพิมพ์ดีด ที่วาดนิคหิตของสระอำไว้ในช่องเดียวกับลากข้าง แต่ Behdad ยืนยันที่จะให้จัดการภาษาไทยในฐานะภาษาตระกูลอินเดีย ซึ่งเรื่องจะยาวมาก ต้องออกแบบโครงสร้างโค้ดใหม่เลยทีเดียว แต่ถ้าดูผลลัพธ์ของ Pango/HarfBuzz แล้ว จะเป็นดังนี้:
    Thai on VTE with new Pango
    คือได้ย้ายนิคหิตมาอยู่ในเซลล์เดียวกับลากข้างแล้ว แต่เลื่อนตำแหน่งไปอยู่ข้างหลัง ถามว่าถูกต้องไหม มันก็ยังไม่ถูก แต่อย่างน้อยปัญหาเรื่อง dotted circle ก็หายไปแล้ว ถือว่าพอทนได้หรือเปล่า? จนกว่าเขาจะออกแบบเทอร์มินัลใหม่ให้รองรับภาษาตระกูลอินเดียทั้งหมด :P

บั๊กที่ยังอยู่:

  • GNOME #576156 เกี่ยวกับการเลื่อนเคอร์เซอร์ในข้อความภาษาไทย ที่จะกระโดดข้ามสระหน้า-สระหลัง แทนที่จะเลื่อนทีละเซลล์ตามปกติ ตรงนี้เป็นการตีขลุมของคณะทำงานยูนิโค้ดว่าภาษาไทย-ลาวจะนับคลัสเตอร์เหมือนภาษาตระกูลอินเดีย เราได้ผลักดันแก้ UAX #29 จนสำเร็จใน Unicode 6.1.0 แต่ Behdad ก็ยังไม่รับแพตช์ ที่ผ่านมาอาจจะยังยุ่งกับ HarfBuzz อยู่ ตอนนี้ก็อาจได้เวลาผลักดันใหม่อีกครั้งหนึ่ง

ป้ายกำกับ:

07 สิงหาคม 2555

Libdatrie Python Binding and Improvements

ในบรรดาโครงการต้นน้ำที่ผมทำ libdatrie น่าจะนับได้ว่าเป็นโครงการที่ได้รับความช่วยเหลือจากผู้ใช้มากที่สุดแล้ว ซึ่งเกือบทั้งหมดเป็นชาวต่างประเทศ (ดูหลักฐานได้ใน blog ก่อน ๆ) เช่นในครั้งนี้มาจากคุณ Mikhail Korobov จากรัสเซีย

Mikhail ได้ทำ Python binding สำหรับ libdatrie (และได้เล่าถึง Ruby binding ของ Tyler McMullen นักพัฒนาอีกคนหนึ่งด้วย) ทำให้พบประเด็นต่าง ๆ ที่ต้องการปรับปรุงที่ต้นน้ำ จึงได้ติดต่อมาที่ผม จากการพูดคุยแลกแพตช์กันทางอีเมล ก็ทำให้ libdatrie ใน SVN ได้รับการปรับปรุงหลายรายการ ที่ผ่านมาก็มีดังนี้:

  • แก้ปัญหาการคอมไพล์ด้วย MSVC ไม่ผ่าน
  • แก้ที่ผิดในเอกสารประกอบฟังก์ชัน
  • แก้บั๊กของบางฟังก์ชันที่พบระหว่างพูดคุยถึงอาการต่าง ๆ ที่เขาพบ
  • เพิ่ม API ใหม่สำหรับลิสต์รายการคำใน trie เพื่อใช้ใน Python binding เนื่องจาก API เดิมที่ใช้ callback function ไม่ยืดหยุ่นพอ จึงได้เพิ่มคลาส TrieIterator เพื่อให้โค้ดผู้เรียกสามารถควบคุม control flow เองได้มากขึ้น
  • optimize การลิสต์รายการคำ โดย Mikhail ได้เสนอให้คำนวณคีย์แบบ incremental และลดปริมาณการ malloc ซึ่งปรากฏว่าวิธีใหม่นี้ทำงานได้เร็วขึ้นกว่าเดิมประมาณ 10% และเมื่อปรับฟังก์ชันแบบที่เรียก callback แบบเดิมมาใช้ TrieIterator แทนการเรียกตัวเอง ยังทำให้ลดการใช้สแต็กลงไปได้อีกมาก
  • ปรับปรุงการคำนวณช่วงอักขระในคลาส AlphaMap ที่ใช้แปลงไปมาระหว่างอักขระภายนอกกับรหัส 8 บิตที่ใช้เดินไปใน trie ทำให้ได้ map ที่กระชับและประหยัดเวลาในการ map มากขึ้นในกรณีที่ผู้เรียกเพิ่มช่วงอักขระเล็ก ๆ หลายช่วง หรือแม้แต่เพิ่มอักขระทีละตัว

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

distro ทั่วไปที่มอง libdatrie ผ่าน application อย่าง libthai หรือ swath อาจจะเห็นเป็นแค่ไลบรารีเล็ก ๆ ที่ไม่มีความสำคัญ แต่สำหรับคนทำงานเรื่อง information retrieval หรือ NLP แล้ว libdatrie ได้พิสูจน์ตัวเองในระดับหนึ่งว่ามีประโยชน์พอสมควร จนกลายเป็นโครงการที่ให้ประสบการณ์แบบโอเพนซอร์สกับผมมากที่สุดในบรรดาโครงการทั้งหลายที่ทำมา

นอกจากแหล่งอย่าง Debian หรือ Ubuntu แล้ว คงต้องยกเครดิตให้กับ Wikipedia ที่ทำให้โครงการนี้เป็นที่รู้จัก

สำหรับฟีเจอร์ต่าง ๆ ที่ว่าไป รอพบได้ใน libdatrie รุ่นหน้าครับ ซึ่งยังไม่มีกำหนดออกรุ่นแน่นอน และหลังจากออกแล้ว ก็คงยังไม่ได้เข้า Debian Wheezy เนื่องจาก freeze ไปแล้ว ถ้าจะเข้า Debian ก็คงไปพักไว้ที่ experimental ก่อน

ป้ายกำกับ:

02 สิงหาคม 2555

Thanks

ขอขอบคุณ คุณ kenggg ที่ได้หย่อนสตางค์ลงหมวกเพื่อสนับสนุนงานพัฒนาของผมในเดือนกรกฎาคมที่ผ่านมาอีกครั้งหนึ่ง

งานพัฒนาซอฟต์แวร์เสรีของผมยังคงอยู่ในรูปแบบอาสาสมัครโดยไม่มีผู้ใดว่าจ้างให้ทำ ดังนั้น การสนับสนุนของท่านจึงช่วยให้ผมยังสามารถทำงานต่อไปได้ ขอขอบคุณทุกท่านจากใจครับ

May the Source be with you!

ป้ายกำกับ:

hacker emblem