เรื่องมีอยู่ว่าดันอยากดึงข้อมูลจาก Tumblr มาลงบล็อกเสียหน่อย ซึ่ง API ที่ Tumblr มีให้นั้นสะดวกมาก มาเป็น REST แถมเลือกผลลัพธ์ออกมาได้ตั้ง 3 แบบ ทั้ง RSS feed, XML feed และ JSON ไหนเลยทำทั้งทีก็ขอเท่หน่อยเอาเป็น JSON ละกัน
เผอิญว่า PHP ของเครื่องที่ใช้อยู่เก่าไปนิด ไม่ได้ลงโมดูล json มาให้
ดูเหมือนไม่มีอะไรลำบาก แต่เผอิญว่าเครื่องที่ใช้อยู่เป็นเครื่องของชาวบ้าน และมันดันเป็น Gentoo โอ้
ค้นจากรายละเอียดแพกเกจบนเว็บ Gentoo พบว่าแพกเกจ PHP นั้นให้ json มาอยู่แล้ว แต่เวอร์ชันในเว็บเป็น 5.2.x ส่วน PHP ในเครื่องเป็น 5.1.x ซึ่งเป็นไปได้ว่าเก่าเกินไป ต้องหาวิธีอัพเกรด
ปัญหาคือความรู้ด้าน Gentoo ของผมก่อนเริ่มต้นมีอยู่อย่างเดียวคือระบบจัดการแพกเกจชื่อว่า Portage โดยคำสั่ง emerge ตามด้วยชื่อโปรแกรมคือการลงโปรแกรม นอกนั้นว่างเปล่าจริงๆ แค่หาชื่อโปรแกรมที่ถูกต้อง (แบบเดียวกับ apt-cache search) ก็ไม่รู้แล้วว่าต้องทำยังไง
เอกสารของ Gentoo นั้นเป็นเอกสารที่ได้มาตรฐานของลินุกซ์ นั่นคือเหมาะอย่างยิ่งสำหรับเป็น reference แต่ novice ไม่มีทางอ่านรู้เรื่อง (too verbose, too many options) โชคดีมหาศาลที่เดี๋ยวนี้ search engine มันเก่ง เลยทำให้เจอ emerge user guide ของ Linux Review ที่อ่านรู้เรื่องมา
เริ่มต้นโดยการ sync รายชื่อแพกเกจก่อน (เทียบเท่า apt-get update)
sudo emerge —sync
เนื่องจากว่า world (หรือระบบ Gentoo ถ้าใช้ภาษาปกติ) ของผมเก่ามากมาก พอ sync เสร็จมันเลยเตือนว่าคุณต้องอัพเดตแพกเกจของตัว portage เองเสียก่อน
sudo emerge portage
ปรากฎว่าเจอรับน้องครับ อาการเหมือน bug นี้ของ Gentoo คือแพกเกจเกิดบล็อคกันและกัน (ในที่นี้คือ portage กับ bash)
วิธีแก้ก็ตามคอมเมนต์ในบั๊ก นั่นคือระบุเวอร์ชันของ bash ไม่ให้ชนกับ portage ในที่นี้คือระบุเวอร์ชันของ bash ที่น้อยกว่า 3.2_p33
emerge ‘<app-shells/bash-3.2_p33’ ; emerge portage
ปัญหาแรกผ่านไปด้วยดี แต่เมื่อ Gentoo คอมไพล์และติดตั้งเสร็จ ก็แจ้งเตือนต่อว่า คุณต้องอัพเดตไฟล์คอนฟิกด้วยนะ (แต่ไม่บอกว่าทำยังไง ใครจะไปรู้วะ)
ค้นเว็บไปสักพักถึงรู้ว่า มันต้องใช้ etc-update
sudo etc-update
แต่ยังไม่จบดีนัก เมื่อ etc-update มีออพชันให้เลือก 4 แบบ ว่าจะ merge คอนฟิกเก่าหรือไม่ ในรูปแบบที่ต่างกัน ถึงตรงนี้ไม่มีทางรู้ว่าค่าที่ถูกต้องคืออะไร ผมเลยตัดสินใจเสี่ยง ใช้ -3 สั่ง merge ทั้งหมดทุกคอนฟิก ทุกกรณี
เมื่อเรียบร้อยดีแล้ว ก็ถึงเวลาติดตั้งแพกเกจที่ต้องการเสียที ค้นหาแพกเกจ PHP ให้อุ่นใจก่อน
sudo emerge -s php
portage เป็นโปรแกรมที่ให้รายละเอียดของแพกเกจดีมาก (ดีกว่า APT หลายขุม) จะบอกเวอร์ชันที่เรามี และเวอร์ชันล่าสุดให้เสร็จสรรพ สำหรับแพกเกจของ PHP ใช้ชื่อว่า dev-lang/php
พร้อมแล้วให้สั่งอัพเดต
sudo emerge -uD dev-lang/php
-u คืออัพเดต ส่วน -D (deep) คือให้จัดการอัพเดต dependency ที่เกี่ยวข้องด้วย งานนี้โดนไป 25 ตัว ซึ่งรวม MySQL และ OpenLDAP
เนื่องจาก Portage ระบบจัดการแพกเกจของ Gentoo นั้นต่างจาก APT หรือ RPM ตรงที่มันต้องดาวน์โหลดซอร์สมาคอมไพล์และติดตั้งเอง (เพื่อประสิทธิภาพ!) เจอไป 25 ตัวก็เรียกว่าไปนั่งเล่นเกมรอได้เลย จะนอนก่อนแล้วตื่นมาทำตอนเช้าก็รู้ว่า จะต้องค้างคาใจจนนอนไม่หลับแน่ ไม่มีทางเลือกอื่นนอกจากพิชิตมันให้ได้ก่อนหลับ
รอจนมันเสร็จสิ้นกระบวนความแล้ว ก็สั่งอัพเดตคอนฟิกอีกครั้ง แบบเดิม ถ้าไม่มั่นใจเช็คเวอร์ชันของ php อีกครั้งโดยสั่ง emerge -s php จะเห็นเลขเวอร์ชันเปลี่ยนแล้ว
แต่เลขเวอร์ชันใน phpinfo() ยังไม่เปลี่ยน ต้องเริ่มเว็บเซิร์ฟเวอร์ใหม่อีกครั้ง ขณะที่กำลังจะสั่ง restart apache ก็ดันนึกขึ้นได้ว่า ตูใช้ lighttpd นี่นา
sudo /etc/init.d/lighttpd restart
ตรวจสอบจาก phpinfo() อีกรอบ พบว่าเลขเวอร์ชันเปลี่ยนเป็น PHP รุ่นล่าสุดแล้ว แต่ว่ามันยังไม่จบ
json ไม่ได้ถูก enable แหะ
ทางออกเดียวที่เป็นไปได้คือสั่ง enable json แล้วคอมไพล์ PHP ใหม่อีกรอบ
เสียเวลาค้นไปอีกสักพัก พบว่า Portage ใช้ระบบ USE flag ในการบอกตั้งค่าแพกเกจก่อนคอมไพล์
การตั้ง USE flag มีสองทางเลือก คือ ระบุตอนสั่ง emerge หรือแก้ในไฟล์ /etc/portage/package.use
เครื่องที่ใช้นั้นกำหนด USE flag ของ PHP ไว้ใน package.use อยู่แล้ว เลยใช้วิธีหลัง เติม json ลงไปในรายการ flag และปรับเลขเวอร์ชันของ dev-lang/php ให้ตรงกับเวอร์ชันที่ใช้
ทีนี้สั่งคอมไพล์ใหม่ยังไงหว่า ลองมั่ว emerge php กับ emerge -u php ล้มเหลวทั้งคู่ มันบอกว่าเป็นแพกเกจใหม่ที่สุดแล้ว
ค้นเว็บต่อไปอีกสักพัก Linux Review ช่วยชีวิตอีกแล้ว สั่งดังนี้
sudo emerge —newuse php
หลังจากนั้นก็รอด้วยใจจดจ่อ ดันมาทำก่อนนอน ร่างกายก็ล้าเต็มทน พอคอมไพล์และติดตั้งเสร็จ โหลด lighttpd ใหม่อีกรอบ เช็คใน phpinfo() พบว่า json โผล่ขึ้นมาแล้ว เย่
อยากลองรันโค้ดตัวอย่างแค่ 4 บรรทัด เท่านี้ เสียเวลานั่งคอนฟิกกับรอคอมไพล์ประมาณชาติเศษ
เห็น json โผล่ขึ้นมาก็เกิดอาการ “วะ” เลยนอน ส่วนบล็อกนี้ตื่นมาเขียนตอนเช้า จดไว้กันลืมไม่ให้เสียแรงเปล่า
อนาคตจะไม่ใช้ Gentoo แล้วจ้า
อัพเดต
โพสต์โค้ดไว้ที่ drupal.org แต่เป็น generic PHP ธรรมดา เอาไปใช้นอก Drupal ได้เช่นกัน
เป็นผมจะเอา Zend/Json มาลงนะ
เมื่อก่อนใช้ gentoo อยู่เหมือนกัน แต่ยอมแพ้เพราะมันคอมไพล์ทุกอย่างนี่แหละ นานเกิน
@pittaya อยากใช้วิธีที่มันมาตรฐานหน่อยน่ะ ถือว่าฝึกวิชา Gentoo ด้วย
ไม่ค่อยรู้เรื่อง programming หรืออะไรทำนองนะ แต่ขำ โดยเฉพาะตอนท้ายๆ ;p
ดูเป็นวิธีการที่ยุ่งยากมากๆๆๆๆ อ่ะครับ เหอๆ
ดีนะไม่เหนื่อยกลางคัน แล้วเขียน lib เอาเองเลย
@ipats ผมว่ามันเป็น learning curve ปกติของระบบที่มีความซับซ้อนสูงน่ะครับ เหมือนกับเรียน bash หรือ regexp นั่นแล พอเป็นแล้วก็ตะลุยทั่วยุทธจักรได้