หน้าเว็บ

วันพุธที่ 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

สร้าง password ป้องกัน grub

ถ้าเกิดไม่ต้องการให้ใครมา boot เครื่องเรา (ป้องกันการ boot ไม่ใช่ป้องกันการ login) สามารถป้องกันได้โดยใส่ password ไว้ที่ grub เลย ซึ่งประโยชน์หลักๆก็มีด้วย 3 ประการ
1. ป้องกันการเข้าถึง Single-user mode เช่น การเข้า recovery console ซึ่งถ้าเข้ามาในโหมดนี้จะทำการ log in เป็น root ทันทีโดยไม่ต้องใส่ password root
2. ป้องกันการเข้าถึง grub console เพราะถ้าเครื่อง boot ด้วย grub แล้ว ผู้ไม่หวังดีสามารถดึงข้อมูลการตั้งค่าของ grub หรือทำการแก้ไขค่าด้วย grub editor interface ได้
3. ป้องกันการเข้าถึง OS ที่ไม่มีที่การป้องกันไม่ค่อยดี เช่น เข้าได้โดยไม่ต้องใส่ password (เช่น DOS) ในกรณีที่เครื่องเราทำ dual-boot หรือลงหลายๆ OS ไว้ในเครื่องเดียว

วิธีการทำ
มีดังนี้
1. ใช้คำสั่ง grub-md5-crypt เพื่อ generate ค่า hash ของ password ออกมา
2. แก้ไขไฟล์ /boot/grup/menu.lst โดยให้เติมค่า password --md5 ค่าแฮช ไว้ที่บรรทัดสุดท้ายของแต่ละ OS ที่ต้องการจะป้องกัน เช่น

title Ubuntu, kernel 2.6.8.1-2-386 (recovery mode)
root (hd1,2)
kernel /boot/vmlinuz-2.6.8.1-2-386 root=/dev/hdb3 ro single
initrd /boot/initrd.img-2.6.8.1-2-386
password --md5 $1$w7Epf0$vX6rxpozznLAVxZGkcFcs

แล้วลองทดสอบโดยการ reboot เข้า grub เป็นอันเสร็จ

ข้อควรระวัง อย่าใส่ค่า hash value ผิด

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

ที่มา
http://ubuntuforums.org/showthread.php?t=7353
http://www.redhat.com/docs/manuals/enterprise/RHEL-4-Manual/en-US/Security_Guide/s2-wstation-bootloader.html

วิธีแก้ชื่อ Network Interface บน Ubuntu

ปกติชื่อ Network Interface ก็อาจจะเป็น eth0 eth1 wlan0 อะไรแบบนี้ แต่ถ้าวันดีคืนดีเราอยากเปลี่ยนชื่อให้เข้าใจง่ายขึ้น หรือบางครั้งพบปัญหาว่า ชื่อมันเปลี่ยนเอง เช่น จาก eth0 กลายเป็น eth1 แต่เราต้องการให้มันกลับมาเป็น eth0 ก็สามารถทำได้ดังต่อไปนี้
sudo vi /etc/udev/rules.d/70-persistent-net.rules
เมื่อเข้ามาในนี้จะพบบรรทัดที่มีคำว่า SUBSYSTEM=".......... โดยจะมีคำว่า NAME="eth0" อะไรแบบนี้อยู่ ก็ให้ทำการแก้คำว่า NAME="eth0" ไปเป็นชื่อที่เราต้องการ เช่น NAME="leftportlan" เป็นต้น

หลังจากทำการแก้ไฟล์นี้แล้วให้ไปทำการแก้ชื่อใน /etc/network/interfaces ด้วย โดยให้เปลี่ยนคำว่า eth0 ไปเป็น leftportlan ให้หมด

หลังจากนั้น reboot เครื่อง แล้วลอง ifconfig ดู จะพบว่าชื่อเปลี่ยนไปตามที่ต้องการแล้ว (จริงๆไม่ต้อง reboot แต่แค่ sudo /etc/init.d/network restart ก้ได้ แต่อาจจะไม่สำเร็จเพราะมี dhcpclient ทำงานอยู่ ต้องปิดก่อน แล้วค่อย restart ใหม่)

หมายเหตุ ถ้าอยากรู้ว่ารายละเอียดของไฟล์แรกที่ทำแก้ไขคืออะไร ให้ศึกษาเรื่อง udev ครับ

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

ที่มา
http://linux-hacks.blogspot.com/2009/04/changeresassign-interface-name-in-linux.html

วันศุกร์ที่ 25 กันยายน พ.ศ. 2552

ดู version Fedora

ไฟล์เวอร์ชันของ Fedora เก็บไว้ที่ /etc/redhat-release
ดังนั้นสามารถดูได้โดยสั่ง
cat /etc/redhat-release

