Theppitak's blog

My personal blog.

26 กรกฎาคม 2549

Firefox Revisited

หลังจากทำ scim-thai ไป พร้อมกับอัปโหลดขึ้น sid ไปแล้ว ก็หันไปแก้ผังแป้นพิมพ์ไทยใน scim-tables และ scim-m17n ที่ผิดอยู่ คุยไปคุยมา กำลังจะได้ IM ภาษาไทยเจ๋งๆ ใน m17n (คุณ Takahashi ทำให้ ผ่านการอธิบายของผม) ก็ปรากฏว่า มีการตอบมาจาก Jungshik Shin ใน Mozilla Bug #7969 เกี่ยวกับ libthai patch ที่เสนอไป เลยต้องวางมือจาก m17n มาทำ firefox ซะก่อน

ทำไปทำมา ก็ปรับ patch โดยเพิ่มประสิทธิภาพในการตัดคำขึ้นอีก แล้วก็โพสต์เข้าไป

เกี่ยวกับเรื่องการตัดคำไทยใน firefox เรื่องมันช่างยาวจริงๆ ถ้านับอายุบั๊ก ตอนนี้ก็ครบ 7 ปีเต็มไปหมาดๆ เมื่อเดือนที่แล้ว มีแพตช์เสนอเข้าไปมากมายหลายรุ่น ผมเองก็ไม่คิดว่าจะได้เข้าไปเกี่ยวข้องหรอก ถ้าไม่ใช่เพราะ Ubuntu Localisation Sprint ที่ผมเอาแพตช์ของอ๊อท (ที่ปรับมาจากแพตช์ของพี่สัมพันธ์อีกที) ส่งเข้า Ubuntu แล้วมีการปรับแพตช์ ส่งเข้า bugzilla แล้วก็เลยติดตามต่อมาตลอด

หลังจากส่งเข้า Ubuntu ได้แล้ว มาร์ค ก็ สานต่อ โดยพยายามติดต่อ distro ต่างๆ ทั้ง Fedora, SuSE ส่วนผมก็ติดต่อ Debian โดยติดเงื่อนไขว่า Firefox 2.0 ได้ freeze ไปแล้ว ต้องไล่ตาม patch ที่ distro ต่างๆ ที่ 1.8 branch เอา แต่ปรากฏว่า Debian มีการตอบสนองด้วยการไม่รับแพตช์ที่ใช้วิธีโหลดไลบรารีขณะ run-time โดยเสนอว่าควรทำเป็น add-on แทน หรือถ้าจะลิงก์ก็ลิงก์ตรงๆ เลย แล้วก็ forward bug กลับมาที่ upstream ซึ่งผมก็ปรับแพตช์ที่ 1.8 branch สำหรับเดเบียนมาโพสต์ที่ Mozilla โดยใช้วิธีลิงก์ตรงๆ ด้วย configure option --enable-libthai เพราะการทำ add-on นั้น เป็นไปไม่ได้ เนื่องจากโค้ดปัจจุบันยังไม่มีการวิเคราะห์ข้อความ Unicode แยกเป็นภาษาต่างๆ เหมือน Pango ทำให้มี line breaker engine ได้ทีละตัวเท่านั้น

ระหว่างนั้น ผมได้รับคำแนะนำจากมาร์คและพี่สัมพันธ์ ว่าควรร้องขอให้นักพัฒนา review patch (เป็นธรรมเนียมที่ผมไม่เคยเจอใน GNOME) ก็เลยได้ขอให้ Jungshik Shin ช่วย review ให้ และคำตอบที่เขาตอบมาก็คือ ให้ไปทำที่ trunk!

เออแฮะ.. ด้วยความที่ช่วงที่ผ่านมา โฟกัสไม่ได้อยู่ที่ firefox เท่าไร (ติดงานอื่นซะเยอะ) กลับมาดูทีไร ก็ง่วนติดตามแต่ agenda เดิม ที่พยายาม patch 1.8 branch จนไม่รู้ตัวว่า เราได้ย้ายที่สนทนามาที่ upstream แล้ว และธรรมเนียมปฏิบัติที่ควร ก็คือการทำงานที่ trunk!

