หน้าเว็บ

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

แก้ปัญหา Firefox ปิดตัวเองบน Ubuntu 10.04 Lucid Lynx

ขอแชร์ประสบการณ์ครับเผื่อเป็นประโยชน์ เครื่องผม Lenovo Thinkpad X200 ลง Lucid ตัวเต็ม clean install พบปัญหาว่า Firefox มักจะปิดตัวเองลงเมื่อมีการ login เข้าหน้าเว็บพวก Facebook, Google Wave หรือทำการเปิดไฟล์/เมลใน Google Docs, Hotmail

ผมทดลอง run ด้วย safe mode แล้วกลับไม่พบอาการดังกล่าว จึงได้ลอง 2 วิธี 1. สร้าง profile ใหม่ 2. ถอด extension/add-on ทิ้งหมด แต่ปรากฏว่าอาการยังเป็นอยู่ครับ และไม่ได้ลองวิธีอื่นต่อ

ผมตัดสินใจลบ Firefox ทิ้งแล้วลงใหม่ครับ โดยเริ่มจากถอด firefox ออกด้วย
sudo apt-get remove firefox
หลังจากนั้นลบโฟลเดอร์ที่เกี่ยวข้องออกครับ
sudo rm -r /usr/lib/firefox-3.6.3 /usr/lib/firefox-addons ~/.mozilla
หลังจากนั้นลงใหม่ด้วย
sudo apt-get install firefox
ซึ่งทำให้กลับมาใช้ได้ครับ ผมยังไม่ได้ลงไล่ไปลึกกว่านี้ว่าสาเหตุจริงๆคืออะไรกันแน่ครับ

ระบบที่ทดสอบ

OS: Ubuntu 10.04 Lucid Lynx

Firefox: 3.6.3

วันจันทร์ที่ 10 พฤษภาคม พ.ศ. 2553

My Top-10 Favorite Firefox Add-ons

รายการ Add-on ของ Firefox ที่ผมใช้บ่อยๆจนต้องลงแทบทุกครั้งที่ลง firefox ใหม่ครับ
1. Adblock Plus
2. DownThemAll! + DownThemAll AntiContainer
3. WebMail Notifier
4. Delicious Bookmarks
5. Firebug
6. Greasemonkey
7. rikaichan + Word Dict & Names Dict
8. FireFTP
9. FasterFox
10. ScreenGrab

วันเสาร์ที่ 24 เมษายน พ.ศ. 2553

วิธีการชาร์จแบตเตอรี่ Notebook

แต่ไหนแต่ไรไม่เคยสนใจเรื่องแบตเตอรี่เลย แต่มาวันนี้พอแบตเตอรี่มันเสื่อมสภาพ ซึ่งเป็นแบต 6-cell ใช้ไปประมาณ 1 ปีครึ่ง แล้วได้ทำการซื้อใหม่ โดยทำการซื้อแบต 9-cell สำหรับเครื่อง Lenovo Thinkpad x200 มา แต่ด้วยความที่ไม่รู้ข้อมูลเรื่องแบตเลยก็เลยถามคนขายว่าควรชาร์จครั้งแรกทิ้งไว้นานเท่าไหร่ ซึ่งเค้าตอบกลับมาว่าประมาณ 16 ชั่วโมง ด้วยเหตุเหล่านี้เลยเกิดคำถามขึ้นมาในใจหลายคำถาม เช่น
1. ทำไมแบตฯตัวเก่ามันหมดอายุเร็วจัง (ปัจจุบันชาร์จเต็มที่ได้แค่ 15 นาทีบน Ubuntu Linux ถ้าบน Windows อาจได้ประมาณ 40 นาที (ไม่ได้ทดลอง แต่ตอนซื้อมาใหม่ๆ Windows ใช้ได้ 4-5 ชม. ขณะที่ Ubuntu ใช้ได 2-3 ชม.))
2. แบตเมื่อซ์อมาครั้งแรกควรชาร์จยังไงดีเพื่อให้ใช้เต็มประสิทธิภาพ
3. เวลาชาร์จใหม่ ควรใช้แบตไปเยอะๆก่อน หรือว่าอยากชาร์จตอนไหนก็ได้

ก็เลยลองไปค้นๆข้อมูลดูและเอามาเล่า/แปลให้ฟัง

แต่ก่อนที่ควรรู้คือ ประเภทของแบตเตอรี่
แบตเตอรี่ปัจจุบันที่ใช้ใน Notebook มีหลักๆ 3 ประเภท
1. NickelCadmium (NiCd) เป็นแบตที่มีใช้กันเยอะ โดยมีข้อดีคือทำงานในที่อุณหภูมิสูงมากหรือต่ำมากได้ และมีจำนวนรอบของการชาร์จเต็มและใช้จนหมดได้ถึงประมาณ 750 รอบการชาร์จ แต่ข้อเสียคือมี Memory Effect (เดี๋ยวบอกว่าคืออะไร)