ระบบที่ทดสอบ
OS: Fedora 9

ดู version ubuntu

เวอร์ชันของ ubuntu นั้นจะเก็บไว้ในไฟล์ /etc/lsb-release หรือ /etc/issue
ดังนั้นดูได้โดยการสั่ง
cat /etc/lsb-release
หรือ
cat /etc/issue

*เพิ่มเติม จริงๆแล้วมีคำสั่ง lsb_release -a เพื่อแสดงข้อมูลทั้งหมดจากไฟล์ /etc/lsb-relase หรือจะดูแค่ว่าส่วนด้ว -i -r -c -d ก็ได้ (id, release, codename, description ตามลำดับ)

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

ที่มา
http://ubuntu-tutorials.com/2007/01/27/how-to-find-your-ubuntu-or-kernel-version/

ftp multiple files with no prompt

เวลาส่งไฟล์ด้วย ftp บน command line หรือบนเครื่อง server นั้นถ้าต้องการส่งพร้อมกันทีละหลายๆไฟล์ เครื่องจะถามเพื่อยืนยันให้ตอบ yes หรือ no ในทุกๆไฟล์ ทำให้เสียเวลาเป็นอย่างมาก ดังนั้นถ้าไม่ต้องการให้มีการถามให้ใช้คำสั่ง prompt ดังนี้

ftp> prompt

Interactive mode off


คราวนี้ก็ให้ใช้คำสั่ง mput เพื่อส่งไฟล์หลายๆไฟล์ได้

ftp> mput *.* (หรือแล้วแต่ที่เราต้องการจะส่ง)

ระบบที่ทดสอบ
OS: Fedora 9

วันพุธที่ 23 กันยายน พ.ศ. 2552

ปัญหา Firefox is already running, but not responding

ปัญหา Firefox is already running, but not reponding นั้นเจออยู่บ่อยๆ บางครั้งก็แก้ได้ง่ายโดยการปิด process firefox.exe ที่ Task Manager

แต่ว่ามีบางกรณีที่ใน Task Manager ก็ไม่มี firefox.exe อยู่แล้วแต่ก็ยังฟ้องแบบนี้อยู่ มันเกิดอะไรขึ้น??

บางครั้งถึงแม้ตัว Firefox เองนั้นจะปิดไปแล้วก็ตาม แต่ว่าบางครั้งจะมี child process ที่ยังค้างอยู่ ซึ่งอาจเกิดจาก add-on บางตัวที่ไม่ยอมปิดตัวลงไปตาม

ในกรณีนี้ก็แก้ง่ายๆ 2 วิธีด้วยกัน
1. Restart เครื่อง ง่ายมั้ยครับ :P
2. ถ้าในกรณีที่ไม่สามารถ restart เครื่องได้ เช่น เป็นเครื่อง server หรือ run service ที่ต้อง always on เอาไว้ ให้ใช้วิธีการดังนี้

- เข้า cmd (Start->Run พิมพ์ cmd)

- สั่ง taskkill /F /IM firefox.exe /T

เป็นอันเรียบร้อย
โดย taskkill ใช้ในการ kill process
/F คือ force บังคับปิด process
/IM ระบุ image name ในที่นี้คือ firefox.exe
/T ปิด child process ซึ่งเกิดจาก image name นั้นๆด้วย

ระบบที่ทดสอบ
OS: Windows Server 2003
Firefox: 3.5.3

วันพฤหัสบดีที่ 13 สิงหาคม พ.ศ. 2552

จำกัดช่วง port ของ RPC

ปกติแล้ว RPC (Remote Procedure Call) นั้นจะใช้ช่วง port แบบ random ในช่วง 1024 - 65535 ซึ่งถ้าเครื่องที่เป็น server แล้วต้องการให้ผู้อื่นติดต่อผ่าน RPC นั้นจะต้องเปิด port เป็นจำนวนมาก
ดังนั้นวิธีแก้ไขคือทำการจำกัดช่วง port ของ RPC ที่จะ random ให้น้อยๆ โดยวิธีการดังนี้

1. เข้า Registry Editor
Start -> Run -> regedt32

(ต่อไปนี้จะมีการเปลี่ยนแปลง register ดังนั้นควร back up register ไว้ก่อน โดยเลือกที่ File -> export แล้ว save เก็บไว้ที่ใดก็ได้)

2. ไปที่ HKEY_LOCAL_MACHINE\Software\Microsoft\Rpc\Internet (ในกรณีที่ไม่มี Internet ให้ใช้คำสั่ง new key เพื่อเพิ่ม key Internet ใต้ Rpc)

3. คลิกที่ Internet แล้วในหน้าต่างฝั่งขวา ให้คลิกขวา เลือก New -> Multi-String Value แล้วตั้งชื่อว่า Ports

