PHPHoffman Framework Diagram

จาก entry ที่แล้ว ก็นั่งคิด ๆ ว่าตัว Framework จะมีส่วนหลัก ๆ อะไรบ้าง ตอนนี้ก็ได้ข้อสรุปในการสร้างออกมาแล้ว นั่งคิด และปรับว่าจะเอายังไงอยู่หลายวันอยู่ เพราะบางอย่างมันก็รักพี่เสียดายน้อง แต่หลัก ๆ คือใช้ PHP5.2 และใช้ Extension ต่าง ๆ ของ PHP หลายตัวซึ่งการที่ใช้ Extension ของ PHP เยอะ ด้วยเหตุที่เอา Zend Framework เข้ามาอยู่ใน Core ระบบ ทำให้ข้อกำหนดหลายอย่างต้องหนักไปทาง Zend หลายเ่รื่อง แต่ผลที่ได้รับคือตัว code ต่าง ๆ นั้นมีระเบียบและตามรูปแบบเพิ่มขึ้นเยอะ สวนตัว Extension Components ได้แนวคิดจาก Firefox ที่อยากได้อะไรเิพิ่มก็เอามาใส่นั้นแหละ นอกเหนือจากที่ตัว Zend และ Component หลัก แต่จะยังคงแนวคิดที่ว่าจำเป็นต้องใช้อะไรก็จะโหลดระหว่างตอนทำงานแค่นั้น ทำให้ตัว Controller ต้องไล่ทำใหม่ทำให้ ทุก ๆ action นั้นมีรายละเอียดในการตั้งค่าเพิ่มขึ้น แต่จะเห็นว่า Permission Control นั้นหายไป เพราะคิดไว้ว่าจะเป็นส่วนของ Routing แทน ตอนนี้ขอดูความเหมาะสมก่อน ส่วนที่ผู้เขียนนั้นต้องใส่ใจจะมีอยู่ในส่วนนอกของ Core ทั้งหมด

เหตุที่ใช้ Component ของ Zend Framework ก็จากเหตุผลเก่าจาก entry ที่แล้ว และเพราะมีระเบียบแบบแผนการพัฒนาในชุมชนที่แข็งมาก

ตอนนี้พยายามเคลียร์ ๆ งานที่จำประจำ แล้วลงมาทำส่วน Framework ให้มันออกมาเป็น public เสียที คนบ่นอยากใช้กันแย่แล้ว T_T

อ่อ ผมได้แนวคิดส่วน View จาก Sixhead Template ของคุณปีโป้ หลายส่วน ซึ่งตอนนี้เอาไว้ public plan ที่ 2 แล้วกันเพราะได้ดูแนวคิดแล้ว ช่วยทีมออกแบบกราฟฟิกได้เยอะ

อ่อ ตัว private version ที่เป็น alpha รุ่นแรก ถูกเขียนเป็น Shop Cart อยู่ที่ http://shop.thaiadmin.org แต่ผมมองว่ารุ่นนั้นก็ปล่อยได้แล้วแหละ แต่ว่ามองอีกมุม ยังยากอยู่อีก -_-‘ อยากให้มันง่ายกว่านี้ในการใช้งานเพิ่มขึ้น

แค่คิดก็นั่งลง coding มันแล้ว …….

[Update] – เหตุผลต่อมาในการใช้ PHP5 เพราะตัว MySQL Improved Extension นั้นทำงานได้ดีกว่ากับ MySQL ใน version ใหม่ ๆ ด้วย คือมีแล้วไม่ได้ใช้มันเสียดาย -_-‘

Redesign PHPHoffman Framework Architecture

