เรื่องมันเศร้า “ข้อมูลใน notebook วันที่ 6 มิ.ย. 51 หายเกลี้ยง”

แก้ไข: จากวันที่ 7 เป็น 6 ครับ

โดยปกติผมจะ Backup ข้อมูลเป็นปกติทุกวันตอน 5 ทุ่มอยู่แล้ว ซึ่งผมกลัวจะมีปัญหาเวลา notebook ผมประสบภัยใด ๆ เช่นหายหรือโดยขโมยไป รวมไปถึง h/d พังแบบทันทีทันใด ยังมี Backup อยู่ไม่เกิน 24 ชั่วโมงอย่างน้อย ๆ ข้อมูลก็ไม่ต้องมานั่งไล่เขียนใหม่ หรือทำอะไรใหม่เท่าไหร่

มาวันนี้ได้ใช้บริการนี้แล้วครับ T_T

ด้วยเหตุที่ว่าผมจะ Recovery ตัว Notebook ซึ่งมาคราวนี้มันไม่เหมือนกับหลาย ๆ ครั้งที่ผ่านมา เพราะว่าผมเพิ่งเปลี่ยน h/d ใหม่จาก 80GB เป็น 250GB (Hitachi 5K250-250) ทำให้ระบบ Preload ของ ThinkPad มีปัญหา เพราะไม่สามารถโหลด Environment ของตัว Preload ของตัว h/d ลูกใหม่ได้ ทั้ง ๆ ที่โคลนมาทั้งหมดแล้ว ซึ่งเท่าที่ดูเกิดจาก “Corrupt Boot Sector” ทำให้โหลด Rescue and Recovery (RnR) ของ ThinkPad ขึ้นมาไม่ได้ หรือถ้าจะให้เข้าใจอีกแบบคือใช้ความสามารถของการบูตผ่าน F11 ไม่ได้นั้นเอง เพราะมันเข้าตัว Service partition ไม่ได้ (ตัว Partition ที่ถูก Hidden ไว้แล้วเป็น Preload ขนาด 4.56GB ที่รวม Windows XP SP2 , โปรแกรมแถม และ Driver ทั้งหมดไว้ภายใน)

แต่พอดีว่าผมมี Bootable DVD ที่ผมทำเตรียมไว้แล้วเพื่อการนี้ แต่พอใช้ผมก็ใช้ฟังก์ชัน restore to factory state ตามปกติ แต่มาคราวนี้มันไม่มี option ให้เลือก format c:\ แบบที่เคยทำมา ผมก็แปลก ๆ ใจ แต่อาจจะเพราะเพิ่ง upgrade ตัว RnR ไปเลยไม่มีมั้ง คงฉลาดขึ้น เลยกด Yes/OK ไป สรุปสุดท้ายมันเอา h/d entries (partition) ผมไปหมดเลย T_T เซงโคตรรรรรร

ลองใช้โปรแกรม recovery ก็ไม่ได้ครับ เพราะการทำ h/d entries ของ ThinkPad มัน Secure จัดโหลดอะไรไม่มีมาเลย -_-‘ เลยจำใจนั่งไล่เอาไฟล์ที่ backup กลับมาแทน ทำให้งานที่นั่งปรับโปรแกรมที่เขียนกันวันศุกร์หายไปเลย T_T พวกเมลต่าง ๆ ด้วย เซงขั้นรุนแรง หมดแรงเลย

ผมเลยมา focus ใหม่นั่งไล่แก้ Corrupt Boot Sector แทนดีกว่า โดยในเว็บ Lenovo มีตัว Patch แก้สำหรับงานนี้อยู่แล้วที่ Rescue and Recovery – Recovery repair diskette แต่ … มันจะบ้าเหรอ ซื้อเครื่องมาไม่มี Diskette เว้ยยยย จะให้ทำ Diskette บ้าไปแล้วเหรอ งานนี้เลยต้องใช้บริการเสริมจาก thinkpads.com Support Community แล้วก็เจอกระทู้ How to reenable the F11 function (Product Recovery Program) ข้างในมี ISO Image ของไอ้ไฟล์ในเว็บ Lenovo นั้นแหละ เห็นว่าเอามายัดใส่ ISO ทำเป็น Bootable CD แทน ผมก็เลยโหลดมาซะเลย แล้วทำการจัดการ Notebook ซะ แล้วก็สรุปว่าใช้ได้เลย !!! ตอนนี้สามารถเข้า Preload ไป Recovery ได้แล้ว แถมคราวนี้มี option format c:\ ให้ด้วยตอนที่ recovery มา สรุปแม่งอะไรเนี่ย -_-‘ ข้อมูลตรู ………….