4. ดับเบิ้ลคลิกที่ Ports ที่สร้างขึ้น แล้วให้ระบุช่วง port ในช่อง Value data: เช่น 5000-5100 แล้วกด ok (ควรกำหนดอย่างน้อย 100 port เพราะมีหลาย service ที่จำเป็นต้องใช้ RPC)

5. ในหน้าต่างฝั่งขวา คลิกขวา เลือก New -> String Value แล้วชื่อว่า PortsInternetAvailable

6. ดับเบิลคลิกที่ PortsInternetAvailable แล้วใส่ Value Data: เป็น Y

7. ทำเหมือนข้อ 5 และ 6 แต่ตั้งชื่อว่า UseInternetPorts และให้ Value Data เป็น Y

8. Restart เครื่อง server เป็นอันเรียบร้อย

ระบบที่ทดสอบ
OS: Windows Server 2003 R2

อ้างอิง
http://support.microsoft.com/kb/154596

เปิด Port Windows Firewall แบบระบุ Range

บน Windows ถ้าต้องการเปิด port firewall ปกตินั้น ก็เข้าไปที่ control panel -> windows firewall
แล้วจัดการเพิ่มที่ exception แต่ปัญหาก็คือเพิ่มได้ทีละ port หรือทีละ program เท่านั้น

แต่ถ้าต้องการเพิ่มทีเดียวหลาย port หรือเพิ่มแบบเป็นช่วง port ก็สามารถทำได้เช่นกัน แต่ทำโดยใช้ script ผ่านทาง command line
1. เข้า command line (Start -> Run -> cmd)
2. สั่งคำสั่ง
for /L %i in (beginport, 1, endport)
do netsh firewall add portopening protocol %i "string"

โดย แทน beginport ด้วย หมายเลข port เริ่มต้น
endport ด้วยหมายเลข port สุดท้าย
protocol ด้วยโปรโตคอลที่ต้องการ คือ TCP หรือ UDP
string ด้วยชื่อที่ต้องการที่ให้ปรากฏใน exception ของ windows firewall
เช่น ผมต้องการเปิด port สำหรับ RPC ที่ port 5000-5100 ซึ่งใช้ TCP ก็สั่งว่า
for /L %i in (5000, 1, 5100)
do netsh firewall add portopening TCP %i "RPC %i"

เป็นต้น

ระบบที่ทดสอบ
OS: Windows Server 2003 R2

ที่มา
http://forums.techarena.in/server-networking/890789.htm

วันจันทร์ที่ 29 มิถุนายน พ.ศ. 2552

เปลี่ยน editor ของ git เป็น vi

ปกติถ้าใช้ git (เป็น dvcs (distributed version control system) ประเภทหนึ่ง) แล้วสั่ง commit -a เพื่อให้มันขึ้น editor มาให้ใส่ text นั้น แรกเริ่มเดิมที่มันจะใช้ editor คือ nano (สำหรับ ubuntu ที่ผมใช้อยู่) แต่ว่าผมอยากให้ vi มากกว่า ก็เลยจะเปลี่ยนมันซะ (จริงๆเมื่อก่อนมันเคยเปลี่ยนให้เองโดยไม่ได้ทำอะไร ก็งงเหมือนกันว่ามันเปลี่ยนยังไง)

วิธีเปลี่ยน
สั่งคำสั่ง
git config core.editor "vi"
โดยสามารถเปลี่ยนคำว่า vi เป็น editor ตัวอื่นใดๆก็ได้ที่ชอบ เช่น nano เป็นต้น

ระบบที่ทดสอบ
OS: ubuntu 9.04
git: 1.6.0.4

วันจันทร์ที่ 22 มิถุนายน พ.ศ. 2552

Tomcat เข้าโฟลเดอร์บางชื่อไม่ได้

เมื่อเข้าบาง URL ที่มีโฟลเดอร์อยู่บน webapps แล้วปรากฎ error ดังด้านล่างนี้

The server encountered an internal error () that prevented
it from fulfilling this request.

exception

java.io.FileNotFoundException:
/var/lib/tomcat5/work/Catalina/localhost/dspace/org/apache/jsp/index_jsp.java
(No such file or directory)

java.io.FileOutputStream.open(Native Method)

java.io.FileOutputStream.(FileOutputStream.java:179)

java.io.FileOutputStream.(FileOutputStream.java:70)


org.apache.jasper.compiler.Compiler.generateJava(Compiler.java:188)

org.apache.jasper.compiler.Compiler.compile(Compiler.java:495)

org.apache.jasper.compiler.Compiler.compile(Compiler.java:476)

org.apache.jasper.compiler.Compiler.compile(Compiler.java:464)


org.apache.jasper.JspCompilationContext.compile(JspCompilationContext.java:511)