2. NickelMetalHydride (NiMH) เป็นตัวที่พัฒนาขึ้นจาก NiCd มีความจุเพิ่มขึ้นประมาณ 40% (โดยใช้ขนาดเท่าๆกัน) ไม่โดนผลกระทบจาก Memory Effect แต่มีรอบการชาร์จอยู่ที่ประมาณ 400 รอบ

3. LithiumIon (LiIon) เป็นตัวใหม่ (ปัจจุบันก็เห็นใช้กันเยอะแล้ว) สามารถทำงานได้นานขึ้นกว่า NiMH และน้ำหนักเบา แต่ราคาแพง และต้องใช้ที่ชาร์จที่ออกแบบเฉพาะสำหรับแบตเตอรี่แต่ละรุ่น มีรอบการชาร์จอยู่ที่ประมาณ 400 รอบเช่นกัน และไม่โดนผลกระทบจาก Memory Effect

มาอธิบาย Memory Effect เล็กน้อย
Memory Effect คืออาการที่แบตเตอรี่ลืมไปว่าตัวมันเองยังมีประจุที่ยังไม่ได้ใช้งานอยู่อีกเท่าไหร่ ซึ่งอาการนี้จะเกิดกับการใช้งานแบตประเภท NiCd ที่ใช้พลังงานไปยังไม่หมดแล้วทำการชาร์จใหม่ทันที เช่น ใช้ไป 50% แล้วทำการชาร์จใหม่จนเต็ม แล้วพอใช้ไปใหม่ได้แค่ 50% แบตก็จะบอกว่ามันหมดแล้ว โดยมันลืมไปว่าจริงๆแล้วยังสามารถคลายประจุได้อีก 50%
วิธีการหลีกเลี่ยงก็คือพยายามใช้ไฟจากแบตประเภท NiCd ให้หมดหรือเกือบหมดแล้วค่อยชาร์จใหม่ หรือทำแบบนี้ทุกๆ 1-3 สัปดาห์ ซึ่งเรียกว่าเป็นการปรับสภาพ (Conditioning)

พอรู้จักประเภทของแบตแล้ว คราวนี้พอซื้อแบตมาครั้งแรกเนี่ยควรชาร์จยังไงดี กี่ชั่วโมง?
จากที่อ่านมาคือถ้าเป็นแบตประเภท NiCd หรือ NiHM เนี่ย ควรชาร์จครั้งแรกประมาณ 16 ชั่วโมง แต่ถ้าเป็น LiIon เนี่ยชาร์จครั้งแรกประมาณ 5-6 ชั่วโมง (นั่นคนขายมั่วใส่เราจริงด้วย เพราะที่เราซื้อเป็น LiIon)
สำหรับ NiCd หรือ NiHM ในการชาร์จครั้งแรกๆควรชาร์จให้เต็ม และใช้ให้หมด แล้วชาร์จให้เต็มใหม่ ประมาณ 2-4 รอบก่อนนำไปใช้งานจริง เพื่อให้ได้ประสิทธิภาพเต็มที่ แต่ขณะที่ LiIon นั้นไม่จำเป็น
เค้าบอกว่าเวลาชาร์จครั้งแรกๆเนี่ยเป็นปกติเลยที่เครื่องมักบอกว่าชาร์จเต็มแล้วทั้งๆที่เพิ่งชาร์จไปได้แค่ 10-15 นาที ก็ไม่ต้องตกใจชาร์จต่อไป แต่บางเครื่องเนี่ยมันจะไม่ยอมชาร์จต่อ ก็ให้ถอดแบตแล้วชาร์จใหม่อีกรอบ เค้าบอกด้วยว่าอาจเกิดขึ้นได้หลายครั้งในการชาร์จครั้งแรก
ถ้าแบตไม่ได้ใช้เป็นเวลานานแล้วก็ควรจะต้องทำกระบวนแบบนี้ใหม่เช่นกัน เรียกว่า re-initialization

