Saturday, July 29, 2006

How to build Firefox

จริงๆ เรื่องนี้สามารถหาได้ง่ายๆ ในอินเทอร์เน็ต ไม่ว่าจะเป็นที่ Mozilla เองหรืออีกหลายๆ ที่ที่ได้มีการบันทึกวิธี build เอาไว้บน platform ต่างๆ เช่น การ build Firefox บน Windows ให้ตัดคำไทยโดยคุณสัมพันธ์ที่ osdev.co.th หรือของคุณพูนลาภที่เขียนไว้นานแล้ว (ซึ่งบางส่วนอาจจะ obsolete ไปแล้ว) ก็เลยขอมาบันทึกเพิ่มเติมไว้ที่นี่ อีกอย่างติดคุณ wd เอาไว้นานแล้วด้วย (แหะๆ)

  • รุ่นที่จะทำการ build -- Firefox 1.5.0.5
  • Platform -- Linux i686
  • Engine สำหรับตัดคำภาษาไทย -- ICU
  • Patches ที่ใช้ สามารถดาวน์โหลดได้ ที่นี่
    • Mozilla ICU Thai patch 2.8 -- เพื่อให้เรียก icu สำหรับตัดคำไทย
    • Mozilla with-icu patch 0.6 -- เพื่อให้คำสั่ง configure สามารถเรียก option --with-icu ได้
    • Mozilla fix CTL patch 4.12 -- เพื่อแก้ไขปัญหาแสดงผลผิดพลาดเมื่อมี justify tag ในหน้าเว็บ
  • สิ่งอื่นๆ ที่ต้องมี
    • ชุด development ของ icu, pango, X, gtk2 ฯลฯ ซึ่งถ้าหากใช้ดิสโทรที่มี apt-get หรือ smart น่าจะหาได้ไม่ยาก
    • Compiler (GCC นั่นแหละ)
    • ชุด autoconf >= 2.13 เพราะต้องทำการปรับปรุง configure script ใหม่
    • พวก utilities อื่นๆ อย่างเช่น gzip, tar, textutils ซึ่งมันก็ควรจะมีอยู่แล้ว



ทีนี้ก็มาเริ่มกันได้...

ก่อนอื่น ขั้นแรกต้องไปดาวน์โหลดต้นรหัสหรือ source code มาก่อน ซึ่งสามารถดาวน์โหลดได้จากftp ของ mozilla เสร็จแล้วก็แตกไฟล์ออกด้วยคำสั่ง
tar -jxvf firefox-1.5.0.5-source.tar.bz2


จะได้ไดเร็คทอรี mozilla ออกมา ขั้นต่อมาก็ให้ทำการก็อปปีไฟล์ patches เข้าไปไว้ในไดเร็คทอรี mozilla แล้วก็ทำการ patch จากภายในไดเร็คทอรีดังนี้

#patch สำหรับแก้ไข justify tag
patch -p1 < deerpark-cvs-rtl-v4.12.patch

#patch สำหรับเรียก icu ให้ตัดคำไทย
patch -p1 < mozilla-icuthai-2.8.patch

#patch สำหรับแก้ให้ script configure สามารถเรียกใช้ option --with-icu ได้
patch -p1 < mozilla-withicu-0.6.patch

#เรียกโปรแกรม autoconf เพื่อสร้าง configure
autoconf-2.13


จากนั้นเราก็ใกล้จะได้เริ่มทำการ build แล้วครับ (แหะๆ ) แต่เดี๋ยวก่อน! สำหรับการ build โปรแกรมจาก mozilla นั้น มีขั้นตอนพิเศษอยู่อีกนิดนึง นั่นคือ options สำหรับ configure script จะถูกเก็บเอาไว้ในแฟ้ม .mozconfig ซึ่งเนื้อหาภายในก็จะเกี่ยวข้องกับการสร้าง buildroot directory และ switches สำหรับการ build firefox ให้มีความสามารถต่างๆ เช่น ให้รองรับ canvas, ให้ใช้ชุดคำสั่ง pango เป็นต้น ส่วนอันนี้เป็นตัวอย่างของ .mozconfig ที่ผมใช้


. $topsrcdir/browser/config/mozconfig