จริง ๆ นี่คงเป็นบทเรียนเลย ถ้าอันไหนไม่แน่ใจคงตอง Backup กันไว้อีกชั้นนึง ถึงจะมั่นใจว่ามี Backup เก่าอยู่่ก็ตาม

เซงครับพี่น้อง T_T

 

ซัดอีกรอบ "ปิดเทอมใหญ่…หัวใจว้าวุ่น (Special Edition)"

หลังจากที่ไม่ได้ซื้อหนัง DVD ในรอบเดือนที่ผ่านมาด้วยสภาวะการเงินที่ช็อตกันรุนแรง ทำงานโน้นนี่จนมึน ปวดหัวกันไปข้างนึง วันนี้ก็เริ่มสบายตัวขึ้นหน่อยเลยหัวหน้าเข้าหาร้าน Boomerang อีกรอบ ครั้งนี้หนังที่ผมรอมานานก็คือ “ปิดเทอมใหญ่ หัวใจว้าวุ่น” ครับ วันที่ DVD Box-set นี้ออกก็ไม่รอช้าครับ โทรไปจองก่อนเลย และเลิกงานก็เข้าไปเอาของที่จองทันที (ผมเป็นสมาชิกกับทางร้านตั้งแต่ตอนเรียนแล้ว เพราะว่าซื้อบ่อยเพราะราคาถูกและส่งของต่างจังหวัดมี package ดีมีมาตรฐานครับ)

โดยรวมหลังจากซื้อมาแหละดูสิ่งที่อยู่ภายในแล้วเนี่ย ถือว่าสอบผ่านครับ รายละเอียดงานดีมาก ที่ผมรู้สึก ok มากครับ เลยเอารูปมาโชว์กัน ;P ส่วนอีกเรื่องคือ Coverfield ครับ เดี่ยวจะทดสอบว่าจะอ้วก หรือมึนหัวกันหนังเรื่องนี้หรือเปล่า –_-‘

P1070037 P1070038

P1070040 P1070043

P1070044 P1070045

P1070046 P1070047

P1070048 P1070050

P1070051 P1070053

P1070054 P1070055

P1070056 P1070057

 

ปัญหา Font “Lucida Grande” เป็นสี่เหลี่ยมใน Firefox 3.0 RC2

วันนี้ผมทำการ upgrade จาก Firefox 2.x มาเป็น 3.x (RC2) โดยนั่งไล่ Extension ที่ตัวเองต้องใช้ทั้งหมดแล้วรองรับหมด แต่มีปัญหาอยู่ทีว่าเข้าเว็บบางเว็บแล้วมีปัญหาดังรูปด้านล่างครับ

2008-06-05_144352

โดยผมนั่งไล่ดูตั้งแต่ extension มี conflict กับตัวตัดคำหรือเปล่าก่อนเลย แล้วตามด้วยลง remove Firefox ออกและลงใหม่ ตามด้วยใช้ Safemode ลอง Firefox ด้วย แต่ก็ยังไม่หาย T_T พอมานั่งพักสักนิด

แล้วมานั่งสังเกตเว็บที่เกิดปัญหานี้ดูโดยไล่ดู font-style ใน Firebug ของ Firefox แล้วพบว่าทุกเว็บที่มีปัญหาใช้ Font “Lucida Grande” ทั้งนั้นเลย ผมเลยนั่งดูในเครื่องผมว่ามี font ตัวนี้อยู่หรือเปล่า พบว่ามีครับ คือ Lucida Grande และ Lucida Grande Bold ครับ เลย remove ออกซะ แล้วลองใหม่ ปรากฎว่าใช้งานได้เลยครับ ไม่พบปัญหานี้อีกเลย –_-‘ น่าสนใจนะเนี่ย ไม่รู้ว่า bug ตัวนี้จะแจ้งที่ใครเหมือนกัน เดี่ยวลอง publish ตัว entry นี้เข้า twitter ดูท่าจะดีครับ ;P

 

การใช้ Object ใน PHP 4 กับ 5 ต่างกันยังไง ? (ภาค 1)

การ Initialize Object เพื่อให้ได้ Object ใน PHP 4 นั้นจะเป็นการ Pass-by-Value แต่ใน PHP 5 จะเป็นการ Pass-by-Reference แทน จากโค้ดตัวอย่างด้านล่างนี้

class userClass {
    var $data = 'Hello';
    function talk() {
        echo $this->getData();
    }
    function setData($val){
        $this->data = $val;
    }
    function getData(){
        return $this->data;
    }
}

ทำการ Initialize Object โดยกำหนดชื่อ Reference-Name ว่า $obj1

// PHP 5
// Assigned-by-Value Format
// Override operation with Assigned-by-Reference
$obj1 = new userClass();

// PHP 4
// Assigned-by-Value Format
// Used more memory
$obj1 = new userClass();