ก่อนหน้านี้ เคยทำงานที่ trunk มาแล้วครั้งหนึ่ง แต่พอโพสต์ patch แล้ว ไม่มีคนไทยช่วยทดสอบได้ ต่างคนต่าง request ให้ไปที่ 1.8 branch โดนติงมาคราวนี้ เหมือนโดนเคาะหัวให้ตื่นจากภวังค์ กลับมาทำงานที่ trunk อีกครั้ง

แต่ก็ยังมีหลายวิธีให้ตัดสินใจอยู่ดี ว่าการตัดคำไทยจะใช้วิธีไหน

วิธีแรก ใช้ PR_LoadLibrary โหลด libthai ขณะ run-time แล้วเรียกฟังก์ชันแบบ dynamic เอา ตามแพตช์ของอ๊อท มีข้อดีคือ ไม่ต้อง build firefox ใหม่ถ้าจะตัดคำไทย แค่ติดตั้ง libthai ลงในระบบก็เป็นอันใช้ได้ แต่ข้อเสียคือ การโหลดไลบรารีต้องกำหนด full path ของไลบรารี ซึ่งแพลตฟอร์มต่างๆ เรียกชื่อไฟล์ของ dynamic library ไม่เหมือนกัน .so ของยูนิกซ์, .dll ของวินโดวส์ รวมทั้งไลบรารีที่ติดตั้งก็อยู่ได้หลายแห่ง ของวินโดวส์นั้น เข้าใจว่าไม่มีที่อยู่ตายตัวสำหรับติดตั้งไลบรารี อีกทั้งชื่อไลบรารี ก็มีการระบุเลขเวอร์ชัน เช่น .so.0 ถ้าเราออก .so.1 เราจะต้องมาตาม patch firefox อยู่ดี

วิธีที่สอง ใช้ configure option --enable-libthai เอา ใครมี libthai ให้ลิงก์ ก็เปิด option นี้ แล้วก็ให้ linker/loader ของระบบทำงานให้ ก็เป็นอันว่า ไม่ต้องพยายามจัดการเรื่องแพลตฟอร์มต่างๆ ในซอร์สอีก แต่ข้อเสียก็คือ distro ต่างๆ จะยอมเปิด option นี้ไหม ในเมื่อกว่า 99% ของผู้ใช้ในโลกนี้ ไม่จำเป็นต้องใช้ feature นี้เลย? รวมทั้งบนวินโดวส์ เราก็ต้องพยายามให้ libthai พร้อมใช้บนนั้นด้วย (เช่น ทำ installer)

วิธีที่สาม ซึ่งยากที่สุด แต่ดีที่สุด คือเพิ่มกลไกวิเคราะห์แยกภาษาข้อความแบบ Pango ใน Mozilla แล้วเรียก line break engine แยกภาษาให้ได้ จากนั้น จึงสร้าง component สำหรับภาษาไทยเสียบเข้าไป วิธีนี้ อาจจะยืมมือ Pango ตามที่เสนอใน Mozilla Bug #336959 แต่ปัญหาคือ performance แย่มากๆ และอีกอย่าง หลาย distro เริ่มปิดตัวเลือก --enable-pango กันแล้ว -_-' จึงมีวิธีย่อยอีกวิธีหนึ่ง คือทำ framework ขึ้นเองใน Mozilla เสียเลย ซึ่งที่แน่ๆ คือ คงไม่เห็นผลให้คนไทยได้ใช้ในระยะอันใกล้

ปวดหัวใช่ย่อย.. สองวิธีแรกนั้น เลือกแบบไหนก็ทำแพตช์ได้ไม่ยาก แต่วิธีที่สามนี่ เดินทางไกล.. :-/