mk_add_options MOZ_OBJDIR=@TOPSRCDIR@/firefox_build
ac_add_options --enable-static --disable-shared
ac_add_options --disable-tests
ac_add_options --enable-optimize
ac_add_options --disable-debug
ac_add_options --with-icu
ac_add_options --enable-default-toolkit=gtk2
ac_add_options --enable-pango
ac_add_options --enable-svg
ac_add_options --enable-xinerama
ac_add_options --enable-xft
ac_add_options --enable-ctl
ac_add_options --enable-canvas


บรรทัดบนสุดบอกว่า จะทำการ build Firefox (เทียบเท่า option --enable-application=browser)
บรรทัดถัดมาบอกให้ทำการ build ในไดเร็คทอรีต่างหาก ชื่อว่า firefox_build ซึ่งมีประโยชน์ก็คือมันจะไม่ mess up ซอร์สในไดเร็คทอรี mozilla และหากว่าคุณต้องการ build แอพพลิเคชันตัวอื่นๆ ในชุด mozilla ด้วย build root เดียวกันก็จะสามารถทำได้
ส่วน options ตัวอื่นๆ ได้แก่ ให้ทำการ build แบบ static แปลว่า ให้รวมไลบรารีทั้งหมดที่เกี่ยวข้องลงมา โดยไม่ต้องไปเรียก shared libraries อีก มีผลทำให้เร็วขึ้น และไม่มีปัญหาเวลาไป run บนดิสโทรอื่น (เพราะรวมไว้หมดแล้ว), เปิดการ optimization, ปิดการดีบัก, ใช้ icu, ใช้ pango, gtk2, xft, xinerama, เปิดการสนับสนุน svg, canvas, complex text layout (เช่นภาษาไทย)
ซึ่งตรงนี้ถ้าอยาก build แบบ conventional คือเรียก ./configure --option1 --option2 ... แล้ว make ก็ได้มั้ง แต่มันคงยุ่งมากเลย แล้วที่ mozilla ก็ไม่แนะนำให้ทำแบบนั้น

แล้วก็ได้เวลา build ... สำหรับตอนที่ผม build นั้นมันเกิดปัญหานิดหน่อย คือมันติดตรงที่ script มันไม่เรียก link libraries ที่จำเป็นอยู่ 2 ตัว คือ libXft กับ libpangoxft-1.0 ผมเลยต้องกำหนด LDFLAGS เพิ่มเข้าไปก่อนทำการ build


LDFLAGS="$LDFLAGS -L/usr/X11R6/lib -lXft -L/usr/lib -lpangoxft-1.0"
export LDFLAGS


แล้วจึงทำการเรียกคำสั่ง build

make -f client.mk build


รอ + ภาวนาให้มัน build ผ่าน หรือออกไปหาข้าวกินก่อนก็ได้ครับ ตรงนี้ขึ้นอยู่กับเครื่อง ถ้าหาก ram เยอะ processor เร็วๆ อาจใช้เวลาประมาณ 20 นาทีถึงครึ่งชั่วโมง ถ้าน้อยๆ ก็อาจจะเป็นชั่วโมงครึ่ง สำหรับผมใช้เวลา ~45 นาที

หลังจากนี้ถ้า build เรียบร้อยแล้ว ก็มาทำการรวมไฟล์ทั้งหมดแล้วสร้างเป็นตัว installer (จริงๆ คือ tarball ไม่มีอะไรมากกว่านั้น)

make -C firefox_build/browser/installer


ตรง firefox_build คือ build root ที่ผมบอกให้ .mozconfig สร้างไว้ครับ แล้วแต่ว่าคุณจะกำหนดเป็นอะไร หลังจากสั่งแล้ว คุณจะได้ไดเร็คทอรี firefox ซึ่งสามารถเรียกใช้งานได้เลย และ Firefox tarball อีก 1 ไฟล์สำหรับแจกจ่าย อยู่ใน mozilla/firefox_build/dist ครับ

สุดท้ายนี้ ถ้าไม่อยาก build เองก็เชิญ load ได้ที่นี่ครับ ผม build ไว้บน PCLOS แต่ทดสอบกับ Ubuntu แล้ว เรียบร้อยดี :D
md5sum คือ 3417dad14a5315bc4f07b5c4c31c4181 ครับ

