หน้าเว็บ

วันอังคารที่ 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 แรก