org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:295)


org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:292)


org.apache.jasper.servlet.JspServlet.service(JspServlet.java:236)

javax.servlet.http.HttpServlet.service(HttpServlet.java:802)

note The full stack trace of the root cause is available in the Apache Tomcat/5.0 logs.

แต่ว่าถ้าเป็นโฟลเดอร์อื่นจะยังเข้าได้
ซึ่งในกรณีของผมนั้นเกิดจากการที่เคยตั้งโฟลเดอร์นึงไว้ แล้วไปทำอะไรก็ไม่รู้จำไม่ได้ แล้วอยู่ดีๆพอจะเข้า folder นี้มันก็ขึ้น error แบบนี้ซะงั้น แต่ถ้า copy เอา content ไปใส folder อื่นปรากฎว่ามันทำงานได้ซะงั้น

วิธีแก้ไข
ปัญหาเกิดจากการเก็บ cache ของ tomcat ให้แก้โดยการลบไฟล์ใน cache ที่อยู่ที่ /var/cache/tomcat5.5 ทั้งหมดทิ้ง แล้วสั่ง restart tomcat ใหม่

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

tomcat แสดง encoding เพี้ยน เมื่อส่ง request

เหตุการณ์คือ ระบบ dspace พัฒนาขึ้นนั้น จะมีกล่องสำหรับ search คำ แต่พอผู้ใช้กรอกภาษาไทย แล้วกดปุ่ม search นั้น ระบบกลับแปลง encoding ออกมาเพี้ยน ส่งผลให้หาผล search ไม่เจอด้วย โดยปัญหานี้ต้องแก้ที่ตัว config ของ Tomcat

วิธีแก้
ในไฟล์ server.xml (อยู่ที่ $TOMCAT_HOME/conf/server.xml โดย $TOMCAT_HOME แล้วแต่ระบบ เช่นของผมอยู่ที่ /usr/share/tomcat5.5) ให้ดูที่บรรทัด แล้วเพิ่ม attribute เข้าไปดังนี้
connector port="8080" usebodyencodingforuri="true".......
หรือ
connector port="8080" uriencoding="UTF-8"........
เสร็จแล้วลอง restart tomcat ใหม่อีกรอบเป็นอันใช้ได้

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

OS: Ubuntu Desktop 9.04
Tomcat: Apache Tomcat 5.5 (via apt-get)


ที่มา
http://antikoala.wordpress.com/2007/02/21/tomcat-55-encoding-problem/

Special Thank
@blckct

วันอาทิตย์ที่ 21 มิถุนายน พ.ศ. 2552

compile TinyOS-2.1.0 แบบ TOSSIM ไม่ได้

อันนี้อาจมีหลายสาเหตุ แต่สาเหตุที่ผมเพิ่งเจอล่าสุดคือ upgrade เป็น ubuntu 9.04 แล้วจากที่เคย compile ได้ก็ไม่ได้ซะงั้น
โดยอาการแรกของผมคือ มันฟ้อง หา g++ ไม่ได้
อันนี้แก้ง่ายมาก
sudo apt-get install g++
เป็นอันเรียบร้อย (g++ เป็น GNU C++ Compiler)

พอพ้น error แรกไปได้ติดปัญหาต่อไปคือ มันงอแงว่า หาไฟล์ Python.h ไม่เจอ
อันดับแรกเลยลองเช็คว่าเรามี file นี้อยู่ในเครื่องรึเปล่า โดยลองสั่ง
sudo find / -name Python.h
เพื่อใช้หา find ดูก็ได้ ถ้าเกิดมันบอกว่าไม่เจอ ซึ่งอาจเกิดจากการที่เราไม่มี python development package หรือไม่ก็เคยมี แแต่เป็นเวอร์ชันเก่า พอ upgrade เป็น 9.04 แล้วมันจะเปลี่ยน python เป็น 2.6 แล้วทำการ remove package ของเวอร์ชันเก่าทิ้ง ก็ให้แก้ download มาลงก่อนด้วย
sudo apt-get install python-dev
หรือถ้าต้องการระบุ version ของ python ก็ใช้เป็น
sudo apt-get install python2.5-dev
โดยเปลี่ยนเลข version ตามอัธยาศัย (ของผมคือลง python2.5 เพิ่มเข้าไปด้วย)