เป็นปัญหาหนักอกอย่างรุนแรงที่จำเป็นต้อง redesign ตั้งแต่ยังไม่ออก beta การ redesign ในระดับ core นี่มันสุด ๆ จริง ๆ เพราะว่าอย่างที่หลาย ๆ entry ที่ผ่านมาเนี่ยกะว่าก็คงรู้ว่าผมกำลังทำ Framework ที่ออกไปทาง Conponent Base แทน และผสมตัว Automate เฉพาะที่จำเป็น ทำให้ไอ้ที่ทำ ๆ ตอนแรก ๆ ในแบบ Automate ทั้งหมดตั้งแต่แรก มันต้อง drop ไปหมดเลย เพราะเริ่มคิดว่า การทำเล็ก ๆ แล้วเอา plug-in มาใส่น่าจะตอบโจทย์มากกว่า เพราะอย่างแรกมันเป็นเรื่องของการโหลดตัวระบบที่มาก หรือน้อยขึ้นอยู่กับ component ที่ใช้ ไม่ใช่จะใช้แค่นี้แต่ดันเอาไส้ในออกมาเสียหมด มันเปลื้องเกินความจำเป็น แถมลอง monitor ตัว framework ที่เขียนในปัจจุบันนี่มันก็ใช้ memmory ไปพอสมควร แต่คิดว่ามันน่าจะน้อยกว่านี้ได้อีก แถมนี่จะเกือบปีแล้วยังไม่ได้ออก beta เลย แถมมีแต่คนถามว่าเมื่อไหร่จะให้โหลด ต้องบอกว่าตัวที่เป็น production ของ Framework ตัวนี้ก็อยู่ที่ shop.thaiadmin.org ครับ ส่วนตัวใหม่นี่จะเปลี่ยนภายในทั้งหมด พวก app ที่เขียน ๆ อยู่อาจต้อง recode ใหม่ด้วย แต่มันจำเป็นจริง ๆ แต่จะพยายาม backward ให้มากที่สุด

