หน้าเว็บ

วันอังคารที่ 16 ธันวาคม พ.ศ. 2551

แก้ปัญหา Power Calibration Error ใน Nero

ไปคุ้ยๆแล้วเจอหลายวิธีด้วย แต่เจอหน้านึงรวมไปหลายอันก็ขอแปลกันมาเลยแล้วกัน

ซึ่งวิธีที่ผมใช้แล้วได้ผลคือข้อ 3 ครับ โดยผมทำที่เครื่อง Windows XP SP2 และ Nero 8

1. ลองเปลี่ยนแผ่น เค้าบอกว่าปัญหานี้เกิดขึ้นบ่อยๆกับแผ่นเปล่าราคาถูกที่คุณภาพห่วย

2. ลองเบิร์นโดยใช้ความเร็วการเขียนแผ่นที่ต่ำลง

3. Disable การทำงานของ IMAPI Service (เค้าบอกว่ามักจะแก้ปัญหาได้ และก็ผมก็ใช้วิธีนี้แล้วเวิร์ค)
-ไปที่ Control Panel -> Administrative Tools -> Services
- หา service ที่ชื่อ "IMAPI CD-Burning COM Service", คลิ๊กขวาแล้วเลือก properties
- เปลี่ยน Startup type เป็น Disabled.
- คลิ๊ก Apply.


4. ลองเปลี่ยน software ที่ใช้ในการเขียนแผ่นเป็นเวอร์ชันใหม่

5. ลอง upgrade เฟิร์มแวร์ของเครื่องเขียนแผ่น

6. ถ้าทำทุกวิธีข้างบนแล้วยังไม่ผ่านแสดงว่าปัญหาเกิดจากตัวอุปกรณ์เองไม่เกี่ยวกับซอฟต์แวร์ นำอุปกรณ์ไปให้ช่างทำความสะอาดเลนส์

7. ถ้ายังไม่ได้อีกก็แสดงว่าตัวหัวอ่านแผ่นคงเจ๊งไปแล้ว ไปหามาเปลี่ยนหรือซื้อใหม่ดีกว่า


ที่มา
http://www.megaleecher.net/Fix_Power_Calibration_Error
http://www.gidforums.com/t-1805.html

วันศุกร์ที่ 12 ธันวาคม พ.ศ. 2551

ใช้ python อ่านไฟล์ csv

วันนี้ต้องเขียนโปรแกรมอ่านค่าจากไฟล์ csv ซึ่งแปลงมาจากโปรแกรม spreadsheet (เช่น OOo Calc หรือ MS Excel) ก็เลยทดลองเขียนด้วย python ดู และไปเจอว่า python มี built-in module สำหรับจัดการ csv โดยเฉพาะเลย

สมมติว่าในไฟล์ filename.csv มีเนื้อหาไฟล์ดังนี้
3, a, xyz
8, t, www
4, x, abc

สามารถเขียนโปรแกรมได้แบบนี้
import csv

file = open("path/to/filename.csv", "r")
parser = csv.reader(file)

for field1, field2, field3 in parser:
print 'FIELD1=%s, FIELD2=%s, FIELD3=%s\n' % (field1, field2, field3)

file.close()

ผลลัพธ์ ได้ดังนี้

FIELD1=3, FIELD2=a, FIELD3=xyz
FIELD1= 8, FIELD2=t, FIELD3=www
FIELD1=4, FIELD2=x, FIELD3=abc

หรือว่าตรง for loop เราอาจเขียนแค่
for row in parser: แค่นี้ก็ได้ แล้วเวลาเรียกค่าก็ใช้ row[0], row[1], row[2] แบบนี้แทน

อ้างอิง
http://www.python.org/dev/peps/pep-0305/

วันจันทร์ที่ 8 ธันวาคม พ.ศ. 2551

รูป network icon สำหรับ Dia

สำหรับคนที่อยากทำ Network Diagram หรือ Network Map โดยใช้ Dia ซึ่งเป็นโปรแกรม Opensource (http://projects.gnome.org/dia/ หรือ dia-installer.sourceforge.net/ สำหรับ windows) แต่รู้สึกว่า ภาพมันไม่สวยเลย

ก็ไปค้นๆเจอคนใจดีทำ icon สำหรับอุปกรณ์ network เพื่อ Dia โดยเฉพาะ ถึงจะไม่มากเท่าไหร่ แต่ก็คลุมพวกอุปกรณ์พื้นฐานที่ใช้กันบ่อยๆอย่างพอเพียง

ภาพตัวอย่าง















ดาวน์โหลดได้ที่นี่เลย http://gnomediaicons.sourceforge.net/

แล้วก็แตกไฟล์ออกมา เอาของที่อยู่ใน sheets และ shapes ไปใส่ไว้ใน sheets และ shapes ที่ dia ในเครื่องเรา (เช่น /usr/local/dia หรือ C:\Program Files\dia)

โดยเวลาใช้งานรูปจะอยู่ในหมวด RIB-Network

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

วิธีการ replace string ในหลายๆไฟล์ บน Linux

จริงๆแล้ววิธีการ replace string บน linux ทำได้หลายวิธี ขอลองนำเสนอ 2 วิธีด้วยกัน

วิธีแรก
ใช้ grep + perl
$ grep -rl OLDSTRING . | xargs perl -pi -e ’s/OLDSTRING/NEWSTRING/g’
วิธีที่สอง ใช้ grep + sed
$ grep -rl OLDSTRING . | xargs sed -e ’s/OLDSTRING/NEWSTRING/g’
อธิบาย
คำสั่ง grep จะช่วยเลือกไฟล์ที่มี OLDSTRING ประกอบอยู่โดยเริ่มตั้งแต่ current directory (.) เป็นต้นไป ซึ่งถ้าต้องการให้เริ่มที่ directory อื่นก็สามารถเปลี่ยน . เป็นรูปแบบอื่นได้

ส่วน option -r หมายถึงให้ recursive ทุกไฟล์และโฟลเดอร์
optoin -l หมายถึงเลือกเฉพาะไฟล์ที่มี OLDSTRING อยู่

ส่วน option ใน perl มีความหมายดังนี้
-e ที่อยู่ท้ายสุดคือ script ที่เราจะทำงาน นั่นคือคำสั่ง replace string global จาก OLDSTRING ให้เป็น NEWSTRING
-p คือให้ลูป script ด้วย
while (<>) {
# your script goes here
} continue {
print or die "-p destination: $!\n";
}
-i คือให้แทน <> ในลูปด้วยไฟล์ที่รับเข้ามา ซึ่งก็คือไฟล์ทั้งหมดที่รับมาจาก grep นั่นเอง

ส่วน xargs จะทำให้ perl รับอาร์กิวเมนต์ได้ไม่จำกัด คือ สามารถรองรับไฟล์จำนวนมากจาก grep ที่ส่งมาเป็นอาร์กิวเมนต์

ส่วนคำสั่ง sed นั้นเป็น stream editor ที่จะทำการ run คำสั่งที่ระบุไปยัง stream ของไฟล์ที่ส่งเข้ามาจาก grep
option -e คือ คือรับ expression script ที่จะกระทำกับ input ที่รับเข้ามา

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

วันพุธที่ 26 พฤศจิกายน พ.ศ. 2551

วิธีการเปิด Port แบบระบุ range ใน Windows Firewall

ปกติแล้ว Windows Firewall นั้นจะไม่มีให้เราใส่ช่วงของ Port ที่ต้องการเปิดได้ ถ้าต้องเปิด port จำนวนมากๆก็เหนื่อยอยู่

แต่ถ้าเขียน script run บน command line ก็จะช่วยให้สบายมากขึ้น

สมมติว่าถ้าเราต้องการเปิด port ช่วง 5000 ถึง 5100 เพื่อใช้สำหรับ FTP ก็สามารถสั่งได้แบบนี้

for /L %i in (5000,1,5100) do netsh firewall add portopening TCP %i "FTP %i"
โดยคำว่า "FTP %i" นั้นใช้เป็น prefix ว่าตั้งชื่อว่า "FTP วรรค หมายเลขport"

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

OS: Windows Server 2003

หลักการพื้นฐานการเปิด port ของ FTP

การใช้งาน FTP ประกอบด้วย FTP Server และ FTP Client ซึ่งต้องมีวิธีการจัดการเกี่ยวกับ Port

FTP จะใช้ port หลักๆอยู่ 2 port ด้วยกันคือ port 20 และ 21
Port 21: ใช้ในการส่ง Control Message
Port 20: ใช้ในการส่ง Data Message หรือข้อมูลจริงที่ทำการรับส่งไฟล์
และนอกจากนั้นยังต้องใช้ random port อื่นๆเพื่อรองรับกรณีที่มีหลาย connection เชื่อมต่อเข้ามาพร้อมกัน

โดยจะเปิด port ไหนนั้นขึ้นอยู่กับการใช้งาน FTP ว่าเป็นลักษณะใด โดยแบ่งได้ 2 ลักษณะ

1. Active FTP แบบนี้ใช้ทั้ง port 20,21
command : client >1023 -> server 21
data : client >1023 <- server 20

ดังนั้น ฝั่ง client ต้องเปิด port มากกว่า 1023 เอาไว้ ฝั่ง server ต้องเปิด port 21 ขาเข้า และเปิด port 20 ขาออก

2. Passive FTP แบบนี้ไม่ต้องใช้ port 20
command : client >1023 -> server 21
data : client >1023 -> server >1023

ดังนั้น
ฝั่ง client ต้องเปิด port มากกว่า 1023 ขาออก
ฝั่ง server ต้องเปิด port 21 ขาเข้า และเปิด port มากกว่า 1023 ขาเข้า

ซึ่งปัจจุบัน FTP Server ส่วนใหญ่ก็มักใช้แบบ Passive เพราะเราไม่ต้องไปสนใจว่า client จะเปิด port ให้เรา(server)เชื่อมต่อไปได้หรือไม่

โดย port ที่มากกว่า 1023 ที่กล่าวในนี้นั้นแล้วแต่เราจะเลือกเปิด ซึ่งที่ผมใช้ Filezilla Server ในตัวอย่าง FAQ ของเค้ายกตัวอย่างว่า 5000-5100 สำหรับการเปิด port แบบเป็น range บน Windows Firewall นั้นดูได้ที่ http://ping2p.blogspot.com/2008/11/port-range-windows-firewall.html

อ้างอิง
http://www.slacksite.com/other/ftp.html

วันจันทร์ที่ 17 พฤศจิกายน พ.ศ. 2551

Clone VirtualBox Guest OS

ที่จะทำคือ ในเครื่องแรก มี VirtualBox ซึ่งมี GuestOS อยู่ และต้องการย้าย Guest OS ที่ใช้งานอยู่นี้ไปทำที่เครื่อง(physical)อื่น
ซึ่งไฟล์ที่ใช้เก็บ Guest OS นั้นจะมีสกุล .vdi ที่ตอนแรกเราได้สร้างเอาไว้ แต่ว่าจากลองอ่านๆมาเค้าว่าการก๊อปปี้ไฟล์นี้ไปดื้อๆเลยนั้นไม่ดีอาจมีปัญหาภายหลังได้

วิธีที่ถูกต้องให้ใช้คำสั่งที่มากับ VirtualBox อยู่แล้วในการ Clone
VBoxManage clonevdi sourcefile destfile
โดย sourcefile ให้ชี้ไปที่ vdi ที่เราต้องการทำการ clone ส่วน desfile ก็ให้ระบุเป็นไฟล์ใหม่ที่ต้องการ
เช่น
VBoxManage clonevdi "C:\vbox\ubuntu.vdi" "C:\clonevbox\cloneubuntu.vdi"
ซึ่งคำสั่ง VBoxManage จะอยู่ในโฟลเดอร์ที่เราลง VirtualBox ไว้ ถ้าเราไม่ได้เอาไว้ใน environment variable PATH เราก็ต้องระบบคำสั่งแบบ fullpath หรือไม่ก็ไปอยู่ที่โฟลเดอร์นั้นแล้วค่อยสั่ง

ป.ล. แต่ว่ายังมีปัญหาคือผมไม่สามารถเอา snapshot ติดไปด้วยได้ เลยแก้โดย merge ทุก snapshot ให้เหลือแค่อันล่าสุดอันเดียวครับ

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

HostOS: Windows XP SP2
VirtualBox: 2.0.4

Screen Resolution ไม่ auto-resize (VirtualBox & Intrepid)

อาการต่อเนื่องจากโพสก่อน http://ping2p.blogspot.com/2008/11/ubutu-8.html

แต่อันนี้คือ Screen Resolution ไม่ปรับขนาดตามหน้าจอของ host os และถ้าเลือกเปลี่ยนเองที่ System->Preferences->Screen Resolution ก็มีให้เลือกแค่ 800x600 กับ 640x480

วิธีแก้คือ
1) ตรวจสอบว่ามี vboxvideo_drv.so อยู่ที่ /usr/lib/xorg/modules/drivers
2) เป็น root แล้วแก้ไข /etc/X11/xorg.conf
2.1) เพิ่มใน section Device
Section "Device"
Identifier "Configured Video Device"
Driver "vboxvideo"
EndSection

