Recent changes Random page
GAMING
more wikis
 
Gaming
Entertainment
Hobbies
Sports
Biggest wikis
see all...
See more...

Firefox Thai

From Scratchpad

Jump to: navigation, search

Firefox ตัดคำ(ตัดบรรทัด; line breaking)โดยเรียก API ของแต่ platform ครับ. สำหรับ GNU/Linux ป๋าเทพจัดการต่อกับ Pango ไปเรียบร้อยแล้ว แต่ว่าก็บาดเจ็บไปแล้ว. ทีนี้ของ Mac OS X กับ Windows ก็ต้องต่อกับ ATSUI และ Uniscribe ตามลำดับ แทนที่จะเป็น Pango. เราก็อยากเขียน code ที่จะมาต่อ ATSUI กับ Uniscribe.

  • GNU/Linux - Pango
  • Mac OS X - ATSUI
  • Windows - Uniscribe

Contents

[edit] Related bugs

[edit] ผู้ใหญ่ท่านว่า

[edit] บน Mac OS X

[edit] Patch

  • แก้ให้ patch ผ่านสำหรับ source code ที่ check out ออกมาใหม่ๆ (source code ของวันนี้ 20070816 มี Uniscribe เข้าไปแล้ว คาดว่าคงได้รับเข้าต้นน้ำแล้วมั้ง เลยทำให้ patch ของวีร์ patch ไม่ผ่่าน - cwt)mozmacth20070816.diff
  • แก้ชื่อ contributor ตาม comment http://www.geocities.com/veetai/mozmacth20070725.txt
  • อีก patch หลังจากป๋าเทพ comment http://www.geocities.com/veetai/mozmacth20070724.txt (จับทางได้แล้วว่า backup แค่ไฟล์ Makefile.in ก็ทำ patch ได้)
  • patch แบบดีๆ http://www.keng.ws/files/ThaiMozMac_alpha_1.patch
  • พอดีเข้า cvs ไม่ได้เลย ไม่มี original code มา diff เอาแบบเถื่อนๆ ไปก่อนแล้วกันนะครับ. รอคนใจดี diff ให้. intl/lwbrk/src/Makefile.in และ intl/lwbrk/src/nsCarbonBreaker.cpp เอาใส่รวมกันมาใน download

math

[edit] Nightly Build (Build แล้วหลับ)

  • 20070724 (PPC ลืมทำ Universal Binary)
  • 20070725 Patch ก่อนวีร์ปรับปรุง (ใจร้ายไม่บอกก่อน มัน build โคตรนาน (ล้อเล้น)) Universal Binary
  • 20070731 Patch ล่าสุดที่ส่งให้ roc review กับ superreview - Universal Binary
  • 20070805 Firefox 3 Pre Alpha 8 - Universal Binary
  • 20070811 Firefox 3 Pre Alpha 8 - Universal Binary
  • 20070816 ใช้ patch ที่แก้ให้ผ่านสำหรับ source code วันที่ 20070816 ข้างบนนั่นแหละ แต่ Binary นีึ้ใช้ได้เฉพาะ Intel ที่มี EM64T เท่านั้น (พวก Core2, ไม่แน่ใจว่าต่ำกว่านี้ได้หรือเปล่า - cwt)
ล่าสุด patch ของ mac ก็ checked-in ไปแล้วนะ

[edit] บักทึกประสบการณ์ build บน Mac OS X

ลอง build บน iBook G4 ใช้ Mac OS X 10.4 พร้อม Macports

  • ลง Xcode เอาได้จาก http://developer.apple.com/tools/xcode/ และต้องใช้ Apple ID (ที่ขอได้ไม่ยาก). ไฟล์เกือบ 1 GB โหลดนานเหมือนกัน. โหลดมาแล้วผมก็ลงเลย. เขาว่าให้ลง cross compile ด้วย.
  • สั่ง sudo port -v sync เพื่อ sync port ให้สดใหม่ ขั้นตอนนี้ใช้ rsync ซึ่งอาจจะมีปัญหาได้ ถ้าเน็ตถูก block port.
  • sudo port install -v libidl
  • sudo port install -v autoconf213
  • sudo gcc_select 4.0
  • สร้าง $HOME/.mozconfig ตามที่ลอกเขามา