หลังจากลองใช้คำสั่งเดิมในการหาว่า Python.h อยู่ที่ไหนใหม่อีกครั้ง แบบของผมจะไปอยู่ที่
/usr/include/python2.5
ซึ่งให้จำ path นี้ไว้ แล้วไปแก้ในไฟล์ sim.extra ที่อยู่ใน $TOSROOT/support/make โดยให้เติมบรรทัดนี้เข้าไปใต้บรรทัด PFLAGS
CFLAGS += -I/usr/include/python2.5
และเปลี่ยนค่าของ PYTHON_VERSION ให้เป็นตัวที่เราใช้อยู่ ทั้งในไฟล์ sim.extra และ sim-fast.extra
PYTHON_VERSION=2.5
ซึ่งถ้าใครไม่รู้ว่า python ตัวเองเป็น version อะไรสามารถดูได้ด้วยคำสั่ง python -V

แล้วคราวนี้ลอง compile โปรแกรมให้เป็น tossim ใหม่อีกครั้ง ก็น่าจะผ่าน

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

TinyOS: 2.1.0 (via apt-get)
OS: Ubuntu 9.04

ที่มา
http://docs.tinyos.net/index.php/TOSSIM#Appendix_A:_Troubleshooting_TOSSIM_compilation

apt-get /usr/bin/python does not match the python default version. It must be reset to point to python2.6

ถ้าเกิดว่าใช้คำสั่ง apt-get upgrade หรือ apt-get install แล้วใน error มีคำว่า
/usr/bin/python does not match the python default version. It must be reset to point to python2.6
และลงท้ายว่า E: Sub-process /usr/bin/dpkg returned an error code (1)

อาจเกิดจากการที่เราสั่งเปลี่ยน version ของ python ในระบบเรา ซึ่งถึงแม้เราเปลี่ยนกลับแล้วก็แก้ไม่ได้

ให้แก้โดย ลบ link python เดิมออก แล้วสร้าง softlink ใหม่ดังนี้
sudo rm /usr/bin/python && ln -s /usr/bin/python2.6 /usr/bin/python

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

ที่มา
http://www.linuxforums.org/forum/ubuntu-help/146571-solved-upgrade-doesn-t-work.html

switch python version

ในกรณีถ้าในเครื่องมี python หลาย version เช่น 2.5 และ 2.6 สามารถทำการสลับ version ได้ด้วยวิธีต่อไปนี้

ก่อนสร้าง option สำหรับการสลับ version ก่อน
sudo update-alternatives --install /usr/bin/python python /usr/bin/python2.5 1
sudo update-alternatives --install /usr/bin/python python /usr/bin/python2.6 2

หลังจากนั้นเมื่อต้องการสลับให้ใช้คำสั่ง
sudo update-alternatives --config python
แล้วเลือกหมายเลขที่ตรงกับ version ของ python ที่ต้องการ

เสร็จแล้วให้ทดสอบด้วยคำสั่ง
python -V
หมายเหตุ ถ้าใช้แล้วเกิด side effect คือทำให้ apt-get เกิด error มีคำว่า /usr/bin/python does not match the python default version. It must be reset to point to python2.6 และลงท้ายด้วย E: Sub-process /usr/bin/dpkg returned an error code (1)
ให้แก้ด้วยวิธีนี้ http://ping2p.blogspot.com/2009/06/apt-get-usrbinpython-does-not-match.html

ระบบที่ทดสอบ
OS: Ubuntu 9.04
Python: 2.3, 2.4, 2.5, 2.6

ที่มา
http://pythonide.blogspot.com/2007/03/how-to-switch-between-python24-and.html

วันจันทร์ที่ 15 มิถุนายน พ.ศ. 2552

วิธีดูว่า process ไหนใช้ (listen) port ไหนอยู่

บน linux ปกติเวลาที่ต้องการดูว่า port ไหนถูกใช้งานอยู่บ้าง ก็มักจะใช้คำสั่ง nbstat กันดังนี้
netstat -tunlp
โดย
- t คือแสดงที่เป็น TCP
- u คือแสดงที่เป็น UDP
- n คือไม่ต้อง resolve network IP address name หรือ หมายเลข port
- l คือให้แสดงเฉพาะ port ที่กำลังรอฟังอยู่ (ไม่ต้องแสดง port ที่ established connection แล้ว)
- p ให้แสดงว่า process ไหนเป็นคนใช้งาน port นั้นๆอยู่

หรือ ถ้าเรารู้หมายเลข port อยู่แล้วและต้องการรู้ว่าใครเรียกใช้โดยไม่ต้องค้นจากคำตอบของ netstat ก็ให้ใช้คำสั่ง fuser ได้ เช่น
fuser -n tcp 80
เพื่อดูว่าใครใช้ TCP port 80 อยู่ เป็นต้น

ระบบที่ทดสอบ
OS: CentOS 5.0

วันพฤหัสบดีที่ 4 มิถุนายน พ.ศ. 2552

เปลี่ยน root password ของ FreeBSD

ในกรณีที่ลืม password หรือต้องการเปลี่ยน password ของระบบปฏิบัติการ FreeBSD

1. reboot แล้วเลือกเข้า 4. Boot FreeBSD in single user mode

2. ระบบจะถามว่า When prompted Enter full pathname of shell or RETURN for /bin/sh: ก็ให้กด Enter ไปเลย

3. mount root ก่อนโดยการสั่ง mount -u / และตามด้วย mount -a

4. สร้าง password ใหม่ ด้วยคำสั่ง passwd

5. ใส่ password ใหม่เป็นอันเสร้จเรียบร้อย และ reboot เข้าทำงานตามปกติ


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

OS: FreeBSD 6.2

ที่มา
http://www.thaihosttalk.com/index.php?topic=8607.0

วันศุกร์ที่ 10 เมษายน พ.ศ. 2552

การ capture screen ที่มี drop-down box บน Ubuntu

ปกติผมใช้ปุ่ม Print Screen เพื่อจับภาพหน้าจอ หรือถ้าจับภาพใน Firefox เฉพาะส่วนผมก็ใช้ extension Screengrab

แต่มีปัญหาคือเมื่อภาพที่ต้องการจับนั้นเป็นประเภท drop-down box จะไม่สามารถทำได้ (หมายถึงเมื่อต้องการจับ drop-down ที่ทำการคลี่ออกมาเห็นหลายๆตัวเลือก)

แต่โชคดีที่ว่า Ubuntu นั้นโดย default จะใช้ Gnome เป็น desktop อยู่แล้ว ซึ่ง Gnome มีโปรแกรมที่ใช้ในการจับภาพหน้าชื่อว่า gnome-screenshot โดยระบุ delay ที่ต้องการจับหน้าจอ เช่น ให้จับหน้าจอในอีก 5 วินาที ถัดไป ก็สามารถสั่งได้ดังนี้
gnome-screenshot --delay 5
ถ้าให้สะดวกก็ใช้ Alt-F2 แล้วป้อนคำสั่งตรงนั้น (เหมือน run ใน windows)
หลังจากนั้น 5 วินาที ก็จะทำการ capture แล้วถามว่าต้องการ save ภาพที่ไหน หรือจะแค่ copy ไปใส่ clipboard เฉยๆก็ย่อมได้

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

ป.ล. จริงๆแล้วมันก็คือ print screen แบบกำหนดเวลาดีๆนี่เอง

วันพุธที่ 8 เมษายน พ.ศ. 2552

การ Merge หรือ Split PDF บน Ubuntu

ตาม title เลย วิธีการคือใช้ pdf toolkit (pdftk)

ทำการลงก่อนเลยด้วย
sudo apt-get install pdftk
ถ้าจะ Merge ก็ใช้
pdftk 1.pdf 2.pdf 3.pdf cat output 123.pdf
ถ้าจะ Split ก็ใช้
pdftk A=one.pdf B=two.pdf cat A1-7 B1-5 A8 output combined.pdf
ลองอ่านคำสั่งดูว่า argument คืออะไร ค่อนข้างตรงไปตรงมา

จริงๆ pdftk ยังทำได้อีกหลายอย่างเลย เช่น rotate, encrypt, decrypt, repair เป็นต้น

ลองอ่านวิธีเต็มๆได้ที่ http://www.pdfhacks.com/pdftk/

ระบบที่ทดสอบ
OS: Ubuntu 8.10
S/W: pdftk 1.41

วันอาทิตย์ที่ 5 เมษายน พ.ศ. 2552

Hibernate หายหลังจาก Disk Cleanup

วันนี้มีรุ่นพี่ในแลบบอกว่า Windows Vista อยู่ดีๆก็ Hibernate ไม่ได้หลังจากทำ Disk Cleanup ก็เลยลอง search ดูแล้วเจอ link แรกเลย เห็นเค้าว่าเป็น Bug ของ Vista ไม่รู้ว่ามี patch แก้ออกมารึยัง

วิธีแก้
1. เข้า cmd ด้วยสิทธิ administrator (Start > All Programs > Accessories คลิกขวา “Command Prompt” แล้วเลือก “Run as Administrator”)
2. พิมพ์คำสั่ง
powercfg -H on
รอสักพักจนเสร็จ hibernate ก็จะกลับมา

ระบบที่ทดสอบ
OS: Windows Vista SP1

ที่มา
http://esamsalah.blogspot.com/2008/03/powercfg-h-on.html

วันอังคารที่ 24 มีนาคม พ.ศ. 2552

การเปลี่ยน Product Key ของ MS Office

สำหรับกรณีที่ต้องเปลี่ยน Product Key ของ MS Office ไม่ว่าด้วยเหตุผลใด (เถื่อน -> แท้, แท้ -> แท้อีกอัน, จำไม่ได้ -> แท้อันที่รู้) ให้ทำดังนี้