update: ผม build 1.5.0.6 แล้วอยู่ ที่นี่ ครับ

Friday, July 14, 2006

DrRider (and Boss) in the USA -- ภาคจบ

เขียนมาเป็น trilogy เลย ตอนนี้ชักขี้เกียจแล้ว ความจำสั้น ผ่านมาจะครึ่งเดือนแล้ว -_-'

ทีนี้ก็ถึงวันกลับ... เนื่องจากเครื่องที่ออกจาก Pittsburgh ไป LA มันออกประมาณแปดโมงครึ่ง และเวลา check-in โดยทั่วไปก็คือ 2 ชั่วโมงก่อนเครื่องออก ดังนั้นวันนี้เลยต้องแหกขี้ตาตื่นตั้งแต่ตีห้า อาบน้ำแช่น้ำ (เพราะต้องแกร่วบนเครื่องบินอีกเป็นสิบชั่วโมง ดังนั้นขอสบายก่อน) แปรงฟันแต่งตัว ชงกาแฟกิน (ในห้องมีกาแฟถุง Starbuck กับเครื่องชงกาแฟให้) แล้วก็ลงมา check-out ที่ lobby เจอกับเพื่อนที่จะไปเที่ยวบินเดียวกัน เอาหล่ะ เพื่อนลองไปถาม door boy ดูเผื่อมีรถไปส่งสนามบินฟรี แต่ปรากฏว่า คนละ $US20 เลยไปแท็กซี่ดีกว่า ถูกกว่าเยอะ (ขากลับรถไม่ติดค่าแท็กซี่รวมทิปก็ยังถูกกว่าขามาพอสมควร) และได้เรียนรู้อะไรอีกอย่างว่า แท็กซีที่ USA นี่ขับได้เก่งพอๆ กับแท็กซีไทย สามารถซอกแซกไปตามเลนต่างๆ ที่พอจะแทรกไปได้แบบหวาดเสียวเล็กๆ -_-"

หลังจากไปถึงสนามบิน ก็ไป check-in ทีนี้ดันต่อแถว self check-in ซึ่งเอาละสิ ไม่รุ้รายละเอียดการเดินทางเลย หมายเลขตั๋วอะไรก็ไม่มีเพราะว่า ไม่มีที่ print จำไม่ได้ ฯลฯ สรุปต้องให้เจ้าหน้าที่เขาช่วย (ตรงนี้ไม่ต้องทิปแฮะ) ผ่านมาได้ก็ไปตรวจกระเป๋า ซึ่งหลายๆท่านทราบดีว่า การโหลดกระเป๋าขาออกจากอเมริกานั้น ห้ามล็อคกระเป๋า เพราะหากเกิดแจ็คพ็อตเจ้าหน้าที่ต้องการตรวจกระเป๋าของท่าน สิ่งที่จะเกิดขึ้นก็คือ ท่านต้องซื้อล็อคใหม่เอง เพราะเขาจะตัดล็อคโดยไม่รับผิดชอบใดๆ ทั้งสิ้น ก็ไม่มีอะไร ส่งเข้าเครื่อง X-ray ตามปกติ แต่ช้าก่อน... เจ้าหน้าที่สังเกตเห็นอะไรแปลกๆ ในกระเป๋าก็เลยเรียกเจ้าของ (ผมกับ boss) มาดู นึกในใจ อะไรอีกวะ แจ็คพ็อตจริงๆ มาอเมริกาคราวนี้ เปิดๆ ค้นๆ ดูก็ไม่มีอะไร คาดว่าอาจจะเห็นกระจกหรือแฟ้มอะไรซักอย่างแล้วมันผิดสังเกต ก็บอกโอเค แล้วก็ปล่อยกระเป๋าโหลดขึ้นเครื่องได้ หลังจากนั้นก็ไปที่ gate แน่นอนว่าต้องผ่านการตรวจกระเป๋าถืออีกรอบ แจ็คพ็อตตามเคย -_-' กระผมโดนเรียกเข้า track พิเศษแล้วตรวจตั้งแต่หัวจรดเท้า แล้วก็ถูๆ หาสารระเบิดเช่นเคย (boss กับเพื่อนอีกคนไม่โดน) ชักเหนื่อยกับอเมริกาแล้วอะ -_-' ผ่านเสร็จเราก็ไปที่ส่วน terminal กันแล้วก็หาข้าวเช้ากิน คราวนี้ไปนั่งกินร้าน grille ในสนามบิน กินไก่ย่างโปะชีสกินกับ broccoli และมันฝรั่ง ถูกกว่าร้านข้างนอกเยอะอะ จานละ US$10 กว่าๆ อร่อยด้วย