. $topsrcdir/browser/config/mozconfig
ac_add_options --with-macos-sdk=/Developer/SDKs/MacOSX10.4u.sdk
ac_add_options --disable-tests
  • $HOME/.mozconfig อีกแบบ กรณีต้องการ build เป็น Universal Binary
. $topsrcdir/browser/config/mozconfig
. $topsrcdir/build/macosx/universal/mozconfig
ac_add_options --with-macos-sdk=/Developer/SDKs/MacOSX10.4u.sdk
ac_add_options --enable-optimize=-O2
ac_add_options --disable-shared
ac_add_options --disable-tests
ac_add_app_options ppc --enable-prebinding
mk_add_options MOZ_OBJDIR=@TOPSRCDIR@/../build
  • เอา source code มาจาก cvs
mkdir -p ~/Projects/moz
cd ~/Projects/moz
cvs -d :pserver:anonymous@cvs-mirror.mozilla.org:/cvsroot co mozilla/client.mk
cvs -d :pserver:anonymous@cvs-mirror.mozilla.org:/cvsroot co mozilla/browser/config/mozconfig
cd mozilla
make -f client.mk checkout
  • check out เสร็จก็ขอ backup หน่อย ตามฟอร์ม
cd ~/Projects/moz
cp -rp mozilla mozilla.orig
  • สั่ง build เลย
cd ~/Projects/moz/mozilla/
make -f client.mk build
  • เปลี่ยน folder เพื่อจะ run
cd ~/Projects/moz/mozilla/dist/
  • สั่ง run
Minefield.app/Contents/MacOS/firefox
  • ทำ dmg
make -C browser/installer/

dmg จะอยู่ที่ ~/Projects/moz/mozilla/dist/

  • ทำ dmg กรณี Universal Binary
make -C ../build/ppc/browser/installer

dmg จะอยู่ที่ ~/Projects/moz/build/ppc/dist กรณี Universal Binary

[edit] ปัญหาที่อาจเกิดตอน build บน Mac OS X