1. ปิดโปรแกรมของ MS Office ให้หมด
2. ไปที่ start -> run พิมพ์ regedit (เพื่อแก้ไข registry)
3. แนะนำว่าให้ back up ก่อน โดยกด file -> export แล้วเซฟไฟล์ .reg เก็บไว้
4. ในหน้าต่างของ regedit เมื่อกี้
Office 2007 ไปที่
HKEY_LOCAL_MACHINE \Software\Microsoft\Office\12.0\Registration
Office 2003 ไปที่
HKEY_LOCAL_MACHINE \Software\Microsoft\Office\11.0\Registration
Office XP ไปที่
HKEY_LOCAL_MACHINE \Software\Microsoft\Office\10.0\Registration
5. เลือก entry GUID ย่อยในนั้น (ที่เป็นตัวเลขผสมอักษรยาวๆ)
6. ในหน้าต่างทางขวา ให้ลบ DigitalProductID และ ProductID ออก
7. ปิด regedit และเปิดโปรแกรมของ MS Office ใหม่ จะมีให้ใส่ Product Key ใหม่ได้
เป็นอันเสร็จ

ระบบที่ทดสอบ
OS: Windows XP SP3
Office: MS Office 2003 Professional Plus

อ้างอิง
http://support.microsoft.com/kb/895456

ปัญหาพิมพ์ url ใน IE แต่ไปเปิดใน Firefox

อาการนี้เป็นอาการแปลกๆคือ เปิด IE เพื่อจะเข้าเวบต่างๆ แต่พอพิมพ์ url ลงไป กด enter หรือคลิก go แล้วปรากฎว่า Firefox กลับเปิดหน้าเวบนั้นแทน IE ที่เปิดอยู่ซะงั้น (จริงๆผมอยากจะ recommend ว่าดี จะได้ไปใช้ Firefox กัน อิอิ) ก็หาวิธีแก้อยู่นานเหมือนกัน ซึ่งคิดว่าต้นตอของปัญหาที่ผมเจอนั้นอาจเกิดจากการที่พยายามลง IE7 แล้วลงไม่สำเร็จ คือมันบอกว่าไม่สามารถลงได้ แล้วให้ restart เครื่อง

วิธีแก้

1. คลิกปุ่ม windows ซ้ายล่าง คลิก run แล้วพิมพ์ regedit เพื่อเข้าไปแก้ไขค่า register
2. แนะนำว่าให้ทำการ backup ก่อน โดยเลือก File -> export แล้วเซฟเก็บไว้
3. ให้ไปที่ entry HKEY_CLASSES_ROOT\CLSID\ {c90250f3-4d7d-4991-9b69-a5c5bc1c2ae6}
4. จัดการลบ entry นั้นทิ้ง
5. restart เครื่อง