อ่อ ลืมบอกไปว่า PHPHoffman ตัวนี้ตามข้อกำหนดของ GoPHP5 ครับ ใครใช้ PHP 4 อดนะครับ (แล้ว Host ที่ใช้อยู่นี่จะเอาไงหล่ะเนี่ย -_-")

กลับมา Blog Blog แล้วครับ

หายไปนานกว่า 2 อาทิตย์กว่าได้ จริง ๆ ช่วงที่ผ่านมา เที่ยวไปทั่ว แต่มาช่วง 2-3 วันนี้เพิ่งได้อยู่กับที่ซะที

โดยส่วนตัวเพิ่งซื้อ Notebook ตัวใหม่มาไม่นาน ใช้มาได้สัก 1 เดือนครึ่งแล้ว ถ้าใครเข้าไปอ่านใน MySpace ที่เมนูด้านบนก็จะเห็นว่าตอนนี้เปลี่ยนเครื่องแล้ว ตอนนี้ใช้ ThinkPad Z61t อยู่ โดยรวมถือว่า ok เลย ให้ชื่อมันเป็น HoffmanV2 (อย่างกับไอ้มดแดง ฮ่า …. ) อยากได้ Thinkpad จอ Wide มานานแล้ว เพราะว่าใช้ IDE หลายตัวที่มี Tools ที่กินเนื้อที่ด้านข้่างจอมาก ตัวนี้ได้ 14.1 Wide มีขนาด Resolution ที่ 1,440 x 900 ถือว่าดีมาก

ตัวถังด้านนอกเป็น ABS Plastic และด้านในเป็นโครง Magnesium alloy เพิ่มความแข็งแรงดีมากเลย คือเครื่องมันบางอยู่แล้ว พับจอแล้วหนาประมาณ 1 นิ้วได้ แล้วเป็นฝา Titanium ด้วย น้ำหนักก็ 2.1kg เท่านั้น ก็เบากว่าตัวเก่าครึ่งโลได้ อ่อ เรื่องฝา Titanium เนี่ยถ้าใครมีอาการลอกจากการที่ตัวเคลือบกันลื่นหรือบางคนเรียกว่าตัวกันลอยลอก ซื้อถามช่างแล้วน่าจะเกิดจากการ QC มาไม่ดีของ Cover ที่ใช้สารเคลือบที่ไม่ทนต่อสารเคมีต่าง ๆ  ก็สามารถนำไปเปลี่ยนได้ที่ ศ. IBM ตรงรถไฟฟ้าสถานีอารีย์ได้เลยครับ  ไม่เสียค่าใช้จ่ายในการเปลี่ยน (แต่เสียค่าเดินทาง) ตอนนี้รับเปลี่ยนอยู่ครับ เพราะว่าตัวที่ติดมากับเครื่องบางเครื่องจะมีปัญหานี้อยู่ ตอนนี้ผมใช้ตัวฝาตัวใหม่ที่แก้ปัญหาเรื่องฝา Titanium ลอกแล้วถือว่า ok เลยครับผม

ส่วนอื่น ๆ ก็ยังคงความเป็น ThinkPad เหมือนเดิม อีกอย่างคือได้แบตแบบ 7 Cell มาซึ่งมันยื่น ๆ ออกจากตัวเครื่อง คือถ้าเอาไว้ใช้งานแบบนาน ๆ ก็ ok นะ ใช้ได้ประมาณ 3 ชั่วโมงครึ่ง แต่อยากได้แบบ 4 Cell มากกว่าตอนนี้เพราะว่ามันพอดีกับเครื่องถือง่ายกว่า แต่ว่าตอนนี้หาซื้อไม่ได้ เพราะว่าแบตตอนนี้ถือเป็นวัตถุระเบิดไปแล้ว -_-‘  การนำเข้าเลยลำบากครับ แบตรุ่นใหม่ ๆ ที่นำเข้าเลยติดด่านนำเข้า ช่วงนี้เลยนำเข้าไม่ได้ ใครแบตเสียหรือส่งเคลมเรื่องแบตก็ตรวจสอบกันหน่อยนะครับ ว่ามีของหรือเปล่า

ส่วนเรื่องการประมวลผล Core 2 Duo 1.6GHz นี่เร็วกว่า Pentuim M 1.3GHz ตัวเก่า ประมาณ 4-5 เท่าได้เลย ทดสอบด้วยการแปลงไฟล์ภาพยนต์จากแผ่น DVD หลาย ๆ เรื่องที่ตัวเองมีตัวเก่าใช้เวลา 5-6 ชั่วโมง แต่ตัวใหม่นี่ เฉลี่ยที่ 1 ชั่วโมงนิดๆ เท่านั้น แถมตอนแปลงไฟล์ภาพยนต์ก็ยังทำงานอย่างอื่นไปได้อย่างราบรื่น เพราะตัวโปรแกรมแปลงไฟล์นั้นมันรองรับแบบ MultiThread ตอนแปลงไฟล์มันเลยใช้ Core CPU ทั้งสอง Core ที่โหลดประมาณ 50 – 70% ตลอด เลยมีพอในการใช้งานได้เรื่อย ๆ (ถือเป็นข้อดีของ CPU แบบ Dual Core) ก็แน่หล่ะ สองหัวดีกว่าหัวเดียว ฮ่า … อีกอย่างคือเพิ่ม RAM มาเป็น 1.5GB แล้ว แต่จริง ๆ ไปงาน Commart อยากได้อีกแถมเป็น 2GB แต่รอก่อนแล้วกัน ช่วงนี้เงินไม่ค่อยมีเอาไว้มีแล้วค่อยซื้อแล้วกัน ถึงแม้ว่าช่วงนี้ RAM จะถูกจัด ๆ ก็ตามทีก็เหอะ ตอนนี้ก็มีความสุขดีกับ HoffmanV2 ;)