หลังกินเสร็จก็ไปนั่งรอขึ้นเครื่องเพื่อไป LA พอได้เวลาก็ไป (เครื่องบินที่นี่ตรงเวลาดีแฮะ) ถึง LA ก็ต้องไปนั่งรออีกกว่า 10 ชั่วโมงเพราะเครื่องมันออกห้าทุ่มครึ่ง T-T ระหว่างนี้เดินหาปลั๊กกับสัญญาณ wi-fi จนทั่ว แต่สัญญาณมันอ่อนเอามากๆ จนไปเจอ Access point ของ JAL lounge ใช้ฟรี :) (แต่ไม่รู้เจ้าของเขาให้ใช้หรือเปล่าเพราะบิน Qantas) ที่จริงเพื่อนที่ออสเตรเลียฝากเงินมาซื้อ Creme de La Mer แต่ยังซื้อให้ไม่ได้ เพราะยังไม่มี Boarding pass ต้องรอจนเคานท์เตอร์ของ Qantas เปิด (ประมาณห้าโมงเย็น) หลังได้ Boarding pass ก็ไปซื้อของจาก duty free (ไม่เคยรู้จักมันมาก่อนเหมือนกัน แต่พอรู้ว่ามันแพงสุดๆ) เอาเป็นว่าได้ราคาที่ดีกว่าออสเตรเลียหรือไทยมากก็แล้วกัน (คนขายบอก คนไทยมาซื้อกันเยอะ)

พอได้เวลาห้าทุ่มก็ไปรอขึ้นเครื่อง ทีนี้เป็นครั้งที่ผ่าน security ได้ง่ายที่สุด แม้ว่าจะลืมเอามือถือออกจากเอว (แหะๆ) ก่อนจะขึ้นเครื่องกลับออสเตรเลีย...

หลังจากได้ไปอเมริกามารู้สึกได้ว่า security มันเยอะจริงๆ หว่ะ (พอเข้าใจว่าหลัง 9/11 ก็ควรจะเป็นอย่างงั้นน่ะ) แต่รู้สึกอึดอัดอย่างแรง แล้วก็ในความรู้สึกคือความเป็นมิตรมันน้อยกว่าออสเตรเลียเยอะ อีกอย่างคือทำไมกรูโดนตรวจอยู่เรื่อยเลยวะ (ถามเพื่อนอีกคนที่เป็นคนจีนบอกว่า ตอนไปอเมริกาเขาก็โดนเยอะแบบนี้แหละ เป้าหมายในการตรวจคงจะมุ่งที่ Asian/middle east male ก่อน นี่ถ้ามีเคราเยอะๆ หรือโพกหัวด้วยคงโดนแก้ผ้าตรวจด้วยมั้ง หุหุ)

สรุป ไปอเมริกาคราวนี้ได้ Learning Python มาเล่มนึง จบดีก่า...

ปล. ฉลองครบรอบ 50 posts แล้วเฟร้ย... Woohoo!
ปล.2 วันนี้เพิ่งได้ ShipIt! หลังจากสั่งไปเกือบ 2 เดือน มี Ubuntu x5 กับ Kubuntu x5 แล้วก็สติกเกอร์ x12 สั่งมาเผื่อแจกเพื่อนแถวนี้ใครอยู่ออสเตรเลียอยากได้มาหาผมที่บ้านได้นะ :D (ค่าส่งไปรษณีย์มันแพง... แหะๆ)

Sunday, July 02, 2006

DrRider (and Boss) in the USA -- Part II