2.2) เพิ่มใน section Screen
Section "Screen"
Identifier "Default Screen"
Monitor "Configured Monitor"
Device "Configured Video Device"
SubSection "Display"
Modes "1280x800" "1280x768" "1024x768" "800x600" "640x480"
EndSubSection
EndSection

โดยความละเอียดนั้นขึ้นอยู่กับความละเอียดที่รองรับของแต่ละเครื่อง
3) restart Ubuntu Guest

ระบบที่ทดสอบ
Host: Windows Vista SP1 Business
Guest: Ubuntu 8.10 Intrepid Ibex
VirtualBox: 2.0.4

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

Mouse Integration ไม่ทำงาน (VirtualBox & Intrepid)

ปัญหาคือผมลง Ubutu 8.10 (Intrepid Ibex) บน Virtual Box ที่มี host คือ Windows Vista

พอลงเสร็จก็ทำงานได้ปกติ แต่คราวนี้พอจะลง Guest Addition เพื่อให้มันมี Mouse Integration ได้กลับพบปัญหาคือ Guest Addition บอกว่าลงสำเร็จด้วยดี แต่ Mouse Integration ยังไม่ทำงาน ต้องคอยคลิ๊กเพื่อให้ capture ก่อนถึงจะทำงานได้ แล้วค่อยกด Ctrl เพื่อออก ทำให้ไม่สะดวกเป็นอย่างมาก

ก็ไปพบวิธีแก้มาจาก ticket ของเวบ virtualbox เองดังนี้

1) ตรวจสอบว่ามีไฟล์ vboxmouse_drv.so อยู่ที่ /usr/lib/xorg/modules/input รึเปล่า (ควรมีอยู่)
2) เป็น root แล้วแก้ไขไฟล์ /etc/X11/xorg.conf โดยให้เพิ่ม
Section "InputDevice"
Identifier "Configured Mouse"
Driver "vboxmouse"
Option "CorePointer"
EndSection

เข้าไป (แต่ละบรรทัดใช้ tab หน้าสุด และระหว่างคำ)
3) restart ตัว guest linux

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

HostOS: Windows Vista SP1 Business
GuestOS: Ubuntu 8.10 Intrepid Ibex
VirtualBox: 2.0.4

ที่มา
http://www.virtualbox.org/ticket/2545
http://forums.virtualbox.org/viewtopic.php?p=43200#43200

วันจันทร์ที่ 10 พฤศจิกายน พ.ศ. 2551

วันจันทร์ที่ 3 พฤศจิกายน พ.ศ. 2551

Cross Browser IFrame Script

IFrame มีปัญหาในการทำงานกับหลายๆ browser ซึ่งปัญหาที่ผมเจอคือเรื่องการ auto-resize เพื่อให้ปรับขนาดตาม content ด้านใน IFrame ก็เลยลองหา Script หลายตัวมาทดสอบ ซึ่งรู้สึกว่า Script ตัวนี้ใช้ได้ดี โดยไม่ยุ่งเหยิง

โดยเอาใส่ไว้ในส่วนที่เป็น JavaScript

function autoIframe(frameId) {
try {
frame = document.getElementById(frameId);
innerDoc = (frame.contentDocument) ? frame.contentDocument : frame.contentWindow.document;
objToResize = (frame.style) ? frame.style : frame;
objToResize.height = innerDoc.body.scrollHeight + 10;
} catch(err) {
window.status = err.message;
}
}

แล้วก็ส่วนที่เราทำการประกาศ iframe ก็ให้ใส่ onload เพิ่มเข้าไปเพื่อให้ไปเรียกฟังก์ชัน javascript โดยส่งพารามิเตอร์เป็นชื่อของ iframe ที่เราประกาศไว้ (เช่นในตัวอย่างข้างล่างให้คำว่า tree)

onload="if (window.parent && window.parent.autoIframe) {window.parent.autoIframe('tree');}"

Browser ที่ทดสอบ
Firefox 3.0.3
IE 6.0
Opera 9.62
Safari 3.1.2
Maxthon 2.1.4
Chrome 0.3.154
Plawan 1.1

วันอาทิตย์ที่ 2 พฤศจิกายน พ.ศ. 2551

ลง VirtualBox GuestAddition บน Linux Host

ใช้ host เป็น WindowsXP แล้วลง VirtualBox แล้วก็ลง CentOS5 เป็น Guest OS
คราวนี้พอจะลง GuestAddition แล้วปรากฎว่าไม่สามารถลงได้ ขึ้น error ดังนี้
[root@localhost VBOXADDITIONS_2.0.4_38405]# sh ./VBoxLinuxAdditions.run
Verifying archive integrity... All good.
Uncompressing VirtualBox 2.0.4 Guest Additions for Linux installation....................
............................................................................................................................
............................................................................................................................
......................
VirtualBox 2.0.4 Guest Additions installation
Please install the build and header files for your current Linux kernel.
The current kernel version is 2.6.18-53.1.13.el5
Please install the GNU compiler.
Problems were found which would prevent the Guest Additions from installing.
Please correct these problems and try again.
ก็แก้ตาม step ที่ฟ้องมาเลยคือ
1. ลง build and header files
yum install kernel-devel
แล้วสร้าง link ไว้ด้วยใน /usr/src
cd /usr/src
ln -s kernels/2.6.18-92.1.6.el5-i686 linux

(เลขเวอร์ัชันขึ้นอยู่กับ kernel ของ linux แต่ละรุ่น)
2. ลง GNU compiler
yum install gcc
คราวนี้ก็กลับไปที่โฟลเดอร์ของ VBoxAddition แล้วสั่ง run ใหม่
sh ./VBoxLinuxAdditions-x86.run
เป็นอันเรียร้อย

ระบบที่ทดสอบ
Host OS: WindowsXP SP2
GuestOS: CentOS 5
VirtualBox: 2.0.4

อ้างอิง
http://www.centos.org/modules/newbb/viewtopic.php?topic_id=12724
http://aparker.co.uk/?p=7

วันศุกร์ที่ 31 ตุลาคม พ.ศ. 2551

คำสั่งเข้าหน้า Local Users and Groups

เวลาที่ต้องการจัดการเกี่ยวกับ user ใน windows ให้ไปที่ Run แล้วสั่ง
lusrmgr.msc

ระบบที่ได้ทดลอง
OS: MS Windows XP, Server 2003

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

คำสั่งที่ใช้ในการตรวจสอบ port ที่เปิดอยู่ใน FreeBSD