แล้วช่วงสิ้นเดือนที่แล้วก็ไปเชียงใหม่ไปเที่ยวแล้วไปเคลียร์ปัญหานิดหน่อยแค่ 2 วันแล้วก็กลับไปพิษณุโลกต่อไป ไปเคลียร์งานนิดหน่อย แล้วก็กลับนครสวรรค์ แล้วก็ไปๆ กลับๆ พิษณุโลก เพราะต้องไปเอาใบรับรองการจบการศึกษาและ Transcript สรุปเกรดจบก็ได้ 2.86 ถือว่า ok แต่ก็นะ นั่งปรับปรุง Resume ให้กระชับขึ้น เพราะต้องเอาไว้ใช้งานในอนาคตแน่นอน เฮ้อ …… สนุกสนานครับ

ช่วงนี้ปรับพื้นด้าน Database ใหม่หลายส่วนที่ยังอ่อนอยู่ เพราะได้งานในตำแหน่ง DBA (Database Administrator) มา จริง ๆ รับตำแหน่งส่วน Software Developer Consult อีก ก็น่าจะพอสมควรกับงานที่ได้รับมา เริ่มงานก็วันที่ 1 เดือนหน้า ตอนนี้ของฝึกฝีมือก่อน ;)

มีคนถามมาเยอะเมื่อไหร่ PHP Framework จะได้เริ่ม Release เสียที ต้่องบอกเลยว่าทำการ ปรับโครงสร้างใหม่หมดเลย พอดีว่าจากตอนแรกจะเอาให้มันคล้าย ๆ กับ RoR มาที่สุด แต่ไปๆ มาๆ ไม่เอาดีกว่า ทำให้เหมือนมันก็ทำได้ แล้วทำไปทำไม CakePHP มันก็เหมือนกัน เลยมองว่าไปซ้อนทับตลาดกัน ตอนนี้เลยปรับเปลี่ยนเล็กน้อย โดยเพิ่มแนวคิดแบบ Zend Framework และแนวคิดแบบ .Net Framework เข้ามาผสมด้วยคือตัว Framework ทั้งสองแบบมันเป็น Component-based ส่วน RoR และ CakePHP มันเป็น Automate + MVC-based ใครเคยเขียนพวก .NET Framework อย่าง VB.NET หรือ C#.NET คงนึกภาพออก ประมาณว่าคุณอยากใช้อะไรก็เอา Component มาใส่ ตัว Tools มันหาให้ แต่คุณเลือกเองว่าจะใช้อะไร มันไม่ automated ให้ทั้งหมด แล้วมาปรับแต่งตามงานที่ต้องการแทน แล้วก็โครงสร้างระบบก็ต้อง Design เอง หลายคนที่มีการวางแผนในการพัฒนาระบบที่ดี และต้องการอิสระจะชอบแบบนี้ แต่ว่าถ้าใครออกแบบและวางแผนไม่ดี ซอฟต์แวร์ที่สร้างมันห่วยลงไปในทันที เค้าเลยมีการสร้าง Pattern และ Framework มาครอบมันอีกทีให้มันมีตัวชี้นำว่าควรจะทำอะไร เพื่อทำให้ซอฟต์แวร์ของเรามีรูปแบบ และโครงสร้างที่ชัดเจนและไม่เละ ซึ่งถ้าใครอยากทำอะไรที่ง่าย ๆ และมีแนวทางมาให้บ้างในการพัฒนาซอฟต์แวร์ก็จะชอบ Framework ที่มี Pattern มาให้แล้ว ก็อย่าง RoR หรือ CakePHP ที่เป็น MVC Pattern ซึ่งตัวโครงสร้างและระบบที่ใส่มาให้นั้นก็เพียงพอในงานพื้นฐานและระดับกลาง ส่วนถ้าต้องการขั้นสูงก็ต้องเขียนเพิ่มและ plug เข้าไปในระบบ ที่เรียกว่าการทำ plugin หรือ addon เพิ่ม แต่ส่วนใหญ่มักจะไม่ค่อยได้ใช้เท่าไหร่ ตอนนี้เลยปรับโครงสร้างใหม่ให้รับแนวคิดทั้งสองส่วนเข้ามาด้วยกัน พยายามให้สามารถรองรับกับ Zend Framework Conponent ด้วย น่าจะทำให้สามารถนำ Component ดีๆ จาก Zend มาใส่ได้ พยายามจะให้มัน enable ตัว Component ง่าย ๆ อาจจะใช้ XML เป็นตัว config เพราะคิดต่อไปอีกว่าพอมันเป็น XML แล้ว กะจะทำตัว Desktop App สำหรับดึงตัว XML มา config บน Windows UI ได้เลย คงเหมาะกับคนที่ไม่ชอบไปมึนงง กับ tag XML เท่าไหร่ แหม ช่วงนี้ idea พุ่งจริง ๆ เรา ฮ่า ….. แล้วที่ทำตอนนี้เลยคือตัว DB Adapter ใน PHP ที่จะทำเป็น ORM (Object Relational Mapping) แบบเดียวกับ ActiveRecord ใน RoR ตอนนี้มีหลายตัวใน PHP ที่น่าใช้ แต่ส่วนใหญ่รองรับ PHP5 ทั้งนั้น เลยกะว่าจะ Port มาลง PHP4 ด้วย ไม่รู้จะรอดหรือเปล่าเนี่ย แต่ตอนนี้เอาประมาณนี้ก่อนแล้วกันนะ ;)