ต่อจากคราวที่แล้ว ก็มาถึง Pittsburgh จนได้ ซึ่งช้ากว่ากำหนดการ 1 วัน ฝนกำลังตกพรำๆ อุณหภูมิประมาณ 26-27 องศาเซลเซียส เราสามคนก็ขึ้นแท็กซี่ไปที่โรงแรม เพื่อนถามว่า ตอนนี้ Pittsburgh เป็นไงมั่ง คนขับแท็กซี่บอก "Wet!" ถึงโรงแรมค่าแท็กซี่ทั้งหมด US$45 (มีทิปด้วย) เคยได้ยินแต่กิตติศัพท์ว่า ที่อเมริกา จะใช้บริการใดๆ ก็ต้องให้ทิปอย่างน้อย 10 % ตอนนี้รู้ซึ้งแล้วแท็กซี่ก็ต้องทิป ชักคิดถึงออสเตรเลียขึ้นมาตงิดๆ -_-'

เอาหล่ะ พอไปถึงโรงแรม (Westin)ซึ่งอยู่ติดกับ Convention Center ที่จัดงานประชุมวิชาการ ก็ขนกระเป๋าเข้าไป (เอง เพราะไม่ต้องการให้ทิป) แล้วไปติดต่อที่ Lobby ปรากฏว่า เป็นเพราะเรามาช้าไปวันนึง เขาจึงยกห้องที่จองไว้ให้คนอื่นไปเรียบร้อย -_-' แล้วก็บอกว่า คงต้องรอจนถึงประมาณ 10 โมงหรือเที่ยงๆ (อันเป็นเวลา Check out) ถึงจะหาห้องให้ได้ โหย ตอนอยู่ในเครื่องบินนี่คิดถึงเตียงสุดๆ พอมาถึงดันไม่มีห้อง T-T แต่ก็ยังไม่ถือว่าโชคร้ายมากที่ "ป๋า" ทิ้งโน้ตเอาไว้ว่า ถ้ามาถึงแล้วยังไม่มีห้อง ให้ไปที่ห้องป๋าก่อน (สืบเนื่องจากตอนที่มีปัญหาเรื่องการเดินทาง Boss ได้ โทรไปหาเลขาของป๋า แล้วเลขาก็จัดการ email ไปหาทุกคนที่เกี่ยวข้อง) เราก็เลยขึ้นไปที่ห้องป๋า และบังเอิญเจอป๋าระหว่างทางพอดีก็เลยไม่มีปัญหา


หลังจากอาบน้ำอาบท่าเสร็จ (ในห้องป๋านั่นแหละ) ก็แยกกันไปหา Breakie กิน แน่นอนว่าผมกับ Boss คงออกสำรวจหาของกินราคาถูกก่อน แต่ ... ตอนนั้นประมาณ 9 โมงเช้าวันจันทร์ ยังไม่มีร้านอาหารเปิดเลย เลยต้องกลับมาหากินที่โรงแรม ขึ้นไปกินอาหารเช้าแบบอเมริกันบุฟเฟต์ มีไส้กรอก, เบคอน, ไข่ ฯลฯ คนละเกือบ US$18 ยังไม่รวม vat 7% กับทิปต่างหาก สิริรวมมื้อนั้น US$40 -_-' ลืมบอกว่า ราคาที่แสดงไว้ในอเมริกานี่คือราคาที่ยังไม่รวม vat ต้องบวกไปอีก 7-10% แล้วแต่รัฐ แต่ที่ื Pennsylvania นี่รู้สึกจะ 7% หลังจากอยู่ออสเตรเลียมา 2 ปีกว่า และได้มาเจออาหารอเมริกันนี่ถึงกับน้ำตาไหล เพราะไส้กรอกเบคอนและหมูแฮม มันอร่อยเหมือนในเมืองไทย :') ไม่ได้เจอมานานแล้ว เลยล่อซะให้คุ้ม พอกินเสร็จก็ขึ้นไปรอห้อง กว่าจะได้ห้องก็เกือบเที่ยง ในที่สุดก็ได้นอนเตียงซะที...