// PHP 4 same way with PHP 5
// Assigned-by-Reference Format
// E_STRIC Error in PHP 5 and Removed in PHP 6
$obj1 =& new userClass();
$obj1 --------> [OBJECT DATA]

ในการ Initialize Object ใน PHP 4 นั้น ถ้าใช้แบบทั่วไปใช้ใช้กันคือแบบ Assigned-by-Value นั้น Object ที่ถูกสร้างขึ้นมาตอน Initialize แล้วถูก copy (clone) ไปยังตัวแปรที่เราสร้างขึ้นมา ซึ่งการทำแบบนี้จะเสีย memory เพิ่มขึ้น แต่ถ้าใช้การ Initialize Object แบบ Reference กับตัวแปร object แทนการ copy (clone) ข้อมูลใส่ตัวแปรนั้น โดยต้องใช้การทำ Assigned-by-Reference แทนแบบ Assigned-by-Value โดยที่ Initialize Object เพื่อสร้าง Object จะมีการสร้างบนหน่วยความจำ แล้วมีตัวแปรไป Reference มันเพื่ออ้างอิงค่าแทน

แต่ใน PHP 5 นั้นการ Initialize Object ก็ใช้รูปแบบ Assigned-by-Value ไปเลย แบบเดียวกับ Java ซะ แต่ผลก็จะเป็นการอ้างอิงแบบ Assigned-by-Reference ไปเลยในตัว ซึ่งการทำแบบนี้นั้นรวมไปถึงการทำ Assign-Value, Return-Value และการ Pass-Parameter ด้วยเมื่อเรานำไปใช้ตามตัวอย่างด้านล่างนี้

$obj1->talk();

$obj2 = $obj1;

$obj1->talk();

$obj2->setData("Hi");

$obj1->talk();

ก็จะได้ผลของ PHP 5 คือ

Hello
Hi

โดยการทำงานนั้น $obj1 นั้นจะเรียก Method talk มา แล้วทำการ Assigned-by-Reference ให้กับ $obj2 ทำให้ต่อไปเมื่อใช้งาน $obj2 ก็จะเหมือนกับใช้ $obj1 นั้นเอง (ทั้งการแก้ไข และเรียกใช้) เพราะตัวแปรทั้งสองตัว มันอ้างอิง Memory Address เดียวกัน

$obj1 --------> [OBJECT DATA]
          |
$obj2 ----|

ส่วน PHP 4 คือ

Hello
Hello

โดยการทำงานนั้น $obj1 นั้นจะเรียก method talk มา แล้วทำการ Assigned-by-Value หรือเรียกว่า clone ให้กับ $obj2 ทำให้ $obj2 นั้นมีค่าเหมือนกับ $obj1 เพียงแต่ถ้ามีการแก้ไขค่าที่ $obj2 จะไม่มีผลกระทบกับ $obj1 เลย

$obj1 --------> [OBJECT DATA]

$obj2 --------> [OBJECT DATA]

แต่ถ้าเราต้องการ copy (clone) ค่า ใน PHP 5 ได้มี keyword เพิ่มขึ้นมาชื่อ clone ครับ

โดยเปลี่ยนการ Assigned-by-Value เพียงเล็กน้อยโดยเพิ่ม keyword ไปด้านหลังเครื่องหมาย Assigned (=) ได้ตามนี้

$obj2 = clone $obj1;

เมื่อทำแบบนี้ด้านบนก็จะเป็นการ copy (clone) ค่าให้กับอีกตัวแปรนึงให้มันไป Reference กับ Objet ที่ถูก clone ไปอีกก้อนนึงแบบเดียวกับ Assigned-by-Value แบบ PHP 4 นั้นเอง

$obj1 --------> [OBJECT DATA]

$obj2 --------> [OBJECT DATA]

จากการทำงานด้านบนจะเห็นว่าใน PHP 5 นั้นการ Pass-Parameter, Initialize Object, Assign-Value และ Return-Value นั้นจะส่งแค่ค่าของ Reference-Address ออกไปเท่านั้น ซึ่งเป็นผลทำให้ใช้ Method Chaining ไปได้เลยในตัว

ต่อมาผมทำการเพิ่ม Method เข้าไปอีก 1 ตัวเพื่อทำสอบการทำ Method Chaining

class userClass {
    var $data = 'Hello';
    function talk() {
        echo $this->getData();
    }
    function setData($val){
        $this->data = $val;
    }
    function getData(){
        return $this->data;
    }
    function chaining() {
        return $this;
    }
}