การทำ Read more ใน entry หรือ post สำหรับ blog หรือลักษณะคล้าย ๆ กัน (Ruby และ PHP)

พอดีว่าลองเขียน blog ใน RoR แล้ว ลองทำ Read more ใน entry ดู คนที่เขียน Blog อยู่คงรู้ว่าการเพิ่ม Read more ใน entry นั้น ทำได้โดยใส่ comment ชื่อ more หรือ <!– more –> ซึ่งเราจะมาดู concept มันก่อนดีกว่า โดยตัวอย่างผมจะอ้างอิงกับภาษา Ruby และ PHP (เอาด้วย เพราะเป็นภาษาที่ถนัดที่สุด และเป็นภาษาหากิน ฮ่า …… )

Concept ก็คือ ข้อมูลของเรานั้น เป็น String และ String คือ Array ของ Charactor (ตัวอักษรมาเรียงต่อกัน) การตัดสาย String ออกมานั้นก็เหมือนกับการ Slice Array ออกมา หรือบางคนอาจจะเรียกกว่าการ Sub-String ก็ไม่ผิดนัก สิ่งที่เราต้องรู้ก่อนเสมอคือตำแหน่งของ comment more ว่าอยู่ที่ index ในของ Array ของ Charactor (หรือสาย String) แล้วทำการ Sub-String ญ. ตำแหน่งเริ่มต้น ( index ที่ 0 ) ไปจนถึงตำแหน่งที่ comment more อยู่


Ruby

# เรากำหนด body เป็นตัวแปรที่เก็บ String ยาว ๆ หนึ่งสาย
# แล้วเราทำการหา <!– more –> ใน body ว่ามีหรือไม่
# โดยใน method "index" แล้วใส่ค่าที่ต้องการหาลงไป นั้นคือ "<!– more –>"
# สิ่งที่ได้ออกมานั้นต้อง convert เป็น integer นิดนึง
# เพื่อให้มันเปรียบเทียบได้ด้วย to_i

index_more = body.index("<!– more –>").to_i
if index_more == 0 then
    # ถ้าไม่มี "<!– more –>" ก็ส่งสาย String ออกมาทั้งหมด
    puts body
else
    # ถ้ามี "<!– more –>" ก็ Sub-String เสีย
    # ณ. ตั้งแต่ตำแหน่งที่ 0 ถึงตำแหน่งที่ "<!– more –>" อยู่

    puts body[0, index_more]
end


PHP

