หน้าเว็บ

วันอาทิตย์ที่ 7 มีนาคม พ.ศ. 2553

Google มีผล Real-Time Search จาก Twitter


วันนี้บังเอิญลองค้นคำว่า webos บน google.com ดูแล้วปรากฏว่าเจอผลลัพธ์การค้นหาที่มาจาก twitter ติดมาด้วย เลยขอบันทึกเก็บไว้หน่อย

เพิ่มเติม: ไปลองอ่านจากข่าวต่างๆพบว่ามันมีมานานแลว(ประมาณเดือนธันวาปีก่อน) สามารถเลือกให้แสดงได้โดยเลือกที่ Show options แล้วใต้ Any time ให้เลือก Latest แต่ว่ายังไม่รู้สาเหตุว่าทำไมบางครั้งมันไม่ต้องเลือกก็ขึ้นมาในผลลัพธ์เลยและ update อัตโนมัติด้วย (ถ้าใน Show options จะแสดงแบบ static)


วันพฤหัสบดีที่ 4 มีนาคม พ.ศ. 2553

แก้ค่า auto_increment ใน MySQL

บางครั้งในฐานข้อมูลที่มีการ set ให้มี field ที่เป็น auto_increment แต่บังเอิญเกิดเหตุการณ์ที่เราต้องไปลบ record สุดท้าย เช่น ถ้าค่าวิ่ง 1,2,3,4,5 แล้วเราลบ 5 ออก พอเราใส่อันใหม่เข้าไปมันจะยังนับต่อเนื่องจนกลายเป็น 1,2,3,4,6 ซึ่งเราอยากให้มันเริ่มนับต่อที่ 5 ให้เราแก้ไขโดยใช้คำสั่งดังนี้
ALTER TABLE ชื่อตาราง AUTO_INCREMENT=5
ถ้าต้องการให้เป็นค่าอื่นก็เปลี่ยนเอาตรงตัวเลขหลัง AUTO_INCREMENT= นั่นล่ะครับ

วันพุธที่ 3 มีนาคม พ.ศ. 2553

ความแตกต่างของ struct กับ typedef struct

ในภาษา C นั้นการประกาศ struct เพื่อสร้างประเภทข้อมูลชนิดใหม่โดยทำการนำหลายๆประเภทข้อมูลมาจัดกลุ่มเป็นอันเดียว ซึ่งคล้ายๆกับการสร้าง class ในภาษาแบบ OO(Object Oriented) (แต่มีแค่โครงสร้างข้อมูล ไม่มีคำสั่งสำหรับเรียกใช้)

ซึ่งการประกาศ struct ที่เห็นกันบ่อยๆก็คือ
(1)
struct ABC {
...
};


กับ (2)
typedef struct {
...
} ABC;


และ (3)
typedef struct ABC {
...
} ABC;


ที่สงสัยกันคือแต่ละแบบนั้นแตกต่างกันยังไง? เหตุผลลึกๆเดี๋ยวอธิบายไว้ด้านหลัง เริ่มจากดูวิธีการประกาศใช้ก่อน

ถ้าเกิดเราประกาศ ABC โดยใช้รูปแบบที่ (1) และถ้าเราจะประกาศตัวแปรประเภทนี้ขึ้นมา เราต้องประกาศว่า
struct ABC v;
ถึงจะเรียกใช้งานได้

ถ้าเป็นกรณีที่ (2) ล่ะก็เราจะสามารถประกาศตัวแปรโดยเชียนเพียงแค่
ABC v;

แต่ว่าการประกาศในรูปแบบที่ (1) จะดีกว่าในรูปแบบที่ (2) ก็คือเราสามารถประกาศโครงสร้างล่วงหน้าโดยยังไม่ต้องใส่รายละเอียดของโครงสร้างข้อมูลได้ ซึ่งเรียกว่าการทำ Forward-Declaration เช่น
struct ABC x;
...
struct ABC {
...
};

ในขณะที่แบบที่ (2) ทำไม่ได้

ดังนั้นการที่จะทำให้แบบที่ (2) ทำ Forward-Declaration ได้บ้าง จึงพัฒนามาเป็นการประกาศในแบบที่ (3) ซึ่งเป็นการรวมข้อดีของแบบที่ (1) กับ (2) นั่นคือ เวลาประกาศตัวแปรก็จะเขียนแค่
ABC x;
และสามารถทำ Forward-Declaration ได้(แต่ในส่วน Forward-Declaration ยังต้องประกาศเป็น struct ABC อยู่) เช่น
struct ABC x;
...
typedef struct ABC {
...
} ABC;
// หลังจากนี้จึงเรียกแค่ ABC ได้
ABC y;


ส่วนเหตุผลลึกๆก็คือในภาษา C นั้นจะมีการแบ่ง namespace ของ type ออกเป็น 2 แบบ คือ tag namespace กับ typedef namespace ซึ่งการประกาศแบบที่ (1) นั้นจะเป็นการนำคำว่า ABC เข้าไปอยู่ใน tag namespace เพื่อใช้ในการอ้างถึงของการประกาศตัวแปรแบบ struct เพียงเท่านั้น ดังนั้นเวลาประกาศตัวแปรจึงต้องใช้ struct ABC x; แต่ในขณะที่แบบที่ (2) นั้นเป็นการนำคำว่า ABC เข้าไปอยู่ใน typedef namespace ซึ่ง typedef namespace นี้ให้มองว่าคล้ายการสร้าง map เพื่อจับว่าถ้าเจอคำว่า ABC ให้แทนด้วยคำว่า struct ABC ไปซะ ดังนั้นจึงสามารถประกาศสั้นๆได้ว่า ABC x; ส่วนการประกาศแบบที่ (3) ก็คือการนำคำ ABC ไปใส่ไว้ในทั้ง tag namespace และ typedef namespace เลย

ส่วนการทำ Forward-Declaration นั้นคือต้องมีประเภทตัวแปรที่จะประกาศอยู่ใน tag namespace เสียก่อนจึงจะสามารถทำได้

หลักการของ tag namespace นั้นจะใช้ได้กับทั้ง struct, enum, union (เพราะพวกนี้นับว่าอยู่ใน tag namespace)

แต่ถ้าเป็นภาษา C++ แล้ว แบบที่ (1), (2), (3) ไม่แตกต่างกัน เนื่องจาก การประกาศ struct/enum/union/class ใน C++ นั้นจะเหมือนการถูกทำ typedef ไปเรียบร้อย

อ้างอิง
http://stackoverflow.com/questions/612328/difference-between-struct-and-typedef-struct-in-c
http://www.embedded.com/story/OEG20020926S0059