ถ้าต้องการรู้ว่าโปรแกรมอะไรมีการเปิด port อะไรไว้บ้าง ก็จะมีคำสั่งคือ sockstat
โดยมี option ที่ใช้บ่อยๆ 4 ตัวคือ
-4 ใช้สำหรับแสดง IPv4 sockets.

-6 ใช้สำหรับแสดง IPv6 sockets.

-c ใช้สำหรับแสดง port ที่มีการเชื่อมต่อ (c = connected)

-l ใช้สำหรับแสดง port ที่เปิดไว้ (l = listen)

เช่น
sockstat -4 -l
ใช้สำหรับแสดง port ทั้งหมดที่เปิดไว้ที่ใช้ IPv4

วันอาทิตย์ที่ 26 ตุลาคม พ.ศ. 2551

List installed package

วิธีสำหรับการตรวจสอบว่าเราได้ลง package อะไรไปแล้วบ้าง

สำหรับตระกูล Redhat, CentOS
rpm -qa
rpm -qa | grep 'package-name'
rpm -qa | grep -i '*httpd*'

สำหรับตระกูล Debian, Ubuntu
dpkg --list
dpkg --list | grep 'package-name'
dpkg --list | grep -i '*php*'

สำหรับตระกูล BSD, OpenBSD, FreeBSD
$ pkg_info
$ pkg_info | grep 'package-name'

ที่มา
http://www.cyberciti.biz/faq/howto-display-list-of-all-installed-software/

วันเสาร์ที่ 25 ตุลาคม พ.ศ. 2551

ปัญหาการลง PIL (Python Image Library) บน FreeBSD

ในการที่จะลง Plone นั้นต้องมีการลง PIL (Python Image Library) ก่อน
แต่พอผมลงแล้วเกิดปัญหาคือพอสั่ง python setup.py build_ext -i แล้วเกิด error ดังนี้

building '_imagingtk' extension

creating build/temp.freebsd-5.5-RELEASE-i386-2.4/Tk

cc -fno-strict-aliasing -DNDEBUG -O -pipe -D__wchar_t=wchar_t -DTHREAD_STACK_SIZE=0x100000 -fPIC -I/usr/local/include/freetype2 -IlibImaging -I/usr/local/include -I/usr/include -I/usr/local/include/python2.4 -c _imagingtk.c -o build/temp.freebsd-5.5-RELEASE-i386-2.4/_imagingtk.o

_imagingtk.c:20:16: tk.h: No such file or directory

_imagingtk.c:23: error: syntax error before '*' token

_imagingtk.c:31: error: syntax error before "Tcl_Interp"

_imagingtk.c: In function `_tkinit':

_imagingtk.c:37: error: `Tcl_Interp' undeclared (first use in this function)

_imagingtk.c:37: error: (Each undeclared identifier is reported only once

_imagingtk.c:37: error: for each function it appears in.)

_imagingtk.c:37: error: `interp' undeclared (first use in this function)

_imagingtk.c:45: error: syntax error before ')' token

_imagingtk.c:50: error: `app' undeclared (first use in this function)

_imagingtk.c: At top level:

_imagingtk.c:55: warning: parameter names (without types) in function declaration

_imagingtk.c:55: error: conflicting types for 'TkImaging_Init'

_imagingtk.c:23: error: previous declaration of 'TkImaging_Init' was here

_imagingtk.c:55: error: conflicting types for 'TkImaging_Init'

_imagingtk.c:23: error: previous declaration of 'TkImaging_Init' was here

_imagingtk.c:55: warning: data definition has no type or storage class

_imagingtk.c:57: error: syntax error before '&' token

error: command 'cc' failed with exit status 1

ซึ่งปัญหาเค้าว่าอาจเป็นที่ python ได้ถูก link กับ Tkinter และ Tcl/Tk builid libraries แต่ไม่ได้ link กับ Tcl/Tk include files

วิธีแก้
1. locate Tcl/Tk developer package (ผมไม่ได้ทดลองวิธีนี้)
หรือ
2. ให้แก้ไฟล์ setup.py โดยการ comment บรรทัดดังต่อไปนี้ทิ้ง
         elif feature.tcl and feature.tk:
exts.append(Extension(
"_imagingtk", ["_imagingtk.c", "Tk/tkImaging.c"],
libraries=[feature.tcl, feature.tk]
))
ระบบที่ทดสอบ
OS: FreeBSD 6.2
PIL: 1.1.6
Python: 2.4.5

ที่มา
http://mail.python.org/pipermail/image-sig/2007-November/004662.html

วันศุกร์ที่ 24 ตุลาคม พ.ศ. 2551

วิธีเปลี่ยน default directory ของ Command Prompt (cmd)

บางครั้งถ้าเราต้องมีการเข้า command prompt (cmd) บ่อยๆ แล้วต้องไปที่ directory ใดสักที่หนึ่ง การที่ต้องมาเปลี่ยน directory ทุกครั้งที่เข้า cmd ก็จะค่อนข้างเสียเวลามาก

แต่เราสามารถเปลี่ยน default directory ให้มันได้ดังนี้
1. Start -> Run -> พิมพ์ regedit
2. ไปที่ HKEY_CURRENT_USER \ Software \ Microsoft \ Command Processor
3. ในกรอบทางขวา ในกรณีที่ไม่มี Name ที่ชื่อ Autorun อยู่ให้สร้างขึ้นมาโดย คลิ๊กขวา -> New -> String Value
4. ดับเบิ้ลคลิ๊ก Autorun
5. ในช่อง Value data ให้ใส่ "CD /d " แล้วตามด้วยชื่อ directory ที่เราต้องการ เช่น CD /d C:\Program Files\ เป็นต้น

หรือว่าถ้าเราต้องการสั่งให้มันทำงานอะไรเมื่อเริ่มต้นก็สามารถสร้างไฟล์ .bat แล้วใส่ path ไปยังไฟล์นั้นใน Value data แทนเลยก็ได้

วันเสาร์ที่ 18 ตุลาคม พ.ศ. 2551

การกำหนดค่าที่เซนเซอร์แต่ละตัวอ่านได้ใน TinyDB บน TOSSIM

โดยปกติแล้วถ้า run TinyDB ด้วย TOSSIM นั้น ค่าที่เซนเซอร์แต่ละตัวอ่านได้ในแต่ละช่วงเวลานั้นจะเป็นค่าที่ random ขึ้นมา ซึ่งในบางสถานการณ์เราอาจต้องการ fix ค่า หรือต้องการให้ค่าที่อ่านได้เป็นไปตามสมการที่เรากำหนด (เช่น ในธีสิสผมเป็นต้นที่ต้องการ evaluate ว่าข้อมูลที่อ่านได้ กับข้อมูลที่มีอยู่ในระบบจริงนั้น ถูกต้องขนาดไหน เป็นต้น)

ซึ่ง TinyDB ถ้า compile แบบ make pc เพื่อให้ใช้ TOSSIM แล้วจะเห็นว่าใน Makefile นั้นมีการใช้ Micasb เป็น sensorboard ดังนั้นวิธีที่ผมแก้ง่ายที่สุดคือ ไปสร้าง component ที่ provides interface StdControl และ ADC โดยใน module นั้นก็ให้ทำการสร้าง command async command result_t ADC.getData() แล้วใน command นั้น ก็อาจจะให้ทำการตรวจสอบ TOS_LOCAL_ADDRESS แล้วก็สั่ง signal ADC.dataReady(VALUEที่ต้องการ); เป็นอันเสร็จ

สมมติว่าเราต้องการกำหนดค่าของเซนเซอร์อุณหภูมิ ก็ให้ไปที่ Temp.nc แล้วแก้ไข components PhotoTemp ให้มาใช้ component ของเราแทน และเปลี่ยนการ assign interface StdControl กับ TempADC มาใช้เป็นของเราแทนเช่นเดียวกัน

แล้วก็ทำการ compile ใหม่ เป็นอันเสร็จพิธีครับ

TinyDB บน TOSSIM ไม่แสดงผล

ปัญหาคือลอง run TinyDB โดยใช้ TOSSIM แล้ว ปรากฎว่า พอส่งคิวรีเข้าไปในระบบแล้ว ไม่ได้คำตอบกลับมา คือในหน้าที่เป็นกราฟไม่มีอะไรเกิดขึ้น

จริงๆแล้วไม่รู้ว่าปัญหาคืออะไรเหมือนกัน แต่แก้โดยการคอมไพล์ใหม่ซะเลย

ขั้นแรก
ไปที่ folder tinyos-1.x/apps/TinyDBApp แล้วสั่ง
make clean
ขั้นสอง
ไปที่ tinyos-1.x/tools/java
make clean
ขั้นสาม
ไปที่ tinyos-1.x/tools/java/net/tinyos/tinydb
make -f MakePC
ขั้นสี่
ไปที่ tinyos-1.x/apps/TinyDBApp อีกครั้ง
make -f MakePC pc
เป็นอันเสร็จ พอจะทำงานก็เปิดสอง shell
shell แรกไปที่ /tinyos-1.x/apps/TinyDBApp
./build/pc/main.exe
shell ที่สองไปที่ /tinyos-1.x/tools/java
java net.tinyos.tinydb.TinyDBMain -sim
Environment ที่ทดสอบ
TinyOS: 1.1.15 snapshot
TinyDB: 1.1.3
OS: Cygwin on WIndows XP

วันพุธที่ 17 กันยายน พ.ศ. 2551

#1366 - Incorrect integer value: '' for column 'id' at row 1 โดยเป็น auto_increment

ผมใช้ MySQL แล้วมีการสร้าง table ซึ่งมี field ที่เป็น id ที่เป็น auto_increment

แต่พอสั่งคำสั่งเพื่อ insert record เข้าไป โดยค่าของ id ผมให้เป็น '' (single quote สองอัน) ที่เป็นค่าว่าง
ปรากฎว่ามันไม่ยอมให้ใส่ และฟ้องว่า