// เรากำหนด $body เป็นตัวแปรที่เก็บ String ยาว ๆ หนึ่งสาย
// แล้วเราทำการหา <!– more –> ใน $body ว่ามีหรือไม่
// โดยใช้ function "strpos" แล้วตัวแปรที่เก็บ String
// และใส่ค่าที่ต้องการหาลงไปใน นั้นคือ "<!– more –>" ลงไป

$index_more = strpos($body, "<!– more –>");
if($index_more == 0){
    // ถ้าไม่มี "<!– more –>" ก็ส่งสาย String ออกมาทั้งหมด
    echo $body;
}
else {
    // ถ้ามี "<!– more –>" ก็ Sub-String เสีย
    // ณ. ตั้งแต่ตำแหน่งที่ 0 ถึงตำแหน่งที่ "<!– more –>" อยู่
    // โดยการ Sub-String ก็ใช้ function "substr"

    echo substr($body, 0,$index_more);
}

บทความ OOP in PHP ตอนที่ 1 สำหรับลงใน ThaiAdmin Magazine เสร็จแล้ว เย้ …….

กว่าจะเขียนเสร็จเล่นเกือบตาย ไม่ใช่ว่ามันยากหรืออะไรหรอกครับ แต่ว่าการอธิบายให้ดูง่าย ๆ นี่มันทำยากกว่ามาก ๆ แถมการใช้ศัพท์ใด ๆ ต้องคิดถึงคนที่ไม่รู้ด้วยเป็นทุน ไม่งั้นมันจะส่งสารให้กับคนอ่านยากลำบากมาก โดยในบทความพยายามที่จะไม่ยัดศัพท์ทางเทคนิคใน OOP ลงไปแต่จะอาศัยการคำพูดไทย ๆ ที่เปรียบเทียบให้เห็นแล้ววงเล็บศัพท์เทคนิคตรงนั้นไป แล้วพยายามเอาเรื่องใกล้ ๆ ตัวมาอธิบายให้รูปแบบ OOP แทน ค่อย ๆ สอนเป็นขั้นเป็นตอน อะไรที่มันดูยาก ๆ อธิบายยาว ๆ ก็ตัดออกไปก่อนอย่าง Polymorphism นีไม่อธิบายเลย เอาหลัก ๆ 3 ส่วนพวก Abstract Data type, Encapsulation และ Inheritance ให้เห็นภาพก่อน แล้วค่อยเอาเรื่องยาก ๆ โดยมีการใช้ภาพประกอบอยู่หลายส่วน และนำเอาเรื่อง Object Model และ Reference Variable กับความสัมพันธ์ของ Object มาพูดด้วยโดยอาศัยหลักการ Object แท้ ๆ ในระดับล่างว่ามันทำงานอย่างไร เพื่อให้เห็นภาพว่าการที่เรา initialized แล้วมันเกิดอะไรขึ้นบ้าง แล้วไอ้ตัวแปรที่เป็น Object ตัวนั้นน่ะ จริง ๆ แล้วมันก็แค่ชื่อตัวแปร แต่ตัว Object จริง ๆ มันอยู่ในหน่วยความจำอีกทีหนึ่ง อะไรแบบนี้ เพราะไม่งั้นจะสับสนว่ามันก็แค่ตัวแปรตัวหนึ่ง แต่จริง ๆ แล้วมันมีอะไรมากกว่านั้น อ่อ ลืมไปว่าในนั้นก็ใส่เรื่องการส่ง Message ระหว่าง Object ลงไปในนั้นด้วย คงประมาณนี้ มีเขียน Hello World และให้ดูความแตกต่างว่าได้ Object มา 2 ตัวมันทำงานแตกต่างกันได้อย่างไร อะไรประมาณนี้ คงต้องอ่านในนิตยสารเอาหล่ะครับ ;) เพิ่งส่งให้ตอนเย็นนี้เอง แล้วเจอกันในนิตยสาร ThaiAdmin เล่ม 1 วันที่ 8 กุมพาพันธ์ 2550 นี้นะครับ ที่งาน Com world ครับ