[edit] ปัญหา (1)
gohan:/Volumes/barracks/works/Moz/mozilla keng$ make -f client.mk checkout
: No such file or directoryonfig2client-mk: line 3:
/Volumes/barracks/works/Moz/mozilla/browser/config/mozconfig
client.mk:520: /Volumes/barracks/works/Moz/mozilla/.mozconfig.mk: No such file or directory
make: *** No rule to make target `/Volumes/barracks/works/Moz/mozilla/.mozconfig.mk'.  Stop.
[edit] การแก้ไข (1)

ใช้ dos2unix เปลี่ยน line feed ของ .mozconfig (มีอยู่ใน darwinport)

dos2unix .mozconfig

[edit] API น่าสนใจ

อีกตัวอย่างที่ใช้ UCFindTextBreak

 #include "nsComplexBreaker.h"
 #include <Carbon/Carbon.h>

 void
 NS_GetComplexLineBreaks(const PRUnichar* aText, PRUint32 aLength,
                         PRPackedBool* aBreakBefore)
 {
   OSStatus status = noErr;
   NS_ASSERTION(aText, "aText shouldn't be null");
   TextBreakLocatorRef breakLocator;
   UniCharArrayOffset position;

   for(UniCharArrayOffset i = 0; i < aLength; ++i)
   {
     aBreakBefore[i] = PR_FALSE;
   }

   status = UCCreateTextBreakLocator(NULL, 0, kUCTextBreakLineMask, &breakLocator);

   if(status == noErr) 
   {
     UniCharArrayOffset offset;
     for(position = 0; position < aLength;)
     {
       status = UCFindTextBreak(breakLocator, 
                     kUCTextBreakLineMask, 
                     position == 0 ? kUCTextBreakLeadingEdgeMask : 
                                     (kUCTextBreakLeadingEdgeMask | 
                                      kUCTextBreakIterateMask),
                     (const UniChar *)aText, 
                     aLength, 
                     position, 
                     &offset);
       if(status != noErr)
       {
         break;
       }
       aBreakBefore[offset] = PR_TRUE;
       position = offset;
     }                  
     UCDisposeTextBreakLocator(&breakLocator);
   }
 }


ที่มา

มีแต่การเซ็ตค่า PR_TRUE ไม่มีการเซ็ตช่องที่เป็น PR_FALSE ถ้า array ไม่มีการ initialize ค่ามาก่อน คงมั่วน่าดู -Thep.
init ให้เป็น PR_FALSE ก่อนเข้าเลยดีเปล่าครับ? Vee 06:02, 24 July 2007 (UTC)
ได้เหมือนกันครับ -Thep.
position = offset + 1 ทำไมต้อง "+ 1"? ไม่ใช่ว่า offset ที่ return จาก UCFindTextBreak จะไม่เท่ากับค่า position ที่ pass ให้อยู่แล้วหรือ? -Thep.
มีตรงเหมือนกันครับ ตัวอย่าง ใส่ position = 3 ได้ offset กลับมาเป็น 3. Vee 06:02, 24 July 2007 (UTC)
อืม ผมอ่าน manual เขาบอกว่าค่าที่ return จะไม่เท่า ถ้าใช้ option kUCTextBreakLeadingEdgeMask หรือ kUCTextBreakGoBackwardsMask อย่างใดอย่างหนึ่ง (แต่เราคงไม่ใช้อย่างหลัง) ความจริงถ้าใช้ kUCTextBreakLeadingEdgeMask เสมอ (คือ position เป็น known break position) ก็คงไม่เท่า? -Thep.
อ่าน manual เพิ่มเติมอีก ตรง break type น่าจะใช้ kUCTextBreakLineMask แทน kUCTextBreakWordMask และตรง break option อาจจะต้องกำหนด kUCTextBreakLeadingEdgeMask เสมอในกรณี forward search และอาจจะ or ด้วย kUCTextBreakIterateMask ในการ call ครั้งที่สอง (คือส่งค่า position == 0 ? kUCTextBreakLeadingEdgeMask : kUCTextBreakLeadingEdgeMask | kUCTextBreakIterateMask) เพื่อ optimize การตัดคำอีกนิด ยังไงลองดูก่อนละกันครับ ดีไม่ดี อาจใช้ kUCTextBreakLeadingEdgeMask | kUCTextBreakIterateMask เสมอเลยก็ได้ ในเมื่อเรารู้ว่าเราเริ่มจากต้นคำอยู่แล้ว -Thep.
ยังไม่ได้จัดการกรณีที่ status != noErr (อาจจะ fall back ด้วยการเติมค่า PR_FALSE ให้หมดเลยก็ได้) -Thep.
ถ้า init เป็น false หมดแต่แรกก็ไม่ต้อง fall back? ผมเห็นใน Webkit พอมี error จะ fall back มาที่ rule. Vee 06:02, 24 July 2007 (UTC)
ครับ ไม่ต้อง -Thep.
ถ้าพอตัดคำได้แล้ว file bug เลยดีไหม? -Thep.
ตอนนี้ก็ตัดได้แล้วนะครับ(เล่นอยู่เลย). แต่ว่าอยากให้ internal review ก่อน. เดี๋ยวแก้อีกรอบและทุกคนเห็นว่าใช้ได้ ก็น่าจะ file bug เลยครับ. ป๋าเป็น sponsor file ให้เปล่าครับ? Vee 06:02, 24 July 2007 (UTC)
ผมคงทำอะไรกับ patch และ bug นี้ไม่ได้มาก เพราะไม่มี Mac ให้ลองครับ แฮะ ๆ -Thep.
แฮ่ม.. ก่อนอื่น แก้ข้อมูลตรง license block ก่อนดีไหม?
+ * The Initial Developer of the Original Code is
+ * Theppitak Karoonboonyanan <thep@linux.thai.net>.
+ * Portions created by the Initial Developer are Copyright (C) 2007
+ * the Initial Developer. All Rights Reserved.
+ *
+ * Contributor(s):
+ * - Theppitak Karoonboonyanan <thep@linux.thai.net>
ช่วยแก้เป็นชื่อ Vee ด้วยครับ -Thep.
แก้แล้วครับ http://www.geocities.com/veetai/mozmacth20070725.txt Vee 08:22, 25 July 2007 (UTC)
อย่าลืมแก้ Initial Developer ด้วยนะครับ แล้วก็ file Bug 389520 เรียบร้อยแล้วครับ ย้ายไปคุยที่นั่นดีกว่า
  • ATSUBatchBreakLines ดูตรงๆดีแต่ว่าต้องมาสร้าง TextLayout อะไรก่อน ไม่รู้เหมาะหรือเปล่า.
    • ATSUGetSoftLineBreaks น่าจะเป็นฟังก์ชันนี้มากกว่า ถ้าจะใช้ ATSUI (หาตำแหน่งตัดคำทั้งหมด) ส่วน ATSUBatchBreakLines เหมือนจะใช้แบ่งบรรทัดใน frame ที่กำหนดมากกว่า

[edit] ข้อสังเกต

[edit] บน Windows

  • Uniscribe
  • สิ่งที่ต้องการก่อน build Firefox บน Windows
    • คอมไพเลอร์ official สำหรับ Firefox 3 คือ VC8 (Visual Studio 2005)
      • สามารถใช้ VC7.1 (Visual Studio 2003) และ VC9 (Orcas) ได้
      • แต่ใช้ VC6 ไม่ได้
    • ใช้ Visual C++ 2005 Express Edition ได้ (ฟรี)
      • แต่ต้องลง GUI development environment ด้วย
      • พร้อมกับ Windows Platform SDK (Windows Server 2003 SP1 Platform SDK)
    • ก่อน build ต้องติดตั้งแพคเกจ "MozillaBuild" ซึ่งรวมซอฟต์แวร์ที่จำเป็นสำหรับการ build เอาไว้ (MSYS, Python, NSIS และ UPX) -- ดาวโหลดทั้งแพคเกจได้จาก MozillaBuild

[edit] Nightly Build (Build แล้วหลับ)

[edit] ประสบการณ์ build บน Windows XP

ทดลองโหลด VC8 (express edition) มาลอง build ดู

  • ลง VC8, VC service pack, PlatformSDK
  • ลง MozillaBuild ไว้ที่ c:\mozilla-build แล้วเข้า build shell โดย
C:\>cd mozilla-build
C:\mozilla-build>start-msvc8.bat
  • สร้าง ~/.mozconfig คล้ายๆ ของ OS X
. $topsrcdir/browser/config/mozconfig
ac_add_options --disable-tests
  • เอา source code มาจาก cvs แล้วสั่ง build (path ที่จะใช้ build ต้องไม่มี space)
mkdir -p /c/dev/moz
cd /c/dev/moz
cvs -d :pserver:anonymous@cvs-mirror.mozilla.org:/cvsroot co mozilla/client.mk
cvs -d :pserver:anonymous@cvs-mirror.mozilla.org:/cvsroot co mozilla/browser/config/mozconfig
cd mozilla
make -f client.mk checkout
make -f client.mk build

[edit] API ที่น่าสนใจ

  • ScriptItemize แยกข้อความออกเป็นช่วง ๆ แยกตามภาษา
ใน ScriptItemize ต้องกำหนด cMaxItems ใน Abiword ใช้วิธีกำหนดให้เท่ากับ 20 ในตอนแรก. ถ้าหากว่า ScriptItemize คืนค่า E_OUTOFMEMORY ออกมาแสดงว่าให้ค่า cMaxItems ไว้น้อยไปก็ค่อน วน loop เพิ่มเอา.
นี่แปลว่า จะต้องเริ่มทำ ScriptItemize ใหม่ทุกครั้งที่วน ? (สมมติยาว 100 ทำ 1-40 ไป เกิดค่า cMaxItems ไม่พอ ก็ต้องทำตั้งแต่ 1 ใหม่ ??)
ถูกครับ. Vee 06:11, 24 July 2007 (UTC)

[edit] patch for win32

Bug #390048 ใส่ e-mail address ให้มัน alert เวลามีอะไรเปลี่ยนแปลงได้ด้วยนะครับ. ถ้ามี patch หรือ comment ใหม่ก็ add ได้เลย. Vee 17:11, 29 July 2007 (UTC)
แก้ตามที่ทาง Mozilla review แล้วครับ ฝากคุณ Vee ส่ง patch ให้ใหม่ด้วยครับ code อยู่ที่เดิม nsUniscribeBreaker.cpp - Nattachai
มี Makefile.in ด้วยเปล่าครับ? Vee 06:45, 30 July 2007 (UTC)
Makefile.in ใช้อันเดิมได้ไหมครับ ? Makefile.in.patch ต้องแก้อะไรหรือเปล่า ? - Nattachai
เหมือน roc อยากให้เอา code ที่เอาไว้ build Carbon(Mac) ออกก่อนอะครับ. ประมาณว่าเป็น 2 patch ที่อิสระจากกัน. Vee 09:22, 30 July 2007 (UTC)
แก้ใหม่แล้วครับ อยู่ที่เดิม Makefile.in.patch - Nattachai
Vee ครับ ลองเข้าไป check ที่ bugzilla หน่อยครับ เหมือนล่าสุดเค้า assigned ให้ vee review หรือเปล่า? เพราะผม submit patch ที่แก้แล้วเข้าไปใหม่ - Nattachai
มีเครื่องหมาย + คือ roc review ให้ผ่านแล้วมั้ง? แต่ว่า step ต่อไปทำไรกันต่อดี? Vee 16:09, 1 August 2007 (UTC)
ไม่ต้อง assign กลับไปที่ roc แล้วเหรอครับ ? แล้วเราจะทำไรกันต่อดีน้อ ช่วงนี้ำกำลังฟิตด้วย :D - Nattachai
นั่นซิครับ เรื่อง assign นี่ก็งงๆ -_-! ของ mac นี่ roc ก็ review ผ่านแล้ว แล้วก็นิ่งๆไป. Vee 16:36, 1 August 2007 (UTC)
ปกติแล้วมันควรจะเข้าไป trunk เลยหรือเปล่า หรือต้องรอผ่านให้ใคร approve อีก ? - Nattachai
สงสัยต้องรอป๋าเทพมาตอบ. Vee 16:47, 1 August 2007 (UTC)
หน้าที่เราช่วงนี้คือรอครับ patch ผ่าน review แล้ว ก็แปลว่า ใครที่มีสิทธิ์ commit CVS ได้ผ่านมาพบ ก็สามารถ commit ให้ได้ หรือถ้าไม่มีใคร commit ก็อาจเป็น roc เองที่มา commit ให้ การ commit บางทีต้องรอจังหวะโค้ดส่วนอื่นด้วยเหมือนกัน -Thep.
อ้อ อีกอย่างคือ อาจมีใครมา comment เพิ่มด้วยนะครับ ระหว่างที่รอ เพราะจากมุมมองหลาย ๆ คน อาจมีบางคนเห็นปัญหาบางด้านที่เหลืออยู่ เพราะฉะนั้น standby เตรียมแก้ patch ตามจำเป็นด้วยนะครับ -Thep.
ขอบคุณป๋าเทพมากครับ - Nattachai

[edit] ถามตอบ

  • ควรจะใช้ Firefox จาก cvs หรือว่า download ที่เป็น tarball มาดี?
ต้องใช้จาก CVS เพราะว่า tarball มีแต่ที่เป็น release ไม่มี snapshot.​ โดยทำตามวิธีการในหน้านี้ Vee 20:41, 19 July 2007 (UTC) (ถามเองตอบเอง จะได้ไม่ลืมเอง)
  • หากไม่สามารถ login ได้โดยพบข้อความในระหว่าง download จาก CVS ว่า "Emtry password used-try 'cvs login' with a real password" ควรทำเช่นไร.?
ตอน checkout ใช้คำสั่งอะไรครับ? Vee 07:02, 21 July 2007 (UTC)
password ปกติเป็น "anonymous" อ่ะครับ - Keng 13:26, 21 July 2007 (UTC)
  • มีท่าอะไรทำให้ rebuild เร็วๆ หรือเปล่าครับ? ผมสั่ง make -f client.mk build นี่มันนานเหลือเกิน Vee 22:56, 22 July 2007 (UTC)
  • ท่า check carbon. ใน Makefile.in ของเดิมมี ifdef MOZ_ENABLE_PANGO แต่ถ้าจะ ifdef Carbon แทนจะทำไง? Vee 22:56, 22 July 2007 (UTC)
 ifeq ($(MOZ_ENABLE_PANGO),1)
   # Pango stuffs
 else
 ifneq (,$(filter mac cocoa,$(MOZ_WIDGET_TOOLKIT)))
   # Mac stuffs
 else
 ifeq ($(MOZ_WIDGET_TOOLKIT),windows)
   # Windows stuffs
 else
   # Fallback stuffs
 endif
 endif
 endif

ประมาณนี้ครับ ตรงเช็ก Mac นี่ ผมไม่แน่ใจ ว่า ATSUI/Carbon จะมีให้ใช้ทั้ง mac ทั้ง cocoa หรือเปล่า ถ้ามีทั้งคู่ ก็เช็กแบบข้างบน ถ้ามีเฉพาะ cocoa ก็เช็กแค่ ifeq ($(MOZ_WIDGET_TOOLKIT),cocoa) -Thep.

  • Mozilla's Build Configurator เอาไว้ช่วยตั้งค่าไฟล์ build configuration -- bact'
  • ใน Wikipedia บอกว่า ATSUI กำลังจะ deprecate และถูกแทนที่ด้วย Core Text ใน Leopard
แบบนี้ใช้แค่ UCFindTextBreak ก็น่าจะปลอดภัยกว่า? Vee 07:47, 23 July 2007 (UTC)
Core มันเยอะจนน่ารำคาญ - Keng 09:29, 23 July 2007 (UTC)
  • เรื่องการทดสอบผลการตัดคำนี่มี test case ของภาษาต่างๆ ให้ลองทดสอบดูหรือเปล่า มันควรจะมีแต่ไม่รู้ว่าจะหาได้จากที่ไหนบ้าง - pittaya
เห็นแถวๆ นี้มีอยู่ น่าจะพอใช้ได้ [1] - Keng 06:46, 24 July 2007 (UTC)
อันนี้อีกอัน เด็ดดวง จากคุณ Ott - 124.120.221.137 10:22, 25 July 2007 (UTC)
ลอง test ดูเจ๊ง nightly build ที่ยังไม่ได้ patch carbon ก็เจ๊ง http://ftp.mozilla.org/pub/mozilla.org/firefox/nightly/latest-trunk/ Vee 21:40, 28 July 2007 (UTC)
ตัวนี้ลองกับ a8pre ผ่านแล้วนะ - 202.80.255.2 17:06, 5 August 2007 (UTC)
  • ปัจจุบันเวอร์ชันวินโดวส์ตัดคำภาษาไทยได้อยู่แล้วหรือครับ? ผมเพิ่ง build เสร็จ และลองเปิด [2] พบว่าตัดคำได้แล้ว!?! --PaePae 19:49, 26 July 2007 (UTC)
ตัดคำได้แต่ว่าไม่ได้ใช้ Uniscribe ใช้ rule ใน rules.c ขาด 407 บรรทัด. (ซึ่งไม่น่าจะดีเท่า Uniscribe?) ปกติแล้วถ้าใช้ native ตัดไม่ได้ก็จะ fallback ไป rules นี้ทุก platform. Vee 20:23, 26 July 2007 (UTC)
  • บนวินโดวส์ถ้าจะทำเป็น zip หรือ installer หลังจาก build แล้วจะต้องทำอย่างไร
make package หรือ make installer ตามลำดับ หลังจาก build แล้วที่ build จะอยู่ใน dir dist - Revolution
  • บนวินโดวส์ผมลองโหลดไปใช้ เจอตัวอักษรแปลกๆ � แบบนี้ครับ Revolution

[edit] ประชาสัมพันธ์

[edit] ผู้เกี่ยวข้อง

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

Rate this article:
Share this article: