FindBy{table field}($q)

เมื่อก่อนใช้ Doctrine สำหรับคุยกับฐานข้อมูลข้างหลัง ใช้สะดวกดี แต่มีอยู่ฟังก์ชั่นที่สงสัยว่ามันทำยังไง คือ $doctrineObj->findBy{Table Field}('something') แต่ช่วงนั้นก็ได้แต่สงสัยว่ามันทำยังไง วันนี้เลยลองไปนั่งหาวิธีเล่นๆ ก็พบว่ามันใช้ PHP Magic Method อยู่ด้านหลัง (แอบนึกว่ามันถึกสร้าง method มาให้หมด) ที่ชอบคือมันดูเป็นภาษามนุษย์มากขึ้น อ่าน method แล้วเข้าใจทันที

คราวนี้ต้องมาเขียนอะไรเล่นกับ WordPress เลยลองเอาใช้ดูบ้าง อาจจะได้เอาไว้ใช้งานต่อๆ ไปด้วย :P ขั้นแรกก็สร้างคลาสพื้นฐานกันก่อน
Continue reading

PHP Magic Method __call

<?php
class Foo {
    public function __construct() {}

    public function __call($method, $args = null) {
        $msg = "You're asking me for method";
        return ($args == null) ? "$msg '$method'" : "$msg $mothod with arguments $args";
    }
}

$foo = new Foo();
echo $foo->hello(); // You're asking me for method 'hello';
echo $foo->hi('sitdh'); // You're asking me for method 'hi' with arguments 'sitdh'

10 เรื่องที่อยากทำปี 2554

มีหลายเรื่องที่อยากทำเหมือนกัน แต่ว่าเอาเรื่องเด่นๆ ที่อยากได้ทำจริงๆ ดีกว่า

  1. HTML5 เป็นอย่างแรกที่นึกขึ้นได้จริงๆ ถึงแม้ว่ามันจะไม่ได้ออกมาเป็นมาตรฐานอย่างเต็มตัวแต่ว่าก็ใช้กันค่อนข้างอย่างแพร่หลายแล้ว ซึ่งนอกจาก HTML5 เอง ก็คงต้องเป็น CSS3 + JavaScritp (ให้มากกว่านี้มาก)
  2. Scala & RoR ความจริงแล้วปีนี้ก็ตั้งใจไว้เหมือนกันจะอ่าน 2 ภาษานี้ แต่จนแล้วจนก็ยังไม่ได้เรียนสักที ปีนี้เลยกะว่าอย่างน้อยก็ให้ได้สักภาษาใดภาษาหนึ่งแล้วกัน
  3. หัดขับรถ (สักที) คงต้องหัดขับไว้ก่อน ถึงรถจะยังไม่มีก็ตาม แต่คงยังไม่สอบใบขับขี่แน่ๆ ขอแค่ให้ขับเป็นก่อนแล้วกัน
  4. หาข้อมูลเรียนต่อ ป.โท เรื่องนี้เป็นเรื่องที่บอกพี่หัวหน้าไว้ตั้งแต่ตอนเข้าทำงานปีแรกๆ จนตอนนี้ก็ยังไม่ได้เรียนต่อโทสักที อีกอย่างคงต้องเป็นทุนคนอื่นด้วย ถ้าจะให้จ่ายเองก็ยังดีกว่า ฮาๆ (แอบงง)
  5. Java ขั้นสูง ถึงทุกวันนี้จะทำงานโดยใช้ Java เป็นหลัก แต่ยังคิดว่ารู้จัก Java แค่ผิวเผิน เพราะรู้สึกว่าภาษาของผมนี่เป็นแบบครูพักลักจำจริงๆ ทำให้อยากรู้จักกับโครงสร้างและการทำงานของ Java ให้ดีมากขึ้นกว่านี้
  6. Cocoa and Cocoa Touch ปีนี้ถือได้ว่าเป็นปีที่อ่าน Objective-C ได้มากที่สุดตั้งแต่ตั้งใจมาเมื่อ 2 ปีที่แล้ว ได้ลองเขียนโปรแกรมลงมือถือมากขึ้นและกำลังจะต้องกลายมาเป็นส่วนหนึ่งที่ต้องทำในงานหลักด้วยจากเดิมคิดว่าน่าจะเป็นของเล่นตอนว่างๆ เท่านั้น แต่พอลองจับมันจริงๆ จังๆ ก็รู้เลยว่ามันสนุกดีแฮะ ถ้าเทียบกับเขียนโปรแกรมบน Android แล้ว รู้สึกได้เลยว่าการเขียนโปรแกรมบน iOS ใช้พลังงานน้อยกว่าอย่างเห็นได้ชัด
  7. หาอาชีพเสริม (สักที) เพราะปีนี้เริ่มจัดงานกับเวลาได้ลงตัวมากขึ้นแล้ว เลยอยากลองหาอาชีพเสริมทำอยู่เหมือนกัน คงไม่พ้นงานที่เกี่ยวกับการเขียนโปรแกรมนี่ล่ะนะ ก่อนหน้านี้ที่ยังไม่เคยรับงานนอกก็เพราะคิดว่ายังไม่กล้าบอกใครได้อย่างเต็มปากเต็มคำว่าเก่งอะไรกันแน่ ส่วนปีนี้ที่อยากลองรับดูบาง แค่อยากลองก็เท่านั้น คงเป็น WordPress, iOS Dev., Web Application (PHP) ไม่พ้นพวกนี้ล่ะ
  8. อ่านหนังสือให้หมด ปีที่ผ่านมานี้รู้สึกว่าตัวเองบ้าซื้อหนังสือมาก 10  กว่าเล่มเห็นจะได้ ทั้งแบบ Hard Copy แล้วก็แบบ e-book ซึ่งส่วนใหญ่แล้วจะซื้อมาอ่านเพื่อบนมือถือซะมากกว่า ทำให้ตอนนี้เล็งๆ iPad 2 ไว้เหมือนกัน เฮ้ออ เสียเงินอีกแล้ว :)
  9. เรียนภาษาเพิ่ม ปีนี้เป็นปีที่รู้สึกดีกับภาษาตัวเองมาก เพราะอ่านและฟังภาษาอังกฤษตอนนี้ถือว่าใช้ได้แล้ว ผิดกับแต่ก่อนที่จะอ่านส่วนฟังนี่จะจับใจความได้ประมาณ 40-50% ส่วนตอนนี้ก็เริ่มฟังเข้าใจประมาณ 80-90% แล้ว ส่วนเรื่องพูดกับเขียนนี่ยังไม่ดีเท่าทีควร ต้องของคุณ Podcast ทั้งหลายที่โหลดมาฟังจริงๆ
  10. ไปเที่ยวคนเดียว ดูรายการ “หนังพาไป” แล้วอยากลองไปเที่ยวคนเดียวดูเหมือนกัน คงเริ่มต้นด้วยการเที่ยวในประเทศคนเดียวนี่ล่ะ แล้วค่อยๆ ลามไปประเทศเพื่อนบ้านเล็งๆ เขมรกับลาวก่อนเลย แล้วค่อยไปประเทศแถวๆ เอเชียนี่ล่ะ แต่ก่อนอื่นก็คงต้องไปทำ Passport ให้ได้ก่อน

Unix Environment Variables

เรื่องหนึ่งใน Linux และ Linux Clone ที่สำคัญ คือ การเพิ่ม Environment Variable เป็นวิธีที่ทำให้ผู้ใช้สามารถสร้างตัวแปรขึ้นมาให้ OS รู้จัก จากนั้นจึงใส่ค่าที่ผู้ใช้ต้องการลงไป ส่วนมากค่าในตัวแปรมักจะเป็น path ที่ชี้ไปยังไดเร็คทอรี่ตามที่ต้องการ ประโยชน์เพื่อให้สามารถอ้างค่านี้ได้จากทุกที่ใน Terminal ซึ่งนั้นก็ช่วยทำให้ลดความผิดพลาดในการพิมพ์ทุกครั้งที่จะใช้งานได้ อีกส่วนหนึ่งเป็นการสะดวกสำหรับการนำไปใช้ในกรณีอื่นๆ เพราะผู้ใช้เพียงแค่เปลี่ยนค่าของตัวแปรเท่านั้นไม่จำเป็นต้องเปลี่ยนค่าทุกๆ ที่ที่มีการอ้างถึง

การสร้าง Environment Variable มีอยู่ด้วยกัน 2 วิธี ได้แก่

  1. วิธีการสร้างตัวแปรแบบชั่วคราว วิธีการนี้จะมีผลเฉพาะกับ Terminal ที่เราใช้งานใน session นี้เท่านั้น เพียง Terminal เดียว ไม่ส่งผลไปยัง Terminal อื่น ซึ่งแน่นอนว่าหากปิด Terminal ที่สร้างค่านี้ขึ้นมา ค่าดังกล่าวจะหายไปทันที วิธีการสร้างนี้ ทำได้โดยใช้คำสั่ง “export” ที่ shell prompt ดังนี้

    $ export ANDROID_HOME="/path/to/android_sdk_2.3"
    $ export PATH=$PATH:$ANDROID_HOME/platform-tools

    จากตัวอย่างด้านบน ($ หมายถึง shell promt) คือการสร้างตัวแปรชื่อ ANDROID_HOME ขึ้นมา (ชื่อตัวแปรขึ้นอยู่กับว่าเราจะกำหนด) จากนั้นกำหนดค่าให้เป็น “/path/to/android_sdk” ซึ่งเป็น absolute path ชี้ไปยังไดเร็คทอรี่ที่เก็บ Android SDK ภายในเครื่องเรา และบรรทัดถัดมาคือการทำให้เราสามารถใช้คำสั่งต่างๆ ที่อยู่ภายในไดเร็คทอรี่ platform-tools ได้โดยไม่ต้องอ้างด้วย absolute path ตลอดเวลา โดยการเพิ่มค่า “/path/to/androd_sdk_2.3/platform-tools” ต่อท้ายค่าในตัวแปร PATH ซึ่งตัวแปร PATH เป็นตัวแปรของ OS เมื่อเราใช้คำสั่งต่างๆ เช่น ‘ls’ OS จะไปค้นหาคำสั่งเหล่านั้นตามค่า (ไดเร็คทอรี่) ที่ระบุไว้ในตัวแปร PATH ซึ่งหากต้องการเพิ่มมากกว่า 1 ชุด ให้ค่ันด้วยเครื่องหมาย “:” เพื่อเป็นการแบ่งชุดข้อมูลที่ต้องการเพิ่มเข้าไปในตัวแปร PATH ซึ่งเครื่องหมายนี้จะต่างกันไปตาม OS เช่น Windows จะใช้เครื่องหมาย “;” สำหรับคั่นชุดข้อมูล

  2. วิธีการสร้างตัวแปรแบบถาวร จะว่าถาวรก็ไม่ถูกนักเพราะเราสร้างมารถแก้ไข และสั่งเปลี่ยนแปลงค่าของตัวแปรนั้นได้ตลอดเวลา วิธีการนี้ต่างจากวิธีการด้านบนคือค่าที่กำหนดจะคงอยู่เสมอถึงแม้จะปิด Terminal ไปแล้วก็ตาม นอกจากนั้นยังส่งผลไปกับทุกๆ Termimal อีกด้วย ซึ่งวิธีการคือเพิ่มคำสั่งด้านบนในข้อ 1 เข้าไปในไฟล์ .profile (อยู่ที่ home directory – ~/.profile) แต่หากไฟล์นี้ไม่มีก็ไม่ต้องตกใจ เพราะเราสามารถสร้างมันได้ ด้วยคำสั่ง

    $ touch ~/.profile

    คำสั่งด้านบนเป็นการสร้างไฟล์ชื่อ .profile ขึ้นภายใน home directory หากใช้คำสั่ง ‘ls’ จะไม่เห็นไฟล์นี้ เนื่องจากไฟล์ที่ขึ้นต้นด้วยเครื่องหมาย ‘.’ จะถูกซ่อนไว้ หากต้องการให้แสดงไฟล์ .profile ให้เพิ่ม ‘-a’ ต่อท้ายลงไปเพื่อแสดงไฟล์ทั้งหมด

    $ ls -a ~

    จากนั้นก็เลือก editor ที่เหมาะมือสักตัวเอามาช่วยในการแก้ไขค่าไฟล์ “.profile” โดยการแก้ให้เพิ่มค่าด้านล่างนี้ลงไป (ตัวอย่างเท่านั้น เปลี่ยนแปลงได้ตามชอบใจ)

    ANDROID_HOME="/path/to/android_sdk_2.3"
    PATH=$PATH:$ANDROID_HOME/platform-tools

    ผลลัพธ์ที่ได้จาก script ด้านบนจะเป็นเหมือนกับวิธีการในข้อ 1 หากแต่ต่างกันที่วิธีการด้านบนสามารถอ้างถึงค่า $ANDROID_HOME ได้ทันที แต่สำหรับข้อ 2 นี้ จำเป็นต้องสั่งเปลี่ยนแปลงค่าโดยอาศัยค่าที่อยู่ภายใน .profile ด้วยคำนั่ง source ดังนี้

    $ source ~/.profile

    โดยที่การใช้คำสั่ง source นี้ ทำเมื่อต้องการสั่งให้ปรับปรุงค่า Evironment Variable ที่กำหนดไว้ในไฟล์ .profile โดยที่ครั้งต่อไปหากเราเปิด Terminal ขึ้นมาใหม่ ค่าที่กำหนดไว้ใน ~/.profile ก็จะถูกอ่านขึ้นมาอัตโนมัติ

หลังจากข้อ 1 หรือ ข้อ 2 (ควรเลือกวิธีใดวิธีหนึ่งสักวิธี มิเช่นนั้นจะงงเอง) สามารถทดสอบการใช้คำสั่ง adb (เป็นคำสั่งที่อยู่ภายใน Android SDK) หากถูกต้องจะได้ผลดังรูป

ADB Command

วิธีการแชร์สัญญาณอินเทอร์เน็ตสำหรับ OS X

พอดีว่าช่วงนี้ยกเลิกเน็ตที่หอไป (เนื่องด้วยเพราะความห่วยของบริษัทที่ดูแลเน็ตเวิร์ค) ตอนนี้เลยเปลี่ยนมาใช้มือถือหรือไม่ก็ 3G Aircard แทน แต่เพราะว่าในห้องมีอุปกรณ์หลายอย่างที่อยากใช้อินเทอร์เน็ตบ้าง ก็เลยหาวิธีแชร์สัญญาณอินเทอร์เน็ตตามนี้

  1. เริ่มแรกด้วยการเข้าไปที่ System Preferences ในส่วนของ Internet & Wireless ให้เลือก Sharing
  2. System Preferences

    System Preferences

  3. ในหน้า Sharing ให้เลือก ที่หัวข้อ Internet Sharing (สังเกตที่รูปกุญแจด้านล่างด้วย หาก lock อยู่ให้คลิ้กและใส่รหัสไปก่อนเพื่อปลดล็อคให้เป็นเหมือนในรูป)
    Internet Sharing

    Internet Sharing

    จะมีตัวเลือกอยู่ 2 ส่วนที่ต้องทำความเข้าใจคือ

    • Share your connection from: จุดเชื่อมต่อหลักที่รับสัญญาณอินเทอร์เน็ตเข้ามาเพื่อแชร์ออกไปให้กับอุปกรณ์อื่น ในกรณีนี้ผมต้องการแชร์สัญญาณจาก Ethernet Adapter (สายแลน) ผ่านทาง AirPort (Wi-Fi) ตัวเลือกนี้เลยกลายเป็น “Ethernet Adapter” โดยที่ตัวเลือกนี้จะเป็นรายการการเชื่อมต่อที่เครื่องรู้จักในส่วนของ Network (System Preferences > Network)
    • To computer using: คือ Connection ที่เราต้องการกระจายสัญญาณออกไป ในที่นี้ผลเลือกเป็น AirPort เพราะต้องการกระจายสัญญาณออกไปแบบ Wi-Fi
  4. แต่ถ้าไม่ต้องการให้คนอื่นมาขโมยเน็ตเราใช้ด้วยก็ให้เข้าไปที่ AirPort Options เพื่อกำหนดชื่อและรหัสผ่านของ Network ที่เราสร้างขึ้น

    AirPort Options

    AirPort Options

  5. จากนั้นคลิ้กที่ตัวเลือก “Internet Sharing” ในช่องทางฝั่งซ้ายมือเพื่อเริ่มต้นการกระจายสัญญาณ โดยที่ไอคอนรูปสัญญาณ Wi-Fi เราจะเปลี่ยนไป

    Internet Sharing turn on

    Internet Sharing turn on

  6. สุดท้ายให้ไปที่อุปกรณ์ที่เราต้องการแล้วหา Network ชื่อ Zodiac และใส่รหัสผ่านตามที่ได้ตั้งไว้ในข้อ 3 ซึ่งในตัวอย่างนี้ผมใช้กับมือถือจะเห็น Network ที่ชื่อว่า Zodiac โผล่ขึ้นมา โดยมี IP Address ดังรูป
    Zodiac

    Zodiac

    IP Address

    IP Address

เขียนไว้กันลืม

ทดสอบด้วย

  • OS X 10.6.5
  • iPhone 4

ซ่อน/แสดง package เปล่า

เปลี่ยนมาใช้ eclipse ได้สักพัก เหตุผลก็เพราะพื้นที่หน้าจอที่กว้างกว่า NetBean เอามากๆ เลย ซึ่งทั้ง 2 ตัวนี้มันก็มีข้อดีข้อเสียต่างกันไป ถ้าเอา feature ทั้งหลายมารวมกันได้ก็จะดีไม่น้อย

ส่วนที่เจอนี่เข้าใจว่าจะเจอกันนานแล้ว (แต่ตอนใช้เวอร์ชั่นก่อนๆ นี้ไม่เป็น – ตอนนี้ใช้ Helios อยู่) ที่ eclipse จะแสดง package ว่างๆ ส่วนตัวแล้วมันรกหูรกตา เลยต้องหาทางซ่อนมันจนได้

Empty Packages

Empty Packages

ซึ่ง ปัญหานี้แก้ได้ง่ายมาก โดยให้ไปเลือกที่เมนู filter ของ package explorer (สามเหลี่ยมชี้ลงตรงมุมขวา) ถ้าเคยใช้มาแล้วก็จะมีประวัติการใช้งาน (1 และ 2) ดังเมนู