กิจวัตรระหว่างอยู่ที่นี่ไม่มีอะไร ตอนเช้าตื่นแต่เช้า ประมาณตีสี่-ตีห้า เพราะข้าม time zone มาเยอะ ปกติไม่เคยตื่นแบบนี้มาก่อน แล้วพอถึงเวลาไปส่ง Boss ไป conference มั่ง ปล่อยให้ Boss ไปเองมั่ง (หุหุ) แล้วกลับมาที่ห้องส่วนใหญ่ดูทีวี ที่โรงแรมมีบริการแบบ pay per view ด้วย ซึ่งก็มีหนังที่เพิ่งออกจากโรงหมาดๆ และ Adult ด้วย (แต่ไม่กล้าดู มันคิดเรื่องนึงตั้งเกือบ $US20 แน่ะ) แล้วก็เล่นอินเทอร์เน็ต โรงแรมนี้มีบริการ wifi ให้ใช้ฟรีในห้องพักและที่ lobby ด้วยความเร็ว 378 kbps แต่สัญญาณในห้องมันอ่อนจัง ส่วนน้อยอ่านหนังสือ (ติดข้อสอบมาอ่าน แต่ไม่ค่อยได้อ่าน) เสร็จแล้วตอนกลางวันก็ไปหาบอสไปหาข้าวกินกัน 2 วันแรกกินข้าววันละมื้อ คือมื้อ brunch ไปหาข้าวกินก็เกือบ 11 โมงเข้าไปแล้ว แล้วก็ล่อซะเต็มคราบ เลยกินวันละมื้อพอ วันต่อๆ มาค่อยไปหามื้อเย็นกิน มีคู่มือหาของกินอยู่เล่มนึง เปิดหาร้านถูกๆ แล้วก็เดินไปกินแถวๆ นั้น มีวันนึงไปกินร้านอาหารจีนแถวๆ นั้น แบบ All you Can Eat คนละ $US6 (ยังไม่รวม vat เช่นเคย) ปรากฏว่า ห่วยแตกเอามากๆ ก็เลยเข็ดแล้ว ไปหาร้านอร่อยๆ กินดีกว่า T-T

นอกจากนี้ เกิดมาไม่เคยคิดที่จะแช่น้ำในอ่างมาก่อน มาอยู่โรงแรมนี่เปิดน้ำเต็มอ่างแช่แล้วมันสบายดีแฮะ (Boss แช่เกือบทุกวัน) แบบไม่กลัวเปลืองน้ำเลย เต็มที่ หุหุ

มีหลายวันที่ออกไปเดินสำรวจที่ทางร้านค้าแถวนั้น เดินไปจนถึงร้านหนังสือร้านนึง แล้วก็ไปเจอ Learning Python ของ Lutz เข้า ซึ่งหลังจากที่ยืมห้องสมุดมาอ่านครั้งก่อนแล้ว มันไม่เคยว่างอีกเลย ก็เลยไปอ้อน Boss ขอซื้อแบบอ้อมๆ (และได้รับการอนุมัติ :D) ก็เลยไปซื้อ ซึ่งราคาที่พิมพ์ไว้ที่ปกมัน 35.95 (vat excluded) แต่ไปซื้อจริงมันกลายเป็น 39.99 รวม vat ก็กลายเป็น 42.79 เลยหว่ะ งงๆ แต่กลับมาเช็คกับ o'reilly มันก็ 39.99 แฮะ (แล้วมันจะพิมพ์ 35.95 ไว้ทำไมวะ) เอาเหอะ แต่ก็ถูกกว่าซื้อที่ออสเตรเลียหรือเมืองไทยละกัน

คืนวันพฤหัสฯ คืนสุดท้ายก่อนต้องจาก Pittsburgh กลับไปออสเตรเลีย เราก็ออกไปหาอะไรอร่อยๆ กิน เป็นการฉลองวันแต่งงานครบรอบ 4 ปี (4 ปีแล้วรึ เร็วจัง) ที่ร้าน Six Penn (คือร้านมันอยู่ที่ Sixth Av. ตัดกับ Penn street) ท่ามกลางแสงเทียนสลัวๆ โรแมนติคซะไม่มีอะ (ดูตามคู่มือแล้วคิดว่าไม่แพงมาก) สั่งอะไรมากินจำชื่อไม่ได้แล้ว แต่เหมือนไก่ย่างกับขาหมูเยอรมัน (แหะๆ) อร่อยใช้ได้ เสร็จแล้วก็กลับไปนอนที่โรงแรม






To be continued...