4 ความเห็น:

  • 27 กรกฎาคม 2549 เวลา 01:04 , Blogger Neutron แถลง…

    สู้​ ​ๆ​ ​ครับ​

    .... ​พลังอันยิ่ง​ใหญ่​
    ​มาพร้อม​ความ​รับผิดชอบอัน​ใหญ่​ยิ่ง​ .....

     
  • 27 กรกฎาคม 2549 เวลา 20:27 , Blogger DrRider แถลง…

    คือ... ผมกำลังสงสัยว่า สรุปคือตอนนี้เรามี engine สำหรับตัดคำไทยทั้งหมดกี่ตัวครับ (ไม่รวม extension)

    - cttex
    - libthai
    - icu
    (+/- pango)

    ตัวไหนที่ควรจะเป็นมาตรฐานมากที่สุดครับ เพราะเท่าที่ใช้มา คือ ถ้าตัดคำด้วย libthai มันจะทำให้มีตัวอักษรแปลกๆ ปรากฏขึ้นมาในหน้าเว็บด้วย ซึ่งไม่ทราบว่ามันเป็น bug ของ patch หรือ libthai เพราะถ้าเปลี่ยนไปใช้ icu หรือ cttex (บน windows) มันจะไม่มีเรื่องนี้เกิดขึ้นครับ แต่จะไม่มีการตรวจสอบ input method หรือลำดับการพิมพ์

    ทีนี้ขอเสนอมั่ง ถ้ากรณีที่ว่า patches ได้รับการ submit เข้าไปที่ต้นน้ำแล้ว ผมว่า ไม่น่าจะยากถ้าหากว่าเราจะเอา source มา build ต่อเองเพื่อทำการเปิด --enable-libthai/--enable-icu หรืออะไรก็แล้วแต่ แล้วก็แจกจ่าย คืออย่างน้อยมันก็ทำได้ทันทีที่มีการออกรุ่นใหม่ออกมา ไม่เหมือนตอนนี้ที่พอรุ่นใหม่ออกมาก็ต้องมาทำการ patch & build ซึ่งไม่มีอะไรรับประ กันได้ว่า patch ที่เคยใช้ได้กับรุ่นเก่าจะใช้ได้กับรุ่นที่เพิ่งออก (โดนกับ 2.0 beta1 มาแล้ว T-T) มันก็จะรอกันค่อนข้างนาน

    แต่ถ้ามีระบบการตัดคำที่แยกภาษาได้อยู่ในตัวเหมือน pango ได้ก็น่าจะดีครับ (จะมีคนทำหรือเปล่าเนี่ย ดูมันหินเอามากๆ )

     
  • 27 กรกฎาคม 2549 เวลา 20:30 , Blogger NOI แถลง…

    เข้ามาให้กำลังใจ .. (อย่างเดียวก่อน)

     
  • 29 กรกฎาคม 2549 เวลา 14:34 , Blogger Thep แถลง…

    DrRider,

    เรื่องตัวตัดคำคงยังไม่มีอะไรเป็นมาตรฐานครับ ความจริงแล้ว ตัวตัดคำใน libthai ก็มาจาก cttex น่ะแหละ ส่วน icu ก็เป็นอีกทางเลือกหนึ่ง ทั้งหมดสามารถเลือกใช้ได้ ตามแต่เงื่อนไขของการใช้งาน เรื่องของปัญหาที่พบ.. ไว้ตามแก้ทีหลังครับ ตอนนี้ ขอให้แพตช์เข้าไปได้ก่อน ถ้าเป็น bug ใน libthai ก็สามารถออกรุ่นแก้มาได้ไม่ยาก

    เรื่องของ --enable-* ที่ต้นน้ำแล้วมา build เอง.. ก็เป็นทางเลือกที่เป็นไปได้ครับ แต่ก็ไม่สู้วิธีที่ไม่ต้อง build เองเลย ซึ่งตอนนี้ก็ดูเหมือนจะได้ทางออกที่ว่าแล้วครับ เดี๋ยวจะ blog เล่าอีกที

     

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

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

hacker emblem