ซึ่งถ้าใครทำตามนี้แล้วยังไม่ได้ให้ลองลง IE7 ใหม่ให้สมบูรณ์แล้ว restart เครื่อง แล้วลองเริ่มขั้นตอนที่ 1 ใหม่อีกครั้ง(ใครมีปัญหาในการลง IE7 เนื่องจากลงไม่ได้ให้ดูที่ http://ping2p.blogspot.com/2009/03/ie7.html)

ระบบที่ทดสอบ
OS: Windows XP SP3
IE: 6 (ซึ่งมีการลง IE7 ไม่สำเร็จ)
Firefox: 3.0.7

อ้างอิง
http://blog.codefront.net/2006/03/19/how-to-fix-ie-always-opening-firefox-instead/

ปัญหาไม่สามารถติดตั้ง IE7 ได้

ปัญหาคือเครื่อง Windows XP ที่ใช้ IE6 อยู่ แต่ทำการ upgrade เป็น IE7 ไม่ว่าจะผ่านทาง installer หรือผ่านทาง windows update จะไม่สามารถ upgrade ได้ โดยอาการคือเมื่อทำการติดตั้งไปซักพัก มันจะขึ้น progress bar ไปเรื่อยๆ แล้วพอถึงจุดหนึ่งมันจะบอกว่าไม่สามารถ install ได้ และให้เราทำการ restart เครื่อง โดยจะมีไฟล์ troubleshooting ขึ้นมาที่ desktop (เป็นไฟล์ html) ขออภัยที่ไม่สามารถจำคำเป๊ะๆได้ แต่อาการแบบนี้แหล่ะ

วิธีแก้
ผมได้ทำดังต่อไปนี้
1. d/l ตัว Microsoft Fix It ที่ http://go.microsoft.com/?linkid=9646979
2. ติดตั้งซะ โดยตัวนี้จะทำหน้าที่ในการ restore ค่า security setting ต่างๆให้กลับสู่ค่า default ของ windows
3. restart เครื่อง
4. ลง IE7 ใหม่

เป็นอันเรียบร้อย (ขั้นตอนที่ 3 ไม่แน่ใจว่าจำเป็นหรือไม่ เพราะในที่อ่านมาไม่มีเขียนเอาไว้ แต่ผมตอนแรกลองไม่ restart แล้วยังไม่ได้ผล เลยเริ่มทำใหม่แล้ว restart แล้วมัน work)

ระบบที่ทดสอบ
OS: Windows XP SP3
IE: เดิมมี 6 จะเปลี่ยนเป็น 7

อ้างอิง
http://support.microsoft.com/kb/949220

วันจันทร์ที่ 2 มีนาคม พ.ศ. 2552

ปัญหา run php บน command line ไม่ได้

อาการคือ run php บน apache server บน localhost ได้เป็นปกติ
แต่พอจะลอง run php เฉยๆบน cmd (command line) ปรากฎมันขึ้น pop-up
php.exe - Unable to Locate Component
This application has failed to start because php_mbstring.dll was not found. Re-installing the application may fix this problem.

แล้วในจอ cmd ขึ้นว่า
PHP Warning: PHP Startup: Unable to load dynamic library 'C:\AppServ\php5\ext\php_exif.dll' - The specified module could not be found.
in Unknow on line 0

บ่อเกิดของปัญหา คิดว่ามี 2 แบบ โดยให้ดูในไฟล์ php.ini
1. extension_dir กำหนดชี้ไปผิดที่หา dll ไม่เจอ (dll เก็บอยูุ่ในโฟลเดอร์ ext ของ php5 ที่เราลงไว้)
2. extension=php_mbstring.dll นั้นประกาศไว้หลัง extension=php_exif.dll

วิธีแก้
ซึ่งกรณีของผมเป็นกรณีที่สอง เนื่องจากว่า php_exif.dll นั้นต้องมีการเรียกใช้ php_mbstring.dll ก่อน ดังนั้นให้ย้าย ขึ้นมาไว้บรรทัดก่อน php_exif.dll
แต่ถ้าเป็นกรณีที่หนึ่งก็ให้แก้ extension_dir ชี้ไปให้ถูกที่แทน

เมื่อทำดังนั้นก็สามารถใช้งานได้เลย (ส่วนสาเหตุว่าทำไม run บน apache localhost แล้วผ่านนี่ไม่แน่ใจ แต่เดาว่า apache อาจจะมีกระบวนการในการ resolve ปัญหานี้โดยเว้นไปโหลดอันอื่นก่อนแล้วค่อยกลับมาโหลดตัวที่ค้างอยู่ทีหลัง)

ระบบที่ทดสอบ
OS: Windows Vista SP1
PHP: ลงผ่าน AppServ 2.5.10

วันเสาร์ที่ 10 มกราคม พ.ศ. 2552

คำสั่งใช้แทน NetStumbler บน Vista

ปัญหาคือผมโหลด NetStumbler มาเพื่อหารายละเอียด access point ที่เปิดไว้ แต่ปรากฎว่าเจ้า NetStumbler มันไม่ support Vista ซะนั่น

ดังนั้นก็เจอมีวิธีที่ง่ายๆแต่ใช้ได้คือ
1. เข้า cmd
2. สั่ง
netsh wlan show networks mode=bssid

เป็นอันเสร็จ

ระบบที่ทดสอบ
OS: MS Windows Vista SP1

วันอังคารที่ 6 มกราคม พ.ศ. 2552

ปัญหา Cannot modify header information - headers already sent .... บน PHP

ปัญหานี้เกิดจาก มีการส่ง header ไปใหม่หลังจากที่มีการส่ง header และ content ไปครั้งนึงแล้ว

วิธีตรวจแก้ปัญหา
1. ลองดูว่าก่อนที่เรามีการส่ง header ไปใหม่ (เช่น คำสั่ง header()) นั้นมีการ echo หรือ print อะไรออกแล้วหรือไม่ ถ้ามีต้องเอาออกถึงจะใช้คำสั่งเพื่อส่ง header ไปได้

2. ดูว่าด้านหน้า tag ตอนจบ มีเว้นวรรคซ่อนหรือ whitespace รูปแบบอื่นอยู่หรือไม่ กรณีนี้บางครั้งมักเกิดจากไฟล์ UTF-8 แล้วมีการเติม BOM ไว้ที่เริ่มไฟล์ (แต่จะมองไม่เห็น) เช่น ใช้ notepad2 แล้ว encoding เป็น UTF-8 with signature เป็นต้น ให้แก้โดยใช้ UTF-8 เฉยๆ

ระบบที่ทดสอบ
PHP: 5.2

อ้างอิง
http://www.tech-recipes.com/rx/1489/solve-php-error-cannot-modify-header-information-headers-already-sent/