คราวนี้พอใช้ปกติควรชาร์จใหม่เมื่อไหร่ดี?
อันนี้จะเกี่ยวกันกับเรื่องรอบการชาร์จ (cycle count) ว่าชาร์จยังไงถึงจะนับเป็น 1 รอบการชาร์จ เพราะว่ารอบการชาร์จก็ส่งผลโดยตรงกับอายุการใช้งานแบตซะด้วย
จากที่อ่านมาคือถ้าเป็นแบตประเภท NiCd เนี่ยไม่ว่ารอบจะใช้ไปเท่าไหร่ ถ้าเริ่มชาร์จปุ๊ปจะนับเป็น 1 cycle ทันที เช่นใช้ไปแค่ 30% แล้วเอาไปชาร์จก็นับเป็น 1 cycle เลย ในขณะที่ถ้าเป็นแบบ LiIon เนี่ยมันจะฉลาดกว่าคือมันจะนับ 1 cycle ถ้ามีการชาร์จรวมกัน(1 หรือหลายครั้ง) คิดเป็นประมาณ 80% ขึ้นไป เช่น ใช้ไป 20% แล้วชาร์จเต็ม แล้วใช้ไปอีก 20% แล้วชาร์จเต็มใหม่ แล้วใช้ไปอีก 50% แล้วชาร์จเต็มใหม่ แบบนี้ถึงจะนับเป็น 1 cycle (แต่ตัวเลข 80% นั้นไม่แน่นอน แต่ราวๆนั้น) ส่วน NiMH ไม่มีข้อมูล (แต่คิดว่าคล้าย NiCd)
ดังนั้นแบตพวก NiCd ควรใช้ไปเยอะๆก่อนแล้วค่อยชาร์จทีเดียว ส่วน LiIon ก็ชาต์จเมื่อไหร่ก็ได้

ต่อมาเรื่องอายุการใช้งาน
อันดับแรกเลยก็คือจำนวนรอบการชาร์จ (cycle count) ที่ได้กล่าวไปแล้ว แต่ตัวเลขที่แสดงให้ดูเป็นแค่การประมาณ อาจมากหรือน้อยกว่านั้นก็ได้ ถ้าใช้จนหมดแล้ว แบตจะเสื่อมและเก็บประจุไม่ค่อยได้แล้ว
นอกจากนั้นก็มีเรื่องการเก็บรักษาคือไม่ควรเก็บแบตไว้ในที่ร้อน เช่น ทิ้งไว้ในรถเวลารถตากแดด (อันนี้ผมทำบ่อยเลย สงสัยเป็นสาเหตุหนึ่งให้แบตเก่าผมเสื่อมเร็ว) และแบตประเภท LiIon เนี่ยไม่ควรปล่อยให้แบตหมดเกลี้ยง เพราะทำให้เสื่อมสภาพเร็วขึ้น และอีกอย่างคือไม่ควรชาร์จจนเต็ม(ล้น)! (อันนี้แปลกดี ไม่รู้จริงรึเปล่า)
ถ้าเกิดว่าต้องไปต่างจังหวัด ต่างประเทศ ทำให้ไม่ได้ใช้งานโน๊ตบุ้คเป็นเวลานานๆ ก็ไม่ควรเสียบแบตฯค้างไว้ในเครื่อง ให้ถอดเก็บรักษาไว้ในที่แห้งและเย็นจะช่วยถนอมอายุการใช้งานได้ดียิ่งขึ้น

ถ้าใครทราบหรือรู้วิธีอะไรเพิ่มเติมสามารถบอกข้อมูลเพิ่มเติมได้ครับ

อ้างอิง

วันอาทิตย์ที่ 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

วันพุธที่ 2 ธันวาคม พ.ศ. 2552

shell script with floating point

มีรุ่นน้องในแลบถามผมว่า อยากจะทำ for loop ให้ มันแสดงค่าตั้งแต่ 0.01 ถึง 0.20 ทำยังไงดี? ซึ่งน้องเค้าตรง for loop ก็ทำเป็น integer 1 ถึง 20 แต่ว่า ตอนแสดงจะนำมาหารด้วย 100

ปัญหาอย่างหนึ่งของ shell script คือทำ floating point arithmetic operation ดื้อๆไม่ได้ ดังนั้นมันจึงเอามาหาร 100 เกิดเป็นทศนิยมไม่ได้

วิธีแก้ปัญหาก็แน่นอนอาจจะเขียน script python perl c ฯลฯ อะไรก็ได้ในการแก้ปัญหานี้
แต่ว่าผมพบอีกวิธีนึงซึ่งก็ค่อนข้าง work และถูกออกแบบมาทำเพื่อทำ arithmetic operation อย่างเดียวเลย ก็คือการใช้ bc หรือ bash calculator

ซึ่งจริงๆก็เขียนคล้ายๆพวก script ต่างๆนั่นแหล่ะ เช่นถ้าต้องการจะทำผลลัพธ์ for loop ที่กล่าวไว้ข้างต้นก็ทำได้โดยจับมายำกับ shell script แบบนี้

for ((i=1;i<20;i+=1)) do printf "0%s\n" $(echo "scale=2; $i/100" | bc); done

จริงๆแล้วจะยัดพวก for อะไร เข้าไปใน bc ทั้งหมดเลยก็ได้ แต่อันนี้เพียงต้องการแสดงให้เห็นว่าถ้ามี shell script อยู่แล้ว และต้องการทำ floating point arithmetic operation แค่บางจุดจะต้องทำอย่างไรเท่านั้น

ระบบที่ทดสอบ
OS: Ubuntu 9.04