#1366 - Incorrect integer value: '' for column 'id' at row 1

โดยสาเหตุเกิดจากการตั้งค่า mode ของ sql ให้เป็น STRICT_TRANS_TABLES (ซึ่งจริงๆแล้วเป็นค่า default ที่ตั้งมาไว้ตั้งแต่ตอนแรก)

วิธีแก้
วิธีแรก: ให้ใส่เป็น NULL แทนที่จะเป็น ''
วิธีที่สอง: ให้ใช้คำสั่ง INSERT IGNORE แทน INSERT เฉยๆ และสามารถใส่ค่าเป็น '' เฉยๆได้
วิธีที่สาม: ยกเลิก STRICT_TRANS_TABLE โดยแก้ที่ไฟล์ my.ini (windows) หรือ my.cnf (linux) ตรง sql-mode ให้ลบ STRICT_TRANS_TABLE ออก

ระบบที่ทดสอบ
MySQL: 5.0.51b
Apache: 2.2
OS: Windows XP SP2

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

ปัญหา data for speech recognition was lost ใน MS Word 2003

หลายครั้งที่ทำงานใน MS Word แล้วเกิดปัญหาเล็กน้อยเวลา save งาน จะมีคำเตือนที่ค่อนข้างน่าหงุดหงิดขึ้นมาทุกครั้งว่า

"The document was saved, but data for speech recognition was lost because there was not enough space to store it. Be sure to turn off the microphone when you are not recording, and check the available storage space on the disk."

วิธีแก้ก็ให้ไปที่
Tools > Options > Save > เอาเครื่องหมายถูกออกจาก 'Embed linguistic data'
เป็นอันเรียบร้อย

โปรแกรมที่ใช้

MS Word 2003

วันพฤหัสบดีที่ 11 กันยายน พ.ศ. 2551

Virtual Keyboard

เจอ Fwd เมล์นึงบอกว่า ถ้าคีย์บอร์ดบางปุ่มเสีย เช่น ตัว ส. เสือ ทำให้กดไม่ได้ ให้แก้ด้วยการไปที่ Windows->Run แล้วพิมพ์ osk แล้ว enter จะมี On-Screen Keyboard ออกมาให้ใช้ได้

แต่คราวนี้ถ้าเกิดว่าไม่มีคีย์บอร์ด หรือคีย์บอร์ดไม่ทำงานเลยล่ะ ก็พิมพ์ osk ไม่ได้แล้ว

ก็เลยลองไปค้นดูใน Accessibility ก็พบว่าเจ้า osk มันอยู่ในนี้นี่เอง
Windows->All Programs->Accessories->Accessibility->On-Screen Keyboard
ก็จะมี Virtual Keyboard ออกมาให้ใช้ mouse คลิ๊กได้ล่ะ

ระบบที่ใช้งาน
OS: Windows XP SP2

วันพุธที่ 20 สิงหาคม พ.ศ. 2551

Disable Autorun ของ Thumbdrive, flashdrive

ไปที่ Run พิมพ์ gpedit.msc จะเกิดหน้าต่างขึ้นมา

เลือก Computer Configuration
เลือก Administrative Templates
เลือก System
ดับเบิ้ลคลิก Turn off Autoplay จะเกิดหน้าต่างใหม่ขึ้นมา

ที่แท็บ Setting
เลือก Enabled
เลือก All drives จาก drop-down box
เลือก OK

ที่มา
http://www.llbbl.com/2006/06/13/how-to-disable-autoplay/

ระบบปฏิบัติการ
Windows XP SP2

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

RAS entry creation / modification error

วันนี้ลองลง mobile PhoneTools ที่ติดมากับ Axen EDGE USB Air Card
ซึ่งลงสำเร็จด้วยดี แต่พอจะใช้งานต่อออกอินเตอร์เนตก็เจอ error ดังนี้
RAS entry creation / modification error
ไปเจอหลายๆเวบบอร์ดที่มีคนเจอปัญหาเดียวกัน

วิธีแก้
ไปเปิด service ที่ชื่อว่า Remote Access Connection Manager สั่งให้ start เป็นอันเสร็จ

อุปกรณ์ที่ทดสอบ
Device: Axen EDGE USE Air Card: Model EDGE-180M
SIM: Dtac
Software: mobile PhoneTools ของ BVRP
OS: Windows XP SP2

วันอังคารที่ 12 สิงหาคม พ.ศ. 2551

Twitsig รองรับภาษาไทยได้แล้ว

Twigsig คือการเอาข้อความจาก Twitter ไปแปะเป็น Signature ของเรา เช่นตาม webboard เป็นต้น

ซึ่งตอนแรกได้ทดสอบภาษาไทย แล้วปรากฏว่ามันกลายเป็น"ตัวสี่เหลี่ยม"

ก็เลยทำการติดต่อกับทาง Twitsig เพื่อส่ง font thai ไปให้เค้า โดยผมก็เลือกใช้ Loma จาก ftp://linux.thai.net/pub/ThaiLinux/software/thai-ttf/thai-ttf-0.4.9.tar.gz

แล้วก็ช่วยให้ feedback เค้าในการแก้จนมันออกมาดูค่อนข้างดี (ในสายตาผมนะ)

แต่ว่าก็ยังมีปัญหาเรื่องการตัดคำอยู่ เพราะตอนแรกเค้าให้ผมลองทดสอบพิมพ์เต็ม 140 ตัวอักษร ผมก็พิมพ์ต่อไปเลยโดยไม่เว้นวรรค เค้าก็งงๆว่าภาษาไทยมันมีการเว้นวรรคยังไง แล้วจะรู้ได้ไงว่าขึ้นบรรทัดใหม่เมื่อไหร่

ผมก็เลยบอกว่ามันยังเป็น open problem สำหรับภาษาไทยอยู่ ตอนนี้ก็ให้ force ไปก่อน แล้วถ้าการแข่งขัน BEST2009 จบเมื่อไหร่ ก็น่าจะมี software ดีๆที่มีช่วยในการตัดคำให้เค้าได้

สำหรับถ้าใครจะใช้ภาษาไทย ก็ให้เติม /thai เข้าไปด้วย เช่น http://twitsig.com/thai/kaizerwing.png
(แต่สำหรับไฟล์ .jpg ตอนนี้เหมือนจะยังมี bug)

ถ้าใครมีความรู้ด้านนี้ก็สามารถติดต่อมาทางผมหรือติดต่อทาง twitsig โดยตรงเลยก็ได้ครับ

วันอาทิตย์ที่ 10 สิงหาคม พ.ศ. 2551

แก้ปัญหา พิมพ์ subject ภาษาไทยไม่ได้ใน PHPList

อาการคือ เวลาส่งเมล์ แล้วถ้าพิมพ์หัวข้อ subject พอกด save จะไม่สามารถแสดงภาษาไทยได้ถูกต้อง

สำหรับคนที่ใช้ PHPList โดยไม่ได้เปลี่ยนภาษา (หรือเป็นภาษาอังกฤษ) สามารถไปแก้ที่ไฟล์ /lists/texts/englins.inc

โดยให้แก้จาก
$strCharSet = 'ISO-8859-1';
ให้เป็น
$strCharSet = 'UTF-8';
ก็จะสามารถใช้งานได้

ส่วนในตัว body นั้นก็ให้ไปตั้งค่า html charset และ text charset ใน configure ให้เป็น UTF-8 ทั้งคู่