โดยการ Return ที่ตัว keyword $this นี้ออกไป การ Return-Value นี้เป็นการ Return ที่เอา Reference Address ออกมาไปส่วนต่อให้อ้างอิงกับ Address ของ Object นั้น ๆ ทำให้ใช้งาน Method ของ Object นี้ต่อไปได้เรื่อย ๆ ครับ ดังตัวอย่างด้านล่างครับ

$obj1->chaining()->talk();

ก็จะได้ผลดังนี้ครับ

Hello
Hi
Hi

ต่อมาเรามาทดสอบเรื่องการ Pass-Parameter โดยทดสอบว่ามันจะ Pass-by-Reference ถึงแม้ว่าจะ กำหนด Parameter ที่ Pass-by-Value ไว้ก็ตามที โดยในโค้ดด้านล่างนี้ ได้เพิ่ม Method prototypeMod เข้าไป โดยส่ง Object และ Value ลงไปเพื่อ Assign ค่าให้กับ Object ตัวที่ Pass-Parameter ลงไป

class userClass {
    var $data = 'Hello';
    function talk() {
        echo $this->getData();
    }
    function setData($val){
        $this->data = $val;
    }
    function getData(){
        return $this->data;
    }
    function chaining() {
        return $this;
    }
    function prototypeMod($obj, $val) {
        $obj->setData($val);
        return $obj;
    }
}

แล้วเมื่อผมนำไปใช้ก็ทำการส่ง $obj2 ลงไปแล้วตั้งค่า Hello ลงไป แล้วทำ Chaining เรียก talk ของ $obj2 ออกมาใช้งาน แล้วก็เรียก talk ของ $obj1 ด้วยเช่นกั

$obj1->prototypeMod($obj2, 'Hello')->talk();

$obj1->talk();

ผลที่ได้คือ

Hello
Hello

จะเห็นว่าถ้าเราส่ง Object ด้วยการ Pass-Parameter เข้าไปใน function หรือ method จะเป็นการ Pass-by-Reference ครับ ซึ่งต้องระวังอย่างมาถ้า upgrade จาก PHP 4 มา 5 ครับ ที่บางครั้งค่าที่ได้อาจจะแตกต่างในช่วงการทำงานครับ ต้องระวังเรื่องของ logic-error ให้ดีครับ ซึ่งถ้าคนที่ไม่เคยเขียน Programming Language พวก Java, C# หรือ VB.NET มาก่อนอาจจะงง เพราะ PHP 4 นั้น Object จะถูกเรียกว่า “objects are not any longer just ‘improved arrays’.” ซึ่งใน PHP 5 นั้นได้ลบแนวคิดนี้ออกไป ให้เป็นแบบเดียวกับภาษา Object Oriented Programming อื่น ๆ ครับ

ดังนั้นต่อไปถ้าใช้ใน PHP 5 ไม่ต้องทำการ Initialize Object แบบ Assigned-by-Reference อีกต่อไปครับ และการทำ Assigned-by-Reference ในการ Initialize Object จะใช้งานไม่ได้แล้วใน PHP 6 ด้วย โดยใน PHP 5 จะขึ้น E_STRIC Error Message ด้วยเช่นกันครับ

ปล. entry นี้เล่นซะเหนื่อยเพราะว่านั่งแก้ format ของ code ซะเมามันกับนั่งไล่ keyword ต่าง ๆ ให้มันตรงกับที่เค้าใช้กัน เพราะส่วนตัวเองก็ไม่แม่นพวก technical term บางตัวว่าใช้คำว่าอะไรเท่าไหร่ เพราะคืนอาจารย์ไปบ้างแล้ว -_-‘ (แต่รู้ว่ามันคืออะไรนะ เพียงแต่ใช้คำไม่ถูก) ถ้าส่วนไหนไม่เข้าใจก็โพสความคิดเห็นถามเพิ่มเติมกันมาได้นะครับ

เพิ่มเติม (2/6/2551 18:00)

In PHP 5 there is a new Object Model. PHP’s handling of objects has been completely rewritten, allowing for better performance and more features. In previous versions of PHP, objects were handled like primitive types (for instance integers and strings). The drawback of this method was that semantically the whole object was copied when a variable was assigned, or pass as a parameter to a method. In the new approach, objects are referenced by handle, and not by value (one can think of a handle as an object’s identifier).

และใน Zend Engine 2 ที่เป็นแกนหลักของ PHP 5 ได้ให้คำจำกัดความไว้ว่า “In the new approach, objects are referenced by handle, and not by value”

อ้างอิงจาก

 

MySQL Tunning (slideshare)

มา entry นี้เอา slide ที่ผมกะว่าจะเอาไปพูดในงาน BarCampBangkok ที่ผ่านมา เอามาลงใน Slideshare แล้วกันครับ คือเป็น slide เดียวกับที่ผมเอาไป training ในบริษัทเก่าผม ตอนผมเป็น DBA ครับ