Filter

Filter

จากนั้นจะมีตัวเลือกขึ้นมาแสดง ในกรณีนี้ผมเลือกคลิ้กที่ “empty packages” และ “empty parent packages” เพื่อซ่อน package เปล่าๆ

Java Element Filters

Java Element Filters

กด OK แล้วเราจะได้หน้าจอที่หล่อขึ้นแบบนี้

Package Filtered

Package Filtered

Apache + PHP สำหรับ OS X

ก่อนหน้าผมเคยลง MAMP เพื่อใช้ Apache, PHP และ MySQL เหมือนกัน แต่เพราะว่าต้องลงโปรแกรมอื่นๆ ร่วมด้วย อย่างเช่น Xcode ที่มีขนาดใหญ่เอาเรื่องอยู่เหมือนกัน พอมีโอกาสได้ format เครื่องใหม่ ก็เลยหาวิธีอื่นเอาส่วนที่ไม่จำเป็นออกไปบ้างที่กว่า

เท่าที่ได้หาข้อมูลพบว่าใน OS X (ที่ใช้คือ 10.6.4) มี Apache และ PHP ติดมากับเครื่องเป็นที่เรียบร้อยแล้ว เพียงแค่ยังไม่ได้เปิดใช้งานเท่านั้น ดังนั้นหน้าที่ของเราคือ เปิดการใช้งานซะ

  1. อย่างแรกที่ต้องทำคือทำให้ Apache และ PHP รู้จักกันซะก่อน ซึ่งโดย default แล้ว จะไม่รู้จักกัน วิธีง่ายๆ คือไปที่ไฟล์ ‘/private/etc/apache2/httpd.conf’ จากนั้นเอาเครื่องหมาย ‘#’ ที่บรรทัด 115 ออกเพื่อให้ Apache โหลดโมดูล PHP5 ขึ้นมาเมื่อเริ่มทำงาน
    เปิดการใช้งาน PHP Module

    เปิดการใช้งาน PHP Module

  2. ในไฟล์เดียวกันนี้เอง (‘/private/etc/apache2/httpd.conf’) ตรงบรรทัดที่ 167 จะเป็นตำแหน่ง DocumentRoot หากต้องการเปลี่ยนก็สามารถเปลี่ยนได้ตรงนี้ทันที แต่ในระยะยาวที่ผมชอบทำคือกำหนดค่าใน DocumentRoot ให้เป็น link ที่ชี้ไปยัง DocumentRoot ที่เราต้องการอีกทีเพื่อที่จะได้ไม่ต้องมาเปลี่ยนค่าในไฟล์นี้อีกครั้งเมื่อมีการเปลี่ยนตำแหน่งของ DocumentRoot
    DocumentRoot

    DocumentRoot

  3. สุดท้ายก็ start server ด้วยคำสั่ง apachectl
    เริ่มการทำงานของ Apache

    เริ่มการทำงานของ Apache

  4. สุดท้ายลองเขียนสคริปต์ PHP เพื่อทดสอบ
    ทดสอบสคริปต์ PHP

    ทดสอบสคริปต์ PHP

เท่านี้เราก็ได้ Server เล็กๆ เอาไว้เขียน Web app. กันแล้ว ส่วนที่เหลือคือฐานข้อมูลที่ยังไม่มีติดมากับ OS X เรื่องนี้ใครอยากได้อะไรก็แล้วถนัดเลยครับ

เครื่องมือ: Mac OS X 10.6.4, Terminal