**เพิ่มเติม
ตอนแรกใช้งานได้ แต่กลับมีปัญหาที่ตัว ภ. (ภ สำเภา) ไม่สามารถแสดงได้ถูก
วิธีแก้เพิ่มคือ ไปที่ไฟล์ admin/mysql.inc
ตรงฟังก์ชัน function Sql_Query($query,$ignore = 0) {
ให้เติม mysql_query("SET NAMES 'utf8'"); เข้าไป
function Sql_Query($query,$ignore = 0) {
mysql_query("SET NAMES 'utf8'");
if (isset($GLOBALS['lastquery'])) {
unset($GLOBALS['lastquery']);
}

แต่ว่าวิธีนี้คือตัวฐานข้อมูลก็ต้องตั้ง ให้เป็น utf-8 ด้วย

ระบบที่ทดสอบ
PHPList: 2.10.5

วันศุกร์ที่ 8 สิงหาคม พ.ศ. 2551

แก้ไขปัญหา Database error 1071 while doing query Specified key was too long; max key length is 1000 bytes ของ PHPList

เนื่องจากถ้าใช้ db เป็น MyISAM จะรองรับ index key ขนาดไม่เกิน 1000 bytes
แต่ว่า user_blacklist_data ใช้ email และ name เป็น index key ซึ่งมีขนาดรวมกันคือ 255+100 = 355 bytes
และถ้าใช้เป็น UTF แต่ละ character จะใช้ 3 bytes รวมเป็น 3*355 = 1065 bytes ซึ่งเกินที่กำหนด

วิธีแก้วิธีแรก สร้างตาราง user_blacklist_data ขึ้นมาเอง โดยลดขนาด email ลงเหลือ 233 bytes แทน ซึ่งปกติก็ไม่ค่อยมีใครใช้ถึงอยู่แล้ว
CREATE TABLE phplist_user_blacklist_data (email varchar(233)
not null unique,name varchar(100) not null,data text,index
emailidx (email),index emailnameidx (email,name))


หรือวิธีที่สอง ให้ใช้ InnoDB แทน MyISAM จะไม่เกิดปัญหานี้

ระบบที่ทดสอบ
PHPList: 2.10.5

ข้อมูลจาก
http://forums.phplist.com/viewtopic.php?t=8150
http://mantis.phplist.com/bug_view_advanced_page.php?bug_id=8583

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

แก้ PHPList ให้ทำงานกับ SMTP แบบ TLS

บังเอิญช่วงนี้ผมกำลัง implement ระบบ newsletter ให้กับองค์กรแห่งหนึ่งอยู่ ซึ่งผมก็เลือก PHPList มาใช้เพื่อการนี้

แต่คราวนี้มีปัญหาเกิดขึ้น เมื่อผมพยายามจะใช้ PHPList ส่งเมล์ โดยใช้ SMTP ขององค์กรแห่งนี้

ปัญหาคือว่า องค์กร นี้ใช้ SMTP Authentication, TLS, port 25

แต่ตัว PHPList เวอร์ชันล่าสุดที่ผมใช้นั้นคือ 2.10.5 นั้นไม่รองรับ TLS เพราะว่าลองไปดู module ในการส่งเมล์ของ PHPList จะเห็นว่ามันใช้ PHPMailer เวอร์ชัน1.73 (ดูจากไฟล์ Changelog อันบนสุด) แต่ว่าตัวที่จะรองรับต้องเป็น PHPMailer เวอร์ชัน 2 ขึ้นไป

ก็เลยลองไปโหลดเอา PHPMailer 2.2.1 มา แล้วทำกระบวนการตาม http://www.bookwish.org/phplist-and-gmail-smtp โดยทำการดัดแปลงเล็กน้อยจาก gmail ที่เป็น ssl ให้เป็น tls ดังนี้

สรุปคือ

1. extract PHPMailer 2.2.1 ออกมาจะได้โฟลเดอร์ชื่อ phpMailer_v2.2.1_ แล้วเอาไปไว้ที่ %YOURWWWROOT%/lists/admin โดย %YOURWWWROOT% เป็นที่อยู่ของ public_html หรือ htdocs หรือ wwwroot ของคุณ
2. แก้ไขไฟล์ %YOURWWWROOT%/lists/admin/class.phplistmailer.php
require_once dirname(__FILE__).'/accesscheck.php';

#require( dirname(__FILE__) . '/phpmailer/class.phpmailer.php');
require( dirname(__FILE__) . '/phpmailer_v2.2.1_/class.phpmailer.php');
require( dirname(__FILE__) . '/phpmailer_v2.2.1_/class.smtp.php');


3. ในไฟล์เดียวกัน แก้ฟังก์ชัน PHPlistMailer
...
if (isset($GLOBALS['phpmailer_smtpuser])...
$this->SMTPAuth=true;
$this->SMTPSecure="tls";
$this->Port=$GLOBALS['phpmailer_smtpport'];
$this->Username=$GLOBALS['phpmailer_smtpuser'];
$this->Password=$GLOBALS['phpmailer_smtppassword'];
...

4. ในไฟล์เดียวกัน ต่อจากเดิมลงมาหน่อย แก้
if (!$this->Host || $ip == $this->Host) {
$this->Mailer = "mail";
# logEvent('Sending via mail');
} else {
$this->Mailer = "smtp";
# logEvent('Sending via smtp');
}

ให้เป็น
if (!$this->Host) {
$this->Mailer = "mail";
# logEvent('Sending via mail');
} else {
$this->Mailer = "smtp";
$this->IsSMTP();
# logEvent('Sending via smtp');
}


5.แก้ไฟล์ %YOURWWWROOT%/ lists/config/config.php

...
define("PHPMAILERHOST",'mail.yoursmtpdomain.com');
...
$phpmailer_smtpuser='smtp username';
$phpmailer_smtppassword='smtp password';
$phpmailer_smtpport=25;
...

เป็นอันใช้ได้

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

PHPList: 2.10.5

Web Server: Apache2.2

Database: MySQL5

วันอังคารที่ 29 กรกฎาคม พ.ศ. 2551

การสร้าง Java class เพื่อใช้กับประเภทข้อมูลของ TinyOS

ในการเขียนโปรแกรมภาษา nesC นั้นส่วนใหญ่จะมีการสร้างประเภทตัวแปรไว้สำหรับจัดการกับ message ที่ส่งในระบบ หรือมีการประกาศค่าคงที่ต่างๆที่จะนำไปใช้ได้ โดยมักจะประกาศในไฟล์ .h หรือ header ไฟล์ เช่นเดียวกับภาษา C
แต่ถ้าเราจะเขียนโปรแกรมภาษาจาวาเพื่อทำการติดต่อข้อมูลกับระบบ sensor network ที่เขียนด้วยภาษา nesC นั้น เราก็จะต้องมีการสร้าง class บนภาษา Java เพื่อมารองรับ message นั้นๆ
ซึ่งใน TinyOS นั้นจะมี tool ที่ช่วยให้เราทำงานนี้ได้สบายขึ้น คือ MIG และ NCG

MIG
- Message Interface Generator
ตัวนี้จะเป็นตัวที่ใช้สร้าง class Java เพื่อจะรองรับ message ที่เราสร้างขึ้น

NCG- NesC Constant Generator
ตัวนี้จะทำหน้าที่ดึงค่า constant ต่างๆที่เราประกาศไว้ออกมาใส่ใน class Java

ก่อนอื่นผมขอสมมติว่า ผมทำ nesC app ไว้ที่ /opt/tinyos-1.x/apps/MyApp
โดยใน MyApp มีโฟลเดอร์ชื่่อ types ที่ใช้เก็บ header file ที่ใช้ประกาศประเภทข้อมูล message เอาไว้
และใน types มีไฟล์ชื่อ MyMsg.h ซึ่งภายในไฟล์มีการประกาศค่าคงที่ AM_TYPE และ message ไว้ คือ
// ไฟล์ MyMsg.h
enum AM_TYPE
{
AM_PINGMSG = 20,
AM_PINGREPLYMSG = 21,
};

typedef struct PingMsg
{
uint16_t hostid;
uint16_t seqno;
} PingMsg;

typedef struct PingReplyMsg
{
uint16_t hostid;
uint16_t seqno;
uint16_t origin;
uint16_t parent;
uint16_t depth;
} PingReplyMsg;

คราวนี้เราจะมาสร้าง class java โดยใช้ structure จากค่าเหล่านี้กัน

สมมติว่าเราจะสร้าง class java เอาไว้ใน MyApp/java ให้ทำการสร้างไฟล์ชื่อ Makefile เอาไว้ใน MyApp/java โดยมีเนื้อหาดังนี้ (สำหรับใครที่อ่านแล้วงงๆ ลองศึกษาเรื่องมีวิธีการทำ Makefile http://frank.mtsu.edu/~csdept/FacilitiesAndResources/make.htm)
// ไฟล์ Makefile
TOS = $(shell ncc -print-tosdir)
APPDIR = $(TOS)/../apps/MyApp

MIG = mig java
NCG = ncg java

MSGS = PingMsg.java ReplyPingMsg.java
CONST = PingConst.java

INITIAL_TARGETS = $(MSGS) $(CONST)

OTHER_CLEAN = cleanmig

ROOT = ../../../tools/java
include $(ROOT)/Makefile.include

PingMsg.java:
$(MIG) -java-classname=PingMsg $(APPDIR)/types/MyMsg.h PingMsg -o $@
$(JAVAC) $@

PingReplyMsg.java:
$(MIG) -java-classname=PingReplyMsg $(APPDIR)/types/MyMsg.h PingReplyMsg -o $@
$(JAVAC) $@

PingConst.java:
$(NCG) -java-classname=PingConst $(APPDIR)/types/MyMsg.h AM_PINGMSG AM_PINGREPLYMSG -o $@
$(JAVAC) $@

cleanmig:
rm -f $(MSGS) $(CONST)

โดยมีส่วนที่สำคัญคือ
MIG = mig java
NCG = ncg java

จะเป็นการสร้างค่าเพื่อใช้เรียกคำสั่ง mig และ ncg โดยให้สร้างเป็น class ประเภท java
MSGS = PingMsg.java ReplyPingMsg.java
CONST = PingConst.java

เป็นการระบุว่าเราจะสร้าง class ชื่ออะไรออกมาบ้าง ในที่นี่คือ PingMsg.java, ReplyPingMsg.java และ PingConst.java เพื่อเป็นประโยชน์เวลาสั่ง clean จะได้ตามลบได้หมดทุกตัว นั่นคือมันจะทำการ clean ทุกไฟล์ที่มีการประกาศไว้ใน MSGS และ CONST (ดูในโค้ด makefile ส่วนที่เป็น cleanmig ด้านล่างสุด) เพราะเวลาเราสั่ง make clean มันจะดูที่ค่าคงที่ OTHER_CLEAN ที่ประกาศไว้ ซึ่งในที่นี้เราให้เป็น cleanmig มันก็จะไปทำ cleanmig ซึ่งลบทุกอย่างที่ประกาศไว้ใน MSGS และ CONST นั่นเอง

include $(ROOT)/Makefile.include
ใช้ในการระบุ makefile ที่จะใช้ในการ compile java โดยไฟล์นี้จะชี้ไปที่ /opt/tinyos-1.x/tools/java/Makefile.include

PingMsg.java:
$(MIG) -java-classname=PingMsg $(APPDIR)/types/MyMsg.h PingMsg -o $@
$(JAVAC) $@

ทำการสร้างไฟล์ชื่อ PingMsg.java โดย
-java-classname เป็นการระบุชื่อไฟล์ java
$(APPDIR)/types/MyMsg.h เป็นการระบุ nesC header ไฟล์ที่เราต้องการจะดึงค่าออกมา
PingMsg เป็นชื่อ struct ที่เราประกาศไว้ใน nesC ไฟล์และจะเอามาทำเป็น java class
-o $@ สร้าง output ชื่อว่า PingMsg.java (@ คือชื่อที่เขียนไว้ที่บรรทัด PingMsg.java:)
$(JAVAC) $@ ทำการคอมไพล์ (ข้อควรระวัง เว้นวรรคด้านหน้านั้น ให้ใช้ tab(\t) หนึ่งครั้ง ห้ามเป็นเครื่องหมาย space ต่อกันหลายครั้ง)

ส่วนกรณีของ NCG นั้นก็จะคล้ายกัน แต่เปลียนจาก MIG เป็น NCG และสามารถระบุค่าคงที่ได้หลายตัวว่าจะเอาค่าอะไรออกมาบ้าง

พอสุดท้ายเราก็จะได้ PingMsg.java PingMsg.class PingReplyMsg.java PingReplyMsg.class PingConst.java และ PingConst.class เพื่อเอาไปใช้ในโปรแกรม java ของเราได้

ระบบที่ใช้ทดสอบ
TinyOS: 1.1.15 on cygwin

วันอาทิตย์ที่ 27 กรกฎาคม พ.ศ. 2551

ปัญหา buildout ของ Plone บน Windows ที่มี Visual Studio >= 2005

สำหรับการลง plone โดยใช้วิธี buildout นั้นอาจจะมีปัญหากับเครื่องที่เป็น Windows ที่มี Visual Studio ตั้งแต่เวอร์ชั่น 2005 ขึ้นไป โดย error message จะฟ้องตอนขณะคอมไพล์ Zope ว่า
error: Python was built with Visual Studio 2003;
extensions must be built with a compiler than can generate compatible binaries.
Visual Studio 2003 was not found on this system. If you have Cygwin installed,
you can try compiling with MingW32, by passing "-c mingw32" to setup.py.

ซึ่งวิธีแก้อย่างแรกคือบน Windows ต้องลง Mingw ก่อน ซึ่งเป็น package ที่รวม gcc compiler สำหรับ Windows เอาไว้
ซึ่งก็จะช่วยแก้ปัญหาได้
แต่สำหรับบางเครื่องที่ผมไปลง เหมือนกับว่ามันไม่ยอมไปเรียก Mingw ทั้งๆที่ได้ set path เอาไว้แล้ว (รวมทั้งสร้างไฟล์ distutil.cfg ให้เรียก compiler=mingw32 แล้วด้วย) ซึ่งไม่แน่ใจว่าเป็นที่เครื่องหรือเป็นที่ผมตั้งค่าไม่เป็น แล้วมันก็เลยยังฟ้อง error อยู่แบบนั้น
วิธีแก้คือไปแก้ไข code ที่มันจะทำการ compile zope โดยไฟล์นั้นจะอยู่ที่ %YOUR_PLONE_DIR%\eggs\plone.recipe.zope2install-2.2-py2.4.egg\plone\recipe\zope2install\ ชื่อไฟล์ว่า __init__.py

ให้แก้ตรงที่ทำการเรียกคำสั่ง setup.py คือ
assert os.spawnl(
os.P_WAIT, options['executable'], options['executable'],
'setup.py',
'build_ext', '-i',
) == 0

เป็น
assert os.spawnl(
os.P_WAIT, options['executable'], options['executable'],
'setup.py',
'build_ext -c mingw32', '-i',
) == 0

คือเป็นการระบุไปเลยว่าให้ใช้ compiler คือ mingw32
โดยในไฟล์จะมีอยู่ 2 ที่ที่เรียก setup.py ก็ให้แก้ทั้ง 2 ที่เลย
แล้วก็ค่อยสั่ง buildout ใหม่อีกรอบ ก็จะสามารถคอมไพล์ได้

ระบบที่ทดสอบ
OS: Windows Server 2003 with Visual Studio 2008 and Mingw32
Plone: 3.06 (install by using buildout)

No traversable adapter found บน Plone Site

เมื่อวานได้เอาโปรแกรมที่พัฒนาด้วย plone version ใหม่ไปติดตั้งบนเครื่อง server ที่เคยลง version เก่าไว้แล้ว
ซึ่งเวลาลงก็คือทำการปิด service แล้วเอา code .py ตัวใหม่ที่พัฒนาไปวางทับตัวเก่าที่ชื่อเดียวกัน
ซึ่งตอนที่ทำกับเครื่องที่บ้านก็ไม่มีปัญหาอะไร พอวางเสร็จก็เปิด service แล้วก็ไป reinstall product ก็ใช้ได้งานได้ปกติ
แต่ว่าที่เอาที่เครื่อง server เกิดปัญหาคือพอลง code ทับแล้วเปิด service แล้วพอจะเข้าไปหน้าเวบนั้นมันกลับฟ้องว่า
('No traversable adapter found', {'extension_profiles': ({'product':
'kupu', 'description': 'Extension profile for Kupu', 'for': , 'title':
'Kupu', 'version': 'kupu 1.4.3', 'path': 'plone/profiles/default',
'type': 2, 'id': 'kupu:default'},), 'args': (), 'base_profiles': (),
'default_profile': 'Products.CMFPlone:plone'})
.....
.....

ตามด้วยข้อมูลอื่นๆอีกยาวเหยียดทั้งหน้าเวบ
แต่ว่าพอลองเปิด service แบบ debug mode (หรือ foreground mode) ด้วยใช้คำสั่ง .\bin\primary fg ปรากฎว่าเครื่องสามารถทำงานได้ถูกต้อง หน้าเวบขึ้น แล้วก็ไม่มี error message อะไรเลย
พยายามนั่งแก้อยู่หลายชั่วโมงก็ยังไม่เจอวิธีที่สามารถแก้ไข error สุดงงนี้ได้ สุดท้ายเลยลอง restart เครื่อง server เลย
แปลกแต่จริง error นั้นหายไปเลย และสามารถใช้งานได้ตามปกติแม้จะไม่ใช่ debug mode
จนถึงตอนนี้ก็ยังไม่รู้สาเหตุที่แท้จริง

(แต่สำหรับบางคนปัญหานี้อาจเกิดจากว่าเผลอไปแก้ชื่อไฟล์ ทำให้โปรแกรมหาไม่เจอ เช่น มีการเติม s หลังชื่อไฟล์โดยไม่ได้ตั้งใจเป็นต้น)

ระบบที่ทดสอบ
OS: Windows Server 2003
Plone: 3.0.6 (runs as an instance on ZEOServer)
Zope: 2.10

วันพุธที่ 23 กรกฎาคม พ.ศ. 2551

แก้ไข grub พัง เนื่องจากการลบ ubuntu

อาการ
ช่วงหลายเดือนก่อน เครื่องผมมี OS อยู่ 2 ตัวคือ Windows XP และ Ubuntu 7.04 โดยมี grub เป็น bootloader
โดยได้แบ่ง partition ให้ Windows กับ Ubuntu เอาไว้ที่ C: และ D: โดยเครื่องตอนแรกมี Windows ก่อน แล้วลง Ubuntu เพิ่ม

แต่เมื่อเดือนก่อนความซวยของผมก็เิิกิดขึ้นเมื่อผมต้องการลบ Ubuntu 7.04 ออก แต่ด้วยความสะเพร่า ผมดันไปเลือก format D: บน Windows (คลิ๊กขวา -> Format...) ส่งผลให้เมื่อ reboot ใหม่ไม่สามารถ boot เข้าอะไรได้เลย (ผมคิดว่าเป็นเพราะ bootloader grub ไม่สามารถหา Ubuntu เจอ เลย crash)

แก้ไข
ทำการแก้ไข bootloader ซะโดยทิ้ง grub ไปเลย โดยการหาแผ่น Windows (ที่ผมมีคือแผ่น Windows 98 แต่คิดว่าใช้ Windows ตัวอื่นก็น่าจะได้เช่นเดียวกัน) ที่ boot ได้แล้ว boot เข้า dos mode
เมื่อเข้ามาที่ command line แล้ว ให้ทำการแก้ไข master boot record (mbr) ด้วยคำสั่ง
fdisk /mbr
พอสั่งเสร็จก็ reboot ใหม่เป็นอันใช้ได้ ก็จะ boot เข้า Windows XP เลย

วันจันทร์ที่ 21 กรกฎาคม พ.ศ. 2551

ปัญหา ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: NO)

วันนี้พยายามจะลง MySQL5.0 บน FreeBSD 7 แต่แล้วก็ติดปัญหาคือ
ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: NO)

ซึ่งพยายามค้นหาคำตอบ แต่ก็ไม่เจอคำตอบที่ใช้ได้กับเคสของผมเลยซักอัน ดังนั้นจะขอเล่าอาการก่อน

ผมลง MySQL5.0 ด้วย ports โดย
localhost# cd /usr/ports/databases/mysql50-server
localhost# make -D BUILD_OPTIMIZED install clean
localhost# rehash

แล้วก็สั่ง script mysql_install_db
localhost# mysql_install_db --user=mysql
แล้วก็เริ่มเปิด daemon ด้วย
localhost# mysqld_safe &

พอมาถึงขั้นตอนนี้ อ่านในหลายๆสำนักเค้าจะบอกให้ตั้งค่า root password โดยสั่ง
localhost# mysqladmin -u root password 'rootpassword'
แต่พอผมสั่งปุ๊ปก็เกิด error ขึ้นมาว่า
ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: NO)

หรือว่าแค่สั่ง mysql เพื่อเข้า client ก็จะไม่ได้เช่นเดียวกัน
ก็เลยลองปิด daemon ทิ้งก่อนด้วย
localhost# killall -9 mysqld
แล้วเข้าไปใหม่แบบไม่ต้องใส่ password ชั่วคราวด้วย
localhost# mysqld_safe --skip-grant-tables &
แล้วเข้า mysql client ทันทีด้วย
localhost# mysql
คราวนี้เลยลองสั่งคำสั่ง
mysql> use mysql
mysql> SELECT user, password FROM user

เพื่อจะดูว่าค่า default password ของ root มันคืออะไร
แต่ปรากฎว่าไม่มี user ปรากฎขึ้นมาเลยซักคนเดียว

สรุป มันไม่ได้สร้าง user root ขึ้นมาให้

วิธีแก้ ผมใช้การ add user root เข้าไปเองเลยด้วยคำสั่ง
mysql> insert into user (host, user, password, select_priv, insert_priv
, update_priv, delete_priv, create_priv, drop_priv, reload_priv
, shutdown_priv, process_priv, file_priv, grant_priv, references_priv
, index_priv, alter_priv, show_db_priv, super_priv, create_tmp_table_priv
, lock_tables_priv, execute_priv, repl_slave_priv, repl_client_priv
, create_view_priv, show_view_priv, create_routine_priv, alter_routine_priv
, create_user_priv) values('localhost', 'root', PASSWORD('rootpassword')
, 'Y', 'Y', 'Y', 'Y', 'Y', 'Y', 'Y', 'Y', 'Y', 'Y', 'Y', 'Y', 'Y', 'Y', 'Y', 'Y', 'Y', 'Y'
, 'Y', 'Y', 'Y', 'Y', 'Y', 'Y', 'Y', 'Y');

(มี Y ทั้งหมด 26 ตัว จริงๆคงมีวิธีที่ grant all privileges แต่ผมยังทำไม่เป็น - - " )
แล้วก็
mysql> FLUSH PRIVILEGES;
เป็นอันเรียบร้อย แล้ว
mysql> exit
ออกมา แล้วสั่ง restart mysql ด้วย
localhost# /usr/local/etc/rc.d/mysql-server restart
คราวนี้พอสั่งเพื่อเข้าไปใช้งานใหม่ก็จะสามารถใช้ client โดยเป็น root พร้อมกับ password ที่ได้ตั้งเอาไว้ได้แล้วด้วยคำสั่ง
localhost# mysql -u root -p
และใส่ password ที่เราตั้งไว้เป็นอันใ้ช้ได้

แต่ว่าก็ยังไม่แน่ใจว่าเป็นวิธีแก้ที่ถูกต้องรึเปล่าแต่พอทำให้ถูๆไถๆไปได้ซักระยะ

ระบบที่ใช้ทดสอบ
OS: FreeBSD 7.0
MySQL: MySQL5.0-server (install by port)

วันอาทิตย์ที่ 20 กรกฎาคม พ.ศ. 2551

ASP.NET Machine กับ SQLDebugger Account

เมื่อวานได้ลองลง Visual Studio 2003 เพื่อช่วย debug โปรแกรมให้เพื่อน แล้วปรากฎว่าหลังจากลงเสร็จ กลับมี account แปลกๆโผล่ออกมาที่ user account 2 ตัว คือ ASP.NET Machine A... กับ SQLDebugger ก็เลยรู้สึกกลัวว่ามันจะมาทำอะไรมิดีมิร้ายกับเครื่องของเรารึเปล่าก็เลยไปค้นๆในเนตดูก็ได้ความมาคร่าวๆ

มันคืออะไร
ตัว ASP.NET Machine account นั้น จะเกิดเมื่อตอนลง .NET Framework 1.1 ซึ่งจะทำหน้าที่เป็น Worker Process (WP) ให้กับ IIS Server โดยจะทำให้ ASP.NET สามาารถทำงานได้บน local server นั่นเอง

ส่วนตัว SQLDebugger ก็อาจเกิดจากตอนลง VS2003 แล้วเลือกให้มีการทำ remote debugger หรือเกิดจากการลง MS SQL Server

ประเด็นด้านความปลอดภัย
2 ตัวนี้ account จะถูกสร้างโดยเป็น limited account ดังนั้นก็คงปลอดภัยในระดับหนึ่ง แต่ไม่รู้ว่ามีรายงานเกี่ยวกับช่องโหว่ที่เกิดจาก 2 ตัวนี้บ้างรึเปล่า แต่จากที่ลองอ่านมาก็เห็นเค้าว่ากันว่าไม่ต้องห่วงอะไร

เอาออกได้มั้ย
สำหรับ ASP.NET Machine ถ้าเอาออกแล้วจะทำให้โปรแกรมที่พัฒนาบน ASP.NET ทำงานผิดพลาดได้ แต่ถ้าไม่่ได้พัฒนาอะไรเกี่ยวกับ ASP.NET ก็เอาออกได้ไม่มีปัญหา
ส่วน SQLDebugger ในกรณีที่ไม่ได้ใช้ MS SQL Debugging ก็เอาออกได้

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

ระบบที่ใช้ทดสอบ
OS: Windows XP SP2
IDE: Visual Studio 2003 .NET

ข้อมูลอ้างอิง
http://www.mvps.org/marksxp/WindowsXP/aspdot.php
http://support.microsoft.com/kb/555299
http://support.microsoft.com/kb/818374?

วันพฤหัสบดีที่ 17 กรกฎาคม พ.ศ. 2551

เพิ่ม yum repostiory สำหรับ CentOS 5

เนื่องจากว่าผมเพิ่งเริ่มใช้ CentOS 5 แล้วต้องการลง wine เพิ่มเพื่อใช้บางโปรแกรมของ windows แต่เกิดปัญหาที่ว่า yum install wine นั้นไม่ได้ผล เพราะยังไม่มี yum repository ที่มีเจ้า wine นี่อยู่ ก็เลยทำการลอง search ดูก็พบว่ามี repository ที่ชื่อว่า RPMforge ที่ใช้กันมากสำหรับ Redhat หรือ CentOS

วิธีการลง RPMforge นั้นก็ได้มาจากหน้า Wiki ของ CentOS เลย
เนื่องจากว่าในหน้านั้นก็แทบจะสรุปสั้นมากอยู่แล้ว เลยเกือบๆจะแปลมาหมดเลยล่ะกัน
1. ลง plugin Priorities ก่อน
1.1 สั่ง
yum install yum-priorities
1.2 ดูที่ไฟล์ /etc/yum/pluginconf.d/priorities.conf ว่า plugin ตัวนี้ enable หรือยัง โดยดูที่
[main]
enabled=1

ถ้าเป็น enabled=0 อยู่ก็ให้แก้เป็น 1 (แต่โดยปกติจะ enable ให้แล้ว)
1.3 แก้ไขไฟล์ /etc/yum.repos.d/.repo โดยทำการ
เพิ่มบรรทัด priority=1
ไว้ที่บรรทัดสุดท้ายของ [base], [addons], [updates] และ [extras]
เพิ่มบรรทัด priority=2
ไว้ที่บรรทัดสุดท้ายของ [centosplus] และ [contrib]
ส่วนที่ repos อื่นๆ เช่น เพิ่ม priority=N (N เป็นอะไรก็ได้แต่ที่เค้าแนะนำคือมากกว่า 10)


2. ลง RPMforge
2.1 สำหรับเครื่อง 32bit ให้โหลด http://apt.sw.be/redhat/el5/en/i386/RPMS.dag/rpmforge-release-0.3.6-1.el5.rf.i386.rpm
2.2 ลง DAG's GPG key โดยสั่ง
rpm --import http://dag.wieers.com/rpm/packages/RPM-GPG-KEY.dag.txt
2.3 ทำการ verify package ที่ดาวน์โหลดมาข้างต้นด้วยคำสั่ง
rpm -K rpmforge-release-0.3.6-1.el5.rf.*.rpm
2.4 ทำการ install package ด้วย
rpm -i rpmforge-release-0.3.6-1.el5.rf.*.rpm
2.5 ไปตั้งค่า priority ให้กับ RPMForge (ดูข้อ 1.3)
2.6 ทดสอบด้วยคำสั่ง
yum check-update
ถ้าสำเร็จจะขึ้นประมาณว่า
Loading "priorities" plugin
...
76 packages excluded due to repository priority protections

เป็นอันเสร็จสิ้นกระบวนการ
คราวนี้จะลงโปรแกรมเพิ่มก็จะใช้ได้แล้ว เช่นของผมจะลง wine ก็สั่ง
yum install wine

ระบบที่ใ้ช้ทดลอง
OS: CentOS 5.0
CPU: 32bit (i386)

ที่มา
http://www.wowwiki.com/Linux/Wine/CentOS
http://wiki.centos.org/AdditionalResources/Repositories/RPMForge?action=show&redirect=Repositories%2FRPMForge

วันจันทร์ที่ 14 กรกฎาคม พ.ศ. 2551

การ mount USB Thumb Drive ใน FreeBSD

1. เสียบ Thumb Drive แล้วที่หน้าจอจะบอกว่ารายละีเอียดของ Thumb Drive นั้น
เช่น
umass1: on uhub4
da4 at umass-sim1 bus 1 target 0 lun 0
da4: Removable Direct Access SCSI-0 device
da4: 40.000MB/s transfers
da4: 3890MB (7966720 512 byte sectors: 255H 63S/T 495C)
GEOM_LABEL: Label for provider da4s1 is msdosfs/Ping

2. สังเกตตรงที่ทำตัวหนาไว้ (ในที่นี้คือ da4s1) นั่นคืออุปกรณ์ที่เราจะทำการ mount
สั่งคำสั่ง
mount -t msdosfs /dev/da4s1 /mnt
เพื่อทำการ mount ไปยัง /mnt, โดย da4s1 คือหมายเลขของ device ที่เราจะทำการ mount

3. ดูข้อมูลโดย cd /mnt

--------------------------------------------------------------
ระบบที่ทำการทดสอบ
OS: FreeBSD 7.0
Thumb Drive: Kingston DataTraveler 2.0

วันเสาร์ที่ 12 กรกฎาคม พ.ศ. 2551

การใส่ TAG CLOUD หรือ LABEL CLOUD ให้กับ Blogger

Tag cloud หรือ Label Cloud คือกลุ่มของ Tag หรือ Label ที่เราได้ตั้งไว้ให้กับ post ต่างๆใน blog ของเรา โดยจะเอามาแสดงเป็นกลุ่มๆก้อนๆเหมือนเมฆ ถ้า Tag ไหนมีการใช้งานเยอะก็จะแสดงสีและขนาดที่โดดเด่นกว่า Tag ที่ถูกใช้น้อยกว่า
ดูตัวอย่างทางขวาของหน้าเวบของผมเพื่อความเข้าใจที่ดีขึ้น :)

วิธีการก็ทำตาม link นี้เลย http://phy3blog.googlepages.com/Beta-Blogger-Label-Cloud.html

จะมีให้ก๊อปแปะ อยู่ 3 ที่ ณ จุดต่างๆ

ส่วนอื่นไม่ต้องสนใจก็ได้ถ้าไม่ได้ต้องการปรับแต่งอะไรมาก

การเชื่อมต่อเนตเวิร์คเข้าสู่เครื่อง guest ใน VirtualBox

โดย default แล้ว Virtual Box นั้น เครื่องที่เป็น Guest (OS ที่ run ใน VirtualBox) จะใช้ NAT ในการเชื่อมต่อกับ Network ภายนอก (Network ของเครื่อง Host (OS หลักของเครื่องเราจริงๆ) )

แต่ปัญหาคือมันยอมให้ traffic request ออกด้านนอกได้ แต่มันไม่ยอมให้ traffic request จากด้านนอกเข้ามานี่สิ (คือยอมให้เราเข้าเวบด้านนอกได้ แต่ถ้าเราอยากจะ access ไปที่ web server ที่เราตั้งเอาไว้ใน guest จะยังทำไม่ได้)

วิธีแก้อย่างง่ายๆ คือ ใช้ VBoxManage ในการทำ Port Forwarding ของเครื่อง Host เพื่อไปยังเครื่อง Guest

เริ่มจาก ปิดตัว VirtualBox ซะก่อน (จะแค่สั่ง pause แล้ว save state ก็ได้)

ในเครื่อง Host เข้า Command Line (Cmd)


ถ้าไ่ม่ได้ตั้งค่า path ของ VirtualBox ให้ cd ไปที่ VirtualBox ที่เราลงไว้ เช่น C:\Program Files\innotek VirtualBox
แ้ล้วสั่งคำสั่งต่อไปนี้

1. ตั้งว่าจะใช้โปรโตคอลอะไร
VBoxManage setextradata "yourguestosname" "VBoxInternal/Devices/pcnet/0/LUN#0/Config/http/Protocol" TCP

2. ตั้งว่าจะให้ไปเข้า Port อะไรของเครื่อง Guest
VBoxManage setextradata "yourguestosname" "VBoxInternal/Devices/pcnet/0/LUN#0/Config/http/GuestPort" 80

3. ตั้งว่าจะใช้ port อะไรของเครื่อง Host
VBoxManage setextradata "yourguestosname" "VBoxInternal/Devices/pcnet/0/LUN#0/Config/http/HostPort" 8888

โดย yourguestosname ให้แทนด้วยชื่อ Guest OS ที่ได้ตั้งเอาไว้ เช่นของผมตั้งไว้ว่า GUESTWIN
ส่วนคำว่า http ก็สามารถแทนด้วยชื่อ application อื่นๆที่ต้องการ เช่น ftp
แล้วก็หมายเลขก็ตาม app ที่เราให้บริการ

พอเซตค่าเสร็จก็เปิดให้ VirtualBox ทำงานก็จะพร้อมทำงานได้

จากตัวอย่างคือผมจะเข้า web server ของเครื่ือง Guest ที่เปิด port 80 เอาไว้ โดยสามารถพิมพ์ URL ใน browser ของเครื่อง host คือ http://localhost:8888/index.html เป็นต้น

ระบบที่ผมใช้ทดลอง
Host: Windows XP SP2
Guest: Windows Server 2003 SP2
VirtualBox: Version 1.5.6

วันอังคารที่ 8 กรกฎาคม พ.ศ. 2551

การใช้ git กับ svn repository

สมมติว่า svn repository ของเราอยู่ที่ http://localhost/svnrepo/project

เริ่มแรกก็จัดการเตรียม folder ที่เราจะใช้เป็น git repo สำหรับ svn กันก่อน
เช่น เอาไว้ในไดเรกทอรี่ /directory/git_svn/ ก็ทำการ cd ไปที่ไดเรกทอรี่นั้นแล้วสั่ง
git svn init -s http://localhost/svnrepo/project
โดย -s หมายถึง svn repo มีการจัดไดเรกทอรี่แบบ standard คือมี trunk, branches และ tags ซึ่ง trunk จะมาเป็น master ของ git ส่วน branches และ tags จะมาเป็น branch ของ git

ตอนนี้จะยังเป็น repo เปล่าๆอยู่ ให้สั่ง
git svn fetch
เพื่อเป็นการดึง repo ทั้งหมดของ svn มาเก็บไว้ที่ git repo

คราวนี้ในไดเรกทอรี่ /directory/git_svn/ ก็จะมีไดเรกทอรี่ชื่อ project เกิดขึ้นมา ซึ่งถ้าเข้าไปดูในไดเรกทอรี่นั้น จะมีไฟล์ต่างๆ และไดเรกทอรี่ .git เกิดขึ้นมา ซึ่งไดเรกทอรี่ .git จะเป็น repo ของ git ที่เก็บ historyทั้งหมดไว้

ถ้าต้องการให้ synce กับ svn repo ให้สั่ง
git svn rebase
แล้วถ้าต้องการ commit changes ของเรากลับไปที่ svn ก็สั่ง
git svn dcommit
คราวนี้ที่ผมจะทำต่อไปคือ ผมจะให้คนอื่นที่ทำงานร่วมกันสามารถมา pull ข้อมูลไปได้
ซึ่งอันนี้ก็ต้องเปิด webserver เอาไว้ โดยผมใช้ apache และใช้ document root อยู่ htdocs ตามปกติ
ผมก็ทำการสร้างไดเรกทอรี่เพื่อเอาใช้ให้คนอื่นอ้างถึงได้ โดยเอาไว้ที่ /path/to/apache/htdocs/git/project

เสร็จแล้วให้ cd เข้าไปที่ไดเรกทอรี่ที่เราสร้างขึ้น แล้วสั่ง
git clone --bare /directory/git_svn/project/.git .git
เพื่อทำการสร้าง bare repository ขึ้นมา ซึ่งจะไม่ได้เก็บไฟล์อะไรไว้เพียงแต่จะมี index ชี้ไปยังที่ๆเราเก็บข้อมูลบนเครื่องของเรา (คล้ายๆกับการ redirect)

เสร็จแล้วให้ cd เข้าไปยัง .git ที่เพิ่งเกิดขึ้นใหม่ แล้วสั่ง
git-update-server-info
คราวนี้เครื่องไหนที่ต้องการมาดึงข้อมูลจาก repo ของเราก็สามารถใช้คำสั่ง
git pull http://yourdomain/git/project/.git
หรือถ้าอยู่บนเครื่องเดียวกันก็สามารถใช้
git pull http://localhost/git/project/.git

อ้างอิง
http://pphetra.blogspot.com/2008/06/git-svn-branches.html

http://andy.delcambre.com/2008/3/4/git-svn-workflow
http://www.bluishcoder.co.nz/2007/09/how-to-publish-git-repository.html

ป.ล. ขอบคุณน้องแท็ปด้วยสำหรับข้อมูลอื่นๆเพิ่มเติม

Random Number ในภาษา Java แบบหยาบๆ

บังเอิญว่าไปเห็นคนถามใน soccersuck เลยไปช่วยตอบ ก็เลยเอามาประเดิมเป็นอันแรกซะเลย

จะ random ใช้ java.util.Random (jdk 1.4 ก็มีแล้ว)

Random gen = new Random();
ถ้าต้องการให้ค่าอยู่ในช่วงมากกว่าเท่ากับ 0 แต่น้อยกว่า n
ใช้ int randint = gen.nextInt(n);
เช่น int randint = gen.nextInt(6) จะได้ค่าตั้งแต่ 0 - 5

ถ้าต้องการตั้งแต่ 2 ถึง 8 ก็บวก offset เข้าไป

int randint = gen.nextInt(7) + 2;

ถ้าต้องการเป็น double เป็น float ก็จะมีคำสั่ง nextDouble nextFloat อยู่

(ป.ล. ทุกค่าที่ได้เป็น pseudo random number)

อ้างอิง
http://java.sun.com/j2se/1.4.2/docs/api/java/util/Random.html

วันเสาร์ที่ 5 กรกฎาคม พ.ศ. 2551

เกี่ยวกับ blog นี้

blog นี้เกี่ยวกับอะไร?
เกี่ยวกับความรู้ต่างๆด้านคอมพิวเตอร์ที่ตัวผมได้เจอมาโดยอาจมีทั้งทางด้าน technique และ information

เพื่ออะไร?
1. เพื่อเป็นที่จดบันทึกกันลืมของตัวเอง
2. เพื่อเป็นการแชร์ความรู้ เผื่อมีใครเจอปัญหาเดียวกันแล้วบังเอิญเข้ามา blog นี้โดยไม่ตั้งใจ

ทำไมไม่ทำลง windows live space ที่มีอยู่แล้ว?
รู้สึกว่ามันเฉพาะทางเกิน เลยแยกออกมาเลยดีกว่า อันนั้นไว้บ่นๆขีดๆเขียนๆ

ทำเป็นภาษาอังกฤษไม่ดูเป็นสากลกว่าเหรอ?
ตั้งใจจะทำไว้ให้คนไทยอ่าน เพราะ มีบทความภาษาอังกฤษอยู่มากมายเต็มไปหมด แต่ภาษาไทยนั้นมีค่อนข้างน้อย

เพิ่มเติม
ใน blog นี้อาจมีถูกมีผิด ซึ่งสามารถคอมเมนต์ ตำหนิ แนะนำ ได้เลยครับ

Hello World

ทดสอบ post แรก