หน้าเว็บ

วันเสาร์ที่ 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

วันอังคารที่ 27 ตุลาคม พ.ศ. 2552

ดาวน์โหลดทั้งเวบเพื่อทำ Offline Browsing บน linux

ในกรณีที่เราต้องการดาวน์โหลดเวบทั้งเวบมาเก็บไว้ในเครื่องเราเพื่อเปิดดูภายหลัง หรือ Offline Browsing นั้น แท้จริงแล้วไม่ต้องใช้โปรแกรมเพิ่มเติมอะไรมากเลยครับ เพียงแค่ wget ก็สามารถช่วยเราทำแบบนั้นได้ ด้วยคำสั่งดังต่อไปนี้ครับ

wget -H -r --level=1 -k -p http://yoururl.com

โดย -H หมายถึง span host คือเอา link ที่อยู่โฮสต์อื่นมาด้วย
-r หมายถึง recursive คือเอาลิงค์ที่อยู่ในระดับที่ลึกลงไปมาด้วย
--level บอกว่าจะเอาลึกลงไปกี่ชั้น
-k คือสั่งให้แปลงลิงค์ที่ชี้ไปยังโฮสต์อื่น(โฮสต์จริง) เป็นลิงค์ของโฮสต์อื่นแต่ถูกดูดมาอยู่ในเครื่องเราแล้ว
-p คือ ขอทุกๆส่วนประกอบของหน้าเวบนั้น เช่น รูปภาพ เป็นต้น

ที่มา
http://lifehacker.com/software/downloads/geek-to-live--mastering-wget-161202.php

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

วันอาทิตย์ที่ 27 กันยายน พ.ศ. 2552

Run Command as Other User

วิธีการที่จะสั่ง run คำสั่งใดๆ แต่ให้เสมือนว่าเป็น user คนอื่นเป็นคนสั่งทำได้โดยใช้คำสั่งดังนี้
su - username -c "commandname"
โดยหลังเครื่องหมาย "-" ตัวแรก ให้ตามด้วยเว้นวรรค ก่อนแล้วค่อยเป็น username แต่ตรง "-c" พิมพ์ติดกัน
หรือใช้คำสั่ง
sudo -u username commandname
ก็ได้เช่นเดียวกัน
สามารถทดสอบโดยเห็นผลชัดๆก็คือคำสั่ง id ซึ่งจะแสดงค่าข้อมูลของ user ที่สั่งคำสั่งขึ้นมา ดังนี้

ถ้าเป็นผู้ใช้ที่เป็น admin สั่งคำสั่ง id จะได้ผลลัพธ์
uid=1000(supasate) gid=1000(supasate) groups=4(adm),..........
เป็นต้น

แต่ถ้าต้องการให้สั่งคำสั่งในฐานะ user ธรรมดาที่ชื่อ ping
su - ping -c "id"
หรือ
sudo -u ping id
จะได้ผลลัพทธ์
uid=1001(ping) gid=1001(ping) groups=1001(ping)
เป็นต้น

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

ที่มา
http://ubuntuforums.org/showthread.php?t=879283